Язык не важен, он должен соответствовать задаче которую ты решаешь, т.е. ты пишешь не на языке а используя язык. Существует тем не менее некая основа относительно не зависящая от языка. Часто вижу как советуют многотомник Кнута, Кернигана и Ричи, дискретную математику и прочую алгоритмистику. Это конечно полезно, очень. Но на мой взгляд эти книги, хотя и являются фундаментом, являются вполне конкретными источниками по реализации. Фундамент это необходимо, но перед тем как его изучать надо узнать о том какие бывают дома: как они проектируются и строятся.
Надо понимать как ты будешь работать будучи программистом. В сегодняшних реалиях я бы предпочёл термину «программист», термин «разработчик» (developer). Разработчики бывают разные. Можно пилить фреймворки, сайты, мобильные приложения, дрова, операционные системы... (классов приложений и систем существует множество) всё это разные области со своим порогом вхождения, своей методологией и сформировавшимися инструментами. Одно почти всегда верно — работа будет командной.
Другие аноны меня поправят и/или дополнят. Сегодня ПО разрабатывается командами разработчиков. Код хранится централизованно, используется модульный подход, когда разные программисты работают над разными частями проекта. Наиболее популярна сегодня объектно ориентированная парадигма. Стоит сказать, что на определённом слое(layer) приложения целесообразно использовать и другие парадигмы(функциональную например). Некоторые методы иногда переписываются на ассемблере в целях оптимизации и ускорения работы системы. Проект подвергается тестам, а иногда тесты пишутся еще до создания кода(TDD, Agile design). Важно понять, что панацеи не существует.
Тема огромная. Для начала стоит почитать часто рекомендуемый «Совершенный код» Макконнелла. По поводу подходов к разработке можно поискать общую информацию о «* Driven Development»(Test, Domain, Hope, Fear, Aspect, Feature, ...). Стоит понять в общих чертах основные парадигмы программирования(ОО, функциональная, ...).
Спрашивай конкретные вопросы ITT. Анонимус ответит может быть.