Что должен знать любой программист помимо изучения языка программирования?
Меня всегда поражали люди, которые не имея вообще никаких знаний сразу выбирают себе область и составляют обширный план, начинающийся с ООП, имеющий в середине бд, и заканчивающийся переменными.
Нет, чисто теоретически, изучить всю абстрактную теорию в таком порядке можно... Но на практике это нереально.
Я программировал 3 года в школе. Потом 5 лет в универе. И только к концу 4 курса я понял, что хочу работать в сфере мобильной разработки. До этого меня штырило от всего - OpenGL? Дайте два, будем пробовать. Cuda? Пофиг, что видюха ноута не поддерживает, почитаю пока, потом когда-то забахаю. Lisp? Круто, выносит мозг. Компиляторы? Круууто, магия, хотеть, пишем свой! И так далее, и тому подобное. Я отдавался каждому языку, который встречался на пути.
Так что подумайте, правда ли вы знаете всё об этой сфере и о других, чтобы понимать, где вы хотите работать.
Вначале нужны алгоритмы. Любая программа это алгоритм. Нужно понимание архитектуры ЭВМ. Нужно хотя бы базовое понимание ОС. Нужны знания в каком-то языке. Лучше в двух-трёх. Потом всё прикладное. БД, фреймворки, паттерны и прочее.
Продолжайте писать код.
Присоединитесь к свободным проектам. Скиллы прокачаете, и пользу принесете. 
Фаулера почитайте. С практикой это будет очень полезно.