Даже в коммерческой разработке есть проекты, которые предлагают нетривиальные задачи и требуют от своих сотрудников нестандартных навыков и мышления. Разработкой одного из таких проектов занимается одна из самых успешных датских компаний совместно с Intetics Inc.
Кроме разнообразных и необычных задач, стоящих перед командой, проект отличает главная технология разработки — функциональный язык, специально разработанный заказчиком. Что это — дань главному тренду девелопмента последних лет или уникальный способ решения задач проекта?
Разобраться, чем проект интересен различным по опыту специалистам, зачем был создан функциональный язык, в чем его перспективы – помогут Егор, Ярослав, Павел и Вита – ребята, пришедшие на проект с различным опытом, пройдя путь до Senior разработчиков (некоторые еще в пути).
Знакомьтесь:
Ярослав, 25 лет, Senior Software Engineer. Окончил КПИ. Работает 3 года, ранее писал на JavaScript.
Павел, 34 года, Senior Software Engineer. Окончил ХАИ. На проекте 3 года. Раньше был программистом и администратором 1С.
Вита, 21 год, Junior Software Engineer. Учится в ХНУРЭ. 7 месяцев на проекте, немного писала на .NET.
Егор, 29 лет, Senior Software Engineer. Окончил ДОННТУ. Работает на проекте 2 года, ранее писал на Java, Maximo.
— Итак, что за проект и какими задачами занимаются разработчики?
Цель проекта — создание собственных продуктов, которые объединяет научный подход и инновационность (программы для адаптивного обучения, для автоматизации кодирования в медицине, разработка комплексной платформы для программирования и многие другие). С другой стороны, значительная часть команды занята на подпроектах, связанных с работой над ядром языка, созданием библиотек и фреймворков для него, компиляторов для различных платформ, и даже с разработкой собственной IDE.
Егор: Я занимаюсь ядром языка, разработкой фреймворка, реализующего концепцию WYSIWYG. Но для каждого сотрудника есть специализированные задачи, с учетом его предыдущего опыта и навыков. Также возможны перемещения из одной команды в другую, чтобы человек не уставал от одного типа задач.
Павел: Я работаю над частью системы дистанционного обучения, представляющую собой мультиплатформенную (IOS, Android, JS, C++, SWF) среду, предназначенную для сопровождения процесса обучения.
Продукт, над которым я работаю, состоит из нескольких модулей:
- модуль, в котором студенты выполняют тестовые задания;
- модуль, в котором преподаватели создают эти тестовые задания.
Текстовый и графический редакторы используются во втором модуле для создания тестовых заданий.
Ярослав: Я занимаюсь разработкой приложений для корпоративных клиентов в сфере адаптивного обучения. Основные задачи сконцентрированы на создании UI и построении необходимых клиенту специфичных для него инструментов. Обычно я выступаю в роли тимлида на этих проектах.
— Основная «изюминка» проекта — это язык. Работа ведётся на кроссплатформенном языке программирования, специально разработанном заказчиком из Дании, и который сочетает в себе особенности функциональных и императивных языков. На что же он похож и сложен ли в освоении?
Ярослав: В принципе, похож на Haskell, но не такой «страшный». Это не чистый функциональный язык, здесь нет монад, в целом все проще: event-подобная модель, реактивное программирование, observer.
Павел: С точки зрения функционала - заимствования из Haskell, ML. Этот язык строго типизирован, это от Java. Не поддерживает ООП (классы, интерфейсы), поэтому чем-то похож на Python.
Перейти на новый язык не составит труда любому человеку, который знает методы построения алгоритмов, а они от языка программирования не зависят.
— Обосновано ли создание нового языка для целей проекта?
Павел: На момент создания языка других мультиплатформенных решений было совсем немного, а те, которые существовали, не подходили по разным критериям (технология, стоимость поддержки). Свой язык гораздо легче поддерживать, обновлять и подстраивать под свои нужды в условиях быстро меняющейся реальности.
Ярослав: Здесь есть свои плюсы и свои минусы. Достоинства в том, что синтаксис очень прост, а небольшое количество языковых конструкций и принципов гарантирует быстрый старт для новых разработчиков и, если код-стайл был учтен, легкое понимание старого кода. Да, делать интерфейсы с языком, заточенным под это - легко. Но только при условии хорошей оптимизации основ самого языка. Главный минус такого подхода в том, что язык "законсервирован" внутри проекта и ему не хватает внешнего коммьюнити для развития.
Егор: Мне сложно оценить целесообразность, для этого нужно было бы попробовать реализовать тот же функционал/приложение/фреймворк на каком-то другом языке и потом сравнить. В общем, проектов сейчас очень много, и они очень разнообразные. Нравится то, что достаточно гибкий, так как, если не хватает какого-то функционала «из коробки», всегда можно это реализовать.
— Сложно ли научиться новому языку с нуля? Особенно, если до этого был опыт лишь в ООП?
Ярослав: У каждого новичка на проекте есть опытный ментор, который в первую очередь помогает настроить среду разработки. Затем каждый новичок получает пакет задач нарастающей сложности, решение которых и есть обучение языку. Ограничений по времени нет, занимает этот этап от 2 недель до месяца. А сам по себе туториал по языку небольшой, страниц на 20.
Егор: Для помощи также есть общие чаты, в которых можно задавать любые вопросы.
Ограничение по времени на выполнение тренинг-тасков практически отсутствует, а значит, снимается фактор стресса для новичка. После успешного прохождения курса сотрудник включается в реальные задачи, которые «находят» своего исполнителя, основываясь на его навыках и желании.
Самое главное для будущих сотрудников — это огромное желание решать нетривиальные задачи и мыслить «функционально». Функциональное программирование – достаточно специфическое направление, основанное больше на математических понятиях. Таких, как лямбда-исчисление, рекурсия, функции высших порядков, и в принципе непохожее на привычное ООП.
Павел: Я бы посоветовал почитать, что такое функциональные языки, посмотреть примеры кода, понять, что такое функциональное программирование. Будет плюсом знакомство с книгами Дональда Кнута.
Вита: Что точно понадобится, так это стремление пробовать новое. Нужно подготовиться к небольшому «хаосу» — свободе в задачах и действиях. Также надо будет активно общаться с командой.
— Какая задача была самая сложная из тех, с которыми ты сталкивался на проекте?
Павел: Самая сложная задача — это, пожалуй, разработка графического и визуального редакторов с нуля, так как это требовало создания каркаса приложения на раннем этапе, когда ещё не ясны все требования к нему. Именно это "создание продукта в условиях неопределенности, когда нет четких требования и функционального описания" и является для меня интересным.
Вита: Самой сложной, наверное, была задача, где мне пришлось добавить поддержку django в приложение, написанное на языке заказчика. Я до этого вообще особо с Python не работала, а тут пришлось долго разбираться в чём-то новом.
Ярослав: Для меня самым интересным был опыт работы тимлидом на одном из подпроектов. Это было соединение двух интересных для меня областей - коммуникационной и архитектурной. Тогда я попробовал на практике несколько нововведений - архитектурные диаграммы и код-ревью.
— Какие подходы и методологии разработки применяются на проекте?
Павел: Та часть проекта, на которой работаю я, исповедует строгий Scrum-подход с ежедневными митингами, релизами и строгой отчетностью. Это оправдано, так как данная часть проекта уже давно находится в продакшене и здесь очень важна стабильность системы.
Вторая часть проекта использует другой подход, более похожий на то, что называется "экстремальное программирование", в нем больше гибкости и скорости. Это обосновано тем, что в этой части проекта разрабатывают с нуля новые продукты, и здесь на первое место выходит скорость и гибкость разработки в условиях постоянно меняющихся или нечетких требований.
Вита: Номинально у нас экстремальное программирование, но из приёмов XP используются не все. Используется непрерывная интеграция - все приложения собираются на сервере, и если где-то билд упал, то сразу приходит оповещение, можно быстро исправить. Ещё общее владение кодом используется, т.е. вообще любой кусок кода в репозитории кто угодно может править.
Ярослав: Четкого и определенного подхода как такового нет. У разработчика много свобод для реализации того процесса, которого захочет именно он. Конечно, нужно будет хорошенько заинтересовать команду, чтобы все перешли на него.
На нашем проекте мы проводим регулярные ревью кода, контролируем код-стайл и архитектурный подход (схожий с Model View Update в Elm). Чтобы гарантировать светлое будущее для больших проектов.
Главное, здесь все нужно будет делать в рамках парадигмы функционального программирования. Поэтому о классах и mutable состояниях нужно будет забыть и научиться думать по-новому — более математично, чистыми функциями.
Сам проект существует уже более 7 лет, и почти 4 года в нём задействован Intetics. За это время сформировалась большая команда, которая состоит из очень разных людей.
Павел: В харьковском офисе работают очень необычные люди с разным опытом работы. Есть коллега, который 8 лет программировал на одном языке, а тут решил заняться чем-то новым.
Ярослав: Атмосфера в Intetics дружеская, коллеги в команде коммуникабельны. И это мне очень нравится. Я увлекаюсь математикой, физикой, компьютерными науками.
Егор: Помимо Intetics, в проекте участвуют ещё разработчики из Дании, США и России. Работают люди разного возраста, разных увлечений, например, есть мастер спорта по стрельбе из лука. Есть призёры международных олимпиад по программированию.
Коллег объединяет убеждённость в перспективности выбранного пути, как они сами об этом говорят.
Павел: Этот проект не имеет фиксированного срока, мы постоянно что-то улучшаем, модернизируем, переходим на более производительные технологии, базы данных. Новичок (выпускник ВУЗа) здесь получит базис, узнает процесс написания кода, познакомится с системой контроля версий.
Ярослав: Это перспективно в первую очередь для тех, у кого нет опыта. Здесь задаётся вектор, но точно нужно заниматься саморазвитием. Это путь в функциональное программирование вообще — в те же Scala, Erlang.
Для новичков, которые хотят попробовать свои силы и попасть в проект, уже доступно тестовое задание. Для этого стоит прислать свой запрос на почту job@intetics.com. В компании отмечают, что оцениваться будет не только конечный результат, но и способ решения, и количество итераций для нахождения правильного решения.
Комментарии
Страницы
С точки зрения аутсорсера проект крутой, а вот заказчик, имхо, изобретает велосипед. Но, как говорится, любой каприз за ваши деньги.
Детское имхо. Затратил время на стук по клаве.
995*583=580085
bool IsPal(int n)
{
int t=n, rev=0;
while(t!=0)
{
rev *= 10;
rev += t%10;
t /= 10;
}
return n==rev;
}
int FindPal(void)
{
int a,b;
for(a=999; a>99; a--)
{
for(b=999; b>99; b--)
{
if( IsPal(a*b) )
return a*b;
}
}
return 0;
}
А вы пробовали? :)
В каком плане?
Палиндромное число читается одинаково в обоих направлениях. Самый большой палиндром, из произведения двух двузначных чисел, - это 9009 = 91 * 99
Найдите наибольший палиндром, из произведения двух трехзначных чисел
Пока число больше 99, множим на него по очереди весь диапазон чисел и проверяем возвращенный результат, пока не нарвемся на палиндром... А за NlogN, Михаил?:-) А по Манакеру?:-)
Ага. Напиши софтинку сперва. Чтобы работала и результат давала. И выложи.
Мда, делать UI виджеты и IDE! для неведомого ЯП (hint:Kotlin).
И это при живых-то Caml/F#/Lisp/Schema c готовыми байндингами и практически полностью меняемым синтаксисом. Сделайте себе DSL и пилите свою физику/математику/химию.
Даа, вот кто-то деньги тратит.
Мы неграмотные, Кнута не читали, токо Вирта :)
Но я бы сначала уравнения написал, чтобы инвариантами поле поиска сократить. Должно сильно уменьшить перебор.
Перебор уменьшит, но сократит ли время выполнения. Уравнения-то решать надо.
Совершенно верно. Все равно перебирать. Если только предварительно, с помощью какой-то функции, более-менее приблизительно определить местонахождение палиндрома, тогда да, - количество итераций сократится, ИМХО...
Выложу сегодня, если до компа дойду не поздно. Алгоритмы - это прикольно...
Страницы