- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

Об авторе

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

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

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

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

Про синьора

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

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

Фундамент

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

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

Сети

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

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

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

Оси

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

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

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

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

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

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

Английский

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

Клингонский

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

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

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

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

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

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

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

Архитектура

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

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

Управление

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

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

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

Кодом

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

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

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

Людьми

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

Софт-скилы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Автор:
Loriowar

Источник [36]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/371192

Ссылки в тексте:

[1] Леной Сёдерберг: https://avatars.mds.yandex.net/get-zen_doc/98165/pub_5c8a4031c650eb00b328311b_5c8a45545fe6a900b382db0e/scale_1200

[2] чёрного дерева: https://youtu.be/2BGTMMebY24?t=144

[3] эргодичность: https://ru.wikipedia.org/wiki/%D0%AD%D1%80%D0%B3%D0%BE%D0%B4%D0%B8%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C

[4] всякое: https://habr.com/ru/post/309126/

[5] обе: https://habr.com/ru/post/314654/

[6] стороны: https://habr.com/ru/post/414243/

[7] сюда: https://habr.com/ru/post/450608/

[8] кардинальные числа: https://ru.wikipedia.org/wiki/%D0%98%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%8F_%D0%B0%D0%BB%D0%B5%D1%84%D0%BE%D0%B2

[9] слесаря 6-го разряда: https://youtu.be/H-MjVkB9LHM?t=46

[10] пути обработки пакета: https://stuffphilwrites.com/wp-content/uploads/2014/09/FW-IDS-iptables-Flowchart-v2019-04-30-1.png

[11] Таненбаум завещал: https://www.labirint.ru/books/310025/

[12] пробить: https://tailscale.com/blog/how-nat-traversal-works/

[13] скриптец написать: https://habr.com/ru/post/590021/

[14] make install: https://habr.com/ru/post/130868/

[15] прилинкованы: https://man7.org/linux/man-pages/man1/ldd.1.html

[16] Кернигина с Пайком: https://avidreaders.ru/book/unix-universalnaya-sreda-programmirovaniya.html

[17] ffmpg: https://www.ffmpeg.org/

[18] ACID: https://ru.wikipedia.org/wiki/ACID

[19] key-value: https://en.wikipedia.org/wiki/Key%E2%80%93value_database

[20] document-oriented: https://en.wikipedia.org/wiki/Document-oriented_database

[21] column-based: https://en.wikipedia.org/wiki/Column-oriented_DBMS

[22] милф-разработчика: https://pikabu.ru/story/kazhetsya_ya_tochno_ne_budu_pervyim_8395139

[23] магия с памятью и её уровнями: http://rus-linux.net/lib.php?name=/MyLDP/hard/memory/memory.html

[24] О разного размера: https://ru.wikipedia.org/wiki/%C2%ABO%C2%BB_%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B5_%D0%B8_%C2%ABo%C2%BB_%D0%BC%D0%B0%D0%BB%D0%BE%D0%B5

[25] поток документа: https://developer.mozilla.org/ru/docs/Learn/CSS/CSS_layout/Normal_Flow

[26] CAP-теорема: https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_CAP

[27] Чалдини: https://ru.wikipedia.org/wiki/%D0%A7%D0%B0%D0%BB%D0%B4%D0%B8%D0%BD%D0%B8,_%D0%A0%D0%BE%D0%B1%D0%B5%D1%80%D1%82

[28] Фромма: https://ru.wikipedia.org/wiki/%D0%A4%D1%80%D0%BE%D0%BC%D0%BC,_%D0%AD%D1%80%D0%B8%D1%85

[29] Эмоциональный интеллект: https://ru.wikipedia.org/wiki/%D0%AD%D0%BC%D0%BE%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B8%D0%BD%D1%82%D0%B5%D0%BB%D0%BB%D0%B5%D0%BA%D1%82

[30] труды Ленина: https://ru.wikipedia.org/wiki/%D0%98%D0%BC%D0%BF%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%BC,_%D0%BA%D0%B0%D0%BA_%D0%B2%D1%8B%D1%81%D1%88%D0%B0%D1%8F_%D1%81%D1%82%D0%B0%D0%B4%D0%B8%D1%8F_%D0%BA%D0%B0%D0%BF%D0%B8%D1%82%D0%B0%D0%BB%D0%B8%D0%B7%D0%BC%D0%B0

[31] внутри: https://studme.org/220677/menedzhment/vneshnyaya_vnutrennyaya_motivatsiya

[32] тут: https://habr.com/ru/post/598305/

[33] https://overemployed.com/: https://overemployed.com/

[34] Сухари сушить!: https://youtu.be/YgqJ_0tOLzw?t=16

[35] целостной картины мира: https://ug.ru/anatolij-vasserman-glavnaya-zadacha-obrazovaniya-formirovanie-czelostnoj-kartiny-mira/

[36] Источник: https://habr.com/ru/post/600131/?utm_source=habrahabr&utm_medium=rss&utm_campaign=600131