Всем привет! Меня зовут Илья. Я давно читаю habr, не так долго занимаюсь программированием и еще чуть меньше времени хочу написать здесь статью. Не то, чтобы это идея фикс (или hotfix), но лучше опубликоваться и жалеть, чем поставить в план на «когда-нибудь потом», ничего не сделать, и «получить за это премию». Таких задач у меня уже накопилось на несколько жизней вперед, поэтому, приняв волевое решение, я выделил время на графоманию.

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

Идея открытого программного обеспечения мне нравится. Люди, создающие OpenSource проекты вызывают интерес, особенно, когда их продукты востребованы и конкурентноспособны. Двигать индустрию IT в свободное от работы время, вместо того, чтобы предаваться гедонизму — достойно уважения. Особенно, когда сам активно пользуешься подобными продуктами, вместо платных аналогов или ручного труда.

С возрастом, я порой ощущаю желание поделать что-нибудь интересное. Жизнь-то проходит, не лежать же на диване с джойстиком от плойки в обнимку. Голова не совсем отбитая, сердце генерирует пульс, руки шаловливые — чего бы такого хорошего натворить. С подобными идеями я не мог не обратить внимание на свободное ПО, тем более, что есть некоторый опыт в IT. Но, где OpenSource, а где я — обычный инженер-программист, с богатым стеком своих собственных, нерешенных проблем. Мне бы дожить до конца будней и немного отдохнуть в ночь с пятницы на субботу. Чтобы в выходные снова написать какой-то код, но уже в спокойной обстановке. А потом повторить. Еще и еще.

Казалось бы, хочешь пушить в оупен сорс (а не в оупен спейс) — на гитхабе тебя ждет множество репозиториев, с переполненными Issues и «Welcome to PR» в README.

Разобраться в чужом коде и улучшить его — отличный навык, который тоже стоит тренировать. Но как я не подступался к поиску проектов, где могу хоть что-то написать, — нашел, примерно, ничего. Есть пальцы, чтобы нажимать по клавишам, глаза, чтобы смотреть в монитор по 8-12 часов в сутки, и мозг, чтобы изредка всем этим управлять — в чем проблема? Хоть я и не сидел без дела и не деградировал, этот вопрос меня слегка угнетал. Плохо, когда имеешь желание «пушить код в ядро Linux», но не имеешь возможности. Хотя, кого я обманываю — иногда очень даже хорошо!

Давным-давно, еще на прошлой работе, ко мне прилипла таска на написание внутренней библиотеки по специфичной проверке ip адресов, для удобного использования везде, хоть где. Например, на Марсе. Колонизировать его без доступа к скоростному интернету — дикость, не свойственная цивилизованному человеку. Предполагаю, что пока эта проблема не будет решена — никто туда и не полетит.

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

Фикстуры и моки увлекли настолько, что файл с ними разросся до неприличных размеров. И, когда я уже начал слегка выгорать, вдруг обнаружил, что в одном из сотен кейсов, используемая библиотека ipcalc выдает ошибку: "TypeError: 'str' object is not callable". Что я мог с этим сделать?

Ошибка в ipcalc
Ошибка в ipcalc

Возможности совпали с желаниями, поэтому я оформил свой первый Pull Request (далее PR) в OpenSource. Он был принят на удивление быстро. Радость от этого «достижения» была мимолетной, все-таки как-то мелко плаваю. Разве можно будет с гордостью рассказывать об этом внукам? Засмеют.

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

Некоторые IPv6 библиотека ipcalc определяла как IPv4, что неправильно.

ipcalc некорректно определяет версию ip
ipcalc некорректно определяет версию ip

Завел очередной Issue и спустя некоторое время еще один. Библиотека ложно определяла невалидность сжатого IPv6: "ValueError: 2002:0101:0000:0000:0000::0000:0000: IPv6 address invalid: compressed format detected in full notation".

ipcalc некорректно работает со сжатым IPv6 адресом
ipcalc некорректно работает со сжатым IPv6 адресом
Проверка валидности того же самого IPv6
Проверка валидности того же самого IPv6

После данного открытия я подготовил следующий PR (не путать с Public Relations) в ipcalc. Вероятно, он будет залит не раньше, чем нога человека ступит на красную планету.

После таких делишек во мне проснулся азарт охотника-собирателя, тем более, что я уже знаю, где «бродит бизон». Если в ipcalc есть ошибки, то они могут быть и в аналогичных библиотеках. Следовательно, нужно изучить стандартную библиотеку ipaddress, в которой тоже могут валяться возможности. Не на дороге же им валяться?

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

На этот раз, не смотря на всю скромность правок, я, вроде как, стал контрибьютором в python. А их, если разобраться, не так уж и много. Мои будущие внуки, должны оценить такое.

После такого «оглушительного успеха» как-то не правильно почивать на лаврах. Тем более, что после перехода в RAFT мне стали прилетать более интересные задачи, в работе над которыми я использовал инструменты и библиотеки из открытого доступа. Обнаружилось, что в некоторых из них не хватает примеров использования и/или документации. Чем я и воспользовался, оформив несколько PR (раз, два, три, четыре), которые могут быть приняты примерно известно когда.

Как вы могли заметить, чтение приключенческой литературы в юные годы дало свои плоды. Если она побуждает чем-то заниматься, то более взрослые книги, подталкивают меня помахать перед людьми факелом просвещения. Показать, что даже если ты не золотой медалист мехмата МГУ — возможность нацарапать свое имя на «скрижалях IT» имеется. Достаточно пробовать новое, обращать внимание на мелкие детали, стараться видеть возможности и вносить даже незначительные улучшения. Ну, и конечно же, не забывать про автотесты — где-то они на unittest, но настала пора переписать на pytest, в других проектах ими покрыто далеко не все, или вовсе кот наплакал. Примеры использования, документация и тесты весьма далеки от rocket science, но их тоже можно и нужно делать. Кто считает, что нельзя — пусть кинет в меня камень.

Я же попробую нырнуть чуть глубже в океан OpenSource. Сейчас мне интересно самостоятельно создать что-нибудь полезное и выложить в открытый доступ. Во всяком случае, у меня есть идеи и я над ними работаю. Тему, описанную в данной статье оставляю «на растерзание» всем желающим. Она вроде как рабочая. Дерзайте!

Из всего пережитого во время описываемых событий я сделал примерно следующие выводы:

  1. Тривиальные задачи могут стать источником вдохновения и приводить к интересным открытиям.

  2. Автотесты способны улучшить как сам продукт, так и используемые им библиотеки.

  3. Пушить в OpenSource не страшно - в худшем случае ваш код сочтут бесполезным, что с кем только не приключалось.

Комментарии (1)


  1. kompilainenn2
    04.10.2025 09:26

    Ну, это так и работает. Никто не говорит, что вы придете в LibreOffice и обязаны с порога запилить нетривиальную фичу типа динамических массивов на 10 к строк.
    Путь в тысячу ли начинается с первого шага, как говорят китайцы.

    А вы молодец =)