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

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

До open-source

После open-source

Сейчас

Временной период

2014-2016

с 2017

2025

Возраст

23-25

26

33

Пол

Мальчик

Мужчина

Зафисит от результатов спринта

Роль

Разнорабочий

Front-end разработчик

Лидер платформы по построению интерфейсов (неколько десятков команд)

Эмоциональное состояние

Отчаяние

Воодушевление

Привязанное к релизному циклу

Я и HRы

Отказы и тишина

Завал предложений

Не в поиске, переодические профильные предложения

Состояние карьеры

Неопределенность и застой

Определенность

Ощущение контроля (или иллюзия)

Отношение к open-source

Страх

Удивление

Благодарность и желание больше в это инвестировать

В посте

Этап описан

Как к нему пришел

Только для этого блока. Чтобы показать, что все в конечном итоге сложилось неплохо

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

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

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

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

Я в тот момент
Я в тот момент

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

Внимание

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

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$ на карте (ох времена когда оплатить из РФ можно было счет из любой точки мира)

В увольнении

  • ⛏️ напилил расширение

  • ? доделал логотип и описание

  • ? заплатил $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-интервью посмотреть на код

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

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

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

  • ? 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

  • Open-source — это про страсть, а не идеальные условия

  • Людям важна интуитивность, не документация

  • Даже маленький проект требует огромного внимания к UX, безопасности и мониторингу

  • Если дать удобные точки входа, сообщество само включится в развитие

  • Даже простой виджет может сделать твой GitHub/Stack Overflow профиль заметным

  • Нам еще много нужно построить прежде чем мы очутимся в мире Трансгуманизма Пелевина. И часть из этого много можешь стать именно ты. И я - разумеется )

  • Что изменилось фундаментально во мне? Да почти ничего. Я как был энтузиастом разработки, так таким и остался. Просто теперь это стало очевидно не только мне


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

  • Министерству обороны и АГЗ МЧС — за опыт и как платформу для разностороннего развития

  • Microsoft Edge Store - за приглашение в числе первых разработчиков протестировать загрузку браузерных расширений

  • Curtis Conard — за мой первый донат

  • Laura Reen — за бесплатные иконки и логотип к приложению

  • Переводчикам и контрибьюторам со всего мира ❤️

  • Habr за огромное количество статей. Особенно про истории которые вдохновляют и помогают сделать правильный жизненный выбор


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

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

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

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