Уникальный язык и сложные задачи: в 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

Петро, не ломай голову. Савелий не совсем прав, однако прав.  Смотри:

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 mx = 0;
int a,b,c;
        for(a=990; a>99; a-=11)
                {
                for(b=999; b>99; b--)
                        {
                        c = a*b;
                        if(IsPal(c))
                                {
                                if(c > mx)
                                        mx = c;
                                }
                        }
                }
        return mx;
        }
Вся фишка в   if(c > mx) crying

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

> Вся фишка в   if(c > mx) 

Да, верно. Не обязательно хранить ВСЕ палиндромы, достаточно хранить текущий максимум. 

Но здесь (как и для "тестового примера ГОСТ" (ГОСТ - это про шифрование), например) лучше изначально поиметь "брутфорсный" (или документально прописанный) заведомо верный результат. 

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

Спасибо, Михаил! А то чего я уже только не перепробовал! И  for (int j = 999; j > 99; j-=5 (-=7)(-=10)){

и даже for (int l = 999; l > 99; l--) {
            for (int z = 999; z > 99; z--) {
            for (int j = 999; j > 99; j--){

Такое пару раз у меня срабатывало. Но тут бы я не догадался. За сломанный диск - с меня коньяк:-)

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

Ну, Майку - мои поздравления. 

P.S. Хотя про 11 я не просек. Верю на слово. 

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

> лучше изначально поиметь "брутфорсный" (или документально прописанный) заведомо верный результат. 

И это у меня в такого рода задачках как раз от незнания "что у кошки внутри" (математики, косинуса фи и т.п.). 
Т.е. мне нужно "знать ответ", дабы писанный моими кривыми руками софт как минимум проходил "стандартные" тесты. ;)

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

savely пишет:

> лучше изначально поиметь "брутфорсный" (или документально прописанный) заведомо верный результат. 

Т.е. мне нужно "знать ответ", дабы писанный моими кривыми руками софт как минимум проходил "стандартные" тесты. ;)

6306 позиция в поиске - 906609. Лучше уж программными средствамиfrown 

Вы не особо просекали - только дирижировали издали.

6161 позиция - 219912 Таким образом, становится понятно, что большее в переменной должно подменять меньшее, т. к. меньшее, по идее, может встретиться раньше. И останавливать код после замены не нужно - пусть до упора большее ищет.

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

Итак: дорабатываем код на Java. Добавляем в эту грязную писанину независимую от циклов переменную и убираем тупой break;, на котором я тупо пытался сэкономить:

public class Sort {


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

        
        }
    }
 

913 993 906609

Немного доработаем и получим пару предыдущих вариантов:

979 664 650056
968 916 886688
924 962 888888

P.S А Савелий прав, конечно, только он - хитрован большой. Все бы ему чужими руками хапнуть, а сам бы только рулил...cheeky

 

 

 

 

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

Другой способ. Берём 999999. В цикле вычитаем 11 и проверяем на палиндромность. Это внешний цикл. Если палиндром, то запускаем внутренний цикл.

Внутренний цикл (или рекурсия): проверяем делимость палиндрома на трёхзначные числа, начиная с 990 кратные 11, уменьшая на 11.  Как только делится, возвращаем палиндром и делитель.

Должно работать, проверьте. smiley

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

Проверим, Майк, тока спать охота:-) Пусть выкладывают следующее задание:-)

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

Можно было бы здесь тиснуть статейку но, к сожалению, мы недостойны. Это должны делать люди с "релевантными" знаниями, в соответствии с необходимой редакционной политикой, как мне однажды тут объяснили. Не потяну.

Страницы