SlideShare ist ein Scribd-Unternehmen logo
1 von 8
Downloaden Sie, um offline zu lesen
Вакансия: программист под ОС 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 огромна, наши сервисы испытывают серьезные нагрузки.
Поэтому очень важно иметь навыки построения высокодоступных и масштабируемых систем.
Подготовил Игорь Штомпель

Weitere ähnliche Inhalte

Was ist angesagt?

C++ осень 2012 лекция 12
C++ осень 2012 лекция 12C++ осень 2012 лекция 12
C++ осень 2012 лекция 12Technopark
 
Терминология как основной способ поиска разработчиков или как не опозорится п...
Терминология как основной способ поиска разработчиков или как не опозорится п...Терминология как основной способ поиска разработчиков или как не опозорится п...
Терминология как основной способ поиска разработчиков или как не опозорится п...SBTech
 
как стать хорошим веб технологом. нарек мкртчян. зал 4
как стать хорошим веб технологом. нарек мкртчян. зал 4как стать хорошим веб технологом. нарек мкртчян. зал 4
как стать хорошим веб технологом. нарек мкртчян. зал 4rit2011
 
Реклама PVS-Studio - статический анализ кода на языке Си и Си++
Реклама PVS-Studio - статический анализ кода на языке Си и Си++Реклама PVS-Studio - статический анализ кода на языке Си и Си++
Реклама PVS-Studio - статический анализ кода на языке Си и Си++Andrey Karpov
 
Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Yandex
 
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...Anthony Marchenko
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только одинHappyDev
 
Ігор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developerІгор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developerLEDC 2016
 
Scripting languages
Scripting languagesScripting languages
Scripting languagesLev Panov
 
Забытые проблемы разработки 64-битных программ
Забытые проблемы разработки 64-битных программЗабытые проблемы разработки 64-битных программ
Забытые проблемы разработки 64-битных программTatyanazaxarova
 
Как не подавиться большим старым проектом. Юрий Минаев ➠ CoreHard Autumn 2019
Как не подавиться большим старым проектом. Юрий Минаев ➠  CoreHard Autumn 2019Как не подавиться большим старым проектом. Юрий Минаев ➠  CoreHard Autumn 2019
Как не подавиться большим старым проектом. Юрий Минаев ➠ CoreHard Autumn 2019corehard_by
 
Эволюция разработки в Badoo
Эволюция разработки в BadooЭволюция разработки в Badoo
Эволюция разработки в BadooADV/web-engineering
 

Was ist angesagt? (18)

C++ осень 2012 лекция 12
C++ осень 2012 лекция 12C++ осень 2012 лекция 12
C++ осень 2012 лекция 12
 
Терминология как основной способ поиска разработчиков или как не опозорится п...
Терминология как основной способ поиска разработчиков или как не опозорится п...Терминология как основной способ поиска разработчиков или как не опозорится п...
Терминология как основной способ поиска разработчиков или как не опозорится п...
 
как стать хорошим веб технологом. нарек мкртчян. зал 4
как стать хорошим веб технологом. нарек мкртчян. зал 4как стать хорошим веб технологом. нарек мкртчян. зал 4
как стать хорошим веб технологом. нарек мкртчян. зал 4
 
9773
97739773
9773
 
Invisible
InvisibleInvisible
Invisible
 
Реклама PVS-Studio - статический анализ кода на языке Си и Си++
Реклама PVS-Studio - статический анализ кода на языке Си и Си++Реклама PVS-Studio - статический анализ кода на языке Си и Си++
Реклама PVS-Studio - статический анализ кода на языке Си и Си++
 
Lesson 01
Lesson 01Lesson 01
Lesson 01
 
Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"
 
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
 
Java one presentation
Java one presentationJava one presentation
Java one presentation
 
Ігор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developerІгор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developer
 
Scripting languages
Scripting languagesScripting languages
Scripting languages
 
Забытые проблемы разработки 64-битных программ
Забытые проблемы разработки 64-битных программЗабытые проблемы разработки 64-битных программ
Забытые проблемы разработки 64-битных программ
 
лекция 3
лекция 3лекция 3
лекция 3
 
190
190190
190
 
Как не подавиться большим старым проектом. Юрий Минаев ➠ CoreHard Autumn 2019
Как не подавиться большим старым проектом. Юрий Минаев ➠  CoreHard Autumn 2019Как не подавиться большим старым проектом. Юрий Минаев ➠  CoreHard Autumn 2019
Как не подавиться большим старым проектом. Юрий Минаев ➠ CoreHard Autumn 2019
 
Эволюция разработки в Badoo
Эволюция разработки в BadooЭволюция разработки в Badoo
Эволюция разработки в Badoo
 

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

Open source infrastructure
Open source infrastructureOpen source infrastructure
Open source infrastructureAlexei Fedotov
 
Разработка ресурсоемких приложений в среде Visual C++
Разработка ресурсоемких приложений в среде Visual C++Разработка ресурсоемких приложений в среде Visual C++
Разработка ресурсоемких приложений в среде Visual C++Tatyanazaxarova
 
игровая логика, проблемы и решения
игровая логика, проблемы и решенияигровая логика, проблемы и решения
игровая логика, проблемы и решенияВладимир Кожаев
 
Многопроцессорным компьютерам - параллельные программы!
Многопроцессорным компьютерам -  параллельные программы!Многопроцессорным компьютерам -  параллельные программы!
Многопроцессорным компьютерам - параллельные программы!Tatyanazaxarova
 
Введение в профессию исследователя приложений без исходных кодов
Введение в профессию исследователя приложений без исходных кодовВведение в профессию исследователя приложений без исходных кодов
Введение в профессию исследователя приложений без исходных кодовDI GR
 
Embarcadero All-Access
Embarcadero All-AccessEmbarcadero All-Access
Embarcadero All-AccessSerghei Urban
 
Микросервисы в .NET Core
Микросервисы в .NET CoreМикросервисы в .NET Core
Микросервисы в .NET CoreAndrew Gubskiy
 
Desktop app based on node js and html5
Desktop app based on node js and html5Desktop app based on node js and html5
Desktop app based on node js and html5Provectus
 
10 компонентные и офисные приложения на платформе microsoft
10 компонентные и офисные приложения на платформе microsoft10 компонентные и офисные приложения на платформе microsoft
10 компонентные и офисные приложения на платформе microsoftKewpaN
 
Экскурс в мир WEB разработки
Экскурс в мир WEB разработкиЭкскурс в мир WEB разработки
Экскурс в мир WEB разработкиIT-Доминанта
 
Hivext – облачная платформа для быстрой разработки интернет приложений
Hivext – облачная платформа для быстрой разработки  интернет приложений Hivext – облачная платформа для быстрой разработки  интернет приложений
Hivext – облачная платформа для быстрой разработки интернет приложений guest800050
 
Jelastic для разработчиков ПО
Jelastic для разработчиков ПОJelastic для разработчиков ПО
Jelastic для разработчиков ПОDmitry Lazarenko
 
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Yandex
 
Применение low-code платформ в энтерпрайзе
Применение low-code платформ в энтерпрайзеПрименение low-code платформ в энтерпрайзе
Применение low-code платформ в энтерпрайзеAlexander Byndyu
 
Alfresco как система для СЭД
Alfresco как система для СЭДAlfresco как система для СЭД
Alfresco как система для СЭДSergey Gorobets
 
“Tips&Tricks&Antitricks with .Net Core backend in GameDev”
“Tips&Tricks&Antitricks with .Net Core backend in GameDev”“Tips&Tricks&Antitricks with .Net Core backend in GameDev”
“Tips&Tricks&Antitricks with .Net Core backend in GameDev”HYS Enterprise
 
Afandiyeva kamala yazik programmirovaniya pascal
Afandiyeva kamala yazik programmirovaniya pascalAfandiyeva kamala yazik programmirovaniya pascal
Afandiyeva kamala yazik programmirovaniya pascalkamala_afandiyeva_zahs
 
метод организации репозитория исходного кода
метод организации репозитория исходного кодаметод организации репозитория исходного кода
метод организации репозитория исходного кодаSergii Shmarkatiuk
 
раубичи ронд
раубичи рондраубичи ронд
раубичи рондzolik
 

Ähnlich wie Что должен уметь Linux программист (20)

Open source infrastructure
Open source infrastructureOpen source infrastructure
Open source infrastructure
 
Разработка ресурсоемких приложений в среде Visual C++
Разработка ресурсоемких приложений в среде Visual C++Разработка ресурсоемких приложений в среде Visual C++
Разработка ресурсоемких приложений в среде Visual C++
 
игровая логика, проблемы и решения
игровая логика, проблемы и решенияигровая логика, проблемы и решения
игровая логика, проблемы и решения
 
Многопроцессорным компьютерам - параллельные программы!
Многопроцессорным компьютерам -  параллельные программы!Многопроцессорным компьютерам -  параллельные программы!
Многопроцессорным компьютерам - параллельные программы!
 
Введение в профессию исследователя приложений без исходных кодов
Введение в профессию исследователя приложений без исходных кодовВведение в профессию исследователя приложений без исходных кодов
Введение в профессию исследователя приложений без исходных кодов
 
Embarcadero All-Access
Embarcadero All-AccessEmbarcadero All-Access
Embarcadero All-Access
 
Микросервисы в .NET Core
Микросервисы в .NET CoreМикросервисы в .NET Core
Микросервисы в .NET Core
 
Desktop app based on node js and html5
Desktop app based on node js and html5Desktop app based on node js and html5
Desktop app based on node js and html5
 
10 компонентные и офисные приложения на платформе microsoft
10 компонентные и офисные приложения на платформе microsoft10 компонентные и офисные приложения на платформе microsoft
10 компонентные и офисные приложения на платформе microsoft
 
Экскурс в мир WEB разработки
Экскурс в мир WEB разработкиЭкскурс в мир WEB разработки
Экскурс в мир WEB разработки
 
Hivext 04.2010
Hivext 04.2010Hivext 04.2010
Hivext 04.2010
 
Hivext – облачная платформа для быстрой разработки интернет приложений
Hivext – облачная платформа для быстрой разработки  интернет приложений Hivext – облачная платформа для быстрой разработки  интернет приложений
Hivext – облачная платформа для быстрой разработки интернет приложений
 
Jelastic для разработчиков ПО
Jelastic для разработчиков ПОJelastic для разработчиков ПО
Jelastic для разработчиков ПО
 
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»
 
Применение low-code платформ в энтерпрайзе
Применение low-code платформ в энтерпрайзеПрименение low-code платформ в энтерпрайзе
Применение low-code платформ в энтерпрайзе
 
Alfresco как система для СЭД
Alfresco как система для СЭДAlfresco как система для СЭД
Alfresco как система для СЭД
 
“Tips&Tricks&Antitricks with .Net Core backend in GameDev”
“Tips&Tricks&Antitricks with .Net Core backend in GameDev”“Tips&Tricks&Antitricks with .Net Core backend in GameDev”
“Tips&Tricks&Antitricks with .Net Core backend in GameDev”
 
Afandiyeva kamala yazik programmirovaniya pascal
Afandiyeva kamala yazik programmirovaniya pascalAfandiyeva kamala yazik programmirovaniya pascal
Afandiyeva kamala yazik programmirovaniya pascal
 
метод организации репозитория исходного кода
метод организации репозитория исходного кодаметод организации репозитория исходного кода
метод организации репозитория исходного кода
 
раубичи ронд
раубичи рондраубичи ронд
раубичи ронд
 

Mehr von ru_Parallels

OpenStack лучше с Virtuozzo
OpenStack лучше с VirtuozzoOpenStack лучше с Virtuozzo
OpenStack лучше с Virtuozzoru_Parallels
 
Расширяем горизонты с помощью iCloud
Расширяем горизонты с помощью iCloudРасширяем горизонты с помощью iCloud
Расширяем горизонты с помощью iCloudru_Parallels
 
Цифровой суверенитет для российских облачных систем
Цифровой суверенитет для российских облачных системЦифровой суверенитет для российских облачных систем
Цифровой суверенитет для российских облачных системru_Parallels
 
Виртуализация инфраструктуры ЦОД российской разработки
Виртуализация инфраструктуры ЦОД российской разработкиВиртуализация инфраструктуры ЦОД российской разработки
Виртуализация инфраструктуры ЦОД российской разработкиru_Parallels
 
Resource management in the cloud
Resource management in the cloudResource management in the cloud
Resource management in the cloudru_Parallels
 
Тестирование ПО, основанного на сторонних компонентах, на примере дистрибут...
Тестирование ПО, основанного на  сторонних компонентах, на примере  дистрибут...Тестирование ПО, основанного на  сторонних компонентах, на примере  дистрибут...
Тестирование ПО, основанного на сторонних компонентах, на примере дистрибут...ru_Parallels
 
Передача состояния с iPhone на Apple Watch
Передача состояния с iPhone на Apple WatchПередача состояния с iPhone на Apple Watch
Передача состояния с iPhone на Apple Watchru_Parallels
 
Надежность ПО и Runtime Verification
Надежность ПО и Runtime VerificationНадежность ПО и Runtime Verification
Надежность ПО и Runtime Verificationru_Parallels
 
Vagrant Plugin development
Vagrant Plugin developmentVagrant Plugin development
Vagrant Plugin developmentru_Parallels
 
Управление рисками в разработке программного обеспечения
Управление рисками в разработке программного обеспеченияУправление рисками в разработке программного обеспечения
Управление рисками в разработке программного обеспеченияru_Parallels
 
Virtuozzo platform
Virtuozzo platformVirtuozzo platform
Virtuozzo platformru_Parallels
 
Доклад Михаила Егорова на PHDays
Доклад Михаила Егорова на PHDaysДоклад Михаила Егорова на PHDays
Доклад Михаила Егорова на PHDaysru_Parallels
 
Доклад Якова Зубарева на конференции MBLT15
Доклад Якова Зубарева на конференции MBLT15Доклад Якова Зубарева на конференции MBLT15
Доклад Якова Зубарева на конференции MBLT15ru_Parallels
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Pythonru_Parallels
 
2013 WHD.local Istanbul Presentation
2013 WHD.local Istanbul Presentation2013 WHD.local Istanbul Presentation
2013 WHD.local Istanbul Presentationru_Parallels
 
Инновационные решения для роста облачного бизнеса
Инновационные решения для роста облачного бизнесаИнновационные решения для роста облачного бизнеса
Инновационные решения для роста облачного бизнесаru_Parallels
 
Kolerov parallels cloud_market_in_numbers
Kolerov parallels cloud_market_in_numbersKolerov parallels cloud_market_in_numbers
Kolerov parallels cloud_market_in_numbersru_Parallels
 
Pavel Ershov on WHD.Moscow
Pavel Ershov on WHD.MoscowPavel Ershov on WHD.Moscow
Pavel Ershov on WHD.Moscowru_Parallels
 
KAnisimov riw2011-hosting-future
KAnisimov riw2011-hosting-futureKAnisimov riw2011-hosting-future
KAnisimov riw2011-hosting-futureru_Parallels
 

Mehr von ru_Parallels (19)

OpenStack лучше с Virtuozzo
OpenStack лучше с VirtuozzoOpenStack лучше с Virtuozzo
OpenStack лучше с Virtuozzo
 
Расширяем горизонты с помощью iCloud
Расширяем горизонты с помощью iCloudРасширяем горизонты с помощью iCloud
Расширяем горизонты с помощью iCloud
 
Цифровой суверенитет для российских облачных систем
Цифровой суверенитет для российских облачных системЦифровой суверенитет для российских облачных систем
Цифровой суверенитет для российских облачных систем
 
Виртуализация инфраструктуры ЦОД российской разработки
Виртуализация инфраструктуры ЦОД российской разработкиВиртуализация инфраструктуры ЦОД российской разработки
Виртуализация инфраструктуры ЦОД российской разработки
 
Resource management in the cloud
Resource management in the cloudResource management in the cloud
Resource management in the cloud
 
Тестирование ПО, основанного на сторонних компонентах, на примере дистрибут...
Тестирование ПО, основанного на  сторонних компонентах, на примере  дистрибут...Тестирование ПО, основанного на  сторонних компонентах, на примере  дистрибут...
Тестирование ПО, основанного на сторонних компонентах, на примере дистрибут...
 
Передача состояния с iPhone на Apple Watch
Передача состояния с iPhone на Apple WatchПередача состояния с iPhone на Apple Watch
Передача состояния с iPhone на Apple Watch
 
Надежность ПО и Runtime Verification
Надежность ПО и Runtime VerificationНадежность ПО и Runtime Verification
Надежность ПО и Runtime Verification
 
Vagrant Plugin development
Vagrant Plugin developmentVagrant Plugin development
Vagrant Plugin development
 
Управление рисками в разработке программного обеспечения
Управление рисками в разработке программного обеспеченияУправление рисками в разработке программного обеспечения
Управление рисками в разработке программного обеспечения
 
Virtuozzo platform
Virtuozzo platformVirtuozzo platform
Virtuozzo platform
 
Доклад Михаила Егорова на PHDays
Доклад Михаила Егорова на PHDaysДоклад Михаила Егорова на PHDays
Доклад Михаила Егорова на PHDays
 
Доклад Якова Зубарева на конференции MBLT15
Доклад Якова Зубарева на конференции MBLT15Доклад Якова Зубарева на конференции MBLT15
Доклад Якова Зубарева на конференции MBLT15
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
2013 WHD.local Istanbul Presentation
2013 WHD.local Istanbul Presentation2013 WHD.local Istanbul Presentation
2013 WHD.local Istanbul Presentation
 
Инновационные решения для роста облачного бизнеса
Инновационные решения для роста облачного бизнесаИнновационные решения для роста облачного бизнеса
Инновационные решения для роста облачного бизнеса
 
Kolerov parallels cloud_market_in_numbers
Kolerov parallels cloud_market_in_numbersKolerov parallels cloud_market_in_numbers
Kolerov parallels cloud_market_in_numbers
 
Pavel Ershov on WHD.Moscow
Pavel Ershov on WHD.MoscowPavel Ershov on WHD.Moscow
Pavel Ershov on WHD.Moscow
 
KAnisimov riw2011-hosting-future
KAnisimov riw2011-hosting-futureKAnisimov riw2011-hosting-future
KAnisimov riw2011-hosting-future
 

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