ну сначала
- арифметические основы вычислительной техники
- дискретная математик
- курс математики
- курс физики
- архитектура ЭВМ
- теория алгоритмов
- ...
Тогда вопрос не будет
Книги читайте, того же Шилтда
Пробуйте решать там задачи, по мере обучения
http://acm.timus.ru/
Нужно много практики, в чужой код не смотрите, нужно развивать понимание, мозг должен работать. Java плохой язык для обучения, с++ лучше