К основному контенту

Mikado - работаем с legacy code

    Обычно изменение, даже самое простое, сделанное в legacy коде, сопровождается массой неприятных вещей: ошибками компилятора, "покрасневшими" приемочными тестами (СЛАВА ВАМ, если они у вас есть!) и тд. Вы исправляете эти места, начинают взрываться новые, и это продолжается бесконечно и кажется неконтролируемым. В какое то момент вам начинает казаться, что проще все сделать заново, чем исправлять существующее. Да-да, обычно так и происходит, чтобы вы не говорили :)

Недавно наткнулся на интересный метод, который предлагает простое решение этой проблемы. Метод называется Mikado. (Обожаю я японские слова, но тут японцы не поучаствовали. Ну, разве что слово у них взяли: термин попал из игры с палочками)



В чем заключается этот способ?

Давайте сначала пару слов о том, что такое  legacy код? Одно из определений гласит, что это код, который написали не вы, но вы сейчас за него ответственны. Michael Feathers в своей книге "Working effectively with legacy code" определяет код как legacy, если он написан без тестов. Собственно это определение сейчас и является основным.

Mikado работает как с кодом, который "по-настоящему" legacy = на него нет тестов (упустим за рамки данного обсуждения сам факт недопустимости такой ситуации), так и с кодом, на который тесты есть. Зачастую, даже если тесты есть, их качество или качество кода не позволяют добавлять новый функционал безболезненно. Тогда Mikado (Микадо) для вас.

Итак, у вас есть цель: добавить новый функционал, и код который писали не вы, или писали в состоянии аффекта :)

Начинаем с того, что пытаемся сделать то, что нам нужно. Если при этом текущий код не меняется, все компилируется и тесты проходят - поздравляем, вам больше не нужен Микадо (для данного изменения ;)

А вот если что-то взорвалось: не компилируется или тесты не прошли, начинаем использовать Микадо.
Берем ручку и листок бумаги/маркер и доску и рисуем кружок - нашу цель. Она и будет нашей Микадо (так называется самая крутая палочка, которую надо вытащить в игре). Дальше рисуем кружки с возникшими проблемами.  Получаем  Микадо-граф. Дальше делаем невероятное - откатываем изменения и возвращаем работоспособность кода. Ужасно правда? :) Вы ведь так старались, что то делали, а тут все взять и откатить. "Вдребезги?! — Конечно, вдребезги. — Да я тебя!!!" (с) "Операция Ы и...". Но в этом то и соль: вы постоянно поддерживаете работоспособность кода и маленькими шажками двигаетесь к цели. После отката пытаемся решить одну из проблем, которую мы обнаружили на предыдущем шаге. Не получилось? Опять проблемы? Снова рисуем кружочки с вновь обнаруженными проблемами,  и снова откатываем! Переключаемся на решение одной из свежих проблем и тд, до тех пор пока не будет изменения, которое не поломает код или тесты. После этого начинаем спускаться вниз по графу, постепенно решая все найденные проблемы. В итоге вы сможете сделать то изменение, которое вам требуется для достижения вашей цели.

Для примера полученного в итоге дерева, приведу картинку из книжки про Микадо (решалось все сверху-вниз)



Ключ к изменению любой системы - это изменить все ограничения, которые не дают сделать желаемое.

Алгоритм получается такой:

Обратите внимание на то, что для решения проблемы предлагается использовать самый простой ("деревянный") способ. Не надо пытаться тратить время на предварительный анализ. (Забавно, я обычно предпочитаю немного подумать) Считается, что все грабли будут собраны последовательно, и также последовательно решены. Главное чтобы, не получилось как на знаменитой картинке Макса Дорофеева:

Сами авторы метода (Daniel Brolund, Ola Ellnestam) не претендуют на уникальность подхода. По своей сути, это переработанные идеи из книг Мартина Фаулера, Майла Фезерcа, Роберта С Мартин-а. Кроме того, в книге они указывают на то, что Mikado не является лучшим способом достижения цели. Просто он самый простой и рабочий. С помощью него, вы достигнете своей цели идя одним из множества возможных вариантов. Запомните: "лучшее - враг хорошего".

Я сознательно не давал ссылок на сам источник информации о методе Микадо выше :)
А между тем, я очень рекомендую про его почитать. В книжке (версия на IT-eBooks), кроме описания самого метода (на простом примере), вы найдете много полезной информации: способы рефакторинга, design principals и их сочетание с Mikado. По-моему, это неплохая выжимка всех практик от классиков упомянутых выше, из их знаменитых книг. И это всего в 250 страниц!

Кстати, в книжке рекомендуется сочетать Mikado c техникой Pomidoro. Последнюю я сейчас практикую - реально помогает.

Комментарии

  1. Уж больно академично как то. :)  Помоему все эти тактики для слабаков. ;) Настоящие самураи создают бренч и начинают махать шашкой, а потом смотрят дифф и гонят тесты. :)

    ОтветитьУдалить
  2. знаем мы таких самураев. все разломают, а потом 2 недели даже старые тесты не заводятся, не говоря уже о чем то новом.

    ОтветитьУдалить
  3. Ключевые слова  брэнч и самурай ! :) 

    ОтветитьУдалить

Отправка комментария

Популярные сообщения из этого блога

Mock vs Stub

Когда мы начали изучать модульное тестирование, то одними из первых терминов, с которыми пришлось познакомиться, стали Mock и Stub.

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

Проверять работоспособность тестируемого объекта (system uder test - SUT) можно двумя способами: оценивая состояние объекта или его поведение.

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

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

Собственно, если коротко, то в одном случае используется Stub, а в другом Mock. Это объекты, которые создаются и используются взамен реальных объектов, с которым взаимодействует SUT в процессе своей работы.

Теперь подробнее.

Gerard Meszaros использует термин Test Double (дублер), как обозначение для объекта, который зам…

План "Б" или как прикольно провести субботний день

Всем привет.
Вчера состоялась конференция "План Б". Организаторами выступили ребята из Яндекса, за что им большое спасибо. Судя по приблизительным подсчетам в мероприятии участвовало около 200 человек.

Основной темой конференции было планирование, планирование всего: проектов, разработки, тестирования, дизайнеров и даже организации музыкального фестиваля.
Сначала думал написать отчет в обычном своем стиле: кто и что говорил, но почитав твиттер по #pbconf понял, что просто потеряю время :) Поэтому кому оооочень интересно узнать подробности следуйте за птичкой и вы все узнаете (тэг #pbconf попал в top-30 твиттера)
Здесь приведу лишь те вещи, которые мне запали в мозг
Роман Чернин о продуктовой разработке: "нет заказчика, нет требований, нет сроков -> как принимать решения? ответ: заводим себе Product Manager-а"
Оля Павлова (@op): "бойтесь иллюзии точной формулировки" "заказчик - ребенок, выдаем ему игрушку как можно чаще" "не забываем, …

Переключите тумблер или умные люди дурного не посоветуют

Навеяно интересными вопросами про TDD после вчерашнего выступления.

Uncle Bob: "Flipping the Bit"

Подробнее постараюсь перевести чуть позже, пока только это:
Как определить, что у коллеги (или у вас) ТУМБЛЕР переключен?  Если ваши ответы на вопросы ниже совпадают с приведенными - то все хорошо :)
Мантра:

Сможете ли вы выполнить работу быстрее используя TDD? ДАСуществуют ли какие-либо задачи, которые вы можете выполнить быстрее без TDD? НЕТЯ понимаю, что TDD может помочь в долгом проекте, а что если у вас короткая задача? Будете использовать TDD? Да, потому что TDD быстрее даже в короткой перспективеЧто если времени реально не хватает, и босс стоит над душой, будете ли вы использовать TDD? ДАВ любом случае? ДАЕсть ли случаи, когда вам не нужно использовать TDD? НЕТПредставьте себе что вы на звездном корабле Enterprise (Star track) и осталась всего секунда до взрыва антиматерии. Все что вам нужно, чтобы избежать этого, поменять один IF. Будете ли вы использовать TDD? ДАПочему? П…