SPOJ kształci jedną z kompetencji dobrego programisty/programistki. Nauczysz się logicznego myślenia, poszukiwania optymalnych algorytmów, samokształcenia oraz tzw. "drążenia tematu" :-)
Pozostają jeszcze zagadnienia OOP czy tworzenia architektur. Tych małych (w obrębie jednego programu) oraz tych większych. Tego SPOJ nie może dać bo trudno tu skonstruować automat jednoznacznie odpowiadający na pytanie jaka architektura jest dobra i do jakich zastosowań. To wymaga własnej pracy nad rozwiązywaniem problemów strukturalnych czyli... projekty :-)
Kolejnym zagadnieniem jest czytelne tworzenie kodu, testów wypracowywania konsensusu i określania sensownego poziomu jakości danych części oprogramowania. Tu bez własnej dyscypliny oraz współpracy w grupie nad tworzeniem złożonej aplikacji, będzie to trudne.
Jeszcze innym zagadnieniem jest poznawanie nowych języków programowania. Im bardziej odległych w filozofii od aktualnych lub aktualnego z którym pracujesz, tym lepiej. Pozwala to nabierać dystansu do "jedynie słusznych rozwiązań bo łatwe w języku X... ". Pozwala także inaczej podchodzić do problemów w języku w którym aktualnie pracujesz. Czyli jeśli znasz C/C++, zapoznaj się z Python'em czy Lispem itp...
Dużo nowych zagadnień pojawia się w trakcie tworzenia oprogramowania w grupie. Tu warto położyć duży nacisk :-)