Как я могу обновить большую унаследованную кодовую базу для соответствия определенным стандартам качества?

10

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

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

Перед:

  • Большой: больше 1MLOC
  • Наследие: нет автоматических тестов
  • Низкое качество: высокая сложность, высокая степень сцепления, высокая степень избежания дефектов.

После

  • Автоматизированные тесты
  • Более легкие обновления / обслуживание
  • Высокое качество: сниженная сложность, несвязанный код, мало избежавших дефектов

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

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

mikelong
источник
2
Netscape
Karthik T
7
Вся финансовая индустрия? Многое из этого работает на 40-летнем коде FORTRAN. В отличие от Netscape, они не могут избавиться от него и переписать его с нуля, так что все это время постепенно улучшалось.
MattDavey
2
в моем POV, Netscape вряд ли можно использовать в качестве успешного примера - проект закончил компанию ..... которая в то время была коммерческой для коммерческой организации. Не могу себе представить, чтобы акционеры взломали верхнюю полку в тот день ... На самом деле есть хорошо известная «белая книга» в духе «Чего не делать», использующая Netscape в качестве идеального примера ...
Mattnz
2
Привет @mikelong Я отредактировал твой вопрос, чтобы попытаться открыть его снова. Ваш первоначальный вопрос с просьбой предоставить список примеров, который по стандартам StackExchange считается "неконструктивным". Не стесняйтесь редактировать его дальше, чтобы добавить больше деталей о том, что вы подразумеваете под «высоким качеством», или обновить формулировку, если я допустил ошибку. :)
Рейчел

Ответы:

8

Такие книги, как http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052, должны быть достаточными свидетельствами того, как большие, унаследованные некачественные базы кодов широко распространены в отрасли.

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

Это может объяснить недостаток исследований, о которых вы говорите. Если вы прочитаете достаточно книг, например, «Глубокие секреты» Питера ван дер Линдена, вы прочитаете об ошибках на миллион долларов, в которых часть, о которой они были написаны, будет отсутствовать.

ПРИМЕЧАНИЕ: я хотел сделать это комментарий, но это было слишком долго. Я понимаю, что это не отвечает на вопрос полностью.

РЕДАКТИРОВАТЬ: C ++ 11 & Долгосрочная жизнеспособность GCC ставится под сомнение - если разработчики реорганизуют GCC и делают его более удобным для использования как LLVM / clang, это может послужить хорошим примером. В обсуждении отмечается, что в некоторых местах документация оставляет желать лучшего, что еще больше повышает барьер для новых разработчиков.

vpit3833
источник
4

3 февраля 2013 года Майкл Микс, один из разработчиков LibreOffice, через пару дней выступает с докладом на тему: «LibreOffice: очистка и перефакторинг гигантской кодовой базы, или почему переписывание будет еще хуже». «. Это звучит как то, что вы просите: обсуждение того, что они сделали, чтобы взять «плохо понятую, гигантскую кодовую базу, подробно прокомментированную на немецком языке, без юнит-тестов, запутанной инфраструктуры сборки и двадцать пять годы неоплаченного технического долга »и его модернизации.

Презентацию можно транслировать в Интернете , и (я думаю) записи будут доступны в будущем.

Джош Келли
источник
1
Я понимаю, что это запланировано на несколько дней, однако, после того, как оно будет передано, сможете ли вы добавить в ответ краткий отчет о процессе, который они предприняли для модернизации своей кодовой базы, если эти ссылки когда-нибудь прекратятся?
Рэйчел
@ Рейчел - Если я смогу посмотреть трансляцию, я обязательно сделаю это. Спасибо.
Джош Келли
4

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

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

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

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

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

Скажем, у вас есть 60000 файлов высокосвязанного кода, например. Вы хотите начать тестирование, но зависимости делают это невозможным. Как вы это исправите? Вы отделяете один файл. Вы добавляете автоматизированные тесты. Вы возвращаетесь в устойчивое положение, прежде чем двигаться дальше. Повторите 59,999 раз.

Если это звучит очень просто, это потому , что это просто. Это не легко, но это просто. Сначала трудно заметить какой-либо прогресс. Мы два года в том, что казалось невозможным рефакторингом, и, вероятно, у нас еще много лет до того, как мы закончим, но, оглядываясь назад, мы внезапно осознаем, насколько улучшился код, и мы смогли продолжать предоставлять новую функциональность нашим клиентам в то же время.

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

Карл Билефельдт
источник
1

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

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

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

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

  • Модульное тестирование может работать, но часто вы ограничены тем, что можно тестировать модулем из-за тесно связанного кода. Однако сделайте это, где вы можете.
  • Внешнее тестирование - это еще один путь. Я предполагаю, что у вас, вероятно, уже есть это, и если бы не я потратил некоторое время, создавая это. Кроме того, кое-что, что мне помогло, - это возможность произвольно вводить ошибки / события в систему. В дополнение к этому попробуйте ввести несколько вещей одновременно, чтобы попытаться заставить его выйти из строя по-новому.
barrem23
источник