Какие есть рецепты по использованию паттернов?
================================================

 Всем привет,  
  

Я давно занимаюсь разработкой ПО, и с кем бы я ни работал, от начинающих разработчиков и до архитекторов (не Вася-архитектор, а из крупной компании), все работают по принципу прибить гвоздями, а потом когда нужен будет развивать систему, что-нибудь придумаем.  
  

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

На деле немного другое получается. Если стараться проектировать систему на уровне паттернов, получается хорошее решение (т.е. можно безболезненно изменять систему, развивать, поддерживать, и так далее), но на выходе получается решение, которое далеко от принципа KISS, т.е. вместо простого решения получается гибкий монстр, который говорит тебе "я гибкий, я хороший", но от количества сущностей система становится сложной и запутанной.  
  

Я почитал что пишут люди, но мнения разные, от "не используйте паттерны, будет хуже" до "используйте их всегда", и есть кто посередине, "пишите сначала без паттернов, а потом упрощайте систему их внедрением".  
  

Поэтому, какие ваши рецепты по использованию паттернов, когда вы их используете и почему? 

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

Постепенно придете к пониманию, когда их нужно применять и как.   

Просто по книжкам этого понимания не получишь. 

> Я давно занимаюсь разработкой ПО

  

Судя по фразе 
> и я вижу в паттернах решение задач

нет. Вы еще не переболели болезнью джуна, прочитавщего книгу с паттернами  
  

Правильный подход
> все работают по принципу прибить гвоздями, а потом когда нужен будет развивать систему, что-нибудь придумаем.

  
  

> Если стараться проектировать систему на уровне паттернов, получается хорошее решение

нет. Получается решение собранное из паттернов, а не решение задачи  
  

> мнения разные, от "не используйте паттерны, будет хуже" до "используйте их всегда", и есть кто посередине, "пишите сначала без паттернов, а потом упрощайте систему их внедрением".

Все три некорректны  
  

Пишите код, который решает задачи. По возможности, масштабиремый, слабосвязный и тп.   

Главная забота - решение поставленной задачи  
  

А про паттерны можно поговорить на конференция 

 Единственный способ не использовать паттерны, это не писать код. Паттерн это общие механизмы решения задач, встречающихся в программировании, без привязки к синтаксису языка. Если кто-то работает со сложными проектами и при этом говорит что он не использует паттерны - это значит лишь, что он не понимает что такое паттерн или просто не знает названия паттернов, которые он использует. Изучать их я бы рекомендовал в несколько подходов - сначала просто почитать что-то популярное для общего развития, надеясь, что нечто отложится в подсознании. Второй шаг стоит сделать после пары лет работы со сложными проектами и\или фреймворками - читаете, пытаясь понять какие паттерны вы используете сами, какие паттерны используются в вашем любимом фреймворке и т.п., изучаете все их нюансы и разновидности, приучаете себя \ свою команду использовать названия паттернов, вместо пространных описаний где это возможно. Только после познания дзена в первых двух шагах стоит переходить к третьему - изучение незнакомых, непонятных паттернов, при этом вы пытаетесь понять в каком из прошлых проектов этот паттерн мог бы быть применен и какие преимущества он дает по сравнению с решением которое было там. Знание и понимание паттернов позволяет сделать систему настолько простой насколько это возможно, если у вас попытка применения паттернов приводит к появлению лишних сущностей - скорее всего вы просто поторопились с шагом 3.