У меня с практикой все пришло. Чем дальше - тем больше знаний и понимания того, как работают серьезные проекты.
Во-первых, стоит понять сам технологический процесс. Для сайтов это (очень утрированно и упрощенно): постановка задачи, отрисовка макета, верстка, посадка на движок, допиливание движка. Что касается прикладного ПО, то тут не подскажу.
Во-вторых, почитать книги, статьи по проектированию, изучить практики и подходы к разработке тех или иных вещей.
На самом деле вопрос весьма неоднозначный и сложный.
Какой софт ты хочешь научиться писать? Для чего - заработать или для себя, ради фана?
Когда будет конкретная задача - будет проще. Постепенно у тебя будет накапливаться опыт решенных задач и вопросы, ответы на которые будут тебя приводить в разные области разработки ПО.
После верстки пары проектов начинаешь думать, а нет ли готовых инструментов? И узнаешь, что есть такая вещь, как фреймворк. В частности для верстки - это, например, Bootstrap.