Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Вакансия: программист под ОС Linux
Источник: Журнал «Системный администратор» (Москва)
Автор: Подготовил Игорь Штомпель
Дата: 8 мая 2015
Операционная система Linux становится все популярнее среди компаний, которые занимаются
разработкой ПО в России. Но вот подготовка таких специалистов для рынка информационных
технологий пока оставляет желать лучшего.
Чтобы выяснить, какие знания и навыки программистов под ОС Linux востребованы, мы обратились
к представителям компаний
1. Какими знаниями и навыками должен обладать программист под ОС Linux?
2. Каков инструментарий программиста под ОС Linux?
3. Каковы требования компании к уровню образования потенциальных сотрудников?
4. Какие требования предъявляются к опыту работы?
5. Есть ли особые требования, которые обусловлены спецификой деятельности компании?
В некоторых случаях, когда не предполагается тесная интеграция онлайн и оффлайн-торговли,
достаточно синхронизировать между учетной системой и сайтом только список товаров и их
количество в наличии. Более того, если магазин работает со своими поставщиками под заказ, то и
указание количества не является обязательным: действие происходит под лозунгом "Заказывайте,
что нужно, а мы привезем!".
Станислав Фомин, директор по технологиям компании "НТЦ ИТ РОСА"
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, Makeеles, 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 огромна, наши сервисы испытывают серьезные нагрузки.
Поэтому очень важно иметь навыки построения высокодоступных и масштабируемых систем.
Подготовил Игорь Штомпель

More Related Content

Что должен уметь Linux программист

  • 1. Вакансия: программист под ОС Linux Источник: Журнал «Системный администратор» (Москва) Автор: Подготовил Игорь Штомпель Дата: 8 мая 2015 Операционная система Linux становится все популярнее среди компаний, которые занимаются разработкой ПО в России. Но вот подготовка таких специалистов для рынка информационных технологий пока оставляет желать лучшего. Чтобы выяснить, какие знания и навыки программистов под ОС Linux востребованы, мы обратились к представителям компаний 1. Какими знаниями и навыками должен обладать программист под ОС Linux? 2. Каков инструментарий программиста под ОС Linux? 3. Каковы требования компании к уровню образования потенциальных сотрудников? 4. Какие требования предъявляются к опыту работы? 5. Есть ли особые требования, которые обусловлены спецификой деятельности компании? В некоторых случаях, когда не предполагается тесная интеграция онлайн и оффлайн-торговли, достаточно синхронизировать между учетной системой и сайтом только список товаров и их количество в наличии. Более того, если магазин работает со своими поставщиками под заказ, то и указание количества не является обязательным: действие происходит под лозунгом "Заказывайте, что нужно, а мы привезем!". Станислав Фомин, директор по технологиям компании "НТЦ ИТ РОСА" 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 и т.п.
  • 2. Представлять базовый процесс разработки хотя бы на уровне 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. Соответственно в этом случае программисту нужно знать развесистые иерархии классов виджетов этих фреймворков,
  • 3. тонкости дизайна. В любом случае, даже прикладные приложения могут содержать хитрую системную часть, требующую низкоуровневой работы с устройствами или файловой системой. Еще легче разработка с использованием мультиплатформенных 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. Но, если возникает проблема,
  • 4. приходится прибегать к классической отладке с использованием соответствующих 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 Мой любимый вопрос на собеседовании - назвать наиболее сложные задачи, которые приходилось решать.
  • 5. Причем для меня не важно, относятся они к 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, Makeеles, Git/SVN, GDB, Valgrind. Сюда же входят разнообразные утилиты для измерения перформанса и отладки - Perf, strace, ltrace, iostat, blktrace. 3 В идеале мы, конечно, возьмем кого-нибудь из MIT!
  • 6. Если серьезно, в России много хороших технических вузов, но самое важное - это не корочка, а то, что человек умеет. Вы можете быть самоучкой, главное, чтобы вы владели своим предметом. На собеседовании мы задаем достаточно вопросов и задачек кандидату, чтобы это понять. 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 Опыт работы приветствуется, однако более важными являются: гибкость ума; обучаемость; возможность переключения между разнотипными задачами.
  • 7. 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таж работы и профильное образование тут будут скорее плюсами, чем определяющими критериями отбора. Для нас важны достижения и опыт предыдущих проектов, примеры реализованных задач, умение объяснить, в чем сложность и как ее преодолеть. Также мы
  • 8. предпочитаем нанимать специалистов, ранее решавших задачи, схожие с теми, с которыми предстоит столкнуться у нас. 5 Пользовательская база в Wargaming огромна, наши сервисы испытывают серьезные нагрузки. Поэтому очень важно иметь навыки построения высокодоступных и масштабируемых систем. Подготовил Игорь Штомпель