Програмисти, ходете на интервюта

Програмисти, ходете на интервюта
Снимката е взета от видео от канала "Войнстващи аметисти»

Работих като системен програмист за Linux около 10 години. Това са модули на ядрото (kernel space), различни демони и работа с хардуер от потребителско пространство (user space), различни зареждащи програми (u-boot и т.н.), фърмуер на контролера и много други. Дори понякога се случваше да изрежете уеб интерфейса. Но по-често се случваше да седя с поялник и да общувам с дизайнери на печатни платки. Един от проблемите с такава работа е, че е доста трудно да се оцени нивото на вашата компетентност, тъй като може да познавате една задача много дълбоко, но може изобщо да не знаете друга. Единственият адекватен начин да разберете къде да отидете и какви течения има сега е да отидете на интервюта.

В тази статия бих искал да обобщя опита си от интервюиране за свободна позиция като Linux системен програмист, спецификата на интервюто, работата и как да прецените личното си ниво на знания чрез комуникация с бъдещ работодател и какво не трябва очаквайте от него.

Статията ще включва малък конкурс с награди.

Характеристики на професията

Системният програмист в конкретната област, в която работих, е пълен специалист: трябваше да пиша код и да отстранявам грешки в хардуера. И често имаше нужда да запоявате нещо сами. От време на време се случваше моите корекции на хардуера да се прехвърлят на разработчиците. Следователно, за да работите в тази област, ви е необходима доста добра база от знания, както в областта на цифровите схеми, така и в програмирането. Поради това интервютата за позиция системен програмист често изглеждат като търсене на специалист по електроника.

Програмисти, ходете на интервюта
Типична работна станция за системен програмист.

Снимката по-горе показва типичното ми работно място при отстраняване на грешки в драйвери. Логическият анализатор показва коректността на предаваните съобщения, осцилоскопът следи формата на ръбовете на сигнала. Освен това jtag дебъгерът не беше включен в рамката, който се използва, когато стандартните инструменти за отстраняване на грешки вече не се справят. И трябва да можете да работите с цялото това оборудване.

Често се случва по-бързо и по-лесно да презапоите някои елементи и сами да коригирате грешки в топологията, отколкото да занесете продукта на инсталатор. И тогава станция за запояване също се установява на вашето работно място.

Друга особеност на разработката на ниво драйвер и хардуер е, че Google не помага. Често трябва да търсите информация за проблема си и има три връзки, две от които са ваши собствени въпроси в някой форум. Или още по-лошо, когато попаднете на въпрос от същия беден човек, който го е задал преди 5 години в пощенския списък на ядрото и никога не е получил отговор. В тази работа, в допълнение към грешките в дизайна на хардуера и софтуера, често се срещат грешки в документацията - това са може би най-тежките и неприятни проблеми. Понякога регистрите са описани неправилно или изобщо няма описание за тях. Такива проблеми могат да бъдат решени само чрез научно вкарване на произволни числа в определени регистри (вид обратно). Често се случва процесорът да съдържа някаква функционалност, но никой освен вас не е внедрил тази функционалност (особено ако процесорът е нов). А това означава ходене по терена с гребло, 70% от които са за деца. Но когато има документация, дори и с грешки, това вече е напредък. Доста често се случва изобщо да няма документация и тогава започва ходенето през минни полета, когато желязото гори. И да, аз също успешно реших такива проблеми.

Интервюта

Моето мнение е, че трябва да ходите на интервюта поне веднъж на шест месеца, дори ако обожавате работата си и не искате да я променяте. Интервюто ви позволява да разберете нивото си на специалист. Вярвам, че най-ценните интервюта са тези, които се провалят. Те са тези, които най-точно показват кои тесни места в знанията ви трябва да бъдат подобрени.

Друга интересна характеристика е качеството на интервютата. Това е мое наблюдение и не е истина, признавам, че просто имах късмет. Ако интервюто върви по сценария:

  • Разкажи ни за себе си;
  • Ние имаме такива задачи;
  • ти харесваш?

И ако след този диалог се харесате, отидете на работа, тогава по правило компанията и задачите се оказват много приятни и адекватни. Ако едно интервю прилича на преминаване през 12 кръга на ада: първо интервю с HR, след това интервю с група програмисти, след това директора, още домашни и т.н., то по правило това са били провалени организации, в които не съм работил за много дълго. Отново, това е лично наблюдение, но като правило твърде много бюрокрация и проточен процес на наемане показват, че точно същите процеси протичат в компанията. Решенията се вземат бавно и неефективно. Имаше и обратни ситуации, когато имаше кръгове на ада на интервюто и компанията се оказа страхотна и когато след удар по китката компанията се оказа блато, но това е рядкост.

Ако смятате, че сценарият: срещнахте се, казахте за себе си и бяхте наети съществува само в малки компании, тогава не. Виждал съм това в много големи компании, които наемат повече от стотици хора и са представени на световните пазари. Това е нормален механизъм, особено ако имате богат опит и имате възможност да се обадите на предишните си работодатели и да попитате за вас.

За мен това е много добър показател за една компания, когато те поискат да покажат примери за своите проекти и код. Веднага се показва нивото на обучение на кандидата. И що се отнася до мен, от гледна точка на подбора на кандидати, това е най-ефективният метод за подбор от шоу интервютата. Всъщност можете да се провалите на интервю от вълнение или, напротив, да излезете от адреналин. Но в реалната работа не можете да се справите с реални задачи. И аз също се сблъсках с това, когато самият аз интервюирах хора. Идва специалист, показва се отличен, аз го харесах, той ни хареса. И аз се борих с най-простия проблем в продължение на месец и в резултат на това друг програмист го реши за няколко дни. Трябваше да се разделя с този програмист.

Особено ценя задачите по програмиране на интервюта. И тези, които трябва да бъдат решени точно по време на срещата, под стрес и домашна работа. Първият показва колко сте готови бързо и точно да решавате проблеми в стресова ситуация и извънредна ситуация. Вторият показва вашето ниво на компетентност и способност да търсите информация и да решавате текущи проблеми.

Най-интересните ми задачи бяха в отбранителния комплекс на страната ни. В процеса на работа трябваше да решавам просто фантастични проблеми, за които комерсиалните програмисти дори не са мечтали. Суперкомпютри, проектиране на рутери, различни системи за борба с възли - това е невероятно вълнуващо. Когато по време на парада видите комплекс, който съхранява вашия код, наистина е хубаво. Колкото и да е странно, интервютата с такива компании обикновено са много прости, буквално идват, харесват, приемат (вероятно спецификата на военните, които не обичат да говорят твърде много), се наслагват. Предизвикателствата, пред които се изправих там, бяха наистина интересни и предизвикателни. С натрупания опит се оказа, че са добри за учене на качествен системен програмист. Има и недостатъци и това дори не са ниските заплати. В момента заплащането в отбранителния комплекс е доста прилично, с бонуси и придобивки. Като правило има много бюрокрация, дълги работни часове, безкрайни бързи работи и работа под голям стрес. В някои случаи не може да се изключи секретност, което създава определени проблеми при пътуване в чужбина. Плюс, разбира се, тиранията на шефовете и това, уви, също се случва. Въпреки че моят опит от работа с представител на клиента е изключително приятен. Това е колективно впечатление на три различни изследователски института и компании, свързани с държавните поръчки за отбрана.

Задачи за интервю

За да няма недоразумения и за да не излагам фирмите, с които съм интервюирал, няма да предизвиквам съдбата и да посочвам техните данни. Но съм благодарен за всяко интервю, за времето, което хората отделиха за мен, за възможността да се погледна отстрани. Мога само да кажа, че задачите бяха за големи международни компании, представени в различни страни.

Ще ви кажа най-интересното: какви задачи се дават по време на интервюта. По принцип най-честите въпроси за вакантната позиция системен програмист и програмист на микроконтролери са битови операции, във всички възможни вариации. Затова се подгответе най-добре в тази област.

Втората най-поляризираща тема са указателните табели, това наистина трябва да ви изскочи през зъбите. За да те събудят посред нощ и да разкажеш и покажеш всичко.

Откраднах въпроси от няколко интервюта в главата си и ще ги представя тук, тъй като ми се струват доста интересни. Съзнателно не давам отговори на тези въпроси, за да могат читателите сами да отговорят на тези въпроси в коментарите и да имат малко пудра, когато преминават през истинско интервю.

Въпроси No1

I. Познаване на SI. Какво означават следните записи:

const char * str;

char const * str;

const * char str;

char * const str;

const char const * str;

Правилни ли са всички въведени данни?

II. Защо тази програма ще генерира грешка при сегментиране?

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

III. Да бъдеш умен.

Има пръчка дълга един метър. Десет мравки произволно падат върху нея, пълзящи в различни посоки. Скоростта на движение на една мравка е 1 m/s. Ако една мравка срещне друга мравка, тя се обръща и пълзи в обратната посока. Какво е максималното време, което трябва да изчакате всички мравки да паднат от пръчката?

Следващото интервю беше провал за мен и го смятам за най-полезното в моята програмна практика. Това показа дълбочината на моята некомпетентност. Преди това интервю бях запознат с всеки от тези въпроси и постоянно се появяваха в практиката ми, но някак си не им придавах особено значение и съответно не ги разбирах добре. Затова се провалих на този изпит позорно. И съм много благодарен, че се случи такъв провал, той ми подейства най-отрезвяващо. Мислите, че сте готин специалист, знаете дизайна на схемите, интерфейсите и работата с ядрото. И тогава имате истински въпроси и плувате. Така че да видим.

Въпроси за интервю #2

Хардуерни проблеми.

  • Как системните повиквания на Linux са подредени на асемблер на ARM процесор, на x86. Каква е разликата?
  • Какви инструменти за синхронизация има? Кои инструменти за синхронизация могат да се използват в контекст на прекъсване, кои не могат и защо?
  • Каква е разликата между i2c bus и spi bus?
  • Защо има терминатори на 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 ви е заредил, тогава добре дошли в коментарите. Подготвили сме малко състезание - условията са прости: пишете най-необичайната задача, която сте имали по време на интервю, читателите я оценяват (плюс), а след седмица обобщаваме резултатите и награждаваме победителя със забавни екстри.

Програмисти, ходете на интервюта

Програмисти, ходете на интервюта

Източник: www.habr.com

Добавяне на нов коментар