Come posso essere sicuro di imparare effettivamente come programmare piuttosto che semplicemente apprendere i dettagli di una lingua? [chiuso]

81

Spesso sento che un vero programmatore può facilmente imparare qualsiasi lingua in una settimana. Le lingue sono solo strumenti per fare le cose, mi è stato detto. La programmazione è l'ultima abilità che deve essere appresa e padroneggiata.

Come faccio a essere sicuro che sto imparando come programmare invece di imparare semplicemente i dettagli di una lingua? E come posso sviluppare abilità di programmazione che possono essere applicate a tutte le lingue invece di una sola?

    
posta Ryan 10.10.2013 - 18:49
fonte

11 risposte

96

Non preoccuparti di incontrare qualche ridicolo concetto di "abilità" così comunemente sentito in affermazioni come:

  • Tutti i linguaggi di programmazione sono fondamentalmente uguali.
  • Una volta che hai raccolto bene una lingua, puoi prendere qualsiasi altra lingua in modo rapido e semplice.
  • Le lingue sono solo strumenti, c'è un po 'di magia del cervello che crea il software.

Queste dichiarazioni sono tutte basate su premesse errate e tradiscono la mancanza di esperienza in un ampio spettro di linguaggi di programmazione. Sono dichiarazioni molto comuni e strongmente credute da una grande schiera di programmatori, non lo contesterò, ma contesterò la loro accuratezza.

Questo è dimostrato semplicemente: Spendi una settimana (o davvero una quantità di tempo maggiore di un paio di giorni) cercando di imparare i fondamenti di Haskell , Prolog o Agda . Presto inizierai a sentire nella tua testa il vecchio Sesame Street "Una di queste cose non è come le altre. .. ".

A quanto pare, c'è un'intera gamma di linguaggi di programmazione, tecniche e approcci che sono così estranei da ciò che il 95% di noi fa o ha mai fatto. Molti sono completamente inconsapevoli dell'esistenza di uno qualsiasi di questi altri concetti, il che va bene e questi concetti non sono necessari per essere un programmatore dipendente e persino efficace.

Ma il fatto rimane: queste tecniche e approcci esistono, sono validi per molte cose diverse e possono essere molto utili, ma non sono come quelli a cui sei abituato e le persone non possono semplicemente prenderli con un pomeriggio di giocherellare.

Inoltre, direi che la maggior parte dei casi in cui le persone dichiarano di avere o possono imparare cose così complesse come i linguaggi di programmazione così rapidamente come una settimana, soffrono di un po 'di Durante effetto Kruger , Wikipedia (enfasi mia):

The Dunning–Kruger effect is a cognitive bias in which unskilled individuals suffer from illusory superiority, mistakenly rating their ability much higher than average. This bias is attributed to a metacognitive inability of the unskilled to recognize their mistakes.

Riferirò le persone a questa perview più esperta sul concetto di apprendimento da programmare di Peter Norvig: Impara a programmare in dieci anni .

Researchers (Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973)) have shown it takes about ten years to develop expertise in any of a wide variety of areas, including chess playing, music composition, telegraph operation, painting, piano playing, swimming, tennis, and research in neuropsychology and topology. The key is deliberative practice: not just doing it again and again, but challenging yourself with a task that is just beyond your current ability, trying it, analyzing your performance while and after doing it, and correcting any mistakes. Then repeat. And repeat again.

Sicuramente, esiste una serie di principi generali che renderanno tutte le lingue facili da imparare!

Forse, ma direi che questo insieme di principi è così ampio che ci saranno quasi sempre lingue al di fuori della tua portata di una settimana. Man mano che aggiungi nuovi concetti all'elenco che ti è familiare e comodo, questo elenco di lingue al di fuori della tua portata immediata potrebbe ridursi, ma ho difficoltà a credere che andrà sempre via. L'elenco degli approcci informatici concettuali alle cose è così vasto da risultare sconcertante, dalle lingue concatenative a lingue basate su vettori per le lingue specializzate in AI o < a href="http://en.wikipedia.org/wiki/Metaprogramming"> metaprogramming ( o lingue che esistono interamente per supportare regolarmente espressioni ).

Dopo dieci anni sarai in grado di programmare in generale. Ciò significa che puoi scrivere un codice piuttosto decente in una lingua o in uno stile di lingue. Quindi, dopo 10 anni, sei pronto per iniziare ad affrontare questi innumerevoli concetti trasversali per il resto della tua vita, e non sei Edsger W. Dijkstra , Donald Knuth o John D. Carmack , non hai intenzione di raggiungerli tutti.

    
risposta data 10.10.2013 - 19:23
fonte
51

... how can I develop programming skills that can be applied towards all languages instead of just one?

La chiave di questa domanda è di trascendere la lingua e pensare in non alla lingua in cui stai codificando.

WAT?

I programmatori esperti poliglotta pensano nel albero sintattico astratto (AST) del loro modello mentale della lingua. Non si pensa "ho bisogno di un ciclo for qui", ma piuttosto di "ho bisogno di ripetere il ciclo su qualcosa" e lo traduco all'appropriato per, o mentre, o iteratore o ricorsione per quella lingua.

Questo è simile a ciò che si vede nell'apprendimento di una lingua parlata. Le persone che parlano molte lingue pensano fluentemente il significato , e ne esce in una determinata lingua.

Si può vedere qualche indizio di questo AST nella coppia di video eyetracking Comprensione del codice con Eye Tracking e Esperimento del codice di tracciamento degli occhi (Novice) dove i movimenti dell'occhio di un programmatore principiante ed esperto sono osservati. Si può vedere il programmatore esperto 'compilare' il codice nel proprio modello mentale e 'eseguirlo' nella propria testa, mentre il principiante deve iterare sul codice parola chiave per parola chiave.

Quindi, la chiave della domanda sullo sviluppo delle abilità di programmazione da applicare a tutte le lingue tutte è quella di imparare più lingue in modo che ci si possa distanziare dall'avere il modello mentale di uno lingua e sviluppare la capacità di generare l'AST per un problema da soli in una lingua di testa che viene poi tradotta in una determinata lingua.

Una volta che si ha questa capacità di usare l'AST nella testa, imparando un'altra lingua all'interno di una scuola di pensiero simile (andando a Befunge è un po 'un salto da Java, ma non tanto da Forth ) diventa molto più facile - E '' solo 'tradurre l'AST in una nuova lingua che è molto più facile la 3a, la 4a e la 5a (ecc ...) ora è fatta.

C'è un articolo classico, I veri programmatori non usano Pascal . Una parte di questo dice:

... the determined Real Programmer can write Fortran programs in any language

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 aver scritto il codice Perl in Python e il mio primo Lisp codice è stato esaminato dicendo "Questo è un ottimo programma C.").

Per questo, devo segnalare un articolo pubblicato da ACM, Come non scrivere Fortran in Qualsiasi lingua . Il terzo paragrafo dell'articolo (che non riporta citazioni) affronta direttamente la domanda in questione:

There are characteristics of good coding that transcend all general-purpose programming languages. You can implement good design and transparent style in almost any code, if you apply yourself to it. Just because a programming language allows you to write bad code doesn’t mean that you have to do it. And a programming language that has been engineered to promote good style and design can still be used to write terrible code if the coder is sufficiently creative. You can drown in a bathtub with an inch of water in it, and you can easily write a completely unreadable and unmaintainable program in a language with no gotos or line numbers, with exception handling and generic types and garbage collection. Whether you're writing Fortran or Java, C++ or Smalltalk, you can (and should) choose to write good code instead of bad code.

Non è sufficiente avere l'AST - è necessario avere l'AST che si possa tradurre in altre lingue. Avere un Fortran AST nella tua testa e scrivere codice Fortran in Java non è una buona cosa. Bisogna anche essere abbastanza familiari con la lingua e i suoi idiomi per poter pensare nella lingua (nonostante quello che ho detto in cima).

Ho visto codice Java scritto da qualcuno che non aveva smesso di scrivere 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 ai montanti). 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 quando si progetta il codice, ma pensare in loro quando si traduce il disegno nel codice per lavorare con gli idiomi della lingua correttamente.

L'unico modo per arrivarci - essere in grado di sviluppare competenze di programmazione che possono essere applicate a tutte le lingue - è continuare ad apprendere le lingue e mantenere quel linguaggio di programmazione mentale flessibile piuttosto che collegato a una lingua.

(Le mie scuse a ChaosPandion per aver preso a prestito pesantemente da l'idea che ha presentato .)

    
risposta data 10.10.2013 - 21:26
fonte
12

Scegli una lingua e inizia la codifica. Python è una buona scelta per un principiante e ci sono tutorial disponibili online , in modo che tu possa imparare come farlo correttamente.

Tutto segue da quello. I tuoi interessi ti porteranno a framework e concetti di progettazione che aggiungeranno sofisticazione ai tuoi programmi. Scoprirai che ci sono corsi online che puoi seguire che ti aiuteranno a conoscere i fondamenti e la teoria, e che ci sono diversi paradigmi di programmazione che puoi esplorare, e così via.

E sì, scoprirai lingue come Haskell che ti insegneranno qualcosa di nuovo, una volta che avrai una solida base nei fondamenti.

Probabilmente alcuni programmatori pensano che tutte le lingue siano le stesse perché non sono state esposte a nessuno che le faccia pensare in modo diverso. Tutti i linguaggi più comunemente usati derivano dall'Algol (sono essenzialmente linguaggi procedurali), e di questi, la maggior parte sono linguaggi ricci-brace simili a C. Tutti fanno essenzialmente le stesse cose, anche se alcuni con più sofisticazione di altri.

    
risposta data 10.10.2013 - 19:20
fonte
5

La programmazione riguarda la risoluzione dei problemi in modo tale che la soluzione possa essere espressa in una grammatica così ristretta da poter essere implementata con un linguaggio di programmazione. L'arte della programmazione è quindi l'arte di risolvere i problemi.

Alcune lingue invitano altri paradigmi di programmazione come l'orientamento agli oggetti, basato su eventi, multi-thread e framework MVC. Questi sono solo modelli e schemi e non hanno nulla a che fare con l'implementazione.

Se puoi sederti e risolvere un problema su carta in modo tale che possa essere facilmente tradotto in codice ed è associato ad un modello appropriato per la tua piattaforma, allora sei un programmatore. Se tutto ciò che puoi fare è prendere quelle soluzioni e implementarle nella nostra lingua scelta, quindi è un'altra questione.

Ho programmato per 30 anni (OMFG!) e uso ancora php.net per cercare i comandi in PHP perché non è la mia prima lingua.

Direi che l'esperienza nelle lingue è inversamente proporzionale alla frequenza con cui si guarda al manuale o allo stackoverflow. La competenza nella programmazione è la capacità di risolvere prontamente i problemi in modo compatibile con i linguaggi di programmazione dei computer.

Nelle notizie correlate, ho appreso Ruby la settimana scorsa. Anche se non sono un "esperto", posso risolvere un problema che potrei scrivere in Perl, per esempio, e poi passare un'età traducendolo in Ruby mentre lo imparo ancora.

    
risposta data 11.10.2013 - 00:09
fonte
3

Penso che, come in ogni cosa, la pratica sia perfetta. Basta non incasellare te stesso a fare sempre la stessa cosa o usare sempre la stessa lingua e continuare a imparare cose su ogni progetto.

Penso che si possa facilmente tracciare un parallelismo con qualcosa come imparare a suonare una chitarra. Qualsiasi bravo musicista può imparare a suonare una nuova canzone in un brevissimo periodo di tempo, perché conosce già tutti gli accordi e tutte le teorie sul perché gli accordi sono suonati come sono. Come ottengono quello buono? Hanno appena suonato così tante canzoni che tutti i pattern si sono appena mescolati, mentre allo stesso tempo hanno integrato le loro conoscenze con la teoria documentata che anche questi modelli si iscrivono.

Quindi forse puoi suonare alcune canzoni molto bene, ma non puoi deviare o ritirare nuove canzoni velocemente. Questo è probabilmente l'equivalente di un .NET programmatore che continua a fare lo stesso CRUD applicazione più e più volte, a un certo punto provare qualcosa di nuovo, aggiungere alcune chiamate al servizio web o un'interfaccia utente avanzata, o scriverlo in un intero nuovo linguaggio. Quando cerchi di capire come mai le cose accadono come fanno, fai domande su Stack Exchange, ecc. Alla fine, vedrai tutti gli schemi che emergono continuamente e conosci parte della teoria sottostante e imparerai una nuova lingua non sembra quasi scoraggiante.

    
risposta data 10.10.2013 - 18:56
fonte
1

Non ho intenzione di indicare quanto tempo ci vuole per imparare una lingua o che cosa significa imparare una lingua, invece vado ad affrontare il tuo problema attuale: come determinare se hai imparato a programmare o hai imparato un linguaggio di programmazione.

Hai imparato a programmare se hai imparato a suddividere un problema in processi discreti e poi a usare quei processi per risolvere il tuo problema. Hai imparato una lingua in fase di programmazione se hai imparato la sintassi di una lingua e sai come regolare il funzionamento di un processo, se implementato in quella lingua.

Questo non vuol dire che dovresti programmare in Fortan quando usi Lisp o sommare i valori di una colonna in una tabella in un db usando un cursore. Solo che la lingua è un dettaglio di implementazione. Uno che può cambiare i processi necessari, ma non la necessità di identificare e creare processi - alla fine c'è un'implementazione del mondo reale, con input / output e risultati desiderati.

    
risposta data 11.10.2013 - 05:24
fonte
1

La mia strategia è sempre stata quella di concentrarsi sulle abilità pure piuttosto che sulle abilità specifiche.

Invece di imparare la sintassi speciale di Python (o di qualsiasi lingua) per qualunque cosa tu voglia, passi i tuoi cicli cerebrali a risolvere problemi astratti, come risolvere al meglio ogni problema in quella categoria.

In questo modo, saprai cosa fare indipendentemente dalla lingua e possiederai per lo più abilità senza tempo che possono essere utilizzate per la programmazione in qualsiasi lingua.

In particolare, evita gli strumenti pieni di trucchi, come MySQL o linguaggi supponenti, come Java, poiché qualsiasi cosa tu apprenda usando questi strumenti avrà una grande percentuale di conoscenza specifica degli strumenti che è destinata a diventare inutilizzabile abbastanza velocemente.

Contrariamente a quanto è stato detto in molte risposte, NON ascoltare altri programmatori, Sei un noob e non c'è modo di dire il falso dal vero affare, quindi è meglio prendere tutto con un cucchiaio di sale.

Vuoi essere sempre in discussione e accettare solo quando la soluzione è veloce, elegante e affidabile.

    
risposta data 11.10.2013 - 08:26
fonte
0

C'è l'approccio teorico. Scopri come funzionano i computer sotto la copertina. In che modo le istruzioni di base del processore sono riunite per rendere più complesse le operazioni e le strutture che diamo per scontate in terreni di programmazione di alto livello.

Poi c'è l'approccio alla programmazione più pratico. Il principale punto critico che affligge le persone etichettate come "non buoni programmatori" è che conoscono solo un una lingua. E anche se ne conoscono altri, li programmano nello stesso modo in cui lo fanno con la loro lingua nativa . Questo è un ciclo da interrompere se vogliono davvero imparare a programmare. La risposta predefinita è imparare almeno una lingua da ogni paradigma di programmazione. Quindi impara un linguaggio OOP, un linguaggio funzionale, un linguaggio di scripting ... ecc. E imparando non intendo l'apprendimento della sintassi . Impari una lingua usandola effettivamente per creare qualcosa.

Personalmente, quando voglio imparare una nuova lingua, utilizzo i puzzles di Project Euler . Vado a un puzzle che ho già risolto in un linguaggio OOP (ad esempio) e cerco di risolverlo usando un approccio funzionale mentre cerco di seguire le migliori pratiche del nuovo linguaggio. Quando risolvi lo stesso problema usando due approcci fondamentalmente diversi, non solo vedi quali sono le differenze reali, ma ti mostrano anche dove sono le aree comuni. Queste aree comuni che sono condivise da tutte le lingue è la vera programmazione , le differenze sono solo modi diversi per realizzarlo.

    
risposta data 10.10.2013 - 19:08
fonte
0

Bene, la maggior parte delle cose che volevo dire è già stata detta. Quello che vorrei aggiungere è un'analogia molto semplice.

Se i linguaggi di programmazione sono considerati semplici strumenti, anche in questo caso non c'è assolutamente alcuna logica nell'essere bravi a fare in modo di essere bravi in un altro modo.

Just consider a bunch of reputed master swordsmen, suddenly put down their swords and went off to battle with spears after 7 days training. What would happen? They would be massacred.

Le lingue spesso non sono difficili da imparare, ma ci vuole pazienza ed esercizio per essere bravi a farlo. Inoltre, non esiste un metodo giusto per apprendere la programmazione.

Learning a programming is like playing an RPG game. Sometimes you use swords, sometimes spears, sometimes a shield. Each enemy you kill, you get experience points. Once you have enough experience points, you level up. Now mastering a sword will not make you excellent with bows and arrows. But a portion of the experience you gained previously will increase your stamina and speed.

Ecco un paio di cose che potresti voler fare quando apprendi una lingua.

  • Leggi informazioni sulla lingua. se sembra interessante, prova le app di Hello Hello World.
  • Leggi alcuni tutorial, trucchi, blog.
  • Crea app semplici solo per divertimento.
  • Prova diverse funzionalità.
  • Se ti piace davvero, acquista alcuni libri e / o tutorial video.
  • Ricerca di buone librerie.
  • Cerca le risposte, chiedi solo se non riesci a trovare le risposte.
  • Aiuta gli altri a chiedere risposte (dove meglio di qui?)
  • Fai qualcosa di utile. Realizzare un'app per calcolatrice può essere un buon esercizio, ma se crei un'app TO-DO list e in effetti utilizzi sul tuo PC / Telefono, la sensazione è 100 volte soddisfacente.

Prova nuove lingue, esplora nuove biblioteche, impara nuovi trucchi nel tempo libero. Prima che te ne accorga, ti sorprenderai con le tue capacità.

    
risposta data 10.10.2013 - 20:52
fonte
0

Nel mio caso, imparo come effettivamente programmare quanto segue:

  1. Impara dai maestri. Ascolta i podcast di programmazione, leggi i blog professionali nel tuo argomento di programmazione di scelta, leggi / guarda le fantastiche esercitazioni fatte dai guru che sono sparsi su tutto il web e infine leggi libri epici come The Pragmatic Programmer . Questo libro ha molte gemme di programmazione che sono state accumulate durante la carriera degli autori. Un modo sicuro per imparare a codificare realmente è sapere come gli altri programmatori di successo lo fanno.
  2. Esperienza facendo. Leggere e sapere è una cosa, metterla in pratica e farla funzionare è un'altra. Non c'è insegnante migliore dell'esperienza, quindi metti il tuo copione del codice e inizia.
  3. Chiedi a qualcuno che lo sa. Proprio come stai facendo ora, non aver paura di chiedere le migliori pratiche o modi migliori per fare le cose dagli anziani della tua squadra, o se sei abbastanza sfortunato da non avere accesso a detti anziani o mentori o guru, poi c'è ancora il resto di stackexchange e internet per chiedere.

Inoltre, come hanno menzionato i tuoi commentatori, non dimenticare di padroneggiare anche i tuoi strumenti. Imparare tutte le migliori pratiche e le più grandi teorie sono inutili o saranno implementate male se non ne sai abbastanza del tuo strumento, in questo caso, un linguaggio di programmazione.

    
risposta data 10.10.2013 - 19:21
fonte
0

Penso che, se riesci a pensare in modo analitico, hai un buon inizio.

Impara la lingua che desideri e lavoraci attraverso una serie di esempi, ad es. come presentato in quasi tutti i libri che insegna programmazione.

Quindi prova a risolvere i tuoi problemi. Prova a trovare diverse soluzioni e confrontale. La velocità e l'utilizzo della memoria sono fattori comunemente usati che contano. Discuti le tue soluzioni con altri programmatori.

Leggi il codice di altri programmatori e cerca di capire perché hanno risolto il problema in questo modo.

Dovresti anche leggere alcuni libri sugli algoritmi per avere una panoramica sugli approcci standard. Nuovi problemi sono spesso modifiche di vecchi problemi.

Un sacco di pratica e lavoro con il codice anche in team ti aiuteranno ad aumentare le tue competenze passo dopo passo.

Spero che la mia opinione risponda alla tua domanda almeno parziale.

    
risposta data 10.10.2013 - 19:03
fonte