Skip to main content

Как Армия и open-source помогли мне стартануть карьеру

Если ты в кризисе — не накручивай опыт. Создай его. Это бесплатно

Post cover where Kas sitting with his officer

⚠️ Не трать время на чтение, если тебе здесь не откликнется

До open-sourceПосле open-sourceСейчас
Временной период2014-2016с 20172025
Возраст23-252633
ПолМальчикМужчинаЗафисит от результатов спринта
РольРазнорабочийFront-end разработчикЛидер платформы по построению интерфейсов (неколько десятков команд)
Эмоциональное состояниеОтчаяниеВоодушевлениеПривязанное к релизному циклу
Я и HRыОтказы и тишинаЗавал предложенийНе в поиске, переодические профильные предложения
Состояние карьерыНеопределенность и застойОпределенностьОщущение контроля (или иллюзия)
Отношение к open-sourceСтрахУдивлениеБлагодарность и желание больше в это инвестировать
В постеЭтап описанКак к нему пришелТолько для этого блока. Чтобы показать, что все в конечном итоге сложилось неплохо

🚧 Пустыня отчаяния

К 2016-му году я несколько лет как работал разнорабочим разработчиком - проекты/задачи на php, вертска, desktop. Одновременно учился в аспирантуре и параллельно была непрофильная part-time занятость. Доход непостоянный. Работа фултайм оставалась мечтой, к тому же чувствовал, что стою на месте и одна половина знаний быстро устаревает, а вторая - это новые поверхностные которые быстро попадают в первую категорию

Я понимал, что в кризисе и не знал как из него выбраться, на каком я этапе и за что хвататься. Одно было точно - я хочу разрабатывать программное обеспечение.

В отсутствии четкого рецепта я продолжал искать себя, искать то, что мне откликается. Я стал активно перебирать технологии

Desert of despair - before

Я в тот момент

По мере их изучения (технологий) я понимал, что тяготею к разработке GUI. Это как-то по милленеаловски - для меня программа это было всегда то, что я могу кликать. Плюс как разработчику мне нравился моментальный отклик на любые изменения. Но вот незадача - все что я использовал/пробовал для разработки GUI мне не нравилось. То есть болей было больше чем плюсов. DX был ужасным, а UI/UX был тяжел в кастомизации

warning

Ниже идет список направлений которые я протестировал и причины по которым они мне не зашли. Эти разделы можно пропустить и перейти к следующему "Озарение"

GUI на QT (C++)

  • проект на Qt - это C++, а значит, долгие сборки, хрупкий toolchain, и головная боль от moc, qmake, cmake, .pro, .pri файлов
  • Qt Creator - тяжёлый IDE, который на слабых машинах еле дышал
  • разные версии Qt могли конфликтовать с системными зависимостями. Особенно ад был на Linux - отсутствие нужных пакетов, несовместимые glibc и т.п
  • даже простые формы выглядели как некрасивый бизнес-интерфейс из начала нулевых
  • делать кастомную стилизацию - боль
  • в то время не было нормальных курсов и документации на русском, приходилось лазить по устаревшим форумам
  • под Windows Qt работает нормально, под Linux - зависит от окружения и библиотек, под macOS - костыли

GUI на JavaFX

  • мёртвый комьюнити - JavaFX давно не на волне. И даже в те годы когда он позиционировался как новый шаг для построения GUI, реакции от сообщества я не увидел
  • тяжеловесность - запуск Java-приложения для простой панели - это как арендовать грузовик, чтобы перевезти рюкзак
  • проблемы с интеграцией в браузер - это отдельный кошмар. В те года меня задело легаси в виде аплетов, поэтому я на это обращал внимание

GUI на PHP Оговорка сразу - PHP как шаблонизатор. В какой-то момент он часто фигурировал в контексте такого паттерна. Это и меня не обошло стороной

GUI на jQuery

  • отсутствие принятых сообществом стандартов - в построении клиентских приложений где сердцем является jQuery. - каждое приложение отличается от другого как день и ночь
  • императивный ад - каждый шаг UI — это отдельный клик/обработчик/костыль
  • проблемы с масштабируемостью - сложнее поддерживать состояние, особенно при нескольких компонентах
  • глубокий техдолг - UI на jQuery быстро превращается в spaghetti-code, особенно без модульности

Подходит для кнопки “показать/скрыть”, но не для полноценного интерактивного виджета/приложения

GUI на XSLT (с трансформацией XML)

  • это пытка - подход на XSLT это будто бы ты пишешь UI в формате бухгалтерской отчётности
  • большой порог вхождения. XSLT это не язык, а язык трансформации. Ошибку дебажить — страдание
  • невозможность реактивного обновления. Всё построено на "трансформировал → показал". Забудь про динамику
  • кроссбраузерность плохая. Особенно в условиях, где нет стабильных версий браузеров

Подойдёт разве что для генерации печатных форм. Но не UI в нормальном смысле

GUI на Android

  • XML-маркировка интерфейсов была неудобной
  • работать с RecyclerView и ListView — как собирать IKEA без инструкций
  • анимации? Нет, спасибо
  • поддержка разных экранов, dpi, ориентаций — вечная головная боль
  • Android 2.3 (Gingerbread), 4.0 (Ice Cream Sandwich), 4.1–4.4 (Jelly Bean/KitKat), 5.0 (Lollipop) — каждая версия со своими багами, UI API, багами рендеринга и различиями в поведении
  • любое неправильное обращение с WakeLock, Services или AsyncTask могло просто убить батарею. А ты об этом узнаешь... в отзывах

Озарение

Помощь от Habr И вот в один момент я наткнулся на habr на статью которая сравнивала React и Angular и тут-же сделал следующие вывод

Зачем мне desktop и "fullstack" интерфейсы (с участием php и java)? Ведь проще передать кому-нибудь ссылку, нежели бинарник

Чем зашел Angular

Это был просто шок. Вот я пишу на jQuery и тут я получаю

  • двусторонняя привязка данных
  • ng-if, ng-repeat, ng-show — и всё реально работает
  • $scope, $http, $watch — магия реактивности, без ручной подписки
  • шаблоны в HTML, логика в контроллере, сервисы — всё разнесено по слоям
  • Ты просто пишешь {{name}} — и оно появляется. Без document.createElement

Это был настоящий фреймворк, а не библиотека-костыль. Он не просил «допиши здесь», он строил архитектуру.

И пусть он тормозил, но это было в 1000 раз чище и концептуальнее, чем любой мой опыт до этого

Чем зашел React

Тут у меня произошел отвал

ЭффектПочему это было вау
Компоненты как функцииТы больше не описываешь DOM руками. Ты пишешь `UI как функции от состояния. И это работает
JSX Шок: HTML прямо в JavaScript? Это нарушает все догмы... но это невероятно удобно
Virtual DOM"Он пересчитывает только то, что нужно" — значит, я могу просто описывать, как должно быть, а не мутировать DOM вручную. Никаких getElementById
Однонаправленный поток данныхПрозрачное понимание: данные идут сверху вниз, нет магии. Это облегчает отладку в разы
Состояние внутри компонента (setState)Не нужно связывать форму через 100 обработчиков событий. Всё логично, внутри, локально
Инструменты разработчикаReact DevTools был магией — можно видеть дерево компонентов, отслеживать state/props
Портируемость и масштабируемостьПишешь компонент один раз — используешь везде. Даже в другом проекте. Даже через npm

После ряда статей, начал тонуть в куче инструкций и туториалов и первым что проработал был AngularJs. Но, не все так просто

Распутье

Пока я всем этим занимался, время защиты диссертации подходило все ближе и вот стоял выбор

  • работа преподователем экономической теории
  • или продолжать заниматься разработкой и полностью переходить во Front-End

У каждого из этих пунктов были свои плюсы и минусы

Работа преподователемРабота разработчиком
ДеньгиМалоБольше
ИнтересностьНачало утомлятьИнтересно
Чтобы перекатитьсяНужна защита диссертацииНужно сходить в Армию

Получив такой расклад, я осознал, что склоняюсь ко второму пункту. В нем я нашел следующие плюсы

  • служить всего год
  • займусь здоровьем
  • заодно отдохну (катастрофически невысыпался)
  • а наукой, если будет время и желание, всегда смогу заняться

Путь в Армию

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

Стал искать решение. Нашел следующие варианты службы которые позволят параллельно инвестировать в знания

  • какая-то полугражданская служба связанная с почтой россии. Не помню детали, но там было что-то про службу в 2 года (или больше). Не годится
  • служба в научной роте. Хм, интересно. Направил 3 письма в разные роты

Ответ пришел из двух, но мне больше всего понравилась рота МЧС

Расписывать долго, вкратце - из двух заданий которые мне дали в качестве вступительных сделал одно и по его результатам меня и взяли

Задания были такими

  • ⛔ написать модель прогнозирования техногенных катастроф (или пожаров, не помню)
  • ✅ написать систему по автоматизации одного процесса (написал на AngularJS, PHP)

Процесс был крайне увлекательням. Я слишком поздно подал заявку на службу и у меня оставалось 11 дней

  • на первое задание я потратил 3 дня
  • 1 день ушел на то, чтобы приехать и сказать, что я не справился
  • 7 дней ушло на создание рабочей версии. Пришлось самоизолироваться на все эти дни и жить только этой задачей

🪖 Армейская служба

И вот 2017 год. Я прошел КМБ в Ногинске и уже прохожу службу в научной роте. Распорядок такой

  • с утра — лаборатория, лекции и код
  • вечером — наряды и армейский быт

У каждого из моих сослуживцев была своя конкретная задача. Среди нас были физики, математики, разработчики - кто что делал понятно

Моей задачей было написание системы для НИЦ (научно исследовательский центр). Так вот офицер который был Product Owner данной системы каждый раз когда приходил, задавал одну и туже последовательность вопросов

Офицер: Ну что Кас, как дела с сайтом?
Я: докладываюсь
Офицер: Сколько строчек кода написал?
Я: в ступоре

До этого момента меня ни разу не спрашивали про строки кода. Да и сам я не интересовался

📦 День 1 — MVP

Провожу свой день в наряде по узлу связи. Его суть сводилась к следующему

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

Почему я каждый раз перед докладом вручную делаю прогон скрипта который считает LOC? Я вообще не хочу этим заниматься. Надо это автоматизировать. Пусть когда офицер открывает систему видит виджет который отражает текущее число строк

В итоге начал исследовать эту тему в перерыве между заявками и наткнулся на вопрос на StackOverflow. Тезисы

  • как я хочу реализовать быстро сделать не получится
  • у GitHub нет API которое мне нужно
  • но у GitHub есть ручка которая позволяет приблизительно посчитать эту цифру. И вцелом, для поверхностного анализа ее хватает

Мое внимание привлек один ответ в котором содержался следующий сниппет

'use strict';

async function countGithub(repo) {
const response = await fetch(`https://api.github.com/repos/${repo}/stats/contributors`)
const contributors = await response.json();
const lineCounts = contributors.map(contributor => (
contributor.weeks.reduce((lineCount, week) => lineCount + week.a - week.d, 0)
));
const lines = lineCounts.reduce((lineTotal, lineCount) => lineTotal + lineCount);
window.alert(lines);
}

countGithub('jquery/jquery'); // or count anything you like

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

  • скачал IDE
  • спулил исходники системы, чтобы на этом ПК они тоже были (служить предстояло еще месяцев 10, и я точно понимал, что они тут пригодятся)
  • и начал искать способ как посчитать LOC в private репозитории
  • быстро сгенерил токен, поправил скрипт и увидел нужный мне результат

Как сейчас помню, откинулся на спинку кресла и стал наслаждаться этим моментом. Именно тут я ощутил переломный момент и что я выхожу из пустыни. Хотя скрипт не мой, задача мега-супер-тривиальная, но именно ощущение того, что я начинаю решать свои проблемы. Внезапно влетает товарищ майор и обращает внимание на то, что я слишком счастливый, а рядом лежит непочиненное оборудование. Я быстро запушил результат в репу и бросился разбираться с чем-то. Вроде ПК, но могу ошибаться. И когда работа была готова я понял, что не знаю кому относить и как фиксировать эту заявку. Благо у оборудования был инвентарный номер и мне сказали куда нести. Только вот, видимо, офицер переезжал с кабинета в кабинет и я принес компьютер не туда. В конечном счете худое испуганное лицо рядового сыграло мне на руку и сильно на меня ругаться никто не стал

⚙️ День 2 — тесты

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

Офицер: Как это получилось?
Я: рассказываю
Офицер: Это надо убрать и доступ закрыть
Я: Исходники в приватном репозитории
Офицер: Но ты же как-то туда получил доступ по ссылке
Я: Аутентифицировавшись по токену который выпускается в личном кабинете
Офицер: Значит кто угодно может получить доступ
Я: Если у них есть мой логин и пароль
Офицер: Ну у тебя же он есть
Я: в замешательстве

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

🚀 День 3 — публикация

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

Наряд выпал на субботу, и в день когда я буду половину дня в наряде а во второй уйду в увольнение. Как только я пришел на узел связи утром, у меня образовалось свободное время в виде 1 часа до завтрака с подразделением

Я

  • быстро нашел инструкцию по разработке расширений
  • изучил процесс публикации и понял что мне нужно 25$
  • спроектировал логотип, название, обертку
  • и отправил домой сообщение, что по приезду мне нужно часа 4 и 25$ на карте (ох времена когда оплатить из РФ можно было счет из любой точки мира)

В увольнении

  • ⛏️ напилил расширение (Gloc chrome extension)
  • 🎨 доделал логотип и описание
  • 💰 заплатил $25 за размещение в Chrome Web Store
  • ✅ отправил всё на модерацию

С тех пор прошло 8 лет за которые

  • вышли десятки релизов
  • мигрировал проект на React
  • работал с пользователями. Самые проблемные отзывы - это одиночные сообщения или комментарии что ничего не работает или просто одна звезда
  • боролся со спамом. Множество небольших компаний пытаются купить нишевые расширения
  • один раз такое "партнёрство" превратило расширение в malware — но это отдельная история
  • были внезапные хотфиксы по невнимательности
  • решение вопросов производительности и оптимизации. Это было не похоже на типичные Front-End приложения. Например у меня были версии которые работали долго весом в несколько KB и быстро работали весом в несколько MB. И из-за особенностей типа приложения просадки превращались в блокеры

💎 Что это мне дало

Как разработчику

Получить новые знания

  • разработка нового типа ПО
  • поддержка - работа с отзывами, багфикс, улучшения, миграции на новые стандарты браузеров и магазинов расширений, работа с представителями магазинов
  • маркетинг - исследование конкурентов и формирование бэклога
  • мониторинг - анализ статистики установок, активности, отзывов. И учет этой информации в составлении бэклога

Сделать следующие выводы

  • людям важна интуитивность а не чтение документации. Дисклеймеры/оправдания их не интересуют
  • люди чувствительны к неудобствам
  • люди очень внимательно относятся к вопросам информационной безопасности. Был случай когда я добавил запрос дополнительного разрешения (сейчас уже не вспомню зачем). Так на следующий день после релиза я получил много гневных сообщений с инструкциями о том куда мне идти и как долго
  • если предоставить удобные точки контрибуции, то сообщество быстро включится в процесс. У меня это стало
  • единый конфиг точек монтирования виджета. Каждый мог легко его поправить
  • интернационализация - файлы и google форма
  • если идея попала в точку и ей дан неплохой старт (в моем случае StackOverflow), то сообщество само подхватывает ее и начинает предлагать новые решения, инструменты, фичи, искать баги и популяризовать его. В какой то момент уже этот продукт начинает самопозиционироваться, то есть говорить его владельцу чем он должен быть
  • даже маленький продукт требует большого количества усилий, уязвимостей и потенциальных векторов развития. Я стал лучше осознавать сложность всего цикла работ и каждого этапа над продуктом

Как соискателю

Буст профиля на StackOverflow и на GitHub

Когда я выходил на поиск работы, то не я откликался на вакансии, а ко мне приходили рекрутеры именно после просмотра моих профилей. Зачастую это были самые приятные собесы где меня спрашивали про этот проект и про то как я решал конкретные задачи. Разумеется - это был фрагмент беседы, а не все интервью. Да и на тот момент уже было несколько небольших open-source (wordpress тема, мини 3D игра)

Понял, что преимущество open-source для этого этапа еще и в том, что это публичная активность в отличие от типичной работы, что тут все исходники открыты, продукт в live режиме. И тут HR может изучить то как ты общаешься с community, а те кто проводят tech-интервью посмотреть на код

Ну и само приложения неплохо забустилось, просто по инерции. Ниже статистика по пользователям

Gloc chrome extension

Скрин кабинета на текущий момент

📈 Эффект приложения на языке фактов

  • 🔥 600+ звёзд на GitHub
  • 📊 2300+ репутации на StackOverflow (больше 30% от общей репутации моего профиля)
  • 🧊 Проект попал в GitHub Arctic Vault
  • 📚 Упоминания в книгах:
    • Code Clone Analysis. Research, Tools, and Practices (2021)
    • Service-Oriented and Cloud Computing (2018)
  • 💬 Упоминания в публикациях на StackOverflow, Dev.to, блоги, отзывы, переводы на десятки языков
  • 📥 Использовался преподавателями, студентами, писателями, разработчиками
  • 👥 знакомство с десятками энтузиастов по всему миру - разработчики, дизайнеры, исследователи

🧠 Что я понял про open-source

Desert of despair - after

  • Open-Source — это про страсть, а не идеальные условия
  • Людям важна интуитивность, не документация
  • Даже маленький проект требует огромного внимания к UX, безопасности и мониторингу
  • Если дать удобные точки входа, сообщество само включится в развитие
  • Даже простой виджет может сделать твой GitHub/StackOverflow профиль заметным
  • Нам еще много нужно построить прежде чем мы очутимся в мире Трансгуманизма Пелевина. И часть из этого много можешь стать именно ты. И я - разумеется )
  • Что изменилось фундаментально во мне? Да почти ничего. Я как был энтузиастом разработки, так таким и остался. Просто теперь это стало очевидно не только мне

🙏 Благодарности

  • Министерству обороны и АГЗ МЧС — за опыт и как платформу для разностороннего развития
  • Microsoft Edge Store - за приглашение в числе первых разработчиков протестировать загрузку браузерных расширений
  • Curtis Conard — за мой первый донат
  • Laura Reen — за бесплатные иконки и логотип к приложению
  • Переводчикам и контрибьюторам со всего мира ❤️
  • Habr за огромное количество статей. Особенно про истории которые вдохновляют и помогают сделать правильный жизненный выбор

Open-Source не только для людей с именем Линус и продуктами всемирного масштаба. Просто найди проблему, которая бесит тебя лично и реши ее

Когда будут критиковать, отбрось эмоции и услышь рациональное зерно. У сообщества нет времени на романтику, но есть на дельные советы. Коллективный разум - рулит

Open-Source - это путь, это шанс что-то изменить и приглашение туда до сих пор активно. Тебя ждут