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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

Junior

Middle

Senior

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

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

Слышал про SOLID

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

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

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

Слышал про GRASP

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

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

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

Хорошо понимает как избегать каскадных изменений

Знаком с метриками качества кода

Знаком с паттернами вне GOF

Код

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

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

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

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

Знает нюансы языка, понимает как обходить ограничения языка

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

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

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

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

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

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

Может выбирать/ создавать алгоритмы для более сложных задач

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

API

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

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

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

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

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

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

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

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

Понимает разницу между очередью и шинной сообщений

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

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

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

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

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

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

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

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

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

Кеширование

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

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

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

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

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

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

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

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

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

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

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

Знает как балансировать нагрузку

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

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

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

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

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

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

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

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

Хорошо если знаком с TSDB

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

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

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

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

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

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

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

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

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

PNG

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

С помощью обратной связи часть пунктов пересмотрено.

Отдельное спасибо @Metotron0за пачку исправлений.