Интервью с Армином Ронахером, создателем веб-фреймворка Flask

«Python хорош для быстрого решения проблем в 2020 году, как и 15 лет назад»

Армин Ронахер (Armin Ronacher) — плодовитый разработчик, который существенно повлиял на развитие экосистемы программного обеспечения Python, создав такие популярные проекты, как Flask и Jinja2. В последние 10 лет он работал над различными программами с открытым исходным кодом и над коммерческими проектами. Мы воспользовались возможностью поговорить с ним о его жизни и карьере. Армин рассказал нам о своей работе в Sentry, поделился мыслями об обработке ошибок на бэкенде, о различиях между Rust и Python, о gradual typing и рассказал, как ему удаётся достичь баланса между работой и личной жизнью.

Интервью

Evrone: Твоя должность — «Director of Engineering». Как выглядит твоя повседневная работа в Sentry?

Армин: Моё рабочее время обычно делится на две части. Я работаю с 9 до 15–16, когда нужно забирать детей из детского сада. Затем вечером я общаюсь онлайн с людьми из разных часовых поясов. Такое двухсекционное расписание меня устраивает, ведь я могу проводить время с детьми, пока на улице светло. Что касается моих обязанностей, главное для меня — сделать так, чтобы все люди, которые работают со мной, занимались тем, что значимо для дела. Это особенно важно потому, что Sentry — это компания с офисами в разных частях света. Я участвую в найме новых разработчиков, решаю проблемы сотрудников, помогаю с архитектурой, формирую или объясняю видение продукта для проектов компании и, наконец, помогаю в решении нестандартных проблем разработки. Такая вот смесь.

 

Evrone: Популярный подход «full-stack» побуждает разработчика писать как код фронтенда, так и бэкенда. Ты знаешь множество языков программирования и стеков технологий, одобряешь ли ты такую практику?

Армин: Сначала определим, что такое full stack в сложном проекте? Конечно, для тривиального приложения стек на деле состоит только из CRUD-бэкенда и какого-то фронтенда на React, так что в одиночку можно охватить всё это от и до. Но для нас это не сработает, потому что Sentry — куда сложнее. Если упрощённо, Sentry — это служба, которая принимает отчёты о сбоях, отчёты о производительности и показывает их пользователю. Но с технической точки зрения Sentry — очень сложный конвейер обработки со множеством баз данных и сервисов, готовящих отчёты перед тем, как их сохранить. Нереально и совершенно неэффективно поручить работу над всеми этими компонентами одному человеку и ждать, что он сможет реализовать новую фичу. Так что мой ответ на вопрос, одобряю ли я эту практику, в основном зависит от типа проекта.

 

Evrone: Недавняя реструктуризация Mozilla ударила по многим разработчикам языка Rust. Как ты думаешь, это повлияет на развитие языка?

Армин: Лично меня огорчает происходящее в Mozilla. Как и Mozilla, мы — проект с открытым исходным кодом, превратившийся в коммерческое предприятие. Наши пути несколько раз пересекались. Иногда мы используем технологии Mozilla, как и она использует наши. Наверняка изменения в Mozilla окажут влияние на язык Rust в целом, но я не думаю, что из-за этого ему будет нанесён какой-либо ущерб. А вот то, что проекта Servo больше не будет, наверняка сильно повлияет на развитие как языка, так и сообщества.

 

Еvrone: Как думаешь, почему создание и поддержка пакетов в Python — такое сложное дело?

Армин: Непросто дать однозначный ответ, но я считаю, что причина сводится к техническим трудностям и отсутствию целостного подхода. Например, сообщество Rust посчитало важным создание инструментов управления зависимостями, и проект Cargo вошёл в состав языка. В мире Python наоборот, инфраструктура управлениями пакетами (pip, setuptools, virtualenv) в основном разрабатывается независимо от языка. Технически Python имеет много недостатков, которые затрудняют его использование. Например, вы можете загружать только одну версию библиотеки для проекта, так что с зависимостями не разгуляешься.

 

Evrone: Если сравнить Python, Rust, TypeScript и другие языки, с которыми ты работаешь: какая стратегия обработки ошибок в бэкенд-коде для среднестатистического разработчика подходит лучше всего?

Армин: Так как я работаю в компании, специализирующейся на отчётах о сбоях, на меня валится куча ошибок бэка:) Урок, который я извлёк из этого — проектировать типы ошибок надо не менее тщательно, чем другие возвращаемые значения. Контекстной информации об ошибках всегда не хватает. Слишком часто разработчики просто оборачивают сообщение об ошибке в исключение, и не задумываются, как другие люди будут обрабатывать эту ошибку. Пренебрежение типизацией ошибок — источник постоянных проблем. Я помню, как код обработки некой базы данных проверял наличие определённого типа ошибки подключения, сопоставляя сообщение с шаблонами на нескольких языках (немецким, французским и т. д.), потому что база данных на другой стороне эти сообщения локализовала.

 

Evrone: Случается ли, что при работе с Rust тебе недостает каких-то возможностей языка Python или его экосистемы?

Армин: Несомненно. Python — очень зрелый, взрослый язык, в нём есть много такого, чего не найдёшь в других языках. Прочим экосистемам понадобится немало времени, чтобы приобрести такие богатые возможности, какие накопил Python. Одна из первых вещей, которые я заметил, когда писал в основном на Rust, — то, что его экосистема быстро адаптировалась к реалиям 2020 года, но не к старым технологиям. Как только мне пришлось столкнуться с XML вместо JSON, я обнаружил, что поддержка XML в Rust довольно слабая. Ещё один момент: поскольку Python сам по себе довольно медленный язык, отладочные опции в коде не сильно влияют на производительность. Отладочный код можно оставить даже на рабочей системе. Писать так же на Rust — значит отказаться от его основного преимущества — скорости.

 

Evrone: Как, по-твоему, лучше всего оценивать квалификацию разработчиков программного обеспечения?

Армин: Трудный для меня вопрос. По моим ощущениям, единственно правильного способа нанимать или оценивать кандидатов не существует, многое зависит от того, насколько хорошо вы понимаете людей в целом. Есть сообщество, участники которого только и делают, что отшлифовывают вопросы собеседований в компаниях FAANG, и это, несомненно, кое-что изменило. В нашей компании часто приходится решать уникальные задачи, поэтому важнее всего выяснить, заинтересованы ли разработчики в решении уникальных и порой неприятных проблем, и насколько они способны работать со сложными проектами в составе команды.

 

Evrone: Считаешь ли ты, что Python — по-прежнему лучший язык программирования общего назначения, которому следует обучать начинающих разработчиков в первую очередь? Есть ли у нас альтернативы в 2020 году?

Армин: Я вроде бы не считал, что Python когда-либо был лучшим универсальным языком, но я всегда думал, что он очень хорошо сбалансирован. Несмотря на свои недостатки и те разочарования, которые он вызывает, Python весьма неплохо подходит для быстрого решения проблем, и в этом смысле он так же хорош в 2020 году, как и 15 лет назад. Некоторое время я думал, что JavaScript заменит его, но каким-то образом сообщество организовало в языке столько сложных штук, что даже простейшие вещи приходится описывать сложным кодом. Я до сих пор быстрее создаю прототипы на Python, чем на JavaScript, потому что большинство задач решаются подключением пары библиотек.

Если бы пришлось обучать кого-то программированию в 2020 году, я, скорее всего, выбрал бы C, Rust и Python. Прежде всего Python, потому что вы можете показать студентам исходный код интерпретатора, и они поймут, что происходит «под капотом». Со многими популярными языками такой номер не пройдёт.

 

Evrone: Имея в активе много языков программирования, какую операционную систему и IDE ты предпочитаешь?

Армин: Компьютеры ужасны. Я одновременно люблю и ненавижу macOS. Всё ещё сижу на ней и каждый раз, когда пытаюсь перейти на что-то другое — через пару недель возвращаюсь. Я развёртываю результаты своей работы на Linux-машинах, а в моей повседневной жизни полно Windows. Что до IDE, я пользуюсь Visual Studio Code в связке с Vim, а зачастую Vim отдельно.

 

Evrone: Новый асинхронный синтаксис и подход async/await недавно завезли в Python, Rust, TypeScript — во все языки, с которыми ты работаешь. Что думаешь о таком подходе к многозадачности в нашем коде?

Армин: Пребываю в сомнениях. Я думаю, что при правильном использовании у него много преимуществ, но он излишне прячет проблемы многозадачности. Подход с async/await к тому же плох отсутствием явного наблюдения и управления использованием ресурсов, поэтому гораздо проще превысить лимит доступных ресурсов. Это то, чем традиционный многопоточный код из коробки (который в основном использует пулы потоков) не страдает. Также важно понимать, что, хотя во многих языках есть async/await, подходы в них разные. Трудно найти более несхожие вещи, чем дизайн async/await в Rust и JavaScript.

 

Evrone: Python, похоже, завоевывает мир. Есть ли у него реальные конкуренты среди языков общего назначения?

Армин: Python, похоже, захватывает планету благодаря data science. Думаю, что теряя популярность в мире веб-разработки, он компенсирует эти потери в мире больших данных. Поскольку JavaScript плох в работе с числовыми значениями (и это еще мягко сказано), тут ему особо не на что опереться. Тем не менее, скорее всего JavaScript будет набирать популярность просто в силу доступности.

 

Evrone: Ты получил большой опыт, работая с Flask и открытым исходным кодом, в Sentry опыт еще углубился, ты владеешь многими языками программирования. Как эксперт, что ты думаешь о будущем Python?

Армин: Думаю, что он будет всё больше специализироваться на одних экосистемах и полностью уйдёт из других. Это до некоторой степени согласуется с тем, что происходило в прошлом. Например, авторы отказались от попыток сделать Python популярным встраиваемым языком (для скриптов внутри игр и приложений) или языком для мобильной разработки. Также Python не годится для десктопных приложений, особенно если вы хотите распространять их через магазины вроде AppStore. Однако он становится популярнее в serverless и data science приложениях, а также в управлении конфигурациями. Я отметил, что мой шаблонизатор всё чаще используется не в веб-приложениях, а в системах управления настройками инфраструктуры (например, Ansible, salt).

 

Evrone: Что ты думаешь о новом подходе «gradual typing», представленном в Python, JavaScript (через TypeScript), Ruby, PHP и других динамических языках?

Армин: Думаю, что это здорово. Мне очень нравится TypeScript, и я считаю, что этот проект стоит копировать и для других языков.

 

Evrone: Как одновременно руководить разработкой ПО, быть отцом троих детей, сбалансировать работу с личной жизнью и избежать выгорания?

Армин: На момент интервью детей пока что двое, хотя через несколько дней… (тьфу-тьфу, чтоб не сглазить). Самое главное — я воспитываю детей не в одиночку. Моя жена — прекрасный партнер, мы вместе заботимся о детях. Вторая, очень важная вещь — хороший детский сад. Никто не в силах быть хорошим родителем круглые сутки без передышки. Но когда вы можете провести время с детьми, вы должны уделять им должное внимание. Например, в первые дни пандемии дети все время были дома, оказалось, что это плохо для нас и для них. Они проводили слишком много времени у телевизора и с iPad, а нам приходилось разрываться между рабочими встречами и заботой о детях.

Лично для меня подходит режим работы в два приема с перерывом между ними. Это удобно, поскольку мы живем в Вене, а головной офис находится в Сан-Франциско. Такой распорядок — идеальный вариант для меня, но вряд ли он подойдёт всем. Я начал вести записи, где фиксирую что, когда и почему меня расстроило или напрягло в течение недели. Потом анализирую записанное, чтобы, исходя из этого, оптимизировать свои дальнейшие действия. Со временем начинаешь немного лучше понимать себя и делать кое-какие выводы.

Как только я определяю ситуацию, которая меня огорчает или выводит из себя, я больше не пытаюсь её предотвратить или избежать. Вместо этого я стараюсь заранее понять, что именно вызывает у меня такую эмоциональную реакцию. Не всегда срабатывает, но в целом мне очень помогает. Например, я не дергаюсь так из-за уведомлений по Slack, как раньше, даже если не включаю режим «не беспокоить».

Заключение

Нам было интересно побеседовать с Армином и больше узнать о его подходе к жизни и работе. В Evrone мы часто используем фреймворк Flask, разрабатывая индивидуальные решения для наших заказчиков. Если у вас есть крутые идеи и вы любите Python так же, как любим его мы, просто свяжитесь с нами, и мы вместе создадим ваш новый продукт.

Я не думаю, что Python когда-либо был лучшим универсальным языком, но я всегда думал, что он очень хорошо сбалансирован. Несмотря на свои недостатки и те разочарования, которые он вызывает, Python весьма неплохо подходит для быстрого решения проблем, и в этом смысле он так же хорош в 2020 году, как и 15 лет назад.
Армин Ронахер
Создатель веб-фреймворка Flask
Связаться с нами
Нужна команда?
Давайте обсудим ваш проект
Прикрепить файл
Максимальный размер файла: 8 МБ.
Допустимые типы файлов: jpg jpeg png txt rtf pdf doc docx ppt pptx.