Разработка backend на Python с использованием:
FastAPI, Tornado
MongoDB, Postgres
Различные задачки на selenium и другое.
Разработал либу для работы с конфигами.
Разработал бота для внутренних вопросов, уведомления по расписанию: дни рождения, отгулы, и др. Интерфейс в тг, интеграции с RocketChat для отправки уведомлений
Разрабатывал бекэнд для высоконагруженного сервиса командировок
Писал юнит тесты
Я разрабатывал backend приложения на Django
1. Я внедрил автогенерируемую документацию Swagger. Это необходимо было для команды фронтенда.
2. Спроектировал архитектуру приложения.
3. Внедрил отличную от стандартной систему авторизации в Django
4. Оптимизировал запросы к базе данных. Эффективность выросла в 7 раз
5. Написал API на django rest framework (DRF) по документации openapi
6. Настроил загрузку данных из таблицы Excel в базу данных
7. Настроил выгрузку записей из базы данных в Excel
Стек технологий: Python, Django, DRF, openpyxl, Postgres, SQL, drf-yasg
Поддержка и развитие поиска для разработчиков. Ревью кода.
Сразу уточню все проекты запускались в докере, чтобы не описывать это позже.
Планировали сервисы с использованием PlantUML. Процесс разработки шёл по методологии Agile
В начале разбирали тонкости Django, генератор перевода полей, основы работы с ORM, ускорение работы ORM при помощи prefetch_related и select_related, разбиение настроек на модули, настраивали django админку. Узнали о замечательном инструменте дебага django приложений как django-debug-toolbar, очень помогает для оптимизации SQL запросов Django ORM. Так же изучили некоторые тонкости SQL: индексы, EXPLAIN, ANALYZE, ddl. Здесь же познакомились с основами Nginx, об отдаче статики, о том как работают location, о хидерах.
После писали ETL из postgres в Elasticsearch.
До этого были одиночные проекты, начиная с этого пошли командные.
Дальше писали сервис на FastAPI для взаимодействия с Elasticsearch, изучили и использовали на практике dependency injection в этом фреймворке. Ответы кешировали в Redis для более быстрой обработки одинаковых запросов за одну минуту. Пришлось немного изменить открытую библиотеку пагинации для FastAPI т.к она пагинировала по готовым данным, что как мне кажется, не простительно дорого в ресурсах. Этот и все последующие проекты были спроектированы при учете SOLID архитектуры.
Протестировали API с помощью pytest, использовали fixtures, для отправки запросов использовали AioHTTP.
Дальше писали сервис авторизации на Flask с использованием JWT токенов, одним из требований была возможность отозвать все refresh токены если это потребуется. Сделали Flask асинхронным при помощи gevent. Сюда же добавили OAuth от Google, с возможностью добавить любые другие в последствии. БД была PostgreSQL. Здесь же сделали рейтлимитер по средствам Leaky Bucket в самом Flask приложении. Добавили Jaeger для трасировки приложения! Ручки работали не дольше 200мс. После этого интегрировали авторизацию в FastAPI для ElasticSearch. Токены проверялись посредством открытого ключа, и если они были валидными и не были сильно просрочены, то пропускали для пользования API (для того, чтобы если Auth сервис упадет и не сможет обновлять токены, была возможность дальше пользоваться остальными сервисами). Авторизация по такой же схеме использовалась в последующий сервисах. Так же партицировалии одну из таблиц по дате создания записей. Протестировали API с помощью pytest, использовали fixtures, для отправки запросов использовали AioHTTP.
Дальше писали UGC сервис: лайки, прогресс просмотра фильма. Данные, что поступали в API на FastAPI, отправлялись в топики Apache Kafka, а Clickhouse через Engine = Kafka + View забирал данные к себе в таблицы. Clickhouse был запущен на 2 шардах. На каждом по две ноды, реплика + основная таблица. Позже сравнили MongoDB и Clickhouse в эффективности сжатия длинных ревью на фильмы (длинного текста) и их последующей скорости чтения. MongoDB с использованием индексов тут победила, поэтому добавили в апишку ручки на ревью и клали их в монгу. Добавили в каждый сервис Sentry.io + внедрили отправку логов из апишек и nginx всех сервисов в ELK. Добавили github actions на проверку flake8, проверку работоспособности на python 3.7 3.8 и 3.9, а так же отправку уведомления о успешном merge в мастер ветку.
После мы писали Notifications сервис. Другие сервисы могли отправлять события в Kafka топики, а специальный воркер внутри этого сервиса обрабатывал нужные и отправлял в API на FastAPI. API отправлял документ уведомления в MongoDB и так же создавал сообщения в очереди с приоритетом в RabbitMQ, дальше, воркеры, что отправляли уведомления, брали сообщения из RabbitMQ, после брали темплейт, что был прикреплен к документу уведомления, собирали необходимые данные для отправки сообщения по инструкции из прикрепленного к уведомлению темплейта и отправляли. Воркеры для отправки могут запускаться в любом количестве с любым транспортом(Push,email,sms) посредством аргументов запуска python скрипта.
Дипломным проектом мы выбрали биллинг, взяли django и библиотеку django-payments, она довольно универсальна, поэтому мы дописали свой провайдер для yookassa и брали оплату через неё.
Вот монорепа нашей команды https://github.com/Wiped-Out/yandex_16_team_work
Сейчас мы стараемся разложить каждый сервис в отдельный репозиторий, они будут видны в этой организации: https://github.com/MiddlePython16
Более углубленное изучение Python
Основы SQL
На протяжении года сделал три проекта:
1 2048 на PyQT с рейтинговой таблицей https://github.com/error1number404/ProjectPyQt5
2 Rogue-like игра с процедурной генерацией карты + автолевелинг противников https://github.com/error1number404/PyGameProject
3 Сайт с системой регистрации и авторизации пользователей, системой друзей, возможностью создания мероприятия пользователем, оно может быть открытым, что в свою очередь дает возможность присоединиться к нему любому желающему, и закрытым, попасть в которое можно лишь, если этого захочет его организатор(так же нужно быть его другом для этого). Так же создатель мероприятия имеет возможность удалить его или редактировать, исключать участников. https://github.com/error1number404/YandexApiProject
https://lyceum.yandex.ru/certificate/check/?certNumber=210230171&lastName=Кормильцев
Изучали основы языка Python + разные основные библиотеки
https://lyceum.yandex.ru/certificate/check/?certNumber=200130171&lastName=Кормильцев