Переписать нельзя рефакторить · 2016-11-15 · Переписать...
TRANSCRIPT
![Page 1: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/1.jpg)
Переписать нельзя рефакторить!
Пыхтин Павел
Singularis Lab, Ltd.
28-29.10.2016 SECR'2016, Москва
![Page 2: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/2.jpg)
28-29.10.2016 SECR'2016, Москва 2
![Page 3: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/3.jpg)
Legacy
• Уже работает в Production
• Большое количество заплат
• Устаревшие технологии
• Неактуальная документация
• Отсутствие единого стиля
• …
28-29.10.2016 SECR'2016, Москва 3
Технический долг
![Page 4: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/4.jpg)
Выплачиваем долги
• Переписать с нуля
+ Избавляемся от всех ошибок
+ Получаем свободу в выборе архитектуры и технологий
– Долго
– Несет заметные убытки для бизнеса
– «В этот раз уж точно получится!»
28-29.10.2016 SECR'2016, Москва 4
![Page 5: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/5.jpg)
Выплачиваем долги
• Рефакторить модуль за модулем – Сложно
– Приходится считаться с унаследованной архитектурой (даже если ее нет)
– Возможно окажется еще дольше
+ Приложение продолжает развиваться
+ Стоимость распределена по времени
+ Есть возможность учесть новые требования бизнеса
28-29.10.2016 SECR'2016, Москва 5
![Page 6: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/6.jpg)
Рефакторинг галазами заказчика
• «Мы сделали плохо, заплатите нам, чтобы мы все исправили»
• «Никаких изменений вы не заметите, но внутри будет намного лучше»
• «Я вчера прочитал, что наш фреймворк уже два месяца как устарел. Надо все переписать»
28-29.10.2016 SECR'2016, Москва 6
![Page 7: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/7.jpg)
Как убедить заказчика?
• У инженера и руководителя разные ценности • Ваши действия:
– Посмотрите на проблему с точки зрения бизнеса – Оцените текущие затраты на поддержку кода – Постарайтесь оценить эффект от рефакторинга – Составьте план работ с указанием требуемого времени и
ожидаемых результатов – Объясните причины, по которым возникли проблемы
требующие рефакторинга 28-29.10.2016 SECR'2016, Москва 7
![Page 8: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/8.jpg)
Вид работ Объем работ
Ожидаемый эффект Приоритет
Замена фронтенд фреймворка
160 Уменьшение времени загрузки страницы на 20%, упрощение поддержки и доработки
Высокий
Рефакторинг модуля импорта
80 Повышение надежности, уменьшение числа возникающих ошибок и, как следствие, повышение лояльности пользователей
Низкий
… … …
28-29.10.2016 SECR'2016, Москва 8
![Page 9: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/9.jpg)
С чего начать?
• Мониторинг, логирование
• Автоматизация процессов
• Документация
28-29.10.2016 SECR'2016, Москва 9
![Page 10: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/10.jpg)
Мониторинг и логирование
• Упрощает решение имеющихся и новых проблем
• Дает представление о текущем состоянии проекта
• Обеспечивает быстрое оповещение о возникающих проблемах
• Можно использовать в качестве формального показателя при оценке выгоды от рефакторинга
28-29.10.2016 SECR'2016, Москва 10
![Page 11: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/11.jpg)
Автоматизация процессов
• Сокращает издержки • Позволяет формализовать процессы • Позволяет выявить проблемные места в системе • Что автоматизировать:
– Сборку – Развертывание – Тестирование – … – Все, что занимает время, но не требует вашего полного внимания
28-29.10.2016 SECR'2016, Москва 11
![Page 12: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/12.jpg)
Документация
• Сбор и актуализация требований
• Удаление избыточных требований
• Написание сценариев тестирования
28-29.10.2016 SECR'2016, Москва 12
![Page 13: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/13.jpg)
Приступаем
• Всегда оставляйте после себя код чище, чем он был
• Вся команда должна быть вовлечена в процесс
• Используйте инструменты
28-29.10.2016 SECR'2016, Москва 13
![Page 14: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/14.jpg)
Статический анализ
• Позволяет отслеживать динамику состояния кода
• Позволяет выявлять проблемные места и цели для последующего рефакторинга
28-29.10.2016 SECR'2016, Москва 14
![Page 15: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/15.jpg)
Тесты
• Несколько тестов лучше, чем ничего
• Тесты сами по себе являются документацией
• Тесты помогут лучше спроектировать архитектуру
28-29.10.2016 SECR'2016, Москва 15
![Page 16: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/16.jpg)
Практики
• Extract Method • Inline Method • Inline Temp • Replace Temp with Query • Introduce Explaining Variable • Split Temporary Variable • Remove Assignments to Parameters • Replace Method with Method Object • Substitute Algorithm • Move Method • Move Field • Extract Class • Inline Class • Hide Delegate • Remove Middle Man • Introduce Foreign Method • Introduce Local Extension • Self Encapsulate Field • Replace Data Value with Object • Change Value to Reference • Change Reference to Value • Replace Array with Object • Duplicate Observed Data • Change Unidirectional Association to Bidirectional • Change Bidirectional Association to Unidirectional • Replace Magic Number with Symbolic Constant
• Encapsulate Field • Encapsulate Collection • Replace Record with Data Class • Replace Type Code with Class • Replace Type Code with Subclasses • Replace Type Code with State/Strategy • Replace Subclass with Fields • Decompose Conditional • Consolidate Conditional Expression • Consolidate Duplicate Conditional Fragments • Remove Control Flag • Replace Nested Conditional with Guard Clauses • Replace Conditional with Polymorphism • Introduce Null Object • Introduce Assertion • Rename Method • Add Parameter • Remove Parameter • Separate Query from Modifier • Parameterize Method • Replace Parameter with Explicit Methods • Preserve Whole Object • Replace Parameter with Method • Introduce Parameter Object • Remove Setting Method • Hide Method
• Replace Constructor with Factory Method • Encapsulate Downcast • Replace Error Code with Exception • Replace Exception with Test • Pull Up Field • Pull Up Method • Pull Up Constructor Body • Push Down Method • Push Down Field • Extract Subclass • Extract Superclass • Extract Interface • Collapse Hierarchy • Form Template Method • Replace Inheritance with Delegation • Replace Delegation with Inheritance • Tease Apart Inheritance • Convert Procedural Design to Objects • Separate Domain from Presentation • Extract Hierarchy
28-29.10.2016 SECR'2016, Москва 16
![Page 17: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/17.jpg)
Практики
• Выделение интерфейсов
• Паттерн «Душитель»
• Агрегация предыдущей реализации
28-29.10.2016 SECR'2016, Москва 17
![Page 18: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/18.jpg)
Выделение интерфейсов
• Цель: – Уменьшить связность классов
• Методика: – Группировка переменных и методов в соответствии со
сценариями использования – Инкапсуляция в отдельный класс – Перемещение ответственности за создание класса в
контейнер инъекции зависимостей
28-29.10.2016 SECR'2016, Москва 18
![Page 19: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/19.jpg)
Агрегация предыдущей реализации
• Цель: – Обеспечить возможность постепенного рефакторинга имеющейся
реализации
• Методика: – Выделить интерфейс существующей реализации – Создать новую реализацию с тем же интерфейсом, агрегирующую
существующую в качестве скрытого поля – Пробросить вызовы в старую реализацию – Новые функции реализуются в новом сервисе – Старые функции рефакторятся и переносятся в новую реализацию по мере
возможности
28-29.10.2016 SECR'2016, Москва 19
![Page 20: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/20.jpg)
Паттерн «Душитель»
• Цель – Обеспечить возможность постепенного рефакторинга
имеющейся реализации
• Методика: – Создается новое приложение/сервис, которое
впоследствии заменит существующее приложение – Новые функции реализуются в новом приложении – Старые функции переносятся в новое приложение по мере
возможности
28-29.10.2016 SECR'2016, Москва 20
![Page 21: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/21.jpg)
To be continued…
28-29.10.2016 SECR'2016, Москва 21
![Page 22: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/22.jpg)
Наши инструменты
• ReSharper
• Team City
• Sonar Qube
• BackstopJS
• Eslint
• Test link
28-29.10.2016 SECR'2016, Москва 22
![Page 23: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/23.jpg)
Байки
• Рефакторинг кода после 2-х лет разработки фрилансерами – Занял примерно полтора года – Средний размер класса сократился с 1000 строк до
200 – Исправлено большое количество трудно
воспроизводимых ошибок – Функциональность системы была расширена вдвое
28-29.10.2016 SECR'2016, Москва 23
![Page 24: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/24.jpg)
Байки
• Переход с ADO.net на Nhibernate
– Занял около полугода
– Решены проблемы кэширования
– Время старта приложения уменьшилось с 20 секунд до 7 секунд
28-29.10.2016 SECR'2016, Москва 24
![Page 25: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/25.jpg)
Байки
• Переход с jQuery + DevExpress на AngularJS
– Около 15 000 строк JS кода
– Выполнен на 50%
– Трудозатраты на реализацию новой функциональности сократились вдвое
28-29.10.2016 SECR'2016, Москва 25
![Page 26: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/26.jpg)
Памятка рефакторинга
• Определить масштаб проблем
• Составить план рефакторинга (сроки, трудозатраты, ожидаемый результат)
• Настроить инструменты (логи, тесты, статический анализ…)
• Донести до команды ценность рефакторинга и качественного кода
• …
• Profit!
28-29.10.2016 SECR'2016, Москва 26
![Page 27: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/27.jpg)
28-29.10.2016 SECR'2016, Москва 27
![Page 28: Переписать нельзя рефакторить · 2016-11-15 · Переписать нельзя рефакторить! Пыхтин Павел Singularis Lab, Ltd. 28-29.10.2016](https://reader030.vdocuments.pub/reader030/viewer/2022040919/5e94bf0e8d49db484b49fbfe/html5/thumbnails/28.jpg)
SECR'2016, Москва 28
Спасибо за внимание! Павел Пыхтин
https://www.singularis-lab.com/
https://www.linkedin.com/company/singularis-lab-llc
http://habrahabr.ru/company/singularis
http://vk.com/singularis_lab
28-29.10.2016