Русский
Русский
English
Статистика
Реклама

Senior

А ты точно senior? или ожидания продуктовых компаний

07.01.2021 14:19:53 | Автор: admin

Привет, я тех/тим лид в одной из продуктовых web компаний - систематически занимаюсь собеседованиями. Для меня главная проблема понять кто перед тобой senior, или не особо. А если еще и нужно согласовать мнение со вторым интервьюером...

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

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

Для себя я выделил два основных направления - аутсорс и продуктовые компании.
Для аутсорс важнее широкий спектр технологий с которыми сталкивался кандидат.
В продуктовой будет важнее глубокое понимание технологий и принципы написания поддерживаемого кода.

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

Итак первое знакомство с кандидатом - резюме

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

На что обращаю внимание:
Как долго работает в одной компании, есть ли рост/смена позиций за время работы.

На чем акцент: технологии или подходы, задачи которые решал или технологии которыми пользовался.

Красным флагом могут быть:
частая смена проектов
большие количество проектов с CMS
пустое перечисление ключевых слов от CSS до IDE.

Если будет интересно к теме хорошего оформления резюме как-нибудь вернемся.

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

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

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

Под таблицей есть спойлер с картинкой если на вашем экране таблица поползла)

Junior

Middle

Senior

Архитектура приложений

Есть базовое понимание принципов ООП

Слышал про SOLID

Может придерживаться соглашений проекта и прослеживать аналогии

Знает пару паттернов

Хорошо понимает SOLID

Слышал про GRASP

Знает про модульную архитектуру

Знает какие есть паттерны, понимает когда нужно применять

Знает основные подходы к проектированию приложения(CQRS,ES,Modular,SOA)

Хорошо понимает как предупредить каскадные изменения

Может рассуждать про метрики качества кода

Знает паттерны вне GOF

Код

Знает базовые конструкции языка

С помощью гугла может решить основные задачи

Знает основные возможности языка, ряд популярных дополнений/библиотек

Может решить сложные задачи и направить Junior разработчика

Может грамотно построить структуру проекта

Код понятен легко читаем без лишнего усложнения

Структуры данных/алгоритмы

Знает какие есть структуры данных

Может подобрать подходящую для простых случаев

Может написать простой алгоритм, посчитать его сложность

Хорошо понимает структуры данных, в каком случае какую выбрать

Может выбирать, создавать сложные алгоритмы

При выборе алгоритма и структуры данных размышляет про эффективность выбора в разрезе RAM/CPU

Реляционные базы данных

Может строить простые запросы(выборки, простые джоины)

Понимает что такое индексы

Может построить отношения между таблицами

Может строить сложные запросы(сложные джоины, подзапросы, агрегации)

Понимает как построить оптимальные индексы

Может профилировать запросы, знает explain

Может спроектировать простую структуру базы данных

Понимает как работать с большими таблицами

Знает про репликацию

Может построить сложную структуру базы данных(шардинг, денормализация)

Знает ограничения и возможности популярных баз данных

Понимает ограничения CAP, PACELC

Безопасность

Слышал основные уязвимости

Знает основные OWASP уязвимости и как их предотвращать

Знает ряд техник для мониторинга, предотвращения уязвимостей.

Понимает как действовать при атаке

Тестирование

Есть базовое понимание для чего и как писать юнит тесты

Понимает различия между разными видами тестов

Может эффективно их писать

Понимает как избегать хрупких тестов

Знает разные подходы к написанию тестов(TLD, TDD)

Может рассуждать о пирамиде тестирования

Знает что дает и как создать нагрузочное тестирование

Как плюс знает AB тестирования

API

Знает базовые методы HTTP

Слышал про RPC,REST

Хорошо понимает принципы проектирования API

Знает какие есть варианты авторизаций

Знает основные подходы стандартизации/версионирования API

Может выбрать тип авторизации для проекта

Очереди/ Шина сообщений

Понимает зачем они и как работать на уровне интерфейса языка/библиотек

Понимает разницу между очередью и шинной данных

Знает основные проблемы воркеров и как из предотвращать (утечки памяти, перезапуск, мониторинг)

Знает основные решения по настройке, мониторингу очередей

Может выбрать подходящий брокер

Спроектировать подход к обработке данных (очередь, пайплайн, асинхронный ответ)

Многопоточность/ Асинхронность
Если поддерживает язык

Владеет на уровне интерфейса языка

Знает как работать с многопоточностью
(блокировки, синхронизация)

Знает как работать с асинхронностью

Понимает что такое итоговая согласованность

Когда и как лучше распараллелить процесс

Кеширование

Может работать на уровне интерфейса языка/библиотеки

Догадывается когда использовать

Знает как организовать кеш, какие бывают проблемы

Хорошо знаком с проблемами нагруженного кеша(прогрев, волна запросов, конкурентный доступ)

Инфраструктура/Сети

Знание базовых команд операционной системы

Знает какие этапы проходит запрос перед тем как попасть в приложение

Знаком с одним из средств виртуализации

Понимает какие вещи и как нужно настроить для продакшн среды

Понимает виртуализацию и контейнеризацию

Знает базовые сетевые протоколы TCP, UDP, HTTP, HTTPS

Понимает как устроена сеть DNS, NAT, OSPF, BGP, RIP

Знает как балансировать нагрузку(включая необходимость попадания данных на тот-же сервер)

Хорошо понимает принципы работы CDN и как решать базовые проблемы

Знает ограничения текущей платформы, как их обойти

Метрики/логи

Знает зачем логи, как их писать

Знает варианты сбора логов

Понимает зачем проекту мониторинг, как им пользоваться

Может выбрать необходимые метрики

Знаком с рядом вариантов сбора метрик/логов

Способен настроить алертинг, сбор необходимых метрик

Желательно знакомство с TSDB

CVS/ Релиз процесс

Понимает зачем нужна CVS

Может выполнять базовые операции CVS

Может рассказать как сделать простой релиз через CVS и SSH руками

Хорошо знает команды CVS

Знает пару фреймворков построения процесса

Знает как работает CI

Может построить CI процесс, знает какие для этого есть инструменты

Хорошо знает подходы к ветвлению, может выбрать подходящий

PNG

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

Подробнее..

Я единственный из 1400, или самый крутой рекрутинг, что я проходил

25.12.2020 02:10:45 | Автор: admin

Я уже лет 10 пишу код на питоне, и последние 2.5 года стабильно работал на американскую компанию. Наверно, многим знакома история, когда ты кодишь-кодишь, вроде всё неплохо, и внезапно ты - самый знающий и опытный в команде и добро пожаловать в тим лиды. Астрологи объявили неделю менеджмента, количество кода снизилось на 100%.

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


Как это бывает

Прежде чем холиварить на тему "как надо", давайте вместе согласимся, как не надо.

HR

В более-менее крупных компаниях есть HR - это скрипты, которые по ключевым словам находят людей в LinkedIn и пишут им шаблонные сообщения (и даже способны вести диалог на уровне яндекс.алисы: знают захардкоженныеи ответы, по всему остальному отсылают куда-нибудь). Очень часто компаниям лень писать такие скрипты и они нанимают миловидных девушек для этого, но блин, ребята, за один вечер можно написать неплохого HR, который будет донимать людей в соцсетях и писать описание вакансии в телеграме - так ещё и работать будет 24/7, и стоить дешевле. Рекомендую.

Так как я искал работу, то я осмелился включить в LI опцию "open to job offers" - и меня завалило предложениями, бессмысленными и беспощадными. Шутят, что LinkedIn - это сайт знакомств для айтишников, где последние постоянно отшивают девушек. В какой-то момент я задолбался тратить время на вводную часть и хотел хакнуть систему, говоря, чтобы они сразу дали мне самое сложное тестовое задание, и если я справлюсь, то имеет смысл говорить дальше - но меня редиректили на стадию "нужно сначала познакомиться друг с другом".

Какой я вынес из этого вывод? Увы, HR сейчас повсюду, летают над линкедином и ищут добычу, но пользы от них я не вижу - они просто делают редирект тебя на работодателя, хотя вообще-то я и так ищу работу, смотрю всякие доски объявлений и биржи, и если вашей компании нужен я, просто раскидайте везде объявления - это сэкономит всем время.

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

Интервью

На моей старой работе мы интервьюировали многих - начиналось с того, что мой босс рассказывал минут 10 про компанию, потом мы минут 15 слушали, какой кандидат классный и что он умеет, потом 5 минут смотрели на него во время live coding, и всё было решено. Нет, мы давали кандидатам время, чтобы они закончили задание, но вообще-то уже после 5 минут было понятно, нравятся нам его скиллы или нет, и получается, что только эти минуты были по-настоящему важны. А мы просто теряли время.

Я был и с другой стороны баррикад. Однажды я потратил целый час на общение с hr из епама - блин, мы уже разве что только не поженились, мы уже обговорили график работы и на каких условиях моя тушка будет релоцироваться. Через пару дней я завалил их собеседование. Итого: два человека продолбили по часу, обсуждая то, чего не будет; два человека продолбили по часу, чтобы понять, что один не подходит. 4 часа просто в никуда. В денежном эквиваленте мы все потратили тысяч 10 наверно, это прикольно осознавать.

Знаете, какой должен был быть первый вопрос от этой компании? Вот такой сниппет на питоне:

a = 400b = 400id(a) == id(b)  # true or false?

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

Оказывается, интервью можно сократить процентов на 90% и не потерять ничего, просто поменяв порядок вопросов.

Независимость умений

У нас был случай, когда чел успешно прошёл интервью - сделал 2 небольших задания, не идеально, но показал, что может быстро учиться, ну и решение работало в конце концов. Мы его наняли. Потом мы узнали, что он не очень в гите, не умел отлаживать, код был так себе, а ide была atom, и он, например, не мог jump to definition или search class например. Про статический анализ кода вообще молчу.

Мы попали на деньги, потому что (конечно) я дебил-менеджер, а ещё потому что мы ожидали, что если человек умеет кодить, то он умеет отлаживать и делает это за конечное время. Наивные!

Интервью должно в идеале покрыть всё, что вы ожидаете от кандидата. Нельзя ждать, что если A, то B - проверяйте и A, и B.

Background

Люди продают себя, и поэтому CV - это как Инстаграм: люди добавляют туда только лучше, а всё что "не очень", деликатно умалчивают.

Как-то у нас было собеседование с мужчиной - лет 40, почасовая оплата такая, что я шёл на интервью, как будто это он меня будет собеседовать, а не я его. Как он классно говорил про свои проекты! Я был просто уверен, что он крут, залетит к нам на проект, всё наконец заработает, меня вышвырнут как слабое звено и я останусь ни с чем, буду плакать и искать работу. Когда мы дали ему тестовое задание, он его зафейлил, от слова "совсем". Я прям не верил глазам, там всего-то пробежать по json и вытащить определённые значения - но он был слишком крут для этого. И тут я понял: CV, описание опыта, всякие там профили на сайтах - это всё ничто, это только bias, который зачастую ошибочен, потому что это одна сторона медали - лучшая. Мы все не без недостатков - но как работодатель, я хочу знать все стороны - с некоторыми я могу мириться, с некоторыми нет.

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

Ребята, я нашёл

Да, я нашёл ту компанию, которая возвела рекрутинг в абсолют. Они ушли от стандартной "HR, Interview, Test task" схемы, и сделали рекрутинг постоянно изменяющимся процессом, когда собирается статистика и на её основе части процесса добавляются/изменяются/удаляются. Когда я устраивался в эту компанию, я проходил через пятую версию процесса отбора кандидатов. Сейчас мы работаем над седьмой.

Далее я расскажу про все шаги, через которые я прошёл. Вакансия: senior python developer (django, remote only) - это важно, потому что иная вакансия привела бы к совершенно другим шагам.

Итак, как это выглядит.

Без HR

Тут нет HR. Зачем? Мы постим объявление на разных площадках и имеем постоянный поток кандидатов. Есть подозрение, что это даже дешевле HR.

Размещаемое объявление максимально полно описывает вакансию, то есть если кандидат подаёт заявку - он уже знает, сколько и когда нужно будет работать, какая вилка, какие правила в компании и тд, и чтобы это узнать, он потратил 5 минут, а не час на телефоне. Если ему стало интересно, он может почитать наш порядок работы на github - репа публичная.

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

Самый тупой фильтр на свете

Представьте, что у вас есть постоянный поток кандидатов. Интервью с каждым - самоубийство. Разбор тестового задания каждого - куча времени. Что, если я скажу, что есть способ отсечь 80% неподходящих кандидатов вообще без телодвижений?

Первый вопрос кандидату - его стаж. Это не какое-то число из головы - напротив, мы взяли статистику и нашли такое число N, что кандидаты со стажем меньше N лет никогда не проходили все этапы. То есть, согласно всем нашим наблюдениям, это минимальный порог для успешного прохождения собеседования. Поэтому мы запилили формочку, где кандидат тыкает своё число и либо проходит дальше, либо мы вежливо отказываем. Зачем это? Каждый этап отбора стоит компании всё больше и больше (и по деньгам, и по ресурсам), и этот маленький вопрос значительно снижает нагрузку.

Пиши код

Кто-то тут на Хабре писал, что тестовые задания фу-фу-фу, но я-то знаю, что задания на кодинг как старый добрый кольт: уравнивают всех. Много опыта, мало опыта, красивое CV или его отсутствие - покажите мне свой код, и я скажу, кто вы. Сколько раз было: на словах ты Лев Толстой, а на деле у вас тут мешок эксепшнов. Не знаю, если кто-то тут нанимает разрабов без хоть какого-то кодинга - расскажите мне, как так-то?

У нас раньше был live coding, но есть огромные минусы:

1) это стресс для кандидатов - никто не любит, когда рассматривают и оценивают, как он кодит;

2) он не показывает реальные способности программиста в обычной среде - обычно человек кодит в спокойной обстановке, попивая кофе, а тут он висит на звонке и должен что-то сообразить - я сам, например, люблю live coding, но тупею процентов на 50;

3) live coding требует, чтобы кто-то из команды на нём присутствовал.

Итак, задание на написание кода нужно, но только не live coding и без человеческого участия. Как вы, наверно, догадались, есть много сервисов, которые позволяют тестировать кандидатов в автоматическом режиме. Мы используем один из таких, там есть окно для ввода кода и можно запускать программы на питоне (и на других языках тоже). Просто кидается ссылка на тест, а потом можно забрать результаты по API. Наши задания простые, на их решение хватает и 15 минут, но мы даём 1.5 часа. На некоторые задания уходит менее 2 минут, так что это действительно простые вещи. Ну, например, инвертировать содержимое в маленьком файле, типа data[::-1], без подводных камней. Вы не поверите, но это отсекает 80% народа, серьёзно - хотя они претендуют на место senior python developer.

Тестируется всё, что требуется от кандидата

Когда кандидат проходит базовый тест (повторюсь: он очень лёгкий), ему даётся задание на дебаггинг. Этого важная штука по нескольким причинам:

1) это последняя линия обороны перед участием человека в рекрутинге, то есть если человек прошёл этот этап, компания начинает тратить ресурсы на рекрутинг;

2) это задание, которое довольно хорошо отбирает сеньоров;

3) оно опять же полностью автоматическое.

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

Итак, после этого шага перед нами есть сеньор помидор, и мы ничего на это не потратили. Ура! Но пора вспомнить, что у нас есть совесть, и начать уже общаться с кандидатом.

Тестовое задание

Далее уже сложнее - тестовое задание. Кандидат ставит трекер и логгирует время, потраченное на решение задания. Оно тоже классное по нескольким причинам:

1) позволяет кандидату разобраться с трекером, который используется в компании,

2) мы оцениваем продуктивность кандидата (потому что трекер считает время) - это наверно одно из самых важных свойств, потому что вы не сможете сделать успешный продукт, если кандидат будет в 10 раз медленнее, чем вы от него ожидаете

3) мы оцениваем умение кандидата работать удалённо

4) задание "fuzzy" - сказано, что должно быть в итоге, но как это получить - кандидат решает сам; мы оцениваем, насколько кандидат умеет здраво мыслить и понимать требования клиентов

5) разрабы делают код ревью и отсылают подробные комментарии кандидату в любом случае - т.е. всегда.

Да, это долгий процесс - может занимать 3 часа у кандидата. Как сделать, чтобы он не бросил эту затею? Мы заранее говорим, что все работы будут оценены вручную, и по каждой из них будет сделан детальный code review. И мы делаем, причём каждый такой ревью занимает в среднем 40 минут - но тем не менее мы не игнорируем ни одного кандидата. Это мотивирует, потому что даже если кандидата завернут, он точно будет знать, почему и над чем нужно работать.

Интервью

Вот тут уже случается разговор с СЕО компании. Это не интервью в классическом смысле - скорее знакомство и ответы на вопросы. На этом этапе никакого отсева :)

Пробный период

Далее кандидат попадает на пробный период.

Он прекрасен для кандидата, потому что

1) кандидату платят полную ставку, как если бы он уже полноценно работал,

2) кандидат считается полноценным членом команды (без всяких исключений) и имеет равный со всеми голос.

Этот же период ужасен для комании, потому что

1) компания может потратить в 5 раз больше заработанного кандидатом только на его сопровождение - то есть кандидат наработал на 40$, но все люди, задействованные в этом, потратили на это своё время на 200$.

Избыточные задания

Хоть период и тестовый, но сразу никто кандидата на реальный проект не бросает - а делаем мы вот что. У нас есть пара реальных и уже решённых задач (то есть с точки зрения реальной работы в них нет смысла) - но всё равно даём их кандидату. Эти задачи

1) опять же выявляют способности кандидата в некоторых специфических областях;

2) позволяют сравнить кандидата; так как все в компании прошли через эти задачи, можно считать эти задачи эталонными и использовать для сравнения членов команды: кто быстрее, у кого лучше скиллы и так далее (это кстати популярная тема - дать одно задание разным разрабам и смотреть как каждый будет решать его)

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

Некритичные задачи

Если избыточные задания пройдены успешно (а многие заваливают), то кандидату даются какие-либо реальные, но некритичные задачи - то есть это ещё не работа над проектами клиентов, но уже полезная деятельность - например, добавить функционал на сайт или написать несколько скриптов для улучшения процесса рекрутинга :)

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

К чему всё это

Заголовок не врёт - до меня компания забраковала 1400 кандидатов. Когда я это узнал, я почувствовал, что я самый классный парень на деревне - кто ещё может таким похвастаться? А потом подумал и понял, что нет. Не я самый классный, а рекрутинг.

У меня на прошлой работе есть чел, который мультитул - он круто пишет код, может настроить логгирование в cloudwatch, позвонить в какую-нибудь команию и договориться с ними о сотрудничестве, попутно тренируя какой-нибудь xgboost или spacy. Ещё у меня есть друг, который всё схватывает на лету и просто мозг - я себя рядом с ним чувствую мобильным процессором с низким энергопотреблением. Круче ли они меня? Совершенно точно. Прошли бы они всё, что я описал? Я сомневаюсь.

То, что меня взяли, значит лишь то, что я подошёл под все критерии, по которым меня оценивали, то есть я подхожу именно этой компании именно сейчас. И смысл в том, что каждая компания должна иметь свои собственные критерии, потому что если все ваши вопросы - из списка "300 вопросов для собеседования", то у вас проблемы. Многие компании стараются нанять лучшего, в то время как нужно искать наиболее подходящего. Это так просто, что об этом легко забыть.

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

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

Подробнее..

Как вырастить веб-разработчика от стажера до архитектора. Матрица компетенций

03.09.2020 12:19:11 | Автор: admin
Вместо эпиграфа
Когда в 2004 году я окончил университет, в нашем городе почти не было команд разработчиков.
Где работать, у кого набираться практического опыта?
Выбор был прост: админом или в Москву. Или уйти из профессии.
Сейчас я преподаю веб-разработку в местных ВУЗах, руковожу большим коллективом и мне важно, чтобы в моем городе хотели жить толковые молодые ребята, чтобы наш город не считался тухлым местом.

Суть статьи коротко


Мы с коллегами умеем растить веб-программистов с почти нуля до уровня уверенного профессионала (Senior / Архитектор).
Хотим рассказать как все работает и поделиться с сообществом материалами и методикой.

Статья написана для студентов, начинающих и растущих веб-разработчиков.

Далее описан трек развития веб-разработчика, уровни компетенций Стажер, Junior, Middle, Senior и Architect, как я их вижу и даны примеры аттестационных заданий.

Пирамида способностей программиста или что качать на старте


Как стать хорошим веб-программистом? Нужно ли заканчивать информатику в хорошем ВУЗе? Или хватит месячных курсов? Или с книжкой и мышкой все можно изучить?

Три кита, на которых стоит профессия любого разработчика на любом стеке технологий, это алгоритмизация, базы данных и собственно программирование (язык + ООП + паттерны).
image

Что такое алгоритмизация?


Близкий житейский аналог технического навыка алгоритмизации ремонт вентилятора. Что делать, если не крутится? Проверить/сменить розетку, потом рукой крутануть лопасти, потом прозвонить провод.

Логика очевидна: разделил на части и проверил каждую. Удивительно, но многие люди не умеют так мыслить. У настоящего программиста это в крови.

Базы данных


Курс БД один из основных, как физика для инженера. Плохо что часто преподают их одинаково плохо: сводят к пересказыванию параграфов.

В БД важны и теория, и практика. Программист должен уметь и писать запросы, и разбираться в логике ORM, и проектировать структуру.

Какие технологии нужно знать программисту?


Из чего вообще состоит профессионализм разработчика?
Указано примерное время освоения при классическом пути развития (начиная с ВУЗа).

Пирамида.png

По уму алгоритмизации учат в школе/ВУЗе. Тратится на это 1-2 года, и этот период определяет высоту будущего профессионального взлета. Если вы не освоите алгоритмизацию, то никогда не вырастете.

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

Фреймворки часто включают сотни модулей/классов/расширений и постоянно развиваются. Освоение фреймворка займет у вас несколько месяцев как минимум.

Многие самоучки идут по легкому, но неверному пути: вместо алгоритмизации начинают учить фреймворк. И уже через пару месяцев практики заявляют что умеют программировать. Серьезные собеседования они проваливают уже через 10 минут после начала.

Конкретные технологии (например AJAX, серверный рендеринг JS, push&pull, распределение нагрузки по гео-кластеру, профилировка долгих запросов в xhprof, очереди сообщений, NoSQL базы данных) бесконечно разнообразны. Учить их можно вечно.

Эту пирамиду нужно проходить снизу вверх. Если вы начнете с фреймворка и напишете красивое резюме, но не будете знать как работает голый JS или чем get-запрос отличается от post профи вам не быть.

Какие задачи нужно решать?


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

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



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

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

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

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

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


Большие задачи реальные сервисы, которыми пользуются люди, где команда состоит минимум из 2 человек, и состоящие из тысяч строк кода. Такие проекты формируют уверенного специалиста.

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

Более сложная и более полезная книга Шаблоны корпоративных приложений Мартина Фаулера. Ее тоже нужно прочитать, примерно через год-полтора работы в профессии.

А зачем? Можно просто закончить 3-месячные курсы веб-разработчика?

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

При этом на простейший вопрос типа что такое cookies или как работает подгрузка сообщений в ленте ВКонтакте люди часто не знают ответа, у них даже версий толком нет.

Хороший программист знает теорию и применяет на практике, все время думая как сделать правильно. На спинном мозге и копировании кусков кода из гугла далеко не уедешь. Нужна база и практика.

Как получить эту базу? Где правильно учиться? Есть два пути.
Первый 4-5 лет в хорошем ВУЗе.
Второй несколько лет упорного самообучения и практики. Можно стать сильным программистом без профильного образования, если у вас светлая голова, открытое сердце, а вы сами готовы много работать.

Короткие курсы полезны, чтобы получить базовые знания и понять куда рыть самому. Профессионалом они не сделают.

Матрица компетенций. Стажер Junior Middle Senior Architect


Мы считаем что наша матрица и есть ответ на вопрос как из новичка стать гуру веб-разработки.
В нашем мире разработчик занимается в основном бекенд-задачами, но он не должен бояться фронтенда и администрирования (для злых задач есть узкие специалисты).

По ссылке доступна полная матрица с примерными вопросами по аттестации.

Это таблица, разделенная на грейды (стажер, junior, middle, senior). Каждый грейд содержит набор уникальных компетенций. Вопросы сгруппированы по областям знаний (PHP, SQL, Frontend, веб-технологии в целом и управление серверным хозяйством)

Стажер

На старте стажер должен быть способен:
  • уверенно отличать куки от сессий;
  • понимать на сервере или в браузере происходит конкретная операция;
  • написать на PHP без серверных фреймворков несложную задачу управления данными. Например ведение БД групп и студентов с редактированием, удалением, созданием и выводом;
  • прилично оформить результат своей работы.

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

Junior

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

Что практически должен уметь Junior на старте:

  • переписать (а значить досконально понимать) авторизацию на сайте;
  • уверенно править настройками и кодом фреймворка работу каталогов, ленты новостей, формы;
  • собирать простые интерфейсы управления данными и целые сайты на фреймворке;
  • писать простую интеграцию с внешним API.

Middle

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

Что практически должен уметь Middle на старте:

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


Senior

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

Вот например, что сам Senior должен знать и уметь по блоку Работа с серверами и Linux.

  • Сборка нетиповой системы выкатки изменений
  • Работа с микросервисами.
  • Организация нагрузочного тестирования
  • Настройка continuous integration
  • Синхронизация файлов и репликация данных
  • Сборка отказоустойчивого и высоконагруженного кластера на Bitrix Framework и без него.
  • ELK / другие системы логирования и аналитики
  • Серверы очередей Gearman / RabbitMQ и построение распределенных систем

Как правило, Senior играет роль технического лидера группы разработчиков.

Architect

Архитектор следующий уровень развития специалиста, когда он продумывает архитектуры крупных проектов и руководит их реализацией. Он не только технический, но и проектный руководитель.

Такие специалисты играют ключевую роль в технически и организационно сложных проектах.

Качество архитектора определяет способность проекта выполняться в срок и развиваться много лет подряд.

Управление развитием программиста

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

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

Как устроена проверка уровня (аттестация)?

Что такое аттестация?
Это процедура подтверждения квалификации программиста. Ее проходят все программисты.
Аттестация включает лабораторные работы и устные экзамены.

В результате аттестации в матрице компетенций появляются Да напротив подтвержденных компетенций. От этого увеличивается грейд, например, Стажер-54% Junior-27%.

Как проходит аттестация?

Аттестация включает теорию (устный экзамен) и практику (лабораторные работы). Цель закрыть несколько компетенций в матрице, подтвердить уровень, получить новые задачи и повысить зарплату.

Практические задания можно сделать правильно только если изучить и понять теорию. Списывать и хитрить не принято, и наставник не пропустит халтуру.

Многие блоки матрицы компетенций закрываются практикой и теоретических вопросов по ним нет.

Теория. Устный экзамен

Компетенции, не покрытые лабораторными работами нужно подтвердить на устном экзамене.

По каждой компетенции мы задаем около 5 вопросов. По-хорошему ответить надо на все или почти все. Длительность устного экзамена зависит от уровня, обычно это 1-2 ч.

Практика. Лабораторные работы

Лабораторная работа покрывает сразу несколько компетенций. После выполнения лабораторной работу эти компетенции засчитываются как подтвержденные и не попадают в устный экзамен.

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

Примерные формулировки заданий

Мы разработали около 20 заданий (называем их привычно для студентов лабораторные работы). Несколько опубликуем.

Вот примеры простых заданий.

Задание 2а. Базовый web. Реализуем CRUD на чистом PHP.

Компетенции:
  • PHP: Аутентификация и авторизация на сайте
  • PHP: Обработка форма обратной связи с сохранением данных и валидацией
  • Фронт: Создание форм на html
  • Фронт: Синтаксис и селекторы CSS, общее представление о весах селекторов
  • SQL: Основы Mysql
  • SQL: Типы данных
  • PHP: Синтаксис языка PHP

Суть:
  • завести репозиторий на bitbucket и выполнять в нем;
  • сразу сделать ветку и pull request;
  • в PhpStorm установить плагин Statistic, максимальное кол-во строк на весь проект 1500:
  • через PhpStorm создать необходимые таблицы и заполнить их данными;
  • сделать страницу аутентификации;
  • сделать страницу с формой обратной связи, на которой есть: текстовое поле, многострочное текстовое поле, радиокнопки, флажки, выпадающий список, кнопка сброса формы, кнопка отправки формы;
  • форма обратной связи доступна только авторизованным пользователям, критерий допуска вход в систему выполнен;
  • все красиво сверстать, показать пример использования основных типов селекторов: id, class, attribute, pseudo-class, pseudo-element;
  • обе формы должны обрабатываться без JS;
  • проверить через PhpStorm, что данные добавляются в таблицу.


Проверка:

  • проверяется качество декомпозиции php, js, css;
  • умение выделить ответственность и установить правильные зависимости между компонентами MVC/ECB;
  • безопасность (доступ);
  • безопасность (XSS, SQL injection);
  • корректность редиректов;
  • единство стиля оформления кода.


Развитие задания

Задание 2б. Развитие CRUD-интерфейса на PHP.

Компетенции:
  • 3 способа подключения скрипта
  • Создание форм на html
  • Синтаксис и селекторы CSS, общее представление о весах селекторов
  • JS: операторы, функции
  • Отладка JS с помощью консоли браузера
  • Основы Mysql
  • Типы данных


Суть продолжаем работу над сайтом из задания 2а:
  1. сделать мини-админку:
  2. список отправленных форм обратной связи;
  3. список должен быть отсортирован по дате отправки, новые сначала;
  4. список можно обновить, это делается с помощью AJAX;
  5. совет: для интерактивного тестирования запросов к БД используйте консоль БД в PhpStorm;
  6. отправленную форму можно удалить из админки, все на AJAX;
  7. таким образом продемонстрировать все способы подключения JS;
  8. отправленные данные можно отредактировать (использовать уже разработанную форму, без AJAX);
  9. можно использовать jQuery.
  10. открыть инструменты разработчика (желательно Firefox):
  11. найти источник запроса из лога запросов;
  12. установить точку останова, спровоцировать выполнение кода, изучить пошаговое выполнение кода;
  13. во время пошагового выполнения просмотреть значения переменных через соответствующий инспектор;
  14. добавить watch;
  15. воспользоваться консолью для доступа к переменным в текущей области видимости.
Проверка:
  1. проверяется качество декомпозиции php, js, css;
  2. умение выделить и установить правильные зависимости между компонентами MVC/ECB;
  3. безопасность (доступ);
  4. безопасность (XSS, SQL injection);
  5. единство стиля оформления кода;
  6. все пункты по использованию инструментов разработчика продемонстрировать.


Вот пример средней сложности

Задание 10. Парсинг сайтов

Компетенции:

  • Регулярные выражения
  • HTTP-запросы с сервера, cURL
  • TODO: написание консольных утилит (и одноразовых скриптов) на кодовой базе Bitrix Framework
  • TODO: добавить CRON


Суть:

  • Проанализировать сайт, продумать структуры данных, пригодные для автоматизированной обработки
  • Распарсить сайт в эти структуры
  • Оформить в виде CLI-скрипта
  • Настройками реализовать возможность парсить не все подряд, а только то, что нужно пользователю


Проверка:

  • корректность CLI-окружения
  • декомпозиция регулярных выражений
  • экономичность по запросам
  • обработка ошибок
  • возможность параллельного парсинга нескольких объектов сразу
  • Работа в консольном и интерактивном режиме
  • *работа в режиме внешнего сервиса, доступного по HTTP, с поддержкой очередей



Посмотреть и скачать матрицу компетенций 2020

Я уверен, что именно так, по шагам, с наставником и постоянным code review, через цепочку аттестаций, развивается правильный разработчик от стажера до архитектора.
Бриллианты формируются под давлением.
Подробнее..

Можно ли сэкономить набирая junior специалистов?

19.11.2020 22:10:01 | Автор: admin

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


Давайте приведем возможные доводы за то, чтобы строить HR политику на наборе джуниоров и их последующем росте.


Дисклеймер 1: Безусловно разделение на junior-middle-senior, используемое в статье, крайне условное и мало связано с опытом работы, а градация и зарплатные уровни сильно зависят от компании, в которой дается оценка. Однако мы живем в реальности, в которой на hh в вакансиях ведущих it компаний используется такая терминология, и все мы, так или иначе, понимаем о чем речь, и примерно какой набор требований предъявляется в том или ином случае. И предвосхищая дальнейший текст статьи, заверяю, что абсолютные величины не так важны для сделанных выводов.


Дисклеймер 2: Рассуждения по большему счету не про топ компании, в которых и так все в порядке, а скорее про остальное большинство. Так же разговор идет про технически сложные продукты, правда в возможность существования простых, в общем случае, особо и не верю. Простые продукты (вспоминая Пола Грэма и его книгу "Хакеры и Художники") вряд ли могут успешно существовать на конкурентном рынке, в противном случае их было бы слишком просто скопировать и повторить.


В классическом варианте конечно же есть стремление сэкономить.
Джуниору можно мало платить. Их много на рынке, их легче взять. Да, первые месяцы он будет бесполезен, но уже через несколько месяцев начнет приносить пользу, а через год отобьет все затраты. А еще можно сэкономить, или точнее мало потерять, если джуниор не прошел испытательный срок. Такая потеря не особо болезненна по сравнению с потерей более высокооплачиваемого специалиста. Один сеньор может распараллелить работу, нагрузив трех джуниров задачами не высокой сложности, беря на себя более высокоуровневые и сложные задачи. Тем самым сделаем продукт, а заплатим меньше, хотя может и не столь идеально и быстро. А еще беря джуниора на небольшую ЗП, мы не подрываем устоявшиеся зарплатные планки внутри компании.


Практически все доводы несостоятельны. Давайте по порядку.


Себестоимость продукта с джунами выше чем с профессионалами


Платя зарплату джуниору, вы не платите за работу над продуктом, вы платите этакий базовый минимум, чтобы ему было на что существовать, ну и конечно за надежду, что когда-то и он полноценно встанет у станка. Дальнейший рост зарплаты от старта сильно не пропорционален росту эффективности. Т.е. себестоимость выполненной работы у малоквалифицированного сотрудника выше, чем у более квалифицированного. Поясним это. Платя мидлу, половина платы уходит в упомянутый выше базовый набор, а остальное уже в продукт. Ведь условно ЗП мидла это две ЗП джуниора, а сеньора 3 зарплаты джуниора. Таким образом, вместо двух сеньоров можно взять 6 джунов или 3 мидла. В случае 2 сеньоров, 2/3 зарплатного фонда идет в продукт, а 1/3 в базовый набор. В случае 3 мидлов 1/2 зарплатного фонда идет в создание продукта и 1/2 в базовый набор. А теперь вспомним про кривую роста эффективности.



График построен на моем опыте. Принимаем допущение, что уровень программиста соответствует ЗП. Конечно же он выглядит не справедливым.


Фредерик Брукс, Пол Грэм, Дядя Боб считали, что высокопрофессиональные разработчики эффективнее остальных от пяти до десяти раз. Таким образом становится совсем очевидно, что каждый вложенный рубль в сеньора окупается гораздо быстрее, чем в джуниора.


"Мифический человеко-месяц":


Руководители программистских проектов давно уже поняли, как значительны различия в производительности хороших и плохих программистов. Тем не менее результаты точных измерений этой величины просто поражают. В одной из своих работ Сакмен, Эриксон и Грант измеряли производительность группы опытных программистов. Даже внутри этой группы отношение максимальной и минимальной
производительности в среднем составило 10:1, а для времени работы программы и затрат памяти 5:1. Короче говоря, производительность труда программиста, получающего 20 тыс. долларов в год, может быть в 10 раз больше, чем у того, кто зарабатывает 10 тыс. долларов. Обратное также может быть справедливо. Статистические данные утверждают, что нет никакой зависимости между опытом и производительностью. (Сомневаюсь, впрочем, чтобы это было верно всегда.)

Коммуникация узкое место


Продолжая сравнивать 3 джуниоров против одного сеньора нельзя забывать и о том, что на коммуникацию и синхронизацию 3 джуниров уйдет порядка 10-20% общего времени. Чем больше людей, тем больше издержек. Таким образом, набор джуниоров идет и против стратегии сохранения наименьшего количества разработчиков работающих над проектом. То, о чем говорил Келли Джонсон в Skunk Works, ну и конечно же Брукс.


Джуниор это инструмент, но не самодостаточная единица


Джуниор как правило совершенно не способен решать задачи высокой сложности. И есть иллюзия, что он может решать простые задачи. Да может, но если это задачи в вакууме. Но в рамках сложного продукта простота задачи может быть не столь очевидна.
Тут уже нужно виденье, которое есть только у сеньора. Моя практика говорит, что простых задач в сложных продуктах нет, есть лишь степень ответственности сеньора. Джуниор может не заметить, что "простая" задача на самом деле требует сложного решения, не увидеть потребности в рефакторинге. Зрение джуниора достаточно узко и не глубоко. И требует тщательного контроля, усиленного вникания старших товарищей в суть "простой" задачи, что бы не пропустить сложность. И как правило такое погружение и выполнение задачи по времени превышает время самостоятельного выполнения задачи сеньором.


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


Подобное к подобному


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


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


Наем профессионала vs джуниора


Сеньора отчасти проще проверить. Он знает чего хочет, с ним можно говорить и не быть снисходительным на молодость, на то, что человек не обстрелянный. Его можно гораздо более точно оценить и не гадать на кофейной гуще, что же вылупится из яйца в итоге. За плечами есть проекты, которые можно обсудить и оценить, посмотреть код на гитхабе, провести сеанс парного программирования.
Возможно величина ошибки при неудачном найме профессионала выше, но вероятность ошибки гораздо ниже.


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


Джуниоры крадут время у наиболее боеспособных единиц


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


Подводя итоги: команда мечты


Получается что вообще сторониться джуниоров? Куда же им тогда податься?
Конечно же джуниоров можно брать, но на "сдачу". Наем джуниоров как стратегия на далекое будущее, в некотором роде рискованные инвестиции. По моему опыту на команду из 5 человек максимально допустимо иметь 1 джуниора и 1 мидла. И это не история про то, что джун и мидл это тестеры, devops'ы, техписы.


Допустим у нас на команду есть бюджет 550-600 т.р.
Можно пойти двумя путями и попытаться сформировать классическую команду из 7 человек, либо сделать упор на максимальное количество профессиональных разработчиков.


Попытаемся представить как могла бы выглядеть первая команда:


Команда строящаяся на основе джуниоров


Для каждого разработчика в списке ниже расставим крайне усредненную производительность на основе озвученного ранее.


1) Сеньор-лид 150 т.р. (8х 4x (Половина времени на обучение и организацию) = 4x)
2) Мидл? 110 т.р. (5х 1х Обучение = 4х)
3) Мидл? 80 т.р. (2x)
4) Мидл? 65 т.р. (1x)
5) Мидл? 60 т.р. (1x)
6) Джун 55 т.р. (0.2x)
7) Джун 50 т.р (0)


Общая производительность без учета потерь на коммуникацию: 12.2x
Принято считать, что добавление каждого нового члена в команду отъедает до 5% общего времени на коммуникацию. Т.о. общая производительность с учетом потерь на коммуникацию: 12.2x * 0.7 = 8.54x
КПД: 66 т.р. за 1x производительности.


Проблемы этого варианта, кроме низкого КПД:


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

Команда на основе сеньоров


1) Сеньор-лид 170 (8x 2x (Орг. деятельность) = 6х)
2) Сеньор 160 (8x)
3) Сеньор 160 (6x)
4) Мидл 100 (3x)


Общая производительность без учета потерь на коммуникацию: 23x
Общая производительность с учетом потерь на коммуникацию:23x * 0.8 = 18.4x


КПД: 32 т.р. за 1x производительности.


Дополнительные плюсы, кроме высокого КПД:


  • Большой запас по КПД дает возможность увеличения ЗП для удержания сотрудников, прежде чем команда станет не эффективна по сравнению с командой на джуниорах
  • Продукт качественнее (быстрее, эффективнее, юзабельнее, проще)

Выводы


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

Подробнее..

Можно ли сэкономить, набирая junior специалистов?

20.11.2020 02:17:26 | Автор: admin

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


Давайте приведем возможные доводы за то, чтобы строить HR политику на наборе джуниоров и их последующем росте.


Дисклеймер 1: Безусловно разделение на junior-middle-senior, используемое в статье, крайне условное и мало связано с опытом работы, а градация и зарплатные уровни сильно зависят от компании, в которой дается оценка. Однако мы живем в реальности, в которой на hh в вакансиях ведущих it компаний используется такая терминология, и все мы, так или иначе, понимаем о чем речь, и примерно какой набор требований предъявляется в том или ином случае. И предвосхищая дальнейший текст статьи, заверяю, что абсолютные величины не так важны для сделанных выводов.


Дисклеймер 2: Рассуждения по большему счету не про топ компании, в которых и так все в порядке, а скорее про остальное большинство. Так же разговор идет про технически сложные продукты, правда в возможность существования простых, в общем случае, особо и не верю. Простые продукты (вспоминая Пола Грэма и его книгу "Хакеры и Художники") вряд ли могут успешно существовать на конкурентном рынке, в противном случае их было бы слишком просто скопировать и повторить.


В классическом варианте конечно же есть стремление сэкономить.
Джуниору можно мало платить. Их много на рынке, их легче взять. Да, первые месяцы он будет бесполезен, но уже через несколько месяцев начнет приносить пользу, а через год отобьет все затраты. А еще можно сэкономить, или точнее мало потерять, если джуниор не прошел испытательный срок. Такая потеря не особо болезненна по сравнению с потерей более высокооплачиваемого специалиста. Один сеньор может распараллелить работу, нагрузив трех джуниров задачами не высокой сложности, беря на себя более высокоуровневые и сложные задачи. Тем самым сделаем продукт, а заплатим меньше, хотя может и не столь идеально и быстро. А еще беря джуниора на небольшую ЗП, мы не подрываем устоявшиеся зарплатные планки внутри компании.


Практически все доводы несостоятельны. Давайте по порядку.


Себестоимость продукта с джунами выше чем с профессионалами


Платя зарплату джуниору, вы не платите за работу над продуктом, вы платите этакий базовый минимум, чтобы ему было на что существовать, ну и конечно за надежду, что когда-то и он полноценно встанет у станка. Дальнейший рост зарплаты от старта сильно не пропорционален росту эффективности. Т.е. себестоимость выполненной работы у малоквалифицированного сотрудника выше, чем у более квалифицированного. Поясним это. Платя мидлу, половина платы уходит в упомянутый выше базовый набор, а остальное уже в продукт. Ведь условно ЗП мидла это две ЗП джуниора, а сеньора 3 зарплаты джуниора. Таким образом, вместо двух сеньоров можно взять 6 джунов или 3 мидла. В случае 2 сеньоров, 2/3 зарплатного фонда идет в продукт, а 1/3 в базовый набор. В случае 3 мидлов 1/2 зарплатного фонда идет в создание продукта и 1/2 в базовый набор. А теперь вспомним про кривую роста эффективности.



График построен на моем опыте. Принимаем допущение, что уровень программиста соответствует ЗП. Конечно же он выглядит не справедливым.


Фредерик Брукс, Пол Грэм, Дядя Боб считали, что высокопрофессиональные разработчики эффективнее остальных от пяти до десяти раз. Таким образом становится совсем очевидно, что каждый вложенный рубль в сеньора окупается гораздо быстрее, чем в джуниора.


"Мифический человеко-месяц":


Руководители программистских проектов давно уже поняли, как значительны различия в производительности хороших и плохих программистов. Тем не менее результаты точных измерений этой величины просто поражают. В одной из своих работ Сакмен, Эриксон и Грант измеряли производительность группы опытных программистов. Даже внутри этой группы отношение максимальной и минимальной производительности в среднем составило 10:1, а для времени работы программы и затрат памяти 5:1. Короче говоря, производительность труда программиста, получающего 20 тыс. долларов в год, может быть в 10 раз больше, чем у того, кто зарабатывает 10 тыс. долларов. Обратное также может быть справедливо. Статистические данные утверждают, что нет никакой зависимости между опытом и производительностью. (Сомневаюсь, впрочем, чтобы это было верно всегда.)

Коммуникация узкое место


Продолжая сравнивать 3 джуниоров против одного сеньора нельзя забывать и о том, что на коммуникацию и синхронизацию 3 джуниров уйдет порядка 10-20% общего времени. Чем больше людей, тем больше издержек. Таким образом, набор джуниоров идет и против стратегии сохранения наименьшего количества разработчиков работающих над проектом. То, о чем говорил Келли Джонсон в Skunk Works, ну и конечно же Брукс.


Джуниор это инструмент, но не самодостаточная единица


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


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


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


Подобное к подобному


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


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


Наем профессионала vs джуниора


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


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


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


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


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


Джуниоры крадут время у наиболее боеспособных единиц


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


Подводя итоги: команда мечты


Получается что вообще сторониться джуниоров? Куда же им тогда податься?


Конечно же джуниоров можно брать, но на "сдачу". Наем джуниоров как стратегия на далекое будущее, в некотором роде рискованные инвестиции. По моему опыту на команду из 5 человек максимально допустимо иметь 1 джуниора и 1 мидла. И это не история про то, что джун и мидл это тестеры, devops'ы, техписы.


Допустим, у нас на команду есть бюджет 550-600 т.р.


Можно пойти двумя путями и попытаться сформировать классическую команду из 7 человек, либо сделать упор на максимальное количество профессиональных разработчиков.


Попытаемся представить как могла бы выглядеть первая команда:


Команда строящаяся на основе джуниоров


Для каждого разработчика в списке ниже расставим крайне усредненную производительность на основе озвученного ранее.


1) Сеньор-лид 150 т.р. (8х 4x (Половина времени на обучение и организацию) = 4x)
2) Мидл? 110 т.р. (5х 1х Обучение = 4х)
3) Мидл? 80 т.р. (2x)
4) Мидл? 65 т.р. (1x)
5) Мидл? 60 т.р. (1x)
6) Джун 55 т.р. (0.2x)
7) Джун 50 т.р (0)


Общая производительность без учета потерь на коммуникацию: 12.2x
Принято считать, что добавление каждого нового члена в команду отъедает до 5% общего времени на коммуникацию. Т.о. общая производительность с учетом потерь на коммуникацию: 12.2x * 0.7 = 8.54x
КПД: 66 т.р. за 1x производительности.


Проблемы этого варианта, кроме низкого КПД:


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

Команда на основе сеньоров


1) Сеньор-лид 170 (8x 2x (Орг. деятельность) = 6х)
2) Сеньор 160 (8x)
3) Сеньор 160 (6x)
4) Мидл 100 (3x)


Общая производительность без учета потерь на коммуникацию: 23x
Общая производительность с учетом потерь на коммуникацию:23x * 0.8 = 18.4x


КПД: 32 т.р. за 1x производительности.


Дополнительные плюсы, кроме высокого КПД:


  • Большой запас по КПД дает возможность увеличения ЗП для удержания сотрудников, прежде чем команда станет не эффективна по сравнению с командой на джуниорах
  • Продукт качественнее (быстрее, эффективнее, юзабельнее, проще)

Выводы


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

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru