Python-девелопер и писатель Рики Уайт взял интервью у Себастьяна Рамиреса, разработчика из Explosion AI. Но Себастьян не просто разработчик, это заметная фигура в open source сообществе, создатель популярных фреймворков FastAPI и Typer. В основном речь шла про широкие возможности применения аннотаций типов Python, историю создания фреймворка FastAPI и его дальнейшее развитие. Кроме того, Себастьян рассказал о своих планах по работе над другими open source проектами. Без лишних слов, давайте перейдем к интервью.
Рики: Спасибо, что пришёл, Себастьян. Сначала я бы хотел задать тебе те же вопросы, что и другим своим гостям. Как ты начал программировать? Когда познакомился с Python?
Себастьян: Спасибо, что пригласил [улыбается].
Я начал программировать, когда мне было пятнадцать. Я пытался создать веб-сайт для бизнеса своих родителей. Первым моим настоящим «кодом» был JavaScript внутри HTML — модальное диалоговое окно (alert) с фразой «Hello World». Я до сих пор помню, как обрадовался, увидев это маленькое окно с сообщением, и испытал чувство всемогущества от мысли, что это запрограммировал я.
Я много лет боялся изучать какой-либо другой язык, думая, что сначала должен «хотя бы» освоить JavaScript. Но потом на одном из многих онлайн-курсов, которые я проходил, возникла необходимость использовать Python для управления искусственным интеллектом в Pac-Man и для некоторых других задач. Курс состоял из одного длинного туториала по основам Python, и этого было достаточно. Мне очень хотелось попробовать.
Я быстро влюбился в Python и пожалел, что не начал раньше!
Рики: На сегодняшний день мне известно [поправь меня, если ошибаюсь], что ты трудишься в Explosion AI, компании, создавшей популярную платформу обработки естественного языка (NLP-библиотеку spaCy). Расскажи немного о трудовых буднях. Какие задачи в сфере искусственного интеллекта и машинного обучения интересуют команду и какие инструменты создала компания, чтобы помочь разработчикам быстрее продвигаться в обеих областях?
Себастьян: Да, Explosion в основном известен благодаря spaCy. Это NLP-библиотека с открытым исходным кодом. Они также создали Prodigy, коммерческий инструмент с поддержкой скриптования для эффективного аннотирования наборов данных в машинном обучении. Я работал в основном в Prodigy Teams. Это облачная версия Prodigy для совместного использования. Поскольку продукт ориентирован на конфиденциальность, создание облачной версии было связано с множеством особых проблем.
Тем не менее недавно я решил покинуть компанию. Теперь я планирую найти способ посвятить большую часть своего рабочего времени FastAPI, Typer и другим моим open source проектам. А ещё я, скорее всего, буду консультировать другие команды и компании.
Рики: Ты более известен как разработчик FastAPI, высокопроизводительной веб-платформы для создания API-интерфейсов, которая быстро стала одной из самых популярных в Python-сообществе. Что вдохновило тебя на его создание и как планируешь развивать его дальше? И вопрос от тех, кто ещё не пробовал FastAPI: почему можно смело использовать его в своём следующем проекте вместо других популярных фреймворков?
Себастьян: На самом деле я годами откладывал создание нового фреймворка.
Сначала я изучал и использовал множество фреймворков, плагинов и инструментов, постоянно совершенствуя свой воркфлоу (и воркфлоу команд, которые я возглавлял), одновременно улучшая создаваемые нами продукты. И так как я работал над стартапами с постоянными пивотами и ускоренными темпами разработки, у меня была возможность итеративно повторять поиск «правильного» техпроцесса и [наиболее удобных и эффективных] инструментов, комбинируя существующие фреймворки с большим количеством плагинов и тулзов.
У меня также была возможность поработать с другими технологиями — с JavaScript и TypeScript на фронте, несколькими фреймворками для гибридных приложений, с Electron для десктопа и так далее. Тем не менее, большинство моих проектов (или даже все) были связаны с данными (data science, ML и так далее).
В какой-то момент у меня в голове сформировалось сочетание фич, которые мне нравились. Я взял их из разных фреймворков, инструментов и даже из других языков и экосистем:
- Автозаполнение в редакторе кода.
- Автоматическое обнаружение ошибок в редакторе (проверка типов).
- Возможность писать простой код.
- Автоматическая валидация данных.
- Автоматическое преобразование данных (сериализация).
- Автоматическая генерация документации для API.
- Поддержка стандартов OpenAPI для Web API, OAuth 2.0 для аутентификации и авторизации и JSON Schema для документирования.
- Внедрение зависимостей для упрощения кода и повторного использования кода в качестве утилит.
- Хорошая производительность / параллелизм.
Но я не мог объединить эти фичи, тупо интегрируя всё со всем. Идеальный воркфлоу, который прекрасно работал в моей голове, по-прежнему сталкивался с кучей проблем, когда дело доходило до реализации. Требовалась сложная интеграция плагинов, устаревших компонентов, недокументированных инструментов, не говоря про некрасивый избыточный код и прочие головняки.
В какой-то момент мой очередной эксперимент по скрещиванию опять провалился. Я как будто перепробовал всё, что можно, и задумался о том, что делать дальше. И тогда я понял: «Час Х настал». Я стал изучать стандарты — OpenAPI, JSON Schema, OAuth 2.0 и многие другие. Затем я начал реализовывать свои идеи именно так, как это работало у меня в голове. Сначала тестировал на нескольких редакторах, оптимизируя взаимодействие с разработчиками, и только потом закреплял это во внутренней логике моего проекта.
Затем я убедился, что у меня были подходящие строительные блоки для создания FastAPI: Starlette (для всех веб-частей) и pydantic (для работы с данными) — оба имеют отличную производительность и фукнциональность. И, наконец, я приступил к реализации своего проекта с учётом стандартов, собранной обратной связи от разработчиков, а также некоторых дополнений (например, системы внедрения зависимостей).
У меня на сайте гораздо больше информации об истории создания, архитектуре и планах FastAPI, а также об альтернативах, источниках вдохновения и референсах.
Те, кому интересно попробовать, обычно начинают с главной страницы или README и далее следуют мини-руководству. Через пятнадцать-двадцать минут у них складывается представление о том, как работает FastAPI. После этого уже можно решить, нравится или нет, будет ли это полезно.
Ремарка для тех, кто уже использует другие фреймворки в своём проекте: не спешите переходить на FastAPI только потому, что он классный. Если ваш продукт работает хорошо и вам не нужно расширять функциональность, или вам не нужны преимущества FastAPI, то переходить на него не стоит.
А вообще, мигрировать на FastAPI относительно просто, там нет сложных интеграций. Вы можете использовать обычные Python-пакеты непосредственно в сочетании с FastAPI. Мигрировать можно постепенно или создавать с FastAPI только новые компоненты.
Рики: Ещё ты создал Typer, фреймворк, работающий в режиме командной строки (CLI). Он, так же как и FastAPI, во многом опирается на аннотации типов Python. Кажется, я замечаю закономерность [улыбается]. Что такого особенного в этой типизации, которая тебе так нравится? Считаешь ли ты, что всё больше библиотек должны использовать аннотации типов Python?
Себастьян: Да, конечно! Аннотации типов позволяют реализовать автозаполнение и проверку типов в редакторе кода. Аннотации типов, собственно, и были придуманы для этих задач.
Это особенно актуально, если вы создаёте инструмент, который, как ожидается, будут использовать другие разработчики. Я бы хотел, чтобы многие Python-пакеты, например, для инфраструктуры API или SaaS-клиентов, поддерживали аннотации типов. Это значительно улучшило бы жизнь их разработчиков и упростило бы внедрение инструментов.
Но теперь, благодаря pydantic, FastAPI и Typer, мы выяснили, что аннотации типов уже содержат много информации, которую можно использовать для создания более мощных инструментов. Разумеется, они самостоятельно могут обращаться к документации и выдавать для нас сообщения, наподобие «ожидается, что имя будет строкой» или «ожидается, что возраст будет числом с плавающей точкой».
Аннотациии типов также можно использовать для валидации данных — например, когда функция ожидает строку, но получает словарь. Это ошибка, о которой можно сообщить, и если фреймворк (например, FastAPI или Typer) состоит из набора таких функций с параметрами, он сам в состоянии выполнить такую валидацию.
Ещё аннотации типов можно использовать для сериализации данных. Например, в URL-адресе всё является строкой, и то же самое справедливо для CLI. Но если в аннотациях типов мы укажем, что нам нужно целое число, инфраструктура (FastAPI или Typer) может попытаться преобразовать, например, строку «42» из URL-адреса или командной строки в целое число.
Итак, с помощью интуитивно понятного и простого кода, который всего лишь описывает тип переменной, мы можем обеспечить работу трёх дополнительных функций (валидация данных, сериализация и документация), опираясь на базовую функциональность (автозаполнение и проверка типа). Так мы получим очень ценные плюшки, приложив достаточно мало усилий по написанию кода.
И в подавляющем большинстве случаев для всех этих функций требуется одна и та же информация по типу «возраст — это целое число». Таким образом, повторно используя один и тот же фрагмент кода (аннотацию типа), мы можем избежать его дублирования. Поддерживая единый источник истины (Single Source of Truth, SSOT), мы убережём себя от ошибок в будущем, если решим изменить тип в каком-то месте (например, для валидации данных), но забудем обновить его в другом месте (например, в документации).
Всё это из коробки могут делать FastAPI и Typer.
Рики: Каковы твои планы на будущее? Над какими ещё проектами будешь работать?
Себастьян: О да, у меня много планов. Может быть, даже слишком много [улыбается].
Есть несколько фич, которые я хочу добавить в FastAPI и Typer. Я также планирую поработать над автоматизацией UI администратора FastAPI, который не будет зависеть от базы данных (буду делать на основе OpenAPI). Ещё хочу интегрировать pydantic с SQLAlchemy — для тех случаев, когда нужно общаться с базами данных (опять же, хочу воспользоваться преимуществами аннотаций типов и уменьшить дублирование кода).
Далее планирую улучшить, упростить и подробнее документировать все утилиты, связанные с OAuth 2.0, скоупом, сторонней аутентификацией и так далее.
Кроме того, хочу сделать больше контента об изучении всех этих штук, снять несколько видеороликов, возможно, сделать курс…
Рики: Теперь, задам тебе, пожалуй, два последних вопроса. Чем ещё занимаешься в свободное время? Чем интересуешься, помимо Python и программирования?
Себастьян: В последнее время у меня не было возможности отвлекаться на другие занятия, но я надеюсь, в дальнейшем это немного изменится. Когда у меня есть время, я люблю играть в видеоигры с женой (а иногда и один), смотреть фильмы, завтракать или пить кофе с друзьями где-нибудь в Берлине (когда нет карантина).
Мне очень нравится работать над своими open source проектами, поэтому я легко могу сидеть за этим делом часами даже в выходные дни и не замечать, как проходит время [улыбается].
Рики: Спасибо, что пришёл, Себастьян. Классно пообщались!
Себастьян: Всегда рад.Большое спасибо за приглашение!
VPS серверы от Маклауд быстрые и безопасные.
Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!