Проект #2

Вычислитель отличий

Фронтенд-разработчик

Узнаете, как создавать cli приложения, парсить и форматировать данные в json, yaml. Научитесь проектировать архитектуру приложений. А также писать unit-тесты.

2-4
недели

Цель

Вычислитель отличий – проект, который по-настоящему прокачивает даже опытных разработчиков. Здесь вам придется столкнуться с принятием сложных архитектурных решений, автоматизированным тестированием и непрерывной интеграцией, функциональным программированием, работе с древовидными структурами данных и рекурсивными алгоритмами.

Структуры данных и Алгоритмы

Выбор правильных структур данных в коде – один из ключей к удачной архитектуре и простому коду. От этого зависит удобство анализа и обработки, количество и сложность условных конструкций.

Главный вопрос в проекте – как описать внутреннее представление различий между файлами так, чтобы оно было максимально удобно. И хотя для этого существует множество разных способов, лишь некоторые из них приводят к простому коду.

Работа с деревьями и древовидной рекурсией очень хорошо прокачивает алгоритмическое мышление. Это важно, так как реальная разработка сопряжена с постоянной обработкой данных, различными преобразованиями и выводом коллекций.

Архитектура

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

Помимо внутренней архитектуры, в этом проекте появляется необходимость работать с параметрами командной строки. Происходит углубление понимания работы операционных систем в целом и командных интерпретаторов в частности. Для организации этой части кода используется популярная библиотека commander.js, архитектура которой позволяет легко строить консольные утилиты.

Тестирование и Отладка

Автоматизированные тесты – неотъемлемая часть профессиональной разработки. Вычислитель отличий — идеальный проект для прокачки навыка тестирования. Он достаточно простой и удобный для написания тестов, и достаточно сложный для того, чтобы прочувствовать важность этих тестов во время рефакторинга и отладки. В отличие от практики Хекслета, здесь предстоит писать тесты самостоятельно. Причем это можно делать до кода, практикуя TDD.

Для написания тестов используется фреймворк Jest

Описание

Вычислитель отличий – программа, определяющая разницу между двумя структурами данных. Это популярная задача, для решения которой существует множество онлайн сервисов, например http://www.jsondiff.com/. Подобный механизм используется при выводе тестов или при автоматическом отслеживании изменении в конфигурационных файлах.

Возможности утилиты:

  • Поддержка разных входных форматов: yaml, json
  • Генерация отчета в виде plain text, stylish и json

Пример использования:

# формат plain
$ gendiff --format plain path/to/file.yml another/path/file.json

Property 'common.follow' was added with value: false
Property 'group1.baz' was updated. From 'bas' to 'bars'
Property 'group2' was removed

# формат stylish
$ gendiff filepath1.json filepath2.json

{
  + follow: false
    setting1: Value 1
  - setting2: 200
  - setting3: true
  + setting3: {
        key: value
    }
  + setting4: blah blah
  + setting5: {
        key5: value5
    }
}

Наставники

Аватар эксперта Вадим Сорокин
Вадим Сорокин
Frontend Developer, Universa Blockchain
Аватар эксперта Вадим Кудрявцев
Вадим Кудрявцев
Frontend Developer, OneTwoTrip
Аватар эксперта Кирилл Костиков
Кирилл Костиков
Frontend Developer, Pushwoosh
Аватар эксперта Александр Половников
Александр Половников
Software Engineer, VideoCoin

Впечатления

Да, проект дался нелегко, и занял в 2 раза больше времени чем предыдущий, но зато сколько он дал!!! Только проходя проект осознаешь, что одно дело пройти курс, а совсем другое - уметь применять полученные знания и понимать, что ты на самом деле делаешь и как это выглядит со стороны. В процессе реализации проекта магическая рекурсия перестает быть магической и становится будничным инструментом который помогает лучше понять суть деревьев. Большое спасибо Павлу Дроненко за доступные разъяснения сложных вопросов и помощь в изучении нового материала.

Хочу присоединиться к позитивным отзывам и сказать спасибо команде Хекслета за такой интересный и эффективный формат обучения, как проекты.

Второй проект помог на практике закрепить пройденные темы, понять, что тесты – это не так страшно, как кажется, увидеть прекрасное в функциях высшего порядка и рекурсии и в очередной раз попотеть, настраивая окружение)

Отдельно огромное спасибо ментору Сергею Мелодину за поддержку, стремление помочь и подробнейшее разъяснение непонятных тем. С его помощью раскрылись и некоторые пробелы в моих знаниях. Точно знаю, что теперь буду учиться более вдумчиво и стремиться досконально разбираться в сложных темах.

Только что завершил проект и захотел оставить отзыв. В сравнении с первым проектом этот дался существенно труднее, зато узнал много нового и да, обучение через рефакторинг реально работает, ребят)
Благодарен сообществу Слака, они помогли преодолеть затыки, возникавшие в ходе прохождения шагов проекта.
Огромное спасибо ментору Сергею Мелодину, очень приятно удивило его внимательное и неравнодушное отношение и бесконечное терпение в сочетании со стремлением объяснить простым языком сложные вещи, которые заходили в голову с трудом, особенно вечером после работы)
Проект реально помогает отложить в голове такие не совсем интуитивно понятные штуки, как рекурсивный обход деревьев, функции высшего порядка, ну и тесты для тех, кто раньше с ними никогда не имел дела.

Наконец завершен второй проект! Сказать что было трудно - ничего не сказать. Но я многое вынесла из этого проекта. Спасибо Хекслет за качественное обучение. Отдельная благодарность Станиславу Дзисяк. Его ответы,и в проектах, и в обсуждениях, всегда на высоте в плане информативности, и доведении до сути той или иной проблемы. Спасибо!

Ура, второй проект завершен и принят ментором! В этом заслуга моего замечательного наставника Павла Дроненко, который всегда либо поддерживал, либо подталкивал в нужном направлении в моменты отчаяния и безнадёги, а также терпел моё бесконечное нытьё, качественно разжёвывал сложный материал и оперативно давал фидбек по всем вопросам. Сам проект оставил противоречивые эмоции. Суммарно я потратил на него несколько дней чистого времени, но они растянулись на весь декабрь из-за первых шагов - очень тяжело зашли задания по кодклаймету и гитхаб actions, хотелось всё бросить и забыть как страшный сон. Я не понимал, что к чему, что вообще от меня требуется, но переосилил себя и справился. А вот основная часть была интересной и зашла на ура, получил настоящий кайф от проделанной работы. Половина пути позади! Теперь прохожу следующую часть курса и морально готовлюсь к третьему проекту :)

Сколько стоят проекты?

Проекты входят в стоимость обучения в любом формате: самостоятельном, групповом и индивидуальном. Дополнительно платить не нужно.

Зачем проходить проекты?

Проекты дают опыт разработки в реальной среде. Проходите каждый проект сразу после изучения курсов, которые стоят в учебном плане перед ним, — это отличный способ глубже разобраться в материале.

Проекты — портфолио программиста. Их код останется в вашем аккаунте на GitHub и будет преимуществом при поиске работы.

Чтобы узнать о том, что такое проекты и в чём их польза, прочитайте нашу статью «Анатомия проектов Хекслета».

Что делать, если возникли трудности во время выполнения проекта?

Задавайте вопросы в разделе «Обсуждение» на странице шага, на котором возникли трудности, или вашему наставнику. Изучите вопросы других студентов в «Обсуждениях»: там собрана большая база знаний, ей можно и нужно пользоваться. Попросите о помощи в нашем Slack-чате в канале #hexlet-projects.

Кто проверяет проекты?

Автоматизированные тесты и линтер. В групповом и индивидуальном форматах наставник дополнительно проверит то, что тестами проверить невозможно (архитектуру проекта, правильность именования, удачность решений), и проведёт код-ревью, чтобы сделать проект ещё качественнее.

У меня другой вопрос

Нажмите на виджет в правом нижнем углу экрана и поищите ответ в нашей справке. Или сразу пишите на support@hexlet.io — вам ответит живой человек из команды Хекслета.