Картинка взята из видеоролика с канала «Воинствующие Аметисты»

Около 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
  1. Приводится пример кода обхода дерева, необходимо рассказать что делается в данном коде и указать на ошибки.
  2. Написать пример утилиты ls. С простейшей опцией “-l”.
  3. Привести пример как сделать статическую и динамическую линковку. В чём разница?
  4. Как работает RS-232? Чем отличается RS-485 от RS-232? В чём отличие RS-232 от RS-485 с точки зрения программиста?
  5. Как работает USB (с точки зрения программиста)?
  6. Перевод технического текста с русского на английский язык.

Успешное собеседование — не залог успешной работы


Эта глава скорее даже не для программистов(хотя и для них тоже), а больше для HR. Наиболее адекватные компании не смотрят дотошно результаты собеседований. Ошибаться нормально, чаще всего смотрят именно на то как человек умеет решать задачи и рассуждает.

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

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

Есть и ещё один вариант собеседований: когда ты его с успехом проходишь, но по результатам собеседования понимаешь что работодатель полный неадекват. Я сразу отказываюсь от работы, если мне предлагают работать как ИП, суля большие доходы. Это форма ухода от налогов действующей организации, и почему проблемы работодателя должны волновать меня, как программиста? Другой вариант, это различные госструктуры. У меня было собеседование, по результатам которого мне предложили хорошую зарплату, но сказали что предыдущий программист уволился, заболел, умер, ушёл в запой из-за нагрузки и ваш рабочий день начинается в 8 утра. С такого места тоже бежал так, что пятки сверкали. Да, HR обратите внимание, что программисты готовы отказаться даже от самой вкусной вакансии, если рабочий день должен начинаться рано утром.

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


Выводы


Программисты, ходите на собеседования! Причём старайтесь идти всегда на повышение. Допустим, если вы получаете N денег, то идите на собеседование минимум на оплату N*1,2, а лучше N*1,5. Даже если вы не возьмёте эту вакансию сразу, то поймёте что же нужно для этого уровня оплаты.
Мои наблюдения, показали что решает хорошее знание английского языка, достаточно богатый опыт работы в отрасли и уверенность в себе. Последнее — это главное качество, как и везде в жизни. Как правило, более уверенный кандидат может успешнее пройти собеседование, даже при наличии большего количества ошибок, чем отличный, но более стеснительный и инициативный соискатель. Удачи на собеседованиях!

P/S Конкурс


Если у вас есть интересные примеры задачек, которыми вас загрузил HR, то welcome в комментарии. Мы подготовили небольшой конкурс — условия просты: вы пишете самое необычное задание которое у вас было на интервью, читатели проводят его оценку (плюсом), а мы через неделю подводим итоги и награждаем победителя весёлыми ништяками.