Как вы выбираете из множества решений то, которое в итоге реализуете?
=======================================================================

 Добрый день!  

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

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

Второй/Третий способ обычно более читабельный, но я начинаю задумываться о его эффективности. Возможно, стоило добить первую идею, она была лучше и т.д...  

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

 Это вряд ли возможно формализовать. Один из подходов: KISS — keep it simple. Выбираю самое простое решение, потому что, пока оно дойдет до production, требования 10 раз поменяются (и еще 10 раз поменяются уже после внедрения), а простое решение и проще реализовать и проще переделать. Но это только одна из эвристик.  
  

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

Иногда по мере того, как делаешь задачу, понимаешь, что ее можно сделать совсем иначе, при этом получится проще и эффективнее. Ничего страшного нет: с самого начала продумать идеальное решение не может никто.  
  

В жизни нет готовых рецептов на все случаи. Жизнь вообще не поддается формализации. 

 ИМХО. Только опыт, со временем перестанете задумываться об этом и будете делать уже на автомате. 

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

А реализовывать нужно в первую очередь работающий вариант. Если есть время и желание, оптимизировать можно всегда и потом - оптимизировать заранее не нужно. 

 На начальном этапе - не париться об этом. Все равно идеально не сделаете. Крутите велосипед - с опытом его улучшите и поймёте что правильно.  

Вариант есть - спросить о реализациях старшего разраба. Если таковой есть. Описать ему все варианты реализации и он объяснит где у какого минусы-плюсы.  
  

Просто пишите, читайте, вникайте. Со временем всё придёт. 

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

Если оно почему-то не подходит (древний/глючный/тормозной говнокод, на который стыдно смотреть, например), то ищется либо более производительное, либо универсальное/гибкое, либо какая-то новинка для попробовать. Не обязательно в таком порядке, зависит от проекта.