Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Вакансия: программист под ОС Linux
Источник: Журнал «Системный администратор» (Москва)
Автор: Подготовил Игорь Штомпель
Да...
Представлять базовый процесс разработки хотя бы на уровне Code&Fix и основные средства
коммуникации и документирования - т...
тонкости дизайна. В любом случае, даже прикладные приложения могут содержать хитрую
системную часть, требующую низкоуровне...
приходится прибегать к классической отладке с использованием соответствующих IDE или просто
ориентируясь налоги.
Команда р...
Причем для меня не важно, относятся они к Linux или нет. Тут можно даже не быть в курсе деталей.
Этот вопрос просто дает в...
Если серьезно, в России много хороших технических вузов, но самое важное - это не корочка, а то,
что человек умеет. Вы мож...
5 К специфическим знаниям можно отнести: современные тенденции, архитектура и реализация
программных и аппаратных средств ...
предпочитаем нанимать специалистов, ранее решавших задачи, схожие с теми, с которыми
предстоит столкнуться у нас.
5 Пользо...
Nächste SlideShare
Wird geladen in …5
×

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

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

  • Loggen Sie sich ein, um Kommentare anzuzeigen.

  • Gehören Sie zu den Ersten, denen das gefällt!

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

×