Программист под ОС Windows
Мы попытались выяснить, какие знания и навыки программистов под ОС Windows востребованы
1. Какими знаниями и навыками должен обладать программист под ОС Windows?
2. Каков инструментарий программиста под ОС Windows?
3. Каковы требования компании к уровню образования потенциальных сотрудников?
4. Какие требования предъявляются к опыту работы?
5. Есть ли особые требования, которые обусловлены спецификой деятельности компании?
Константин Кичинский, эксперт по стратегическим технологиям, Microsoft Россия
1. Помимо навыков разработки, проектирования и тестирования ПО, хорошее понимание устройства самой операционной системы и достаточно глубокое понимание технологического стека, лежащего за конкретной платформой в рамках Windows. Например, если речь о таких сложных продуктах, как Visual Studio, то это, в частности, знание WPF. А если это универсальные приложения под Windows 10, то речь уже идет о WinRT и в целом платформе UWP.
Само собой, умение работать в команде.
2. Visual Studio, TFS или Git. Плюс ряд внутренних инструментов.
3. Предпочтительно инженерное или прикладное в области информационных технологий образование. Наличие олимпиадных (алгоритмических) достижений приветствуется. Из языков программирования: С++, C# (+ .NET) – наиболее частое требование; в создании интерфейсов – HTML (+JS), XAML.
Знание английского на уровне, достаточном для продуктивного и грамотного общения устно и письменно.
4. Сильно зависит от позиции и направления. Например, в Microsoft Research критично разбираться в своей предметной области и уметь быстро делать прототипы для проведения исследований, а в продуктовых группах – понимать, как создавать надежные и хорошо спроектированные решения, включая практики SDL, тестирования, отладки сложных систем и т.п. Естественно, все должно быть подкреплено реальным опытом (в идеале полный цикл выпуска продукта), если только это не стажировка.
Опыт работы с хранилищами данных (SQL, NoSQL, Hadoop…) может быть обязательным требованием.
Опыт работы по методологиям SCRUM/Agile/Kanban – плюс.
Участие в Open Source-проектах – плюс.
5. Также сильно зависит от конкретного продукта. Тем не менее все, что касается надежности и безопасности (Security Development Lifecycle), – большой плюс. В некоторых группах могут быть критичными специфичные знания, например, в большинство продуктов Microsoft закладываются требования локализуемости. В продуктах, завязанных на железо (например, драйверы), очевидно, требуется глубокое понимание низкоуровневого взаимодействия. В продуктах, завязанных на внешнюю совместимость, например, Microsoft Edge, нужно хорошее понимание соответствующих веб-стандартов. В продуктах, завязанных на коммуникацию, например, Skype, не обойтись без понимания сетевого взаимодействия и соответствующих протоколов, форматов обмена данными и т.п. В продуктах, завязанных на графику, например, DirectX, не лишним будет хорошее знание математики и, конечно, опыт работы с 3D-графикой (программирование) и любовь к играм.
Алексей Янкелевич, руководитель ресурсной группы .Net разработчиков компании КРОК
1. На текущий момент количество специализаций программистов довольно велико. Например, разработчик игр обладает знаниями, которых нет у разработчика бизнес-приложений или интеграционных решений. Безусловно, есть определенные фундаментальные вещи, например, понимание принципов ООП, основных алгоритмов и структур данных, шаблонов проектирования, принципов организации многопоточных приложений, клиент-серверных приложений, принципов проектирования БД.
2. Если говорить о средствах разработки, то под Windows работают практически все современные популярные технологии. То есть можно разрабатывать на стыке технологий от Microsoft (.Net / С# / MS SQL Server, например), на технологиях Oracle (Java, Oracle database) или Python, PHP и других. Выбор технологий определяется решаемой задачей. Пожалуй, наиболее популярным инструментом является пакет Microsoft Visual Studio. Этот интегрированный пакет инструментов позволяет решать широкий спектр задач по разработке, настольных, веб- и мобильных приложений.
3. Мы ориентируемся на выпускников технических вузов с профильными специальностями. К нам приходят на работу студенты старших вкурсов и выпускники ведущих вузов: МГТУ им. Н.Э. Баумана, МГУ им. М.В. Ломоносова, МАИ, МИФИ, МТУСИ и других. В КРОК работают люди, которые любят и умеют учиться, обладают активной жизненной позицией и здоровыми амбициями. Эти требования мы предъявляем к кандидатам.
4. Все зависит от позиции, предстоящих задач. А для начальных позиций большой опыт и не потребуется, важно владение фундаментальным инструментарием, умение решать задачи и быстро учиться. В компании развит институт наставничества – старшие коллеги передают опыт и делятся знаниями, поэтому у молодых талантливых сотрудников есть все для стремительного профессионального роста.
5. КРОК – системный интегратор, который ежегодно реализует более двух тысяч проектов для заказчиков. При этом зачастую это комплексные инновационные проекты, требующие от команды максимума сил, энергии и профессионализма. Этим и обусловлены наши требования к кандидатам.
Юрий Трухин, эксперт по облачным технологиям InfoboxCloud
1. Windows-разработчику необходимо знание алгоритмов и паттернов, умение находить простые и поддерживаемые решения, отстаивать свою точку зрения и выдерживать сроки. Необходимы знания и опыт разработки на .NET/C# и C++ высоконагруженных систем, сервисов и API на Windows. Код должен быть чистым, читаемым и тестируемым. Плюсами будут опыт функционального программирования, в частности, F#, умение писать отказоустойчивые геораспределенные приложения, опыт в написании расширений для Azure Pack и Microsoft Office, опыт разработки на Mono.
2. Visual Studio с Resharper, продукты Atlassian, Sublime Text, Visual Studio Code. Полезным будет знание JetBrains Clion.
3. Образование высшее, техническое (при прочих равных это даст преимущество соискателю). Свое портфолио (например, на github), которое даст представление об уровне работ. Необходимо быть адекватным, любить свою работу и хотеть делать мир лучше. Умение постоянно учиться очень важно, так как в компании задачи могут быть очень разными.
4. Как правило, от трех лет работы по профилю. Плюсом будет опыт работы в проекте с высокими нагрузками.
5. Знание платформ Odin Automation и Azure Pack, умение разрабатывать расширения и кастомизации этих платформ.
Савва Кузнецов, разработчик, «Лаборатория Касперского»
1. Знать наизусть сигнатуры методов WinAPI всех версий, читать на ночь заголовочные файлы ATL, на вопрос «Что такое COM?» отвечать «COM – это любовь»
На самом деле функция, характеризующая зависимость качества разработчика от его навыков и знаний, непроста: при ответе на этот вопрос нельзя ограничиться списком требований, который можно найти на любом сайте поиска работы: «уверенное знание API платформы, отличное знание языка программирования и паттернов проектирования...»
Определенный набор критериев, конечно, есть, и зависит он от направленности проекта: это может быть требование знаний технологий, специфичных для платформы (к примеру, COM, ATL, MFC), а может быть и знание внутренности операционной системы со всеми ее особенностями и отличиями от других систем. Если разработка идет под Windows Mobile, стек требуемых технологий будет совершенно другим. При этом хорошее знание одной из областей знаний может компенсировать недостаток знаний в другой.
Если абстрагироваться от специфики конкретного проекта, то наиболее ценными являются общие универсальные знания. Это может быть алгоритмическая подготовка, подготовка в области решения задач параллельной обработки данных. Я бы сюда и ТРИЗ добавил, но знакомство с ТРИЗ сейчас редкость. В проектах, сильно не привязанных к конкретной платформе в плане реализации, важно отличное знание языка программирования, на котором ведется разработка (вообще это везде является плюсом). В моем случае это С++: знания должны соответствовать планке, поставленной работами экспертов и практиков уровня Герба Саттера и Скотта Мейерса.
Ну и в конце концов не нужно забывать, что программирование – это в первую очередь творчество и созидание. Найти и не упустить по-настоящему талантливого, творческого, увлеченного разработчика, пусть и с какими-то пробелами в знаниях, которые мы всегда поможем восполнить, – большая удача.
2. Это также зависит от специфики проекта и работающей над ним команды. Чаще всего в качестве инструмента разработки используем Microsoft Visual Studio последних версий, а также TFS, включающий в себя системы code review, code version control, bug tracking, continious integration и многое другое. В некоторых проектах для каждой из сфер разработки используют отдельные средства: к примеру, в моем проекте в качестве системы code version control используется perforce.
3. Я не встречал у нас в компании людей, которые бы как-то ориентировались на образование кандидатов. Решающий фактор обычно – это то, как человек показал себя на собеседовании. Если хорошо, то образование вообще не имеет значения. Если плохо, то какая разница, сколько высших образований у кандидата? Отсутствие образования или случаи, когда специалист бросает вуз, вызывают вопросы, не буду отрицать, но если его текущая база знаний и опыт находятся на высоком уровне, то, как уже было отмечено, наличие диплома уже не имеет никакого значения.
4. Важно сочетание наличия теоретической подготовки, знаний технологий/библиотек и определенного количества решенных задач, на которых это все было как-то опробовано. В некоторых ситуациях ищется член команды, который займет позицию, где будет решать задачи какой-то определенной направленности, – тогда опыт решения похожих задач будет большим плюсом.
5. В каждом проекте могут быть такие требования. Но в чисто энтерпрайзных решениях чаще всего нет. Безусловно, знание информационной безопасности и ее специфики идет только в плюс, но категоричного и невнимательного отношения к специалистам не из этой области нет.
Роман Алешкин, директор по разработке продуктов Acronis
1. Во-первых, необходимо умение и желание разбираться в чужом коде. Без этого работа в команде невозможна. Во-вторых, нужно отлично знать C++, библиотеки STL или Boost. Также необходимо знание шаблонов проектирования, стандартных алгоритмов и структур данных, уверенное знание механизмов синхронизации в многопоточных приложениях.
2. В основном мы используем Visual Studio при разработке под Windows, Xcode при разработке под Mac OS.
3. В России несколько вузов выпускают хороших программистов. Например, МФТИ или Новосибирский государственный университет, с которыми мы тесно сотрудничаем. Однако человек может быть, условно говоря, «самоучкой». Это не принципиально. Уровень знаний кандидата, как и его умение нестандартно мыслить, можно легко проверить на собеседовании – достаточно дать ему несколько специальных задач разного уровня сложности.
4. В идеале кандидат должен иметь опыт коммерческой разработки от трех лет. Плюсом будет опыт работы в большой команде и знание средств командной разработки. Хотя это не всегда главное: иногда достаточно настоящего интереса к написанию кода. Опыт можно приобрести, а мотивацию, если ее нет, не подделаешь.
5. Мы ценим в кандидате опыт работы с QT, знание системных API и их особенностей на разных платформах. Неплохо было бы знать внутреннюю структуру и особенности Boost и популярных реализаций STL. Не повредит владение Python или другим скриптовым языком. Разумеется, кроме профессиональных навыков, важны и такие качества, как инициативность и умение ставить задачи самому себе.
Мы ведем разработку с использованием современных фреймворков – QT и Xcode – работаем по современным и динамичным практикам Scrum и Kanban, пишем кроссплатформенный код на Windows, Linux и Mac и в целом решаем интересные задачи. Так что, если вы чувствуете, что написание кода и работа в ИТ – ваше призвание, приходите к нам в команду.
Артем Шишкин, старший специалист отдела технологий виртуализации Positive Technologies
1. Что касается знаний – необходимо знать язык программирования С. Да и то не весь. Дело в том, что во времена разработки ОС Windows еще не было никаких стандартов на этот язык. Поэтому для разработки с применением WinAPI и Native API используется только некоторое подмножество языка С. Разумеется, можно использовать любой другой язык программирования, но тогда есть риск погрязнуть в адаптации заголовочных файлов из Windows SDK. Прозвучит банально, но знание английского языка просто необходимо для чтения документации. Раздел MSDN, посвященный WinAPI и DDK, не был и вряд ли будет переведен на русский язык.
Из навыков, я считаю, важным является умение обратной разработки или реверс-инжиниринга. Дело в том, что исходных кодов ОС у разработчика попросту нет, как и нет никакого референсного кода. Некуда подглядеть, если вдруг что-то не работает. А такие ситуации точно будут возникать, хотя бы потому, что документация по WinAPI не отличается высокой точностью или развернутостью. Когнитивные способности в принципе хороши для программиста, и неплохо бы было их расширять от понимания кода высокоуровневого до кода низкоуровневого.
2. По моему мнению, самой удобной средой для разработки под WinAPI является IDE от самой же Microsoft, а именно Microsoft Visual Studio. Встроенная справка, однако, не всегда удобна при использовании ее прямо из IDE, поэтому браузер я бы назвал инструментом для поиска справочной информации и примеров. Для низкоуровневой отладки необходим WinDBG из пакета Windows Kits. Также рекомендую всегда использовать утилиты Application Verifier и Driver Verifier для раннего обнаружения порой незаметных проблем в коде. В целом видно, что Microsoft предоставляет полный набор средств для удобной и эффективной разработки.
3. Поскольку системная разработка под Windows, как правило, ведется на языке С, который является небезопасным, большое внимание следует уделить вопросам безопасности кода. Неплохо, если человек знает и понимает, что такое, например, уязвимость «переполнение буфера на стеке». А еще лучше, если он знает, как именно такую уязвимость эксплуатировать. Помня о различных видах уязвимостей, человек наперед будет избегать их появления в коде. Чем раньше сделаешь правильно, тем меньше мороки будет при поддержке кода.
Сергей Концов, руководитель отдела интеграции операционных систем в продуктах Parallels Desktop для Mac и Parallels Access
1. В первую очередь должно быть хорошее понимание внутреннего устройства Windows и происходящих в ОС процессов. Хороший Windows-программист не должен «плавать» в таких темах, как IPC (межпроцессное взаимодействие), многопоточное программирование, примитивы синхронизации, оконная подсистема, системные сервисы, реестр. Для нашей команды (OS Integration Team) особенно ценны навыки внедрения в сторонние приложения, работа с «хуками», а также опыт реверс-инжиниринга. А вот навык разработки сетевых приложений и глубокие знания сетевых технологий, наоборот, необязательны – у нас нет таких задач.
Важный момент – понимание различий разных версий Windows.
Собеседования на должность Windows-разработчика у нас проводят тимлиды и два-три инженера. Задача технических специалистов – определить, соответствует ли кандидат требованиям, есть ли у него нужные знания и в каком объеме, прощупать на наличие знаний в смежных областях. Тимлид дополнительно оценивает опыт человека и проекты, над которыми он работал, смотрит на мотивацию, личностные качества, в особенности на возможности интеграции в команду.
Если кандидат перспективный, то в задачу собеседующих также входит заинтересовать его работой именно у нас (обычно это удается, у нас международный проект с нетривиальными задачами).
А кандидату надо просто продемонстрировать, на что он способен. На собеседовании возможны небольшие тестовые задания, например, по C++. Часто даем задачи на логику или сообразительность, напрямую не связанные с программированием. Некоторые кандидаты говорили, что за эти несколько часов собеседований узнали больше и напрягались значительнее, чем за год работы на текущей позиции.
Как раз сейчас у нас есть подходящая вакансия Windows-программиста в отделе интеграции операционных систем, но с «небольшим» дополнительным требованием – нужно знание и опыт работы с системами разработки Windows-инсталляторов – Install Shield и/или NSIS, WiX.
2. Основные инструменты – MS Visual Studio для сборки, WinDbg для отладки, git/svn, любимый редактор и голова на плечах. Из специфики Parallels – система сборки, например, исторически построена на Qt. А для реверс-инжиниринга нет ничего удобнее IDA, тут я вряд ли буду оригинален. Вообще искусственно мы программистов не ограничиваем, и они пользуются теми средствами, которые считают эффективными и удобными для себя.
3. Конечно же, нам интересны люди с огромным опытом, блестящим профильным образованием и скромными финансовыми запросами! А если серьезно, лично я больше внимания обращаю на опыт, причем на опыт в интересующей меня области. Кандидат, последние несколько лет занимавшийся Windows-разработкой и изучивший эту систему вдоль и поперек, но даже не закончивший вуз, имеет больше шансов, чем выпускник условного физтеха, но без нужного опыта. Хотя в конечном итоге все решается на собеседовании.
Кроме того, в Parallels есть программа, в рамках которой мы сотрудничаем со студентами из МФТИ, НГУ, КАУ, СПбАУ, Иннополисом, отбираем лучших из них для участия в научно-исследовательских лабораториях Parallels Lab, предлагаем стажировку и растим хороших специалистов «под себя». Это шанс для тех, у кого мало опыта.
5. Да, большой плюс – опыт разработки под OS X в частности и опыт кроссплатформенной разработки в целом. Это обусловлено спецификой продуктов, над которыми работает наша команда, – Parallels Desktop для Mac и Parallels Access. Также я бы отметил психологическую совместимость – сможет ли кандидат вписаться в команду. Для нас это очень важно.
Подготовил Игорь Штомпель