Каждый раз перед собесом я говорю себе: "Спокойно, не нужно ничего выдумывать, доучивать и врать, твоих знаний и опыта достаточно для того, что бы работать у них. Ты усилишь любую команду, тебе есть что предложить, а пробелы в твоих знаниях — приемлемы. Если бы они знали о твоих навыках всё, что знаешь ты, они бы точно тебя взяли". Но когда начинается собеседование, я всегда перестаю в это верить. Все два часа интервью я хожу как по минному полю, что бы не дай бог не спалиться, что я чего-то не знаю.
Достаточно долго я думал, что когда нибудь я буду знать всё, что нужно. Я приходил собеседоваться на позицию мидла, а сам думал, что недотягиваю. У них так много всего в требованиях, я не знаю все эти вещи на хорошем уровне. Меня брали, но само интервью только подтверждало мои мысли. Ребята с обратной стороны скайпа — очень крутые люди. Я не знаю как, но за часовой разговор они успевают глубоко засунуть в мою голову мысль, что их умения — недостижимая величина. Потом мираж развеивается, я начинаю с ними работать, и понимаю — мы одинаково тупые. Вот уже они не знают "элементарных" вещей, вот уже я им что-то объясняю. Сейчас я обычно собеседуюсь на синьора. Тут всё то же самое, но преувеличено до таких масштабов, что похоже на чью-то злую шутку.
Когда готовоишься к собесу на высокий уровень, ты уже даже не говоришь себе, что врать не нужно. Ещё как нужно. Они бы не наняли тебя, если бы всё точно про тебя знали, потому что они сами себе ещё не признались, что нихера не знают. Ты принимаешь правила дурацкой игры, и выпендриваешься на собесе в ответ на их выпендрёж, они врут про свою крутость — а ты врешь ещё круче. Дальше вы знаете, что будет. Они тоже тупые, как и ты.
Очевидно, что тут что-то не так. Похоже, мы не можем принять идею, что скилл — вещь относительная, его нельзя посчитать и измерить. А так как навыки разработки — наше главное оружие и достижение в мире, именно от них всё и зависит, мы все сделали вид, что эта эфемерная вещь — абсолютно реальна. И бережно её стережём.
В идеальном мире у нас мог бы быть механизм, совершенный тест, который оценит твой скил по шкале от одного до тысячи. И компании, которые фильтруют кандидатов по этим оценкам, набирают подходящих, платят ровно по умениям. В нашем говномире так не работает. Любой придурок, пытающийся ввести систему оценки скилла только усложняет нам всем жизнь. Ты где-то поработал, что-то изучил, сделал пару крутых штук. Наступает момент, когда нужно искать работу. Ты открываешь вакансии, и понимаешь, что ты в целом понятия не имеешь, кто ты есть. Пробуешь разные уровни — где то получается, где-то нет, и это никак не связано с предлагаемой ЗП и формальными требованиями к вакансии. Ты начинаешь думать: "Ну окей, если меня в трех местах взяли на мидла, значит я теперь мидл". Потом в твою команду приходит джун, который шарит лучше. А потом синьер, который шарит меньше. Ты начинаешь путаться, но дело в том, что понятие "шарит лучше или хуже" — слишком сложное. На одной из первых работ у нас был сорокалетний синьор, который пришёл в шарпы из плюсов. Я был абсолютно убеждён, что он по сравнению со мной — полное дно. Сейчас я понимаю, что ещё лет десять не буду знать и половину от того, что знал тогда он. Я ничегощеньки не знал об алгоритмах, базах, структурах данных… Я просто прочитал книжку по последнему сишарпу, совершенный код и брошюру с паттернами проектирования. Это позволило мне с высока посматривать на всю команду, регулярно объясняя им, как следует писать код.
Я думаю, проблема не только во мне. Если общаешься с разработчиками, ищешь работу, или пишешь что-то на хабр — все вокруг только и делают, что меряются скиллом. Я как то написал статью, которая вообще не связана с тем, насколько я хорош как разраб. Что вы думаете? Там был с десяток коментов в стиле "Да этот придурок не синьор никакой, какого хрена он пишет!?". Сообщество само по себе такое, но хуже всего то, что это переносится на поиск работы. Мне как-то довелось поработать в команде, где лид рубил людей на техническом интервью, если у них в резюме ожидаемая ЗП была выше, чем у него. А потом ещё возмущался, вроде, какого хера этот чмошник просит 3 штуки, и не знает "элементарнейшую" вещь, которую знаю я? Это не обычная зависть, это именно история про скилл. Идея, что лежит в наших головах — существует точная метрика скилла, ЗП должна быть к нему привязана. Метрики-то как раз нет, поэтому у большинства из нас эта метрика работает так: "Хм, насколько этот человек — Я?".
Меня самого больше не зовут проводить собесы, я аппрувлю всех без разбора. Я не понимаю, если человек уже три года работал разработчиком, какие нахрен могут быть с ним проблемы, технически? Будет тормозить команду? Научим. Будет задавать тысячи вопросов — ответим. Будет писать дерьмовый код? Отревьювим.
Такая риторика — дерьмо. Её всегда понимаешь вот так: "А давайте тогда все будут синьоры, давайте всем платить сколько просят". Это приведёт к тому, что плохие разработчики будут просить кучу денег и делать важные проекты, а хорошие — нет. Получится очень несправедливо, а несправедливость — это всегда плохо. И то, что жизнь и рынок по своей природе несправедливы, не значит, что мы не должны ничего с этим делать. Ден Абрамов как-то написал пост, в котором он признается, что не знает кучу вещей, которые, по-хорошему, должен бы знать, и в конце он пишет что-то вроде "Это не значит, что сейчас мы должны обесценивать свой опыт, просто надо относиться с большим пониманием к пробелам в знаниях". Ден прав, но эту простую рекомендацию слишком тяжело исполнить.
Скилл разработчика формируется из большого количества вещей: твои знания ЯПов, платформ, опыт, грабли, что ты собрал, системы, которые построил. Способности к проектированию, понимание различных паттернов и механизмов в современной и не очень разработке, принципов на которых все построено. То, как ты работаешь с задачами, как декомпозируешь и понимаешь их. Твой дар предвидения, и умение сочетать его с прагматизмом. Твое умение предвосхищать появление новых багов и задач.
Большинство из этих штук очень сложно оценить. Есть более-менее понятные навыки, я могу прикинуть, насколько хорошо знаю C#. Цифру от нуля до ста я не дам, мне кажется, что выше среднего — в ЯПе нет фич, про которые я не знаю, я хорошо знаком со всемя распространнеными практиками написания кода на C#. Но даже если представить, что тут я прав, сами по себе знания C# в отрыве от остальных умений — просто куча мусора. Понимание платформы .net прикинуть уже не получится.
Опыт легко считать. Если людям нужен дотнетчик с пятью годами опыта, они просто найдут чувака, который работал дотнетчиком пять лет. Но тут тоже есть проблемы — качество и переносимость этого опыта — очень спорные вещи. Меня никто и слушать не хочет, когда я пытаюсь устроиться Xamarin разработчиком, потому что конкретно с Xamarin я работал слишком давно. Я предлагал им прособеседовать меня как Xamarin разработчика, я специально потратил месяц на его изучение перед собесами. Это, и то, что я делаю почти то же самое на WPF, и вообще уже 7 лет работаю с C# и .net для них ничего не значит. Я считаю, что они ошибаются, но доказать ничего не могу, мой потенциал в работе с Xamarin — неизмеримая штука. Опыт, раз его можно посчитать в годах, слишком часто вводит в заблуждение. Так нанимают дураков на позиции, где надо думать, потому что они уже работали на таких позициях. Ирония в том, что единственная исчислимая метрика — самая лживая.
С системами, которые ты построил — похожая проблема. Ты их делаешь не один, их качество не так уж и связано с твоим качеством. Понимание паттернов посчитать сложно. У меня есть специальные истории для собесов, про то как я использовал разные паттерны. Связи со скилом тут так же нет.
Прагматизм, дар предвидения и умение предвосхищать баги — вещи, не поддающиеся счёту. Эти умения даже прикидочно оценить невозможно. Мне как-то пришлось делать тестовое задание, в описание вакансии был особенный упор на понимание SOLID, масштабируемости кода и т.д. Ну я и наоверинжинерил им что-то вроде хеловорда на всех паттернах проектирования. Меня с радостью взяли, это была единственная моя работа (я сбежал после испыта), где от меня не было абсолютно никакой пользы. Ни одного паттерна в их коде не было. И солид они не соблюдали ни на секунду. Я не понимал, как они работают, и ни одной секунды своей жизни не был человеком, который смог бы работать над их проектом.
На собеседованиях такие навыки проверяются с помощью прослушивания твоих саксесс стори. Это ничего не скажет про тебя, как разработчика — только про твоё умение рассказывать истории. Нам так важно определять скилл, что мы готовы брать любую опосредрованно связаную с ним штуку, сделать её стандартом, и делать вид, как будто это работает.
Нужна точность, но её нет. Разработка связана с математикой, но точной наукой её назвать нельзя. Это похоже на мои споры с друганом — он все время трёт мне, что в мире есть музыка лучше, чем Nirvana, а я считаю, что он просто смешон с этим своим "мнением". Ну и вот мы сидим, и два часа спорим. Да, я конечно прав на 900%, но доказать это невозможно. Иногда твои способности проверяют с помощью абстрактных задач, которые ты должен решить. Хороший способ, но проверяют они на самом деле то, насколько твоё решение соответствует их решению. Есть шанс нарваться на сверхадекватного человека который заценит другой подход. Но то как ты решил одну задачу не особенно много говорит о том, как ты вообще решаешь задачи. Ведь типов задач в разработке — бесконечность. Делать тебе придётся очень много очень разных вещей, и когда у людей стоит задача, оценить, как ты будешь это делать, они, осознавая нереальность этого, придумывают костыли, которые скажут хоть о чём-то. Ну и что, что эти костыли не работают — никто не заметит. Вот только человеку может неповезти с задачей, и он будет с позором отправлен домой.
Когда ищу работу, от того, насколько я хорош, зависит вся жизнь. Зарплата, качество и значение проекта, над которым работаю, моё самочувствие и самоуважение. Для меня не проблема что-то изучить — знать бы что, и знать бы, в какой моент можно считать себя изучившим. Если мне скажут, что есть идеальный механизм определения скила от одного до десяти, и я должен угадать свой — а иначе меня застрелят — понятия не имею, что отвечать. Наверное, около двоечки. Да, вы ведь помните, что я устраиваюсь на синьора? Если меня попросят угадать средний скилл синьоров, я тоже выберу двойку или тройку. Из десяти. Но когда ты ищешь работу, тебе предлагают выбрать по шкале до трёх, где всё что меньше тройки — нищета и бесцельный труд.
Я не знаю, нормально ли устраиваться работать крутым парнем, когда ты лох? Меня очень сильно раздражает, когда так делают другие. Похоже, я презираю этих людей. Никчёмные вайтивайтишники, хотят забрать работу у настоящих инженеров, которые любят своё дело. Сам-то я себя к ним не отношу, ведь точно знаю, что люблю именно разработку. И часто говорю себе, что хочу позицию повыше, что бы иметь доступ к более крутым проектам, управлять процессами и тому подобное. Да, я сам себе не верю. Что бы оправдаться перед собой, я стараюсь больше учиться. Но меньше денег, конечно же, просить не собираюсь.
Деньги отлично иллюстрируют проблему. Нам не хватает градации джун-мидл-синьор что бы понимать, кто кого лучше. Тут в дело вступает бабло. Чем больше ЗП — тем круче разработчик. Цифры в оффере для меня в первую очередь важны потому, что они говорят обо мне больше, чем я сам о себе знаю. При этом, говорят они не только мне. Когда меня спрашивают, какого хрена я прошу так много — я говорю, что на прошлой работе получал столько же, вопросы отпадают. То-есть, если я соглашусь работать на интересном проекте за гроши — сразу стану котироваться ниже, чем сейчас. Мой хороший друг получает космические деньги, и недавно он решил тайно устроиться на вторую работу. И объяснил это тем, что ему нужна стабильность. Гарантия, что его всегда наймут на большую ЗП. А этого легче всего достичь, если ты будешь действительно богат.
Проблема торга на собесах — самый страшный симптом неверной оценки навыков разработчиков. Здесь всё смешано в кучу, сумма, которую тебе предложат зависит от того, насколько ты хорош, насколько ты им нравишься, какой у тебя пол, какой у них бюджет. Насколько ты им нужен прямо сейчас, насколько хорошо торгуешься и знаешь себе цену. Насколько тебе повезло с вопросами на техническом интервью, сколько ты получал раньше. Особенно хорошо влияет ЗП человека, который решает, сколько тебе будут платить. Но когда ты видишь итоговый оффер, ты об этом не думаешь. Ты думаешь, что вот она — цифра, в которую конвертировали твой скилл по рыночному курсу. Всё это усугубляется позицией рынка и мира, что мы, в целом, охренели со своими запросами. И окей, у меня двое детей, я посылаю к чёрту каждого, кто говорит, что мне многовато будет столько получать. Но так могут делать не все.
Интересно, что несмотря на все проблемы, хватает случаев, когда ты приходишь устраиваться, рассказываешь им про свой опыт, они говорят что всё круто, у них похожие задачи, а потом ты отлично справляешься у них на работе. Я считаю, все такие случаи, это во-первых везение, а во-вторых несправедливость. Ведь вместо тебя они могли взять чувака, которые не умеет так круто рассказывать про свой опыт, да и вообще больше привык решать задачи, но он — гораздо лучше справится с их проектом. Есть ещё такая проблема — тебя на самом деле могут не взять, просто потому, что ты им не понравился. И они действительно имеют на это право, ведь никто не обязан работать с людьми, которые им не нравятся. Сама работоспособность системы во многом объясняется тем, что даже если все начнут апрувить вообще всех сосискателей, никто не умрет. Потому что разработчики в среднем норм.
Система работает, а вопросы остаются. Сколько денег указывать в резюме? Можно ли устраиваться на чужой стек не теряя позиции? Почему мои тупые знакомые получают больше меня, а мои умные знакомы — меньше? Почему известные крутые разрабы не шарят в том, в чём шарю я? Если я сам думаю, что я глупец — могу ли я врать, что нет? Но ведь послезавтра я точно начну думать, что я супер гений, мне что тогда, увольняться? Если меня часто не берут по софт-скилам, надо ли мне притворяться, что я милый доброжелательный человек? Если я уже работаю синьором с огромной ЗП, значит на меньшее идти нельзя? Или это значит, я должен пойти и честно признаться, что я этого не стою? Почему меня не звали на собесы, пока я не дописал git в ключевые навыки? Почему аутстаффы промышленно продают стажёров, как синьоров, и мир от этого не рушится?
В разное время эти вопросы мучали меня и моих друзей. Наверное, это часть нашей работы, но я думаю — с этим нужно что-то сделать. Я точно знаю, что бывают разработчики лучше и хуже. Есть более и менее опытные, есть умные и глупые. Когда ищешь человека к себе в команду, есть хороший шанс что наймешь того, кто будет создавать проблем больше, чем решать. А есть шанс нанять мужика, который придёт и резко вам всё улучшит. И мне очевидно, что компенсация должна зависеть от того, насколько человек может быть полезен. Хотя бы потому, что люди должны быть мотивированы учиться, думать и становиться лучше — слишком много процессов в мире связано с IT, все люди на земле заинтересованы в том, что бы средний уровень разработчиков был стабильно возрастающим.
Есть такая идея — работодатель может нанимать кого хочет, и как хочет. Я считаю, нет. Если ты нанимаешь сотню дураков, платишь им втрое выше рынка, говоришь что они суперсиньоры — можешь считать, что ты насрал всей индустрии. Эти ребята когда-нибудь уйдут от тебя, навешают лапши на уши другим работодателям, а норм инженеры потом будут годами убирать за ними дерьмо в коде. Если ты берешь очень талантливого человека на дурацкий проект, и продавливаешь для него нищенскую компенсацию — считай, ты уничтожил хорошего разработчика. Скорее всего он так и будет потом всю карьеру работать с мудаками вроде тебя. Сломанный найм создаёт прецеденты, и увеличивает количество сломанного найма. Для всех нас.
Проблема есть с двух сторон — для нанимателей и для соискателей. С нанимателями проще: я часто читаю людей из индустрии, которые серьёзно работают над своими процессами найма. Да, их бросает от одной крайности в другую, они разрабатывают разные методики собесов, типы тестовых заданий. Учат своих эйчаров детально разбирать резюме. Всё это работает обычно чуть лучше, чем у тех, кто вообще не парится, и нанимает людей по одной и той же идиотской схеме. И вот здесь-то и выход — если постоянно работать над наймом, если все люди, которые занимаются этим в индустрии будут думать и совершенствовать этот процесс — станет заметно лучше.
Для людей, которые ищут работу, всё намного сложнее. Собесы — игра, и ты можешь очень хорошо научиться играть в эту игру. Но вот как самому оценивать свой навык, как понять, насколько ты хорош, над чем должен работать и сколько получать — я не знаю. Я встречал людей, у которых нет таких проблем. Чувак живёт себе, точно знает что он фронтендер мидл, точно знает что он стоит X в городе Y, и не ведает сомнений и страха. Я не понимаю, как они это делают. Я всю карьеру пытался понять, кто я есть. Фразы про "настоящих" разработчиков, которые обязаны знать уметь или понимать очередную хрень, я всегда воспринимал их всерьёз. Но за семь лет я и близко не приблизился к тому, что бы соответствовать большинству из таких утверждений. При этом я и сам генерировал эту чушь. Тоже так говорил коллегам, вроде, если ты не удосужился понять солид, ты не имеешь права код вообще писать. Видимо, напыщенность и ЧСВ прилагаются к твоей первой IDE. Я видел всякие таблицы, которые описывают, что должен знать такой-то программист — и проверял себя по ним. Это не работает. Там, например, может быть сказано, что синьор должен хорошо понимать, как работает его код. И вот как это оценить? Чем больше ты пытаешься внести определённости, тем меньше понимаешь. Подсознательно я всегда использую такой подход: беру какого-то разраба, который точно норм, и сравниваю себя с ним. Такой способ — самый дурацкий, потому что ты понятия не имеешь, что твориться в голове у другого человека, и почему он принимает те или иные решения. Ещё более дурацкий способ, которым я пользуюсь — публичность. Ты пишешь статьи, или выступаешь на конфах — значит ты в порядке.
Можно много говорить, что всякие формальные и неформальные тесты создают больше проблем, чем решают, но мне всё ещё нужен метод. В конечном счёте, я пришел к тому, что мне нужно, что бы была система оценки, в которую я мог бы верить, совершенно не обязательно, что бы она была объективной. Так я выработал ещё один дурацкий формальный тест. Я взял все качества, которые лично мне кажутся важными, и каждое из них оценил по шкале плохо/хорошо/отлично. Берешь среднее от результата, и видишь, кто ты. Супер субъективно, но если я верю себе, что например качество кода у меня — хорошо, значит я и на собеседованиях не буду бояться говорить, что пишу хороший код — короче, это такая оценка, которая позволит мне не чувствовать себя обманщиком. Это очередной самообман, отличие от других в том, что это способ, которому я сам доверяю. Вот здесь, как мне кажется, и ответ — любой сомневающийся в себе разработчик может придумать себе собственный подход и верить в него.