SPOJ nie jest konieczny :)
Nie da się nauczyć programowania 'teoretycznie' , najlepiej ćwiczyć , do tego są serwisy typu SPOJ albo Codeforces , masz na nich zadania , które żeby zrobić musisz coś umieć , jeśli nie umiesz to się nauczysz . Warto jednak czytać książki, a jak chcesz napisać jakiś program to musisz mieć jego wyobrażenie , co ma robić , napisanie go w jakimś języku to jest ostatnia rzecz :)