Станислав Фомин, директор по технологиям компании «НТЦ ИТ РОСА»
1. Сразу отмечу, что понятие «Linux-разработчик» очень расплывчато. С одной стороны, как нередко считается, Linux – это в первую очередь ядро – крупный, ключевой, но далеко не единственный компонент в любом Linux-дистрибутиве, и формально Linux-разработчик – это kernel developer. Но обычно под Linux-разработчиком все-таки подразумевается прикладной программист, разрабатывающий хоть что-то, программу ли с графическим интерфейсом или прикладной сервис для работы под каким-либо Linux-дистрибутивом или библиотеку, обеспечивающую работу этих решений. Часто туда попадает и классическая веб-разработка, если она некоторым образом связана с системной частью, например, написание веб-интерфейсов конфигурирования.
В любом случае, даже разработка прикладных решений требует «классической профессиональной грамотности» настоящего программиста, и от него требуется
бегло владеть современными системами управления версиями, скорее распределенными, такими как Git и Mercurial. Ибо классические централизованные системы, такие как Subversion и TFS, которые еще часто применяются в корпоративной разработке информационных систем, уже практически вымерли в Linux-мире. Кроме того, Linux-разработка характерна максимальным использованием Open Source-библиотек и фреймворков, которые в подавляющем большинстве живут в Git-репозиториях.
При разработке многих Linux-систем используются языки программирования C и C++, так что нужно, кроме этих языков, знать классический стек компилирования и сборки – опции компилятора и линковщика, различные средства сборки: make, autotools/cmake/scons и т.п.
Представлять базовый процесс разработки хотя бы на уровне Code&Fix и основные средства коммуникации и документирования – трекер задач и ошибок, вики-системы – таких систем полно, но принципы работы у них схожие.
Уметь самостоятельно добывать информацию – гуглить, извлекать разрозненную и устаревшую информацию из багтрекеров и форумов, общаться с разработчиками открытых библиотек и приложений. В отличие от корпоративной разработки по известным технологиям, когда все правильные архитектурные шаблоны, библиотеки и фреймворки уже придуманы иесть исчерпывающая документация, как на конвейере превращать бизнес-требования в рабочую систему, тут, в мире опенсорса, и библиотеки, и интерфейсы постоянно меняются, и надежной и стабильной документации не хватает. Разумеется, необходим технический английский.
Наверное, стоит упомянуть и об обычной грамотности продвинутого пользователя (запуск приложений, манипуляции файлами, браузер-почта-чаты, текстовые процессоры и таблицы), и все это не c «общеизвестным Windows-интерфейсом», а на каком-либо графическом рабочем столе для Linux. А вот дальше возможны варианты, перечислим их в порядке повышения «условного уровня» программирования, причем чем выше уровень, тем меньше «хардкорности», проще разрабатывать и отлаживать, требуется меньше специфических знаний.
Если речь идет о программировании ядра, то тут нужно хорошо знать низкоуровневое программирование на С, а желательно и на ассемблере для соответствующих архитектур процессора. Важно уметь разбираться во множестве интерфейсов ядра: системных структурах данных, протоколах общения с зоопарком устройств, механизмах управления памятью ипроцессами, работе с прерываниями и т.д. Нужно уметь работать и со средствами низкоуровнего параллелизма: блокировками, отложенным выполнением задач, «атомарными операциями» и многими другими. Большая часть изобретений, облегчающих жизнь программисту, – IDE со встроенной отладкой тут, увы, не поможет. Практически любая ошибка приводит ккритическому падению, причем причины в ряде ситуаций (вероятностные «гейзенбаги», гонки в параллельных процессах, глюки устройств) найти весьма непросто – в основном приходится полагаться на post-mortem анализ отладочных логов. Могут помочь и специальные сборки с инструментами дополнительных проверок в реальном времени, таких как Lockdep, KAsan, Kmemleak и др.
Очень близко к «kernel»-разработке находится программирование встроенных Linux-систем – как правило, это тоже экономия каждого байта, С/C++-программирование, возможно с ассемблерной оптимизацией, тонкости работы с ненадежными устройствами. Хотя с ростом мощности программируемых устройств уровень программирования часто повышается, встречается и Java-программирование, и даже программирование на медленных скриптовых языках, таких как Python.
Выше лежит уровень эффективных прикладных сервисов и системных библиотек – это, как правило, С/C++-программирование с общением через файловую систему, разделяемую память и сетевые сокеты, – тут и системы управления базами данных, и высокоэффективные очереди, т.е. системы, либо обеспечивающие платформу для более высокоуровневых информационных систем, либо сами являющиеся высокоэффективной прикладной системой (скоростные биржевые торги и т.п.). Тут уже есть вполне эффективные С/C++ IDE, помогающие эффективной разработке, – например, Qt Creator или Eclipse-CDT, и полезно «прокачивать костный мозг», изучая все их возможности – клавиaтурные сочетания, intellisense… чтобы повысить личную и командную эффективность. Но и тут могут потребоваться низкоуровневые знания – понимание устройства файловых систем и работы сетевого стека протоколов.
Еще выше начинается прикладная разработка приложений с графическим интерфейсом, специфичным для линукс-систем. В Linux-мире есть два основных конкурирующих фреймворка для написания максимально нативных десктопных приложений с GUI – это GTK и Qt. Соответственно в этом случае программисту нужно знать развесистые иерархии классов виджетов этих фреймворков, тонкости дизайна. В любом случае, даже прикладные приложения могут содержать хитрую системную часть, требующую низкоуровневой работы с устройствами или файловой системой.
Еще легче разработка с использованием мультиплатформенных Java- или Python-стеков, даже если приложение специально заточено под конкретный Linux-дистрибутив. Опять-таки, несмотря на кажущуюся легкость Python-программирования, на самом деле основная сложность может быть связана с выполняемой системной задачей. Так, например, инсталляторы к Linux-дистрибутивам пишут на Python или Perl, но нельзя просто взять и пустить туда простого питон-программиста – там сложность будет в многоуровневом процессе загрузки (UEFI/Secureboot/…), задачах разбиения диска со всеми тысячами возможных опций (LVM-контейнеры – шифрование и т.п.).
Где-то тут я бы расположил задачи классического системного администрирования – написание небольших скриптов на bash, Perl или Python, конфигурационных файлов, что требует совсем небольших познаний в программировании, но часто глубокого понимания взаимодействия различных компонентов операционной системы. Да, из-за этого часто удивляются, что «системный Windows-программист пишет драйверы устройств на ассемблере, а системный Linux-программист пишет shell-скрипты».
Ну и современный тренд для приложений, требующих простого интерфейса, – использовать веб-интерфейс, что приводит к классическим навыкам обычной веб-разработки (HTML/CSS/JavaScript/Java/Python/Ruby/Perl/Node.js/…), безграничный мир которой выходит за рамки этого краткого опроса.
2. В нашей компании общие инструменты программистов – это:
- система управления версиями GIT;
- наша собственная система сборки и совместной работы ABF (Automatic Build Farm, abf.io);
- доработанная MediaWiki из проекта MediaWiki4Intranet для документирования и базы знаний;
- Bugzilla как трекер багов;
- Redmine для внутренней системы задач;
- Etherpad/Ethercalc/Etherdraw – сервис онлайн-блокнотов, таблиц и рисунков, для коллаборативных постановок при удаленных совещаниях.
Дальше, как я уже объяснял, все зависит от «уровня» и технологического стека.
Для команды разработчиков ядра достаточно классического GNU-стека сборки, GIT и простейшего редактора. Но, чтобы добиться беспроблемной работы ядра на всем зоопарке аппаратных конфигураций, нужно серьезное тестирование, на оборудовании и без. Наши «ядерщики» разрабатывают и используют специализированный фреймворк KEDR и другие инструменты для тестирования компонентов ядра. Также используются и инструменты, входящие в состав ядра: Lockdep, Kmemleak, средства на основе Kprobes и пр. И, разумеется, тестирование и исследование поведения «реального железа» – десятков ноутбуков с различной внутренней начинкой, стендов для тестирования различных плат – Wi-Fi, видео… (главный ядерщик даже унес один такой стенд себе домой), и тестирование, включая нагрузочные тесты Phoronix и ряд наших автоматических тестов, идут круглосуточно.
Есть программисты-«мейнтейнеры», обеспечивающие сборку десятков тысяч пакетов на нашей ABF. По минимуму им хватает веб-интерфейса ABF, где можно мониторить сборку и вносить изменения в спецификации компиляции и код, пользуясь только браузером. Конечно, для большей эффективности у нас есть специальный command-line клиент к ABF. Но, если возникает проблема, приходится прибегать к классической отладке с использованием соответствующих IDE или просто ориентируясь на логи.
Команда разработки новых продуктов. Для десктопных приложений сейчас в основном используется Qt-фреймворк, соответственно используется Qt Creator для С++-приложений, а для Python-Qt-приложений IDE все выбирают по вкусу – например, что-то на основе Eclipse+pydev (Aptana) или Komodo IDE. Впрочем, при доработках GNOME Shell приходится вместо продвинутого Qt-стека мучиться с GTK, а расширения под GNOME Shell вовсе пишутся на JavaScript.
Для серверных приложений с веб-интерфейсом требуется и знание соответствующих веб-технологий (в случае ROSA Directory Server – PHP, в случае ABF – Ruby on Rails), и собственно системного уровня (например, тонкости конфигурирования LDAP, DNS, DHCP и т.п.).
3, 4. Только совсем странные люди указывают при рекрутинге какие-то страшные и непроверяемые цифры стажа или загадочные уровни «middle/senior». Все зависит от вакансии и кандидата – можно взять и недоучившигося студента: на удивление, неленивый студент из нестыдного технического вуза скорее всего уже самостоятельно обучился базовым инструментам. Кстати, у нас есть программа летней стажировки студентов ВШЭ, и этот опыт позитивен.
К тому же Linux-разработка, будь то программирование ядра или программирование «рабочих столов», оконных менеджеров, настроек системных сервисов, практически не оставляет шансов найти специалиста со стажем, ведь в России, да даже и в мире, этим занимаются не так много людей. В любом случае, придется много изучать, но ведь это и интересно!
5. Наша специфика – разработка полноценных Linux-дистрибутивов – подразумевает, что приходится брать ответственность за необъятное – и за надежную работу системы с огромным зоопарком железа, и за работоспособность десятков тысяч собранных нами Open Source-приложений и библиотек. Так что в случае низкоуровнего программирования приходится буквально «расследовать» очень подлые ошибки взаимодействия с оборудованием, и мы в компании держим несколько десятков ноутбуков, специальный стенд для тестирования различного оборудования – несколько десятков видеокарт, сотни Wi-Fi-карт, коллекции подключаемых гаджетов. Соответственно тут придется растить свою компетенцию в hardware.
Есть задачи по поддержке десятков тысяч пакетов – собранных из открытого кода приложений и библиотек. Тут требуются и глубокие знания межпакетных зависимостей и процессов сборки, а также умение разбираться в чужом многошерстном коде, чтобы быстро внести правку, необходимую хотя бы для корректной сборки и запуска. Но иногда требуется иглубокая доработка, с добавлением в приложение или библиотеку нового функционала. По сути, это работа с чудовищно огромной чужой кодовой базой, исправление чужих ошибок, внесение нужных функций со слабыми возможностями глобального изменения общей архитектуры. Приходится чинить устаревший legacy-код, а это то, что обычно разработчики нелюбят, – классические продуктовые и заказные команды, которые работают только над своим кодом обозримых размеров, почти всегда могут «взять и все переписать».
Еще особенность, хотя уже не очень удивительная на нашем рынке, – это распределенность команды. У нас есть «обычный» центральный офис и распределенная команда разработчиков. Удаленная работа имеет и множество плюсов, но также требует дисциплины и самостоятельности, навыков использования средств коммуникации и некоторой психологической устойчивости.
Андрей Вагин, Linux-разработчик в Parallels
1. Мой любимый вопрос на собеседовании – назвать наиболее сложные задачи, которые приходилось решать. Причем для меня не важно, относятся они к Linux или нет. Тут можно даже не быть в курсе деталей. Этот вопрос просто дает возможность кандидату раскрыться.
Таким же образом проверяем базовые знания. Если человек говорит, что программировал в ядре Linux, то он просто обязан знать, чем отличается мьютекс от спинлока. А если он там писал не только драйверы, то наверняка и о RCU должен был что-то слышать.
Остальные требования к знаниям и навыкам можно посмотреть в нашей текущей вакансии Linux Developer – глубокое знание хотя бы одной подсистемы ядра и С, Assembler, умение пользоваться make, patch, rpmbuild, понимание архитектуры x86 и взаимодействия процессов, опыт системного программирования. Знание TCP/IP и сетевой архитектуры Linux, файловых систем, безопасности в Linux, некоторых языков программирования (bash, Python, Perl). Наконец, будет необходим технический английский (письменный).
2. Основным инструментом программиста под ОC Linux был и остается текстовый редактор. Большая часть разработчиков Parallels пользуется одним из двух редакторов – Vim или Emacs. Используем также системы контроля версий (GIT, CVS, SVN), а также трекеры Bugzilla и Jira.
3. Требований жестких нет, хотя в описании вакансий присутствует «высшее образование». Скорее образование может перекрыть отсутствие опыта. Кстати, основная часть людей в нашей команде серверной виртуализации (которая как раз и занимается Linux-разработками) из МФТИ. Они пришли в компанию еще студентами и выросли здесь как профессионалы.
К слову, у компании Parallels есть базовая кафедра при МФТИ, где студенты могут выбрать себе тему и работать над ней в свободное время за стипендию. Это своего рода кузница кадров. Проделанная на кафедре работа может лечь в основу диплома или кандидатской диссертации.
4. Опять-таки жестких требований нет. Наличие патчей в открытых продуктах будет большим плюсом. Когда человек приходит с резюме, в котором написано, что у него есть опыт программирования в ядре Linux N лет, а патчей в мейнстриме нет, то это выглядит очень странно.
5. Кандидат должен показать (и доказать), что он достоин должности, на которую претендует. Дело в том, что сейчас на рынке спрос на Linux-программистов превышает предложение, это можно точно сказать. Но компания Parallels – пожалуй, одно из самых привлекательных мест в России для таких разработчиков. Здесь много интересных задач в различных подсистемах и высокий средний уровень команды. Мы действительно часть сообщества (в том числе компания несколько раз попадала в Топ-20 ведущих контрибуторов ядра – то есть тех, кто внес наибольший вклад в его развитие). Кроме того, сама компания понимает важность работы над основной открытой веткой ядра Linux.
Кирилл Коротаев, вице-президент Acronis по разработке
1. Хороший программист под Linux должен уметь писать код на языке С и/или С++ и свободно пользоваться стандартным C library API и syscalls.
Нужно уметь писать многопоточные программы и пользоваться примитивами синхронизации. Важно хорошо понимать какие-то общие вещи: например, как устроен сервер, который одновременно взаимодействует с тысячами клиентов по сети; пользоваться алгоритмами и контейнерами стандартной библиотеки и понимать их алгоритмическую сложность.
2. Это вполне обычный набор инструментов: GCC, Makefiles, Git/SVN, GDB, Valgrind. Сюда же входят разнообразные утилиты для измерения перформанса и отладки – Perf, strace, ltrace, iostat, blktrace.
3. В идеале мы, конечно, возьмем кого-нибудь из MIT! Если серьезно, в России много хороших технических вузов, но самое важное – это не корочка, а то, что человек умеет. Вы можете быть самоучкой, главное, чтобы вы владели своим предметом. На собеседовании мы задаем достаточно вопросов и задачек кандидату, чтобы это понять.
4. Все сильно зависит от проекта и человека. Обычно это два-три года. Мы с удовольствием примем опытных специалистов, однако у нас есть стажировки для студентов, у которых, как правило, опыта нет совсем. Если человек быстро соображает и действительно хочет работать в конкретном направлении, это зачастую важнее, чем длинный послужной список.
5. Поскольку облачные технологии – одно из флагманских направлений в работе Acronis, большим плюсом для кандидата будет понимание принципов работы распределенных систем, особенно систем хранения данных. Хорошего специалиста со знанием Linux или Windows kernel мы оторвем с руками и ногами.
Сергей Козлов, заместитель начальника отдела разработки компании NetUP
1. Уверенное знание языка, на котором в компании ведется разработка. Знание классических алгоритмов и структур данных. Представление о механизмах межпроцессного и сетевого взаимодействия, принятых в POSIX-системах. Знание основных утилит командной строки и оболочки UNIX. Умение совершать базовую настройку системы (конфигурация сети, сервисы). Опыт использования систем контроля версий (Subversion, Git). Технический английский.
2. Компиллятор: gcc/g++/clang. Отладка и профилирование: GDB, Valgrind, gprof. СУБД MySQL, PostgreSQL.
3. Диплом не должен иметь решающего значения при подборе кадров, однако наличие профильного высшего образования даст соискателю преимущество. Основным критерием являются фактические навыки и опыт претендента.
4. Программист-стажер может быть принят в компанию без опыта. Как показывает практика, для уверенной работы в компании на должности программиста соискатель должен иметь опыт работы на должности со схожей спецификой не менее двух лет.
5. При рассмотрении резюме плюсами являются опыт работы с рядом специфичных библиотек (OpenSSL, ffmpeg), опыт разработки многопоточных приложений, знание сетевых протоколов, применяемых в сфере IPTV.
Метлицкий Юрий Викторович, директор центра разработки ОПО, ОАО «ВНИИНС»
1. Cистемным мышлением; знанием технических спецификаций и архитектуры современных вычислительных систем; владением низкоуровневыми языками программирования asm, C, C++ и наиболее распространенными языками написания сценариев sh, Python, Perl; знанием архитектуры ОС Linux и ее системного программного обеспечения.
2. Cреда аutomake/autoconf с произвольными средствами подготовки исходных тексов; интерфейсы ядра ОС Linux и стандарты POSIX/LSB; средства визуальной разработки с использованием фреймворков QT и KDE; интерфейсы наиболее распространенных системных библиотек, применяемых при создании системных и пользовательских приложений и служб.
3. Высшее инженерское образование в области разработки программно-аппаратных систем, с уклоном в область разработки программного обеспечения.
4. Опыт работы приветствуется, однако более важными являются: гибкость ума; обучаемость; возможность переключения между разнотипными задачами.
5. К специфическим знаниям можно отнести: современные тенденции, архитектура и реализация программных и аппаратных средств защиты информации; разработка изделий строго в соответствии с ЕСПД и ЕСКД.
Александр Горный, директор по информационным технологиям Mail.Ru Group
1. Он должен знать сам Linux: функции ядра, организацию процессов и потоков, сетевой стек. Помнить наизусть все параметры каждого системного вызова, разумеется, необязательно – для этого есть документация. Но знать, что можно, а что нельзя, совершенно необходимо.
2. Язык C или, возможно, C++. Средства отладки – GDB и Valgrind. Но главные инструменты, конечно, – собственная голова и руки.
3. Мы не предъявляем каких-то формальных требований к дипломам кандидатов. Для нас гораздо важнее реальные навыки, так что в первую очередь мы смотрим на проекты, в которых они участвовали. Опыт показывает, что хороший разработчик может прийти из непрофильного вуза или вообще не иметь законченного высшего образования. У Mail.Ru Group естьдва крупных образовательных проекта: Технопарк на базе МГТУ имени Баумана и Техносфера на базе ВМК МГУ, цель которых – дать студентам актуальные практические навыки в области веб-разработки.
4. Не так уж много компаний в России (да и в мире) активно разрабатывают что-либо под Linux на системном уровне. И далеко не каждому удается поработать в большой компании, например, Mail.Ru Group, где есть много Linux-проектов, или в компании, специально заточенной под Linux-продукты, например, Nginx. Но зато существует множество Open Source-проектов, где тоже можно получить необходимый опыт. Такие проекты могут стать очень важной частью резюме программиста под ОС Linux.
5. Главное требование – Надежность (именно так: с большой буквы). Ведь cервисы, написанные под Linux, – основа нашей технической архитектуры.
Стас Рудаков, веб-разработчик
Наталья Жук, рекрутер в СООО «Гейм Стрим» в минском центре разработки Wargaming
1. «Программист под ОС Linux» – широкое понятие. Сюда можно включить специалистов по embedded, разработчиков ядра и всевозможных системных сервисов, GUI, WEB... Тяжело провести общую черту, когда инструмент применяется везде – от кофеварок до суперкомпьютеров.
Тем не менее если выделять один главный навык, то это умение постоянно учиться. Ведь часто информацию приходится буквально по крупицам выискивать в списках рассылок, каналах IRC, багтрекерах. Помимо этого, важно уметь читать чужой код. Linux-разработчикам постоянно приходится иметь дело с Open Source.
2. ОС Linux в наследство от UNIX получила принцип «ОС как IDE». Мы часто используем GCC, GDB, Strace, Netstat, tcpdump, Vi и top. Многие из них доступны как на машине разработчика, так и на production-серверах.
Если говорить об IDE в узком смысле, то в этом вопросе нет единства. У нас в компании используются Emacs, PyCharm, Sublime, Vim.
3. Разработке под Linux мало где учат. Мы опираемся прежде всего на опыт, а не на диплом. Хотя базовые знания тоже важны. Каждый программист, вне зависимости от целевой ОС, должен уметь проектировать сложные системы, писать и оптимизировать алгоритмы.
4. Cтаж работы и профильное образование тут будут скорее плюсами, чем определяющими критериями отбора. Для нас важны достижения и опыт предыдущих проектов, примеры реализованных задач, умение объяснить, в чем сложность и как ее преодолеть. Также мы предпочитаем нанимать специалистов, ранее решавших задачи, схожие с теми, скоторыми предстоит столкнуться у нас.
5. Пользовательская база в Wargaming огромна, наши сервисы испытывают серьезные нагрузки. Поэтому очень важно иметь навыки построения высокодоступных и масштабируемых систем.