Всем привет! Наверное, как и многие обитатели Хабра, весной я попал под волну сокращений. Погрустив над текущей ситуацией на рынке, решил попробовать себя в open‑source. В конце концов, есть запас денег, отсутствуют (тьфу‑тьфу‑тьфу) ипотеки/кредиты, да и всегда хотелось почувствовать себя частью чего‑то большего, что ли. Спустя пару месяцев, у меня получилось стать мейнтейнером в небольшой ML‑библиотеке, о чём и хочу сегодня рассказать.

Как всегда бывает, поначалу было вообще непонятно, куда и как приткнуться. Попытки погрузиться в кодовую базу популярных библиотек приводили к депрессии, осознанию своей недееспособности и прочим явлениям, сопутствующим синдрому самозванца. Однако, взяв себя в руки и почитав статьи на Хабре — решил кушать слона по кусочкам, и взять что‑нибудь супер простое.
Набравшись духу, открыл свой первый PR на задачу с лейблом good-first-issue. Выглядел он как‑то так:

И хотя на исправление ошибки у меня ушёл всего час времени и буквально одна строчка, чувство глубокого удовлетворения от приобщённости к хайповому python‑продукту было сопоставимо с оффером на первую IT‑работу. Замотивировавшись, примерно месяц старался чередовать более банальные задачки (замена black/isort на ruff, изменение аннотации для функции в typeshed и так далее) с чем‑то более сложным, как, например, интеграция TypeForm с контейнером в dishka. Какие‑то мерджи проходили достаточно гладко, какие‑то не очень, а часть пулл‑реквестов, к сожалению, до сих пор ожидают ревью...

С одной стороны, подобные ситуации абсолютно логичны, особенно в контексте больших библиотек — работы много, а свободного времени у людей не очень. Тем не менее, хотелось больше активности, больше свободы. Подумав, решил вписаться в какую‑нибудь перспективную библиотеку небольшого размера, в которой можно было бы как развернуться на полную, так и позаниматься «менеджерскими» обязанностями — поруководить людьми, задать направление развития продукта и проч. После относительно недолгого периода поиска натолкнулся на pyfenn — молодую либу, предоставляющую шаблоны для обучения ML‑моделей, имеющую на момент моего подключения примерно 30 звёзд и 20 форков и одного сходящего с ума итальянца, который пытался затыкать собой вообще все дыры.
Погрузившись поглубже в проект, я понял, что у меня есть возможность убить одним выстрелом аж трёх зайцев:
1 — Я смогу практически на ежедневной основе практиковать свои навыки/новые знания, так как работы ОЧЕНЬ много.
2 — Получу возможность глубже погрузиться в контекст ML моделей, их обучения и всего, что с ними связано (так и так в будущем хотел в эту степь пробовать уходить).
3 — Если вдруг проект раскрутится, получу вкусную строчку в резюме, что являюсь мейнтейнером популярной либы.
Решив, что игра стоит свеч, мысленно поплевал на руки (ибо гигиена) и приступил к нанесению контуров будущей работы.
Функционал проекта довольно прямолинейен: при обучении ML‑моделек есть элемент рутины, который можно «шаблонизировать» заготовками. По словам Алессио (создатель библиотеки), изначально он писал шаблоны под свои задачи, и потом решил попробовать расшарить их под общий доступ на GitHub. Затем появились амбиции добавить веб‑интерфейс в виде дашборда, запилить интерфейс в виде cli команд и так далее.

Как часто бывает, попытки добавить кучу нового функционала без предварительного планирования привели к некой, гм, захламлённости внутри проекта. Одна часть кода была написана в качестве эксперимента и не была удалена, другая была добавлена «Ну так, чисто на будущее, мало ли», третья активно использовалась, но с довольно странной организацией взаимосвязей. Так, в какой‑то момент в корне проекта лежало 4 папки, в каждой из которых был ровно один файл с «рабочим» классом, который импортировался наружу через __init__.py...
Более того, отсутствовали такие «базированные» вещи как проверка типизации, проверка линтинга, достаточное покрытие тестами, актуальность документации и так далее. Исправлением этих ошибок я и занялся в первую очередь, настругав за первые 2 недели около 20 коммитов и форматнув изрядную часть кода. Несмотря на трудоёмкость процесса, комплименты сообщества и ощущение, что за последние несколько лет я‑таки вырос как разработчик, компенсировали затраченные силы.

По итогу, к середине июня я был «повышен» до мейнтейнера проекта и наделён правами мёрджить, ревьюить, апрувить, одним словом — мейнтейнить продукт. И несмотря на обилие работы, которое на меня свалилось, я в кои‑то веки чувствую себя на своём месте, пусть финансовое положение у меня и не такое стабильное, как раньше.
В следующих постах расскажу, каково это поддерживать молодую либу в 2026, кто чаще всего подхватывает новые issues (индусы), а также о желаемом пути развития pyfenn.
Спасибо, что уделили время! Всем добра:)
P. S. Если у кого‑либо есть советы по работе с open‑source библиотеками, буду рад послушать/почитать.
P.P. S. Это моя первая статья на Хабре, мама, я в телевизоре!
