Программист Java
Итак, вопросы.
1. Какими знаниями и навыками должен обладать программист Java?
2. Каков инструментарий программиста Java?
3. Каковы требования компании к уровню образования потенциальных сотрудников?
4. Какие требования предъявляются к опыту работы?
5. Есть ли особые требования, которые обусловлены спецификой деятельности компании?
Николай Чашников, руководитель команды разработчиков в проекте IntelliJ IDEA в JetBrains
1. В мире Java существует огромное количество библиотек и фреймворков, облегчающих создание программ. Да и сам язык Java с виртуальной машиной, для которой он сделан, позволяет писать код, не задумываясь о многих вещах. Но это не значит, что об этих вещах не нужно знать. Хороший Java-программист не только умеет пользоваться разными библиотеками, но и знает про то, как эти библиотеки устроены внутри, как реализованы классы в стандартной библиотеке Java, какие алгоритмы и структуры данных за ними стоят, в какой байт-код компилируется исходный код на Java, как этот байт-код исполняется в JVM.
2. Большую часть времени разработчик проводит в IDE (Eclipse, IntelliJ IDEA, NetBeans). Они не только помогают при написании кода, но и упрощают использование остальных инструментов, перечисленных ниже. Даже при работе в одиночку удобнее хранить исходный код, используя одну из систем контроля версий (Git, Subversion, Perforce...), при работе в команде это становится обязательным.
Проекты на Java часто состоят из большого количества модулей и используют множество библиотек от сторонних разработчиков. Для управления зависимостями и сборки проектов используются Maven, Ant, Gradle, Ivy. При совместной работе над одним проектом важно постоянно проверять, что изменения, сделаннные разными разработчиками, согласуются друг с другом. Для этого существуют системы непрерывной интеграции (Jenkins, Bamboo, TeamCity и другие).
3. Требований по уровню образования у нас нет. Важно то, чему человек научился, а не то, какой диплом или сертификат он получил.
4. Junior-разработчиком может стать и студент старших курсов без опыта работы (впрочем, студенты обычно попадают на работу через стажировки), для senior developer необходимы три – пять лет работы в серьезной компании.
5. Для разных проектов в компании есть разные навыки, на которые мы можем обратить внимание. Например, для проекта IntelliJ IDEA плюсом будут знания о синтаксическом разборе программ или опыт по созданию плагинов для какой-либо IDE.
Сергей Вавинов, ведущий разработчик группы технологий работы с большими данными, Яндекс
1. Программист на Java в первую очередь должен быть просто хорошим разработчиком. Должен уметь разложить задачу на части, продумать подходящие алгоритмы, спроектировать программу и написать короткий, но понятный и тестируемый код или воспользоваться готовым решением. Из человеческих качеств в Яндексе очень важны аккуратность, способность работать в команде и готовность непрерывно учиться.
Конечно, есть и знания, специфичные для Java-платформы: это и стандартная библиотека, и детали реализации JVM (например, как устроен сборщик мусора), и такие инструменты, как reflection. Одна из сильных сторон Java – поддержка многопоточного программирования. Понимание принципов разработки многопоточных программ позволяет избежать многих ошибок, которые трудно обнаружить. Наконец, вокруг платформы Java есть много распространенных Open Source-библиотек. Знакомство с ними позволяет не «изобретать велосипед».
Хочу предостеречь специалистов от чрезмерной специализации: невозможно стать хорошим разработчиком на Java, если Java – единственный язык, который ты знаешь. Разработчик, специализирующийся на платформе Java, должен свободно владеть входящими в нее технологиями. Но он также должен понимать их ограничения, знать, когда можно опереться на сильные стороны JVM, а когда стоит выйти за ее пределы и использовать другие инструменты и языки.
2. Голова, среда разработки (IDE), система контроля версий, поисковик. А дальше – зависит от задачи.
3. В Яндексе уровень образования – важный, но не главный фактор для определения компетентности разработчика. Куда важнее реальный опыт, кругозор, а также любопытство и склонность к самообразованию.
Практически всегда для нас имеет значение общее математическое образование. Математическая подготовка хорошо ставит мышление, учит искать решения новых задач. Это полезно не только в наукоемких проектах, но и в обычных инженерных. Формальное образование в computer science дает знания, важные для любого разработчика, но при достаточной мотивированности многое из этого можно изучить и самостоятельно. Что же касается различных сертификаций по Java-технологиям, то их мало кто воспринимает всерьез.
4. Если говорить о Яндексе, то на стажерские вакансии и должности младших разработчиков мы готовы брать людей с минимальным опытом или даже без опыта, но с хорошей теоретической подготовкой. Остальному научим на месте. Насчет остальных вакансий отмечу, что мы с готовностью рассматриваем людей с опытом в других языках. Если кандидат несколько лет занимался серьезной разработкой на C++ или на .NET, а в Java делает лишь первые шаги, скорее всего ему не составит труда быстро разобраться в новых технологиях.
5. В первую очередь мы ожидаем от кандидатов базовых знаний в computer science: классические структуры данных, оценка сложности алгоритмов. Минимальные требования по Java – это знание самого языка Java, представление об устройстве JVM, стандартная библиотека.
Остальное зависит от вакансии. В проектах, связанных с машинным обучением, нужна хорошая математическая подготовка. При разработке массовых сервисов или систем обработки данных надо знать принципы построения распределенных масштабируемых и отказоустойчивых систем.
Многие инженерные задачи в Яндексе возникают в масштабах, на которых стандартные решения не работают. Нужно много думать и обмениваться опытом с коллегами. Поэтому во всех случаях плюсом являются широкий кругозор и открытость к изучению нового.
Тимур Низаметдинов, ведущий разработчик в Parallels
1. Самое главное – у него должно быть системное мышление. Также он должен очень быстро обучаться. Фреймворки очень часто меняются, но основные он должен знать: J2EE, Maven и т.д.
2. По-прежнему остается Eclipse.
3. Высшее образование, и, как я уже говорил, сотрудник должен обладать системным мышлением.
4. В нашей компании работа найдется для любых талантливых программистов.
5. Объем наследованного кода накладывает ряд ограничений. Например, необходимо умение быстро разобраться в проблеме и вынести решение, например, о рефакторинге либо об изоляции устаревшего кода. Программист должен быть способен разобраться в коде без документации.
Востребованная Java
Типичный перечень требований к знаниям и навыкам Java-программиста выглядит следующим образом: знание принципов объектно-ориентированного программирования; знание теоретических основ разработки баз данных; знание английского языка как минимум на уровне чтения технической документации; знание шаблонов проектирования Java и J2EE; навыки работы в команде; навыки работы с чужим кодом; навыки работы с системами контроля версий; навыки работы с СУБД (MS SQL/PostgreSQL/Oracle).
Чаще всего в вакансиях упоминаются Java-фреймворки Spring и JSF, фреймворк Maven, библиотека Hibernate.
Образовательный ценз для потенциальных сотрудников в разработке не так строг. Многих работодателей интересуют реализованные проекты и конкретные скиллы, а не аттестат о высшем образовании. В большинстве вакансий требования к образованию либо не указаны, либо указаны достаточно расплывчато – «высшее/среднее профильное».
Среди основного инструментария, владение которым необходимо для кандидатов, указываются среды разработки Eclipse, IntelliJ IDEA, упоминается обязательность знания систем версионного контроля. Многие работодатели желают видеть в своих рядах сотрудников с подтвержденным опытом разработки серверных приложений на Java (JavaEE, JavaSE), уверенно владеющих объектно-ориентированной методологией, шаблонами проектирования (OOD Patterns), обладающих опытом работы с реляционными СУБД, знающих язык SQL, а также хорошо знакомых с сетевыми протоколами. Знание же английского требуется как минимум на уровне, который достаточен для чтения технической документации.
Существуют определенные пожелания в связи с задачами, которые предполагается решать программисту в компании. Например, процессинговой компании интересны соискатели с опытом разработки платежных систем (не обязательно именно на Java), а для реализации интерфейсов для мобильных устройств требуется сотрудник с опытом создания мобильных приложений.
Подготовил Игорь Штомпель