Подтвердить что ты не робот

Как сохранить мое здравомыслие при сохранении кода спагетти

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

Обычно я обычно вижу 2 вида программистов:

  • "Программисты с испугом до смерти" - эти ребята не тронут ничего, что им не нужно. они, вероятно, выполнит задачу обслуживания, используя быстрые и грязные исправления, которые заставят следующего программиста начать поиск своего домашнего адреса; -)

    плюсы:
    он работает

    минусы:
    вы надеетесь, что никогда больше не увидите этот код.

  • "Учителя" - они, вероятно, перепишут весь код, полностью переработав свою логику.

    плюсы:
    ну, кто-то должен сделать грязную работу...

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

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

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

4b9b3361

Ответ 1

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

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

Лучшие предложения, которые я могу придумать:

  • Сначала попытайтесь исправить легкие/очевидные вещи. Жестко закодированные пути, ссылки на магические числа, очевидное дублирование кода. Возможно, быстрый выпуск, который избавится от худших 20% нарушений, будет иметь низкий риск и сделает следующие шаги более легкими для выполнения.
  • Получить организационную поддержку для рефакторинга - часто нет желания или желания выполнять работу, которая не добавляет немедленных функциональных возможностей и рискует нарушить существующий код. Есть, конечно, большие аргументы в пользу рефакторинга, но не все покупают их. Если организация не поддерживает его, вам, возможно, придется отказаться от нее.
  • Приведи других разработчиков к одному и тому же представлению - если они хороши, они, вероятно, так же недовольны кодовой базой, как и вы. Если новый код построен на лучших стандартах, а люди мотивированы, они начнут исправлять устаревший код, поскольку необходимо применять настройки.
  • Если какая-то конкретная подсистема действительно, очень плохая и дошла до того, что новая разработка почти невозможна, вы, вероятно, можете использовать эту возможность для ее восстановления.

Ответ 2

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

Вам может понравиться читать

Обложка книги http://ecx.images-amazon.com/images/I/51RCXGPXQ8L._SL500_AA240_.jpg

Эффективная работа с устаревшим кодом

Ответ 3

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

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

Ответ 4

Единственный способ, который я знаю:

  • написать тесты
  • рефакторинг
  • выполните тесты
  • исправить поврежденные
  • написать тесты для новой функции
  • ввести новую функцию
  • выполните тесты
  • исправить поврежденные

Вы можете так переживать.

ПРИМЕЧАНИЕ: есть несколько раз, когда очень тяжело unit test код спагетти: методы 3Klines, которые генерируют HTML, DAO запутываются бизнес-логикой, сильно связаны классы... в этом случае хороший IDE с автоматическим рефакторингом (способный к извлечению методов, для начала), и некоторые тестовые инструменты, такие как Selenium, могут оказаться очень полезными.

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

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

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

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

Я был достаточно успешным с таким подходом, что получил почетный титул "Судебный программист", это тоже фантастическое умение, потому что чаще всего новая работа уже имеет некоторый код: P

Ответ 8

out sauce it:)

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

Когда у вас есть понимание кода, время рефакторирования. Хорошо планируйте. Попытайтесь написать кучу приличных тестов. Затем перейдите к итеративному подходу рефакторинга, написав дополнительные тесты и проверив (работая!) Модификации обратно в исходное управление.

В зависимости от того, насколько вы мазохистичны, это может быть большой забавой или вашим личным адом:)

Ответ 9

  • Будьте медленными и преднамеренными.
  • Напиши тесты, когда можешь, но не смущайся, когда не можешь. Код спагетти - это редко проверяемый код.
  • Помните, что все, кто редактировал код, прежде чем у вас есть веская причина сделать то, что они сделали. Предположите лучшие из них, и вы, вероятно, будете вознаграждены.
  • Понимание кода перед попыткой изменить код.
  • Делайте заметки, когда вы учитесь, и держите их в курсе, как вы работаете. Сохраняйте и делитесь ими с wiki, если можете.
  • Используйте систему контроля версий, сделайте каждое изменение настолько маленьким и сфокусированным насколько возможно, и проверьте как можно чаще.
  • Не откусывайте больше, чем вы можете пережевывать. Когда вы делаете одно изменение, вы, несомненно, найдете что-то еще, которое должно быть очищено. Добавьте его в список дел и сосредоточьтесь на своей первоначальной миссии.
  • Рассматривайте проект как кемпинг: оставьте его в лучшем состоянии, чем вы его нашли. И помните, что "лучше" относительное; вы не можете исправить все сразу.

Ответ 10

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

Ответ 11

Я знаю, что в известной страховой компании, которой я занимался sys admin, основная система ценообразования - это 25-летняя мэйнфрейм под названием GenZ. С середины девяностых, я думаю, новая система находится в разработке и в настоящее время выкачивается в бета-версии

Мейнфрейм, вероятно, отлично работал в 1980-х годах, но с тех пор, как компания росла, было добавлено больше данных, и система требовала большего. Патчи были применены, появилось больше проблем, и это было так много лет.

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

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

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

Ответ 12

  • Прежде всего, получите управление покупкой в ​​том, что улучшающий код необходим для обеспечения деловой ценности (например, добавление функций в будущем становится проще). Я лично потратил драгоценные часы на то, чтобы улучшить приложение для пожизненной жизни.
  • Понимайте домен полностью, некоторые виды доменов поощряют определенные типы (анти) шаблонов. Это поможет понять, почему все так, как они есть.
  • Написание тестов по унаследованному коду помогает мне исследовать различные нюансы в бизнес-логике, которые сделали беспорядок кода в настоящее время. Я лично никогда не ставил целью охват кода тестированием кода устаревшего кода (хотя обычно это был проповеднический подход), он только сведёт вас с ума.

Ответ 13

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

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

Некоторые файлы содержат 8 тыс. строк, потому что предыдущий dev (не настоящий dev) сохранял копии и вставлял куски кода вместо разделения функциональных возможностей. Это очень тесно связанный код, небольшое изменение в одном файле потребует изменений в 4-5 других местах.

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

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

Ответ 14

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

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

Ответ 15

Ну, может быть, это просто подходит для моего случая, но вот оно:

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