Начинается всё на листке бумаги. Если проектируешь один, то никаких формальных схем описания придерживаться не нужно. Просто так, чтобы самому было понятно, что и как.
Подхода два - от интерфейса к логике или наоборот - от логики к интерфейсу. Что лучше, что хуже - вкусовщина. От интерфейса к логике получается немного более по "KISS-овски" и "YAGNI-вски", так как накидываешь только те фичи, которые хочешь реализовать. От логики к интерфейсу работать тоже можно, но тут есть риск уйти в преждевременную оптимизацию.
Дальше логика разбивается на блоки задач и модели данных. К моделям определяешь, какие действия с ними надо будет совершать - так определяются методы. Здесь же определяешь сигнатуры этих методов (параметры, их типы, возвращаемые значения). Если проект крупный - то тут уже неплохо было бы UML схемку набросать.
После того, как определил иерархию классов, можно уже запускать IDE и сразу создать определения всех классов которые ты нарисовал на бумаге. В каждом классе рисуешь заглушки методов (можно сразу помечать комментарием TODO, чтобы ничего не опустить).
Дальше часть, которую не любят - пишешь юнит тесты, которые определяют, как какой метод должен себя вести, чтобы ничего не сломать (ну да, я знаю, тесты для неуверенных в себе слабаков, но всё-таки, это важно).
Ну вот уже после всего этого, начинай писать код. Тебе будет легко и приятно. Ты будешь примерно представлять, сколько ты уже сделал, и сколько ещё осталось. Баги будут вылавливаться тестами, и ты не будешь писать лишний код, которым никто не будет пользоваться в дальнейшем.