Что нужно знать, чтобы быть синьором?

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

Напоминаю, всё нижеследующее — это субъективное мнение автора, родившееся в ходе личного опыта и не претендует на истину в последней инстанции… да и вообще, на истину не претендует.

Об авторе

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

Карьера автора начиналась, когда руби 1.8.7 маячил на горизонте, макбуки ещё не были мэйнстримом и многие продолжали сидеть на 10.5 Leopard. В те времена автор сажал китайский фанерный бензиновый планер морковкой в попытках «разработать беспилотник» для обороны нашей родины, смотрел как одногрупники пишут распознавание образов для определения и сопровождения целей зенитных установок, используя GOTO в сишных макросах и понятия не имел что такое веб. Потом за старательные издевательства над Леной Сёдерберг и их качественное документирование залетел в веб, где и остался надолго. Сходил взад-назад по карьерной лесенке от джуна до своего отдела разработки, побыл системным архитектором и тех.руководителем…, а потом вернулся обратно в район software engineer.

Были и вечные холивары за кодстайл, и долгие обсуждения архитектуры с командой, и «мордобои» с руководством за ресурсы, и политические разборки с С-левелом и даже оптовая продажа чёрного дерева. К последнему, кстати, рынок до сих пор абсолютно не готов. Но это совсем другая история.

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

Про синьора

Так вот, синьор. Это, на самом деле, очень собирательный образ. Эдакая штука с чисто-утиной типизацией, с мат.ожиданием в районе «много знает и умеет» и дисперсией, не поддающейся никакой оценке. Как минимум потому, что с одной стороны, в это понятие включается «маркетинговая» составляющая вида «служи, дурачок — получишь значок», а с другой стороны, все старательно молчат про то, что бывает после синьора. То есть дважды синьор, трижды синьор и прочие кратные ордена Сутулова. Тут, лучше всего, привести примеры реальных людей: интересный господин азиатской внешности, специалист по связям с общественностью, лид рекрутмента и теолог-богослов или барышня — гейм дизайнер, DBA и балерина. Всё скилы на достойном уровне и абсолютно без шуток. Если нужно больше примеров, то ходите сюда. А вообще, в пору подтаскивать кардинальные числа для оценки этого бесконечного разнообразия, но не факт, что все оценят.

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

Фундамент

Сразу скажу, что титулы «синьор реакта», «синьор AWSа» и подобные — это какая-то хрень. Это классический замес техников и инженеров воедино. Здесь «синьор» надо читать как «крутой знаток». То есть это аналог слесаря 6-го разряда. Чувак это эпической крутости и делает крутые вещи, но не является синьором. Увы, в индустрии всё давненько перемешалось, но давайте отделять мух от котлет. Синьор — это про фундаментальные знания и успешный опыт множества серьёзных разработок с применением этих знаний. То есть синьор — это инженер с богатым опытом боевых действий, в «устаревшей» советской классификации.

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

Сети

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

Классический вопрос «что происходит, когда мы вводим в адресной строке example.com и жмём ентер?» должен сразу влечь цепь воспоминаний про TCP/IP, некоторые мысли про альтернативы вида ARP и далее разворачиваться в пышное повествование о сборке пакета, вложениях пакетиков один в другой, порты, фрагментацию, способы передачи на разных уровнях, про подтверждение и неподтверждение доставки пакетов, различные application-протоколы, их особенности, роутинг, приблизительное представление о пути обработки пакета в netfilter и его собратьях и вот это вот всё. Короче, всё что Таненбаум завещал и ещё чутка сверху про application-level и железно-юниксовые особенности.

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

Оси

Ну там, что логи в /var/log лежат, что pid-ы в дерево организованы, что бывают env-ы и через них работают всякие pwd и cd -. С башем, там, свободно взаимодействовать: логи погрепать, порты открытые посмотреть, пидам сигналы послать, потребление памяти оценить, скриптец написать, пакеты накатить, завимости разрулить, из исходников чего собрать без прямого make install, посмортеть какие либы к бинарю прилинкованы, быть в курсе про strace и wireshark, не бояться демонов во всём их многообразии, пробрасывать тунели/порты/прокси через ssh, тыкать палочкой файловые дескрипторы, уметь юзать man в любой непонятной ситуации и ещё много много интересных штук в том же духе. Короче, быть обычным юзером в изложении Кернигина с Пайком.

Здесь же нужно упомянуть app и web сервера и их настройку. Конечно, nginx и его сотоварищи уже давно тянут на отдельную специализацию и, быть может, уже сопоставимы с тем же ffmpg по монструзности, но базовый набор знаний должен быть. Всякие там vhost, настройка проксей/перенаправлений, прикручивание сертификатов, раскидывание приложений по портам, поддержка нескольких доменов и тд.

А чо так много? Я бы сказал, что это мало. Тут ни пересборки ядра, ни процесса загрузки ОС, ни awk+sed, ни всяких nspawn и прочих инструментов для виртуализации, ни узкоспециализированных бинарей. Хотя про всё это многообразие хорошо бы быть в курсе. Чтобы меньше вещей казалось магией и было понятно откуда ноги растут. И, само собой, хоть какой-то практический опыт применения всего вышеозначенного должен быть. Чтобы, получив ключи от танка ssh-доступ можно было зайти с ноги и сразу раскатать средних размеров приложение, либо забороть проблему средней лютости.

Хранилища данных

Быть в курсе про места, где складывают данные: файловые системы, различные носители информации от дискет до NVMe и программные надстройки над ними. Здесь же, должны быть знания баз данных (хотя бы на уровне sql/nosql) и областей их применимости. Знать SQL и хотя бы один его диалект, подозревать о иных языках запросов и сдержанно их ненавидеть за изобретение велосипедов. Понимать отличия декларативного сикуля от прочего императивного мракобесия и, следовательно, уметь мыслить сикулем. Само собой, ACID, структуры данных, индексы, чтение эксплейнов любой степени тяжести и оптимизация запросов на базовом уровне. Так же, будет неплохо понимать куда какие данные лучше сувать (кэш, логи, финансовую инфу etc), что там с хранилищами key-value, document-oriented, column-based и прочими достижениями непоседливых инженеров и их мысли.

Про интимные подробности различнх базёнок, например, про временнУю сложнось операторов в redis, про последовательность выполнения запроса в PG, про различные движки в ClickHouse или про лимиты BSON в Mongo можно не задумываться. Всё это логически вытекает из базовых знаний и Гугл радостно поможет с освоением, когда припрёт заюзать.

Английский

Вот так внезапно! Да, в нашем мире это тоже обязательный атрибут. Иначе, какой ты, нафиг, танкистсиньор? Как минимум, надо уметь гуглить на английском, читать технические тексты на нём же и, желательно, быть в состоянии описать свою проблему текстом, дабы спросить иностранных коллег по цеху. Если ещё и ртом говорить на нём умеешь, то вообще счастье!

Клингонский

Его техническим диалектов любой разработчик владеет «от рождения». С себе подобным мы можем коммуницировать крайне эффективно и даже не замечать что используем очень специфический набор терминов и синтаксических конструкций. Чтобы лучше понять о чём речь — посмотрите на рекрутёров. Им приходится изучать сей технический диалект, дабы коммуницировать с соискателями. Но, к сожалению, большинство рекрутёров не писали код в промышленных масштабах, а учили «язык» как любой другой иностранный. Отсюда же растут ноги кучи ляпов/мемов, которые регулярно появляются в описаниях вакансий и бодро разносятся по сообществу. Последний, кстати, про милф-разработчика.

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

Программирование

Один язык на уровне слепой печати продакшн кода из головы по запросу. Общее знание шаблонов проектирования и основных библиотек языка подразумевается. Если в арсенале есть что-нибудь низкоуровневое (по современным меркам), то жирный плюс. Ибо, например, после Си любой иной язык — это очень просто. Но, в любом случае, понимание алгоритмов и структур данных — в обязательном порядке. Ровно так же как и чёткое представление о ресурсах, их потреблении, управлении и учёте. То есть, вся эта магия с памятью и её уровнями, сложность алгоритмов (О разного размера), процессорное время, переключение контекстов, интерпретаторы/компиляторы, их особенности и плюсы/минусы хотя бы на базовом уровне. Чтобы, например, не удивляться «многопоточности» в GIL и его собратьях. Тут же процессы/треды/файберы и основные знания параллельного выполнения кода. Ну и основы функционального программирования. А то его, так или иначе, завезли уже во все языки программирования.

А как же фронтенд?

Да никак, просто в разделе «программирование» язык будет из подмножества js, а остальное останется без изменений. Ну и HTML+CSS добавится. Вёрстка, поток документа, приоритеты селекторов, работа с DOM-ом.

А как же <название распоследней js-библиотеки/фреймворка>? Так же — никак. Это не фундаментальные знания. В конце статьи будет более развёрнуто об этом.

Архитектура

Это когда понимаешь, как увязать воедино всё вышеозначенное, чтобы оно на своих местах было, дополняло друг друга, а не мешало и чтобы минимально необходимый набор инструментов/технологий был, а не зоопарк. Здесь же, масштабирование, отказоустойчивость, CAP-теорема, оценка необходимых ресурсов (вычислительных мощностей, пропускной способности, кол-ва воркеров etc) и прочие высокоуровневые штуки, которые серьёзные дяди рисуют квадратиками да стрелочками на доске и от выбора/конфигурации которых крайне сильно зависит успех всего последующего процесса разработки.

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

Управление

Тут есть несколько видов.

Планированием

То есть, понимание скрамов/канбанов/ватерфолов и бесхитростной анархии стартапов должно быть в ассортименте. Опыт взаимодействия с чем-нибудь типа Redmine/Jira/ZenHub/etc. Не должно возникать вопросов зачем происходит планирование, как, в первом приближении, оценить задачу при отсутствии половины требований, какие бывают методики оценок и когда какую хорошо применять. Представление об управлении рисками будет большим плюсом. С его помощью можно эффектно предложить забить на большой и тяжёлый кусок функциональности и чётко аргументировать почему это наилучший сценарий из возможных. Да и с бордер-кейсами будет работать гораздо легче, а не слепо закрывать их всех большими кусками бизнес-логики.

Кодом

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

Процессом разработки

От бранчевания, через тесты с кодоанализаторами до CI/CD и релизов. Почему тесты — это важно, почему не надо холиварить за линтинг, как быстро собрать CI/CD на коленке, как подкрутить существующий пайплайн под новые хотелки, как зарелизить чтобы потом не было мучительно больно и не пришлось красноглазить по пояс в консоли продакшена и прочие неприметные, но очень важные штуки.

Людьми

Труды Чалдини и Фромма штудировать не надо (хоть и увлекательно), но базовый набор навыков должен быть. Чтобы не говорить «Вася, твой код гумно, а ты мудак! Звездуй переделывать и шоб я это херню больше не видел!», а более конструктивно сообщать, что не были учтены некоторые требования, можно улучшить пару мест и если воспользоваться вооот этой приблудой, то можно сильно сэкономить время и силы. Иначе говоря, подавать личный пример, конструктивно помогать коллегам и, по мере сил, мотивировать окружающих на качественное исполнение своих обязанностей.

Софт-скилы

Как вы уже поняли из предыдущей части про управление, софт-скилы — это тоже часть синьора. Если гуру кода и владыка техники не может прокоммуницировать с ближним своим, то это очень крутой чувак, но не синьор. Эмоциональный интеллект должен присутствовать и активно использоваться по назначению. Надо уметь чётко описывать проблемы, пути их решения, аргументированно критиковать и предлагать альтернативы. Быть открытым к критике своих творений, а так же уверенно стучать пяткой в грудь и слать всех от джунов до С-левела на хрен, когда интуиция говорит, что вот тут должно быть именно так и никак иначе. Естественно, принимая на себя всю ответственность за такое решение. Если что, ответственность — это не только звиздюли, но и плюшки, если решение выстрелило и принесло с собой дополнительный профит и/или экономию. Последнее (в смысле, плюшки), нужно выбивать отдельно используя скил продаж. О нём ниже.

Навыки самопродажи и прочей торговли, увы, тоже обязательный атрибут. У нас капитализм, всё вокруг — это товар, а что не товар, то уничтожить (если не согласны — труды Ленина вам в помощь). Так вот, без продажи не то что на нормальную работу не устроишься, даже своего мнения, порой, не отстоишь. Так что в синьоре ещё и продажник должен жить. Небольшой, но въедливый и честный.

Что же в итоге получается?

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

Такого же растить минимум пятилетку в суровых условиях продакшена да в атмосфере профессионалов!

Всё верно. По времени, считай, как высшее образование получить, если не больше. Только без халтуры, пьяного угара, складывания прибора на занятия, а всего лишь с вджобыванием по 8+ часов каждый день… иногда не только будний. Можно сказать, это современная вышка, которую все хотят, но никто не хочет давать, ибо дорого!

Гдеж такого найдёшь?!

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

На самом деле, за бугром уже поняли проблему и хантят прямо со скамьи институтской, если не раньше. Вот тут хорошо описано сие действо и последствия. Так что кому надо, тот находит. Но кадров не хватает и страдают в общем-то, непричастные области. Чем это обернётся мы все с вами увидим в ближайшем будущем. А пока живём как завещал Конфуций врагам своим: «чтоб ты жил в эпоху перемен!»

Он же стоит как крыло от звездолёта и чугунный мост!

Всё верно. Три года назад я писал, что в РФ вилки вакансий были в районе 2–3к$, а потолок — в районе 5к$ (300к рублей по тем временам) да и то, таких вакансий было крайне мало и явно ставку там не указывали. Теперь же 5к$ — это вполне себе норма даже для РФ. Такую сумму открыто указывают. А если копнуть чуть глубже, то по России у рекрутинговых агентств потолок в районе 9к$. А если выйти на межгородмеждународный рынок, то там 10к$ — это не космос и далеко не предел. При этом, особо ценные кадры, пишущие код, могут быть придавлены и двадцаточкой, и опционом и ещё бонусом каким. И это мы ещё тактично умалчиваем про то что удалёнка может быть не одна (https://overemployed.com/). Короче, сами фантазируйте.

Что же делать?

Сухари сушить! Ну и базис прокачивать заодно с формированием целостной картины мира. Образование нам немного подкорректировали в последние пару десятков лет, поэтому кроме «помоги себе сам» ничего не остаётся. Кстати, если заметили, во всех вышеозначенных пунктах нет ничего про современные фреймворки, новомодные инструменты, библиотеки с переднего края науки и про прочие свежие и современные вещи. Всё относительно просто, базово и если отмотать лет на 10 назад, то мало что поменяется в повествовании. Потому что при всей скорости изменения мира разработки в частности и АйТи в целом, база остаётся одна и та же (хотя все старательно внушают нам обратное). При наличии той самой базы можно влиться в любой современный тренд за пару недель или месяцев и не испытывать никаких затруднений. Раскурить докер или разобраться с AWS при знании юникса и сетей? Легко! Изучить очередной js-фреймворк при наличии знаний в программировании? Да не вопрос! Освоить новую фишку очередного языка программирования? Позвольте, это же давно забытое старое и мы это уже знаем!

В общем, прокачивайте себя, товарищи! Употребляйте в достаточных количествах знания фундаментальные. Старательно откладывайте их про запас, интересуйтесь смежными областями и навыками по взаимодействию с окружающими гуманоидами. И не будет у вас иного пути и желания, кроме нанесения добра и причинения пользы себе и ближнему!

© Habrahabr.ru