Я думаю надо начать с базовых вещей на которых базируется программирование:
- Дискретная математика базовые понятия
- Теория графов
- Теория конечных автоматов
- Теория кодирования
- Баллистика
- Теория надёжности
- Теория массового обслуживания
С книгами не подскажу, дело в том, что объёмность достаточного материала каждой теме это скорее брошюра чем книга. Я думаю стоит искать не книги, а методические пособия для вузов по этим темам. В приведённом списке сохранена разумная последовательность. Вот например по первым трём пунктам сходу
нагуглил - это неплохо но можно найти изложение и получше.
Тут приятно, что все пункты кроме первого, можете сразу рассматривать через призму разработки игр.
Ну и само базовое программирование:
Турбо Ассемблер Тома Свана - для понимания как всё работает на самом деле (в практическую часть книги можно( и наверное не нужно) сильно не лезть, теоретическая часть достаточно хороша)
"Язык С" Керниган, Ричи - для понимания на каких базовых структурах и типах строятся современные ЯП и чего им это стоит.
Я полагаю, что в это всё стоит поражаться до того момента пока не придёт понимание, что в высокоуровневых языках и средах вы всё равно оперируете базовой математикой и базовыми структурами/типами данных. Т.е. всякие парадигмы, паттерны и т.п. включая языки, после после некоторой практики начнёте рассматривать исключительно как инструменты которые при необходимости можно освоить и использовать.
По алгоритмам: "алгоритмы построение и анализ" Кормена. Кнута мне кажется никто не осилил.