Михаил Бородин больше десяти лет занимается Python-разработкой и работает тимлидом в крупной компании. Он считает, что команда — это не рабочая сила, а самостоятельные специалисты, которых нужно направлять. Михаил рассказывает, как он создает сервисы, которые ускоряют расчеты поставок в торговые сети, и почему нужно помогать расти джунам.
Чем я занимаюсь
Тимлид группы веб-разработки — это играющий тренер. Он принимает участие в разработке backend сервисов и продуктов и следит за командой, чтобы она успешно выполняла задачи и развивалась.
Я работаю в крупной ритейл-компании. Мы разрабатываем сервисы, которые помогают сотрудникам следить за пополнением магазинов или распределительных центров. Как тимлид, я контролирую весь процесс создания проекта: проверяю, все ли мы успеваем, управляю ресурсами, планирую следующие проекты, обмениваюсь опытом с другими командами.
Наши проекты — это внутренние веб-сервисы с личным кабинетом менеджера компании для контроля и визуализации данных: можно увидеть, сколько и каких товаров было распределено, в какие магазины. Менеджер запускает расчет, смотрит на результаты автоматических вычислений, выгружает данные, сохраняет информацию. При этом для каждого направления в пополнении должен быть свой микросервис: с их помощью можно рассчитывать сроки годности, цепочки поставок товаров в магазины, графики поставок.
Вместе с архитекторами я участвую в проектировании каждого сервиса, мы выбираем подходящий для этого стек. Коллеги выстраивают схему взаимодействия информационных систем, которые должны встраиваться в большую центральную ERP-систему (Enterprise Resource Planning — планирование ресурсов предприятия) всей компании. Сервисы, которые мы разрабатываем, подключаются к ней и получают данные, потом выполняют расчеты и возвращают данные обратно.
В моей команде шесть backend-разработчиков, мы работаем в большой продуктовой команде, где есть и просто frontend-разработчики, и тестировщики, и аналитики. Моя задача — помогать и направлять в развитии: я слежу за их планами, поддерживаю, чтобы не становилось скучно, даю новую информацию, чтобы совершенствоваться в новых технологиях.
Мы объясняли на мемах, чем отличается frontend от backend.
Наша цель — вырастить разработчиков, а не использовать их как ресурс. Поэтому мы в компании запустили школу для начинающих программистов. Мы читаем курс по Python для сотрудников, которые хотят попасть в IT. Он разделен на две части: основы и продвинутый Python. На основах мы рассказываем про синтаксис, структуры, computer science, алгоритмы. На продвинутом мы углубляемся в прикладную разработку: изучаем Django, студенты учатся создавать сайты, приложения. В конце они защищают выпускной проект, и лучших мы рекомендуем внутри самой компании.
Кому и для чего нужен Python можно узнать в этой статье.
На занятия приходят люди из разных отделов, некоторые даже не связаны с работой в нашем подразделении и с IT: и сисадмины, и тестировщики (подробнее про профессию в этом разборе), и кладовщики. Многие преуспели в учебе: все, кто заканчивал школу, приходили либо к нам в команду, либо к коллегам и продолжают работать и развиваться.
Какие инструменты мы используем
У нас есть магазины по всей стране, и в каждом из них много товарных позиций. Поэтому мы работаем с огромным количеством данных, нам приходится искать пути оптимизации алгоритмов, реализовывать масштабируемую архитектуру. Сейчас мы с командой автоматизировали работу сервисов и наладили промышленную эксплуатацию.
Для этих задач мы подбираем подходящие фреймворки и программы. В компании есть стандартный стек, в рамках которого архитектор, видя и понимая все задачи, которые предстоит выполнять сервису, рекомендует использовать то или иное решение: либо синхронный Python, либо асинхронный.
Обычно мы используем Django — это синхронный стек. В нем удобно управлять данными. Еще он подойдет для быстрой разработки: за несколько дней можно создать прототип приложения, который будет нормально работать. При этом Django не очень производительный, поэтому на нем сложно работать с высоконагруженными приложениями.
Асинхронный стек нужен как раз для этого: у таких инструментов выше скорость и производительность, они быстрее обрабатывают большое количество данных. Можно не дожидаться, пока закончится одно действие, чтобы начать следующее, и параллельно запустить несколько процессов; но грамотно написать такую программу, чтобы она эффективно работала, сложнее.
В асинхронном стеке нет крупных фреймворков, есть отдельные библиотеки: AIOHTTP для реализации HTTP-запросов; недавно появился FastAPI для создания API-сервисов; можно использовать Celery — это система для выполнения задач из очереди по расписанию.
Синхронный стек используют чаще, так как инструменты там стандартные, подходят для многих задач: тот же Django уже давно один из самых популярных фреймворков Python по умолчанию. Поэтому и разработчиков на нем больше, чем на асинхронных библиотеках. Но сейчас ситуация выравнивается и люди знакомятся с асинхронным программированием.
Работа реляционных баз данных сильно замедляется, если собирать данные из разных таблиц одним запросом. Если часто работать с одним и тем же набором данных, его проще положить в хранилище, которым легко и быстро пользоваться, чтобы снять нагрузку с баз данных, ускорить чтение данных. Для этого можно кэшировать запросы либо прямо в базе, либо в отдельном хранилище; мы кэшируем данные в Redis.
Со временем мы также научились минимизировать потери и снижать риски. Бывало, что у нас падали сервера с сервисами, поэтому мы проводили ретроспективный анализ и решали, как не попасть снова в такую ситуацию: писали сразу unit-тесты (проверка отдельных частей кода), проверяли продукт перед релизом, переходили на Kubernetes (оркестратор для развертывания и управления контейнеризированных приложений) для безопасного запуска, делали бэкапы.
Как я стал тимлидом
Помимо Python я изучал HTML, JavaScript, поэтому был практически fullstack-разработчиком. Я разрабатывал платформы для визуализации анализа геопространственных данных, чтобы аграрии, экологи и лесники могли анализировать территории или, например, замерять урожайность.
Читайте также: Что выбрать: frontend, backend или fullstack?
После этого я работал в крупной финансовой компании. Мы делали робо-эдвайзера — автоматизированного советника, который без лишней терминологии помогал простым физическим лицам начать инвестировать в фондовые ценные бумаги.
В команде нас было двое — я и мой руководитель. Когда он ушел, мне пришлось искать разработчиков, потому что один я бы не справился ни при каких обстоятельствах. Тогда я и стал тимлидом.
Я бы хотел и дальше совершенствоваться, учиться управлять командами. Для этого важно развивать софт-скиллы: уметь правильно ставить задачи, следить за качеством, даже предугадывать проблемы, понимать, как себя чувствуют люди в команде.
Зачем идти на курсы и составлять портфолио
Python — универсальный язык, на нем можно писать все, начиная со скриптов, заканчивая десктопными приложениями. Он простой, быстрый, его легко изучать и преподавать, через полгода с нуля новичок уже сможет писать несложные программы. Но это не значит, что достаточно шести месяцев, чтобы стать разработчиком, нужно постоянно углубляться в сферу.
Судьба всех программистов — это вечная учеба. Я тоже стараюсь изучать новые технологии не только в программировании, но и в проектировании. Недавно изучил domain-driven design — это проектирование исходя из предметной области проекта, в котором ты работаешь. Благодаря ему можно создавать масштабируемые приложения, где все четко структурировано.
В этом плане курсы идеально подходят, чтобы выбрать подходящую профессию. Можно разобраться в базовых принципах работы программ, алгоритмов, структур данных. Я бы посоветовал новичкам пойти на несколько направлений, чтобы понять свои желания и интересы.
Важно, чтобы у джуниоров было портфолио, например с учебными проектами или даже opensource (проекты с открытым исходным кодом). Не обязательно, чтобы проект высоко оценивали на GitHub, достаточно показать опыт.
Совет: Уже во время работы важно научиться задавать вопросы. Новичкам часто кажется, что они будут выглядеть глупо, поэтому они чувствуют себя неуверенно и стесняются. На самом деле лучше чаще спрашивать своего руководителя / ментора / опытного разработчика, чтобы быстрее вырасти. А наставник должен с пониманием относиться к вопросам. Важно быть открытыми к общению и помогать джуниорам расти, потому что команда — это единый организм, который развивается.
Еще один простой, но важный совет: нужно всегда выделять законный час на обед во время рабочего дня на удаленке. В офисе это сделать проще, потому что можно просто пойти на кухню или в кафе. Дома об этом часто забывают, а ведь о себе тоже надо заботиться, чтобы потом продуктивно работать.