È molto importante imparare la matematica a migliorare le tue capacità analitiche e imparare letteratura latina / classica migliorerà le tue capacità di scrittura.
Le persone che hanno progettato quelle lingue hanno pensato seriamente a cosa significa scrivere un programma. E quelle lingue sono i risultati di quelle ricerche.
Detto questo, l'apprendimento di Java ti renderà anche un programmatore migliore. E imparare C. I veri benefici derivano dall'apprendimento di lingue con differenti filosofie. Quindi puoi avere la tua opinione sul modo in cui un programma dovrebbe essere scritto.
Modifica
Mi rendo conto che questa risposta non è così utile per le persone che non hanno ancora imparato haskell e / o lisp. Ecco alcuni esempi per spiegare ulteriormente cosa intendo
LISP
Lisp crede che la sintassi dovrebbe essere minima e che tutto dovrebbe essere una lista o una primitiva (Lisp sta per List Processing). Anche i programmi sono principalmente elenchi contenenti altri elenchi e simboli. Lisp ti consente di manipolare i programmi come elenco e generare nuovi programmi al volo. Da qui l'intero code is data and data is code
motto.
La diretta conseguenza è che le lingue Lisp ti permettono di definire qualsiasi interfaccia tu voglia. Un bell'esempio è Compojure, che è un framework web per clojure. Ecco come appare una funzione di routing
(defroutes app-routes
(GET "/" [] view/page)
(GET "/api" [] (wrap-aleph-handler api/socket-handler))
(route/resources "/static")
(route/not-found "page not found"))
Un altro esempio interessante è il framework di templating:
(html [:ul
(for [x (range 1 4)]
[:li x])])
Come puoi vedere, il risultato è terso come nei baffi della DSL, ma ti consente di utilizzare le funzionalità della lingua come (for [x (range 1 4)] block)
. Ancora più bello, hai tutti gli strumenti per astrarre e strutturare il tuo codice.
In altre lingue, la sintassi è più complessa. Non è possibile leggere un programma Java come un gruppo di elenchi. Ma usando Lisp, si ottiene una migliore idea di come dovrebbe essere l'interfaccia ideale, e cosa nel codice può essere estratto come dati. Ti aiuta anche a vedere la tua lingua preferita come una grande struttura dati e a comprenderne meglio la semantica.
Haskell
Haskell crede nella tipizzazione statica e nella purezza. Le funzioni pure sono come funzioni matematiche: sono definite su un insieme di valori e le mappano su un altro set. La funzione non ha effetti collaterali e i valori sono immutabili. La purezza è interessante perché non è qualcosa che un linguaggio multi-paradigma può avere. Una lingua è pura o no.
Una conseguenza è che non puoi eseguire azioni IO ogni volta che vuoi (haskellers crede che questa sia una buona cosa). Le azioni IO sono definite come transazioni, che sono a loro volta valori puri. Il valore main
di un programma haskell è una transazione IO eseguita quando si esegue il programma.
Devi occuparti esplicitamente del flusso di dati nel tuo programma. Non puoi far comunicare due componenti scrivendo & leggere roba in una variabile globale. Devi costruire e passare valori.
Un'altra caratteristica menzionata da Jimmy Hoffa è il ricco sistema di tipi. Mentre le altre lingue hanno una digitazione statica, in haskell puoi avere cose come:
length :: [a] -> Int
(funzione da un elenco di a ad un int)
map :: (a -> b) -> [a] -> [b]
(funzione che accetta una trasformazione di a to b
e una lista di a, e restituisce una lista di b)
La cosa bella è che non ho bisogno di spiegare cosa realmente fanno quelle funzioni: capisci già il loro comportamento. Inoltre, le funzioni con tali firme non possono in realtà altro che calcolare la lunghezza di un elenco e mappare una trasformazione su un elenco.
In altri linguaggi tipizzati, le gerarchie di classi combinate con la mutabilità rendono l'incubo un problema con questi tipi. Devi capire cose come covarianza e controvarianza, che sono impossibili da ottenere dal punto di vista linguistico (cioè semplice, potente e sicuro).
O prendi il percorso sicuro (come scala) e finisci con un linguaggio molto complesso, oppure prendi il percorso semplice e ottieni qualcosa che è o limitato (google go generics limitato ad elenco e mappe) o non sicuro (dart generics che sono sempre covarianti).
Usando haskell, apprendi principalmente sui vantaggi della purezza e su come scrivere codice puro.