Уникальный язык и сложные задачи: в Intetics рассказали о новом проекте

Даже в коммерческой разработке есть проекты, которые предлагают нетривиальные задачи и требуют от своих сотрудников нестандартных навыков и мышления. Разработкой одного из таких проектов занимается одна из самых успешных датских компаний совместно с 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. В компании отмечают, что оцениваться будет не только конечный результат, но и способ решения, и количество итераций для нахождения правильного решения. 

Версия для печатиВерсия для печати

Рубрики: 

  • 1
  • 2
  • 3
  • 4
  • 5
Всего голосов: 8
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Читайте также

 

Комментарии

Страницы

Аватар пользователя mike

Если до компа дойду...

Алгоритм, предложенный мною, можно ЗНАЧИТЕЛЬНО ускорить.  Нетрудно показать, что искомое произведение -- шестизначное целое. Тогда оно должно делиться на 11-- свойство палиндрома с чётным количеством цифр. Значит, один из трёхзначных сомножителей тоже должен делиться на 11. Самый большое трёхзначное число, которое делится на 11 -- это 990. С него и стартуем во вложенном цикле для b в функции FindPal. А вместо b-- будем делать b -=11. И всё ускоряется на порядок.

Возможно, в этом и была фишка задания.

Аватар пользователя Petro47

Чего-то я не то насчитал, выбивает палиндром но не тот. Кто покажет ошибку, а Майк?:-)

public class Sort {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        int n = 0;
        int a = 0;
        int b = 0;
        int t = 0;
        for (int i = 999; i > 99; i--) {
            for (int j = 999; j > 99; j--){
        t = i*j;
                int t1 = t;
                int t2 = 0;
                while (t1!=0){
                    t2 = t2*10 + t1%10;
                    t1/=10;
    }
        if(t2==t){
            
            n=t;
            a=i;
            b=j;
            break;
        }
                }
            }
             
        System.out.println(a+" "+ b+" "+n);

                }
    }
 

101 494 49894

Аватар пользователя savely

Не знаю как там в Яве, но в C break выкинет из внутреннего цикла (по j), а не из обоих. 

Аватар пользователя Petro47

Всё верно... Когда я, вообще, убрал выход из цикла, то он пробежал до конца и выдал красивенький последний палиндром для трехзначных сомножителей: 101*101 = 10201

Аватар пользователя mike

Нда. Никто, кроме Петро, не заинтересовался. Симптом, однако; раньше бы тут был верхал. "Няма таго, што раньш было"... 

Петро, я не джавист, но дам совет: пиши функциями и делай возврат по условию.

Аватар пользователя mike

Ещё больше можно ускорить, если в моём алгоритме в функции IsPal вставить превентивный возврат с false в результате быстрого выявления непалиндромистности. :) 

Аватар пользователя Petro47

public class tst {

            public static void main(String[] args) {
                // TODO Auto-generated method stub
                
                int n = 0;
                int a = 0;
                int b = 0;
                int t = 0;
                metka: 
                for (int i = 999; i > 99; i--) {
                    for (int j = 999; j > 99; j--){
                t = i*j;
                        int t1 = t;
                        int t2 = 0;
                        while (t1!=0){
                            t2 = t2*10 + t1%10;
                            t1/=10;
            }
                if(t2==t){
                    
                    n=t;
                    a=i;
                    b=j;
                    break metka;
                }
                        }
                    }
                     
                System.out.println(a+" "+ b+" "+n);

                        }            
    }

995 583 580085

Обошелся без return. Пометил точки, где внес исправления. В Java нет Go to, есть метка оператора перехода. Это не так удобно, зато считается безопасным. А, вообще, это, конечно, не Java, это весьма слабенькое задание для школьного факультатива. 

Аватар пользователя Petro47

Самое интересное, что если мы ускоряем код по методу Майка, в 50 раз, то получаем другой палиндром - старше нашего. Исправления пометил.


public class tst {

            public static void main(String[] args) {
                // TODO Auto-generated method stub
                
                int n = 0;
                int a = 0;
                int b = 0;
                int t = 0;
                metka: 
                for (int i = 990; i > 99; i--) {
                    for (int j = 999; j > 99; j-=11){
                t = i*j;
                        int t1 = t;
                        int t2 = 0;
                        while (t1!=0){
                            t2 = t2*10 + t1%10;
                            t1/=10;
            }
                if(t2==t){
                    
                    n=t;
                    a=i;
                    b=j;
                    break metka;
                }
                        }
                    }                     
                System.out.println(a+" "+ b+" "+n);

                        }
                }
 

979 614 601106

Майк предлагал ускорить код ещё немного, разместив перед циклом while проверку на то, одинаковы крайние цифры числа. Но пусть уже это сделает один из тех специалистов, которые тут много пишут и претендуют на умную работу...

Страницы