Dealing with Legacy Code
3
2
1
не Автор
Владимир Гарбар
.NET Developer, Leader
@ HYS Enterprise
15+ years experience
6
Содержание
Существует ли
Legacy Code?
1
2
3
Симптомы
Последствия
Содержание
Решение №1:
Костыль?
7
4
5
6
Решение №2:
Переписать
Решение №4:
Микадо
Содержание
8
Решение №5:
Душитель
7
8
9
Качество
как Причина
Скорость
как Причина
Удача
как Причина
Расплата
Надежда
Содержание
9
10
11
12
1. ЕСТЬ ЛИ LEGACY CODE?
1.ЕСТЬЛИLEGACYCODE?
1. ЕСТЬ ЛИ LEGACY CODE?
1.ЕСТЬЛИLEGACYCODE?
Коллеги говорят
● Лучше “проект с нуля”
● Не люблю сидеть на
поддержке
● Перенести на новый
фреймворк
● Проект отдали нам после
неудачи с предыдущим
исполнителем
1. ЕСТЬ ЛИ LEGACY CODE?
1.ЕСТЬЛИLEGACYCODE?
Коллеги говорят
● Лучше “проект с нуля”
● Не люблю сидеть на
поддержке
● Перенести на новый
фреймворк
● Проект отдали нам после
неудачи с предыдущим
исполнителем
Чем грозит?
● Отсутствие роста
● Старые технологии
● Поддержка
● Постоянные
исправления багов
“
Мнениеспециалистов
Legacy code is simply
code without tests.”
— Michael Feathers
“
Мнениеспециалистов
An old running system
critical for the business,
hard and expensive to
maintain, improve and
expand.”
— Uberto Barbini
“
Мнениеспециалистов
Valuable code we’re
afraid to change.”
— J.B. Rainsberger
“
Мнениеспециалистов
Code that’s too scary
to update and too
profitable to delete.”
— Dylan
Beattie
● Legacy code is simply
code without tests ● Код без тестов
● Legacy code is simply
code without tests
● An old running system
critical for the
business, hard and
expensive to maintain,
improve and expand
● Код без тестов
● Критически важный для
бизнеса
● Сложный
● Дорогой в поддержке и
развитии
● Legacy code is simply
code without tests
● An old running system
critical for the
business, hard and
expensive to maintain,
improve and expand
● Valuable code we’re
afraid to change
● Код без тестов
● Критически важный для
бизнеса
● Сложный
● Дорогой в поддержке и
развитии
● Ценный
● Страшный
● Legacy code is simply
code without tests
● An old running system
critical for the
business, hard and
expensive to maintain,
improve and expand
● Valuable code we’re
afraid to change
● Code that’s too scary
to update and too
profitable to delete
● Код без тестов
● Критически важный для
бизнеса
● Сложный
● Дорогой в поддержке и
развитии
● Ценный
● Страшный
● Слишком прибыльный, чтобы
выбросить
2. СИМПТОМЫ
Перегруженность
2.Симптомы
Добавление новой
функциональности может
привести к трагическим
последствиям
Постоянный
багфиксинг
2.Симптомы
Количество задач по
багфиксам значительно
превосходит задачи
разработки новой
функциональности
Состояние
срочности
2.Симптомы
Высокая стоимость
изменений
2.Симптомы
Изменения
невозможны
2.Симптомы
2. СИМПТОМЫ LEGACY CODE
2.Симптомы
● Перегруженность
● Постоянные исправления багов
● Состояние срочности
● Небольшое изменение требует
много времени
● Незначительное изменение
невозможно
3. ПОСЛЕДСТВИЯ
3.Последствия
3. ПОСЛЕДСТВИЯ LEGACY CODE
Начало: Быстрая разработка
3.Последствия
3. ПОСЛЕДСТВИЯ LEGACY CODE
Начало: Быстрая разработка
3.Последствия
Болезненная разработка
3. ПОСЛЕДСТВИЯ LEGACY CODE
Начало: Быстрая разработка
3.Последствия
Болезненная разработка
Горят Сроки
3. ПОСЛЕДСТВИЯ LEGACY CODE
Начало: Быстрая разработка
3.Последствия
Болезненная разработка
Горят Сроки
Потеря денег
3. ПОСЛЕДСТВИЯ LEGACY CODE
РЕШЕНИЯ
Решение №1:
Костыль?
Решение №1:
Костыль?
Изолента!
Решение №1:
Костыль?
Startup
“Speed to market”
“Надо на вчера”
Закон битых стекол
Решение №2:
Переписать с нуля
Зная текущие проблемы,
их можно избежать в версии
написанной с чистого листа
A PICTURE ALWAYS
REINFORCES THE CONCEPT
Ожидание
Реальность
Сложность выше, чем
предполагали.
Выяснение требований из кода.
Заказчик хочет новый
функционал.
Решение N4:
Метод Микадо
Решение N3:
Рефакторинг
Решение N4:
Метод Микадо
День Сурка
● Изменить.
● Проверить.
● Откатить.
● Повторить.
Спорим, сдадитесь? :)
Решение №5:
Душитель
PRESENTATIONTITLE/YOURNAME
Strangler pattern
Progressive rewrite
Новое решение строится
поверх старого приложения
Внедрить. Заместить. Уничтожить.
Strangler application vs Cut-over rewrite (Martin Fowler)
Снижает риски
Требует больше времени
Безопасно - не значит быстро
8. КАЧЕСТВО
8. КАЧЕСТВО КАК ПРИЧИНА
PRESENTATIONTITLE/YOURNAME
8. КАЧЕСТВО КАК ПРИЧИНА
8.Качество
Что такое качество?
8. КАЧЕСТВО КАК ПРИЧИНА
8.Качество
Что такое качество?
● Design Patterns
● Clean code
● TDD, DDD, BDD
● Functional programming
8. КАЧЕСТВО КАК ПРИЧИНА
8.Качество
Что такое качество?
● Design Patterns
● Clean code
● TDD, DDD, BDD
● Functional programming
Другое мнение?
8. КАЧЕСТВО КАК ПРИЧИНА
8.Качество
Что такое качество?
● Design Patterns
● Clean code
● TDD, DDD, BDD
● Functional programming
● When you look at routine and
it is pretty much what you’ve
expected.
● Time to implement new
feature or fix a bug
Другое мнение?
VS
8. КАЧЕСТВО КАК ПРИЧИНА
8.Качество
● Откладывание на потом. “Завтра переделаю”
● Technical debt настолько высок, что никогда не
будет “выплачен”
● Малопонятный код. “Дизайн под себя”.
9. СКОРОСТЬ
9. СКОРОСТЬ КАК ПРИЧИНА
9.Скорость
Заказчик: Сколько времени сделать Web API?
Разработчик: 1 день
Заказчик: Отлично!
Тестировщик: И 2 дня на тестирование.
Заказчик: Ну, хорошо.
Разработчик: И надо будет отрефакторить код. 5 дней.
Заказчик: WTF?
9. СКОРОСТЬ КАК ПРИЧИНА
9.Скорость
● Быстрая разработка
● Плохое понимание бизнес идеи
10. УДАЧА
10. УДАЧА КАК ПРИЧИНА
10.Удача
● Вера в свой код
● Отсутствие тестов
● Рефакторинг на удачу
● Документация - потом
● Люди знают
Закон Мерфи
● Правим код по 20 раз
● Занимаемся дебагом
● Рефакторинг изменяет
функциональность и
приносит сюрпризы
● Документации нет
● Ключевые люди ушли
11. РАСПЛАТА
12. НАДЕЖДА
12.Надежда
Жизненный цикл разработки
Поддержка
Время жизни продукта
Уход на пенсию
Миграция данных
12. НАДЕЖДА
12.Надежда
Legacy code под контролем
Песочница
Швы
Тестирование
Документация
12.Надежда
Легаси проект доказывает
свою ценность уже одним
своим существованием.
Если плохо реализованная
идея приносит прибыль,
то хорошо работающая - тем
более.
ИСТОЧНИКИ
ИСТОЧНИКИ
Источники
Michael Feathers - Working effectively with Legacy code
Robert Martin - Clean Architecture
Martin Fowler - Refactoring
Источники
Источники
ИСТОЧНИКИ
Источники
● Dylan Beattie. Ctrl-Alt-Del: Learning to Love Legacy Code. .NET Fest
2018
https://www.youtube.com/watch?v=cagKbOTXRuA
● Legacy Code: Big Rewrite or Progressive Rejuvenation? - Uberto
Barbini | #LeadDevLondon 2018
https://www.youtube.com/watch?v=-lB74Zg3QSw
● Surviving Legacy Code with JB Rainsberger
https://www.youtube.com/watch?v=d9ktOSUH63w
ИСТОЧНИКИ
● The Strangler pattern in practice
https://www.michielrook.nl/2016/11/strangler-pattern-practice/
● Lessons from 6 software rewrite stories
https://medium.com/@herbcaudill/lessons-from-6-software-rewrite-
stories-635e4c8f7c22
● StranglerFigApplication
https://martinfowler.com/bliki/StranglerFigApplication.html
● Testing and Refactoring Legacy Code
https://www.youtube.com/watch?v=_NnElPO5BU0
Источники
Спасибо!
Вопросы?
vladimir.garbar@hys-enterprise.com
vgarbar@gmail.com

"Dealing with legacy code"