Кажется нечастым, но распространенным случаем, когда вы работаете над проектом, и вдруг что-то неожиданно появляется, бросает в работу огромный гаечный ключ и значительно увеличивает сложность.
Например, я работал над приложением, которое взаимодействовало со службами SOAP на других компьютерах. Я разработал прототип, который работал отлично, затем продолжил разработку обычного интерфейса и, как правило, начал все в хорошем, довольно простом и понятном стиле. Это работало замечательно, пока мы не начали тестирование в более широкой сети, и внезапно страницы перестали работать, так как задержка соединений и время, необходимое для выполнения вычислений на удаленных машинах, приводили к тайм-ауту запросов к мыльным службам. Оказалось, что нам нужно было изменить архитектуру для вывода запросов на их собственные потоки и кэширования возвращаемых данных, чтобы они могли постепенно обновляться в фоновом режиме, а не выполнять вычисления по запросу на основе запроса.
Детали этого сценария не слишком важны - на самом деле это не очень хороший пример, так как он был достаточно заметен, и люди, которые написали множество приложений такого типа для среды такого типа, могли бы его предвидеть - за исключением того, что он иллюстрирует способ, которым можно начать с простой предпосылки и модели и внезапно получить эскалацию сложности в процессе разработки проекта.
Какие стратегии у вас есть для работы с этими типами функциональных изменений, необходимость которых возникает - часто в результате факторов окружающей среды, а не изменения спецификации - позже в процессе разработки или в результате тестирования? Как вы балансируете между предотвращением преждевременных оптимизационных / YAGNI / чрезмерных инженерных рисков, связанных с разработкой решения, которое смягчает возможные, но не обязательно вероятные проблемы, в отличие от разработки более простого и легкого решения, которое, вероятно, будет столь же эффективным, но не включает в себя готовность к все возможные случаи?
Редактировать: Ответ Сумасшедшего Эдди включает в себя «вы смиритесь с этим и найдете самый дешевый способ реализации новой сложности». Это заставило меня задуматься о чем-то, что подразумевалось в этом вопросе, но я специально не поднял.
Как только вы нажмете на этот удар, и вы внесете необходимые изменения. Делаете ли вы то, что поддерживает проект как можно ближе к графику, но может повлиять на удобство сопровождения, или вы возвращаетесь к своей архитектуре и перерабатываете ее на более подробном уровне, который может быть более удобен в обслуживании, но отодвинет все назад во время разработки?