Рефакторинг, как его не бояться
Тезисы и выдержки из лекции о рефакторинге
Кому необходим рефакторинг?
Рефакторинг необходим и вам и заказчику: для вас он экономит время, для заказчика — деньги.Когда необходим рефакторинг?
Рефакторинг нужен всегда, рефакторинг должен стать перманентным состоянием вашего проекта.Что для этого нужно?
С чего начинать рефакторинг проекта?
1. Анализ существующей системы
— Я перепишу этот код за неделю!!!
— А поточнее?
— Мне понадобится не больше, чем 340 часов.
— О_о
Подобный диалог не плод моей фантазии, так что перед тем как что-то делать необходимо провести анализ кода, и сделать небольшой отчет — что в проекте сделано плохо, что хорошо, а за что стоит сломать кому-то руку или даже две. Акцентируйте внимание на критичных местах для проекта и для разработчика (два десятка пунктов, не меньше), система оценки от −5 до +5, где −5 обозначает — «за нас сделали часть работы, и сэкономили нам время», а +5 — «нам тут насыпали кучу, придется ее разгребать»:
Что мы нашли | И как оно |
---|---|
Не используется система контроля версий | +5 |
Структура БД прозрачна, и понятна без описания | -4 |
Используются нативный доступ к БД без врапера | +4 |
Фреймворк не используется | +2 |
Нет единой точки входа | +1 |
Нет разделения логики и отображения | +5 |
Много неиспользуемого кода | +2 |
Хардкод того, что должно быть в конфиге | +1 |
Комментарии в коде на испанском языке | +3 |
Нет единого стиля кодирования | +1 |
Десяток сторонних библиотек сомнительного качества и устаревших версий | +4 |
Куча правил в .htaccess | +3 |
Невалидный HTML4 | +2 |
Табличная верстка с множеством вложенных таблиц | +3 |
Около десятка подключаемых CSS | +3 |
Используются <img> как элементы дизайна | +3 |
Используется jQuery | -3 |
Используется jQuery UI | -3 |
Используются старые версию JS фреймворков | +2 |
Используется еще и prototype.js | +4 |
Итого | 38 |
В сумме у нас получается 38 баллов, это значит, что рефакторинг нам необходим как воздух:
от −100 до −10 | рефакторим проект по мере разработки нового функционала |
от −10 до 10 | стоит выделить самые критичные моменты и заняться ими отдельно, пока они не стали больной мозолью |
от 10 до 50 | необходимо составить план рефакторинга, и не затягивать с реализацией |
от 50 до 100 | вначале рефакторинг, после — функционал |
2. Оценка трудозатрат
Не распыляемся на мелочи, если стиль кодирования фиксится двумя кликами в IDE то не стоит его лишний раз упоминать, нам же нужно мясо:
Что делаем | Сколько стоит (ч/ч) | Эффект |
---|---|---|
Враппер для БД | 40 | Экономит наше время |
Проверка и установка индексов для БД | 10 | Ускоряет сайт в 10 раз |
Кеш для запросов | 40 | Ускоряет сайт в 2 раза |
Разделение логики и отображения | 40 | Ускоряет разработку |
Кеш для шаблонизатора | 20 | Ускоряет сайт в 10 раз для незалогиненых пользователей |
Данная оценка является фактически нашим планом по рефакторингу проекта, так чего же мы ждем?
3. Продажа рефакторинга
В рефакторинге заинтересованы все стороны — заказчик, исполнитель и пользователи системы, второй вопрос — за него надо платить, таким образом мы должны убедить заказчика в необходимости рефакторинга. Тут возможно два варианта:
- Заказчик — вменяем и, возможно, не далек от IT
- Заказчик — слишком близорукий и скряга
Первый вариант даже рассматривать не стоит — открываем карты, и объясняем что и для чего. Во втором случае наша табличка превращается в следующее:
Что делаем | Сколько стоит | Эффект |
---|---|---|
Magic | 150 | Ускоряет сайт в 20+ раз |
4. Оптимизация
Одним из требований предъявляемых к рефакторингу является проведение оптимизации системы для ускорения работы. Но не стоит бросаться с шашками наголо — оптимизация может оказаться «чёрной дырой» в бюджете проекта, ну, по крайней мере, с точки зрения заказчика: «— Пыхтели неделю, а сайт всё так же медленно грузится». Причиной тому служит наша любовь к серверной оптимизации — любим мы копаться в сервер сайде, и забываем о клиенте, а зря:
Сайт | Время отдачи HTML | DOM Ready | Время загрузки страницы |
---|---|---|---|
facebook.com | ~0.3 | ~0.4 | ~2 |
yahoo.com | ~0.7 | >3 | >6 |
twitter.com | ~0.7 | >4 | >5 |
amazon.com | ~0.3 | >2 | >5 |
ebay.com | ~0.7 | >1 | >2 |
digg.com | 1 | ~2 | >4 |
Как видим — ускорив работу серверов в два раза и потратив на это весь бюджет вы даже не заметите разницу в скорости работы сайта, так что не зацикливайтесь, сервер-сайд стоит трогать в двух случаях:
- Сервера не справляются с нагрузкой
- Генерация страницы занимает >1 сек
Если эти два пункта не сыграли — займитесь клиентской оптимизацией, ускорить сайт иногда можно лишь заглянув в .htaccess.
5. Приемный ребенок
Кого я обманываю, с чужим проектом всегда трудно, но вам необходимо сопереживать ему, полюбить и растить его, без этого — заказчик просто уйдет от вас, а если он останется, то проект будет изматывать вас, пока окончательно не доканает.
Вместо вывода
Что бы вы не делали в проекте, ваша работа не должна усложнять дальнейшую разработку и поддержку проекта, но не стоит зацикливаться на «идеальности» кода, всегда нужно знать меру.
Все про українське ІТ в телеграмі — підписуйтеся на канал DOU
21 коментар
Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.