(c) https://www.behance.net/Dinafrik

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

Перед тем, как перейти на Python, я какое-то время писал на Ruby, баловался Perl'ом, и только слышал, что есть, де, какой-то там "питон". Опробовать же его в деле я по какой-то не понятной причине долго не мог собраться. Что меня останавливало? Сейчас уже и сам не знаю точно... Помню, прочитал статью на википедии о нём, и удивился - язык-то аж 89-го года! Ну что интересного может быть в таком "динозавре"? Отталкивало и название - "питон". Ну что за ...? От Ruby я тогда был в восторге, но подспудно ощущал - что-то не то... Не буду сейчас о Ruby - статья не об этом, может в другой раз расскажу. Однако, в один прекрасный день мы решили делать новый проект именно на Python, и всё заверте...

Это была любовь, эмм, с первой строчки(?). Какой же он всё-таки простой. Не отвлекаясь на синтаксис, можно сразу сосредоточиться на решаемой проблеме. Основные концепции языка - тоже предельно просты. Всё происходит явно, даже передача объекта в собственный метод - пресловутый self. Стандартная библиотека и "магазин сыра" - казалось, Python приспособлен к любой задаче. Задачи, правда, в те времена были попроще. В общем, писать на нём было одно удовольствие. И я писал. Писал, и удивлялся - как я протянул со знакомством до сих пор?

Особенно хорошо он смотрелся на контрасте с тем же Ruby: если вам что-нибудь говорят такие ключевые слова, как rvm, rbenv, то вы меня поймёте. Запуск интерпретатора - это просто $ python script.py. Второй Python, правда, был всё ещё в ходу, это несколько сбивало с толку. Никаких странных символов вроде доллара, никаких точек с запятой - как выражался тогда мой коллега - "just plain English" (он так и про Ruby говорил, правда). Zen of Python, опять же.

There should be one-- and preferably only one --obvious way to do it.

import this

В общем, я был очарован. Я писал очень много кода на Python. Писал, и писал...

Со временем стала расти сложность проблем, которые мне приходилось решать. Потребовалось распарралелить вычисления - не проблема, вот тебе пожалуйста multiprocessing.map. Стало этого мало - дерижируй потоками (или процессами) напрямую. Вот я впервые написал многопоточную программу. Как и всё прочее, это было просто - не считая врождённых проблем многопоточного программирования, таких как синхронизация доступа. Что там за проблема с GIL, я тогда представлял смутно.

Вот я написал "демона" - программу, предназначенную работать всегда. И снова - обработка сигналов очень проста.

Повышалась сложность, росла и моя экспертиза и в языке, и в программировании. Потребовалось работать с сокетами напрямую - и опять, всё просто. TCP эхо-сервер пишется на коленке за пять минут, после прочтения документации. Да, документация - она на столько хороша, что docs.python.org на какое-то время выбился в мой личный топ самых посещаемых сайтов. Оттуда я почерпнул более глубокие знания о "нутрянке" Python'а - таких вещах, как слоты, дескрипторы, генераторы. Ни каких yield from тогда ещё не было и впомине. Однако начали закрадываться смутные сомнения, что что-то не так...

Когда требовалась скорость, всегда находилась библиотека с нативными расширениями, и всё работало действительно быстро.

Потом была дейтсвительно большая система на Python. Не буду вдаваться в подробности, что за система, но она была дествительно большая. Сотни тысяч строк кода. Тысячи классов. Десятки взаимодействующих сервисов. API, очереди сообщений, SQLAlchemy. Ох и тормозило же всё это дерьмо )). Мы профилировали, дебажили, инструментировали, масштабировали - и всё равно тормозило. Что-то явно было не так. Тогда-то я и занялся исследованием проблемы GIL. Произовдительность сетевых сервисов можно было существенно повысить с помощь Linux'ового системного вызоваepoll. Только вот была одна проблема... Видите ли, не возможно было обрабатывать отдельные соединения с помощью, скажем, пула потоков. Ну то есть как, возможно, но... Интерпретатор всё равно выполнял всегда один поток. Правда, если всё, что делает поток - это ждёт ввода/вывода или чего-то другого, то особых проблем это не вызывало. Ведь тогда ему дозволено отпустить глобальную блокировку. Но... Народ требовал хлеба и зрелищь! Ну не удобно, понимаешь, на каждый чих писать нативное расширение (отпускать блокировку имеют право именно они). Я же открыл для себя Tornado, Eventlet, Stackless Python (ныне почил), PyPy.

Я ещё больше углубился в "кишки" языка. Узнал мног интересного про особенности реализации. Как раз тогда и прозвучал первый звоночек. А именно, Python3000. Одна мысль не давала мне покоя - раз вы решились переписывать интерпретатор заново, умышленно ломая обратную совместимость - что мешало выпилить GIL к чертям собачим??? Но - не выпилили...


И вот, нынче только ленивый питонист не написал веб-сервис на asyncio. Его и ругают, и хвалят на все лады. Куча асинхронных фреймворков. Гвидо ушёл. Новые версии языка релизятся как горячие пирожки. Засилие моржей и type hint'ов.

Для меня же Python умер - как раз тогда, когда Гвидо ушёл. Пока он был, язык имел хоть какую-то концептуальную целостность. Сейчас же - это сливной бачок для любой модной фигни, которую тащат в язык не задумыааясь - а нужна ли она там вообще? Чего только стоит запиливание pyenv - ничем не напоминает времена Ruby?

И всё же, Python уникален. Это одновременно и отличный язык, и ужасная реализация. Арминушка "наше всё" Роначер это понял значительно раньше - и свалил в Rust. Когда вы начинаете погружаться в исходники самого интерпретатора, к вам неизбежно приходит осознание того, на сколько плохо он реализован. Отсутствие спецификации также не идёт языку на пользу, а только сдерживает развитие альтернативных реализаций. Спецификация "just do what CPython does" - гарантия так себе.


Когда-то Python действительно был отличным языком. Он подходил и для быстрого прототипирования, и для не больших (да и для больших тоже) проектов любого толка - веб, десктоп, системные сервисы. Динамическая типизация не вызывала особых проблем. Это был целостный, предсказуемый язык. Сейчас же - это франкенштейн, разваливающийся на части. Смена поколений в менеджменте языка так же не пошла ему на пользу - хипстеры с NIH-синдромом явно не делают его лучше.

И всё-таки, это было отличное время! По крайней мере, для меня. Я благодарен Гвидо и всему сообществу Python за этот уникальный язык! Однако рано или позно приходит время двигаться дальше.

А вы как считаете?

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


  1. NTDLL
    17.02.2022 04:37

    Вопрос такой. Насколько широко используется питон. Чем то он практичнее, чем C к примеру?


    1. lair
      17.02.2022 04:55
      +5

      Чем то он практичнее, чем C к примеру?

      Почти все курсы по DS/ML/AI, которые я видел, были на питоне (кроме одного, который был на Octave, и тот с тех пор переехал). Стартовая документация на какой-нибудь Amazon SageMaker заведомо предполагает питон.


      Это, на мой взгляд, весьма "практично".


    1. vkni
      17.02.2022 05:14
      +4

      Ну это как спросить, что практичнее - отвёртка или молоток. C и Python, как правило, используются в дополнение друг к другу. То есть, работают вместе в одной и той же системе.


  1. cepera_ang
    17.02.2022 05:26
    +11

    Какой резкий переход от "меня ничего не парило, я просто наслаждался языком для несложных или средне-сложных задач" к "я стал делать требовательные системы, а ещё достаточно вырос, чтобы начать понимать кишки, а не только простоту синтаксиса, и поэтому внезапно питон стал сливным бачком".


    Вот раньше Гвидо в одну каску пилил все прекрасно, а теперь какие-то хипстеры сделали ужас. Вот только основной ужас там всегда был, и основная красота никуда не делась с уходом Гвидо.


    1. atoshin Автор
      17.02.2022 15:47

      В финале я говорил о том, что язык был предсказуемым. Это достигалось в том числе благодаря тому, что за стратегический дизайн языка отвечал по большей части один человек. У него было целостное представление об этом самом дизайне.

      В том, как и куда развивается язык сейчас, я такой целостности не увидел.


      1. cepera_ang
        17.02.2022 16:18
        +2

        Просто все хаки, которые были на момент вашего прихода в язык вы воспринимаете как данность и как "прекрасный целостный дизайн", потому что синдром утёнка. А теперь когда увидели как сосиски делаются на самом деле уже критическим взглядом воспринимаете дальнейшее развитие.


  1. Aquahawk
    17.02.2022 06:32

    То, что на питоне кто-то пытается писать большие системы имхо временное недоразумение. Он чудовищно медленный, на уровне с ruby и perl. Они в несколько десятков раз медленнее чем c#, java, c++, js. А отсутствие типизации делает развитие больших систем тем дороже, чем система больше. Я не говорю что это невозможно. При сохранении строгих гайдлайнов по написанию кода это даже может работать. Взлёт typescript хорошо показывает нам насколько типизация важна. И хинтовая типизация в питоне имхо странное решение. Маленький шанс на то что они образумятся и сделают типизированный Puthon 4 с jit оставить можно, но с учётом того как больно было при переходе 2->3, думаю этого не произойдёт.


    1. atoshin Автор
      17.02.2022 15:45

      Готов побиться об заклад, что Python 4 мы не увидим ))


      1. Aquahawk
        17.02.2022 18:55

        Так и я ставить не готов на то что он выйдет.


  1. SemyonSinchenko
    17.02.2022 07:13
    +3

    Во многом согласен с автором. Фишкой питона всегда была простота и принцип о том, что должен быть единственный очевидный способ что-то реализовать. Это делало код на питоне читаемым, а уровень входа низким: можно было просто брать и писать или брать и читать чужой код. А сегодня в язык реально тащат все подряд: от pattern matching, до мета-программирования. Стандартная библиотека уже содержит кучу дублированных модулей (например, Pathlib vs os), каждый разраб пишет по своему (фильтруем элементы: у одного будет map/filter, у другого цикл с if/else, у третьего компрхеншн с условием и лямбдами, четвертый pattern-matching затащит и т.д.). Вход в язык становится все труднее (тупо больше изучать), чужой произвольный код читать все труднее и т.д.


    1. cepera_ang
      17.02.2022 07:27
      +12

      Циклы в питоне сразу же были, map/filter и лямбды появились в питоне в 1993 году, мета-программирование — в 1998, list comprehensions — в 2000. Единственное из перечисленного, что появилось за последние 20 лет — это pattern matching. Ну ладно, и Pathlib ещё десять лет назад. Так в какой момент времени фишкой питона была простота и низкий уровень входа?


      1. werevolff
        19.02.2022 04:18

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


  1. Myxach
    17.02.2022 07:21
    +6

    Сейчас же - это сливной бачок для любой модной фигни, которую тащат в язык не задумыааясь - а нужна ли она там вообще? 

    Так сейчас вроде с любыми языками такая вещь? Тот же C++


  1. El_Kraken_Feliz
    17.02.2022 09:12
    +7

    Сейчас же - это франкенштейн

    Бедные C++ разработчики. Вот уж где количество отросших ног и прочих конечностей потрясает :)


  1. Goupil
    17.02.2022 11:04
    +9

    Питон это клей, не надо к клею, даже эпоксидному, предъявлять сопроматные требования как к железно-бетонной арматуре.


  1. Sin2x
    17.02.2022 13:55
    +1

    "Ушёл" в отношении Гвидо это громко сказано, он и сейчас работает над ускорением Питона в Майкрософт: https://www.softwareatscale.dev/p/software-at-scale-34-faster-python

    Обещает, что 3.11 будет в два раза быстрее 3.10. Посмотрим.

    https://speed.python.org


    1. atoshin Автор
      17.02.2022 15:45

      Важно то, что решения по дизайну языка принимает уже не он.


  1. r-4
    17.02.2022 20:22

    "Учить или не учить?" - вот в чем вопрос


  1. siberiano
    17.02.2022 20:41

    Пишу на питоне с 2009, выбирал по вот этому сравнению -- по размеру сообщества Питон выигрывал, и я хорошо угадал с выбором. Не соглашусь, что всё было хорошо, а потом вдруг испортилось. По сравнению с 2.5, который был широко в ходу в 2009, стало очень удобно. Ветку 3.х причесали к 3.6, и с 2.7 было легко перейти, и получить много полезного, например, типы аргументов. До этого, чтобы проверять параметры, приходилось либо делать стопку декораторов (и называть параметры по имени, за чем не мог следить pyflakes), либо в код функции писать что-нибудь.

    Да, есть сомнительные новшества вроде := (это его моржом называют?), или те же сборные типы (List[int]), есть проблемы в эргономике (например, в Пандасе постоянно приходится писать вот такое уродство: mydf[(mydf.column1 == 123) & (mydf.column2 == 456)]) ).

    Но как язык общего назначения он набрал большой момент, и вряд ли остановится. Лучшая аналогия ему -- C и Java. Оба языка имеют серьёзные недостатки, обоим есть замены (Rust, Go), оба сохраняют популярность. (Возможно, что хотя их доля среди разработчиков падает, в абсолютном выражении скорее всего на них пишет всё больше людей.)

    Перейти на другой язык скорее всего не получится, потому что в Питоне мы пользуемся очень широким диапазоном фич, и в других языках их нет всех и сразу, и в хорошем качетсве. Но другие языки могут начать откусывать доли в нишах, как Julia (замена Pandas), или Go/Rust (веб, например).


    1. dmitrysvd
      17.02.2022 21:40

      типы аргументов. До этого, чтобы проверять параметры, приходилось либо делать стопку декораторов (и называть параметры по имени, за чем не мог следить pyflakes), либо в код функции писать что-нибудь.

      Так типы параметров и сейчас не проверяются


      1. siberiano
        18.02.2022 13:32

        Я знаю. Но сейчас проверять параметры какой-нибудь библиотекой стало гораздо проще.


    1. atoshin Автор
      17.02.2022 21:47

      Интересно, что C и Java вы сравниваете с Rust и Go )) Лично я Go воспринимаю как замену как раз-таки Python.


      1. siberiano
        18.02.2022 13:33

        Не имею опыта с Go, руки не дошли пока, надо попробовать.


  1. Ktulhy
    17.02.2022 20:48
    +2

    Я уж думал вы про метаклассы и дескрипторы расскажете, или хотя бы укажете какую именно «модную фигню» внесли в язык и почему не должны были?


    1. werevolff
      19.02.2022 04:23

      Я думал, ТС обидется и уйдёт в PHP, а года через 3 запилит статью о том, как laravel год назад убил хороший скриптовый язык.


  1. GBR-613
    18.02.2022 13:28
    -1

    Такова судьба каждого языка. Сначала есть что-то простое и очень удобное (по крайней мере, для определённых целей). Все в восторге. Только бы ещё вот это добавить, потом вот это... И так, улучшаясь, язык медленно, но верно, превращается в какого-то уродца.

    Не надо (было до изобретения asyncio ) на Питоне писать огромные серверы с многопоточностью. Он просто не для этого (был) предназначен.