Мне нравится подход, который Кент Бек выдвигает в XP (не уверен, что это «его» идея или идея кого-то другого, но именно там я впервые ее услышал):
Достаточно сложно решить сегодняшние проблемы, не пытаясь понять, что такое завтрашние проблемы, и решить их тоже.
Разработчики могут тратить много времени на решения для несуществующих требований, крайних случаев, которые никогда не будут возникать, или даже на подлинные проблемы, когда влияние проблемы значительно меньше, чем затраты на ее предотвращение.
Это время, которое можно вкладывать в вещи, которые пользователи действительно хотят и используют, вещи, которые дадут им преимущества, которые значительно перевесят даже неудобства, которые будут вызваны в маловероятном случае, когда одна из этих вещей действительно произойдет.
Помимо даже этого неоптимального для пользователя результата, влияние на разработчика чрезмерного проектирования таким образом имеет тенденцию быть более сложным кодом, который труднее поддерживать и труднее улучшить.
Так что для меня, если вы знаете или можете быть совершенно уверены, что что-то является требованием или будет вызывать проблему, то решайте ее, если нет, то не делайте этого.
Возможно, вам придется вернуться и переработать его, когда выяснится, что существует более широкое требование, чем вы изначально выполняли, но в целом общее усилие, которое вы вкладываете в проект, все равно будет ниже, поскольку в большинстве случаев этого не происходит.