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