Практико-ориентированная дорожная карта с нуля до backend разработки

Практико-ориентированная дорожная карта с нуля до backend разработки


Об этой статье

В этой статье я решил написать свою дорожную карту по которой можно дойти с нуля до микросервиской бэкэнд разработки.
В первую очередь эта дорожная карта задумывается как помошник который направит вас в изучении бэкэнд разработки, а не полноценный учебник с кучей теории, но без идей на реализацию(хотя она тут тоже будет)

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

P. S. В этой статье переодически я буду оставлять ссылки на необходимый по моему мнению материал.  Я стараюсь оставлять ссылки на понятный по моему мнению материал, но невозможно гарантировать что он будет понятен всем, если вам непонятна какая-то из приведённых мной статей, то возможно вам имеет смысл поискать другие материалы на непонятную вам тему.

Пара советов начинающим разработчикам

1) Как по мне, самое главное и актуальное для нашего времени - не делегируйте свои задачи нейросетям, в данный момент они очень плохо пишут код(особенно на низкоуровневых языках программирования), а также такой подход убивает ваше обучение. Но это не значит что от нейросетей нужно отказываться. Их можно использовать как умный поисковик по документации(особенно если она старая и непонятная), и вместо того, чтоб кучу времени искать нужную функцию вы можете узнать про неё у нейросети и задать пару уточняющих вопросов.

2) Полноценная разработка кардинально отличается от того, что преподают в большинстве школ и первых курсов университетов, можно сказать, что это маленькая аннотация к большой книге

3) Львиная часть разработки - поиск необходимой информации, и навык её поиска по моему мнению один из самых важных. Во время разработки постоянно приходится искать и оценивать различную информацию(какая технология лучше подойдёт для конкретной задачи? есть ли в этом фреймворке *такой-то* функционал? и т д)

4) IT всегда менялся очень быстро,чего только стоит бум нейросетей, вследствии чего учиться придётся постоянно

5) Старайтесь составлять архитектуру проекта заранее, и желательно такой, чтоб её было просто расширять. Может показаться что вы тратите много времени в никуда, но в будущем это сэкономит немало

Содержание статьи

0. Базовый синтаксис языка

1. Первые проекты

1.0 Подготовка к работе с модулем

1.1 Работа с API

1.2 Змейка

2. Telegram боты

2.0 Подготовка к работе с модулем

2.1 Echo бот

2.2 Бот для общения с нейросетями

2.3 Бот для загрузки видео с соц. сетей

3. Сайты на монолитной архитектуре

3.0 Подготовка к работе с модулем

3.1 Заметкер

3.2 Опросник

4. Сайты на микросервисах

4.0 Подготовка к работе с модулем

4.1 Форум

4.2 Видеохостинг

5. О Хакатонах

6. Послесловие

0. Базовый синтаксис языка

Если вы не программировали, или считаете что ваша база питона слишком маленькая, то для прохождения этой статьи вам стоит её подтянуть

Если бы у меня спросили какие ресурсы я бы дал новичкам для самостоятельного изучения базы питона новичкам, то это были бы эти 2 ресурса:

  • Англоязычный ресурс W3 Schools, на нём нужно пройти модули Python Tutorial, File Handling и желательно пройти Python DSA(самые базовые алгоритмы). На этом ресурсе есть гайды по большому количеству технологий которые полностью бесплатны
  • В качестве русскоязычной альтернативы могу предложить этот и этот бесплатные курсыдля новичков (многие, и я в том числе к курсам относятся скептически из-за огромного количества инфоцыган, но эти курсы полностью бесплатны, так что вы ничего не потеряете), но в них меньше информации, ООП начинается в Платных частях линейки курсов, так что на этом моменте придётся вернуться к первому ресурсу или искать альтернативы

Самое важное в этих ресурсах - то, что они бесплатные и в них есть практические задания благодаря которым получится лучше запомнить базовый синтаксис языка, а сделаны они как учебник для новичков.

1. Первые проекты

Несмотря на то, что первые проекты выглядят очень простыми, при обучении на них может уйти немало времени, что нормально. Важно научиться разрабатывать даже такие простые проекты

1.0 Подготовка к работе с модулем

В каждом модуле будет в начале информация которую следует знать в начале работы с ней

Для разработки проектов в этом модуле вам нужно узнать следующие вещи:

  1. Базовый синтаксис языка
  2. что такое API

Также у вас должен быть установлен python 3, желательно на новых версиях, а так же IDE для написания кода(если вы не планируете писать код через Vim), например PyCharm или Visual Studio Code

1.1 Работа с API

Для начала нужно сделать MVP(минимальная версия продукта) проекта, это буквально сырая версия проекта, которая отражает его суть

В качестве первого проекта вам нужно будет поработать с любым сторонним API, на Python для этого можно использовать requests.
Вам нужно сделать запрос по выбранному вами API и вывести нужную для вас информацию, для этого могут подойти любые открытые API, из бесплатных есть openweather API, различные API от Яндекса(по этой ссылке доступны все технологии Яндекса, для этого задания подойдёт любое с подписью API)

Для большинства API нужен ключ доступа который ни в коем случае нельзя передавать никому и тем более сливать в открытый доступ

Как можно улучшить этот проект?

Когда MVP доделан, то следует расширить функциональность приложения, ниже я описал каким образом стоит улучшить этот проект:

  • Добавить точку входа main, пока что можете воспринимать это просто какк хороший тон, и всегда писать логику программы в main(), и вызывать через конструкцию с __name__ (в будущих проектах код должен писаться так сразу)
  • Хранить ключ доступа к API(если есть) в .env файле и парсить его программно, библиотека которую я прикрепил нужна чтоб парсить .env в переменные среды и из них доставать ключ (в будущем ключи ни в коем случае не должны попадать напрямую в код)
  • Вывести все используемые библиотеки в requirements.txt (желательно с явным указанием версий, в будущих проектах это должно делаться во время разработки MVP)
  • добавить к проекту виртуальное окружение venv (в будущих проектах это должно делаться во время разработки MVP)
  • разделить приложение на функции(например запуск программы в main(), запрос к APIв отдельной функции)
  • сделать так, чтоб выводилась информация на основе ввода пользователя(в случае с погодой можно считывать координаты места где пользователь хочет узнать погоду, что именно он хочет узнать), также стоит вывести в консоль что пользователь должен ввести
  • сделать так, чтоб программа работала постоянно в цикле while условием выхода из которого будет ключевое слово(например "0" или "exit")
  • Обработка исключений
  • Валидация пользовательского ввода(любой ввод пользователя нужно валидировать и писать валидацию сразу)

Может показаться, что изменений в проекте много, но я уверен что при желании вы сделаете всё это быстрее чем думаете, если у вас в процессе появились идеи как ещё можно улучшить проект, то сделайте это

1.2 Змейка

В роадмапе для бэкэнд разработки змейка может показаться неуместной, но лично я считаю, что на игровом проекте проще научиться ООП и проектированию в целом.

Для начала следует определиться с библиотекой для разработки вашей змейки, самое популярное решение для этого - pygame(в момент написания статьи у них что-то с документацией, но там есть инструкция как развернуть её локально)
Также можно воспользоваться библиотекой raylib

для MVP проекта вам точно понадобится сделать класс змеи, класс яблока и описать их логику там

фон можно отрисовать коричневым квадратом, тело змеи зелёными квадратами,  а яблоки красными квадратами заполняющими всё поле, достаточно чтоб змея телепортировалась по клеткам, а не плавно перемещалась

На данном этапе при победе/поражении достаточно просто перезапускать игру

Как только вы завершите разработку MVP, вам нудно сделать следующие улучшения вашего проекта

  • Если весь код находится в одном файле, то вам следует логически разделить его на модули, например вынести змейку в snake.py, а яблоко в apple.py (в будущем вам нужно будет сразу писать код разделяя его на модули)
  • сделать папку textures и добавить туда ваши картинки для яблока, тела и головы змеи, фона поля, также желательно в самих классах сделать поля текстурок статическими, чтоб например на каждое яблоко не подгружать снова текстурку
  • Добавить звуки при поедании яблок или когда змейка попадает на свою же клетку
  • добавить начальное меню где можно будет начать игру или выйти из игры
  • добавить меню победы/поражения(если хотите можете добавить свои звуки при победе/поражении), с которого можно будет вернуться в начальное меню

Ещё необязательная, но довольно сложная идея - плавное движение змейки, но при этом с сохранением сетки и чтоб она бегала по этой самой сетке(как в змейке от гугла)

Если у вас есть какие-либо ещё идеи по змейке, то вы можете их реализовать прежде чем приступите к следующему блоку проектов

2. Telegram боты

После разработки на питоне лично я вижу разработку телеграм ботов как упрощённую бэкэнд разработку, благодаря этой схожести и простоте именно они находятся в этой роадмапе перед началом бэкэнд разработки


2.0 Подготовка к работе с модулем

Настоятельно рекомендую освоить асинхронность и писать своих ботов в асинхронном режиме.(асинхронность довольно сложная тема для понимания большинству новичками, но в питоне писать асинхронный код очень просто, при том, что при большом количестве пользователей это даст ощутимую прибавку к скорости приложения где много задач на "ожидание" ответа)

Перед началом разработки вам следует определиться, на какой библиотеке вы будете писать ботов:

  1. Первая, и довольно простая библиотека для работы с telegram ботами - pyTelegramBotApi, она может работать как в синхронном(весь код который вы писали до этого был синхронным), так и в асинхронном режиме
  2. Вторая, и самая популярная среди русскоговорящих библиотека для работы с telegram ботами - aiogram, она работает только в асинхронном режиме, и имеет более гибкий функционал, например встроенный FSM
  3. Третья, и наверное самая сложная библиотека - telethon, её главное отличие от прошлых в том, что вместо https bot API она работает напрямую на протоколе Telegram под названием MTProto, что позволяет обходить некоторые спецефичные ограничения для ботов(например на размер выгруженных файлов), а также работать вашему боту в случае если что-то случится с https bot API, работает как в синхронном, так и в асинхронном режиме. Также эта библиотека является лучшим решением для 2.3 Бот для загрузки видео с соц. сетей (подробности расписаны в этом разделе)

Вы можете выбрать любую из этих библиотек, или любую другую, для разработки ваших ботов.

Напомню что ваши ключи(в данном случае токен бота, а в случае если вы используете telethon ещё телеграм апи ключи) вам следует хранить их в .env файле

Также вам следует освоить работу с GIT и использовать его во всех следующих проектах, в больших проектах и особенно в командной разработке без него никуда, а осваивать его можно спокойно на этом этапе, также если вы посчитаете свой проект хорошим, то можете выложить его в открытый доступ на github

2.1 Echo бот

считайте это вашим «Hello, world!» в случае с написанием телеграм ботов

MVP данного проекта - вы пишете боту и он отвечает на сообщение просто дублируюя его

Казалось бы, довольно простой проект, но даже его можно усложнить и расширить:

  • Сделать так, чтоб он в ответе полностью дублировал сообщение, включая файлы, фото, видео и т. п. при этом ваш бот не должен скачивать эти файлы на компьютер(а как - ответ как и на всё остальное в документации)
  • Из интересного можно ещё добавить фильтры на определённые слова, ссылки и т п, чтоб он заменял их на звёздочки, самая частая и дешёвая реализация подобного - через регулярные выражения 

Если у вас есть ещё идеи как можно улучшить данный проект - воспользуйтесь ими, а затем приступите к следующему проекту

2.2 Бот для общения с нейросетями

Таких ботов довольно мнгого, но писать их довольно просто

Для написания этого бота вам понадобится применить знания полученные из 1.1 Работа с API. Если вы решите писать в асинхронном режиме и вам понадобится делать API запросы, то вместо requests вам следует использовать aiohttp или любой другой асинхронный аналог для http(s) запросов

MVP проекта - бот которому могут писать пользователи, а он будет перенаправлять их сообщения любой нейросети(подойдут ChatGPT, или DeepSeek, Grok и т. п.) и отправлять им ответ нейросети. Также ваш бот в данный момент должен реагировать только на сообщения в личных сообщениях.

После того, как вы разработаете MVP, вам следует сделать следующие улучшения вашего проекта:

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

Если у вас есть ещё идеи которые можно реализовать для этого проекта, реализуйте их и приступите к следующей.

2.3 Бот для загрузки видео с соц. сетей

Проект довольно простой, но в отличие от прошлых проектов он может создать довольно мощную нагрузку на сеть, что создаёт больше просторов для оптимизации

Лучшим решением для данного бота будет библиотека telethon или любая другая использующая MTProto, поскольку в момент написания статьи лимит выгружаемых файлов через http bot api 50 МБ, но поскольку telethon использует MTProto, все ограничения бота равносильны ограничениям обычных пользователей Telegram(в данный момент 2ГБ).

Для этого проекта я бы советовал использовать yt-dlp, утилита поддерживает много сайтов, кроме библиотеки в питоне она может быть ещё и утилитой в терминале.

На момент написания статьи yt-dlp не поддерживает асинхронность, но операция загрузки всё ещё является "ждущей", поэтому можно использовать asyncio.to_thread() (помните что потоки в питоне не являются реальными из-за GIL, поэтому сильной нагрузки это не создаст. Реальные потоки создаются через multiprocessing)

Если прошлые проекты можно было реализовать не используя асинхронность, и они бы работали довольно шустро при небольшом количестве пользователей, то эта задача уже такого не позволит, ведь у Telegram есть ограничения по скорости загрузки файлов туда и даже если у вас 1 Гбит/сек интернет, это не поможет от зависаний бота в момент скачивания/отправки видео.

MVP этого бота - пользователь отправляет ссылку, а бот в ответ отправляет видео в формате mp4 или любом другом, который может воспроизвестись на любой платформе где есть Telegram

Также не забудте удалить скаченное видео после отправки пользователю

Этого бота по функционалу можно расширять гораздо сильнее чем предыдущих, и вот вам идеи для улучшения него:

  • С помощью регулярных выражений определите с каких платформ позволите пользователям качать видео(и соответственно под какие будет разрабатываться дальнейний функционал)
  • Настройте ограничения на уровне yt-dlp, чтоб он не мог превысить лимит размера файлов, не мог скачать плейлист и т. g.
  • Сделай так, чтоб не было конфликтов если разные пользователи качают одно и то же видео
  • Ограничения на одновременные загрузки и выгрузки видео (данное решение "смягчает" нагрузку на бота и не позволяет положить его большим количеством загрузок), остальные видео должны просто ждать в очереди
  • Сделать так, чтоб пользователь одновременно мог скачивать только определённое вами количество видео.
  • Сделать так, бот качал ещё и превью видео и явно его устанавливал как превью, а также если видео невозможно смотреть, пока оно полностью не скачается(особенность некоторых библиотек, например telethon), то включите это
  • Сделать так, чтоб перед загрузкой бот отправлял сообщение пользователю где по кнопкам можно выбрать качество видео или вариант скачать только звук
  • Кроме превью добавьте к вашему видео/звуку другие метаданные, например у звука в поле "автор" название канала с которого качался трек
  • Сделайте временное кэширование айдишников загруженных видео в телеграм с учётом выбранного качества, для пользователя должно быть незаметным получил ли он видео из кэша или бот его скачивал и отправлял ему, на данном этапе достаточно использовать lru_cache.

Если у вас есть ещё идеи как можно улучшить данного бота, то можете реализовать их, а затем перейти к следующему модулю.

3 Сайты на монолитной архитектуре

Большинство сайтов написаны в монолитной архитектуре, такие сайты быстрее и дешевле создаются, но страдает отказоустойчивость и простота обновлений

3.0 Подготовка к работе с модулем

С  этого момента вероятнее всего в различных документациях вам придётся копаться немало

На этом модуле у вас начинается полноценная разработка, с этого момента информации и вариантов реализации чего-либо будет очень много. Для большинства решений уже существуют Best practice и стоит их изучать и затем решить как правильно встроить их в ваш проект

Для начала нужно определиться с фреймворком для монолитной разработки, ниже я опишу 3 самых популярных фреймворка:

  1. Django - монолитный и огромный фреймворк в котором есть очень много всего, если чего-то нужного не будет в коробке - скорее всего под это найдётся расширение.
    Из минусов стоит отметить то, что в Django довольно проблемно реализована асинхронность(лично я когда пробовал писать код асинхронным наткнулся на баг из-за которого убивался процесс, о нём кто-то сообщил до меня, но фикс вышел не очень быстро).
    Также он довольно плох при разработке сайта в микросервисной архитектуре, т к скорее всего вместо микросервисной архитектуры у вас получится шина(про минусы этой архитектуры напишу в блоке разработке на микросервисной архитектуре).
    Ещё стоит отметить что фреймворк фактически "навязывает" свою архитектуру, это имет две стороны медали, т к с одной стороны это вас ограничивает, а с другой проще разобраться в чужом проекте.
  2. Flask - самый минималистичный фреймворк из описанных, что позволяет его хорошо использовать как в монолитных проектах, так и в микросервисных, а также довольно быстро его освоить.
    Из минусов стоит отметить то, что в момент написания статьи асинхронность реализована довольно проблемно(о чём написано в его документации).
    Также вам скорее всего не хватит того, что идёт в нём из коробки, например если вы захотите что-то наподобии Django ORM, то вам нужно будет воспользоваться SQLAlchemy или чем-то подобным.

  3. FastAPI - самый новый из описанных фреймворков, а также самый быстрый из всех трёх описанных(можете это посмотреть в разных раундах бенчмарков techempower, во всех бенчмарках что я видел FastAPI обходит вышеописанные). По сравнению с Django он выглядит небольшим, но в нём идёт из коробки куда больше, чем во Flask, например в него встроена валидация через Pydantic, или например автоматическую генерацию документации для вашего проекта. Также как и Flask не навязывает вам архитектуру и подходит как и для монолитных проектов, так и для микросервисов
    Также в отличие от вышеописанных фреймворков, он заточен под асинхронность, хоть и позволяет вам писать синхронный код.
    Несмотря на то, что в нём из коробки идёт куда больше, чем во Flask, вам всё равно скорее всего для вашего проекта придётся что-то докачивать.
    Если решите использовать SQLAlchemy, то вам нужно будет его отдельно настроить под асинхронное использование.

После того, как вы определились с фреймворком вам стоит освоить азы HTML, Javascript и шаблонизатора Jinja2(именно этот шаблонизатор встроен во все вышеперечисленные фреймворки).

Поскольку это роадмапа в первую очередь написанна под backend, то фронтенда в ней будет минимум, например в заданиях не будет требований по красивому оформлению с помощью CSS, от HTML потребуется фактически "костяк" не самой красивой страницы, а через Javascript подгружать данные по кусочкам(например когда вы листаете комментарии под видео - они частями, чаще всего несколько за раз погружаются с помощью скриптов на Javascript, которые берут данные из определённых API эндпоинтов.

Также будет очень полезно узнать различные паттерны проектирования(скажу сразу - их очень много, стоит узнать самые базовые).

Вам стоит изучить что такое базы данных.
Если вы из выбранных фреймворков выбрали НЕ Django, то стоит изучить сторонний инструмент миграций баз данных, например Alembic

Вам также запомнить одну вещь, о которой новички могут не знать. Всё что отправляется на клиент может быть на клиенте потенциально украдено/изменено. Со стороны клиента может прилететь абсолютно любой запрос. Поэтому ВСЕ запросы со стороны пользователей нужно валидировать.

Также вам нужно хранить все пароли в хэшированном виде, более того, хранение конфиденциальных данных(а пароли всегда под это попадают) не в защищённом виде во многих странах наказуемо законом. Также важно то, какую хэш функцию вы используете, например MD5 раньше активно использовали для паролей, но в ней смогли найти коллизии из-за чего её не стоит использовать. У SHA-256 таких проблем не найдено, но она слишком быстрая из-за чего можно довольно быстро подобрать пароль на видеокарте, из-за чего её не стоит использовать. Лично я использую либо bcrypt, либо Argon2, но существуют ещё другие хэш функции хорошо подходящие для паролей.

В идеале вам стоит изучить методы атак(такие как радужные таблицы, коллизии, тайминг атаки) на хэши и как с ними бороться.

3.1 Заметкер

Довольно простой сайт максимум на пару страниц, как первый сайт неплохо

MVP данного сайта - сделать так, чтоб пользователь мог зарегестрироваться с помощью логина и пароля(в Django под это есть немало встроенных инструментов, в остальных фреймворках формы и базу данных для юзеров придётся делать руками) и создавать свои заметки, которые может просмотреть только он в любой момент.

Для этого проекта вам достаточно использовать SQLite(в Django он используется по умолчанию)

Как вам стоит улучшить данный проект:

  • Возможность редактировать/удалять свои заметки(помните про валидацию).
  • Возможность удаления своего аккаунта(с подтверждением паролем).
  • Настроить каскадное удаление по ссылкам в базе данных(удалили пользователя? все его заметки автоматически удалятся из базы данных).
  • Сделать так, чтоб заметки подгружались по частям с помощью Javascript'а.
  • Возможность давать определённым пользователям по логину доступ к определённой заметке. При этом заметки к которым у него есть доступ должны быть отдельно от его собственных.(не забудьте явно проверить чтоб у остальных или у не залогиненых не было доступа к ним).
  • Сделать навигацию по сайту возможной без ручного ввода URL.

Если у вас есть ещё идеи как можно улучшить данный сайт, а затем реализовать следующий проект.

3.2 Опросник

Google Forms и Yandex Forms довольно распространены для создания и проведения опросов. Незаменимая при исследованиях вещь и сейчас вы её напишите

MVP проекта - пользователь регистрируется и может создавать опросы, или проходить их если ему скинули на него ссылку.

Типы ответов - написать ответ, выбрать один из предложенных, выбрать несколько из предложенных.
Также должна быть возможность включить вариант ответа "другой" куда пользователь напишет что-то своё

Как вам стоит обновить этот проект после разработки MVP:

  • Панель управления опросниками
  • Возможность ограничить даты начала/конца опроса, а также досрочного завершения опроса со стороны создателя.
  • Возможность удалять опрос/аккаунт пользователя(с подтверждением паролем), а также настроить каскадное удаление.
  • Возможность просмотреть статистику и наглядно посмотреть её с помощью Plotly графиков:
    • График в какие дни сколько людей прошло опрос.
    • Вывод на круговую диаграмму в случае если вариант ответа был 1, при наведении должно писать количество ответов и процент от общего количества.
    • Вывод в столбчатые диаграммы если можно было  выбрать несколько ответов, при наведении должно писать сколько пользователей выбрали этот вариант и какой процент от всех проходивших пользователей выбрали его.
    • Добавить возможность посмотреть текстом информацию с выше описанных графиков.
  • Возможность дать определённому пользователю доступ к статистике опроса.
  • Если ваши скрипты были написаны напрямую в HTML, то их надо вынести в отдельные статичные файлы и добавить в HTML поле для подгрузки скрипта.

Если у вас есть идеи как ещё можно улучшить этот проект, то реализуйте их и приступите к следующему разделу

С этого момента вы можете смело начать участвовать на хакатонах в роли бэкэнд разработчика, в большей части кейсов будет достаточно монолитной архитектуры, нередко даже телеграм ботов. Микросервисы могут понадобится в сложных для бэкэнда кейсах, или как попытка получить дополнительные баллы за крутую реализацию бэкэнда.

4. Сайты на микросервисной архитектуре

Вот вы и добрались до самого сложного, и при этом важного этапа в данной статье

4.0 Подготовка к работе с модулем

Я нашёл довольно хорошую статью в которой объясняется что такое микросервисы, кроме неё я бы хотел добавить некоторые вещи от себя:

  • Микросервисы не про быстрый выход на рынок и не про дешёвую разработку, но они про отказоустойчивость, масштабируемость и более простые(и соответственно дешёвые) обновления
  • Бываютс ситуации когда нужно быстро выйти на рынок, и поэтому сначала делается монолитный проект, а дальше, когда монолита не хватает, он постепенно пилится на микросервисы(довольно болезненный процесс)
    В ходе такого перехода(или ошибок проектирования) в промежутке всего получается шина(когда у вас есть "главный" сервис, на который прилетают почти все запросы и он взаимодействует с микросервисами, несмотря на простоту такой архитектуры - проблемы начинаются когда "главный" сервис выходит из строя
  • Каждый микросервис отвечает за своё, самая частая ошибка - когда сервис может взаимодействовать со всей базой данных, но не должен иметь к ней доступа)
  • Крайне не рекомендую использовать Django для микросервисов, лучше использовать FastAPI или Flask
  • Благодаря тому, что микросервисы "общаются" между собой по сети, они не обязаны быть написаны на одном фреймворке или языке программирования, лично я люблю связку питона с FastAPI на одних сервисах, а на более требовательных к ресурсам использовать GoLang
  • Для коммуникации между микросервисами не всегда подходят https запросы, нередко лучше использовать брокеры сообщений, я бы советовал выбрать RabbitMQ(нужно немного донастраивать чтоб сообщения не терялись при перезагрузке брокера) или Apache Kafka, в качестве библиотеки для работы с брокером как по мне идеально подойдёт FastStream(на ней очень удобно писать код под брокеры сообщений, а также он очень удобно интегрируется с FastAPI)
  • Вместо классических Session Cookie которые используются для аутентификации аккаунтов в микросервисах нередко используются JWT токены, решите что вам лучше подойдёт и используйте в своём проекте

Первое что вам понадобится для удобства разработки - Docker, настраивать Docker compose не сложно, но благодаря этому весь проект будет запускаться по одной команде на любой ОС, которая поддерживает Docker

Вместо SQLite я настаиваю чтоб вы использовали PostgreSQL, поскольку он быстрее работает

Также вам очень вероятно понадобится использовать nginx, он будет раздавать статические файлы и служить Gateway API

4.1 Форум

Довольно серьёзный проект, после реализации его можно будет спокойно выложить на github и прикреплять к своему резюме

MVP для этого проекта - дать возможность людям создавать на форуме темы для обсуждения и обсуждать их

Расширение функционала для вашего проекта:

  • Возможность редактировать/удалять темы и сообщения
  • Возможность удалять аккаунт(при подтверждении паролем)
  • Возможность ставить фотографии и гифки на аватарки(хранить их можно с помощью media в nginx)
  • При смене аватарки старая должна удаляться с файлов сервера
  • Добавить теги для статей
  • Добавить модуль поиска по темам, поиск также должен учитывать теги, текст статьи и ошибки в тексте(для этого неплохо подойдёт elasticsearch)
  • Лайки/Дизлайки на сообщения
  • Возможность пометить ответ как "лучший" создателем обсуждения
  • Кэширование информации(результаты поиска, информация профиля и т п) в Redis или другой подобной базе данных

Если у вас есть ещё идеи для улучшения этого проекта, реализуйте их и приступите к следующему проекту

4.2 Видеохостинг

По факту самый нагруженный из всех проект, при создании него стоит гораздо сильнее задуматься об оптимизации и "смягчении" нагрузок на отдельные сервисы

MVP проекта - пользователь регистрируется и имеет возможность выкладывать видео и задать ему описание, название и теги, видео могут просмотреть даже неавторизованные пользователи

Для этого проекта вам стоит использовать Amazon S3 или надстройку над ним для хранения видео

Видео нужно конвертировать в формат HLS
Конвертация довольно дорогая операция(особенно если вы не используете для этого видеокарту), но при этом вам нужно спроектировать микросервисы так, чтоб после момента выгрузки видео на сервера оно гарантировано дошло до конвертации и выложилось

Для этого проекта очень полезным будет Kubernetis, если хотите - используйте его

Обновления для этого сервиса:

  • Возможность устанавливать превью видео, если оно не было установлено взять картинку с случайного или фиксированного(решите сами) таймкода
  • Лайки/дизлайки на видео(что из этого отображать решите сами)
  • Возможность оставлять комментарии, а также лайкать/дизлайкать их, а также возможность владельцу канала удалять их(что из этого отображать решите сами)
  • Главная страница где будут случайные видео
  • Страница канала(владелец должен иметь кнопки для открытия редактора видео)
  • Возможность изменять превью, название и описание видео, а также удалять его
  • Добавить модуль поиска видео, поиск также должен учитывать теги, название, описание видео и ошибки в тексте(для этого неплохо подойдёт elasticsearch)
  • Удаление должно быть каскадным и не только по базе данных, спроектируйте так, чтоб при удалении аккаунта удалялись все связанные с ним файлы из S3 хранилища
  • Кэширование информации(результаты поиска, информация профиля и т п) в Redis или другой подобной базе данных

Если у вас есть ещё идеи как можно улучшить этот проект, то смело реализуйте их

5. О хакатонах

Насколько сильно я не люблю различные тесты и олимпиады за их отдалённость от реальности - настолько же сильно я люблю хакатоны, по моему мнению это лучшая проверка команды в стрессовой ситуации

Как бы я кратко описал хакатоны? Вы вместе с командой приходите на соревнование и максимум что вы знаете - примерная тема. Далее в назначенную дату вам дают тему, или очень конкретное задание(специфика зависит от хакатона) и вы должны с командой за ограниченный промежуток времени(чаще всего пару дней, но бывают недельные) вы должны его выполнить. Можно назвать это стресс тестом вас, как специалиста.

Вы можете найти интересные решения во время хакатона и использовать в своих проектах(например библиотеку FastStream я случайно нашёл во время одного из хакатонов и до сих пор не смог найти лучшей библиотеки для работы с брокерами сообщений) или даже интересный проект который вы решите доделать после хакатонов.
Более того - хакатоны неплохо ценятся у работодателей и если вы себя круто покажете - вам могут дать оффер, также за них нередко могут давать денежные призы, что тоже очень приятно.

Лично я предпочитаю искать хакатоны на хакатоны.рус и в их телеграм канале, их довольно много на разные темы, и если у вас есть проблема с командой - её всегда можно найти в чате конкретного хакатона. Старайтесь искать тех, кто закроет ваши слабые стороны.
Самое важное - не брать на себя слишком много и грамотно разделить всё между командой. Лично я на хакатонах предпочитаю составить архитектуру на глазах команды и вместе с ними обсудить её, дальше каждый берёт свои части проекта которые мы заранее распределили между собой и начинаем разработку. В командах заранее прописанная архитектура(и не только она, например использование GIT тоже) даёт эффект сильнее, чем когда вы разрабатываете один. Довольно простая ситуация - нужно чтоб при нажатии кнопки приходил на определённый эндпоинт запрос, у него есть чёткая структура. Не имея никакого фронтенда я прописал обработку запроса на стороне сервера и протестировал её через curl в терминале(не повторяйте моей ошибки, используйте для этого Postman), параллельно со мной фронтендер имея на руках архитектуру проекта и в частности архитектуру данных которые должны передаваться по этому запросу написал его отправку и в итоге никому из нас не пришлось никого дожидаться(в контексте хакатона который длился 2 дня это было хорошей экономией времени).

6. Послесловие

Надеюсь эта статья кому-то реально поможет научиться программировать.

Если у вас есть вопросы или идеи как можно улучшить статью - напишите в комментариях, я открыт к обсуждением. Статью я намерен какое-то время дальше обновлять

Хочу пожелать удачи всем, кто дошёл до этого момента с дальнешим развитием в IT.

Оценить публикацию