Проблема
Компанія стрімко зростала, і я почав відчувати, що справлятись з Backend, DevOps і MLOps стає дедалі важче. Розмір сервісу збільшувався, кількість задач зростала, а людей ставало недостатньо. В інших командах почали постійно запитувати, коли все буде готово.
Я написав JD і почав процес найму, але знайти Python-розробника було дуже важко. Більшість кандидатів мали досвід роботи з Node.js або Java, але Python Backend-розробників було обмаль. Особливо важко було знайти тих, хто мав досвід з FastAPI. Крім того, мало хто знав технології, як Poetry, Background Task, Pydantic.
У цій ситуації, після перегляду відео на YouTube від Hyangro, де розглядали Python RIP і приклад BankSalad, я задумався: “Чи це ще не час?” або “Може, нам краще перейти на Java?”. Коли я додав Java Spring Boot в JD, кандидати змінилися, і я вирішив, що ми будемо навчати їх FastAPI.
Але проблема з’явилася в процесі навчання. Оскільки нові працівники не були знайомі з FastAPI і синтаксисом Python, навіть прості задачі доводилося писати дуже складно. Крім того, через нестачу досвіду з динамічними мовами, часто траплялися помилки з типами. Це призводило до великої кількості виправлень і зменшення моєї ефективності, змушуючи мене працювати до пізна.
Покращення
- Міграція на Java
Перехід на Java не означав, що ми можемо реалізувати все на Java. Через специфіку AI-сервісів, зручність і розширюваність Python неможливо було відмовитись. Оскільки ми вже використовували MSA-структуру, частину сервісів для комунікації з фронтендом я вирішив перенести на Spring.
Першим кроком я почав міграцію з використанням ALB Listener Rule для тестових частин, які вже були готові. Наприклад, я поступово переніс функції реєстрації та входу на Spring.
Я також попередньо налаштував Fluentd для передачі логів і конфігурацію JPA, а після цього продовжив міграцію. Завдяки використанню ALB часткова міграція пройшла безперебійно, і процес тривав без жодних збоїв. Налаштування, такі як використання Snake_case для таблиць в SQLAlchemy, були відкладені на рефакторинг після завершення міграції.
- Залишення SQS та gRPC
Я вирішив залишити SQS і gRPC для пайплайн-воркерів та серверів без змін. Це були мої основні задачі, і я не намагався все змінити одночасно. Частини, як Spring Batch і Spring Cloud, я ще не освоїв, тому планую вивчити їх поступово через навчання.
Результати
- Розвиток не сповільнився
Коли команда працює з тими фреймворками та мовами, з якими вони знайомі, розробка стає значно швидшою. Я зрозумів, що швидкість розробки, яку я відчував на Python, також справджується для розробників, які віддають перевагу Java. Цей досвід змусив мене замислитися: “Мабуть, я думав тільки про себе”.
- Унікальні можливості Spring Boot
У FastAPI я використовував DI і генератори для керування транзакціями в базі даних.
...
@asynccontextmanager
async def get_session(self) -> AsyncGenerator[AsyncSession, None]:
if self.session_maker is None:
raise DBInitializeError
async_session = self.session_maker()
try:
yield async_session
await async_session.commit()
await async_session.close()
except Exception as e:
await async_session.rollback()
await async_session.close()
raise e
...
Але побачивши аннотацію @Transactional
в JPA, я усвідомив, що підхід, який я використовував у FastAPI, був неефективним. Завдяки систематичним можливостям Spring Boot нові члени команди могли швидко освоїти матеріал і почати працювати набагато ефективніше. Хоча я цінував свободу та компактність Python, я зрозумів, що для командної роботи потрібно більше структури та історії.
Ретроспектива
Я розпочав як перша команда розробників у компанії і поступово виріс до лідера команди, вирішуючи різноманітні проблеми. Спочатку, через обмежений досвід, я взяв на себе відповідальність за важку позицію, оскільки залучити досвідченого лідера було важко.
Я хотів залучити людей, які цікавляться Python і FastAPI, але через розміри компанії та обмеження було складно знайти підходящих кандидатів. Це змусило мене сумніватись у своїх силах і впасти в депресію.
За останні 4 роки я працював з Python і FastAPI в AI-компанії з великим задоволенням. Але, як я зрозумів, у пошуках вакансій було важко знайти компанії з технічним стеком, повністю заснованим на Python. Я зрозумів, що компанія повинна орієнтуватись на Java, Spring Boot і Kotlin для залучення правильних кандидатів.
Цей процес був нелегким, але я вважаю, що це було важливе рішення для розвитку команди та покращення співпраці.
Перекладено з: Python Backend 개발자의 부족