Наша мечта — делать лучший в мире инструментарий для разработки бизнес-приложений. У нас очень много отличных идей, реализация которых позволяет нам эту мечту осуществлять, развивать наши инструменты, чтобы оставаться лучшими. Ну а чтобы воплощать эти идеи на должном уровне, нам нужны классные программисты.
Если коротко ищем тех, кто:
Чтобы показать детальнее, каких разработчиков мы ищем и как, мы взяли короткие интервью у нанимающих менеджеров нашей компании. Вопросы в ходе интервью задавались такие:
В каких областях у нас могут работать программисты в разработке платформы? Ну например:
![image](https://habrastorage.org/r/w1560/webt/tq/rs/yl/tqrsylepatnl0lj-ajovb2kjjde.png)
![image](https://habrastorage.org/r/w1560/webt/gh/nq/sq/ghnqsqdgkb0i4ze_7ig8blrfilk.png)
Группа пишет онлайн-сервисы, которыми пользуются, наверное, миллионы конечных пользователей продуктов 1С. Сервисы, например, позволяют по ИНН получить информацию о контрагенте, проверить надежность контрагента, и т.д. Область деятельности очень ответственная, сервисы работают под большой нагрузкой, простои в работе сервисов крайне нежелательны, поэтому стараемся создавать максимально надежный продукт. А еще делаем продукт под названием Система Взаимодействия. Это механизм, передающий информацию между клиентскими приложениями и серверами 1С:Предприятия; с его помощью, в частности, реализован встроенный в приложения 1С мессенджер.
От разработчика хочется, чтобы он разрабатывал продукт в целом — анализировал потребности пользователей, продумывал архитектуру, писал код. Потому что часто приходят на интервью люди и говорят – мне неинтересно анализировать предметную область, я хочу, чтобы аналитик написал мне ТЗ, по которому я запрограммирую функциональность. То есть человеку интересны только технические моменты программирования. Мы таких людей стараемся не нанимать, т.к. команда у нас небольшая, заниматься приходится большим количеством смежных областей. Поэтому основные требования, не связанные с профессиональными навыками – это умение красиво и аккуратно оформить требования к продукту, продумать реализацию, разработать продукт и отвечать за конечный результат. Важна личная заинтересованность человека в качестве конечного продукта, чтобы человек делал продукт, которым сам хотел бы гордиться.
В книге Эрика Эванса «Предметно-ориентированное проектирование» одна из главных идей – то, что разработчик должен быть еще и аналитиком, хорошо понимать предметную область, которую он автоматизирует, понимать, что ценно для бизнеса, а если он этого не понимает, то не сможет разработать хорошую систему, которая удовлетворит всем требованиям пользователя. Если разработчик абстрагируется от предметной области, то ключевые решения по архитектуре продукта будет принимать не он, а реализовывать эти решения придется ему, и в этом случае есть риск некачественной реализации. Тот же Эванс рекомендует выделить в доменной области две части – часть, которая принципиально важна для бизнеса, та, что делает ваш продукт собственно вашим продуктом, и вторая часть, которая не очень важна, отвечающая за инфраструктурную обвязку. И самым лучшим разработчикам надо давать реализацию первой, важной части.
Как проходит собеседование? У нас есть анкета, около 10 вопросов, которые мы задаем соискателям. Вопросы в анкете не теоретические, а практические, например – код вызвал исключение с таким-то стек-трейсом, объясните, что вы будете делать. Или – у вас есть запрос в базу данных, который выполняется медленно (текст запроса дается), есть план запроса, оцените – что в плане запроса плохо, надо объяснить, как ускорить запрос. Нет смысла спрашивать человека, какие есть типы JOIN-ов — разумеется, он знает эти типы, если хоть немного готовился к собеседованию. Интересен практический опыт использования этих JOIN-ов. Если человек имеет опыт анализа планов запросов – для него не составит труда рассказать про пути решения проблемы, если нет такого опыта – книжка тут не поможет. Как раз тут проходит грань, отличающая разработчика, который просто читал про функциональность, от разработчика, который эту функциональность действительно использовал. Иметь дело со вторым типом разработчика нам более интересно, хочется, чтобы человек сразу «включился в игру».
Часть вопросов анкеты уже перестала работать, и мы эти вопросы заменили на новые. Например, некоторое время назад, на собеседованиях часто просили реализовать паттерн Singleton, а когда кандидат это делал, говорили – а теперь сделайте его lazy. С тех пор появилось несколько статей на Хабре, где подробно рассказывалось, как писать подобные вещи, люди просто выучили эту задачу наизусть, и она перестала быть тестом на профпригодность.
Еще мы хотим, чтобы разработчики грамотно писали тесты; например, чтобы в сигнатуре теста описывался контракт, которому должна удовлетворять система. Это можно делать, например, на Java в стиле, рекомендованном Роем Ошеров, когда название контракт-метода делится на три части – «дано», «что ожидаем», «какой результат». А можно делать на Groovy, используя Spock. Важно, понимает ли кандидат, что именно надо тестировать, надо ли тестировать граничные значения, знает ли он про пирамиду тестирования и т.п.
Еще спрашиваем о проектах, которыми человек занимался, особенно если в них использовались релевантные нам технологии. Например, мы используем Hazelcast, его пока мало кто использует в production (из недавних крупных внедрений – в Яндекс.Деньгах), и нам очень интересны люди с опытом использования Hazelcast. Более того, кандидат может раскрыть нам неожиданные и полезные стороны новой технологии, про которые мы пока не знаем.
Важная для нас тема – как писать код для работы в многопоточной среде. Например, есть несколько нодов приложения в высоконагруженной среде, и мы просим кандидата рассказать, как сделать систему работоспособной и надежной, при этом минимально ее блокируя.
Должен ли программист писать тесты? Должен, но не все. Юнит-тесты программист должен писать безусловно. Кстати, мы в команде не настаиваем на обязательном применении каких-либо методик, например, TDD; некоторые разработчики используют TDD по собственной инициативе, им так нравится. Также пишем интеграционные тесты. Разработчики делают также нагрузочное тестирование, пишут планы тестирования для JMeter.
![image](https://habrastorage.org/r/w1560/files/1f6/88d/f20/1f688df20aae4868bcf184a49d408042.png)
Хотя мы и разрабатываем веб-клиент на JavaScript, предпочитаем, чтобы у кандидата помимо опыта веб-разработки на JavaScript был опыт разработки на «классических» ООП языках – С++ или Java или C#. Это связано со спецификой проекта; веб-клиент 1С, написан на JavaScript, но больше по идеологии напоминает приложение, написанное на ООП языке. Код на JavaScript мы покрываем аннотациями JSDoc, благодаря этому при сборке происходит статическая проверка типов. Этот подход был выбран потому, что мы используем Google Closure Compiler, помогающий нам, в частности, увеличивать быстродействие нашего кода и снижать объем потребляемой им памяти. Таким образом, ООП-опыт будет большим подспорьем для кандидата.
На собеседовании спрашиваем, какие задачи приходилось решать кандидату и его команде на предыдущих местах работы, обсуждаем архитектуру решений, реализованных им. Задаем кандидату задачи, часть из них — на сообразительность и алгоритмическое мышление. Например, есть задачи, которые «в лоб» решаются довольно большим количеством кода, а если подумать – то в одну строку.
Есть пул задач на специфические знания по верстке, по JavaScript. Например, рисуем на листке бумаги структуру HTML страницы (структура может быть динамической, меняться во времени по определенному алгоритму) и просим написать код, который создаст такую структуру и реализует ее в динамике.
Стараемся также оценивать предрасположенность кандидата к аналитической деятельности; нам не хотелось бы иметь в команде «чистого» кодера, пусть даже пишущего качественный код, но работающего строго по фиксированному ТЗ. Хочется, чтобы разработчик был вовлечен в задачи, глубоко понимал, что и для чего делается в продукте, в идеале – был еще и драйвером новой функциональности.
Если кандидат – студент или вчерашний студент, можем задать чисто теоретические вопросы, например, спросить базовые принципы ООП или что-то еще. Если человек с опытом, подобные вопросы могут быть бессмысленны, наверняка кандидат знает эти принципы и использует их в своей работе, просьба сформулировать их может поставить его в тупик, потому, что он банально забыл формулировку из учебника.
Каждое собеседование получается уникальным. С одним человеком интересно поговорить на одни темы, с другим – на другие. В конце собеседования мы рассказываем про наш продукт, про масштабы его использования (а они внушительные – у нашей системы миллионы конечных пользователей), смотрим, насколько человек заинтересовался.
![image](https://habrastorage.org/r/w1560/webt/kk/0x/3i/kk0x3igx11364yazke1iu3eu3ak.png)
Наша команда – эксперты в области построения высоконагруженных систем на платформе 1С:Предприятие. Эти инженеры решают задачи обеспечения надежности и масштабируемости. Такие задачи часто находятся на стыке вопросов администрирования и разработки. Результатом решения таких задач является действительно классно работающая система. Примеры таких задач:
И это далеко не полный список задач. Особенно приятно, что многие из задач попадают к нам с формулировкой: «Это вообще возможно сделать?» Т.е. люди сначала не верят. Мы не спорим и всегда стараемся убедить попробовать проверить на практике, сделать. К этому нужно прибавить готовность подключиться посреди ночи к системе крупного клиента, потому что у местных инженеров что-то сломалось, и никто не знает что делать. Не один раз приходилось восстанавливать разрушенную базу при отсутствии бэкапов или выяснять, почему нагрузка на систему выросла на 5%. При желании можно даже почитать отзывы о нашей работе.
Мы ищем инженеров, которые страстно хотят делать невозможное. Одно из самых важных требований к кандидату – горящие глаза, желание и умение быстро разбираться в том, с чем раньше не сталкивался, используя уже имеющиеся знания. Это инженеры по надежности и разработчики в одном лице. Представьте, что вам обращается клиент с несколькими тысячами пользователей и рассказывает, что пытается запустить в работу сложный механизм, который разрабатывали его инженеры в течение года. И кстати:
Да, и еще: не все готовы помогать выявлять ошибки и анти-паттерны в их решениях, поэтому нужно уметь очень дипломатично общаться с инженерами, работающими в непрерывном стрессе последние месяцы.
Собеседование может быть стрессом для кандидата. Но этот стресс может даже не сравниться со стрессом, который вы получите в реальной ситуации, если не будете думать и использовать весь свой имеющийся опыт.
Проблема многих кандидатов в том, что они не умеют применять имеющиеся у них знания и не могут объяснить их шестилетнему ребенку. Именно поэтому на собеседовании периодически просим научить нас чему-нибудь, в чем кандидат лучше всего разбирается. Естественно очень хочется набирать людей, у которых многому можно научиться. В таких обсуждениях очень важна глубина знаний и очень хорошее понимание. Был опыт, когда в 7 утра собеседовали кандидата, пришли к обсуждению компонентов управления памятью в MS SQL Server и в итоге остановились на понимании страниц и экстентов. Тут вмешался HR, мол: “Что мы его мучаем?! Кто это вообще знает!?“, и мы вышли из комнаты поговорить. По коридору случайно проходил сонный и зевающий коллега в направлении кофе. Коллеге были заданы те же самые вопросы, он ответил четко, правильно, по существу, не открывая один глаз и продолжая зевать.
Естественно, стараемся проверять знание математики, алгоритмов. Они скорее относятся к базовым знаниям. А вот знание распределенных алгоритмов и умение применить такой алгоритм в задаче будет уверенным плюсом для кандидата.
Ещё один способ – попросить кандидата представить себя на месте разработчика 1С и попросить его реализовать какую-то прикладную задачу. В условиях собеседования и стресса кандидата такая задача позволяет увидеть, как кандидат думает. Смотрим на решение кандидата, помогаем кандидату увидеть существенную технологическую проблему в его решении, затем смотрим, как кандидат изменит решение, не допустив ещё одной технологической проблемы. Иногда так делаем 6-7 итераций, ищем и оцениваем слабые стороны решения. При этом сразу появляется возможность не только обсудить и понять, что знает человек, например, о взаимоблокировках, но и понимает ли, как в своем коде свести вероятность их возникновения к нулю.
Знание конкретного языка программирования не является супер важным фактором. Важнее, когда человек думает в терминах программирования с использованием языка, а не ограничивается конструкциями языка.
Первый и самый часто используемый инструмент – технологическая платформа 1С:Предприятие. Знание платформы требуется на уровне администратора и разработчика. Т.е. нужно понимать, как реализовать конкретное решение и запустить его в системе на тысячи пользователей.
Очень часто требуется анализировать работу СУБД MS SQL Server и PostgreSQL, поэтому использование инструментов профилирования, динамических представлений, журналов входит в багаж активных навыков. И тут важно умение работать с большими объемами. Стандартный блокнот Windows не очень удобен при работе с 1 Тб текстовых журналов с машинно-генерируемыми запросами и их планами. Сразу возникает необходимость знания регулярных выражений, а также целого набора инструментов и языков, их поддерживающих. Для анализа планов запросов нужно понимать, что такое индексы, и чем merge join отличается от hash join.
Системы на корпоративном рынке часто работают в ОС Linux. Там на серверах нет никакой графической среды. Навыки работы в консоли оказываются достаточно важными.
Представьте, что нужно найти, почему нагрузка на CPU на серверах c PostgreSQL в CentOS процессами Postgre выросла на 5%. Попробуйте написать на бумажке алгоритм вашего расследования. И сразу возникает понимание, что нужно
Очень важно, чтобы человек мыслил масштабно и старался всегда видеть картину в целом. Например, большинство кандидатов, решая задачу сортировки текстового файла, предлагают алгоритм, подходящий для сортировки файла в 10 Мб. Но как же существенно меняется их понимание и точка зрения, когда они сталкиваются с сортировкой файла в 10 Тб в условиях ограниченного объема памяти и места на диске. И ведь нужно помнить, что стоимость обращения к диску выше стоимости обращения к памяти. Очень хочется, чтобы кандидат мыслил «в масштабе» во всех задачах.
![image](https://habrastorage.org/r/w1560/webt/yb/ke/gu/ybkegu46g74irjqxrwiehcay9d0.png)
Главное, что в нашей команде требуется от кандидатов – это умение аналитически мыслить, тщательно анализировать задачу и умение взвешивать способы решения. У платформы 1С:Предприятие довольно долгий цикл разработки (месяцы), поэтому нельзя, как в веб-разработке, реализовывать функциональность по частям, шаг за шагом. Это требует способности глубоко мыслить при продумывании деталей реализации, нужно стараться сделать «все и сразу». Т.е. не использовать для решения проблемы первый попавшийся способ, про который вчера прочел на Хабре, а тщательно взвесить все плюсы и минусы различных путей решения.
Понять на собеседовании, есть ли такие качества у кандидата, не так просто. Наиболее релевантный способ – беседа о предыдущем опыте кандидата. Когда человек рассказывает, какое клевое решение он придумал, спрашиваем – а какая задача, собственно, решалась? Почему было выбрано именно это решение, а не другое? А если бы условия задачи немного изменились, как изменилось бы решение? Задав несколько подобных вопросов, можно понять, насколько человек глубоко погружался в тему.
Есть и другой аспект, иллюстрируемый фразой: «Нанимаем тех, кто умеет работать, а потом почему-то хотим, чтобы они хотели работать». Поэтому на собеседовании хочется понять, чем для человека является работа. Если для него это приятное времяпрепровождение, которое позволяет зарабатывать деньги, то с высокой долей вероятности у нас с кандидатом ничего путного не выйдет. Для большинства профессиональных разработчиков их работа – это самое интересное, чем им когда-либо приходилось заниматься, исследовательская деятельность, желание и умение создавать что-то новое. Человек, приходя к нам, должен быть готов учиться, учиться и учиться. Нам не нужны просто исполнители, нам нужны люди, которым никогда не надоест учиться, на нашей работе учиться приходится очень много и постоянно.
Что еще хочется увидеть у кандидата – инженерные навыки, то есть, фигурально выражаясь, умение из кубиков собрать элегантное решение.
Требуемое знание языков программирования зависит от области разработки платформы, для которой ищется кандидат. Ядро платформы – С++ и Java, веб-клиент – JavaScript и желательно знать основы C++, для некоторых проектов нужно знание 1С, но при этом крайне желательно знание и других языков и технологий. Нам приходится создавать много нового для мира 1С, хочется, чтобы кругозор и эрудиция разработчиков позволяли им оперировать идеями и понятиями, придуманными в других языках и технологиях, и понимать, как их хорошо и правильно применить в нужных местах при разработке решений на 1С. Например, для разработки нашего облачного продукта 1cFresh мы пишем различные инструменты, в основном для администрирования, на 1С (на 1С их быстрее разрабатывать, чем на традиционных языках). Если разработчик понимает паттерны технологий и языков, используемых системными администраторами (bash, Python, Perl), это поможет ему создать удобный в использовании инструмент.
Если собеседуем студента – можем попросить посчитать его интеграл и объяснить, почему интеграл так считается. Средний студент старших курсов смысл интеграла помнит уже нетвердо, а добросовестный, увлеченный студент смысл помнит очень хорошо и может объяснить.
Если перед нами системный администратор – можем спросить, например, об особенностях манипуляций с оперативной памятью в Linux. Если человек работает с СУБД – спрашиваем, например, какие уровни изоляции транзакций бывают, каким кандидат предпочитает пользоваться и почему. Если, например, человек работал над синхронизацией нескольких баз данных – обсудим с ним, как быть, если одна из синхронизируемых баз внезапно была восстановлена из бэкапа. Типичная архитектурная проблема, которую можно решать разными способами.
Еще в кандидате хотелось бы видеть желание изменить мир к лучшему и здоровую долю перфекционизма. Без разумной доли перфекционизма трудно написать код, который будет работать годами на очень разных внедрениях.
Должен ли программист писать тесты? Программист должен выдавать продукт, который работает. Если это взрослый программист, никого не должно волновать, как он это делает. Если это начинающий программист – ему рекомендуется писать тесты. Серьезный разработчик со временем начинает понимать, какие тесты следует писать для создаваемого им кода, где находятся слабые участки кода, которые лучше покрыть тестами. Мы против бездумного глобального покрытия тестами. Программа работает корректно не потому, что ее стопроцентно покрыли тестами, а потому, что разработчик включил голову. Тесты – это вспомогательный инструмент для того, чтобы в наиболее сложных местах программы защититься от ошибок. И надо помнить, что тесты – это не панацея от архитектурных проблем. Самое главное – человек должен включать голову.
Из не-ИТшных вопросов иногда задаем вот такой вопрос – а кем человек себя видит через 3-5 лет? Считаем, что сработаемся с человеком, если его стремления по развитию совпадают с тем, как видит его развитие компания.
Критично важно оценить две вещи. Первая – где человек находится сейчас, какие у него сейчас опыт и знания, какого уровня задачи он может решать прямо сейчас. Вторая – кем человек в благоприятной обстановке готов стать через несколько лет. И чтобы, конечно, эти несколько лет он работал в нашей компании, решал задачи, рос профессионально. Нам даже больше интересно не то, что представляет собой человек сейчас, а то, кем он будет через год-два-три. Нам перспектива всегда важнее текущего положения вещей. Для нас более интересен многообещающий новичок, чем человек с большими достижениями, но погасшими глазами.
Обычно начинаем интервью с вопросов – какой у вас был самый интересный проект, самый любимый проект? Очень хочется сразу понять, что человека заставляет зажечься на работе, и зажигается ли он на работе вообще.
Далее интересует, приходилось ли человеку оптимизировать производительность программ, как он это делал.
Спрашиваем, какие методики тестирования кандидат использовал на своих проектах, как он выстраивает стратегию тестирования проекта, можем спросить – у нас есть система с вот такой заявленной функциональностью, как будем ее тестировать?
Если интервью на разработчика на Java – спрашиваем про работу сборщика мусора; человек, разрабатывающий более-менее сложные программы, должен быть в курсе нюансов его работы, и как писать код, за которым сборщик мусора эффективно убирает мусор.
Из не-программерских тем интересно поспрашивать про бизнес – какую задачу с точки зрения бизнеса решал любимый проект кандидата, какую пользу приносил. Ви́дение общей картины – очень ценное свойство для разработчика. Однажды был кандидат, делавший блокчейн, его рассказ был очень познавательным.
Задаем задачи на проектирование, просим кандидата спроектировать несложную систему. Потом вместе смотрим на проект, ищем недостатки, обсуждаем, как их устранить. Очень важно, как кандидат реагирует на замечания.
Обязательно рассказываем про то, чем мы занимаемся, а именно – делаем платформу 1С:Предприятие. Рассказываем о том, что у нас можно работать над высокотехнологичными вещами, например, над кластером серверов или над мобильной платформой.
Код на бумаге писать кандидатов не заставляем. Но рисуем на бумаге в ходе собеседования много, рисуем архитектуру системы, схемы модулей, картину их взаимодействия.
Знание конкретных языков не является критичным. Бывает, человек приходит в компанию на позицию разработчика C++, будучи C# разработчиком, и учит C++ довольно быстро. И вокруг много примеров коллег, в ходе работы выучивших новые языки. Если есть желание и знание одного из языков, то выучить новый язык – не проблема.
Еще спрашиваем, что человек читает, только ли Хабр и stackoverflow, или еще и книжки по специальности, и какие именно. Иногда находим для себя таким образом полезные книги.
![image](https://habrastorage.org/webt/t6/to/z0/t6toz0ssjtlswhjvpm2t20enrc0.gif)
Нам нужны хардкорные разработчики на C++. Наша команда занимается механизмами отчетности, а значит – наш код много работает с большими объемами данных, и нужно хорошее знание контейнеров и алгоритмов.
На собеседовании спрашиваем – какие библиотеки кандидат использовал в работе, какие алгоритмы. Мы много используем STL, поэтому активно спрашиваем про эту библиотеку, какие контейнеры из нее разработчик использовал, для каких задач. Например, просим написать код, помещающий определенный класс в map, и еще пару аналогичных задач. По таким задачам сразу видно, какого уровня программист перед нами.
Вопросы по теории программирования задаем редко. Считаем, что важнее практические знания. Если человек хорошо решает задачу, удачно применяет теорию на практике, уже не так важно, что он не помнит точную формулировку базовых принципов ООП.
Кстати, если на собеседование пришел студент, которому из-за отсутствия опыта пока трудно справляться с предлагаемыми задачами – делаем на это скидку. Тут уже имеет смысл погонять его по теории, поспрашивать про его профессиональные интересы. Если человек выглядит многообещающе как специалист, имеет смысл дать ему возможность развиться у нас в хорошего профессионала.
Довольно важный критерий для нас – готовность разбираться в чужом коде. Платформа 1С:Предприятие – большой продукт, более 10 миллионов строк кода, столкновение с этим кодом в повседневной работе неизбежно, как минимум на уровне встраивания в него своего собственного кода.
Спрашиваем, как кандидат предпочитает, чтобы ему ставили задачи – в виде детально расписанной спецификации, или достаточно постановки в виде «сделай такой-то механизм». Мы понимаем и принимаем оба подхода, не будем отказывать хорошему программисту только из-за того, что ему нужно разжевывать постановку задачи; нам просто важно сразу понять – как работать с человеком. Но хочется, чтобы в дальнейшем сотрудник развивался в сторону большей самостоятельности, смог взять на себя ответственность за отдельное направление. Как примеры направлений могу привести динамический список или диаграммы. И хочется, чтобы сотрудник развивал это направление – выяснял потребности пользователей этого механизма, общаясь с пользователями на форумах и конференциях, составлял списки новых фич, расставлял им приоритеты, понимал проблемы механизма, предлагал пути решения. Если человеку интересно, он может развиваться как тимлид, начав с курирования студентов-стажеров из нашего Центра Молодых Специалистов, а позже возглавив свою команду. Ну а если человек по натуре «чистый» разработчик, который предпочитает работу по ТЗ и ему не очень интересно разбираться в потребностях пользователей – что ж, и такие люди нам нужны.
Должен ли программист тестировать? Безусловно! Программист, не делающий тестов – как повар, не пробующий то, что приготовил. От программиста нельзя, конечно, требовать полных тестов на всех поддерживаемых средах (Windows, Linux, macOS, веб- и мобильном клиенте), но на текущей операционке проверить базовую функциональность он обязан. Ну а еще лучше, если напишет автоматический тест. Это будет уже готовый регрессионный тест, который ляжет в библиотеку тестов и будет регулярно прогоняться при изменении в соответствующей области кода.
![image](http://v8.1c.ru/overview/IDE/images/img-005.png)
1C:Enterprise Development Tools написан на Java, и мы ищем разработчиков и тестировщиков со знанием Java. Мы ищем людей с горящими глазами, как уже состоявшихся профессионалов, так и новичков с потенциалом. Знание Java для нас обязательно, равно как и знание алгоритмов и структур данных, многопоточного программирования; в нашей команде мы, к сожалению, не можем позволить себе ждать, пока новый разработчик выучит эти вещи. А вот знание конкретных фреймворков, которые мы используем (EMF, Xtext, GEF, Lucene, Handly, …) — дело наживное. Если видно, что человек хорошо соображает и с ним комфортно общаться – значит, в команду он впишется и необходимые знания быстро получит.
Вообще вписываемость в команду – наверное, главный для нас критерий, наравне с профессионализмом. Наша команда – команда энтузиастов, не хочется разбавлять ее людьми другого склада характера. Да и человеку с другим характером в нашей команде, наверное, будет некомфортно работать. Однозначный красный флаг для нас – неуважительная манера общения. Человек может быть очень хорошим профессионалом, но если он не может уважительно общаться с коллегами, он нам не подойдет. У нас игра – сугубо командная.
Особенность институтского образования в том, что в институтах в массе не учат промышленному программированию. Учат синтаксису, конструкциям языка, алгоритмам. А вот умению писать документированный, сопровождаемый код, в который заложены возможности развития, расширяемости – учат очень мало где. Поэтому на собеседовании очень важный тип задач – задачи на проектирование. Например, спрашиваем – как кандидат стал бы писать тетрис, на какие компоненты поделил бы проект, какие интерфейсы бы спроектировал для взаимодействия компонентов между собой. Далее усложняем вводную – например, говорим, что тетрис будет трехмерный (или добавятся новые типы фигур, или фигуры станут падать с разных сторон) и смотрим, насколько хорошо подходит выбранный дизайн под изменившиеся условия. Вообще одна из главных задач собеседования – понять, насколько гибко и широко кандидат может мыслить. И конечно же, программист должен писать тесты, как минимум – юнит-тесты, а еще хорошо бы интеграционные. Стандартный вопрос к задаче по дизайну – а как вы будете тестировать спроектированную систему?
Ну а для тестировщика умение широко мыслить еще более ценно! Есть известная шутка, как тестировщик тестировал бар: заказал одну кружку пива, 2 кружки пива, 0 кружек пива, 999999999 кружек пива, –8 кружек пива, qwertyuip кружек пива, а после сдачи проекта в продакшн в бар зашел клиент и спросил – а где туалет? Главное умение тестера – придумать нестандартные (и в то же время реалистичные) сценарии; стандартные сценарии, как правило, разработчик и сам протестирует.
Как не привести тут ссылку на открытые вакансии :)
А еще можно просто прислать резюме на job@1c.ru.
Если коротко ищем тех, кто:
- любит (или готов полюбить) делать тиражируемые фреймворки
- хочет делать продукт, которым пользуются миллионы людей
Чтобы показать детальнее, каких разработчиков мы ищем и как, мы взяли короткие интервью у нанимающих менеджеров нашей компании. Вопросы в ходе интервью задавались такие:
- Какие вам нужны разработчики?
- Что спрашиваете на интервью?
- Какие вопросы предпочитаете на интервью – теоретические или практические?
- Должен ли программист писать тесты?
- Задаете ли вопросы не из профессиональной сферы деятельности?
- Задаете ли логические задачи на сообразительность, не связанные непосредственно с программированием? Типа задачи про шарик с гелием в машине:
В каких областях у нас могут работать программисты в разработке платформы? Ну например:
- IDE для разработки бизнес-приложений
- Компилятор встроенного языка
- Веб-фреймворк
- Балансировщик нагрузки
- и многое другое:
![image](https://habrastorage.org/webt/tq/rs/yl/tqrsylepatnl0lj-ajovb2kjjde.png)
Группа интернет-разработки
![image](https://habrastorage.org/webt/gh/nq/sq/ghnqsqdgkb0i4ze_7ig8blrfilk.png)
Группа пишет онлайн-сервисы, которыми пользуются, наверное, миллионы конечных пользователей продуктов 1С. Сервисы, например, позволяют по ИНН получить информацию о контрагенте, проверить надежность контрагента, и т.д. Область деятельности очень ответственная, сервисы работают под большой нагрузкой, простои в работе сервисов крайне нежелательны, поэтому стараемся создавать максимально надежный продукт. А еще делаем продукт под названием Система Взаимодействия. Это механизм, передающий информацию между клиентскими приложениями и серверами 1С:Предприятия; с его помощью, в частности, реализован встроенный в приложения 1С мессенджер.
От разработчика хочется, чтобы он разрабатывал продукт в целом — анализировал потребности пользователей, продумывал архитектуру, писал код. Потому что часто приходят на интервью люди и говорят – мне неинтересно анализировать предметную область, я хочу, чтобы аналитик написал мне ТЗ, по которому я запрограммирую функциональность. То есть человеку интересны только технические моменты программирования. Мы таких людей стараемся не нанимать, т.к. команда у нас небольшая, заниматься приходится большим количеством смежных областей. Поэтому основные требования, не связанные с профессиональными навыками – это умение красиво и аккуратно оформить требования к продукту, продумать реализацию, разработать продукт и отвечать за конечный результат. Важна личная заинтересованность человека в качестве конечного продукта, чтобы человек делал продукт, которым сам хотел бы гордиться.
В книге Эрика Эванса «Предметно-ориентированное проектирование» одна из главных идей – то, что разработчик должен быть еще и аналитиком, хорошо понимать предметную область, которую он автоматизирует, понимать, что ценно для бизнеса, а если он этого не понимает, то не сможет разработать хорошую систему, которая удовлетворит всем требованиям пользователя. Если разработчик абстрагируется от предметной области, то ключевые решения по архитектуре продукта будет принимать не он, а реализовывать эти решения придется ему, и в этом случае есть риск некачественной реализации. Тот же Эванс рекомендует выделить в доменной области две части – часть, которая принципиально важна для бизнеса, та, что делает ваш продукт собственно вашим продуктом, и вторая часть, которая не очень важна, отвечающая за инфраструктурную обвязку. И самым лучшим разработчикам надо давать реализацию первой, важной части.
Как проходит собеседование? У нас есть анкета, около 10 вопросов, которые мы задаем соискателям. Вопросы в анкете не теоретические, а практические, например – код вызвал исключение с таким-то стек-трейсом, объясните, что вы будете делать. Или – у вас есть запрос в базу данных, который выполняется медленно (текст запроса дается), есть план запроса, оцените – что в плане запроса плохо, надо объяснить, как ускорить запрос. Нет смысла спрашивать человека, какие есть типы JOIN-ов — разумеется, он знает эти типы, если хоть немного готовился к собеседованию. Интересен практический опыт использования этих JOIN-ов. Если человек имеет опыт анализа планов запросов – для него не составит труда рассказать про пути решения проблемы, если нет такого опыта – книжка тут не поможет. Как раз тут проходит грань, отличающая разработчика, который просто читал про функциональность, от разработчика, который эту функциональность действительно использовал. Иметь дело со вторым типом разработчика нам более интересно, хочется, чтобы человек сразу «включился в игру».
Часть вопросов анкеты уже перестала работать, и мы эти вопросы заменили на новые. Например, некоторое время назад, на собеседованиях часто просили реализовать паттерн Singleton, а когда кандидат это делал, говорили – а теперь сделайте его lazy. С тех пор появилось несколько статей на Хабре, где подробно рассказывалось, как писать подобные вещи, люди просто выучили эту задачу наизусть, и она перестала быть тестом на профпригодность.
Еще мы хотим, чтобы разработчики грамотно писали тесты; например, чтобы в сигнатуре теста описывался контракт, которому должна удовлетворять система. Это можно делать, например, на Java в стиле, рекомендованном Роем Ошеров, когда название контракт-метода делится на три части – «дано», «что ожидаем», «какой результат». А можно делать на Groovy, используя Spock. Важно, понимает ли кандидат, что именно надо тестировать, надо ли тестировать граничные значения, знает ли он про пирамиду тестирования и т.п.
Еще спрашиваем о проектах, которыми человек занимался, особенно если в них использовались релевантные нам технологии. Например, мы используем Hazelcast, его пока мало кто использует в production (из недавних крупных внедрений – в Яндекс.Деньгах), и нам очень интересны люди с опытом использования Hazelcast. Более того, кандидат может раскрыть нам неожиданные и полезные стороны новой технологии, про которые мы пока не знаем.
Важная для нас тема – как писать код для работы в многопоточной среде. Например, есть несколько нодов приложения в высоконагруженной среде, и мы просим кандидата рассказать, как сделать систему работоспособной и надежной, при этом минимально ее блокируя.
Должен ли программист писать тесты? Должен, но не все. Юнит-тесты программист должен писать безусловно. Кстати, мы в команде не настаиваем на обязательном применении каких-либо методик, например, TDD; некоторые разработчики используют TDD по собственной инициативе, им так нравится. Также пишем интеграционные тесты. Разработчики делают также нагрузочное тестирование, пишут планы тестирования для JMeter.
Группа разработки веб-клиента
![image](https://habrastorage.org/files/1f6/88d/f20/1f688df20aae4868bcf184a49d408042.png)
Хотя мы и разрабатываем веб-клиент на JavaScript, предпочитаем, чтобы у кандидата помимо опыта веб-разработки на JavaScript был опыт разработки на «классических» ООП языках – С++ или Java или C#. Это связано со спецификой проекта; веб-клиент 1С, написан на JavaScript, но больше по идеологии напоминает приложение, написанное на ООП языке. Код на JavaScript мы покрываем аннотациями JSDoc, благодаря этому при сборке происходит статическая проверка типов. Этот подход был выбран потому, что мы используем Google Closure Compiler, помогающий нам, в частности, увеличивать быстродействие нашего кода и снижать объем потребляемой им памяти. Таким образом, ООП-опыт будет большим подспорьем для кандидата.
На собеседовании спрашиваем, какие задачи приходилось решать кандидату и его команде на предыдущих местах работы, обсуждаем архитектуру решений, реализованных им. Задаем кандидату задачи, часть из них — на сообразительность и алгоритмическое мышление. Например, есть задачи, которые «в лоб» решаются довольно большим количеством кода, а если подумать – то в одну строку.
Есть пул задач на специфические знания по верстке, по JavaScript. Например, рисуем на листке бумаги структуру HTML страницы (структура может быть динамической, меняться во времени по определенному алгоритму) и просим написать код, который создаст такую структуру и реализует ее в динамике.
Стараемся также оценивать предрасположенность кандидата к аналитической деятельности; нам не хотелось бы иметь в команде «чистого» кодера, пусть даже пишущего качественный код, но работающего строго по фиксированному ТЗ. Хочется, чтобы разработчик был вовлечен в задачи, глубоко понимал, что и для чего делается в продукте, в идеале – был еще и драйвером новой функциональности.
Если кандидат – студент или вчерашний студент, можем задать чисто теоретические вопросы, например, спросить базовые принципы ООП или что-то еще. Если человек с опытом, подобные вопросы могут быть бессмысленны, наверняка кандидат знает эти принципы и использует их в своей работе, просьба сформулировать их может поставить его в тупик, потому, что он банально забыл формулировку из учебника.
Каждое собеседование получается уникальным. С одним человеком интересно поговорить на одни темы, с другим – на другие. В конце собеседования мы рассказываем про наш продукт, про масштабы его использования (а они внушительные – у нашей системы миллионы конечных пользователей), смотрим, насколько человек заинтересовался.
Группа повышения масштабируемости приложений
![image](https://habrastorage.org/webt/kk/0x/3i/kk0x3igx11364yazke1iu3eu3ak.png)
Кто мы
Наша команда – эксперты в области построения высоконагруженных систем на платформе 1С:Предприятие. Эти инженеры решают задачи обеспечения надежности и масштабируемости. Такие задачи часто находятся на стыке вопросов администрирования и разработки. Результатом решения таких задач является действительно классно работающая система. Примеры таких задач:
- развернуть отказоустойчивую инфраструктуру в двух ЦОД и провести моделирование отказов,
- обеспечить неухудшение производительности системы с увеличением числа пользователей в 10 раз, ускорить многочасовой расчет себестоимости в 3 раза,
- расследовать и устранить возникающие взаимоблокировки,
- обеспечить согласованное восстановление более десятка распределенных информационных баз на момент времени с учетом обменов между этими базами.
И это далеко не полный список задач. Особенно приятно, что многие из задач попадают к нам с формулировкой: «Это вообще возможно сделать?» Т.е. люди сначала не верят. Мы не спорим и всегда стараемся убедить попробовать проверить на практике, сделать. К этому нужно прибавить готовность подключиться посреди ночи к системе крупного клиента, потому что у местных инженеров что-то сломалось, и никто не знает что делать. Не один раз приходилось восстанавливать разрушенную базу при отсутствии бэкапов или выяснять, почему нагрузка на систему выросла на 5%. При желании можно даже почитать отзывы о нашей работе.
Кого мы ищем
Мы ищем инженеров, которые страстно хотят делать невозможное. Одно из самых важных требований к кандидату – горящие глаза, желание и умение быстро разбираться в том, с чем раньше не сталкивался, используя уже имеющиеся знания. Это инженеры по надежности и разработчики в одном лице. Представьте, что вам обращается клиент с несколькими тысячами пользователей и рассказывает, что пытается запустить в работу сложный механизм, который разрабатывали его инженеры в течение года. И кстати:
- ещё не успели закончить разработку в условиях постоянно изменяющихся требований от бизнеса клиента;
- пока разработка ключевых механизмов на внедрении в самом разгаре, инженеры ещё не добрались до тестирования механизма с тысячами пользователей;
- даже сейчас никто понятия не имеет, почему с увеличением числа пользователей на этом внедрении ровно в этом механизме резко падает производительность;
- разработку вели в Windows и с СУБД MS SQL Server, а на финальном этапе было принято политическое решение внедрять в CentOS и с СУБД PostgreSQL, чтобы оказаться в центре течения импортозамещения;
- а ещё вы случайно выясняете, что возникают таймауты при работе даже 10 пользователей;
- вам нужно посчитать оборудование для этого механизма, потому что клиенту его надо было закупить в прошлом месяце;
- вы понимаете, что вам нужно проработать параллельную реализацию алгоритмов в этом механизме, согласовать их с коллегами и вместе решить, как вы успеете в срок, не привнеся новых ошибок.
Да, и еще: не все готовы помогать выявлять ошибки и анти-паттерны в их решениях, поэтому нужно уметь очень дипломатично общаться с инженерами, работающими в непрерывном стрессе последние месяцы.
Как мы ищем
Собеседование может быть стрессом для кандидата. Но этот стресс может даже не сравниться со стрессом, который вы получите в реальной ситуации, если не будете думать и использовать весь свой имеющийся опыт.
Проблема многих кандидатов в том, что они не умеют применять имеющиеся у них знания и не могут объяснить их шестилетнему ребенку. Именно поэтому на собеседовании периодически просим научить нас чему-нибудь, в чем кандидат лучше всего разбирается. Естественно очень хочется набирать людей, у которых многому можно научиться. В таких обсуждениях очень важна глубина знаний и очень хорошее понимание. Был опыт, когда в 7 утра собеседовали кандидата, пришли к обсуждению компонентов управления памятью в MS SQL Server и в итоге остановились на понимании страниц и экстентов. Тут вмешался HR, мол: “Что мы его мучаем?! Кто это вообще знает!?“, и мы вышли из комнаты поговорить. По коридору случайно проходил сонный и зевающий коллега в направлении кофе. Коллеге были заданы те же самые вопросы, он ответил четко, правильно, по существу, не открывая один глаз и продолжая зевать.
Естественно, стараемся проверять знание математики, алгоритмов. Они скорее относятся к базовым знаниям. А вот знание распределенных алгоритмов и умение применить такой алгоритм в задаче будет уверенным плюсом для кандидата.
Ещё один способ – попросить кандидата представить себя на месте разработчика 1С и попросить его реализовать какую-то прикладную задачу. В условиях собеседования и стресса кандидата такая задача позволяет увидеть, как кандидат думает. Смотрим на решение кандидата, помогаем кандидату увидеть существенную технологическую проблему в его решении, затем смотрим, как кандидат изменит решение, не допустив ещё одной технологической проблемы. Иногда так делаем 6-7 итераций, ищем и оцениваем слабые стороны решения. При этом сразу появляется возможность не только обсудить и понять, что знает человек, например, о взаимоблокировках, но и понимает ли, как в своем коде свести вероятность их возникновения к нулю.
Знание конкретного языка программирования не является супер важным фактором. Важнее, когда человек думает в терминах программирования с использованием языка, а не ограничивается конструкциями языка.
Что используется в работе
Первый и самый часто используемый инструмент – технологическая платформа 1С:Предприятие. Знание платформы требуется на уровне администратора и разработчика. Т.е. нужно понимать, как реализовать конкретное решение и запустить его в системе на тысячи пользователей.
Очень часто требуется анализировать работу СУБД MS SQL Server и PostgreSQL, поэтому использование инструментов профилирования, динамических представлений, журналов входит в багаж активных навыков. И тут важно умение работать с большими объемами. Стандартный блокнот Windows не очень удобен при работе с 1 Тб текстовых журналов с машинно-генерируемыми запросами и их планами. Сразу возникает необходимость знания регулярных выражений, а также целого набора инструментов и языков, их поддерживающих. Для анализа планов запросов нужно понимать, что такое индексы, и чем merge join отличается от hash join.
Системы на корпоративном рынке часто работают в ОС Linux. Там на серверах нет никакой графической среды. Навыки работы в консоли оказываются достаточно важными.
Представьте, что нужно найти, почему нагрузка на CPU на серверах c PostgreSQL в CentOS процессами Postgre выросла на 5%. Попробуйте написать на бумажке алгоритм вашего расследования. И сразу возникает понимание, что нужно
- уметь применять не только uptime, vmstat, sar, atop, perf,
- знать, как воспользоваться pgbadger, psql и настроить сбор журналов в postgresql.conf,
- уметь найти один нужный запрос,
- воспользоваться analyze, проанализировать его план,
- переписать запрос и проверить, что нагрузка спала.
Что для нас важно
Очень важно, чтобы человек мыслил масштабно и старался всегда видеть картину в целом. Например, большинство кандидатов, решая задачу сортировки текстового файла, предлагают алгоритм, подходящий для сортировки файла в 10 Мб. Но как же существенно меняется их понимание и точка зрения, когда они сталкиваются с сортировкой файла в 10 Тб в условиях ограниченного объема памяти и места на диске. И ведь нужно помнить, что стоимость обращения к диску выше стоимости обращения к памяти. Очень хочется, чтобы кандидат мыслил «в масштабе» во всех задачах.
Группа разработки платформы 1С:Предприятие
![image](https://habrastorage.org/webt/yb/ke/gu/ybkegu46g74irjqxrwiehcay9d0.png)
Главное, что в нашей команде требуется от кандидатов – это умение аналитически мыслить, тщательно анализировать задачу и умение взвешивать способы решения. У платформы 1С:Предприятие довольно долгий цикл разработки (месяцы), поэтому нельзя, как в веб-разработке, реализовывать функциональность по частям, шаг за шагом. Это требует способности глубоко мыслить при продумывании деталей реализации, нужно стараться сделать «все и сразу». Т.е. не использовать для решения проблемы первый попавшийся способ, про который вчера прочел на Хабре, а тщательно взвесить все плюсы и минусы различных путей решения.
Понять на собеседовании, есть ли такие качества у кандидата, не так просто. Наиболее релевантный способ – беседа о предыдущем опыте кандидата. Когда человек рассказывает, какое клевое решение он придумал, спрашиваем – а какая задача, собственно, решалась? Почему было выбрано именно это решение, а не другое? А если бы условия задачи немного изменились, как изменилось бы решение? Задав несколько подобных вопросов, можно понять, насколько человек глубоко погружался в тему.
Есть и другой аспект, иллюстрируемый фразой: «Нанимаем тех, кто умеет работать, а потом почему-то хотим, чтобы они хотели работать». Поэтому на собеседовании хочется понять, чем для человека является работа. Если для него это приятное времяпрепровождение, которое позволяет зарабатывать деньги, то с высокой долей вероятности у нас с кандидатом ничего путного не выйдет. Для большинства профессиональных разработчиков их работа – это самое интересное, чем им когда-либо приходилось заниматься, исследовательская деятельность, желание и умение создавать что-то новое. Человек, приходя к нам, должен быть готов учиться, учиться и учиться. Нам не нужны просто исполнители, нам нужны люди, которым никогда не надоест учиться, на нашей работе учиться приходится очень много и постоянно.
Что еще хочется увидеть у кандидата – инженерные навыки, то есть, фигурально выражаясь, умение из кубиков собрать элегантное решение.
Требуемое знание языков программирования зависит от области разработки платформы, для которой ищется кандидат. Ядро платформы – С++ и Java, веб-клиент – JavaScript и желательно знать основы C++, для некоторых проектов нужно знание 1С, но при этом крайне желательно знание и других языков и технологий. Нам приходится создавать много нового для мира 1С, хочется, чтобы кругозор и эрудиция разработчиков позволяли им оперировать идеями и понятиями, придуманными в других языках и технологиях, и понимать, как их хорошо и правильно применить в нужных местах при разработке решений на 1С. Например, для разработки нашего облачного продукта 1cFresh мы пишем различные инструменты, в основном для администрирования, на 1С (на 1С их быстрее разрабатывать, чем на традиционных языках). Если разработчик понимает паттерны технологий и языков, используемых системными администраторами (bash, Python, Perl), это поможет ему создать удобный в использовании инструмент.
Если собеседуем студента – можем попросить посчитать его интеграл и объяснить, почему интеграл так считается. Средний студент старших курсов смысл интеграла помнит уже нетвердо, а добросовестный, увлеченный студент смысл помнит очень хорошо и может объяснить.
Если перед нами системный администратор – можем спросить, например, об особенностях манипуляций с оперативной памятью в Linux. Если человек работает с СУБД – спрашиваем, например, какие уровни изоляции транзакций бывают, каким кандидат предпочитает пользоваться и почему. Если, например, человек работал над синхронизацией нескольких баз данных – обсудим с ним, как быть, если одна из синхронизируемых баз внезапно была восстановлена из бэкапа. Типичная архитектурная проблема, которую можно решать разными способами.
Еще в кандидате хотелось бы видеть желание изменить мир к лучшему и здоровую долю перфекционизма. Без разумной доли перфекционизма трудно написать код, который будет работать годами на очень разных внедрениях.
Должен ли программист писать тесты? Программист должен выдавать продукт, который работает. Если это взрослый программист, никого не должно волновать, как он это делает. Если это начинающий программист – ему рекомендуется писать тесты. Серьезный разработчик со временем начинает понимать, какие тесты следует писать для создаваемого им кода, где находятся слабые участки кода, которые лучше покрыть тестами. Мы против бездумного глобального покрытия тестами. Программа работает корректно не потому, что ее стопроцентно покрыли тестами, а потому, что разработчик включил голову. Тесты – это вспомогательный инструмент для того, чтобы в наиболее сложных местах программы защититься от ошибок. И надо помнить, что тесты – это не панацея от архитектурных проблем. Самое главное – человек должен включать голову.
Из не-ИТшных вопросов иногда задаем вот такой вопрос – а кем человек себя видит через 3-5 лет? Считаем, что сработаемся с человеком, если его стремления по развитию совпадают с тем, как видит его развитие компания.
Критично важно оценить две вещи. Первая – где человек находится сейчас, какие у него сейчас опыт и знания, какого уровня задачи он может решать прямо сейчас. Вторая – кем человек в благоприятной обстановке готов стать через несколько лет. И чтобы, конечно, эти несколько лет он работал в нашей компании, решал задачи, рос профессионально. Нам даже больше интересно не то, что представляет собой человек сейчас, а то, кем он будет через год-два-три. Нам перспектива всегда важнее текущего положения вещей. Для нас более интересен многообещающий новичок, чем человек с большими достижениями, но погасшими глазами.
Разработка платформы 1С:Предприятие – еще один взгляд
Обычно начинаем интервью с вопросов – какой у вас был самый интересный проект, самый любимый проект? Очень хочется сразу понять, что человека заставляет зажечься на работе, и зажигается ли он на работе вообще.
Далее интересует, приходилось ли человеку оптимизировать производительность программ, как он это делал.
Спрашиваем, какие методики тестирования кандидат использовал на своих проектах, как он выстраивает стратегию тестирования проекта, можем спросить – у нас есть система с вот такой заявленной функциональностью, как будем ее тестировать?
Если интервью на разработчика на Java – спрашиваем про работу сборщика мусора; человек, разрабатывающий более-менее сложные программы, должен быть в курсе нюансов его работы, и как писать код, за которым сборщик мусора эффективно убирает мусор.
Из не-программерских тем интересно поспрашивать про бизнес – какую задачу с точки зрения бизнеса решал любимый проект кандидата, какую пользу приносил. Ви́дение общей картины – очень ценное свойство для разработчика. Однажды был кандидат, делавший блокчейн, его рассказ был очень познавательным.
Задаем задачи на проектирование, просим кандидата спроектировать несложную систему. Потом вместе смотрим на проект, ищем недостатки, обсуждаем, как их устранить. Очень важно, как кандидат реагирует на замечания.
Обязательно рассказываем про то, чем мы занимаемся, а именно – делаем платформу 1С:Предприятие. Рассказываем о том, что у нас можно работать над высокотехнологичными вещами, например, над кластером серверов или над мобильной платформой.
Код на бумаге писать кандидатов не заставляем. Но рисуем на бумаге в ходе собеседования много, рисуем архитектуру системы, схемы модулей, картину их взаимодействия.
Знание конкретных языков не является критичным. Бывает, человек приходит в компанию на позицию разработчика C++, будучи C# разработчиком, и учит C++ довольно быстро. И вокруг много примеров коллег, в ходе работы выучивших новые языки. Если есть желание и знание одного из языков, то выучить новый язык – не проблема.
Еще спрашиваем, что человек читает, только ли Хабр и stackoverflow, или еще и книжки по специальности, и какие именно. Иногда находим для себя таким образом полезные книги.
Группа разработки механизмов отчетности
![image](https://habrastorage.org/webt/t6/to/z0/t6toz0ssjtlswhjvpm2t20enrc0.gif)
Нам нужны хардкорные разработчики на C++. Наша команда занимается механизмами отчетности, а значит – наш код много работает с большими объемами данных, и нужно хорошее знание контейнеров и алгоритмов.
На собеседовании спрашиваем – какие библиотеки кандидат использовал в работе, какие алгоритмы. Мы много используем STL, поэтому активно спрашиваем про эту библиотеку, какие контейнеры из нее разработчик использовал, для каких задач. Например, просим написать код, помещающий определенный класс в map, и еще пару аналогичных задач. По таким задачам сразу видно, какого уровня программист перед нами.
Вопросы по теории программирования задаем редко. Считаем, что важнее практические знания. Если человек хорошо решает задачу, удачно применяет теорию на практике, уже не так важно, что он не помнит точную формулировку базовых принципов ООП.
Кстати, если на собеседование пришел студент, которому из-за отсутствия опыта пока трудно справляться с предлагаемыми задачами – делаем на это скидку. Тут уже имеет смысл погонять его по теории, поспрашивать про его профессиональные интересы. Если человек выглядит многообещающе как специалист, имеет смысл дать ему возможность развиться у нас в хорошего профессионала.
Довольно важный критерий для нас – готовность разбираться в чужом коде. Платформа 1С:Предприятие – большой продукт, более 10 миллионов строк кода, столкновение с этим кодом в повседневной работе неизбежно, как минимум на уровне встраивания в него своего собственного кода.
Спрашиваем, как кандидат предпочитает, чтобы ему ставили задачи – в виде детально расписанной спецификации, или достаточно постановки в виде «сделай такой-то механизм». Мы понимаем и принимаем оба подхода, не будем отказывать хорошему программисту только из-за того, что ему нужно разжевывать постановку задачи; нам просто важно сразу понять – как работать с человеком. Но хочется, чтобы в дальнейшем сотрудник развивался в сторону большей самостоятельности, смог взять на себя ответственность за отдельное направление. Как примеры направлений могу привести динамический список или диаграммы. И хочется, чтобы сотрудник развивал это направление – выяснял потребности пользователей этого механизма, общаясь с пользователями на форумах и конференциях, составлял списки новых фич, расставлял им приоритеты, понимал проблемы механизма, предлагал пути решения. Если человеку интересно, он может развиваться как тимлид, начав с курирования студентов-стажеров из нашего Центра Молодых Специалистов, а позже возглавив свою команду. Ну а если человек по натуре «чистый» разработчик, который предпочитает работу по ТЗ и ему не очень интересно разбираться в потребностях пользователей – что ж, и такие люди нам нужны.
Должен ли программист тестировать? Безусловно! Программист, не делающий тестов – как повар, не пробующий то, что приготовил. От программиста нельзя, конечно, требовать полных тестов на всех поддерживаемых средах (Windows, Linux, macOS, веб- и мобильном клиенте), но на текущей операционке проверить базовую функциональность он обязан. Ну а еще лучше, если напишет автоматический тест. Это будет уже готовый регрессионный тест, который ляжет в библиотеку тестов и будет регулярно прогоняться при изменении в соответствующей области кода.
Группа разработки 1C:Enterprise Development Tools
![image](http://v8.1c.ru/overview/IDE/images/img-005.png)
1C:Enterprise Development Tools написан на Java, и мы ищем разработчиков и тестировщиков со знанием Java. Мы ищем людей с горящими глазами, как уже состоявшихся профессионалов, так и новичков с потенциалом. Знание Java для нас обязательно, равно как и знание алгоритмов и структур данных, многопоточного программирования; в нашей команде мы, к сожалению, не можем позволить себе ждать, пока новый разработчик выучит эти вещи. А вот знание конкретных фреймворков, которые мы используем (EMF, Xtext, GEF, Lucene, Handly, …) — дело наживное. Если видно, что человек хорошо соображает и с ним комфортно общаться – значит, в команду он впишется и необходимые знания быстро получит.
Вообще вписываемость в команду – наверное, главный для нас критерий, наравне с профессионализмом. Наша команда – команда энтузиастов, не хочется разбавлять ее людьми другого склада характера. Да и человеку с другим характером в нашей команде, наверное, будет некомфортно работать. Однозначный красный флаг для нас – неуважительная манера общения. Человек может быть очень хорошим профессионалом, но если он не может уважительно общаться с коллегами, он нам не подойдет. У нас игра – сугубо командная.
Особенность институтского образования в том, что в институтах в массе не учат промышленному программированию. Учат синтаксису, конструкциям языка, алгоритмам. А вот умению писать документированный, сопровождаемый код, в который заложены возможности развития, расширяемости – учат очень мало где. Поэтому на собеседовании очень важный тип задач – задачи на проектирование. Например, спрашиваем – как кандидат стал бы писать тетрис, на какие компоненты поделил бы проект, какие интерфейсы бы спроектировал для взаимодействия компонентов между собой. Далее усложняем вводную – например, говорим, что тетрис будет трехмерный (или добавятся новые типы фигур, или фигуры станут падать с разных сторон) и смотрим, насколько хорошо подходит выбранный дизайн под изменившиеся условия. Вообще одна из главных задач собеседования – понять, насколько гибко и широко кандидат может мыслить. И конечно же, программист должен писать тесты, как минимум – юнит-тесты, а еще хорошо бы интеграционные. Стандартный вопрос к задаче по дизайну – а как вы будете тестировать спроектированную систему?
Ну а для тестировщика умение широко мыслить еще более ценно! Есть известная шутка, как тестировщик тестировал бар: заказал одну кружку пива, 2 кружки пива, 0 кружек пива, 999999999 кружек пива, –8 кружек пива, qwertyuip кружек пива, а после сдачи проекта в продакшн в бар зашел клиент и спросил – а где туалет? Главное умение тестера – придумать нестандартные (и в то же время реалистичные) сценарии; стандартные сценарии, как правило, разработчик и сам протестирует.
Заключение
Как не привести тут ссылку на открытые вакансии :)
А еще можно просто прислать резюме на job@1c.ru.