Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Вакансия: программист под ОС Linux
Источник: Журнал «Системный администратор» (Москва)
Автор: Подготовил Игорь Штомпель
Да...
Представлять базовый процесс разработки хотя бы на уровне Code&Fix и основные средства
коммуникации и документирования - т...
тонкости дизайна. В любом случае, даже прикладные приложения могут содержать хитрую
системную часть, требующую низкоуровне...
приходится прибегать к классической отладке с использованием соответствующих IDE или просто
ориентируясь налоги.
Команда р...
Причем для меня не важно, относятся они к Linux или нет. Тут можно даже не быть в курсе деталей.
Этот вопрос просто дает в...
Если серьезно, в России много хороших технических вузов, но самое важное - это не корочка, а то,
что человек умеет. Вы мож...
5 К специфическим знаниям можно отнести: современные тенденции, архитектура и реализация
программных и аппаратных средств ...
предпочитаем нанимать специалистов, ранее решавших задачи, схожие с теми, с которыми
предстоит столкнуться у нас.
5 Пользо...
Upcoming SlideShare
Loading in …5
×

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

1,585 views

Published on

Статья в журнале "Системный администратор"

Published in: Technology
  • Login to see the comments

  • Be the first to like this

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

  1. 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. 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. 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. 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. 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. 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. 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. 8. предпочитаем нанимать специалистов, ранее решавших задачи, схожие с теми, с которыми предстоит столкнуться у нас. 5 Пользовательская база в Wargaming огромна, наши сервисы испытывают серьезные нагрузки. Поэтому очень важно иметь навыки построения высокодоступных и масштабируемых систем. Подготовил Игорь Штомпель

×