Програмісти, ходіть на співбесіди

Програмісти, ходіть на співбесіди
Зображення взято з відеоролика з каналу «Войовничі Аметисти»

Близько 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;

Чи всі записи коректні?

ІІ. Чому ця програма видасть помилку сегментації?

int main ()
{
       fprintf(0,"hellon");
       fork();
       return(0);
}

ІІІ. На кмітливість.

Є палиця завдовжки один метр. На неї випадково падають десять мурах, які повзуть у різні боки. Швидкість руху однієї мурахи 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 в коментарі. Ми підготували невеликий конкурс — умови прості: ви пишете найнезвичайніше завдання, яке у вас було на інтерв'ю, читачі проводять його оцінку (плюсом), а ми через тиждень підбиваємо підсумки та нагороджуємо переможця веселими ніштяками.

Програмісти, ходіть на співбесіди

Програмісти, ходіть на співбесіди

Джерело: habr.com

Додати коментар або відгук