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

Рефлятор безжалостно или построить один, чтобы выбросить?

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

- Фред Брукс, Мифический человек-месяц [Акцент мой]

Постройте один, чтобы выбросить. Это то, что они сказали мне. Затем они сказали мне, что теперь все agile, поэтому мы должны Рефлятор безжалостно. Что дает?

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

4b9b3361

Ответ 1

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

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

Ответ 2

Отбросьте рано, рефакторинг позже

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

TL; DR: вы можете реорганизовать свой путь из большинства проблем. Иногда, однако, вы не сможете реорганизовать некоторые элементы дизайна. Когда это произойдет, пришло время начать снова, хотя, надеюсь, вы сможете повторно использовать некоторые из компонентов, которые у вас есть.

Ответ 7

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

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

Ответ 8

Говоря об Agile, вы можете сделать то и другое, но в общем случае вы будете делать spikes (прототипы) только для того, чтобы попробовать конкретные проблемы, узнавать о них и быть в состоянии сделать более точные оценки. Бросьте, когда вы делаете простой всплеск и рефакторинг, когда вы действительно кодируете приложение.

С уважением

Ответ 9

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

Ответ 10

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

Например, я написал большую базу кода в Ruby on Rails, и за последние 2-3 года RoR много продвинулся. Я также принял некоторые решения в архитектуре, которые необходимо было исправить. Итак, я выбрасываю одного и строим новый с нуля. Тем не менее, я все еще могу использовать 70-80% или около того моего старого кода, поскольку я все еще пишу в Ruby and Rails.

Основным фактором, который помог в этом, является то, что Rails заставляет вас писать хорошо структурированный код с разделением бизнес-логики и слоев представления. Я не получил его в первый раз, но, поскольку все довольно хорошо разделено и DRY, перенося код на Rails v2.1, переструктурируя проблемные области и переписывая некоторые "проблемные" функции, довольно безболезненный опыт.

Итак, выбирая отличную технологию с самого начала, я смог выбросить ее, но все равно возьму с собой 70-80% старого материала, который все еще работает.

Ответ 11

В более позднем эссе в "Мифическом человеческом месяце" Брукс предупреждает, что он обнаружил, что если вы действительно планируете выбросить 1, вы в итоге выбросите 2 человека!

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

Я думаю, когда Брукс говорит: "Планируйте выбросить его, вы все равно будете" больше похожим на утверждение ", количество оставшихся ошибок будет" n + 1 ". То есть, это ха-ха-только серьезное выражение о законе Мерфи, а не практический совет. Уроки отнять у него - это то, что прототипы ценны, хорошее письмо переписывается и не боится отказаться от чего-то, что не работает.

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

Ответ 12

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

Ответ 13

Как менеджер по развитию в этой организации, мне "запрещено" писать производственный код.

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

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

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

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

Ответ 14

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

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