(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)
cepera_ang
17.02.2022 05:26+11Какой резкий переход от "меня ничего не парило, я просто наслаждался языком для несложных или средне-сложных задач" к "я стал делать требовательные системы, а ещё достаточно вырос, чтобы начать понимать кишки, а не только простоту синтаксиса, и поэтому внезапно питон стал сливным бачком".
Вот раньше Гвидо в одну каску пилил все прекрасно, а теперь какие-то хипстеры сделали ужас. Вот только основной ужас там всегда был, и основная красота никуда не делась с уходом Гвидо.
atoshin Автор
17.02.2022 15:47В финале я говорил о том, что язык был предсказуемым. Это достигалось в том числе благодаря тому, что за стратегический дизайн языка отвечал по большей части один человек. У него было целостное представление об этом самом дизайне.
В том, как и куда развивается язык сейчас, я такой целостности не увидел.cepera_ang
17.02.2022 16:18+2Просто все хаки, которые были на момент вашего прихода в язык вы воспринимаете как данность и как "прекрасный целостный дизайн", потому что синдром утёнка. А теперь когда увидели как сосиски делаются на самом деле уже критическим взглядом воспринимаете дальнейшее развитие.
Aquahawk
17.02.2022 06:32То, что на питоне кто-то пытается писать большие системы имхо временное недоразумение. Он чудовищно медленный, на уровне с ruby и perl. Они в несколько десятков раз медленнее чем c#, java, c++, js. А отсутствие типизации делает развитие больших систем тем дороже, чем система больше. Я не говорю что это невозможно. При сохранении строгих гайдлайнов по написанию кода это даже может работать. Взлёт typescript хорошо показывает нам насколько типизация важна. И хинтовая типизация в питоне имхо странное решение. Маленький шанс на то что они образумятся и сделают типизированный Puthon 4 с jit оставить можно, но с учётом того как больно было при переходе 2->3, думаю этого не произойдёт.
SemyonSinchenko
17.02.2022 07:13+3Во многом согласен с автором. Фишкой питона всегда была простота и принцип о том, что должен быть единственный очевидный способ что-то реализовать. Это делало код на питоне читаемым, а уровень входа низким: можно было просто брать и писать или брать и читать чужой код. А сегодня в язык реально тащат все подряд: от pattern matching, до мета-программирования. Стандартная библиотека уже содержит кучу дублированных модулей (например, Pathlib vs os), каждый разраб пишет по своему (фильтруем элементы: у одного будет map/filter, у другого цикл с if/else, у третьего компрхеншн с условием и лямбдами, четвертый pattern-matching затащит и т.д.). Вход в язык становится все труднее (тупо больше изучать), чужой произвольный код читать все труднее и т.д.
cepera_ang
17.02.2022 07:27+12Циклы в питоне сразу же были, map/filter и лямбды появились в питоне в 1993 году, мета-программирование — в 1998, list comprehensions — в 2000. Единственное из перечисленного, что появилось за последние 20 лет — это pattern matching. Ну ладно, и Pathlib ещё десять лет назад. Так в какой момент времени фишкой питона была простота и низкий уровень входа?
werevolff
19.02.2022 04:18Нытьё из разряда "раньше я писал говнокод, и за него платили. Сегодня от меня требуют чистый обслуживаемый продукт. Значит, виноват язык программирования".
Myxach
17.02.2022 07:21+6Сейчас же - это сливной бачок для любой модной фигни, которую тащат в язык не задумыааясь - а нужна ли она там вообще?
Так сейчас вроде с любыми языками такая вещь? Тот же C++
El_Kraken_Feliz
17.02.2022 09:12+7Сейчас же - это франкенштейн
Бедные C++ разработчики. Вот уж где количество отросших ног и прочих конечностей потрясает :)
Goupil
17.02.2022 11:04+9Питон это клей, не надо к клею, даже эпоксидному, предъявлять сопроматные требования как к железно-бетонной арматуре.
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
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 (веб, например).
dmitrysvd
17.02.2022 21:40типы аргументов. До этого, чтобы проверять параметры, приходилось либо делать стопку декораторов (и называть параметры по имени, за чем не мог следить pyflakes), либо в код функции писать что-нибудь.
Так типы параметров и сейчас не проверяются
siberiano
18.02.2022 13:32Я знаю. Но сейчас проверять параметры какой-нибудь библиотекой стало гораздо проще.
Ktulhy
17.02.2022 20:48+2Я уж думал вы про метаклассы и дескрипторы расскажете, или хотя бы укажете какую именно «модную фигню» внесли в язык и почему не должны были?
werevolff
19.02.2022 04:23Я думал, ТС обидется и уйдёт в PHP, а года через 3 запилит статью о том, как laravel год назад убил хороший скриптовый язык.
GBR-613
18.02.2022 13:28-1Такова судьба каждого языка. Сначала есть что-то простое и очень удобное (по крайней мере, для определённых целей). Все в восторге. Только бы ещё вот это добавить, потом вот это... И так, улучшаясь, язык медленно, но верно, превращается в какого-то уродца.
Не надо (было до изобретения asyncio ) на Питоне писать огромные серверы с многопоточностью. Он просто не для этого (был) предназначен.
NTDLL
Вопрос такой. Насколько широко используется питон. Чем то он практичнее, чем C к примеру?
lair
Почти все курсы по DS/ML/AI, которые я видел, были на питоне (кроме одного, который был на Octave, и тот с тех пор переехал). Стартовая документация на какой-нибудь Amazon SageMaker заведомо предполагает питон.
Это, на мой взгляд, весьма "практично".
vkni
Ну это как спросить, что практичнее - отвёртка или молоток. C и Python, как правило, используются в дополнение друг к другу. То есть, работают вместе в одной и той же системе.