Kata для мозга или определяем день релиза правильно

Помнишь, я уже рассказывал про своего коллегу, который иногда подкидывает интересные задачки? Так вот он не унимается и в прошлую пятницу в общем чате появилась следующая задачка: зная кол-во рабочих дней, которое необходимо потратить на задачу, необходимо вычислить дату ее релиза. Но смысл в том, что по выходным работать нельзя. Еще условимся, что релиз должен быть на следующий будний день, после последнего рабочего дня. Т.е. если на задачу нужно потратить один день и она была начата в понедельник, то релиз будет во вторник. Если на задачу нужно два дня и она начата в пятницу, то релиз так же будет во вторник. Казалось бы простая задачка, так что не будем тратить время и начнем.

Для начала напишем тесты (ты ведь пишешь тесты?)

Тесты очень просты и дотошны. Берем дату релиза с понедельника по воскресенье и начиная с этого дня высчитываем дату релиза учитывая, что на работу необходимо потратить от 1-го до 16-ти дней. Число 16 выбрано потому, что оно покрывает варианты, когда на работу нужно потратить больше двух недель. Т.е. проверим  правильно ли наш алгоритм работает, когда релиз попадает на выходные или на следующую неделю.

Пол дела сделано! Осталось только написать сам алгоритм.

Простой алгоритм с перебором и парой if-ов. Результат: тесты пройдены успешно; времени затрачено минимум. Задача решена? Определенно да, но она не была бы такой интересной если бы не дополнительное условие: результат необходимо вычислить без использования циклов!

Ок! Вызов принят! Опять начнем с тестов (ты ведь их пишешь, не так ли?)

Тесты по сути те же. Но, в качестве expected значения я беру дату вычисленную при помощи уже нашего протестированного метода ReleaseDate.calculateByStandard.
Что ж, решение данной задачи без использования циклов оказалось нетривиальной задачей (по крайней мере для меня). Пришлось поднапрячь свое серое вещество и после перебора нескольких возможных вариантов решения (которые зачастую проходили все тесты кроме какого либо одного), я пришел к следующему

P. S. Я не знаю, как ты относишься к подобного рода задачам. Я имею ввиду к тем, которые не имеют под собой практического применения (хотя рассмотренная в этой заметке таки имеет). В качестве таких задач я подразумеваю задачи олимпиадного типа. Многие уверены, что от них нет толку, т.к. в работе такие знания врядли пригодятся, да и на собеседованиях обычно спрашивают по core, фреймворкам и различным технологиям. Но как по мне, решение таких задач (и нахождение оптимального пути их решения) выполняют как минимум одну важдую функцию - это тренирует наше серое вещество. Роберт Мартин в своей книге "Идеальный программист" проводит аналогию решения подобных задач с ката, которые регулярно выполняют мастера бовых исскусств.

Comments

  1. Интересно, у нас с датой релиза проще. Релиз по факту каждую неделю, т.к. проект внутренний и надо постоянно что-то обновлять. Для своего отдела я взял за правило - делать релиз в первые 3 рабочих днях. За редким исключением можем позволить накатить патч в четверг. В пятницу не обновляемся никогда, т.к ошибка может стоит веселых выходных :-)

    ReplyDelete
  2. У нас релизы раз в месяц и, кстати, в пятницу именно потому, что в субботу нагрузка на сервиса меньше. Т.е. в случае какого либо факапа зацепит меньше людей.

    ReplyDelete

Post a Comment

Popular posts from this blog

Java 8 vs GoF: Command

JEEConf 2017 How it was

Java 8 vs GoF: Strategy