Картинка взята из видеоролика с канала «Воинствующие Аметисты»
Около 10 лет я работал системным программистом под Linux. Это модули ядра (kernel space), различные демоны и работа с железом из пространства пользователя (user space), различные загрузчики (u-boot и др.), прошивки контроллеров и многое другое. Даже иной раз случалось пилить web-интерфейс. Но чаще бывало, что приходилось и с паяльником посидеть, да с проектировщиками печатных плат взаимодействовать. Одна из проблем такой работы это то, что достаточно сложно оценить уровень своей компетенции, поскольку одну задачу ты можешь знать очень глубоко, а рядом можешь не знать совсем. Единственный адекватный способ понять куда идти, и какие течения сейчас есть – это ходить на собеседования.
В данной статье хочу обобщить мой опыт похода по собеседованиям на вакансию системного программиста linux, особенности интервью, работы и как по общению с будущим работодателем оценить личный уровень знаний и чего от этого ожидать не стоит.
В статье будет небольшой конкурс с призами.
Особенности профессии
Системный программист, в той специфике, в которой работал я — это полный универсал: мне приходилось как писать код, так и отлаживать железо. И часто возникала необходимость что-то паять самостоятельно. Периодически, случалось что мои корректировки по железу передавались потом разработчикам. Поэтому, для работы в этой сфере требуется достаточно хороший багаж знаний, как в области цифровой схемотехники, так и в области программирования. Из-за этого, часто собеседования на вакансию системного программиста выглядят как поиск специалиста по электронике.
Типичное рабочее место системного программиста.
На фото выше — моё типичное рабочее место в момент отладки драйверов. Логический анализатор показывает корректность передаваемых посылок, осциллограф контролирует форму фронтов сигнала. Так же в кадр не попал jtag-отладчик, который применяется тогда, когда стандартные средства отладки уже не справляются. И со всем этим парком оборудования необходимо уметь работать.
Часто бывает, что перепаять какие-то элементы, исправить ошибки топологии быстрее и проще самому, чем носить изделие монтажнику. И тогда на твоём рабочем месте поселяется ещё и паяльная станция.
Ещё особенность разработки на уровне драйверов и железа заключается в том, что гугл не помогает. Часто приходится искать информацию по своей проблеме, а там три ссылки, из которых две — это твои же вопросы на каком-то форуме. Или ещё хуже, когда встречаешь вопрос такого же бедолаги, который задавал его 5 лет назад в списке рассылки ядра, да так и не получил на него ответа. В этой работе, кроме ошибок в проектировании как аппаратной части, так и программной, сплошь и рядом встречаются ошибки документации — это наверное самые лютые и неприятные проблемы. Бывает некорректно описаны регистры, либо вообще отсутствует описание на таковые. Такие проблемы решаются только методом научного тыка случайных чисел в определённые регистры (этакий реверс). Часто бывает ещё такое, что в процессоре заложен какой-то функционал, а кроме тебя этот функционал никто не реализовывал (особенно, если процессор новый). И это хождение по полю с граблями, из которых 70% детские. Но когда есть документация, даже с ошибками — это уже прогресс. Достаточно часто бывает, что документации вообще нет, и вот там начинается хождение уже по минным полям, когда горит железо. И да, такие задачи тоже с успехом решал.
Собеседования
Моё мнение, что на собеседования стоит ходить где-то не реже, чем раз в пол года, даже если вы обожаете свою работу, и не хотите её менять. Собеседование позволяет понять свой уровень, как специалиста. Я считаю, что самые ценные собеседования — провальные. Именно они наиболее точно показывают какие узкие места своих знаний стоит подтянуть.
Ещё одна интересная особенность — это качество собеседований. Это моё наблюдение, и оно не является истиной, допускаю, что мне просто так везло. Если собеседование проходит по сценарию:
- расскажите о себе;
- у нас такие задачи;
- вам нравится?
И если после этого диалога вы друг другу понравились, ты выходишь на работу, то как правило компания и задачи оказываются весьма приятными и адекватными. Если собеседование напоминает прохождение 12 кругов ада: первое собеседование с HR, потом собеседование с группой программистов, потом директор, ещё домашние задания и т.д., то как правило это были провальные организации в которых я работал не очень долго. Опять же — это личное наблюдение, но как правило слишком большая бюрократия и затянутый процесс принятия на работу показывает что такие же точно процессы протекают внутри компании. Решения принимаются медленно и неэффективно. Были и обратные ситуации, когда были круги ада собеседований, а компания оказывалась шикарной, и когда после хлопка по рукам компания оказалась болотом, но это редкости.
Если вы думаете, что сценарий: встретились, рассказали о себе и приняли на работу, существует только в маленьких компаниях, то нет. Я такое видел в очень крупных компаниях, в которых работают больше сотен человек и представленных на мировых рынках. Это нормальный механизм, тем более если у тебя есть богатый послужной список и есть возможность обзвонить твоих предыдущих работодателей и расспросить о тебе.
Для меня очень хороший показатель компании, когда просят показать примеры своих проектов и кода. Сразу показывается уровень подготовки соискателя. И, как по мне, с точки зрения отбора кандидатов — это самый эффективный способ отбора, чем показные собеседования. По сути на собеседовании можно провалиться от волнения, или наоборот вылезти на адреналине. Но в реальной работе с реальным задачами не справляться. И с таким я тоже сталкивался, когда сам собеседовал людей. Приходит специалист, показывает себя отлично, мне понравился, мы ему понравились. И с простейшей задачей мучился месяц, в результате другой программист её решил за пару дней. С тем программистом пришлось расстаться.
В собеседованиях особенно сильно ценю программистские задачи. И те которые приходится решать прямо во время встречи, в стрессе, так и домашние задания. Первое показывает насколько ты готов быстро и точно решать задачи в стрессовой ситуации и аврале. Вторая, показывает уровень твоей компетенции и умение искать информацию и решать текущие задачи.
Самые интересные места работы у меня были в оборонном комплексе нашей страны. В процессе работы приходилось решать просто фантастические задачи, которые коммерческим программистам даже и не снились. Суперкомпьютеры, проектирование маршрутизаторов, различных узловых боевых комплексов — это безумно увлекательно. Когда во время парада видишь комплекс, который хранит в себе твой код, это правда приятно. Как ни странно, собеседования в такие компании, как правило очень простые, буквально пришёл, понравился — принят (наверное накладывается специфика военных, которые не любят размусоливать). Задачи, с которыми мне приходилось там сталкиваться, по-настоящему интересные и сложные. С опытом пришло, что на них хорошо учиться быть качественным системным программистом. Недостатки тоже есть, и это даже не низкая оплата труда. На данный момент зарплата в оборонном комплексе вполне достойная, с бонусами и плюшками. Как правило — это большая бюрократия, ненормированный рабочий день, бесконечные авралы, работа в большом стрессе. В определённых случаях нельзя исключить секретность, которая добавляет определённые проблемы для выезда за рубеж. Плюс, конечно, самодурство начальников-сапогов, и такое, увы, тоже бывает. Хотя опыт работы именно с представителем заказчика, у меня, исключительно приятный. Это собирательное впечатление о трёх различных НИИ и компаний связанных с гособоронзаказом.
Задачи на собеседованиях
Чтобы не было недоразумений и для того, чтобы не подставлять компании в которых собеседовался, не буду искушать судьбу и указывать их данные. Но я благодарен за каждое собеседование, за то время которое уделили мне люди, за возможность посмотреть на себя со стороны. Могу только сказать, что задачи были в крупные международные компании, представленные в разных странах.
Расскажу самое интересное: какие задачи дают на собеседованиях. Вообще, самые частые вопросы на вакансию системного программиста и программиста микроконтроллеров — это битовые операции, во всевозможных вариациях. Поэтому готовьтесь наиболее хорошо именно по данному направлению.
Вторая по полярности тема — это указатели, вот это прям должно от зубов отскакивать. Так, чтобы вас среди ночи разбудили и вы могли всё рассказать и показать.
С нескольких собеседований я в своей голове утащил вопросы, и приведу их тут, так как нахожу их достаточно интересными. Умышленно не даю ответы на данные вопросы, чтобы читатели могли самостоятельно ответить на эти вопросы в комментариях и был небольшой порох при прохождении реального собеседования.
Вопросы №1
I. На знание СИ. Что означают следующие записи:
const char * str; char const * str; const * char str; char * const str; const char const * str;
Все ли записи корректны?
II. Почему эта программа выдаст ошибку сегментации?
int main () { fprintf(0,"hello\n"); fork(); return(0); }
III. На сообразительность.
Имеется палка длиной в один метр. На неё случайным образом падают десять муравьёв, которые ползут в разные стороны. Скорость движения одного муравья 1 м/с. В случае если муравей встречается с другим муравьём, то он разворачивается и ползёт в противоположную сторону. Какое максимальное время нужно прождать, чтобы все муравьи упали с палки.
Следующее собеседование было для меня провальным, и я считаю его самым полезным в моей программистской практике. Оно показало всю глубину моей некомпетентности. До этого собеседования я был знаком с каждым из этих вопросов и они постоянно встречались на моей практике, но как-то не придавал им большого значения, соответственно и не разбирался в них на пятерку. Поэтому данный экзамен, я с позором провалил. И я очень благодарен, что такой провал свершился, это подействовало на меня максимально отрезвляюще. Ты думаешь, что ты крутой специалист, знаешь схемотехнику, интерфейсы, работу с ядром. И тут на тебе реальные вопросы и ты поплыл. Итак, посмотрим.
Вопросы собеседования №2
Аппаратные вопросы.
- Как устроены системные вызовы linux на языке ассемблера на ARM-процессоре, на х86. В чём отличие?
- Какие средства синхронизации бывают? Какие средства синхронизации можно использовать внутри контекста прерывания, какие нет и почему?
- Чем отличается шина i2c от spi?
- Для чего на шине i2c стоят терминаторы и какой их номинал?
- Может ли интерфейс RS-232 работает ТОЛЬКО по двум проводам: RX и TX? Тут дам ответ: Оказывается, что плохонько, на 9600, но может!!!
- А теперь второй вопрос: почему?
- Как лучше располагать сигнальные линии и питание в многослойных платах и почему? Питание внутри слоёв, или сигнальные линии внутри слоёв? (Вопрос вообще сугубо по схемотехнике).
- Для чего у дифференциальных линий дорожки идут везде вместе?
- Шина RS-485. Обычно на такой линии есть терминаторы. Однако, у нас схема звезда, с переменным количеством подключаемых модулей. Какие средства избежания коллизий и помех нужно использовать?
- Что такое красное и бинарное дерево?
- Как работать с cmake?
- Вопросы о сборке yocto linux.
Задачи на этом собеседовании:
1. Написать функцию, которая инвертирует вuint32_t
все биты. (работу с битами очень любят на собеседованиях, рекомендую)
2.
int32_t a = -200; uint32_t b = 200; return *(uint32_t) * (&a)) > b;
Что вернёт данная функция? (решение на бумаге, без ЭВМ)
3. Функция расчёта среднего арифметического двух чиселint32_t
.
4. Какие способы вывода в программах, в т.ч. в поток ошибок.
Третий отбор был относительно недавно, и я не удивлюсь если там до сих пор есть такая анкета, так что не буду раскрывать компанию, чтобы не подставлять их… Но в общих чертах приведу пример возможных вопросов, и если вы узнали ваши вопросы, то передаю привет :).
Вопросы собеседования №3
- Приводится пример кода обхода дерева, необходимо рассказать что делается в данном коде и указать на ошибки.
- Написать пример утилиты ls. С простейшей опцией “-l”.
- Привести пример как сделать статическую и динамическую линковку. В чём разница?
- Как работает RS-232? Чем отличается RS-485 от RS-232? В чём отличие RS-232 от RS-485 с точки зрения программиста?
- Как работает USB (с точки зрения программиста)?
- Перевод технического текста с русского на английский язык.
Успешное собеседование — не залог успешной работы
Эта глава скорее даже не для программистов(хотя и для них тоже), а больше для HR. Наиболее адекватные компании не смотрят дотошно результаты собеседований. Ошибаться нормально, чаще всего смотрят именно на то как человек умеет решать задачи и рассуждает.
Одной из ключевых проблем бывает то что кандидат с успехом решает задачи на собеседованиях, показывает себя прекрасным специалистом, но сливается на первой же реальной задаче. Не буду лукавить, у меня такое тоже было. С успехом прошёл все круги ада, решил все тестовые задания, но в реальных условиях работа оказалась не по зубам из-за банальной неопытности. Попасть на борт — это ещё не самая сложная задача. Самое сложное — это удержаться на борту данной компании.
Поэтому я больше доверяю компаниям, которые проводят простые собеседования с кандидатом и говорят: после первого месяца работы и так будет понятно подходите вы нам или нет. Это самый адекватный подход, да, возможно немного дорогой, но зато сразу понятно кто есть кто.
Есть и ещё один вариант собеседований: когда ты его с успехом проходишь, но по результатам собеседования понимаешь что работодатель полный неадекват. Я сразу отказываюсь от работы, если мне предлагают работать как ИП, суля большие доходы. Это форма ухода от налогов действующей организации, и почему проблемы работодателя должны волновать меня, как программиста? Другой вариант, это различные госструктуры. У меня было собеседование, по результатам которого мне предложили хорошую зарплату, но сказали что предыдущий программист уволился, заболел, умер, ушёл в запой из-за нагрузки и ваш рабочий день начинается в 8 утра. С такого места тоже бежал так, что пятки сверкали. Да, HR обратите внимание, что программисты готовы отказаться даже от самой вкусной вакансии, если рабочий день должен начинаться рано утром.
В конце приведу отличное видео отбора программиста, скриншот которого приведён в начале этой статьи. Такое собеседование у меня тоже было и не один раз. Если вы видите самодурство на этапе вопросов, то уважайте себя, встаньте, возьмите вещи и уйдите — это нормально. Если HR и руководитель на собеседовании самоутверждаются за счёт вас — это говорит о токсичности компании и вам там работать не следует, если только вы не любите неадекватных начальников.
Выводы
Программисты, ходите на собеседования! Причём старайтесь идти всегда на повышение. Допустим, если вы получаете N денег, то идите на собеседование минимум на оплату N*1,2, а лучше N*1,5. Даже если вы не возьмёте эту вакансию сразу, то поймёте что же нужно для этого уровня оплаты.
Мои наблюдения, показали что решает хорошее знание английского языка, достаточно богатый опыт работы в отрасли и уверенность в себе. Последнее — это главное качество, как и везде в жизни. Как правило, более уверенный кандидат может успешнее пройти собеседование, даже при наличии большего количества ошибок, чем отличный, но более стеснительный и инициативный соискатель. Удачи на собеседованиях!
P/S Конкурс
Если у вас есть интересные примеры задачек, которыми вас загрузил HR, то welcome в комментарии. Мы подготовили небольшой конкурс — условия просты: вы пишете самое необычное задание которое у вас было на интервью, читатели проводят его оценку (плюсом), а мы через неделю подводим итоги и награждаем победителя весёлыми ништяками.
Bruce_Robertson
Aushilfskraft
Самое идиотское — пояснять, почему он любимый. Я бы не осилил
( Про любимый мем было забавнее. С деревом просто непонятно и незабавно)
VtaliyVasilyevich
Есть в этом логика: если корень сверху, ты — пингвин, если снизу, ботаник.
Aushilfskraft
А если я иву нарисую, это будет кривой успеха моих проектов?
Может, она просто красивой кажется. Может, меня вдохновение вело,
а не практичность или эффективность?
Камыш, осока, деревня…
Фанат AC\DC уж тогда, чтобы солиднее выглядеть)
Stalker_RED
У меня было однажды. Это часть теста дом-дерево-человек, в психологов играются.
0xd34df00d
Меня как-то попросили просто написать объявление бинарного дерева. Обсуждали эту задачу где-то полчаса.
Собеседование, кстати, было одно из самых приятных в моей жизни — на разработчика на идрисе, и в типе дерева надо было гарантировать, что оно будет всегда сбалансированным.
wataru
Ого, а так можно вообще?
0xd34df00d
Если типы зависимые, то да.
С балансировкой чуть сложнее (особенно когда нужно гарантировать не прямое равенство глубины поддеревьев, что просто, а, скажем, отличие не более чем в два раза между наикратчайшим и наидлиннейшим путем), но гарантировать «поисковость» дерева, например, можно, если вы напишете что-то в духе
Идея в том, что мы в типе дерева храним диапазон значений (зачем и нужны завтипы), которые содержатся в этом дереве. Диапазон листа тривиален и вырождается в одну точку. Диапазон внутреннего узла — объединение диапазонов левого и правого поддерева, при этом, чтобы внутренний узел сформировать, нужно иметь доказательство, что правая граница левого поддерева меньше хранящегося в нём значения, и аналогично для левой границы правого поддерева.
Format-X22
Однажды я был на собеседовании в компанию, которая делала софт для психологов. Помимо технического интервью там было интервью с главным психологом. Вопросы там были конечно соответствующие. В конце мне даже рассказали про мою личность, и всякое такое. Это было необычно… но очень не приятно, не для того всё же пришел, возможно там параллельно ещё была проверка на стрессоустойчивость. И на сколько у меня математическое мышление. И на сколько развитая у меня личность. И на работу с оценочными суждениями. И вообще.
В общем очень сомнительно. Но запомнилось, да.