Разработчик ядра Linux
Итак, перечень вопросов, которые мы задаем представителям ведущих компаний:
1. Какими знаниями и навыками должен обладать разработчик ядра Linux?
2. Каков инструментарий разработчика?
3. Каковы требования компании к уровню образования потенциальных сотрудников?
4. Какие требования предъявляются к опыту работы?
5. Есть ли особые требования, которые обусловлены спецификой деятельности компании?
Денис Якубович, заместитель генерального директора компании Zecurion
1. Необходимые знания и навыки для данной позиции в нашей компании:
- Твердые знания языка С.
- Понимание архитектуры ядра, его подсистем, способов взаимодействия (Linux kernel 2.6.*, 3.*.*).
- Понимание принципов работы с системой контроля версий GIT.
- Опыт работы с компилятором gcc (+Linux LD, Linker scripts). Владение make/automake/autotools.
- Базовые знания схемотехники (умение пользоваться осциллографом).
- Знания аппаратных архитектур (x86, ARM).
- Владение средствами отладки (jtag, gdb, objdump).
- Большой плюс – наличие коммитов в mainline (умение формировать, описывать патчи).
2. Основной инструментарий разработчика, необходимый для выполнения работ:
- Рабочая ОС – Ubuntu (по умолчанию, но возможен и другой дистрибутив).
- IDE – eclipse, emacs, vim.
- Сборка – toolchain целевых архитектур, различные билд-системы.
- Отладка – jtag, gdb, objdump.
- Документирование – wiki, OpenOffice.
3. Высшее образование в области компьютерных наук, знание английского языка (intermediate).
4. В зависимости от целевого уровня (junior-expert). Минимально – опыт работы в коммерческих проектах под Linux
от года (как плюс – наличие своего Open Source-проекта).
5. Для нашей компании нужны соискатели, имеющие опыт работы с различными процессорными архитектурами (ARM, MIPS, PowerPC, SH4, AVR32, Blackfin), платформами (TI Sitara/Davinci/OMAP, Marvell Kirkwood, Atmel, STMicroelectronics, Realtek, Freescale iMX/QorIQ), а также с широким набором интерфейсов: I2C, SPI, CAN, RS-232/UART, RS-485, NAND, USB, EMIF, etc. и типов памяти: NOR/NAND flash, CF/MMC/SD, FRAM/NVRAM, DDR/DDR2/DDR3.
Дмитрий Филиппов, менеджер по маркетингу продуктов JetBrains
1. Разработчик ядра Linux – такой же программист, как и те, кто работает не в ядре, просто обладающий специфическими знаниями и умениями. В мире ядерных программистов, в том числе коммерческих, существуют и новички и разработчики среднего уровня, ну и, конечно, никуда без не очень большой группы разработчиков-экспертов. Минимум знаний и навыков для того, чтобы работать с ядром, – это:
- Отличное владение языком С.
- Понимание основ операционных систем.
- Знание хотя бы элементарных алгоритмов, применяемых в программировании.
- Терпение, вдумчивость, лаконичность.
2. Инструментарий разработчика ядра настолько же прост и лаконичен, как и код, который он должен писать. Перечислю базовый:
- Удобный редактор кода. Например, vim или emacs.
- Нужен сам код ядра и средства для синхронизации и работы с исходным кодом. Подразумевается системы контроля версий VCS. Обычно разработчики ядра Linux используют git. Но в некоторых компаниях может быть своя система контроля версий, с которой тоже нужно уметь работать. Например, subversion или mercurial.
- Специфичный для ядра набор инструментов начинается с компилятора языка С – GCC. Это стандартный и единственный компилятор, работающий с ядром Linux.
- Утилиты binutils тоже являются составной частью инструментария разработчика ядра. Без них компилировать ядро невозможно, так как многие утилиты из этого пакета используются в make скриптах.
- Утилиты make, diff, patch тоже входят в набор инструментария разработчика. Их знание обязательно.
- Для эффективной работы с кодом нам нужна навигация в нем. Для этого используются ctags и etags. Лично для меня удобными оказались проекты Linux Cross Reference (LXR), когда онлайн можно быстро и хорошо снавигироваться в нужные участки кода, а также быстро подсмотреть эти участки кода в других версиях ядра.
- Для экспериментов с ядром потребуется sandbox. Для этих целей хорошо подходят виртуальные машины.
3. Абсолютно неважно, неполное среднее у тебя или ты кандидат наук плюс второе высшее. Критерий один – может человек выполнять возложенные на него обязанности или нет. Я встречал много программистов-самоучек очень высокого уровня, получающих очень неплохие зарплаты. Так что теоретически для того, чтобы начинать работать, не нужно никакое специальное образование.
4. От компании к компании, от проекта к проекту требования к опыту работы разные. На российском рынке труда имеется реальный дефицит квалифицированных программистов не только ядра Linux, но и программистов на С в принципе. В такой ситуации любому кандидату хотя бы с минимальным, но с хорошим и честным опытом работы с ядром с радостью предложат работу в любой адекватной компании. Далее степень опытности влияет лишь на грейд. Если у человека хороший опыт, скажем, написания драйверов, например, от четырех лет, то ему, вероятно, предложат уже senior-позицию. А если у вас хорошее владение С, базовый опыт программирования и знание основ ядра, то, вероятно, этого будет достаточно, чтобы начать работать на junior-позиции разработчика ядра Linux.
5. Когда мы говорим о разработке ядра Linux, мы имеем в виду любую работу с кодом ядра. Это может быть написание кода в какой-либо из подсистем ядра или написание или модификация драйвера, или верификация, или анализ, или тестирование кода. Ядро настолько большое и настолько разносторонне применимое, что разные компании специализируются на абсолютно разных задачах и работают с разными частями кода. Из этого вытекают специфические требования. Но есть одно важное требование, предъявляемое почти всеми компаниями ко всем кандидатам, – знание английского языка.
Павел Емельянов, архитектор департамента серверной виртуализации в Parallels
1. Знание хотя бы одной аппаратной платформы, опыт системного программирования.
2. Не имеет значения. Главное чтобы он был, и человек им владел свободно.
3. Этот пункт в резюме не имеет особого значения, опыт работы – гораздо важнее всего остального.
4. Сначала мы пытались требовать от соискателей опыт работы именно в ядре, но потом поняли, что в Москве таких людей почти нет (а те, кто есть, ограничивались драйверами). Так что из ядерно-специфичных требований осталось только одно – знание архитектуры x86.
5. Я бы выделил три неядерных пункта, на которые мы обращаем особое внимание:
- умение придумать и доходчиво объяснить алгоритм решения какой-либо задачи;
- работа с основными структурами данных (списки, деревья) не должна вызывать трудностей;
- человек должен знать, что такое «сложность алгоритма» и уметь пользоваться этим знанием.
Большой плюс кандидата – это опыт, связанный с виртуализацией железа, например, использование или патчи к Linux's KVM или хотя бы чтение мануалов. Ну и использование Linux как домашней ОС в своем десктопе.
HR-взгляд: Чернецова Валерия, руководитель отдела аналитики рекрутингового портала Superjob.ru
Открытые вакансии для разработчиков ядра Linux предусматривают следующий типовой набор требований к профессиональным навыкам и опыту: отличное знание языка С; понимание принципов работы операционных систем, опыт системного программирования; знание TCP/IP и архитектуры Linux, умение ориентироваться в исходных текстах ядра; знание скриптовых языков (perl, bash, python), знание файловых систем и моделей разграничения прав в Linux, владение английским языком на уровне чтения технической документации.
Требования к образованию практически не встречаются в описаниях вакансий, поскольку основным требованием к таким работникам является наличие профильного опыта работы, а именно, опыта программирования на уровне ядра Linux.
В зависимости от компании/ вакансии/проекта, требуются или приветствуются определенные навыки и знания.
Подготовил Игорь Штомпель