Consiglio personale:
se ti interessa "solo" imparare a programmare, puoi fare tutto da autodidatta. Puoi tranquillamente arrivare ad un livello medio-alto di competenze esclusivamente studiando da autodidatta, anche se ci vorrà parecchio tempo e dedizione (studiare da soli è più difficile).
Se intraprendi il percorso universitario dovrai studiare un 30-40% di cose inerenti la programmazione e gli algoritmi, e il resto saranno cose che apparentemente non c'entrano una beneamata. Studierai matematica (tanta), fisica, un po' di economia aziendale, gestione di progetti, un po' di elettronica (se fai Ing.) e così via.
Gli studi universitari sono quelli che fanno la differenza tra un programmatore ed un Computer Scientist (se fai Informatica) o Software Engineer (se fai Ing.). In poche parole, le competenze che acquisisci all'uni ti aprono le porte verso la carriera del progettista, e non quella del programmatore.
Volendo schematizzare i vari ruoli, possiamo distinguere le figure in:
- Programmatori: sono diplomati specializzati nella scrittura del codice, partendo da specifiche ben definite. Devono essere in grado di implementare correttamente qualsiasi algoritmo noto.
- Software Engineer: sono laureati specializzati nell'analisi di progetto, si occupano di definire protocolli, architettura e organizzazione di un progetto di grandi dimensioni (il codice deve avere una certa architettura per funzionare correttamente in un sistema complesso). Generalmente sono anche buoni algoritmisti.
- Computer Scientist: sono laureati specializzati nell'analisi di questioni matematiche e algoritmiche, progettano gli algoritmi alla base di operazioni complesse, che vengono poi inquadrati all'interno di un software progettato dall'Ing.
Esistono poi numerose altre figure, che possono specializzarsi in base alle proprie inclinazioni e studi personali, e sono:
- UI / UX designer: non è un programmatore, si occupa di progettare le interfacce utente
- IT Manager / System Administrator: potrebbe non essere un programmatore (ma sono necessarie capacità di scrittura di piccoli script e di interazione con DB), solitamente è un Ing. specializzato nella progettazione di infrastrutture di rete complesse, sicurezza, deployment (installazione) di servizi di rete, ecc...
- Analista: solitamente è anche un Software Engineer, si occupa di dialogare con il cliente per definire specifiche e requisiti di un software, per poi tradurli in un progetto concreto definendone l'architettura.
In Italia ci sono così tanti Ing. informatici che il 90% di essi ripiega nel ruolo di Programmatore, lamentandosi pure della concorrenza dei Programmatori propriamente detti (solitamente diplomati all'ITIS o altri istituti professionali analoghi). Gli Informatici (Computer Scientist) sono molti meno, ma anche noi (si, io studio Informatica, non sono ancora laureato) ripieghiamo a fare da Programmatori per portare a casa la pagnotta.
Nel mio caso specifico, attualmente studio Computer Science, ma faccio il lavoro del Software Engineer (progetto gli algoritmi e l'architettura dei programmi che realizzo) e anche quello del Programmatore. Sostanzialmente me la canto e me la suono
In passato ho ricoperto il ruolo del programmatore semplice. Mi piacerebbe arrivare alla pensione, tra 70 anni circa, con la soddisfazione di aver lavorato almeno un giorno da Computer Scientist

PS: chi si occupa di Hardware non è Ing. Informatica, ma Ing. Elettronica / Microelettronica. Ovviamente un Ing. Informatico deve essere in grado di progettare il firmware di dispositivi a microcontrollore, quindi si studia un po' di elettronica molto all'acqua di rose ("bene che vada" si fanno un paio di materie sull'elettronica di base e digitale, un altro paio su DSP e Microcontrollori, un'altra materia su Embedded Systems Programming).