Нумерация версий программного обеспечения
Жизненный цикл успешной компьютерной программы может быть очень долгим; изменения в программе бывают разными — от исправления ошибки до полного переписывания. В большинстве случаев название программы остаётся тем же, изменяется подназвание — так называемая версия.
Версия программы может быть целым числом (Corel Draw 11), последовательностью чисел (JDK 1.0.3), годом (Windows 2000) или текстом (Embarcadero Delphi XE). В любом случае, система версионирования выбирается по нескольким критериям:
- Поддержка той или иной системы со стороны ПО для разработки (компилятора, системы контроля версий и т. д.).
- Частота выхода новых версий и их «сырость». Сложная программа, выпускаемая раз в несколько лет и перед выпуском проходящая всеобъемлющее тестирование, может именоваться как «Microsoft Word 97 SP2», в то время как в программе с частыми малостабильными выпусками приходится вводить более сложную нумерацию.
- Степень совместимости сетевых протоколов, документов или надстроек сторонних разработчиков — например, «старшая» версия увеличивается с каждым изменением ABI или API.
- Маркетинговые соображения.
Иногда присутствие человеческого фактора в создании номеров версий приводит к ошибкам в изменении версий. Например, разработчики могут изменить номер версии, даже если ни одна строчка кода не была переписана, чтобы создать ложное впечатление, что были внесены значительные изменения.
Схемы нумерацииПравить
Последовательные номераПравить
Изначально программы нумеровались числами 1, 2, 3 и т. д. — аналогично изданиям книг. Также последовательные номера могут быть основаны на каком-то техническом счётчике (например, номер версии в системе управления версиями).
Ныне последовательными номерами обозначают редко выпускаемые программы, которые выходят уже стабильными. Например, Corel Draw 11, Windows 10. У таких программ мелкие сервисные изменения обычно «заметаются под ковёр», не изменяя видимой версии (меняя лишь техническую, доступную, например, из меню «О программе»). Крупные изменения с новой функциональностью, но не тянущие на новый продукт, как правило, обозначают десятичной дробью (Windows 8.1).
Десятичная дробьПравить
Исторически первый способ нумерации, разделяющий малые и серьёзные изменения.
Номер версии является десятичной дробью в американском формате (через точку). Например, первая версия получает номер 1.0, следующая за ней — 1.1, с небольшим изменением — 1.11, создаётся новый продукт с новой функциональностью — 2.0. Чем сильнее увеличивается дробь, тем более значимо изменение. Разработчики порой перескакивают, например, от версии 2.0 сразу к 2.5, чтобы обозначить добавление нескольких значимых функций в программу, но их недостаточно, чтобы изменить главный номер версии (Turbo Pascal 5.0 → 5.5).
Для предварительных, неофициальных версий применяют числа меньше 1: скажем, 0.1 или 0.9.
Сравнение версий идёт по правилам десятичных дробей: 0.9 < 1.0 < 1.01 < 1.1 = 1.10 < 1.11 < 1.2 = 1.20 < 2.0 < 2.5.
Последовательность чиселПравить
Этот способ принят, например, в Windows API. Версия состоит из нескольких чисел (как правило, трёх), разделённых точкой: например, 1.5.2. Первое из них — старшая версия (major), второе — младшая (minor), третья — мелкие изменения (maintenance, micro).
При увеличении одного из чисел все идущие после него сбрасываются до нуля: 1.0.0, 1.0.1, 1.0.2, 1.1.0, 1.2.0, 1.2.1, 2.0.0… Последний ноль может опускаться: 1.0.0 = 1.0.
Библиотеки Unix используют схему версионирования current.revision.age. Current — текущий номер API, revision — счётчик версий в пределах одного API, age — разница между последней и первой версиями поддерживаемого API[1].
Для определения старшинства версий сравнивают сначала старшие версии, потом младшие, потом микро- как целые числа: 1.1.0 = 1.1 < 1.1.2 < 1.10.0 = 1.10 < 1.11.0 < 1.20.0 < 1.100.0 < 1.100.1 < 2.0.0.
Иногда четвёртым числом идёт номер сборки со сквозной нумерацией. Эта цифра может увеличиваться на единицу с каждым выпуском (1.0.0.1 < 1.0.1.2 < 1.0.2.3 < 1.1.0.4), либо браться из какого-нибудь технического счётчика (компиляций, ночных сборок, версий кода в системе контроля версий — например, 1.5.2.7682). В Microsoft Office четвёртым числом закодирована дата выпуска[2].
Опять-таки, 1.0 считается первой официальной версией; 0.1 или 0.9 — предварительными выпусками.
Буква в качестве младшей версииПравить
Иногда вместо третьего числа применяется буква. Так, когда в DotA 6.42 нашли ошибку, новой версии дали название 6.42b. Это значит: игра остаётся той же, с тем же расположением препятствий и тем же балансом, но с исправленной ошибкой. Дальнейшие исправления ошибок именуются 6.42c, 6.42d и т. д.
Указание стадии разработкиПравить
Если разработчику приходится полагаться на внештатных тестировщиков, в версии может указываться уровень зрелости программы: альфа-версия, бета-версия, выпуск-кандидат, окончательный выпуск, исправление ошибок (service release).
Например, 2.0 alpha1 < 2.0 alpha2 < 2.0 beta < 2.0 rc1 < 2.0 < 2.0 sr1.
Существуют разные схемы обозначения стадий разработки. Например, третье число может означать:
- 0 — альфа
- 1 — бета
- 2 — выпуск-кандидат
- 3 — публичный выпуск
Например:
- 1.2.0.1 вместо 1.2-a
- 1.2.1.2 вместо 1.2-b2 (бета с несколькими исправленными ошибками)
- 1.2.2.3 вместо 1.2-rc3 (выпуск-кандидат)
- 1.2.3.0 вместо 1.2-r (для коммерческого распространения)
- 1.2.3.5 вместо 1.2-r5 (для коммерческого распространения со многими исправленными ошибками)
Внутри компании также может указываться стадия разработки (например, 1.2.3 < 1.2.3r9 < 1.2.4), в то время как в официальных выпусках такого нет — например, чтобы исключить путаницу среди тестеров или выдать клиенту какую-то версию — возможно, нестабильную, но исправляющую его ошибку.
Между сериями 1.0 и 2.6.x ядро Linux использовало нечётные номера для бета-версий, и чётные — для стабильных. Например, Linux 2.3 был серией в разработке, а Linux 2.4 — серией стабильных выпусков, в которую перерос Linux 2.3. В номере выпуска Linux kernel сначала писался номер второстепенной версии, а затем номер выпуска в возрастающем порядке. Например Linux 2.4.0 → Linux 2.4.22. После выпуска 2.6 в 2004 году Linux больше не использует эту систему, теперь цикл выпуска намного короче. Сейчас они просто увеличивают третье число, используя при необходимости четвёртое.
Такая же система «чёт-нечет» используется некоторыми другими продуктами с длинным циклом разработки, такими как GNOME.
Алфавитно-цифровое названиеПравить
Чаще всего применяется ПО с долгой историей и редко выходящими версиями (Windows Vista).
Если счётчик версий зашёл слишком далеко и надо его сбросить, также используются алфавитные коды: Adobe Photoshop 7.0 < CS < CS2 < … < CS6 < CC < CC 2014.
Иногда в дополнение к обычной версии используется алфавитно-цифровое подназвание: Ubuntu 9.04 Jaunty Jackalope, Embarcadero Delphi 10.2 Tokyo.
ДатаПравить
Год выпуска применяется чаще всего в ПО с редко выходящими версиями, например: Windows Server 2003, Microsoft Office 2014.
Разработчики проекта Wine также сначала использовали даты при нумерации версий, они указывали год, месяц и день выпуска: «Wine 20040505». Сейчас Wine использует «стандартную» нумерацию выпусков, последняя версия 2010 года имеет номер 1.2. Компания Ubuntu Linux использует похожую схему нумерации, например, выпуск октября 2010 года пронумерован как Ubuntu 10.10. Аналогичная схема на текущий период используется компанией Microsoft для нумерации обновлений Windows 10, хотя у них номер версии обычно на 1 меньше номера месяца, например, Fall Creators Update (1709) вышел 17 октября 2017 года, а April 2018 Update (1803) несмотря на номер "03" в названии вышло в апреле 2018.
При использовании дат в нумерации версий следует использовать схему ISO «год-месяц-день» (это упрощает сравнение версий на старшинство), причём дефис можно опускать.
Внутренние версииПравить
Часто программа имеет как торговое название, так и внутреннюю версию, составленную по всем правилам. Например, Java SE 5.0 имеет внутреннюю версию 1.5.0, Windows 7 — версию 6.1[3]. Различные сборки файлов Windows могут называться, например, 6.1.7600.16385.
Подобные технические версии сравнивают с солдатским жетоном[2]. Как и на поле боя, они нужны в экстренных случаях — когда программа работает не так и нужно связаться с разработчиком.
Экзотические схемыПравить
Дональд Кнут нумерует версии системы компьютерной вёрстки ΤΕΧ последовательными приближениями числа : 3.0 < 3.1 < 3.14 и т. д. Номер последнего стабильного выпуска — 3.141592653. Версии другого детища Дональда Кнута языка METAFONT нумеруются приближениями к числу e. Версия за март 2008 года имела номер 2.718281.
SuSE Linux начал счёт версий с 4.2, как отсылка на известную книгу Дугласа Адамса.
Значение номеров версийПравить
Версия 1.0 как ключевой этап разработкиПравить
Коммерческие программы, как правило, начинают нумеровать свои версии с 1.0. Считается даже, что версия 1.0 исключительно сыра и поэтому нужно как можно быстрее дойти до 1.2 или даже до 2.0.
В бесплатных и свободных программах 1.0 считается моментом, когда программа признана готовой к широкому применению неспециалистами. При этом первоначальные версии программы нумеруются как 0.1, 0.2 и т. д. FreeDOS пришёл к версии 1.0 в 2006 году — когда DOS уже практически нигде не использовался. Эмулятор игровых автоматов MAME никогда не дойдёт до версии 1.0, поскольку история игровых автоматов продолжается и поныне.
Маркетинг, суеверия и ОКРПравить
Коммерческому ПО, чтобы название лучше смотрелось, приходится подключать маркетологов. Например, в странах Азии распространена тетрафобия, поэтому в номерах версий избегают цифры 4. В Европе число 13 считается несчастливым, его или пропускают, или заменяют на X3.
Если история программы очень длинна, её иногда приходится сбрасывать: Adobe Photoshop 7.0 < 8.0 < CS < CS2.
Одной из причин того, что не было Winamp 4, стал каламбур: Winamp 4 skin и англ. foreskin — «крайняя плоть»[4].
Пропуски в версияхПравить
Иногда разработчик пропускает номер версии, чтобы не отставать от конкурентов или других продуктов той же компании: например, Microsoft Access перепрыгнул сразу от 2.0 к 7.0. Netscape Communicator пропустил пятую версию, так как Internet Explorer добрался уже до 6.0; к тому же версию 5.0 в User-Agent’ах застолбили тестовые выпуски браузера Mozilla Suite.
В Sun Solaris отбросили первую цифру: 2.8 и 2.9 в маркетинговых материалах именовались 8 и 9; Java SE 1.5.0 и 1.6.0 — как Java 5 и 6. Slackware Linux в 1999 году прыгнул от версии 4 сразу к 7.
Microsoft Windows 10 выходит после 8.1.
PHP перескакивает от 5 к 7, причиной объявлено то, что версия 6 оказалась распиаренной, но нереализуемой, и многие из её нововведений были присоединены к 5-й ветке[5].
Алгоритмы определения старшинства версийПравить
Часто нужно программно определять, какая из двух версий старше — например, «пузыри» поддерживаются в Windows начиная с 2000[6], а в более ранних версиях надо поступать другими способами. Такая проверка делается по довольно сложным правилам: например, если версия — десятичная дробь, сначала требуется сравнить целые части как числа; если они равны, то дробные — как строки. Если версия — тройка или четвёрка чисел, то сравнивают числа по одному, пока не будет зафиксировано неравенство.
Поскольку чрезмерно сложные алгоритмы чреваты ошибками[7], а модульные тесты писать не всегда есть время, часто обходятся упрощёнными вариантами: например, строят с помощью битовых полей длинное число (1.2.3.4 → 0102030416); либо сравнивают версии как строки в лексикографическом порядке. Первое не сработает, если одно из чисел перейдёт за 256 (1.0.257 < 1.1.0, но 01010116 > 01010016), второе — если выйдет версия 10 (9.5 < 10.0, но «9.5» > «10.0»).
Иногда подобные упрощения играют злую шутку: в первые годы популярности Windows выяснилось, что множество программ некорректно проверяли версию ОС, отказываясь работать под 4.0. Поэтому Windows 95 и Windows 98 имели внутренние версии 3.95 и 3.98[8].
Похожие ухищрения применялись в User-Agent’е браузера Opera при переходе с версии 9.64 на 10.00. Это вызвано тем, что некоторые сайты, реагирующие на User-Agent, либо сравнивали номера как строки (10.0 < 9.5), либо брали первую цифру (10.0 = 1.0)[9]. Разработчикам пришлось использовать запись Opera/9.80 вместо Opera/10.00, а настоящий номер версии добавить в конце UserAgent’а[10]. Планировалось, что к 11-й версии UserAgent примет привычный вид, однако это ухищрение использовалось вплоть до перехода на движок Blink (начало 2013 — при том, что переход на 10-ю версию произошёл ещё в 2009 году).
В PHP имеется специальная функция version_compare()
для определения старшинства версий[11].
Применение схем нумерации ПО в других сферах культурыПравить
Внешние ссылкиПравить
- Спецификация семантического версионирования Архивная копия от 2 октября 2014 на Wayback Machine (SemVer)
См. такжеПравить
ПримечанияПравить
- ↑ Versioning (неопр.). Дата обращения: 17 ноября 2017. Архивировано 27 сентября 2019 года.
- ↑ 1 2 What's In a Version Number, Anyway? (неопр.) Дата обращения: 18 ноября 2017. Архивировано 1 декабря 2017 года.
- ↑ Вопросы и ответы по развертыванию Windows 7 (неопр.). Дата обращения: 29 октября 2017. Архивировано 1 декабря 2017 года.
- ↑ FAQ — Winamp Help (неопр.). Дата обращения: 6 мая 2011. Архивировано из оригинала 19 декабря 2013 года.
- ↑ Следующая версия PHP будет называться PHP 7 / Хабрахабр (неопр.). Дата обращения: 20 мая 2015. Архивировано 20 мая 2015 года.
- ↑ Структура
NOTIFYICONDATA
на MSDN (неопр.). Дата обращения: 7 мая 2011. Архивировано 12 июня 2011 года. - ↑ Разбор функции
CheckWin32Version
на Embarcadero Quality Central (неопр.). Дата обращения: 7 мая 2011. Архивировано из оригинала 29 июля 2013 года. - ↑ Некорректные проверки номеров версий (неопр.). Дата обращения: 6 мая 2011. Архивировано 16 января 2013 года.
- ↑ Andreas Bovens. Changes in Opera’s user agent string format (англ.) (недоступная ссылка — история) (27 мая 2009). — Описание мотивов изменений в формате AserAgent-а. Дата обращения: 18 июня 2011. Архивировано 22 февраля 2012 года.
- ↑ Например:
Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.8.131 Version/11.11
- ↑ version_compare() (неопр.). Дата обращения: 17 ноября 2013. Архивировано 23 апреля 2014 года.