Я использую гибкую методологию (SCRUM) уже около трех лет, и я вижу в ней определенные преимущества, особенно в краткосрочной обратной связи на многих уровнях (от клиентов, имеющих ранний доступ к реализованным функциям, от тестеров, которые могут тестировать функции как как только они будут реализованы, от других разработчиков, которые могут предоставить очень раннюю обратную связь о новом коде через обзор и т. д.).
С другой стороны, у меня есть две открытые проблемы, первую из которых я попытаюсь объяснить в этом вопросе.
Проблема: сложность получить хороший дизайн
Я стараюсь проводить рефакторинг, как только код становится беспорядочным, я пишу модульные тесты столько, сколько могу (что помогает предотвратить ошибки в целом и при рефакторинге в частности). С другой стороны, разработка некоторой сложной функции с небольшими приращениями, с ежедневными фиксациями и постоянным переосмыслением кода, когда он становится неструктурированным, не позволяет мне создавать действительно хороший дизайн.
Единственный хорошо продуманный модуль, который я смог создать в последнее время, был получен с использованием другого подхода: я анализировал проблему в течение нескольких дней (у меня на самом деле была проблема в течение нескольких месяцев, прежде чем я начал серьезно над ней работать) ), набросал довольно подробный дизайн всех участвующих классов и их отношений еще на пару дней, а затем заперся в моем офисе и записал весь код, работая без перерыва около трех недель. Результатом стало лучшее, что я произвел за последнее время, с очень небольшим количеством ошибок, которые было довольно легко обнаружить и исправить, и с очень четким дизайном, который с тех пор не требовал каких-либо соответствующих изменений.
Поэтому до сих пор я считал, что гораздо эффективнее получить общее представление о том, что я хочу сделать заранее, чем начинать писать код небольшими шагами в надежде, что большая картина волшебным образом возникнет в процессе. Прилагая все усилия, метод разработки с небольшими приращениями всегда приводил меня к худшему дизайну.
Вопрос : У кого-нибудь был подобный опыт? Неправильно ли я применяю SCRUM или на что мне следует обратить внимание, если я хочу развиваться небольшими шагами и при этом получить хорошо разработанное программное обеспечение? Или я должен запланировать историю проекта перед тем, как начать собственное кодирование? Считается ли это хорошей практикой, по крайней мере, для функций, которые являются более сложными, чем в среднем?
РЕДАКТИРОВАТЬ - ПРИМЕЧАНИЕ
Я осознаю тот факт, что хороший дизайн не является чем-то абсолютным и не имеет ценности сам по себе, но это зависит от контекста, и что нужно стремиться к дизайну, который достаточно хорош для рассматриваемой проблемы.
Например, меня не волнует (слишком много) хороший дизайн, если мне нужно реализовать простой компонент, который (1) должен быть готов как можно скорее, (2) будет использоваться только один раз, (3) не будет используется другими частями системы (YAGNI).
Меня интересует хороший дизайн, когда компонент (1) будет использоваться несколько раз и в нескольких различных выпусках продукта, (2) необходимо поддерживать и расширять с течением времени, (3) имеет много других компонентов в зависимости от него ,
The only well-designed module I could produce recently I obtained by taking a different approach
-- Вы ответили на свой вопрос. Вам все еще нужно немного авансовый дизайн; Вы не можете ожидать, что хороший дизайн просто вырастет органично от рефакторинга. Это не работает таким образом.