Мы можем только догадываться, что происходило в рождественские выходные 1989 года, когда Гвидо ван Россум приступил к своему хобби-проекту. Что можно сказать о Python, чего ещё не было сказано? Это один из самых популярных языков в мире, первый язык, на котором я учился программировать по-настоящему, и одно из самых громких имён в сфере машинного обучения. Судя по всему, он ни за что не должен был получить всю ту популярность, которой добился. Его на несколько лет опережал Perl: релиз 1.0 вышел в 1987 году и пустил глубокие корни в мире Unix, компьютерной графики и биоинформатики.

Python имел ужасный Global Interpreter Lock (GIL) и был очень медленным по сравнению даже с другими языками с динамической типизацией. К тому же он разделил своё сообщество из-за перехода от версии Python 2 к версии 3. Даже сегодня есть люди, отказывающиеся прикасаться к нему после этого перехода. Но несмотря на все свои недостатки, ему каким-то образом удаётся быть успешным.

Во время перехода с Python 2 на 3 я учился на последнем курсе магистратуры и изучал Python 2, поэтому помню, как оттягивал освоение Python 3. К тому моменту переход длился уже почти десяток лет, поэтому многие библиотеки уже были обновлены. Но окончательный срок Python 2 был ещё далеко. Мне повезло, что мой переход оказался относительно безболезненным, но для многих людей это было не так. Давайте разберёмся, с чего всё началось, но пока совершим небольшое отступление.

Краткая история кодировок текста

Прежде чем продолжить, я бы хотел поговорить о кодировках текста. Это сложная тема, но я постараюсь быть как можно более кратким. Компьютеры понимают только нули и единицы, поэтому буква «A» для них бессмысленна. Следовательно, чтобы компьютер мог работать с текстом, мы должны преобразовать буквы в алфавите в двоичные числа. Одним из первых популярных стандартов был ASCII (American Standard Code for Information Interchange). Он появился в 1960-х годах и использовал для описания текста 7 бит. Это позволяло задать 128 перечисленных ниже символов…

ASCII, кодирующая 128 значений в 7 битах
ASCII, кодирующая 128 значений в 7 битах

Всё это удобно и здорово, если вам нужно использовать только 26 символов алфавита, вы говорите на английском и пишете стандартной прозой, но оставляет за бортом подавляющее большинство остального мира. В кодировке нет греческих букв и других специальных символов, что усложняло общение в некоторых предметных областях.

Международная организация по стандартизации (International Organization for Standardization, ISO) создала в 1987 году стандарт кодирования под названием ISO-8859-1, также известный как Latin-1. Она расширила список символов, которые можно закодировать, добавив ещё один бит. Это позволило описывать 256 уникальных символов вместо 128. Это была эпоха однобайтных кодировок символов, в которых одни и те же 256 значений сопоставлялись в разными буквами в зависимости от того, какая кодировка символов применялась.

В 1980-х был изобретён Unicode как способ кодирования текста при помощи переменного количества байтов. Используются три стандарта: UTF-8, UTF-16 и UTF-32. При помощи Unicode можно хранить 221 (2097152 значений) кодовых точек, что даёт нам много пространства для создания новых эмодзи. Среди трёх кодировок самая популярная — это UTF-8. Она позволяет кодировать значения переменной длины: самые распространённые символы кодируются одним байтом, а всё остальное — двумя-четырьмя байтами. Если вам хочется больше узнать об Unicode, то крайне рекомендую это видео Studying With Alex. Он разбирает Unicode гораздо более наглядно и объясняет его очень тщательно.

Раскол

Теперь, когда у нас есть определённое понимание кодировок текста, проблемы Python 2 выглядят более логичными. Даже в начале 2000-х недостатки Python начинали становиться очевидными1. Основные мейнтейнеры поначалу могли исправлять ошибки, развивая язык, добавляя новые возможности и выводя из обращения старые. Но с ростом популярности Unicode программисты со всего света захотели работать со строками на своих родных языках, поэтому неиспользование Unicode по умолчаниюв строках Python вредило ему. К тому же у разработчиков языка имелось стремление очистить его части и удалить некоторые возможности2. Так как при переходе всё равно должно было многое поломаться, некоторые люди хотели дополнительных возможностей, например, исправления конкурентности3.

Чтобы отслеживать предложения об изменениях, в Python используется процесс PEP (Python Enhancement Proposal). Мейнтейнеры решили, что все связанные с Python 3.0 предложения PEP должны начинаться с 3000 и 5 апреля 2006 года был создан первый PEP 30004. В этом PEP Гвидо написал знаменитые слова, вызывающие у некоторых ужас и по сей день…

Мы отказываемся от строгого требования того, чтобы код Python 2.6 выполнялся без изменений в Python 3.0. Даже его подмножество. (Разумеется, крошечное подмножество останется, но основная функциональность в ней отсутствует.)

И это основная проблема, с которой люди столкнулись при переходе. На момент написания моей статьи текущей версией Python является 3.11.1. В 2023 году никто не будет говорить, что Python 2.7 — это более совершенный язык, но 3 декабря 2008 года, когда вышел Python 3.0, это было неочевидно5. Когда программисты начали пытаться перейти с версии 2 на 3, сразу стали очевидны проблемы подхода «всё или ничего». Большая часть кода на Python 2 просто не работала в Python 3, и иногда на то не было никаких оснований. Например, лишь в 2012 году в PEP 4146 в язык разрешили вернуться префиксу 'u', что существенно уменьшило количество несовместимых между Python 2 и 3 строк.

Кроме того, многие считали, что инструмент, который выпустили в помощь с преобразованием кода на Python с 2 на 3,7 был неадекватным. Особенно учитывая то, что он не помогал с Unicode — одной из основных причин смена версий. Одна из самых важных причин этого заключалась в том, что в нём не было «общего кода» — способа писать код, для упрощения перехода работающего на обеих версиях. Вскоре решением этой проблемы занялись участники сообщества. Six8 — это библиотека, работавшая в качестве слоя совместимости между Python 2 и 3. Она позволила программистам писать код, работающий в обеих версиях, и упростила портирование крупных кодовых баз. Python-Future9 был ещё одной библиотекой с разнообразными инструментами для обратного портирования возможностей в Python 2 и преобразования кода Python 2→3. Но даже при наличии всех этих инструментов и новых возможностей в Python 3 темпы перехода были черепашьими.

Четыре года спустя после появления нового языка люди по-прежнему им не пользовались10. Спустя восемь лет Python 3 всё ещё был медленнее, чем Python 211, что печалило, учитывая, что он и так уже был известен как один из самых медленных языков с динамической типизацией и сбором мусора. Наконец, была назначена дата, и 1 января 2020 года объявили началом заката Python 212. Но многие мейнтейнеры из-за объёмных и переплетённых зависимостей оттягивали внесение изменений.

В своей ретроспективе перехода Python 2→3 (2018 год) Гвидо даже признался, что по-прежнему испытывал трудности с переходом в Dropbox13 из-за огромного объёма кода. Даже сегодня, в 2023 году, если приглядеться, можно увидеть примеры реального использования Python 2. Maya до сих пор поставляется с интерпретатором Python 214, по-прежнему поддерживает Python 2 дистрибутив RHEL15, а также инструменты наподобие ArcGIS16.

На этом моменте у вас, дорогой читатель, может возникнуть вопрос: «мёртв ли язык Python?», и ответ будет отрицательным. На самом деле он популярнее, чем когда бы то ни было17. Ему удалось то, что не смог сделать Perl 6 (теперь Raku) — пережить разделивший сообщество переход. Но за это пришлось заплатить.

Какой же была цена?

Людям приходится расплачиваться за любое решение, даже в разработке ПО. Переход с Python 2 на 3 травмировал многих18. Некоторые даже поклялись из-за этого больше никогда не прикасаться к языку. Сам Гвидо начал ощущать это бремя, сталкиваясь со всё более сильным противодействием сообщества, что разрушало удовольствие от работы над проектом. В итоге 12 июля 2018 года он снял с себя полномочия великодушного пожизненного диктатора (Benevolent Dictator For Life, BFDL)19, заявив, что причиной тому в большей степени стал PEP 57220. Но пережив переход и став успешным, Python 3 подтвердил правильность старого изречения Бьёрна Страуструпа:

Есть только два вида языков: те, на которые жалуются все, и те, которые никто не использует.

Свой вклад в популярность определённо внёс бум машинного обучения, но в Python вкладывали много усилий и до него, несмотря на то, что некоторые люди считали важными недостатками: gil, сборщик мусора, пробелы, медленность языка и так далее. Я думаю, это говорит о том, что на протяжении его жизни в основном принимались правильные решения. Я заметил, что программирование становится популярнее не потому, что новичкам нравится теория или они хотят знать, как работают компьютеры. Это просто инструмент для решения задач. И в таком подходе нет ничего неправильного, но очень немногие языки можно использовать для этого так же легко, как Python. Значит ли это, что мы по-прежнему будем использовать Python через тридцать лет? Мне кажется, да.

Но это не отменяет того факта, что сообществу пришлось прийти на помощь в облегчении перехода, когда мейнтейнеры проекта не справились с предоставлением адекватной поддержки. Тем не менее, как человек, которому никогда не доводилось поддерживать язык программирования в течение почти тридцати лет, я бы хотел завершить этот пост цитатой Антуана Эго из мультфильма «Рататуй».

Во многих смыслах работа критика проста: мы ничем не рискуем, но ставим себя над теми, кто приносит свой труд и самих себя на наш суд. Сокрушительные разносы приятно писать и читать, но мы, критики, должны бы признать, что в общей картине мироздания любая гадость, вероятно, важнее, чем вся наша критика в её адрес.

Комментарии (4)


  1. Jury_78
    22.09.2023 11:08
    +2

    я бы хотел завершить этот пост цитатой

    Мне вот пришла на ум цитата из Маугли:

    Да, нелегко сбрасывать кожу!


  1. denim
    22.09.2023 11:08
    +1

    Имел опыт портирования ~300k sloc django монолита с 2 на 3. Проект был живой, в проде и продолжал расти. Справились за полгода в три пары рук, один раз уронили правда и сделали даунтайм на полчаса, но в целом считаю все прошло успешно. Глаза боятся а руки делают


  1. MordorianGuy
    22.09.2023 11:08

    Думаю, многие, кто перешёл и не бросил или начал учить сразу с третьей версии, признаются, что оно того стоило. Я начал изучать Python 3 в 2017, но мой первый проект, который я пилил полгода, был на Jython, который поддерживает только синтаксис второй версии. Был ещё не раз опыт работы с API-обёртками C++/Python2. После этого начинаешь полностью понимать причины, почему это было сделано так, а не иначе. И что вряд ли получилось бы создать новую версию даже как над/подмножество языка.


  1. titan_pc
    22.09.2023 11:08

    О, кто то вскрыл капсулу времени