К сожалению, материалов посоветовать не могу, но напишу небольшую заметку из своего опыта.
Первое, ваше приложение/игра/сервис должен быть разбит на логические блоки.
Метод дробления - бизнес-задачи, логически разные задачи, зоны ответственности.
Эти блоки могут быть названы компонентами, модулями, и т.п.
Далее, нужно разбить модули на составные части, еще не классы - скорее "сервисы".
Каждый сервис должен обслуживать одну логическую часть системы, например - обработка платежей, или регистрация пользователей.
Сам сервис может быть представлен целым пакетом классов, библиотек и т.п., главное - у него один вход (интерфейс, класс). Сервисы могут взаимодействовать между собой через внутренне API. Но чем ниже уровень связанности - тем лучше.
Сервис не должен работать с каким либо видом вывода - он должен предоставлять исключительно программный API.
Далее, имея начальную декомпозицию по сервисам - можно дробить далее каждый сервис в отдельности, если это уместно и/или возможно до уровня классов/интерфейсов.
После, вы получаете некий список (на бумаге) модулей, сервисов, классов.
Имея это Вы можете легко начать разработку фронтенда - будь-то контроллеры, обертка в виде REST-api и т.п.
Как организовать морду - отдельный вопрос, и зависит от типа задачи.