Разработчик Scala
Важное место среди языков программирования, которые сочетают объектно-ориентированный подход с функциональным программированием, занимает Scala. Он нашел свое применение в крупных компаниях (LinkedIn, Siemens, Twitter и др.). Мы обратились к экспертам и представителям различных компаний, чтобы выяснить, каких кандидатов они видят на этой позиции.
1. Какими знаниями и навыками должен обладать разработчик Scala?
2. Каков инструментарий разработчика Scala?
3. Каковы требования компании к уровню образования потенциальных сотрудников?
4. Какие требования предъявляются к опыту работы?
5. Есть ли особые требования, которые обусловлены спецификой деятельности компании?
Сергей Толмачев, разработчик в Waves platform, лектор курса scala.wtf
1. Обычно разработчик Scala – это хороший, любознательный и заинтересованный в своем профессиональном развитии Java-разработчик. Он имеет фундаментальные знания работы с JVM, коллекций и параллельных вычислений. В частности, умеет грамотно и к месту использовать мощные функциональные возможности, которые дает Scala, в своей работе, потому что стоит всегда задумываться не только о простоте и понятности кода, но и о других участниках команды, которым придется его поддерживать. «С большой силой приходит и большая ответственность» – это точно про Scala, поэтому стоит не злоупотреблять.
2. Инструментарий почти тот же, что и у Java-разработчика. Обычно Scala-разработчики используют IDE Intellij Idea как систему сборки sbt, в некоторых компаниях используют более консервативный Maven или Gradle. Для профилирования и диагностики выполнения кода используют VisualVM.
3. Нет конкретных и четких требований, это определяет должность и предметная область, с которой сотрудник будет работать: от базовых знаний HTML/CSS/JS для веб-разработки и вплоть до научных степеней, научных публикаций и глубоких знаний криптографии и математики для исследования и разработки экспериментальных наукоемких прототипов и новых проектов. Я считаю, что главное требование для работы в современной компании – это возможность решать поставленные задачи, неважно, кем ты был вчера – дворником или победителем олимпиад по программированию.
Для Scala-разработчика мы обычно даем тестовое задание, чтобы оценить подход человека к решению задач и качество его кода, затем проводим техническое собеседование и уже принимаем решение. Также компания помогала в организации Scala-курсов scala.wtf, где сотрудники компании обучали всех желающих основам работы со Scala.
4. Обычно считается, что Scala-разработчик – это достаточно опытный Java-разработчик, который осмысленно выбрал, изучил и применил удобный для себя и своей работы инструмент. Обычно заявляют опыт на Java, превосходящий на 1-3 года опыт на Scala. При этом понятно, что из-за меньшей распространенности Scala сложнее получить опыт работы на этом языке, поэтому для подтвержения квалификации могут подойти свои проекты с открытым исходным кодом или сертификаты по Scala-курсам на Coursera.
5. В Waves platform мы разрабатываем на Scala децентрализованную блокчейн-платформу с открытым исходным кодом, что привносит уникальный опыт в решение задач, да и сами задачи решаются совсем не теми способами, что в обычной backend- разработке, где обновление всех сервисов под вашим контролем: сеть состоит из сотен серверов по всему миру, их поддерживает большое сообщество, и людям разного уровня должно быть удобно им пользоваться.
Так что у нас есть пожелания к базовым знаниям криптографии и криптовалют, чтобы разработчик уже примерно представлял, чем ему предстоит заниматься. Многих наших кандидатов очень интересует эта сфера, они узнают о ней до нашего знакомства и отдают приоритет нашим вакансиям. Как раз сейчас у нас открыта вакансия разработчика Scala (https://blog.wavesplatform.com/looking-for-scala-guru-ee384233fef0).
Василий Зайцев, Team Lead Data Processing Team at Propzmedia
1. Образование по специальности. Но так как порог входа для Scala достаточно высокий, то и качество образования должно быть высоким.
2. Нет особых предпочтений, обычно Intellij Idea.
3. Алгоритмы, структуры данных, многопоточность (часто Akka), Java-экосистема (JVM, модель памяти), Scala API.
4. Зависит от позиции, но специальных требований я не наблюдал.
5. Конечно, с ростом отрасли больших данных спрос на Scala-специалистов вырос и продолжает расти из-за Spark, Kafka, которые предоставляют как основной Scala API.
Дмитрий Жиденков, Java/Scala-разработчик в компании UniCenter
1. В разработчике Scala ценятся те же качества, что и в разработчике на любом другом языке. Плюс Scala обладает своеобразной атмосферой свободы – она сочетает в себе две мощные парадигмы сразу – ООП и ФП – и в целом обладает крайне выразительным и гибким синтаксисом. Поэтому на программисте лежит больше ответственности за аккуратность и читаемость кода.
2. Самый удобный инструмент на текущий момент – это Intellij Idea с плагином на Scala. Система сборки – SBT, хотя можно без проблем прицепить и Gradle – дело вкуса.
3. Нет строгих требований именно к наличию каких-то дипломов и сертификатов. Необходим определенный запас любопытства и гибкость мышления. Как сам по себе Scala, так и многие сторонние фреймворки часто вносят необычные подходы к решению обычных задач. Например, модель акторов и стримов из Akka. Бывает необходимо перестроить привычную «картину мира», чтобы овладеть новым инструментом.
4. Требования к опыту зависят от конкретной вакансии. Желательно владеть Java и иметь представление о том, как работает его экосистема. Будет очень полезно иметь опыт с функциональными языками. Ну и если вы собеседуетесь на вакансию сеньор-ниндзя-гуру-фуллстек-девелопер, от вас будут ждать того, что вы знакомы с инструментами, с которыми собираетесь работать.
5. В основном это классические энтерпрайзные инструменты Java – Spring, Cassandra, Kafka и т.п. Из чисто Scala-фреймворков – это Akka во всех его проявлениях.
Какой-то особой специфики нет, выбираются оптимальные инструменты под конкретные задачи, если только не попасть на поддержку легаси, где стек уже сформирован.
Андрейс Олиньш, самозанятый разработчик, экс-Accenture (Латвия)
1. От хорошего разработчика Scala требуется понимание функциональных языков программирования и таких понятий, как Future, CallBack. Без этого понимания код скорее всего будет написан на Java или C# с использованием синтаксиса Scala.
Из навыков отмечу умение свести задачу к map-reduce.
В остальном требования такие же, как и к разработчикам на любом другом языке.
2. Любая среда разработки подойдет: Eclipse, IDEA, Atom, Sublime. Очень помогает sbt: сборщик, который написан авторами Scala (непрерывный прогон тестов sbt ~test выручает постоянно).
3. Обычно хватает записей в CV и пройденного теста. Я начинал с успешно сданного курса Мартина Одерского на Coursera. Теперь поддерживаю форму, щелкая задачки на Hackerrank.
Человек, претендующий на роль ведущего разработчика или архитектора, должен иметь высшее образование и пройти набор дополнительных курсов.
4. Два года опыта в коммерческих проектах на Scala или 4-6 лет опыта программирования вообще.
5. Уже давно каждый язык является экосистемой, в которой рождаются и умирают библиотеки инструментов. Каждый проект использует свой, иногда уникальный набор технологий из этой экосистемы, который определяет конечные требования: Play Framework, Akka, Camel.
Александр Зайдель, Senior Software Engineer в компании Agoda (Bangkok Metropolitan Area, Thailand)
1. Аналитический склад ума, умение работать в команде, ownership, быть ответственным. Необходимо понимать, что такое функциональное программирование (ФП), плюсы ФП. Знать различия между обычной рекурсией и хвостовой. Опыт работы с фреймворками, такими как Play, Аkka, Аkka-http, Аkka-streams. Знания SQL и NoSQL баз данных, асинхронное программирование. Я бы отметил TDD и чистый код, т.к. в конце концов работаешь не с компьютерами, а с людьми.
2. Среда разработки – Intellij Idea; для сборки проекта: Maven/sbt/Gradle; система контроля версий: Git; помимо этого не лишними окажутся знания Teamcity/Jenkins, Docker, SSH, Linux.
3. Высшее образование в сфере ИТ, как минимум степень бакалавра.
4. Так как найти Scala-разработчиков сложно, компания готова нанимать людей без опыта в Scala, а таковых кандидатов много. И в этом случае мы ожидаем понимания структур данных и алгоритмов, паттернов проектирования.
5. Предыдущий опыт в сфере букинга будет плюсом, но он не обязателен.
Алексей Кравец, Mobile developer tools manager at NVIDIA
1. Во-первых, как и в случае любого другого инструмента, разработчик Scala должен знать как сам инструмент (т.е. Scala), так и теорию, лежащую в его основе. Как невозможно написать хорошую программу на Си, не зная основ машины, на которой будет исполняться данная программа, так невозможно написать хорошую Scala-программу, не зная, во-первых, азов функционального и объектно-ориентированного программирования и, во-вторых, устройства исполнителя полученной программы (например, JVM).
Вторым по важности я бы назвал знание и понимание предметной области, умение представить базовые понятия и концепции, с которыми предстоит работать программе, в виде конструкций языка.
2. Я не считаю, что наличие специального инструмента для разработки является крайней необходимостью. В моем случае лучше всего подошел Vim с плагином Eclim.
3. Несмотря на то что ничего не мешает человеку самостоятельно изучить как сам язык, так и базовую теорию, необходимую для работы, вероятность этого достаточно мала. Наличие профильного высшего технического образования на данный момент можно считать необходимым требованием к потенциальному сотруднику, не имеющему аналогичного опыта работы. Дополнительным плюсом может быть прохождение профильных курсов (функциональное программирование, программирование на Java) как в рамках учебы, так и факультативно (например, Сoursera).
С другой стороны, если у человека уже есть опыт работы с нужной технологией (прошлые проекты, github), его уровень образования менее важен.
4. Язык довольно молодой, так что недавний выпускник, у которого было много времени изучить новую технологию во время учебы, может знать Scala не хуже уже устоявшегося специалиста.
5. Знание предметной области. Например, в ARM мы использовали Scala для разработки компилятора, так что в дополнение к работе со Scala от успешного кандидата требовались знания по внутреннему устройству компилятора.
Леонид Чашников, Scala Developer, Captify
1. В Scala редко приходят «с улицы», обычно туда «переключаются» с других языков, попробовав делать пет-проекты на скале и почувствовав желание сделать этот язык своим основным. Так что обычно для того, чтобы компания рассматривала кандидата, необходимы знания более «популярных» языков, например Java или Python. Ну и быть готовым быстро учить новый язык.
2. Для удобного редактирования кода в Intellij Idea есть scala-plugin, а также существует Scala IDE, основанная на Eclipse, но особо большой популярностью она не пользуется. Некоторые также используют более легковесные редакторы типа Atom/SublimeText или даже Vim/Emacs.
Ну и плюс вещи, которые напрямую к Scala не относятся, но необходимы сейчас почти любому разработчику, – Docker, клиент базы данных, клиент системы контроля версий и т.п.
3-4. Зачастую компании готовы брать опытных (2-3 года) джава-разработчиков, которые хотят учить Scala. Именно уровень образования не оценивается напрямую (вряд ли какая-нибудь компания будет обязательно требовать от кандидата наличия диплома бакалавра/магистра), но, конечно, некоторое знакомство с функциональными парадигмами является плюсом. Иногда могут взять и бывшего студента, хотя в большинстве случаев Scala не является для человека первым языком.
5. Могут быть, если требуется специалист высокого уровня, сразу знакомый с предметной областью, чтобы на его обучение не пришлось тратить дополнительное время. Но в большинстве случаев компании готовы немного обучить подходящего кандидата (да и редко встречаются настолько сложные продукты, в которых требуется очень глубокое знание предметной области от каждого разработчика).
Юрий Бадальянц, ведущий программист в компании 2ГИС
1. Обычно на Scala разрабатывают либо бэкенды общего назначения, либо делают что-то на тему big data. Соответственно, и требования к этим направлениям различаются.
В случае бэкендов важно иметь типичный набор навыков и знаний любого бэкенд-разработчика:
- протоколы – TCP, HTTP;
- REST, RPC и другие подобные подходы;
- понимание принципов построения высоконагруженных и отказоустойчивых систем;
- SQL и NoSQL базы данных.
Обычно Scala в production работает на Linux/Unix-серверах. Нужно уметь с этим работать.
В случае с big data самые распространенные инструменты – Spark и Hadoop.
Однако big data-стэк очень широк, и в зависимости от компании технологии могут варьироваться. Нужно понимать принципы работы распределенных вычислений. Неплохо иметь какие-то базовые знания, типичные для Data Science-направления, – это статистика, нейронные сети, машинное обучение и т.п.
Что касается самой Scala, тут важно быть знакомым как с объектно-ориентированным программированием, так и с функциональным.
Сообщество в основном тяготеет именно к функциональному программированию: важно иметь хотя бы общее представление о функциональном программировании. Все эти монады, функторы и полугруппы используются в Scala как вполне обыденные концепции.
Также на собеседованиях мы много внимания уделяем пониманию синхронного и асинхронного кода. Сейчас появляется все больше технологий и подходов, которые базируются именно на асинхронном взаимодействии. Язык Scala предоставляет удобные инструменты для работы с асинхронным и многопоточным кодом. Очень важно понимать и уметь этим пользоваться.
2. В качестве основного инструмента для разработки де-факто стандартом в сообществе является Intellij Idea со Scala-плагином (он работает и в community-версии). Помимо IDEA есть плагины для Eclipse и Emacs, но вживую я не видел людей, которые бы ими пользовались.
Как основную операционную систему почти все используют Linux или Mac OS. В качестве системы сборки используют SBT. Что касается других инструментов, то все зависит от специфики работы.
3. По моему личному мнению, уровень образования не так важен. Главное, чтобы человек был заинтересован в собственном развитии и постоянно изучал что-то новое.
4. Scala – это не такой язык, в который можно зайти с улицы. Порог входа в него высокий. Обычно все Scala-разработчики до Scala писали хотя бы на одном-двух языках. Нельзя сказать, что знание нескольких языков является «требованием», но именно так обычно складывается история. В основном в Scala-вакансиях присутствует формулировка типа «желателен опыт разработки на Scala либо желание его получить». Рынок Scala-разработчиков не так широк, и поэтому большинство компаний готовы принимать людей без опыта production-разработки на этом языке. Главное – заинтересованность, желание изучить язык и двигаться в сторону функционального программирования.
5. В 2ГИС есть скорее не требование, а некоторая специфика, потому что мы пишем ГИС-систему. Периодически нам приходится сталкиваться с математикой, связанной с координатами, расчетом расстояний и т.п. Однако стоит отметить, что задачи и технологии различаются от команды к команде. В 2ГИС существуют команды, которые абсолютно не пересекаются с ГИС-системой. В любом случае, даже если человек не работал раньше с подобным, мы всему научим.
Роман Гребенников, Scala Developer в компании Findify
1. Знания и навыки: в глазах лучших скала-разработчиков, которых я видел в своей жизни, обычно читается хроническая тоска и печаль по текущему состоянию индустрии разработки ПО, где один случайно залетевший дятел может разрушить всю цивилизацию. Эти люди обычно не доверяют ничему, что не было проверено на валидность type checker.
Эта тоска – последствие личного опыта, в котором ломалось даже то, что не должно ломаться, и, чтобы подобное не повторялось, код надо писать так, как будто ты не доверяешь даже самому себе и собственной бабушке.
2. Инструментарий примерно тот же, что и в Java-мире, с небольшими исключениями. Я могу тут написать пару дюжин непонятных слов из трех букв, которые никому не интересны, но в скала-мире в плане инструментария всегда есть свобода выбора: перебежчики из джавы любят использовать Maven для сборки, кто-то, зловеще хохоча, пишет код Vim. Но большинство вроде меня таки предпочитает попсовую Intellij Idea и sbt.
3. Уровень образования: по личным наблюдениям, в Scala чаще всего приходят из других языков, в большинстве случаев из Java, уже в сознательном возрасте и не от хорошей жизни, поэтому у многих работодателей возникло когнитивное искажение, что Scala-разработчики в массе своей настолько умные, что могут силой мысли исправлять баги в стиральной машине и гнуть арматуру. Другими словами, уровень образования обычно требуется чуть более высокий, чем в случае с Java-миром.
4. Опыт работы: в скала-мире, на мой взгляд, абсолютное значение опыта работы в годах редко кого волнует. Кто-то 10 лет протирал штаны в банке, а кто-то на пятом курсе университета уже слал пулл-реквесты в сам компилятор скалы. К тому же из-за специфики миграции поголовья на скалу, которая редко бывает первым языком, непонятно, как этот опыт мерять.
Важнее всего способность решать задачи бизнеса, что при некотором навыке легко выявляется в процессе собеседования.
5. Специфика: в скала-мире есть очень богатая экосистема библиотек, которые напрямую или косвенно используются почти в 90% всех проектов, и хорошо бы в этом зоопарке хорошо ориентироваться: Аkka, Scalatest и т.п.
Бонусные баллы можно получить, если уметь писать настолько строго типизированный код, что если он-таки наконец скомпилился, то с большой долей вероятности заработает без ошибок. Но для этого надо уметь уверенно и с умным лицом произносить фразы «моя макродеривация тайп-классов лучше твоей чепухи на генериках из shapeless» и «за использование мутабельных коллекций у нас бьют стримами по мьютексу».
Александр Хлыбов, Junior Scala Developer в компании INB Group
1. Не думаю, что Scala-разработчиков следует как-то выделять среди программистов всех направлений. Требования вполне стандартные: алгоритмическое мышление, техническая база в виде хорошего математического образования (желательно университетского, но отнюдь не обязательно), так как, если вы собираетесь углубиться в функциональное программирование, волей-неволей придется разбираться с теорией категорий и прочими «радостями» математических дисциплин. Единственное качество, которое хотелось бы все-таки выделить, – это непугливость к новым, более сложным вещам. Сказано это не для красного словца или чтобы превознести скалу над массами, а потому что при неимении релевантного опыта с функциональным программированием и сложными системами типов первое время скала может отпугивать.
2. Инструментарий идентичен набору Java-разработчиков: одна из двух IDE на выбор (Idea, Eclipse), опционально GUI для СУБД, которую вы используете. Если вы приверженец Emacs/Vim, можете настроить их для скалы, соответствующие плагины присутствуют и поддерживаются.
3. Как упоминалось в первом пункте, ничего сверхнеобычного, единственное, что на некоторых наукоемких проектах видел требования аспирантуры или даже PhD, но это не особенность именно скалы.
4. Так как специфика Scala обусловливает его использование в нетривиальных, высоконагруженных системах, джуниорам довольно сложно найти работу. Не столько из-за сложности самой скалы, сколько по причине требования наличия опыта в работе на проектах со сложной архитектурой, командной работы и так далее. Поэтому компании, осознавая это, набирают джавистов с желанием перейти на скалу. Так что новичкам остается либо начинать карьерный путь с релевантных технологий, либо надеяться найти стажировку при какой-то фирме.
5. Не повально, но намечается тенденция вопросов к кандидатам о знании и опыте работы с функциональными библиотеками (shapless, cats, scalaz). Конечно, это пока не решающий критерий, но, думаю, по мере проникновения Scala в IT-рынок будет больше энтузиастов, использующих эти библиотеки в продакшн-коде. И желающим писать на Scala, как на улучшенном Java, придется либо сменить язык, либо окунуться в мир монад и аппликативов.
Станислав Коваленко, разработчик, сервис «МойСклад»
1. Основными, на мой взгляд, являются знания экосистемы JVM и основных дисциплин Computer Science. В остальном это, конечно, уверенные знания языка Scala и его библиотеки. Желательно понимать функциональную парадигму и как ее использовать в языке Scala.
2. В первую очередь это редактор или IDE. Обычно выбор падает на самые популярные IDE для Java – Intellij Idea, Eclipse или NetBeans. Эти решения содержат в себе очень много полезных инструментов для анализа и рефактора кода, имеют встроенную поддержку многих фреймворков.
Помимо редактора, разработчику нужно работать с инструментами для сборки проектов. Стандарт де-факто для Scala-проектов – это SBT. Это очень мощный и гибкий инструмент, но при этом достаточно сложный в изучении. В нашей компании мы пользуемся им и Maven.
Также, когда работаешь в команде, становятся необходимыми инструменты для контроля версий (Git, Subversion, Mercurial...) и программы для организации работы над задачами (Jira, Redmine, Trello...). В нашей компании мы используем Git для контроля версий и Jira для организации работы над задачами.
3. В общем случае это должен быть человек с высшим техническим образованием или студент последних курсов.
4. Требования зависят от уровня разработчика (junior, middle, senior), однако что точно требуется от разработчика Scala – это опыт работы с экосистемой JVM и языком Java. Отсутствие опыта работы с самим языком Scala не является проблемой, если человек имел опыт работы с Java. Но в этом случае желательно, чтобы человек прошел первые три курса на Coursera по специализации Scala.
5. Из общих технических требований – наличие опыта работы с Linux, все наши разработчики используют OS этого семейства. А из не технических – это готовность и желание работать в рамках методологии разработки Scrum.
В остальном все зависит от команды. Если вы хотели бы заниматься созданием UI на Scala, то у нас есть проекты, использующие ScalaJS и ReactJS. Для них было бы полезно иметь некоторый опыт работы с JavaScript, немного разбираться в функциональном (линзы, тайп-классы) и реактивном программировании. Если backend, то это понимание акторной модели, опыт работы с Websocket и библиотеками Аkka, Аkka-http.
Антонио Рамирез Круз (Antonio Ramirez Cruz), Real Time Developer в Playtika
1. Компьютерные науки, базовые знания парадигмы функционального программирования (high order fn, inmutability, recursion, currying).
2. Cам Sсala, SBT (Simple build tool) для ручной работы со сторонними библиотеками, компиляции, выполнения тестов, сборки и т.д.
Ряд фреймворков:
- доступ к БД (slick, Squeryl, finagle);
- Web (Play Framework, finagle, Аkka-http).
Есть много полезных библиотек для решения различных задач, от использования командной строки (Scopt) до более специфических инструментов для работы с big data, таких как Spark.
3. Требования компании к уровню образования потенциальных сотрудников:
- для Junior – как минимум образование в области Computer Science или смежных областях;
- для SemiSenior/Senior – степень бакалавра в области Computer Science или смежным областям.
4. Для Junior – 2 года работы с экосистемой Java, с опытом работы с Scala или желанием изучить Scala.
Для SemiSenior – 4 года работы с экосистемой Java, с опытом работы с Scala или желанием изучить Scala.
Для Senior – 6 лет, владение как минимум тремя различными языками программирования, включая Scala.
5. Нет специфики, по сути, требования доступны для всех разработчиков Java, которые готовы обучаться и работать со Scala.
Подготовил Игорь Штомпель