Кажется нечастым, но распространенным случаем, когда вы работаете над проектом, и вдруг что-то неожиданно появляется, бросает в работу огромный гаечный ключ и значительно увеличивает сложность.
Например, я работал над приложением, которое взаимодействовало со службами SOAP на других компьютерах. Я разработал прототип, который работал отлично, затем продолжил разработку обычного интерфейса и, как правило, начал все в хорошем, довольно простом и понятном стиле. Это работало замечательно, пока мы не начали тестирование в более широкой сети, и внезапно страницы перестали работать, так как задержка соединений и время, необходимое для выполнения вычислений на удаленных машинах, приводили к тайм-ауту запросов к мыльным службам. Оказалось, что нам нужно было изменить архитектуру для вывода запросов на их собственные потоки и кэширования возвращаемых данных, чтобы они могли постепенно обновляться в фоновом режиме, а не выполнять вычисления по запросу на основе запроса.
Детали этого сценария не слишком важны - на самом деле это не очень хороший пример, так как он был достаточно заметен, и люди, которые написали множество приложений такого типа для среды такого типа, могли бы его предвидеть - за исключением того, что он иллюстрирует способ, которым можно начать с простой предпосылки и модели и внезапно получить эскалацию сложности в процессе разработки проекта.
Какие стратегии у вас есть для работы с этими типами функциональных изменений, необходимость которых возникает - часто в результате факторов окружающей среды, а не изменения спецификации - позже в процессе разработки или в результате тестирования? Как вы балансируете между предотвращением преждевременных оптимизационных / YAGNI / чрезмерных инженерных рисков, связанных с разработкой решения, которое смягчает возможные, но не обязательно вероятные проблемы, в отличие от разработки более простого и легкого решения, которое, вероятно, будет столь же эффективным, но не включает в себя готовность к все возможные случаи?
Редактировать: Ответ Сумасшедшего Эдди включает в себя «вы смиритесь с этим и найдете самый дешевый способ реализации новой сложности». Это заставило меня задуматься о чем-то, что подразумевалось в этом вопросе, но я специально не поднял.
Как только вы нажмете на этот удар, и вы внесете необходимые изменения. Делаете ли вы то, что поддерживает проект как можно ближе к графику, но может повлиять на удобство сопровождения, или вы возвращаетесь к своей архитектуре и перерабатываете ее на более подробном уровне, который может быть более удобен в обслуживании, но отодвинет все назад во время разработки?
источник
Я не согласен с духом ответа @ Péter Török, потому что он предполагает, что команда (или человек) может предвидеть самые рискованные элементы в начале жизненного цикла проекта. Например, в случае OP команда не могла предвидеть возрастающую сложность, связанную с многопоточным решением, пока их спины не были прислонены к стене.Вопрос ОП - хороший вопрос, и он говорит о проблеме, с которой сталкиваются многие магазины по разработке программного обеспечения.
Вот как бы я справился с проблемой:
Подробнее о пункте 3:
источник
Код для интерфейсов
При написании новых функций, взаимодействующих с другими функциями, создайте границу в виде интерфейса (вид Java), через который все проходят. Это будет
источник
Неудивительно.
Это разработка программного обеспечения. Если вы не изобретаете что-то новое, вы загружаете уже проверенное решение.
Там мало среднего.
Если вы изобретаете что-то новое, то должна быть хотя бы одна функция, которую вы не совсем понимаете. (Чтобы полностью понять это, вам нужно иметь работающую реализацию, которую вы просто используете.)
Как это сделать?
Есть реалистичные ожидания. Вы изобретаете что-то новое. Там должны быть части, которые вы не понимаете.
Есть реалистичные ожидания. Если в первый раз все работает правильно, вы что-то упустили.
Есть реалистичные ожидания. Если бы это было просто, кто-то другой сделал бы это первым, и вы могли бы просто загрузить это решение.
Есть реалистичные ожидания. Вы не можете предсказать будущее очень хорошо.
источник
Дизайн и код с учетом морального износа. Предположим, что то, что вы кодируете сегодня, нужно будет вырезать и заменить завтра.
источник
Окружающая среда должна быть частью спецификации. Таким образом, изменение среды - это изменение спецификации. Если, с другой стороны, вы основали свой прототип и дизайн на среде, отличной от той, которая была в спецификации, вы совершили глупую ошибку. В любом случае, вы смиряетесь с этим и находите самый дешевый способ реализации новой сложности.
источник
Как и в большинстве задач программирования, это зависит , на мой взгляд. Эта проблема настолько присуща творческой работе, что вы не должны забывать, что сбои могут произойти, и это нормально . Программирование - злая проблема, и вы обычно не знаете правильного решения проблемы, пока не решите ее.
Тем не менее, здесь есть множество специфических местных факторов, таких как:
Для краткосрочных вещей, возможно, не стоит думать об этом более чем достаточно, чтобы просто запустить его. Рефакторинг стоит дорого, и это то, что не создает немедленной конечной ценности для вашего пользователя. тем не мениеЯ не могу придумать ни одного другого случая, кроме программного обеспечения «абсолютного одноразового использования», когда оно настолько короткое, что не стоит улучшать ваш дизайн. Гораздо важнее быть в состоянии понять, что вы сделали, и исправить это быстро, чем закончить прямо сейчас. Если это на более длительный срок, то он, скорее всего, в конечном итоге окупится (и, возможно, гораздо раньше, чем думают все участники), или наоборот (если этого не сделать, боль будет очень скоро вместо «когда мы должны это исправить»). Я почти испытываю соблазн сказать: «всегда делайте это лучше», но в некоторых случаях это невозможно.
Это должно оказать огромное влияние на ваши решения. Ваша команда либо поддержит это решение, либо предоставит вам ресурсы для редизайна, либо потребует быстрого решения, которое необходимо сделать сейчас. По моему мнению, если вы обнаружите, что команда последовательно подталкивает вас в неправильном направлении, это огромный красный флаг. Я видел подобные вещи в конечном итоге в сценарии, в котором происходит постоянное пожаротушение, когда нет времени на перепроектирование, потому что вы всегда решаете проблемы, которые создает ваш плохой дизайн. Хотя может быть и золотая середина: «клейкая лента» теперь исправьте как можно скорее (но на самом деле сделайте это).
Действительно важно. Подумайте, что это за ошибка или проблема, и почему это происходит. Такая ситуация - отличная возможность найти ошибочные (или отсутствующие) предположения, ограничения и взаимодействия. В общем, всегда предпочитайте лучше понимать свою проблему, а не решать текущую проблему. Это, вероятно, ваша самая лучшая защита против ЯГНИ / переобучения. Если вы понимаете свою проблему достаточно хорошо, то вы решите ее, а не другие проблемы.
Наконец, попробуйте построить вещи правильно . Я не говорю об ошибках и проблемах, с которыми вы сталкиваетесь, когда вы либо лучше понимаете проблему, либо свою человеческую ошибку. Я не имею в виду «не делай ошибок и не совершенствуйся с первого раза» - это невозможно. Я имею в виду, старайтесь хорошо управлять сложностью в вашей повседневной работе, исправляйте разбитые окна, старайтесь как можно проще, постоянно улучшайте свой код и мышление. Таким образом, когда (не если) изменение стучит в вашу дверь, вы можете приветствовать ее с распростертыми объятиями вместо дробовика.
источник