Два диаметрально противоположных подхода — либо мы подгоняем систему под реальность, либо подстраиваем тех кто работает с системой под требования, заложенные в систему.
Программисты, по естественным причинам склонны ставить код выше бизнес-требований (потому что он к ним ближе), а потому стараются заложить наиболее жёсткие ограничения по структуре данных.
Введение жёстких ограничений на состояние данных упрощает код, потому что при сокращается количество возможных вариантов работы системы, уменьшается количество проверок в коде.
Такая система наиболее удобна для программиста. Но именно такая система наиболее уязвима к изменениям.
Она хрупка, и постоянно приносит неудобства. Особенно, если программист не понимает источника проблемы.
Когда ты проектируешь систему под реальность (в которой всех обязательных для системы данных может просто не быть в данный момент), то получаешь надёжную, гибкую систему, с которой очень просто и интуитивно работает пользователь.
Но главное, что она позволит тебе решить задачи, которые не решит задавленная ограничениями система.