В общем пиши программы и все. Пока сам не прочувствуешь все проблемы костылей, которые ты в свой код впихиваешь из-за изменяющихся требований заказчика, пока сам не дойдешь до шаблонов проектирования, ты их никогда и не поймешь и не сможешь применять. Лично до меня недавно только дошла польза написания тестов, когда твоим кодом пользуется 3000 человек и внесение небольших изменений, может обернуться месяцем ада в тех поддержке из-за мелкого бага.
все приходит с опытом. если у тебя не получаются более-менее крупные проекты, то начинай с небольших. если ты и их не сможешь довести до конца значит это не твое. программирование требует упорства, терпения и усидчивости.
Можно тему закрывать. Отдельное спасибо гарику, нашел проблему в себе(Анализ, тз и проектирование) http://metod.ce.cctpu.edu.ru/edu/df/se/books/software_engineering.pdf кому интересно