Как научиться проектировать ПО?
=================================

 Приветствую. Я программист, выросший на ТЗ-шках, прописанных за меня.   

Хочу научится планировать разработку программ самостоятельно, иначе я сразу берусь писать код и в итоге долго блуждаю в дебрях. Знаю про этапы "задачи-функционал-прототипы-макеты-api-код", но не понимаю границу между ними. Например, не хочется много времени тратить на интерактивные прототипы, когда давно пора начать писать код, и наоборот - писать код с недоработанным прототипом. 

*Главным инструментом проектирования  

программного обеспечения является мозг  

человека, хорошо знакомого с принципами  

проектирования. Это не технология.*  

© Крейг Ларман  
  

Проще говоря, это придёт только с опытом. Несколько ускоряет процесс чтение соответствующей литературы (например [дяди Боба](https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%80%D1%82%D0%B8%D0%BD,_%D0%A0%D0%BE%D0%B1%D0%B5%D1%80%D1%82)) и возможность поработать в большой компании на больших проектах. 

 Проектирование приложений можно условно разбить на 2 уровня:  

1. Уровень проекта.  

Сюда входит понимание того, как приложение должно выглядеть в целом и из каких компонентов состоять, а также по каким принципам оно собирается взаимодействовать с внешним миром (если есть такая необходимость). Компоненты зависят от выбранной архитектуры - в случае монолитного приложения вам требуется понимать, как разбивать его на слои и в чем ответственность каждого слоя; в случае микросервисов вы также должны понимать, как очерчивать зоны ответственности и определять протоколы взаимодействия между ними.  

В вашем случае я думаю вряд ли микросервисы будут актуальны (они для больших проектов), поэтому у вас скорее всего будут небольшие монолитные приложения.  

Книги о том, как проектировать приложения на общем уровне:  

1. Роберт Мартин. Чистая архитектура - очень короткая и простая книга, рекомендую начать с неё.  

2. Эрик Эванс. Предметно-ориентированное проектирование (принципы + стратегические шаблоны).  

3. Мартин Фаулер. Архитектура корпоративных приложений (часть 1).  
  

Уровень 2. Уровень модулей (классов).  

Когда вы спроектировали компоненты, из которых состоит ваше приложение, теперь надо спроектировать их внутренности - то есть разбить на более мелкие и конкретные модули. Тут вам пригодятся принципы объектно-ориентированное проектирования, принципы SOLID, паттерны.   

Книги по уровню 2.  

1. Банда четырех. Приёмы объектно-ориентированного проектирования. Паттерны проектирования. Тут важно не только сами паттерны, но принципы, по которым они строятся. Концентрируйтесь на принципах.  

2. Роберт Мартин. Принципы, паттерны и методики гибкой разработки на языке C#. Тут более подробно рассматривается объектно-ориентированный дизайн и принципы SOLID в сравнении с его "Чистой архитектурой".  

3. Эрик Эванс. Предметно-ориентированное проектирование (тактические шаблоны).  

4. Мартин Фаулер. Архитектура корпоративных приложений (часть 2).   

5. Стивен Макконел. Совершенный код (сконцентрируйтесь на понимании Главного Технического Императива!).  
  

Этих книг вам будет достаточно, чтобы ориентироваться в проектировании приложений, всё остальное решает практика. Рисуйте схемы, концентрируйтесь на ответственности компонентов и их интерфейсах, учитесь отбрасывать ненужные детали реализации. 

 может подойдут книги типа   
  

Agile оценка и планирование проектов, Кон Майк - 2018  

Постигая Agile. Ценности, принципы, методологии, Э.Стеллман, Д.Грин - 2018 

 Для этого надо немного:  

1. Запороть проект, а может и не один, чтобы понять, что не ведёт к решению.  

2. Извернуться ужом, но найти решение, когда никто не может решить проблему, чтобы научиться рассчитывать только на свои силы и не верить остальным, что чего-то сделать нельзя.  

3. Научиться иметь чёткое видение решения, чтобы знать, на каком этапе вы находитесь, когда решаете задачу. 

 Может здесь что то будет полезно <https://github.com/dimaxz/Lectures?files=1>