Понимание требований в более широкой перспективе очень важно для разработки чего-то, что выживет в течение длительного времени.Понимание предметной области, бизнеса, потребностей пользователей, ожиданий клиентов, выявление неописанных деталей также имеет большое значение при разработке программного обеспечения.Может быть N факторов, которые влияют на дизайн, таких как частота использования, время использования, сложность рабочего процесса, приоритет пользователей, ограничения системы, ресурсы, навыки разработчика, время, бюджет и многое другое.Вы должны быть в состоянии визуализировать более широкую картину проблемы для решения или требования.Этот анализ должен привести к определению того, что является постоянным в системе и что может измениться в будущем. Дизайн должен абстрагировать часть, которая может измениться. Новое требование не должно приводить к изменению дизайна.Разделяй и властвуй - это формулы, упрощающие сложность.Создавайте специальные пакеты или модули.Определите отношения между ними. Определите важные варианты использования и постарайтесь представить, как ваш дизайн будет обрабатывать или удовлетворять варианты использования.Сделайте детальный дизайн с классами, типами, интерфейсами.Следуйте подходящим шаблонам дизайна в соответствии с необходимостью.Не забывайте твердые принципы.Тестируемость, расширяемость, ремонтопригодность, сложность - это вещи, которые необходимо принять во внимание в начале.Вам нужно нечто большее, чем умение.Таким образом, некоторые люди считают это искусством.Ни один дизайн не может быть идеальным.Делайте ошибки, учитесь на них, не повторяйте.Вот как это для меня.Мой ответ может быть не точным для рассматриваемого вопроса, но, надеюсь, будет полезным.