Mi ci sono voluti 5 anni per ottenere una laurea in scienze informatiche. Certo, un trimestre l'ho passato a lavorare, e molte classi non erano strettamente legate all'informatica.
Direi che qualcuno dedicato con buone capacità di apprendimento potrebbe insegnarsi le cose più importanti in un anno.
Nota che sto assumendo che non stai parlando di come programmare, perché dovresti considerare che ci vorranno molti anni, e non dovresti mai smettere di imparare.
Tornando alla sola scienza informatica...
Imparerei alcuni algoritmi come il funzionamento delle liste collegate, l'ordinamento, gli alberi bilanciati, ecc. Anche se non li codificherai mai, considero l'apprendimento di tali algoritmi come parte di un'educazione informatica equilibrata.
Dovresti imparare le basi dei sistemi operativi. File system, processi, memoria virtuale, sicurezza di base, cosa fa più o meno un kernel, come si parla al sistema operativo con le chiamate di sistema (UNIX è più facile da imparare IMO, rispetto a windows in questo senso). I programmatori possono cercare di essere ignoranti sui sistemi operativi, ma se si incontrano problemi con il proprio programma a causa dell'interazione tra il programma e il sistema operativo, sarà bene conoscere alcune di queste cose. Per esempio, abbiamo dovuto usare l'affinità del processore in un progetto per sintonizzare correttamente la nostra applicazione.
Suggerisco di imparare un po' di linguaggio macchina per sapere come funzionano le CPU. Qualsiasi andrà bene. Diamine, il gioco Human Resource machine non è così lontano dal linguaggio macchina e vi darebbe una piccola idea di come funziona.
Dovreste sapere come i computer fanno matematica, come il complemento a 2, e un po' su come funzionano i numeri in virgola mobile IEEE.
Dovreste capire la notazione big O, cosa significa, e come usarla per valutare gli algoritmi.
Si dovrebbe conoscere la progettazione orientata agli oggetti, i design pattern, e forse anche un po' di programmazione funzionale, perché sembra che ci sia più interesse in questo senso in questi giorni.
Si dovrebbe imparare come valutare le prestazioni dei programmi, ad esempio usando strumenti di profiling.
Si vorrebbe probabilmente capire come funzionano gli allocatori di memoria e come funziona la garbage collection.
IMO, si dovrebbero conoscere i database. MySQL è un buon esempio per imparare, secondo la mia esperienza. SQL può essere importante, ed è usato molto in questi giorni. Memorizzare i dati permanenti dei vostri programmi in "file piatti" è un modo piuttosto antico di fare le cose ora.
Questa non è una lista esaustiva, solo roba che ho imparato lungo la strada e che penso sia utile nella programmazione.