Как удержать себя от непреодолимого желания переписать все? - PullRequest
42 голосов
/ 27 ноября 2008

Настройка

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

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

Задача

Очевидно, что существует серьезная гниль кода, ужасная архитектура и т. Д., С которыми необходимо бороться. Настоящая проблема, связанная с этим вопросом, заключается в том, что сейчас не время переписывать код . Причин может быть много:

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

Вопрос

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


Обновление

Отличные ответы! По большей части, кажется, есть две школы мысли:

  1. Не сопротивляйся побуждению, потому что это хорошо.
  2. Не поддавайтесь искушению, оно сожжет вас до основания.

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

Ответы [ 20 ]

24 голосов
/ 27 ноября 2008

Я большой поклонник составления списков!

Как только у вас появится желание переписать что-то - потратьте 10 минут на составление списка вещей, которые нужно переписать. Следуйте всем аллеям, которые ведут вас дальше в код, который требует внимания, и перечислите их тоже.

Надеюсь, что в течение относительно короткого промежутка времени у вас будет одна из двух вещей:

  • Действительно длинный список, который полностью избавляет вас от желания переписывать что-либо когда-либо снова.
  • Список, который на самом деле не такой длинный, так почему бы не побаловать себя и не переписать?!
17 голосов
/ 27 ноября 2008

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

13 голосов
/ 27 ноября 2008

Самый запоминающийся проект такого рода для меня произошел около 4 лет назад, когда меня вызвали в удаленный офис, чтобы «помочь» с проектом, который должен был через 1 неделю провести серьезную презентацию для клиента и еще не работал совсем. Проект был в основном офшорен в Индию, и, по словам ИМО, из-за сбоя в управлении проектом была масса фрагмента спагетти, который был слишком фрагментирован, чтобы когда-либо работать должным образом в его текущей форме.

После полного дня обзора я представил руководству свое мнение о том, что проекту просто необходим оптовый рефакторинг и реорганизация, иначе он никогда не будет работать должным образом. Результатом этой дискуссии стало 6 дней 20 часов работы / 4 часа сна, 2 из которых я фактически провел, спя на диване в вестибюле компании из-за потерянного времени при возвращении в отель.

Основные улучшения в коде:

  • Применение стандартов именования
  • Перемещено в систему контроля версий
  • Разработка процесса сборки
  • Документация по отдельным компонентам

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

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

9 голосов
/ 27 ноября 2008

Как удержать себя от непреодолимого желания переписать все?

Стареем *

Поскольку это случилось со мной, я постепенно потерял желание переписывать все. Почему?

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

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

8 голосов
/ 27 ноября 2008

Импульс переписать праведен при условии, что:

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

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

7 голосов
/ 27 ноября 2008

Это не совсем ответ, но чтение прекрасной статьи Нарциссизм небольших различий в кодах может помочь.

6 голосов
/ 27 ноября 2008

Вы абсолютно правы, что есть правильное время и неправильное время, чтобы переписать (и дестабилизировать) код.

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

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

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

5 голосов
/ 27 ноября 2008

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

Хороший старт для решения больших проблем рефакторинга на малых этапах на sourcemaking.com :

ты должен сделать как Гензель и Гретель и клев по краям, немного сегодня, немного больше завтра

4 голосов
/ 27 ноября 2008
  1. Перечитайте "Рефакторинг".
  2. Возьмите лист бумаги и составьте список «Плохих запахов».
    (за каждый запах в BadSmells () {
    print запах.имя;
    }
  3. Добавление комментариев к коду, включая элементы из списка.
    while (odorPersists ()) {
  4. Работа по списку, сфокусированная лазером на одном запахе за раз.
    }
4 голосов
/ 27 ноября 2008

Лично здесь со мной приходят программы отслеживания ошибок, такие как JIRA или Bugzilla.

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

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

- Нельзя сказать, что маленькие разбитые окна должны обрабатываться таким образом; мелкие проблемы всегда должны быть исправлены на контакт ИМХО.

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