@MAW non esagera
Ma, insomma, se ad uno piace l'idea di programmare, e' un lavoro come un'altro.
Per quanto riguarda il percorso di studio, ti posso dare alcune indicazioni di massima.
ASSIOMA: il linguaggio di programmazione e' SOLO UNA PICCOLA parte delle conoscenze che un programmatore deve conoscere.
Facendo un paragone con una lingua parlata, ad esempio l'Italiano, il linguaggio di programmazione e' la grammatica.
Le librerie di funzioni che uno deve usare per scrivere il programma, il vocabolario.
Ora conoscere grammatica e vocabolario non implica automaticamente sapere parlare in italiano, essere uno scrittore di libri gialli, di poesie o di storia/matematica/...
Per questi ultimi serve una competenza specifica che deve essere tradotta opportunamente in Italiano.
Lo stesso discorso vale per il linguaggio di programmazione: questo e' SOLO lo strumento che serve per dire al computer che cosa deve fare.
Ma che cosa deve fare il computer lo devi avere chiaro in testa tu.
Parte prima: per quato riguarda i linguaggi di programmazione, la questione e' abbastanza complicata.
Si possono fare alcune classificazioni di massima:
1) linguaggio compilato vs interpretato: il primo e' generalmente molto piu' efficiente del secondo, anche se oggi ci sono i cosidetti Just In Time Compiler che, partendo da un linguaggio interpretato, compilano al volo pezzi di codice per rendere l'esecuzione piu' efficiente.
2) linguaggi con gestione manuale della memoria vs gestione automatica: la gestione della memoria usata da un programma e' sempre stato una brutta bestia, sopprattutto quando veniva data in mano a bamboccioni che di programmazione non ci capivano un'accidente. A fronte di questo problema, MA ANCHE a fronte di un'effettivo miglioramento nelle performance di un'applicazione, tutti i linguaggi moderni sono stati progettati con la gestione della memoria automatica. Ovviamente questa soluzione non e' la panacea di tutti i mali, ma di sicuro risolve il 95% delle stupidaggini scritte dal programmatore medio.
3) linguaggi non tipati vs linguaggi con il supporto dei tipi: in un linguaggio con il supporto dei tipi di dati, ogni variabile ha un tipo e puo' ricevere SOLO valoro di quel tipo. Questo, insieme al fatto che in generale queti linguaggi sono compilati, permette di identificare le castronate scritte dal programmatore medio direttamente in fase di compilazione, e NON in fase di esecuzione. Il problema di scoprire l'errore in fase di esecuzione del programma e' che potrebbe capitare che quell'errore non capita fino a quando non si consegna il lavoro al cliente il quale, appena lancia il programma, gli si schianta in faccia
I linguaggi senza una gestione dei tipi sono generalmente linguaggi interpretati, ma permettono di scrivere delle cavolate che potrebbe essere decisamente complicate scoprire.
Secondo alcuni (a mio avviso assolutamente incompetenti), questi tipi di linguaggi sono piu' facili da imparare, nel senso che si imparano in meno tempo. Assolutamente vero, ma e' anche altrettanto vero che non c'e' nessuno che dice al programmatore alle prime armi: guarda bamboccione, che hai scritto una castronata immane!!! Con la conseguente nascita e proliferazione dei bamboccioni
E questa e' la prima parte della storia.
Parte seconda: attualmente, la maggior parte dei lavori in campo informatico hanno a che fare con il Web.
Un'applicazione Web e' formata da DUE parti:
1) la parte SERVER, cioe' il software che gestisce il portale e che consegna le pagine HTML al browser Internet che usi anche in questo momento
2) la parte CLIENT, cioe' la pagina HTML ricevuta dal tuo browser e con cui interagisci.
FIno a qualche anno fa, la generazione della pagina e buona parte della sua gestione, veniva fatta lato SERVER con linguaggi quali PHP, Java, C# (ce ne sono anche altri, ma mi fermo a quelli piu' conosciuti).
Solo una piccola parte della gestione della pagina veniva fatta direttamente lato CLIENT, mediante JavaScript.
Ultimamente (e direi finalmente), i due mondi si stanno separando in modo molto deciso: la potenza dei computer, assieme all'interprete JavaScript, integrato in ogni browser Internet (IExplor, Edge, Firefox, Opera, Safari, ...) sempre piu' efficiente ha fatto si che l'applicazione CLIENT puo' essere realizzata TOTALMENTE lato client in HTML+CSS+JavaScript.
Mentre il SERVER si sta' riducendo ad un semplice fornitore di FILE o di risultati di un'elaborazione, in un formato standard chiamato JSON.
Le applicazioni scritte in questo modo sono dette SPA - Single Page Application.
Ovviamente nemmeno questo approccio e' e sara' la panacea di tutti i mali.
Continueranno ad esistere (anche perche' ci sono decenni di sviluppo alle spalle) applicazioni scritte mescolando in modo orribilante i due lati del cielo
Conclusione: quindi per poter acceder al lavoro di programmatore, al giorno d'oggi devi avere un po' di competenze per poter intervenire su ENTRAMBI i fronti (CLIENT e SERVER).
La fortua vuole, come dicevo prima, che, almeno inizialmente, puoi mantenere TOTALMENTE separati i due mondi.
Quindi, lato CLIENT devi studiare HTML, CSS, JavaScript e qualche libreria di uso praticamente FONDAMENTALE come jQuery, Bootstrap e Backbone. Poi potrai passare a AngularJS e ReactJS.
Nota: JavaScript e' un linguaggi INTERPRETATO NON TIPATO, CON GESTIONE AUTOMATICA DELLA MEMORIA, con pro (pochi) e contro (decisamente tanti) che questo comporta.
Ma de facto e' il linguaggio del Web (NON ESISTONO alternative)
Invece lato SERVER, ci sono DUE piattaforme che vanno per la maggiore:
1) Java, e il suo framework (J2SE, J2EE) di Oracle (nato Sun Microsystem), e, a pari merito
2) C# e il framework .NET (leggi dot NET, il punto non e' a caso ) di Microsoft.
Cosa buona di questi framework e' che sono general puprose, cioe' ci puoi scrivere applicazioni Web, giochi, programmi di musica, ecc... Qualunque cosa.
Con quale dei due iniziare?
Taglio la testa al toro: Java.
Non perche' C#/.NET non sia valido, ma perche' Java e' un framework decisamente meglio progettato, piu' coerente, e' multipiattaforma (funziona allo stesso identico modo sotto Windows, Linux, Mac OSX) e a me piace decisamente di piu' (pur conoscendo molto bene anche .NET !!!)
Nota: sia C# che Java sono linguaggi COMPILATI, TIPATI, CON GESTIONE AUTOMATICA DELLA MEMORIA
I grandi esclusi
Ho escluso alcuni linguaggi di programmazione per i motivi che sto' per indicare.
C: il linguaggio C e' un linguaggio datato, con cui e' possile fare solo programmazione procedurale, al contrario di tutti gli altri con cui si fa programmazione ad oggetti (il paradigma di programmazione che va per la maggiore al momento, MA NON l'UNICO che un buon programmatore deve conoscere). Inoltre ha la gestione MANUALE della memoria
C++: il C++ e' un SIGNOR linguaggi di programmazione, ma decisamente complesso. E' ad oggetti, compilato, tipato, ma necessita della gestione manuale della memoria. Ci sono N-mila trucchi per semplificare la vita al programmatore in tal senso, ma in ogni caso richiede una precisa e profonda conoscenza delle tecniche di programmazione. Personalmente, visto le alternative decisamente piu' abbordabili, lo sconsiglio.
PHP: e' un linguaggio nato SPECIFICATAMENTE per applicazioni WEB realizzate in quel modo orrendo ed ibrido che dicevo prima. E' INTERPRETATO, NON TIPATO, CON GESTIONE AUTOMATICA DELLA MEMORIA. Inoltre l'applicazione deve NECCESSARIAMENTE essere una pagina Web, anche su uno volesse scrivere semplicemente "Ciao Mondo" (in inglese "Hello World" su console!
Inutile, per uno che si avvicina alla programmazione per la prima volta.
Python: e' un linguaggio INTERPRETATO, NON TIPATO, CON GESTIONE AUTOMATICA DELLA MEMORIA, con una sitassi abbastanza strana. Inizialmente non mi piaceva, ma avendoci dovuto avere a che fare per forza, assieme ad un OTTIMO IDE, sono riuscito a digerirlo. E' un linguaggio ad oggetti, con cui e' possibile fare anche programmazione procedurale.
Viene usato fondamentalmente in ambito scientifico per la realizzazione di script.
Praticamente sconosciuto nel mondo commerciale.
Minimamente accettabile per un uso casalingo e per divertimento, inutilizzabile per applicazioni complesse.
Poi ci sono N-mila altri linguaggi (Ruby, ...) ma al momento non vale la pena prenderli in considerazione.
Note finali: come dicevo, questa e' solo la parte SEMPLICE della questione.
Al giorno d'oggi, alcune conoscenze SONO OBBLIGATORIE per poter sviluppare software.
Al minimo:
1) che cosa e' e come funzione un database relazionae ed il relativo linguaggio di interrogazione SQL (Structured Query Language)
2) programmazione parallela/concorrente: il piu' banale dei PC attualmente ha 2 core. I server professionali ne hanno anche 64.
Il che vuol dire che scrivere un'applicazione monothread, alla maniera degli anni 60, sfrutta 1/100 delle possibilita' dell'hardware
3) protocolli di rete. Il WEB si basa al 200% sul concetto di rete e relativi protocolli di comunicazione. Al minimo HTTP (l'infrastruttura base del WEB), FTP (trasferimento file), SMTP (invio posta), POP3 (ricezione posta) sono quelli piu' conosciuti
4) programmazione ad eventi: tutte le interfacce utente, ed anche le pagine WEB, usano pesantemente questo paradigma di programmazione per poter essere responsive pur utilizzando un minimo di risorse hardware.
Naturalmente questa e' una infinitesimamente corta lista di competenze che un programmatore deve avere.
Mettiamola in un'altro modo:
1) un programmatore mediocre ha studiato su qualche decina di libri di testo
2) un buon programmatore ha studiato su 100/200 libri di testo
3) un ottimo programmatore puo' sforare abbondantemente i 400!
Ci sara' sicuramente qualcuno piu' autorevole che potra' fornirti delle perle di saggezza di incomensurabile valore!