Вопрос

Я уверен, что вы все были там, вы беретесь за проект, где есть скрипучая старая кодовая база, которая едва ли подходит для этой цели, и вам приходится принимать решение либо переписать ее с нуля, либо восстановить то, что уже существует.

Общепринятая точка зрения, как правило, предполагает, что вам никогда не следует пытаться переписывать текст с нуля, поскольку риск неудачи очень высок.Итак, что вы сделали, столкнувшись с этой проблемой, как вы приняли решение и чем оно обернулось?

Это было полезно?

Решение

Это действительно зависит от того, насколько все плохо.

Если это небольшая система, и вы полностью понимаете ее, то переписывание не является безумием.

С другой стороны, если это гигантский устаревший монстр с десятью миллионами строк недокументированного таинственного кода, то вам действительно будет нелегко полностью переписать его.

Моменты, которые следует учитывать:

  • Если это выглядит хорошо для пользователя, ему будет все равно, что это за спагетти беспорядок для вас.С другой стороны, если для них это тоже плохо, то легче добиться согласия (и терпения).
  • Если вы будете переписывать, старайтесь делать это по одной части за раз.Беспорядочная, неорганизованная кодовая база может сделать это сложным (т.е. замена только одной части требует переписывания больших айсбергов кода зависимостей), но если возможно, это значительно упрощает задачу постепенное переписывание и получение обратной связи от пользователей по ходу работы.

Я бы действительно не решился взяться за гигантский проект по переписыванию для большой системы, не имея возможности выпускать новую версию по одной части за раз.

Другие советы

Просто чистите код немного каждый раз, когда вы работаете с ним. Если его еще нет, настройте среду модульного тестирования. Весь новый код должен быть написан тестами. Любой старый код, который вы исправляете в результате ошибок, попробуйте использовать в тестах.

По мере очистки вы сможете собирать все больше и больше неприятного кода в инкапсулированные контейнеры. Затем вы можете выбрать их один за другим в будущем.

Такие инструменты, как javadoc или doxygen, если они еще не используются, также могут помочь улучшить документацию и понятность кода.

Аргументы против полного переписывания довольно сильны. Эти тонны «маленьких жуков» и поведение, которое было закодировано в течение периода времени первоначального проекта, снова вернется.

См. эссе Джоэла Спольски То, что вы никогда не должны делать . Таким образом, когда вы переписываете, вы теряете все уроки, которые вы узнали, чтобы ваш текущий код работал так, как он должен работать.

См. также: Большой шарик грязи

Переписывание чего-либо сложного редко приводит к успеху.Это заманчивая, но малопроцентная стратегия.

Получите устаревший код в рамках модульных тестов и выполните его рефакторинг и / или полностью замените небольшие его части постепенно, когда это будет уместно.

Рефакторинг, если только он не очень плохой.

Джоэл может многое сказать по этому вопросу ...

По крайней мере, переписать код со старым кодом перед вами, а не просто начать заново. Старый код может быть ужасным, но так оно и есть по причине, и если вы проигнорируете его, вы в конечном итоге увидите те же ошибки, которые, возможно, были исправлены много лет назад в старом коде.

Одной из причин переписывания на одной из моих предыдущих работ была невозможность найти разработчиков с достаточным опытом работы над исходной базой кода.

Было принято решение сначала очистить базовую структуру базы данных, а затем переписать что-нибудь, что облегчило бы поиск сотрудников на полный рабочий день и / или подрядчиков.

Я еще не слышал, как это получилось :)

Я думаю, у людей есть склонность переписывать, потому что на первый взгляд это кажется более увлекательным.

Нам придется перестраиваться с нуля!

Мы сделаем это правильно на этот раз!

и т.д.

Выходит новая книга, Разработка приложений Brownfield в .NET , автор Baley and Belcham , Первая глава является бесплатной, и в ней рассматриваются эти вопросы с точки зрения, в основном, независимой от платформы.

Ремонт или, что более важно, рефакторинг. И потому, что Джоэл сказал так , а также потому, что, если это ваш код, вы, вероятно, с тех пор, как вы в последний раз касались этого кода, вы узнали гораздо больше. Если вы написали его в .NET 1.1, вы можете обновить его до 3.5 SP1. Вы можете войти и очистить весь старый закомментированный код. Вы в 100 раз лучше как разработчик, чем когда вы впервые написали этот код.

Единственное исключение, которое я думаю, - это когда в коде используются действительно устаревшие технологии - в этом случае вам лучше будет написать новую версию. Если вы смотрите на какое-то приложение VB6 с 10 000 строк кода с бэкэндом базы данных Access, явно созданным кем-то, кто не очень хорошо разбирается в том, как работают базы данных (что вполне может быть вами восемь лет назад), то вы, вероятно, можете использовать быстрее, на C # / SQL решение за долю времени и кода.

Это не так черно-белое ... это действительно зависит от множества факторов (более важно то, что "человек, которому вы платите, хочет, чтобы вы делали")

Там, где я работаю, мы переписывали среду разработки, а с другой стороны, мы продолжаем модифицировать некоторые старые системы, которые не могут быть перенесены (из-за технологии клиента и временных ограничений). В этом случае мы пытаемся поддерживать стиль кодирования, и иногда вам приходится реализовывать множество обходных путей из-за способа его построения

В зависимости от вашей ситуации у вас может быть другой вариант: лицензионный сторонний код.

Я проконсультировался в нескольких компаниях, где это было бы разумным выбором, хотя, казалось бы, "выбрасывая IP" может быть большим барьером для управления. В моей нынешней компании мы серьезно рассмотрели возможность использования стороннего кода для замены нашей базовой инфраструктуры, но в конечном итоге эта идея была отвергнута скорее по деловым причинам, чем по техническим причинам.

Чтобы прямо ответить на ваш вопрос, мы наконец решили переписать устаревшую структуру - решение, которое мы не приняли легко! 14 месяцев спустя мы не жалеем об этом выборе. Если учесть время, затрачиваемое на исправление ошибок, наш новый фреймворк почти окупился. С другой стороны, он еще не полностью завершен, поэтому мы находимся в незавидном положении, поддерживая две отдельные платформы параллельно, пока не сможем портировать последний из наших «front-end». приложения.

Я настоятельно рекомендую прочитать "Эффективная работа с устаревшим кодом". Майкл Перья. Это тренерский совет о том, как реорганизовать ваш код, чтобы его можно было тестировать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top