Думаю, все делают по-разному, но ...
Я почти всегда начинаю с диаграммы классов (обычно в виде UML и на бумаге), уделяя особое внимание отношениям между классами и их арности. На этом этапе валидация в основном пытается понять, имеет ли смысл семантика сущностей высокого уровня вместе.
Затем начните рисовать основные функции, особенно те, которые связаны с совместной работой. Убедитесь, что объекты в сотрудничестве могут достигать друг друга через отношения. На этом этапе я буду использовать инструмент рисования (StarUML).
Затем идут эксперименты с геданкеном. Я мысленно прохожу самые хитрые варианты использования, которые только могу придумать, и вижу, могу ли я представить способ их решения с заданным дизайном. Это не psuedocode, просто пошаговое выполнение каждой из основных задач / функций и следование строкам диаграммы, чтобы убедиться, что я не пропускаю обратные вызовы, циклические зависимости и т. Д.
Я думаю, что один из ключей - не вступать в брак с каким-либо конкретным аспектом дизайна, пока вы не убедитесь, что он, вероятно, будет работать достаточно хорошо. На мой взгляд, если вы не можете мысленно пройти дизайн, чтобы оценить / проверить его, вам либо не хватает понимания проблемы, либо дизайн на бумаге недостаточно завершен ...
Затем, если позволит время, отложите его и посмотрите, сможете ли вы придумать что-то действительно другое ...