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

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. Ключевые слова  брэнч и самурай ! :) 

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

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

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

Полезные ресурсы для молодых (и не только) тестировщиков

сперто(с) Уже 3 месяца провожу собеседования тестировщиков (март 2016). Поначалу они просто  веселили - после 15-летнего опыта собеседования С++-разработчиков, общение с тестировщиками (чаще были "-цы") было чем-то экзотическим и забавным. Потом становилось все грустнее и грустнее, мимими закончилось. Началась печаль.

Заметки на коленке - 3. Что еще делать, если ваши тесты уже "зеленые"?

"Lately I find I'm working on automated tests that return non-binary results. Tests that neither pass nor fail" by  @noahsussman Отличная мысль, которую я ретвитил еще в 2016. Но давайте вместе подумаем, что за этим может скрываться? ( кстати, не знаю, что при этом думал Noah ) Ваши тесты прошли и прошли "успешно". Все хорошо или все же есть, куда еще посмотреть? Дальше то, что использовал я лично и то, что еще можно прикрутить дополнительно. Естественно все шаги ниже должны быть автоматизированны. 1. Контролируйте время выполнения тестов. Если набор проверок не меняется (а такое часто бывает, к сожалению), то рост времени выполнения может говорить о проблемах в продакшен коде (чаще всего) или проблемах с окружением. 2. Контроль за количеством выполняемых тестов. "Все зеленое" не значит, что сегодня выполняли те же Х тестов, что и вчера. Смешно(нет), но случается такое, что какие-то проверки "исчезают" из запуска из-за того, что у кого-то &qu

Mock vs Stub

Когда мы начали изучать модульное тестирование, то одними из первых терминов, с которыми пришлось познакомиться, стали Mock и Stub. Ниже попробуем порассуждать в чем их сходство и различие, как и для чего они применяются. Проверять работоспособность тестируемого объекта (system under test - SUT) можно двумя способами: оценивая состояние объекта или его поведение. В первом случае проверка правильности работы метода SUT заключается в оценке состояния самого SUT, а также взаимодействующих объектов, после вызова этого метода. Во-втором, мы проверяем набор и порядок действий (вызовов методов взаимодействующих объектов, других методов SUT), которое должен совершить метод SUT. Собственно, если коротко, то в одном случае используется Stub, а в другом Mock. Это объекты, которые создаются и используются взамен реальных объектов, с которым взаимодействует SUT в процессе своей работы. Теперь подробнее. Gerard Meszaros использует термин Test Double (дублер), как обозначение для объе