В данной статье вы узнаете подробности нашего опыта работы с Python: какие продукты мы пишем на этом языке программирования, почему выбираем для этих задач именно его, какие выгоды от этого получают заказчики разработки.
Разобраться в этом вопросе нам помогут:
- Егор, старший инженер-программист;
- Антон, тимлид, партнёр компании;
- Антон, руководитель проектов, исполнительный директор, партнёр компании.
Преимущества разработки на Python для бизнеса
Ускоренная разработка MVP
С развитием гибких подходов и философии Agile циклы разработки становятся всё короче. Software-инженерам не нужно годами писать проекты «в стол», сверяясь с техническим заданием на тысячу страниц. Разработка начинается с создания MVP. В приоритете — за один-два месяца выпустить на рынок минимально жизнеспособную версию продукта и получить обратную связь от реальных пользователей (подробнее о разработке MVP можно прочитать в нашей статье в блоге: «MVP, или как не попасть в бесконечную разработку»).
Для быстрой разработки MVP отлично подходит Python. Секрет скорости — в синтаксисе, максимально приближённом к естественному английскому языку.
На скорость влияет большое количество свободных библиотек и фреймворков, а также минималистичных микрофреймворков, например Flask. Они разработаны под разные нужды, имеют обширное и дружелюбное комьюнити, привлекают простотой и гибкостью синтаксических конструкций.
Нюанс: такая высокая скорость поддерживается при относительно невысокой сложности проекта (малая и средняя e-Commerce, CRM, несложные интеграции).
Если же разработка ведётся для enterprise-проектов, то все работы занимают примерно одинаковое время независимо от используемого стека технологий. Писать на Java, PHP или Python — неважно, ведь общее количество часов не будет значительно отличаться.
При этом время может по-разному распределяться на разные типы работ. С каким-то стеком больше времени потребуется на рефакторинг, с другим — на MVP, c третьим — на тесты и т. д. Например, чтобы быстро работать на Python, нужно предварительно продумать архитектуру и правильно подготовить окружение. К тому же нельзя судить о сложности работы по количеству строк кода и скорости его написания. Минимальное количество кода означает его высокое качество, а чтобы разработчик мог уложить задачу в три строки, он должен тщательно продумать, как это сделать, в какой части программы разместить код и т. д.
Лёгкая интеграция с другими технологиями и программным обеспечением
Сегодня любой продукт разработки требует большого количества интеграций: с разнообразными информационными системами самой компании и её контрагентов, с банковскими, маркетинговыми ИС и многими другими.
Python удобен для интеграций и может управлять различными компонентами ПО, в том числе разработанными на другом языке. Универсален для любых платформ.
Это было одной из причин, почему мы выбрали именно Python для создания API принт-сервиса на одном из текущих проектов. Он отлично взаимодействует с сервером печати Linux CUPS — из Python легко обращаться к ядру ОС для выполнения нужных операций.
Масштабируемость и возможность добавлять новые функции
Это преимущество не возникает само по себе, оно требует продуманной архитектуры проекта и соблюдения чистоты кода. Можно сказать, что на Python с его простыми и понятными синтаксическими конструкциями проще писать легко масштабируемый код, чем на большинстве других языков.
Это было важно для нас, когда мы выбирали стек для управления сервисами печати. С Python нам не пришлось вносить изменения в основной модуль принт-сервиса при изменении его частей.
Недостатки Python
Большинство особенностей Python заметны только на стороне разработчиков и создают трудности именно им, а не заказчикам и пользователям продукта.
Скорость исполнения кода
Пожалуй, самая болезненная тема для «питонистов» — это скорость исполнения кода. Python считается довольно медленным языком программирования: это связано с особенностями структуры интерпретатора языка и его динамической природой. Чтобы повысить производительность, разработчики либо переписывают «тормозящий» кусок кода на C или Cython (транслятор Python-кода в C), либо используют PyPy — альтернативный интерпретатор языка программирования Python (его название расшифровывается как Python, написанный на Python).
Разработчики часто говорят, что на Python можно написать всё, даже сам Python.
В принципе, это нормально в сегодняшней практике: компилятор Rust тоже пишут на Rust, а компилятор Golang — на Golang.
Обновления PyPy чуть отстают от обновлений основной версии интерпретатора Python. Например, актуальная версия Python — 3.8, а PyPy — ближе к версии 3.5 с некоторыми фичами из 3.6.
Можно выделить следующие принципы ускорения при разработке на Python:
- у Python много библиотек, нужно выбрать подходящую и проверенную в решении аналогичных задач, т. к. иногда они уже написаны на C и имеют высокую производительность в решении поставленных задач;
- чтобы ускорить небольшую проблемную часть кода, можно переписать её на Cython (это транслятор, «промежуточный слой» для Python в C/C++);
- для ускорения больших частей кода, написанных на Python, помогает использование PyPy, если код нечувствителен к версии языка (Django-проекты уровня enterprise часто стартуют именно на PyPy).
PyPy крут технологией JIT-компиляции (just-in-time (сокр. от англ. — точно в срок) compilation).
Функции, которые есть в программе, на лету будут компилироваться в машинный код, ускоряя работу программы с последующим использованием. При этом не надо переписывать код, просто нужно иметь в виду понижение версии.
Однострочные анонимные функции и пайплайны
В Python анонимные функции (лямбда-функции, функции без названия) — однострочные. Разработчикам иногда не хватает многострочных лямбд, но они никогда не появятся, т. к. это противоречило бы идеологии Python.
Пайплайны — это последовательное исполнение функций с последующей передачей данных из предыдущей.
На Python приходится писать последовательность примерно следующим образом.
a = func1()
a = func2(a)
a = func3(a)
result = func4(a)
В каком-нибудь другом языке программирования (скажем, Elixir) это выглядело бы проще.
result = func1() |>
func2() |>
func3() |>
func4()
Это не отражается на производительности кода, но причиняет некоторые неудобства разработчикам, мешая соблюдать методологию функционального программирования.
Бизнес-задачи, которые решает разработка на Python
Типичные задачи на разработку, которые успешно решаются на Python:
- корпоративный сайт (каталог, интернет-магазин);
- системы для корпоративного обучения и проведения хакатонов;
- системы распознавания образов (фотографий, изображений, лиц);
- системы распознавания документов (OCR, машинное зрение);
- управление сервисами печати со сложными маршрутами;
- асинхронные модули для существующих систем (транспортные модули, платёжные шлюзы).
Сегодня один из трендов в разработке на Python — его использование для написания микросервисов. Микросервисы, в разработке которых чаще всего применяют Python:
- для машинного обучения (да, такие возможности есть и у R, и у Scala, но именно Python считается общепринятым стандартом большого комьюнити в этом вопросе);
- для обработки объектов с запросом и ответом (request & response objects) — Python 3.6 и выше отлично справляется с такими задачами, т. к. в этих версиях успешно реализована асинхронность input/output-операций.
При обновлении интернет-магазинов на базе систем CMS, разработанных довольно давно (как, например, Magento — более 12 лет назад), тоже применяется смешанный подход. Для некоторых сервисов проще оставить Magento, а для других — переехать на Saleor (это CMS, написанная на Python). Вопрос миграции с Magento на Saleor довольно часто возникает у небольших интернет-проектов, которые хотят быстрой модернизации.
Давайте рассмотрим наш недавний кейс по разработке на Python. Создание платформы для онлайн-обучения или для хакатона — типичная задача, для которой отлично подходит Python.
Кейс: разработка международной платформы для хакатона на Python
Перед нами стояла задача: разработать платформу для крупного международного хакатона по машинному обучению (более 10 тыс. участников, highload-продукт).
В логике надо было учесть следующие условия для участников:
- всем выдаётся одинаковое задание, срок выполнения которого ограничен;
- все должны пройти онлайн-регистрацию;
- можно создать свою команду, вступить в чужую или участвовать в одиночку;
- проверка правильности ответов должна быть автоматической.
С помощью этой платформы участники отправляют свои ответы. Система валидирует ответы каждого участника, сравнивает их с идеальным решением, проверяя при этом соблюдение большого количества условий. Каждому решению проставляются оценки, на основе которых формируется список лидеров. По завершении хакатона система автоматически определяет победителей.
Для решения этой задачи мы использовали SPA (сокр. от англ. single page application — одностраничное приложение.) (Vue.js + Nuxt.js) + Django (это фреймворк Python). SPA общается с backend'ом через API.
Почему именно Python?
Это решение нравится нам своей гибкостью: в отличие от громоздкой архитектуры с десятками тысяч строк кода, здесь можно гибко управлять всеми сущностями, не переживая за перекрытие кода.
Все сущности можно создать и описать очень быстро и мгновенно получить доступ к данным через API.
В результате нам удалось разработать готовую к высоким нагрузкам платформу с нужным функционалом для проведения хакатона. Система поддерживает определённый свод правил. Есть админ-панель с отображением результатов, выгрузкой статистики и прочих данных.
Где ещё используется Python
Можно сказать, что Python сейчас «в моде» (хотя поклонники Go или Dart могут поспорить), и многие разработчики с удовольствием пишут на нём.
Расскажем об интересном примере, как наши коллеги из frontend'а попробовали писать на Python.
Недавно к нам пришёл заказчик, backend на проекте которого написан на PHP. Стояла задача — переделать его на Django. Чтобы состыковать back и front, frontend-разработчики за два дня изучили синтаксис Python, за третий день — документацию Django, а на четвёртый влюбились в Python и теперь не хотят возвращаться во frontend. Очень жалеют, что Python подходит только для backend-разработки.
Не только разработчики, но и представители смежных профессий применяют Python для своих задач.
Системные администраторы могут автоматизировать процессы, используя Python вместе с Bash. Например, в сложных конструкциях, если нужно сделать скрипты на серверах, которые будут опрашивать части системы, проверять, всё ли в порядке (проводить health check).
Бизнес-аналитики часто приходят в Python, изучив стек анализа данных (pandas, Matplotlib, Jupyter). Это специфическое решение для сложных агрегаций, которое позволяет делать продвинутые дашборды, вычислять и визуализировать множество важных показателей.
Выводы
Python идеально подходит для проектов в сфере CV & ML (computer vision and machine learning, рус. компьютерное зрение и машинное обучение), аналитики, разработки корпоративных сайтов и систем корпоративного обучения.
Он хорош для создания небольших микросервисов и проектов с недолгим жизненным циклом, когда заказчику нужно быстро запустить MVP и протестировать гипотезы.
Да, есть много сфер применения этого универсального языка, но бывают и кейсы, где лучше использовать другой стек. Например, в разработке высоконагруженных интернет-магазинов может быть предпочтительнее Magento (PHP).
Выбирать, стоит ли использовать Python на вашем проекте или нет, нужно после совместного обсуждения вопроса разработчиками и заказчиками, на основе анализа особенностей продукта и бизнес-задач.