Извините, это будет долго, но оно основано на личном опыте как архитектора, так и разработчика в нескольких проектах переписывания.
Следующие условия должны заставить вас задуматься о переписывании. Я расскажу о том, как решить, что делать после этого.
- Время запуска разработчиков очень велико. Если для запуска нового разработчика требуется больше времени, чем указано ниже (по уровню опыта), то систему необходимо перепроектировать. Под временем наращивания я подразумеваю период времени, в течение которого новый разработчик готов выполнить свою первую фиксацию (для небольшой функции).
- Только что закончили колледж - 1,5 месяца
- Все еще зеленый, но работал над другими проектами раньше - 1 месяц
- Средний уровень - 2 недели
- Опытный - 1 неделя
- Старший уровень - 1 день
- Развертывание не может быть автоматизировано из-за сложности существующей архитектуры
- Даже простые исправления ошибок занимают слишком много времени из-за сложности существующего кода
- Новые функции занимают слишком много времени и стоят слишком дорого из-за взаимозависимости базы кода (новые функции не могут быть изолированы и, следовательно, влияют на существующие функции)
- Формальный цикл тестирования занимает слишком много времени из-за взаимозависимости существующей кодовой базы.
- Слишком много вариантов использования выполняются на слишком немногих экранах. Это вызывает проблемы с обучением для пользователей и разработчиков.
- Технология, которой пользуется нынешняя система, требует этого
- Качественных разработчиков с опытом работы с технологиями слишком сложно найти
- Это устарело (его нельзя обновить для поддержки новых платформ / функций)
- Существует просто более выразительная технология более высокого уровня
- Стоимость обслуживания инфраструктуры старой технологии слишком высока
Эти вещи довольно очевидны. Когда принимать решение о полном переписывании по сравнению с инкрементным перестраиванием, является более субъективным и, следовательно, более политически заряженным. С уверенностью могу сказать, что категорически утверждать, что это никогда не является хорошей идеей, неправильно.
Если систему можно постепенно модернизировать, и у вас есть полная поддержка спонсорства проекта для этого, тогда вам следует это сделать. Здесь проблема, однако. Многие системы не могут быть постепенно перепроектированы. Вот некоторые из причин, с которыми я столкнулся, которые препятствуют этому (как технические, так и политические).
- технический
- Связь компонентов настолько высока, что изменения одного компонента не могут быть изолированы от других компонентов. Редизайн одного компонента приводит к каскаду изменений не только для смежных компонентов, но и косвенно для всех компонентов.
- Технологический стек настолько сложен, что проектирование будущего состояния требует многократных изменений инфраструктуры. Это также необходимо для полного переписывания, но если оно требуется для поэтапного редизайна, вы потеряете это преимущество.
- Редизайн компонента приводит к полной переписке этого компонента в любом случае, потому что существующий дизайн настолько изящен, что не стоит ничего экономить. Опять же, вы теряете преимущество, если это так.
- политическая
- Спонсоры не могут понять, что постепенный редизайн требует долгосрочной приверженности проекту. Неизбежно, большинство организаций теряют аппетит к продолжающему истощению бюджета, которое создает постепенный редизайн. Эта потеря аппетита также неизбежна для переписывания, но спонсоры будут более склонны продолжать, потому что они не хотят быть разделенными между частично полной новой системой и частично устаревшей старой системой.
- Пользователи системы слишком привязаны к своим «текущим экранам». Если это так, у вас не будет лицензии для улучшения жизненно важной части системы (интерфейс). Редизайн позволяет обойти эту проблему, поскольку они начинают с чего-то нового. Они по-прежнему будут настаивать на получении «тех же экранов», но у вас есть немного больше боеприпасов, чтобы отодвинуться назад.
Имейте в виду, что общая стоимость повторного изменения значения всегда выше, чем полное переписывание, но влияние на организацию, как правило, меньше. На мой взгляд, если вы можете оправдать переписывание, и у вас есть разработчики суперзвезд, то сделайте это.
Делайте это только в том случае, если вы уверены, что есть политическая воля, чтобы довести дело до конца. Это означает как вступительный, так и конечный пользователь. Без этого у вас ничего не получится. Я предполагаю, что именно поэтому Джоэл говорит, что это плохая идея. Бай-ин для руководителей и конечных пользователей выглядит многогранным единорогом для многих архитекторов. Вы должны агрессивно продавать его и проводить кампанию за его продолжение до тех пор, пока оно не будет завершено. Это сложно, и вы говорите о том, чтобы поставить свою репутацию на что-то, что некоторые не захотят видеть успешным.
Некоторые стратегии успеха:
- Однако, если вы это сделаете, не пытайтесь конвертировать существующий код. Дизайн системы с нуля. Иначе ты зря тратишь время. Я никогда не видел и не слышал о «конверсионном» проекте, который не закончился бы с треском.
- Перенесите пользователей в новую систему по одной команде за раз. Определите команды, которые испытывают НАИБОЛЕЕ боль в существующей системе, и сначала перенесите их. Пусть они распространяют хорошие новости из уст в уста. Таким образом, ваша новая система будет продаваться изнутри.
- Создайте свой каркас, как вам нужно. Не начинайте с того, что я потратил 6 месяцев на создание фреймворка, который никогда не видел реального кода.
- Держите ваш технологический стек как можно меньше. Не переусердствуйте. Вы можете добавлять технологии по мере необходимости, но сложно их использовать. Кроме того, чем больше у вас слоев, тем больше работы нужно выполнять разработчикам. Не усложняйте с самого начала.
- Вовлекайте пользователей непосредственно в процесс проектирования, но не позволяйте им диктовать, как это сделать. Заработайте их доверие, показав им, что вы можете дать им то, что они хотят лучше, если вы будете следовать хорошим принципам дизайна.