Рассказ пойдет о моем первом опыте трудоустройства в IT‑компанию после нескольких лет фриланса: что лично я открыл для себя, с чем столкнулся, чему научился. Мой стек — LAMP, разрабатываю преимущественно на Wordpress, также Symfony и Laravel.
Трудоустройство
Давным‑давно мне надоело быть фрилансером‑программистом с многолетним опытом. Я решил попробовать свои силы в работе в штате. Открыл сайт вакансий, разослал резюме.
Приходит ответ — приходите на собеседование в zoom в болгарскую ИТ‑организацию, работавшую для крупного СМИ на позицию «Программист WordPress»
Этап 1. Собеседование и техническое интервью — два в одном.
Меня собеседовали 2 человека.
Будущий руководитель задавал вопросы из теории PHP, в частности ООП и по WordPress. Глава офиса задавала разные вопросы, касавшиеся меня лично.
Последний вопрос был: «Три слова, характеризующие меня». Я решил выпендриться, сказав «Numquam dicere nunquam» (лат. «Никогда не говори никогда»), и сразу же подумал, что зря. Через некоторое время мне прислали тестовое задание.
Этап 2. Тестовое задание.
Время на него было только в выходные дни. Задание было хитрым: несложное, но нужно было внимательно прочитать. Требовались знания хуков WordPress и аякса. Многие нюансы я обнаружил еще раз прочитав задачу, когда думал что она выполнена. Задачу приняли, мне сделали предложение («оффер» на англо‑русском суржике), я пошел работать.
Работа
Работать было не сказать что трудно, опыт фриланса помог задачи выполнять быстро.
За месяц работы я написал несколько плагинов и исправил серьезные баги., Мне досрочно закрыли испытательный срок и прибавили зарплату, сказав что я очень хорош.
Признание меня окрылило, я забыл про всякие «синдромы самозванца».
И все, думаю, так бы и продолжалось, но компания решила взять еще одного человека С. на позицию «Старшего программиста WordPress».
Теперь со старшим
Ну берут и на здоровье.
Но только его поставили надо мной и он развернул бурную деятельность. Сейчас я понимаю, что без этого вообще работать никак нельзя, но тогда мне многое приходилось изучать и срочно с нуля — на фрилансе это не практиковалось или практиковалось отчасти.
Вводится «проверка кода» (code review) — все что идет в ветку master, должно проходить через «запрос изменений» (pull request), который в свою очередь проходит сперва автоматизированную проверку — php code sniffer, phpstan и другие. А также должен был проверить еще один разработчик. Это было реализовано через bitbucket ci.
Вводится стандарт на «виртуализацию» на рабочих машинах. Я на тот момент использовал lando и иногда devilbox, стандартом стал vagrant. Тут скорее для меня был шаг назад, я считаю это менее удобным решением, да и работал у меня он менее стабильно, но это уже был вопрос привычек и вкусов.
Обязательное документирование всего кода, а также наработок. Справедливости ради для того же «вагранта» он предоставил развернутое руководство, видимо, наработанное еще до прихода в организацию.
Кроме того С., сделал разные удобные интеграции. Например, оповещение в slack из bitbucket о том, что создан новый pull request, требующий проверки.
Все бы ничего, да этот новый разработчик был высокомерен, никогда не отвечал прямо на вопрос. Как мне казалось, нарочно использовал то, что болгарский для меня неродной и многих идиом и крылатых фраз я просто не знаю. Я подчас с трудом понимал что он говорит и пишет. К счастью, стандартом для общения в Jira и bitbucket был английский, с этим можно было жить.
Но больше всего меня шокировал его код. Я писал на php много лет, реализовал много даже достаточно сложных проектов и думал, что знаю очень многое, но посмотрев его код, я тогда открыл для себя очень много нового. Вот немногое из того, с чем я столкнулся впервые:
? «стрелочные функции» — на тот момент это было недавнее введение,
? «строгая типизация»,
? «троичный оператор»,
? применение менеджера пакетов и автозагрузки классов composer.
Я не то, что не знал, как это работает и для чего это нужно. Я даже не знал как это называется и поэтому не мог гуглить. За исключением последнего пункта — для автозагрузки классов я использовал свой изобретенный «велосипед».
В тот момент тяжело болел один из моих близких родственников, и я растерял сосредоточенность, стал допускать ошибки в своем коде. С. акцентировал внимание нашего общего руководителя, представив меня (но правда справедливо) в нелучшем свете.
Мой непосредственный руководитель, который был в курсе моих проблем, и что я много провожу времени в больнице, предложил мне взять отпуск за счет организации.
Это был вечер пятницы, под конец рабочего дня. Я сказал что все в порядке, за выходные высплюсь и снова в строй.
Быть уволенным не хотелось, и особенно не хотелось вылететь за «непрофпригодность», я решил мобилизоваться.
Сразу после рабочего дня мной был куплен курс advanced php, и я в тот же вечер его прошел «на перемотке», выполнил финальное задание, но ничего нового не узнал.
Стал читать документацию по последним версиям php и внимательно изучать код С. Также дотошно изучал замечания, которые С. делал во время проверки моего кода и других программистов. На каждое такое замечание смотрел разные стандарты и правила. Чуть позже стал замечать и его ошибки в комментариях к моему коду, на которые писал развернутые возражения со ссылками на стандарты и stackoverflow. За неделю‑две я заполнил многие пробелы.??
Теперь я старший
Через месяц я стал старшим программистом. Был переведен в другой отдел, где уже надо мной не было никакого другого программиста. В круг моих обязанностей добавилось:
проверка тестовых заданий других соискателей;
обучение «младших» программистов;
проверка кода всех программистов, во всех стеках (а точнее PHP, JS, а также верстку HTML/CSS)
JavaScript я знал очень поверхностно, за месяц прошел курс по продвинутому JS, что позволило мне проверять и этот код тоже.
Некоторые мои достижения.
Самое главное - на всех звонках, когда поднимался вопрос оптимизации работы, я выходил с предложением сократить количество звонков. В результате, с начала моей работы 4 обязательных каждодневных звонка + множество произвольных в день сократились спустя несколько месяцев до трёх в неделю регулярных и 0-2 каждый день, т.е. количество звонков снизилось в 6 раз.
Написал множество нетривиальных плагинов, один из примеров-заморочек для меня - общение iframe с родительским окном в две стороны. Кроме того, переписал один из ранее написанных плагинов. С руководителем состоялся любопытный разговор:
— Плагин был предыдущим разработчиком написан ужасно, с несоблюдением стандартов и здравого смысла, его трудно поддерживать, я его переписал.
— А кто предыдущий разработчик?
— Я.
Разработка документации. Например, я составил краткую инструкцию «взлет‑посадка» по git для «джунов», Например, как работать с git bisect.
Наставничество для новых сотрудников. Я наработал репутацию в коллективе, «менторил» в разное время двоих джунов. Одного уволили за дисциплинарные нарушения — срывал сроки и прогуливал звонки (мои увещевания не помогли), второй же стал очень быстро «старшим» (senior) после чтения документаций и моих подсказок в коде.
Синдром самозванца сменился «синдромом вахтёра» при проверке чужого кода. Особенно много прений возникало на тему «поднятия» в JS (hoisting) и о том что использовать оператор var неправильно — «в двубортном уже давно никто не воюет».
Множество нетривиальных плагинов, один из примеров заморочек для меня — общение iframe с родительским окном в две стороны.
Составил правила для проверки js в CI («linting»). C. был только php‑разработчиком, инструменты для работы с js он не знал, поэтому за эту задачу даже не брался.
Отношения с С. оставались напряженными, но я и не рвался по каким-то ещё вопросам, кроме рабочих, обращаться. Я проработал два с небольшим года, потом начался ковид. Всех перевели на удаленную работу. Затем наш офис разработки закрыли, т.к. всегда найдется тот кто сделает дешевле, и это, как обычно, были индусы.
Что я приобрел от работы в штате…
В бытность фрилансером я варился в собственном соку. Это как тренироваться в одиночку без тренеров и других соперников, а потом поехать на соревнования и «отхватить» от тех, у кого все это есть. В штате более заметная конкуренция — «чуть сон взял верх — задние тебя сомнут».
Фрилансеры работают чаще всего на мелких проектах, чьих‑то стартапах, но чаще всего — на однотипных задачах. Что‑то поменять, что‑то добавить, сделать лендинг, простенький интернет‑магазин. Можно вполне успешно это делать на php версии 5.6 и не знать что уже на дворе 7-й или 8-й с множеством новшеств.
Так как проекты мелкие, фрилансер даже не узнает о разных b2b‑решениях. Например, таких как permutive. Да и такие популярные вещи как Jira, slack, Jenkins фрилансеры практикуют крайне редко.
Фрилансер — почти всегда одиночка, он может работать вместе с дизайнером или верстальщиком, но на своем участке он единственный. В организации же не редкость командная разработка.
Никто не будет проверять код фрилансера, разве что когда заказчик сам разработчик. Если фрилансер не заморочится какими‑нибудь автотестами, то о багах он узнает только от заказчика. Здесь же и qa, и разное автоматизированное тестирование, и «проверяльщики» с «синдромом вахтёра».
Фрилансер — часто самоучка. Я один из них. Моя специальность по диплому — экономист‑международник. Некоторые онлайн‑курсы не в счет. Но даже фрилансеры‑выпускники технических вузов, или студенты этих же вузов, не знают прикладных вещей. «Хуки вордпресса» не преподают ни в каком вузе. В штате можно получить «ментора» и к тому же бесплатно. А также курсы, разное корпоративное обучение и много чего еще.
Фрилансер тратит много времени на поиск заказов, во всяком случае, на начальных этапах. Здесь же можно сосредоточиться непосредственно на коде или на обучении. Да, много звонков и разных согласований, от которых «не откосить».
Штатный сотрудник получает зарплату, даже если в какой‑то момент задач нету. Тебя с меньшей вероятностью обманут — ты защищен трудовым законодательством, при сокращении тебе не скажут «я передумал/меня самого кинули/конечный заказчик уехал в Занзибар», а выплатят компенсацию.
Закон защищает когда номинально, когда реально от многих других вещей. Начальник не скажет, что «пацанов подошлёт», если что‑то не будет сделано, а фрилансером я редко‑редко, но такое слышал.
В организациях очень много «старого кода» — legacy, чуть ли не большая часть всего что было. Тут изолентой замотано, здесь временная подпорка 5 лет стоит, тут непонятно как устроено — программист уволился, документации не оставил, здесь непонятно зачем вал вкорячен, вроде ни на что не влияет, но вытащишь — все начинает дребезжать и разваливаться. Когда я с таким сталкивался на фрилансе, я либо отказывался, либо убеждал заказчика «Овчинки не стоят починки. Чем старое чинить, лучше новое купить». Благо проекты небольшие и сделать новое действительно можно было быстро и избежать проблем безопасности, например. Здесь же может быть код — результат многолетней работы, к тому же постоянно используется. Нельзя вот так просто остановить поддержку и доработки и переключиться создание с нуля. На legacy переводят в первую очередь усидчивых и опытных. И именно здесь быстрее всего развиваются все навыки программирования, в т.ч. и секретная способность «читать мысли».
Работа с высоконагруженными ресурсами. Обычный проект фрилансера — небольшая посещаемость ресурса, никакая нагрузка, небольшой код (тема для того же wordpress на 5–10 страниц), крохотная база данных. Здесь же нагрузка в тысячи, десятки тысяч посещений, а то и более. Данные на сервере — десятки и сотни гигабайт, что‑то выносится на Google BigQuery. Попробуй останови это все хоть на пару минут. Ни о какой работе прямо на сервере, что так любят делать фрилансеры, и речи быть не может. Можно правда делать это на сервере в окружении разработки, но это не сильно поощряется. А клонировать все это на локальной машине — работа не на один час, когда ты просто смотришь как все это скачивается, распаковывается, импортируется, иногда забивает все свободное пространство или просто машинка не вытягивает.
Кроме того, организационные моменты — ты по‑прежнему творец, но ты работаешь в установленных графиках и соблюдаешь стандарты, отчитываешься по установленным формам. В рабочее время ты должен быть доступен, все форс‑мажоры подтверждаешь документально. Прием «умерла третья бабушка», столь любимый недобросовестными исполнителями, здесь не сработает.
К слову об организационных моментах. Здесь я впервые на практике освоил все эти «спринты», «спринт ретроспективы», «сторипоинты» и прочее.
Работа «на дядю» гораздо лучше работы на «множество дядь и тёть»
… и что потерял
Но были, естественно, и потери.
Личная свобода. Тут не все однозначно. С одной стороны, когда ты фрилансер, ты можешь ложиться и вставать когда захочешь, в любой день устраивать выходной или даже отпуск. С другой же - в фирме ты работаешь с 9-ти до 18-ти и в остальное время делаешь что хочешь. Если даже ты трудоголик и кроме своего кода в жизни ничего не интересует, работа отправит тебя в отпуск принудительно, иначе у самого работодателя будут неприятности.
Фрилансер может выбирать с кем работать, а с кем нет, за какую задачу браться, а в какой отказать. На работе тебе ставят задачу и ее нужно выполнить, интересна она тебе или нет.
Твой служебный компьютер тоже будет отвечать корпоративным стандартам, подчас не всегда удобным. Я привык работать в линуксе, мне выдали ноут с “виндой” и не разрешили её менять ни на что.
Фрилансером я работал под псевдонимом nikita.global, развивал личный бренд, на сайтах, которые я разрабатывал всегда была ссылка на разработчика. В штате это едва ли возможно.
Как я уже писал, фрилансеры часто работают с однотипными задачами. Можно написать один раз платежный шлюз для WooCommerce и использовать его снова, когда кому-то понадобится такой же. Набив руку на одном интернет-магазине, можно их создавать вновь и вновь с небольшими отличиями. В случае найма задачи всегда разные.
Чем полезен опыт фрилансера при переходе в штат
Фрилансер — не новичок, он может многого не знать, но быстро научиться. Тем более работу все же дадут сначала по его выявленным при приеме знаниям, а его будущий рост уже зависит от него.
Фрилансер привык работать быстро и чаще всего в стрессовой ситуации, когда постоянно получает от заказчиков новые вводные, о которых якобы он говорил, или о том что сделать надо было «вчера». В офисе такое тоже возможно, но все же есть некоторые представления о деловом этикете, большинство действий и решений запротоколировано, и тебя защищает множество законов. В моем опыте было «сделать надо было вчера, я сто раз говорил» на голосовых звонках. Я это вылечил составлением протокола после каждого звонка.
Для фрилансера не проблема поработать сверхурочно За счет этого его производительность снова выше.
Что делать фрилансеру, который хочет пойти в найм
«Везде исследуйте всечасно, Что есть велико и прекрасно»
М.В. Ломоносов
Если коротко, то повышать свою ценность для работодателя. Приведу частные моменты.
Учиться, не стоять на месте. Фриланс, я считаю, это деградация для программиста, если он не обновляет и не расширяет свои знания. Как именно? Тут всё индивидуально:
Курсы, менторы, читать чужой код, читать умные книги, экспериментировать.
Читать документацию от первоисточников. например, читать все материалы php.net, wordpress.org.
Прокачивать навыки технического интервью, да и просто собеседований. В интернете есть много записей реальных интервью. Можно ходить на собеседования хоть каждый день, затем выписывать трудные вопросы и готовиться по ним. Заваленное собеседование — это опыт, новые знания, а не последний шанс устроиться.
Сюда же — подготовиться морально к тому что ты знаешь далеко не все. У каждой организации свои стандарты, свои принятые инструменты, свои используемые сервисы. Важно понимать что и работодатель редко встречает кандидатов, которые знают всё и работали со всем, что используется у него.Лично я говорю: «По правде, я никогда не имел дел с Kafka, есть некоторый опыт с RabbitMQ, мне будет интересно попробовать, думаю, разберусь быстро».
Очень часто один из этапов трудоустройства — онлайн задачи на популярных ресурсах. Задачи простые и «со звездочкой». Все они легко гуглятся, можно тренироваться на досуге.
Странность работодателей — написать какой‑нибудь код на бумаге. Его никто не любит из соискателей, даже ведутся черные списки таких работодателей, но это данность, с которой можно столкнуться.
Вам не помешают какие‑то публичные проекты — пакеты для packagist или npmjs, плагины для публичных репозиториев, например wordpress plugins. Особенно если у вас чистое резюме и не так много примеров работ.
Минимальный необходимый набор знаний
Эти знания по‑хорошему нужны и фрилансерам, но лично я не встречал полный набор всего вышеизложенного. Да и сам не обладал им.
Английский язык — стандарт в ИТ. Это и собеседование с зарубежным работодателем, это и доступ к первоисточникам, независимо от того в какой стране они составлены.
Базовые моменты ООП. Основные принципы, почитайте терминологию, можно даже выписать на карточки для заучивания иностранных слов. Если не будете плавать в этих вопросах, сможете рассчитывать на middle или senior‑уровень. Самые частые вопросы — «Что такое полиморфизм?», «Почему синглтон — антипаттерн?».
git — система контроля версий. Хотя бы минимальные навыки создания репозитория, веток, коммитов и пул реквестов. Работодатель чаще всего будет просить выполнить тестовое задание. Сделайте его и положите на гитхаб или подобный сервис. Также он будет смотреть другие ваши работы там же.
Виртуализация. Лучше docker, но можно и надстройки в виде lando, devilbox и других. WAMP и аналоги — хуже, т.к. не являются средствами виртуализации. Базовые навыки докера можно получить, посмотрев часовой урок. Но в любом случае оставьте порочную практику ведения разработки на веб‑хостинге через FTP.
Средства профилирования и отладки. XDebug — тоже частый вопрос.
Стандарты оформления кода PSR-2, WordPress Coding Standards.
По моим наблюдениям, эти знания существенно повысят вашу ценность, покажут работодателю что у вас есть база, которую можно развивать и закроет на глаза на то что вы чего‑то не знаете, если таковое будет.
Обсудить материал можно также здесь в моем телеграм-канале nikita.global. Там же можно почитать и другие материалы о работе и жизни в Болгарии.