Pour moi, j'aime l'approche que Kent Beck propose dans XP (je ne sais pas si c'est "son" idée ou celle de quelqu'un d'autre, mais c'est là que je l'ai entendue pour la première fois):
Il est déjà assez difficile de résoudre les problèmes d'aujourd'hui sans essayer de déterminer quels sont les problèmes de demain et de les résoudre également.
Les développeurs peuvent consacrer beaucoup de temps à trouver des solutions à des exigences qui n'existent pas, des cas marginaux qui ne se produiront jamais ou même de véritables problèmes où l'impact du problème est nettement inférieur au coût de sa prévention.
C'est le temps qui pourrait être consacré aux choses que les utilisateurs voudront et utiliseront vraiment, des choses qui leur donneront des avantages qui dépasseront massivement même les inconvénients qui seront causés dans le cas peu probable où l'une de ces choses se produirait réellement.
Au-delà même de ce résultat non optimal pour l'utilisateur, l'impact sur le développeur de la suringénierie de cette manière a tendance à être sur un code complexe qui est plus difficile à prendre en charge et plus difficile à améliorer.
Donc pour moi, si vous savez, ou pouvez être assez certain, que quelque chose est une exigence ou va causer un problème, résolvez-le, sinon, ne le faites pas.
Vous devrez peut-être revenir et la retravailler s'il s'avère qu'il y avait une exigence plus large que celle que vous aviez initialement mise en œuvre, mais généralement l'effort total que vous déployez dans le projet sera toujours plus faible car dans la plupart des cas, cela ne se produira pas.