Последние десять лет я занимался разработкой OSINT-инструмента под названием SpiderFoot; он используется для автоматизации сбора и анализа общедоступных данных с целью сократить поверхность атаки и выявить возможные угрозы. Это проект с открытым кодом, он написан на Python и занимает первые строки во многих из тех категорий GitHub, где фигурирует. На момент написания статьи у него около 7000 звезд. Пару лет назад я сделал SaaS-версию SpiderFoot под названием SpiderFoot HX, но это тема для отдельной статьи (а то и серия статей), которую мы отложим на потом. Сегодня я хочу рассказать, чему научился в процессе.

Вы будете правы, если предположите, что за эти десять лет SpiderFoot стал довольно большой частью моей жизни. Я проводил большую часть свободного утреннего и вечернего времени за «работой» над ним и часто вел беседы о нем с женой, детьми и друзьями. Он принес мне много радости, хотя подчас и действовал на нервы.

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

Позвольте сначала обрисовать вам этапы моего пути, чтобы предоставить какой-то контекст, но если вас интересуют именно уроки – можете спокойно пропустить этот параграф и перейти к следующим.

Моя история до сегодняшнего дня


Забавно, что изначально, в 2005 году, имплементацию SpiderFoot я начал писать, просто чтобы освоить C# на практике. Я выпустил первую версию, и она так и лежала в состоянии «версия 0,1b» на SourceForge (да-да, помните его?) в течение семи лет, пока я не взялся переписывать ее на Python. Так что, если считать этот период, SpiderFoot (как минимум, самому названию и концепции) скоро двадцать лет стукнет!

Вот так выглядела версия на C#. Да, дизайнер из меня был еще тот.



А вот SpiderFoot в своем современном виде – веб-инструмент с интерфейсом командной строки, написанный на Python:



Так откуда взялась эта пропасть в семь лет между первой версией и переписыванием на Python?
Ну, изначальной моей целью было попрактиковаться в C#, сделать полезную вещь и выпустить ее в большой мир – всё это я выполнил. У меня не было долгосрочных планов или идей, как расширить функциональность – сделал и ладно, на тот момент этого для меня было достаточно. К тому же в то время я занимался целым рядом интересных технических проектов на работе, и потребности что-то разрабатывать в свободное время тоже не ощущал.

Но все эти годы мимо меня проходило одно обстоятельство: для своей ограниченной, «одноразовой» функциональности продукт оказался неожиданно популярным. SpiderFoot упоминали в книгах и учебных курсах, а скачивания держались на уровне 500 в неделю – не слишком много, но все-таки кое-что, если учесть, что из-за отмирающих источников данных приложение работало только отчасти.

Помню, что перебрав несколько управляющих должностей в течение нескольких лет на основной работе, я стал ощущать, будто мне чего-то не хватает. Оглядываясь назад, понимаю, что не хватало мне обучения в процессе создания – я практиковал его в своей карьере долгое время, пока совещания, презентации и переписка не стали съедать все рабочие часы. Мне понадобилось много времени, чтобы осознать, в чем именно я нуждался: в выходе для творческой энергии без препятствий в виде политики компании, технических стандартов, требований к методологии и так далее, и тому подобное (я работал в банке, этим всё сказано).

Отсюда проистекал вопрос: что бы такое создать в свободное время? Я знал три вещи: что хочу выучить Python, заняться чем-то, связанным со сбором и анализом данных, и поместить всё это в контекст защиты данных – в этой сфере я отработал более двадцати лет.

SpiderFoot по-прежнему удовлетворял всем требованиям! И вот, в конце 2011 года, я вернулся к истокам, освоил Python настолько, чтобы хватало на первых порах, и стал заливать коммит за коммитом в новенький репозиторий на GitHub, пока наконец не опубликовал «версию 2.0» в мае 2013 года.

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

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

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

  • Получал неожиданные письма с благодарностями: от пользователей, от предприятий, которые благодаря продукту обнаружили бреши в своей защите, от элитных компаний, предлагающих консультации по кибербезопаности, которые с его помощью завоевали новых клиентов, и даже от следователей, использовавших его в поисках пропавших людей!
  • Встречал упоминания продукта в книгах, журналах, учебных курсах и на конференциях.
  • Видел, как члены сообщества снимают о нем ролики-туториалы и пишут посты в блогах.
  • Попал в топ HackerNews, причем даже не сам себя подавал.
  • Освоил новые инструменты и технологии.
  • Совместно работал с людьми из сообщества – они помогали мне в развитии SpiderFoot, а я показывал, как использовать SpiderFoot в их проектах.
  • Построил вокруг SpiderFoot бизнес, параллельно работая на полную ставку.
  • Боролся за права на интеллектуальную собственность с тремя разными работодателями.
  • Получал предложения от потенциальных инвесторов и даже потенциальных покупателей бизнеса.
  • Выступал с разными докладами о SpiderFoot.
  • Использовал средства, заработанные на SpiderFoot HX, чтобы оплатить вклады в открытый код проекта, и даже спонсировал некоторые общественные инициативы – OSINTCurious, abuse.ch и TraceLabs.
  • Писал статьи на темы, связанные с продуктом (и эту, и другие).
  • Встречался с другими основателями и руководителями компаний, получал приглашения в различные сообщества.
  • Наблюдал, как продукт (некорректно) использовали, чтобы доказать подтасовку результатов в ходе президентских выборов в 2020 году.
  • Наблюдал, как некто тоже пытается выстроить бизнес вокруг SpiderFoot, и в конечном счете положил этому конец.
  • В общем и целом, учился распределять время между проектом, семьей, работой и друзьями (но тут мне еще учиться и учиться).

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

Урок первый: создание проекта с открытым кодом может принести много отдачи, на которую вы не рассчитывали


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

  • Слушать, как пользователи благодарят меня и рассказывают, в каких ситуациях их выручил SpiderFoot, в течение многих лет для меня было, пожалуй, лучшей наградой и источником мотивации. Многие ли могут похвалиться тем, что создали нечто такое, что послужило на благо тысяч людей и продолжает приносить пользу без дополнительных усилий?
  • Я существенно вырос и в написании кода, и в программировании в целом, с тех пор как взялся за проект, благодаря обратной связи от людей вроде _bcoles. Это помогло мне на основной работе – и в управленческих обязанностях, при работе с другими программистами, и в собственных задачах.
  • Уверен, что проект сыграл свою роль в том, что мне удалось устроиться на работу в некоторые компании и получить приглашения выступить на некоторых мероприятиях.
  • У меня появилась отличная платформа для встречи и общения со многими одаренными людьми. Проект придавал мне авторитетность в разных контекстах – люди не знали, кто я такой, но знали про SpiderFoot, и это позволяло с легкостью установить контакт.
  • В конце концов проект открыл мне коммерческие возможности и заронил семена, из которых выросла SpiderFoot HX.
  • То, что я постоянно вкладывал усилия в проект в течение долгого времени, повысило его качество и усилило положительный эффект от всего вышеперечисленного.

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

Урок второй: настраивайтесь на долгий путь


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

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

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

Урок третий: выдавайте результат, и почаще


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

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

Урок четвертый: ставьте перед собой цели общего и открытого характера


Моя цель овладеть Python на самом деле была лишь частью мотивации для работы над SpiderFoot. Другими, более широкими и долгосрочными целями были следующие:

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

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

Например, в этом году я мог бы переписать фронтенд на React или внедрить новый фреймворк для тестирования, чтобы развить свои навыки, а в следующем – перевести бэкенд на другую базу данных. А возможно, мне захочется за этот год удвоить регулярный месячный доход от SpiderFoot HX или достичь еще какого-нибудь результата в предпринимательском аспекте.

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

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


Когда люди узнают, что у меня есть жена и дети, работа на полный день, а также побочный бизнес в виде SpiderFoot HX, первый вопрос, который они мне задают – это всегда что-то в духе «И как вы находите время?» Конечно, было бы приятнее считать, что у меня какая-то необычайная способность сосредотачиваться (нет) или я просто программист высочайшего класса (однозначно нет), но полагаю, всё дело в нескольких простых вещах:

  • Для работы я обычно отвожу те периоды, когда знаю, что меня пару часов никто не потревожит. То есть либо раннее утро, либо поздний вечер, смотря какой режим сна изберет для себя мой годовалый ребенок.
  • Я очень мало времени провожу перед телевизором (где-то пару часов в неделю), а социальными сетями пользуюсь только для продвижения SpiderFoot (см. седьмой пункт). Основной инструмент прокрастинации у меня – это, пожалуй, чтение HackerNews, однако я не оставляю комментарии нигде, кроме как под своими постами, что ограничивает расход времени.
  • Если я не на ноутбуке и не могу писать код, то изучаю новые источники данных, ищу новые рекомендации для работы с Python, смотрю, как дела у других инструментов в моей нише, отвечаю на письма и т.д.
  • После стольких лет работа над SpiderFoot вошла у меня в привычку. Я берусь за нее без размышлений и не могу пропустить больше чем пару дней – появляется чувство, что что-то не так.

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


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

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

Поэтому не слишком переживайте из-за качества кода, покрытия тестами и подобного. Немалая часть авторов проектов с открытым кодом вообще не занимается разработкой профессионально. Очень жаль, что у многих не хватает решимости выложить то, что они считают «плохим кодом», в общий доступ из страха столкнуться с критикой. Всегда можно провести рефакторинг! Всегда можно добавить тесты! Да можно вообще переписать всё на другом языке, если захотите.

Если у вас есть что-то, что может принести пользу – просто выложите, смирите гордость, будьте открыты к указаниям на ошибки и учитесь на них. В SpiderFoot есть фрагменты воистину ужасного кода и за всё время об этом высказались всего пару раз. Какая вообще разница?

Не забывайте: проект ваш и у вас есть время его улучшить (см. пункт второй).

Урок седьмой: продвигать свой продукт не стыдно


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

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

Поэтому изучите своих пользователей и среду их обитания (Twitter? LinkedIn? TikTok?) и отправляйтесь прямиком туда. Свяжитесь с лидерами мнений в своей нише (то есть с теми, кто ведет блоги или составляет рассылки), которым может пригодиться ваш продукт и попросите его испробовать. Вы удивитесь, насколько охотно люди откликаются на просьбы авторов проектов с открытым кодом – они ценят то, что вы тратите свое время на помощь другим.

Совет: помимо общения с пользователями заведите добротный README.md к проекту, который объясняет, зачем нужен продукт и как с ним обращаться, и приводит ресурсы с дополнительной информацией. Можно даже сделать отдельный сайт не слишком убогого вида.

Урок восьмой: проясните всё с работодателем


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

Гораздо проще все утрясти с правами на интеллектуальную собственность а) до начала работы на работодателя; б) до начала работы над проектом. Я доходил даже до того, что предъявлял не существующие в реальности проекты, которые хотел бы когда-нибудь реализовать, просто для уверенности, что в обозримом будущем у меня всё схвачено.

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

Урок девятый: выстраивайте сообщество


Этот урок дался мне, наверное, тяжелее всего – в том плане, что я осознавал необходимость, но оказался не готов к тому, что это требует столько времени, и заниматься этим следовало с самого начала. Документацией я действительно занимался с самого начала, но ничего к этому больше не добавил, решив, что сойдет и так. Но в наши дни этого, похоже, уже недостаточно.

Под «выстраиванием» я подразумеваю создание форумов и других площадок, где пользователи могли бы глубже погрузиться в тему, быть на связи друг с другом, получать и оказывать помощь при необходимости.

Вот несколько примеров:

  • Документация, видеотуториалы, посты в блоге
  • Отклик на запросы по функциональности, имплементация востребованного (если, конечно, это не идет вразрез с вашими целям и видением)
  • Создание канала в Discord или Slack, где люди могли бы задавать вопросы и помогать друг другу
  • Выступления на конференциях

Урок десятый: получайте удовольствие

Возможно, этот пункт стоило поставить первым – настолько он важен, но я поставил его последним, потому что мне хотелось, чтобы он остался у вас памяти свежее всех прочих.
Когда беретесь за какой угодно личный проект по разработке ПО, если только это не совсем мелочь, нужно сразу же отбросить мысль, что в один прекрасный день он будет закончен. Даже если в какой-то момент вы решите, что в плане функционильности его некуда развивать, то все равно будут происходить изменения в зависимостях, вы будете обзаводиться новыми знаниями, появится желание где-то провести рефакторинг, пользователи будут натыкаться на баги и выдвигать просьбы о новых возможностях, которые тоже будут меняться со временем, и так далее. У вас могут даже появиться конкуренты.

Временами может казаться, что это просто неподъемно.

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

Нет такого правила, которое обязывало бы вас проводить слияние по каждому pull request-у, разбираться с каждой проблемой и вообще делать то, чего вам делать не хочется, по любым причинам. Если вы будете работать через силу, это со временем охладит ваш энтузиазм и может привести к гибели проекта – а вот это уже серьёзная проблема!

Поэтому периодически задавайте себе вопрос: «Я занимаюсь этой задачей, потому что хочется или потому что вроде бы надо?» В последнем случае, возможно, стоит сделать передышку, поработать над каким-то другим аспектом проекта, посмотреть на задачу под другим углом или вообще отправить ее в бэклог еще на недельку и не упрекать себя за это.

Заключение


Помимо перечисленного выше за эти годы я, разумеется, научился и многим другим вещам, в том числе и связанным с Python – в одну статью всё не поместится. Но когда я возьмусь за следующий проект (возможно, что-то на Golang?), все эти уроки останутся со мной. Надеюсь, что и с вами тоже.

Если моя статья вдохновила вас наконец-то запустить проект или изменить подход, с удовольствием послушаю вашу историю. Можете связываться со мной напрямую через форму связи на сайте SpiderFoot – я получаю все сообщения и лично отвечаю на всё, кроме спама.

Также мне хотелось бы поблагодарить людей, которые сыграли ключевую роль в этом опыте: свою семью за неизменную поддержку и терпение, _bcoles за его вклад и советы, hakluke и его команду контентеров за то, что помогли мне заявить о себе, и огромное число людей, которые за эти годы принимали участие в проекте и помогали SpiderFoot развиваться.

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


  1. AlexeyPolunin
    31.07.2023 20:37
    +1

    Он по делу конечно все пишет, но вот если нет основной работы или финансирования - вот тут-то и начинается самая жара.

    Подтащите статью, как он в коммерцию его переводил - будет интересно.