... come posso sviluppare competenze di programmazione che possono essere applicate a tutte le lingue anziché a una sola?
La chiave di questa domanda è di trascendere la lingua e pensare non nella lingua in cui stai codificando.
WAT?
Programmatori poliglotta esperti pensano nell'albero di sintassi astratto (AST) del proprio modello mentale del linguaggio. Non si pensa "Ho bisogno di un ciclo for qui", ma piuttosto "Ho bisogno di fare il loop su qualcosa" e si traduce in quello nel modo appropriato, o while, o iteratore o ricorsione per quella lingua.
Questo è simile a quello che si vede nell'apprendimento di una lingua parlata. Le persone che parlano fluentemente molte lingue pensano il significato e viene fuori in una determinata lingua.
Si può vedere qualche indizio di questo AST nella coppia di video di eyetrack Comprensione del codice con Eye Tracking e Eye-Tracking Code Experiment (Principiante) in cui vengono osservati i movimenti dell'occhio di un principiante e programmatore esperto. Si può vedere il programmatore esperto 'compilare' il codice nel loro modello mentale ed 'eseguirlo' nella loro testa, mentre il principiante deve scorrere la parola chiave codice per parola chiave.
Pertanto, la chiave della questione dello sviluppo delle capacità di programmazione da applicare a tutte le lingue è quella di apprendere più lingue in modo da poter prendere le distanze dall'avere il modello mentale di una lingua e sviluppare la capacità di generare l'AST per un problema da soli in una lingua principale che viene quindi tradotta in una determinata lingua.
Una volta che si ha questa capacità di usare l'AST nella testa, imparare un'altra lingua all'interno di una scuola di pensiero simile (andare a Befunge è un po 'un salto da Java, ma non tanto da Forth ) diventa molto più facile - è "solo" tradurre l'AST in una nuova lingua che è molto più facile il 3 °, 4 ° e 5 ° tempo (ecc ...).
C'è un articolo classico, I veri programmatori non usano Pascal . Parte di questa legge:
... il programmatore reale determinato può scrivere programmi Fortran in qualsiasi lingua
Ci sono anche bit per i quali non puoi semplicemente usare l'AST mentale: devi anche pensare nella lingua. Questo richiede un po 'di tempo per essere realizzato (sono ancora accusato di scrivere il codice Perl in Python e il mio primo codice Lisp è stato rivisto dicendo "Questo è un ottimo programma C.").
Per questo, devo sottolineare un articolo pubblicato da ACM, How Not to Write Fortran in Any Language . Il terzo paragrafo dell'articolo (che non contiene le virgolette iniziali) affronta direttamente la domanda attuale:
Esistono caratteristiche di buona codifica che trascendono tutti i linguaggi di programmazione generici. Puoi applicare un buon design e uno stile trasparente in quasi tutti i codici, se ti applichi ad esso. Solo perché un linguaggio di programmazione ti consente di scrivere un codice errato non significa che devi farlo. E un linguaggio di programmazione che è stato progettato per promuovere il buon stile e il design può ancora essere usato per scrivere codice terribile se il programmatore è sufficientemente creativo. Puoi annegare in una vasca da bagno con un centimetro di acqua e puoi facilmente scrivere un programma completamente illeggibile e non mantenibile in una lingua senza goto o numeri di riga, con gestione delle eccezioni e tipi generici e raccolta dei rifiuti. Sia che tu stia scrivendo Fortran o Java, C ++ o Smalltalk, puoi (e dovresti) scegliere di scrivere un buon codice anziché un cattivo codice.
Non è sufficiente avere l'AST - è necessario avere l'AST che si può tradurre in altre lingue. Avere un AST Fortran in testa e scrivere il codice Fortran in Java non è una buona cosa. Bisogna anche avere abbastanza familiarità con la lingua e i suoi modi di dire per essere in grado di pensare nella lingua (nonostante ciò che ho detto all'inizio).
Ho visto il codice Java scritto da qualcuno che non aveva smesso di scrivere il codice C. C'era un oggetto con un metodo principale. In questo oggetto c'erano un sacco di metodi statici chiamati da main
e classi interne private che avevano campi pubblici (e quindi assomigliavano molto a puntoni). Era un codice C scritto in Java. Tutto ciò che è stato fatto è stato tradurre la sintassi di una lingua in un'altra.
Per superare questo punto, è necessario continuare a scrivere codice in più lingue, non pensare in quelle lingue durante la progettazione del codice, ma pensare in esse quando si traduce la progettazione nel codice per funzionare correttamente con gli idiomi della lingua.
L'unico modo per arrivarci - essere in grado di sviluppare competenze di programmazione che possono essere applicate a tutte le lingue - è continuare a imparare le lingue e mantenere flessibile quella lingua di programmazione mentale piuttosto che legata a una lingua.
(Mi scuso con ChaosPandion per essermi indebitato pesantemente dall'idea che ha presentato .)