В 2014 году пользователи ждали логичного продолжения линейки Windows 8 и готовились к встрече с Windows 9. Ожидания разбились в одно мгновение: 30 сентября 2014 года корпорация Microsoft на закрытом мероприятии в Сан-Франциско представила не девятую, а сразу десятую версию операционной системы. Исполнительный вице-президент Терри Майерсон вышел на сцену и объявил, что продукт настолько значителен, что одной цифры для него недостаточно. Фраза звучала эффектно, но люди, близкие к индустрии, быстро поняли: за красивой маркетинговой обёрткой скрывается куда более прозаичная и занятная инженерная история. А через некоторое время в профессиональных сообществах всплыла версия, которую инсайдеры подтверждали с усмешкой. Дескать, Windows 9 не случилась потому, что тонны устаревшего кода, написанного ещё в середине девяностых, приняли бы новую систему за Windows 95 или Windows 98 и посыпались бы прямо на глазах у изумлённой публики.
На сцене в Сан-Франциско прозвучала десятка вместо законной девятки
Презентация 30 сентября 2014 года получилась камерной по меркам Microsoft: никаких стадионов, только журналисты и аналитики. Именно поэтому момент объявления названия выглядел почти буднично. Терри Майерсон несколько секунд выдерживал паузу, после чего на экране зажглась надпись Windows 10. В зале послышался смешок удивления: нумерация прыгнула через цифру впервые за всю историю семейства NT. Официальное объяснение сводилось к тому, что новая система станет единой платформой для компьютеров, планшетов, смартфонов, консолей и даже очков дополненной реальности, а такой шаг достоин числа побольше. Журналисты записали тезис про "one product family, one platform, one store" и разошлись писать заметки. Но вопрос оставался открытым: почему же именно перепрыгнуть через цифру, а не назвать систему Windows One, как годом раньше поступили с консолью Xbox One. Ответа в пресс-релизе не было, и вакуум немедленно заполнили слухи.
Программа двадцатилетней давности узнавала систему по первым символам названия
Через несколько дней после анонса в разработческих сообществах появились сообщения от людей, назвавшихся сотрудниками Microsoft. Их рассказ совпадал в главном. Внутри компании собрали статистику по сторонним программам и обнаружили в исходниках массово повторяющийся фрагмент. Разработчики девяностых и двухтысячных, желая отличить современные системы от ветки Windows 95 и Windows 98, проверяли не настоящий номер версии ядра, а литерально строку названия. Типичная конструкция выглядела примерно так: если версия системы начинается с "Windows 9", значит, перед нами старая добрая Windows 95, 98 или 98 SE, и программе следует включить режим совместимости. В Java, которая тогда была на пике популярности в корпоративной среде, строку имени системы возвращал вызов System.getProperty("os.name"), и проверка сводилась к методу вроде startsWith("Windows 9"). Аналогичный приём встречался в установщиках драйверов, бухгалтерских комплексах, самописных корпоративных оболочках и старых играх.
Проблема очевидна даже без глубоких познаний в программировании. Система с именем "Windows 9" попадала бы под то же правило. Приложение, заточенное под логику конца девяностых, включало бы архаичный режим работы, отказывалось ставиться, выдавало ошибки или молча вело себя неправильно. Несовместимость грозила стать не точечной, а массовой: такой код вкручивали тысячи программистов в сотнях тысяч продуктов по всему миру, и многие из этих продуктов к 2014 году уже никто не поддерживал. Переписать их задним числом не смогла бы и сама Microsoft.
Обратная совместимость превратилась из достоинства платформы в её главный страх
Чтобы понять масштаб опасений, стоит вспомнить философию Windows. Главным козырем платформы на протяжении десятилетий оставалась обратная совместимость: программа, купленная для Windows 95, часто заводится и на современной машине. Этим достижением компания гордится по праву, внутри неё работало легендарное подразделение совместимости, и менеджеры слышали от руководства знаменитую формулу про неприкосновенность старых приложений. Но у медали есть и оборотная сторона. Система обязана тащить за собой не только старые интерфейсы, но и старые ошибки, странности и привычки чужого кода. Если в какой-то программе из года 2002 строковая проверка написана в лоб, операционная система обязана с этим жить.
У Microsoft уже был болезненный опыт подобного рода. При смене поколений ядра с ветки 9x на NT менялся и внутренний номер версии: Windows 2000 получила номер 5.0, XP стала 5.1, Vista неожиданно для многих разработчиков оказалась шестёркой, 6.0. Тогда часть приложений рухнула, потому что их авторы жёстко проверяли равенство версии пятёрке и отказывались запускаться на "незнакомой" системе. Урок запомнили. Именно поэтому Windows 7 внутри называется версией 6.1, Windows 8 носит номер 6.2, а Windows 8.1 значится как 6.3: маркетинговые названия бегут вперёд, но технический номер изменяли минимально, чтобы не спугнуть программы, требующие "не ниже и не выше".
Внутренний номер ядра сначала сменился на 6.4, а затем прыгнул на 10.0
Любопытная деталь подтверждает, насколько серьёзно в Редмонде отнеслись к имени. Первые публичные сборки Windows 10 Technical Preview (9841, 9860 и 9879, осень 2014 года) сообщали о себе номер версии 6.4. Номер 10.0 появился лишь в конце ноября 2014 года, начиная со сборки 9888. Прыжок с 6.3 на 10.0 не имел аналогов: техническое версионирование совпало с маркетинговым впервые за много лет. Инженеры объясняли это тем, что сама Windows 10 позиционируется как новая платформа, и пусть её внутренний номер говорит об этом честно. Скептики добавляли: если уж имя Windows 9 запрещено из-за строковых проверок, то и номер 9.0 кроет те же грабли, ведь часть кода сверяла не слова, а именно цифру версии. Рискованно оказалось всё, где маячила девятка, и корпорация предпочла перестраховаться по полной программе.
Цифра девять и раньше приносила индустрии неприятности на ровном месте
История с Windows 9 лишь на первый взгляд кажется уникальной. Индустрия давно знает, что строковое сравнение версий это минное поле. Когда на рубеже тысячелетий готовились к выходу системы с двузначными годами и новыми номерами, старые программы уверенно складывали строки как числа и получали чепуху. Позже выяснилось, что Java-приложения массово ломались о выход OS X 10.10 Yosemite, потому что код проверял префикс "10.1" и принимал свежую систему за древнюю 10.1 из начала двухтысячных. Похожая комедия случилась с браузерами: когда их версии перевалили за десятку, сайты, сравнивавшие строку агента пользователя посимвольно, решали, что посетитель сидит с браузера версии 1, и показывали ему предупреждение об устаревшем обозревателе. Девятка в одиночестве виновата лишь отчасти. Виновата привычка поколений программистов экономить строки кода там, где экономить нельзя.
Справедливости ради, у версии про строковую проверку нашлись и критики. Формально Microsoft никогда не публиковала документ, где прямо говорилось бы: мы отменили Windows 9 из-за startsWith. Часть инсайдеров настаивала, что решение принимали маркетологи, желавшие отмежеваться от провальной репутации Windows 8 и подчеркнуть новизну. Правда, по-видимому, как часто бывает, лежит посередине: инженерный риск послужил весомым аргументом на весах, а красивая легенда про "настолько хорошо, что сразу десять" пришлась очень кстати.
Система научилась обманывать старые программы ради их собственного блага
Разговор о версиях будет неполным без забавного механизма, который Windows использует уже много лет. Когда приложение спрашивает у системы свой номер версии через классическую функцию GetVersionEx, современная Windows может при необходимости слукавить и ответить цифрой пониже, если в манифесте программы не заявлена поддержка новых выпусков. Обман продуманный и милосердный: софт, который панически боится любой цифры выше заветной, получает знакомый ответ и спокойно работает дальше. Параллельно существует целая инфраструктура "прокладок совместимости", которые перехватывают обращения конкретных старых программ и подсовывают им поведение Windows 95 или XP. Пользователь видит это в свойствах ярлыка как скромную галочку "запустить в режиме совместимости", а внутри системы на этот случай припасены тысячи индивидуальных исправлений под конкретные приложения, от бухгалтерских пакетов до игр конца девяностых. Платформа буквально притворяется бабушкой ради того, чтобы внук чувствовал себя уверенно.
На этом фоне решение обойти цифру девять выглядит не капризом, а ещё одним звеном в длинной цепи компромиссов. Система могла бы называться Windows 9, а внутри отвечать программам что-то нейтральное. Но каждый такой обман добавляет хрупкости, а ставки при мировой установочной базе в полтора миллиарда устройств слишком высоки для красивых жестов.
Отдельная история - то, как вообще менялись названия системы от первых версий до десятки.
Хронология названий Windows сама по себе напоминает музей маркетинговых экспериментов. Начиналось всё чинно: Windows 1.0 в 1985 году, затем 2.x, затем популярная 3.x. В 1995 году нумерацию внезапно сменили на годы выпуска, и на сцену вышли Windows 95 и 98 с Millennium Edition на закате линейки. Параллельно развивалась ветка NT со своей нумерацией. В двухтысячных корпорацию понесло в сторону слов: появились XP, что расшифровывалось как experience, затем Vista, чьё имя обещало "ясный вид". Провал Vista заставил маркетологов срочно вернуться к трезвым цифрам, и публика получила Windows 7, несмотря на то что по счёту крупных клиентских выпусков это была вовсе не седьмая система. Цифры снова победили слова, зато теперь уже цифры без всякой строгой логики.
Если выстроить знаменитые пропуски и скачки в один ряд, картина получается показательная:
- Windows 3.x сменилась годами 95 и 98 вместо ожидаемой четвёрки;
- Windows 8 перескочила через девятку сразу к десятке;
- Внутренние номера 6.1, 6.2, 6.3 никак не совпадали с внешними названиями 7 и 8;
- Номер ядра сменился с 6.4 на 10.0 в ходе тестирования, начиная со сборки 9888;
- Консоль Xbox One тем временем доказала, что маркетологи корпорации вообще не считают последовательность священной.
Регулярность сбивается, но закономерность угадывается: название всегда подчиняется сиюминутной стратегии, а инженерное наследие молча тянет лямку настоящих номеров.
Урок для любого разработчика прячется в одной короткой строке кода
Из истории с несостоявшейся девяткой практикующий программист способен вынести очень приземлённую мораль. Проверять окружение нужно по возможностям, а не по названиям. Вместо сравнения строки "Windows 9" корректнее спросить у системы, поддерживает ли она нужную функцию, загружается ли нужная библиотека, доступна ли нужная версия интерфейса. Современные руководства для разработчиков прямо рекомендуют именно такой подход, и причина рекомендации теперь известна каждому. Строка названия это дань эпохе, когда API были скудными, а программисту проще было сравнить текст, чем разбираться в документации. Эпоха прошла, а строки остались, и они по-прежнему сидят в коде программ, которыми пользуются больницы, заводы и банки. Каждый, кто пишет проверку версии в лоб сегодня, рискует через двадцать лет стать персонажем точно такой же байки, которую будут пересказывать уже его коллегам.
Наследие девяностых до сих пор диктует правила большим платформам.
История пропавшей девятки наглядно показывает, как долго живёт код в индустрии. Программа, набранная в 1997 году на скорую руку ради одного установщика, двадцать лет спустя способна влиять на решения корпорации с бюджетом в десятки миллиардов долларов. Старые проверки версий, забытые библиотеки, причудливые имена веток реестра, о которых никто не помнит, всё это продолжает тихо работать или тихо мешать в недрах миллионов машин. Windows 10 в итоге прожила десятилетие и уступила место Windows 11, а гипотетическая Windows 9 осталась белым пятном в нумерации, подобно тринадцатому этажу в некоторых небоскрёбах. Разница лишь в том, что пропустили её не из суеверия, а из сугубо практического расчёта: лучше смешная пауза на презентации, чем волна неработающих программ по всему миру в день релиза. И где-то в старом репозитории до сих пор лежит строчка, которая ждёт систему, начинающуюся на "Windows 9", и так и не дождётся её никогда.