С 9 по 14 апреля в Копенгагене проходила конференция DjangoCon Europe 2019. Полный надежд и стремлений я прибыл на данное мероприятие, а уезжал в глубоком смятении. В статье я попробую передать мои впечатления от конференции и прокомментировать столь резкую смену отношения к Django.
Disclaimer: в статье присутствует нетолерантность, безаппеляционность суждений и неоправданная критика.
Привет всем, я Максим, живу в Австрии, в Тироле. Я преподаватель в GeekBrains и совладелец проекта winePad, это коллектор и продавец технических данных по алкогольным напиткам. Обычно это данные о винах.
Проект начинался в 2012 с Django 1.4 / Python 2.7 на сервере, и с Jquery на клиенте + JsonRPC сервером. Сейчас набор технологий увеличился. Все равно мы уперлись в буквальном смысле в Django.
Я подключился к проекту в 2015, переняв эстафету у тирольских разработчиков. От некачественной реализации шевелились волосы везде.
Рассказ о тирольских пастухах, резко переквалифицировавшихся в программисты, я оставлю за кадром. Если вы увидите их решения, уверен, вам резко захочется убивать всех, кто называет себя «тирольским программистом».
К февралю 2019 стало понятно: развитие проекта невозможно с текущим набором технологий. В поисках ответов я решил съездить на DjangoCon 2019, который очень вовремя проходил в Копенгагене. Что хотелось от конференции:
- Поучиться у профессионалов, посмотреть, что я могу улучшить в своей работе.
- Окунуться в мир новых решений для моей платформы.
- Потусить с такими же Django-задротами, как и я. Войти, так сказать, в тусовку.
- Понять, что не так с Django. С 2016 года регулярно посещают мысли, что я что-то упускаю. Только не могу понять что.
Что же из всего этого получилось:
Нулевой день
Во вторник днем, до начала конференции, проходило собрание Django Girls — это инициатива DjangoFoundation по продвижению Django в женские массы. С 17 часов началась регистрация. В роли бейджей выступали 3-дюймовые дискеты, любой желающий мог записать на дискету все, что хотел (ха-ха), USB-дисководы присутствовали.
Во все дни конференции было неограниченное количество крафтового пива с этикеткой «розовый Django-пони», из местной небольшой пивоварни. С одной стороны прикольно, с другой… так себе пиво. В оформлении залов присутствовали розовые летающие лошадки всех размеров.
От ненавязчивого символизма и ощущения причастности к сообществу лошадиных пастухов был особый веселящий привкус. Я познакомился с Russell Keith-Magee, многолетним бессменным разработчиком Django. Все прибывшие на эту конференцию зависят от его программных решений.
Покупая билет, я должен был согласиться на соблюдение правил конференции по открытости, толерантности, конструктивному критицизму и уважению сексуальных предпочтений участников. Соглашаясь на это, я и не подозревал, к чему это может привести…
Тут я впервые узнал про правило Pacman-a: если к кругу разговаривающих подходит ещё один человек, участники беседы ДОЛЖНЫ расступиться и освободить место для нового собеседника. В общем, можно было бухать и жрать чипсы (в любом количестве), знакомиться с прибывающими специалистами, присоединяться к абсолютно любому разговору, дергать организаторов.
Вечером я прогулялся по Копенгагену.
Милый городок на берегу холодного моря, немного напомнил Питер. Тут слишком перебарщивают с велосипедами, но за рыбные рестораны можно простить все. Это очень вкусно.
В первые три дня конференции доклады шли в зале на 500 человек (было 377 участников). Параллельно в отдельных залах были воркшопы. Большинство докладов записаны на видео, вы можете посмотреть их на YouTube. Трансляций воркшопов нет. Список и описание докладов и воркшопов тут. ВСЕ воркшопы без исключения были очень плохо подготовлены, это отмечали и остальные участники.
В перерывах предлагалось много еды и кофе. В этом плане конференция была хорошо подготовлена. Стенды спонсоров, в основном HR, ненавязчиво стояли в холле. Мне было интересно поболтать со скандинавскими хедхантерами.
День первый
Открывающая лекция про ситуацию с DjangoProject
Коротко: помогите кто чем может.
Воркшоп GraphQL
JSON для ленивых. Жизнь не станет лучше, если все начнут использовать другую нотацию запросов.
Life is hAPIer
Враппер Django REST, начните писать 4 строки кода вместо 6.
Воркшоп про переезд на новую версию кода без остановки сервера
История про десятимесячную операцию на сердце коде из 100 моделей. Проект был создан три раза:
- Со старыми моделями.
- Со старыми и новыми моделями и возможностью online-переключения.
- Без старых моделей и переключателей.
Долго и дорого.
Из-за этого воркшопа я пропустил три лекции, о двух отзывались хорошо, буду смотреть в записи:
- pull-реквест на 750 000 строк.
- Django web-security-headers.
После перерыва с очередной цистерной кофе была лекция про DJANGO-ORM. Докладчик — Sigurd Ljodal. Это разработчик текущего ORM, его деятельность можно посмотреть по репозиторию Django.
Доклад полезный, но меня расстроил. С одной стороны — новая ORM-Django очень повзрослела. С другой стороны — Sigurd использовал в примерах недокументированные возможности queryset.query
. На последующем общении с Sigurd меня поразило, что он, как и большинство Django-разработчиков, не очень знает методы queryset.query
.
«Чего ж ты их в примерах используешь!» — вопрошал я. «Ну… вот так...» — отвечал Sigurd.
После всех докладов шли «lightning talks» («молнии»). Доклады-пятиминутки для тех, кто стихийно захотел выступить. «Молнии» в основном были интересны, но пять минут — этого мало. Цель докладчика заинтересовать, а люди потом могут спрашивать.
Несколько грузовиков с пивом и долгие разговоры после «lightning talks»… Первый день завершен.
День второй
Воркшоп: Бутстрап Django
Не получился.
Распознавание картинок, машинное обучение с Django
Никакого обучения, использование внешних ресурсов, косяки в распознавании, смешные картинки в примерах. Ни о чем, но весело.
Воркшоп по распознаванию картинок
Все заработало, и картинка по ее части была найдена среди 10 других. Но скорость работы перечеркнула все. 20 секунд на подготовку, 30-40 секунд на поиск. Я посчитал: на однократный поиск в нашем проекте по картинкам уйдут годы. А у нас в день десятки тысяч подобных запросов. Предложенное решение мне не подходит.
Визуальное тестирование изменений
Фронтэндщикам может быть полезно.
SQL-Alchemy vs Django-ORM
Докладчик Глеб из DjangoStars. С идеей согласен, но некоторые вещи я бы все равно реализовал через методы DJANGO-ORM. Главное, что я увидел, где можно применить алхимию в моем проекте.
Воркшоп: полный путь request/response по пищепроводу Django
Полезно было освежить знания. Django-разработчик, помни: все что ты делаешь — это настройка WSGI-приложения.
Дальше я загорелся идеей выступить на «молниях». Я делал презентацию и пропустил несколько докладов.
Божественный доклад о ведении документации проекта
От руководителя команды документации RedHat.
Я подскочил поблагодарить докладчицу после. Она понятно рассказала, почему я должен все бросить и начать документировать свой проект. В момент благодарности я прикоснулся к ее предплечью. Что тут началось!!! Это песец. Я думал меня посадят. Все обошлось словесным взысканием за неподобающее поведение по отношению к другому участнику конференции.
Пентестинг при помощи ZAP
Приложение попробует все известные ей методы взломать указанный сайт.
Сразу захотелось попробовать хакнуть свой проект.
Молнии были полезнее, чем в первый день.
Александр (DjangoStars) рассказал о вариантах хранения settings
Рассказ о враппере для полей моделей
Враппер следит за возвращаемым типом значения.
Доклад про установку заглушек вместо показа приватных данных клиентов
Пригодится на этапе разработки, тестирования и логирования. В эпоху поголовного действия закона о защите данных об этом стоит задуматься. Увы, автор так и не ответил, зачем он заново изобрел декоратор @sensitive_variables
. Похоже, что он просто не читал документацию.
Доклад об использовании переменных с зоной видимости в рамках одного потока
Я использую подобное решение давно. Скажу только, использование глобальных переменных в Django — это от недостатка умений и от незнания архитектуры.
После двух дней конференции я был расстроен: пару полезных докладов за три дня. Очень мало про Django, очень много про посторонние и ненужные решения. WTF??? И даже Копенгаген меня не успокоил.
Гениальный третий день
Этот день окупил все страдания, развеял сомнения и принес еще больше печали. Мой совет — изучайте все, что вы найдете про доклады третьего дня. Такую крутую инъекцию знаний редко где можно найти.
Доклад про убийства в викторианскую эпоху
Девушка рассказала на пальцах причину появления закона о защите данных пользователей. Мне стала понятна глубинная причина появления такого закона. Проблема с защитой данных, как и проблема с электроизоляцией — случайно кого-то может убить.
Использование GeoDjango с примерами
От автора документации по GeoDjango. Красота.
У меня это запланировано в проекте. Теперь я знаю, как это реализовать.
Архитектор Эластик групп о программных продуктах компании
Сюда входит elasticsearch.
Понравился пример, как встроить график активности пользователей в админ-панель Django.
Полный цикл создания собственного поля модели
Мне понравилось: у меня есть несколько своих полей, но я многое упустил в процессе их создания.
Система «плагинов» Django
Плагин включается и выключается на лету, проверка включения через… сигналы. Слишком экзотичный вариант решения, чтобы использовать. Разок прокатит под соусом «смотри, как еще можно».
Потом я повелся на речи про elasticsearch и пошел на воркшоп. Тут я пропустил два доклада и потерял время.
А вот что было потом, можно многократно пересказывать в красках. С каждым разом приходит более глубокое понимание сути услышанного.
Редизайн вашего проекта Django
Разработчики рано или поздно сталкиваются с рекомендацией: Fat Models, skinny Views, stupid Templates (тупые шаблоны, тонкие вьюхи, толстые модели).
От себя дополню: выборка объектов только в методах ObjectManager
и в методах QuerySet
, порожденных ObjectManager
.
Дальше такого перераспределения кода мало кто ушел. В докладе были примеры максимального устранения зависимостей и полного абстрагирования бизнес-логики.
Это солидный урок последователям каноничного стиля разделения кода. Устойчивость от изменений. Независимость решения… Все то, что и должно быть в качественном продукте. В конце доклада приводилась литература, которая поможет это реализовать.
Супер полезно.
Потом были речи и закрытие официальной части DjangoCon.
А потом был доклад, ответивший на все мои вопросы и подтвердивший мои ощущения.
Наброски для редизайна Django
Докладчик — Том Кристи, создатель Django REST framework. В слайдах Том рассказал и показал в примерах кода, почему Django (и, как следствие, DRF) больше не имеет возможностей развития. Да, можно исправлять ошибки, да можно добавлять финтифлюшки или улучшать ORM. Общая же форма Django все равно остается неизменной.
Когда Том сказал, «я вообще не думаю, что возможно построить высоконагруженную быструю систему на Python», народ притих.
Дальше Том показал примеры кода, как решить вопросы асинхронности в Django-проектах и какие проблемы последуют.
Для асинхронного ORM были упомянуты Ариадна и недоделанный асинхронный DB-драйвер. Для шаблонов Jinja и переделывание кода шаблонов.
Доклад четко обрисовал, что для создания из Django фреймворка, готового к современным технологиям, надо переписать все, что есть в Django. И желательно на другом языке. Было ясно, что Django в тупике развития, красивом, уютном, и устаревшем лет на 10.
Вариант, что делать дальше тем, кто хочет слезть. Пока нет решения «так же, как в Django». Был обзор существующих аналогов, быстродействие, сложности, перспективы. Я уже попробовал упомянутый GO, мне почти понравилось.
На молниях я рискнул выступить с призывом пилить Django и дальше. Только после выступления Тома Кристи — призыв звучал совсем неубедительно.
Следующие два дня состояли из спринтов. Те, кто остался, работали с Django: открывали сообщения об ошибках и правили их.
После успешной правки можно было подбежать и грохнуть в гонг на весь зал. Частота бумов была каждые 5-7 минут.
И мне стало совсем грустно:
- Правка содержит ошибку возвращаемого типа.
- В код добавлено две ненужных рекурсии.
- Автор, похоже, не понял, как работает
Decimal
. - Тесты не проверяют все граничные случаи и возвращаемый тип данных.
Я переписал код и подошел к одобрившему предыдущую правку, и сказал: у вас тут ошибка! И выбрал неверную стратегию: программисты не очень любят, когда кто-то говорит про их ошибки, особенно про проверенные и одобренные.
Лучше бы было показать баг-репорт. Мне конечно же ответили, что это так и должно быть. Проверкой типов в питоне никто не занимается и, вообще, питон — язык без строгой типизации. И потому, мальчик, иди-ка ты лесом, тут и без тебя дел много. Столь неграмотного отношения к редактуре кода, и невосприимчивости к указанию на ошибку я не ожидал.
Отсюда вытекает еще одна проблема, почему Django такая, какая она есть: часто ошибки правят люди, не понимающие алгоритм или идею. Именно поэтому появляются новые ошибки, кривые методы типа QuerySet.as_manager
, неотключаемый GROUP_BY
в запросе с base_sort=True
(не проверял, может исправили), или же алогичные решения, как с формсетами и инлайнами в AdminModelForm
.
Кроме спринтов было пару воркшопов, мне понравился повтор про ZAP. Крякнуть сайт удалось, и дыры в безопасности были найдены.
Я посетил Христианию, погулял по каналам и посмотрел на русалочку.
Домой я уезжал в задумчивости. Я хотел увидеть новые возможности в Django… а нашел их где-то еще. Я хотел донести, что есть быстрое и верное решение… и не сумел (про баг я все же сообщу). Хотел войти в профессиональный мир… но что-то не так я себе это представлял. Знание приносит печаль. Главное, что я знаю, куда идти дальше.
P.S. Решение про мой проект принято, пока winePad останется на Django.
P.P.S. Я открыт для обсуждения как конференции, так и Django. Спрашивайте, если непонятно.
P.P.P.S. С 20-го июня 2019 на GeekBrains стартует мой курс по Django на факультете Python-разработки, я обязательно упомяну на курсе важные моменты, о которых я узнал на конференции.
Автор: Максим