Переписать или починить?
Я уверен, что вы все были там, вы берете проект, где есть скрипучая старая кодовая база, которая едва подходит для цели, и вы должны принять решение либо переписать ее с нуля, либо исправить то, что уже существует.
Общепринятое мнение предполагает, что вы никогда не должны пытаться переписать заново, так как риск неудачи очень высок. Итак, что вы делали, когда столкнулись с этой проблемой, как вы приняли решение и как оно получилось?
11 ответов
Это действительно зависит от того, насколько это плохо.
Если это небольшая система, и вы ее полностью понимаете, то переписать это не сумасшествие.
С другой стороны, если это гигантский унаследованный монстр с десятью миллионами строк недокументированного загадочного кода, то вам действительно придется нелегко переписать его полностью.
Вопросы для рассмотрения:
- Если это выглядит хорошо для пользователя, им все равно, какой это беспорядок спагетти для вас. С другой стороны, если им это тоже плохо, то легче получить согласие (и терпение).
- Если вы переписываете, попробуйте сделать это по одной части за раз. Грязная, неорганизованная кодовая база может затруднить это (т. Е. Замена только одной части требует переписывания больших айсбергов кода зависимости), но, если это возможно, это значительно облегчает постепенную переписывание и получение отзывов от пользователей по пути.,
Я действительно не решался бы взять на себя гигантский проект переписывания для большой системы, не имея возможности выпустить новое издание по одной части за раз.
Просто очищайте код каждый раз, когда вы работаете с ним. Если его еще нет, настройте среду модульного тестирования. Весь новый код должен быть написан тестами. Любой старый код, который вы исправляете из-за ошибок, тоже попробуйте в тестах.
По мере очистки вы сможете собирать все больше и больше неприятного кода в инкапсулированные контейнеры. Затем вы можете выбрать их один за другим в будущем.
Такие инструменты, как javadoc или doxygen, если они еще не используются, также могут помочь улучшить документирование и понятность кода.
Аргументы против полного переписывают довольно сильно. Те тонны "маленьких ошибок" и поведения, которые были закодированы в течение времени исходного проекта, снова вернутся обратно.
Посмотрите эссе Джоэла Спольски " Что вы никогда не должны делать". Таким образом, когда вы переписываете, вы теряете все уроки, которые вы узнали, чтобы ваш текущий код работал так, как он должен работать.
Смотри также: Большой Грязевой Шар
Переписывание чего-либо сложного редко бывает успешным. Это заманчиво, но стратегия с низким процентом.
Получите унаследованный код в модульных тестах и реорганизуйте его, и / или полностью заменяйте его небольшими частями, если это необходимо.
Выходит новая книга Baley and Belcham " Разработка приложений Brownfield в.NET ". Первая глава является бесплатной, и в ней рассматриваются эти вопросы с точки зрения, в основном, независимой от платформы.
Рефакторинг, если это действительно очень плохо.
Джоэл может многое сказать по этому поводу...
По крайней мере, переписать код со старым кодом перед вами, а не просто начать заново. Старый код может быть ужасным, но так оно и есть по причине, и если вы проигнорируете его, вы в конечном итоге увидите те же ошибки, которые, возможно, были исправлены много лет назад в старом коде.
Ремонт или, что более важно, рефакторинг. И потому, что так сказал Джоэл, а также потому, что, если это ваш код, вы, вероятно, узнали намного больше вещей, так как последний раз касались этого кода. Если вы написали его в.NET 1.1, вы можете обновить его до 3.5 SP1. Вы можете войти и очистить весь старый закомментированный код. Вы в 100 раз лучше как разработчик, чем когда вы впервые написали этот код.
Я думаю, что единственным исключением является случай, когда в коде используются действительно устаревшие технологии - в этом случае вам лучше будет написать новую версию. Если вы смотрите на какое-то приложение VB6 с 10 000 строк кода с бэкэндом базы данных Access, явно созданным кем-то, кто мало знал о том, как работают базы данных (что вполне могло бы быть вами восемь лет назад), то вы, вероятно, можете потянуть быстрее, на C#/SQL решение за долю времени и кода.
Одной из причин переписывания на одной из моих предыдущих работ была неспособность найти разработчиков с достаточным опытом для работы с исходным кодом.
Было принято решение сначала очистить базовую структуру базы данных, а затем переписать что-то, что облегчит поиск штатных сотрудников и / или подрядчиков.
Я еще не слышал, как это получилось:)
Я думаю, что у людей есть склонность идти на переписывание, потому что это кажется более забавным на поверхности.
Мы можем восстановить с нуля!
Мы сделаем это правильно на этот раз!
и т.п.
Я настоятельно рекомендую прочитать "Эффективную работу с устаревшим кодом" Майкла Фезерса. Это тренерский совет о том, как реорганизовать ваш код, чтобы его можно было тестировать.
Это не так черно-белое... это действительно зависит от множества факторов (более важным является то, "что человек, которому вы платите, хочет, чтобы вы делали")
Там, где я работаю, мы переписывали среду разработки, и, с другой стороны, мы продолжаем модифицировать некоторые старые системы, которые не могут быть перенесены (из-за технологии клиента и временных ограничений). В этом случае мы пытаемся поддерживать стиль кодирования, и иногда вам приходится реализовывать множество обходных путей из-за способа его построения.
В зависимости от вашей ситуации у вас может быть другой вариант: лицензионный сторонний код.
Я консультировался в нескольких компаниях, где это было бы разумным выбором, хотя, казалось бы, "выбрасывание ИС" может стать большим барьером для управления. В моей нынешней компании мы всерьез рассматривали возможность использования стороннего кода для замены нашей базовой инфраструктуры, но в конечном итоге эта идея была отвергнута скорее по деловым причинам, чем по техническим причинам.
Чтобы напрямую ответить на ваш вопрос, мы наконец решили переписать устаревшую структуру - решение, которое мы не приняли легко! 14 месяцев спустя мы не жалеем об этом выборе. Если учесть время, потраченное на исправление ошибок, наша новая платформа почти окупилась. С другой стороны, он еще не полностью завершен, поэтому мы находимся в незавидном положении, поддерживая две отдельные платформы параллельно, пока не сможем портировать последние из наших "интерфейсных" приложений.