2009-04-22 9 views
29

Mi sembra che la programmazione funzionale sia una grande cosa. Elimina lo stato e semplifica notevolmente l'esecuzione automatica del codice in parallelo.La programmazione funzionale deve essere insegnata prima della programmazione imperativa?

Molti programmatori che hanno insegnato per primi gli stili di programmazione imperativi trovano molto difficile imparare la programmazione funzionale, perché è così diverso. Cominciai a chiedermi se i programmatori a cui prima veniva insegnata la programmazione funzionale avrebbero avuto difficoltà a iniziare una programmazione imperativa. Sembra che non sarebbe così difficile come il contrario, quindi ho pensato che sarebbe stato meglio se a più programmatori fosse stata insegnata prima la programmazione funzionale.

Quindi, la mia domanda è: la programmazione funzionale dovrebbe essere insegnata a scuola prima che sia imperativa, e in tal caso, perché non è più comune iniziare da essa?

+5

Quando dici scuola, intendi primario? La programmazione funzionale è insegnata nella maggior parte delle università e in qualsiasi corso sui linguaggi di programmazione. – kgrad

+3

Il titolo è un po 'fuorviante, la programmazione funzionale viene insegnata nella maggior parte delle scuole e la domanda nel corpo non corrisponde alla domanda nel titolo. –

+0

La domanda nel corpo è davvero buona, per favore aggiorna l'argomento. –

risposta

26

In realtà, alcune scuole già lo fanno in questo modo. Dove studio (Università di Copenhagen), insegnano SML nel primo semestre, come introduzione alla programmazione. Quindi insegnano Java in seguito, come introduzione alla OOP.

Penso che funzioni molto bene e sono d'accordo con te è meglio del contrario. La programmazione funzionale è abbastanza intuitiva per qualcuno che non è (ancora) un programmatore. Mappa molto meglio di quello che ci è stato insegnato come matematica al liceo o prima, quindi le persone che non sono ancora state esposte alla programmazione imperativa di solito la raccolgono senza troppi problemi.

In effetti, c'è una tendenza che le persone che sono nuove alla programmazione quando si iscrivono scelgono SML su più veloce rispetto a chi ha già imparato Java o C++.

Sembra che ci sia un grande salto concettuale nel passaggio dall'imperativo al funzionale, ma il contrario sembra molto più semplice. In genere gli studenti non trovano Java difficoltoso quando sono esposti a questo dopo aver appreso l'SML. Una volta che conosci i concetti di programmazione "pura", incollare gli effetti collaterali è abbastanza semplice. Ma se la tua intera comprensione della programmazione si basa su effetti collaterali, è molto più difficile immaginare che tutto sia possibile senza.

Penso che un grande vantaggio di questo approccio sia che i principi di programmazione funzionale diventano una parte essenziale del vostro toolbox di programmazione, piuttosto che qualche componente aggiuntivo esoterico che potreste usare se volete mettervi in ​​mostra. Anche quando si programmano in lingue imperative, penso che ci sia un vantaggio nell'avere il proprio background in un linguaggio funzionale. Anche quando si programma in qualcosa di basso livello come C, c'è un vantaggio nel pensare di minimizzare lo stato e gli effetti collaterali e di essere abituati al concetto di funzioni di ordine superiore (anche se non sono disponibili nella lingua)

+2

La mia esperienza come studente è stata prima Scheme, poi C, poi OCaml (corso per compilatori) e non così buono OO in Java. Scheme è stato grandioso, in quanto principianti assoluti abbiamo avuto modo di fare cose divertenti come un sistema di inferenza o calcolo simbolico. Ho insegnato C come lingua per principianti (non controllo ancora questa scelta) e dichiaro che IS è una difficoltà per un numero di studenti. Ma il problema più grande è il rumore concettuale. C è OK-ish ma difficile, Java è peggio. Sintassi e semantica minimali come Scheme o Smalltalk funzionano molto bene per i corsi introduttivi. Per OO avanzato sceglierei Smalltalk o Eiffel su qualsiasi altra cosa. –

5

Potrebbe essere un problema di condivisione mentale, poiché la maggior parte degli insegnanti/professori probabilmente ha imparato anche gli stili imperativi.

Inoltre, suppongo che ci sia molto più lavoro disponibile per insegnare stili imperitivi.

2

posso solo supporre la sua il fatto che OOP sembrava essere una parola alla moda/stile preferito, così Scuole attaccato a ciò,

mi è stato insegnato progettazione orientata agli oggetti da ottenere andare, il suo solo di recente Ive stato insegnato io stesso il Stile di programmazione funzionale e posso vedere che ha i suoi vantaggi.

2

Edit: Quello che segue riflette il titolo originale, "Perché la programmazione funzionale non insegnata nelle scuole," Le scuole hanno insegnanti, non docenti. I maestri non scrivono i loro libri di testo.

Le aziende di testo da cui gli insegnanti sono autorizzati ad acquistare i loro materiali sono il problema più grande. Le aziende di libri di testo sono pronti a saltare "la prossima grande cosa", che era OOP di qualche anno fa. La programmazione funzionale è caduta nel dimenticatoio. Molti insegnanti non possono o non possono insegnare un corso senza un libro di testo, quindi la selezione del corso segue generalmente la disponibilità dei libri di testo dei grandi venditori.

+0

Lo trovo molto difficile da credere. Anche molto soggettivo. Inoltre, i linguaggi di programmazione funzionale sono coperti in qualsiasi corso di linguaggio di programmazione. – kgrad

+0

"Coursepacks" sono fondamentalmente libri di testo scritti dal professore, che renderebbero l'ultimo punto discutibile. Bene, finché un professore lo scrive davvero. – nilamo

+1

C'è ora un eccellente libro di testo per insegnanti di scuola: http://htdp.org –

1

In primo luogo, trovo che la base della tua domanda sia errata perché mi è stata insegnata la programmazione funzionale a scuola. (Non era quello che ho iniziato, ma abbiamo fatto qualche programmazione funzionale.)

In secondo luogo, mi interrogo sulla facilità del trasferimento dalla codifica funzionale alla codifica imperativa. Non penso che sarebbe facile come lo vuoi essere.

In terzo luogo, la programmazione è (per la maggior parte delle persone) un'abilità lavorativa. La stragrande maggioranza dei negozi utilizza la programmazione imperativa. Pertanto, è più utile ai futuri programmatori imparare la programmazione imperativa.

+0

È come se si aggiungesse un riferimento a [TIOBE] (http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html). –

9

Molte (la maggior parte?) Scuole insegnano programmazione funzionale. Pochissimi lo insegnano per primi, per molte ragioni.

  • maggior parte degli ambienti di sviluppo per lingue functionnal succhiare, e richiedono una programmazione conoscenze per utilizzare in modo adeguato. Questo è diventando sempre meno vero, ma siamo ancora molto lontani da Visual Studio per Haskell.

  • È difficile saltare nel "materiale appariscente ". Toolkit e librerie GUI succhiano per la maggior parte delle lingue funzionali. Mostrare cose sullo schermo e premiare lo studente è importante.

  • I programmatori autodidatti tendono a gravitare a lingue imperative/OO per motivi storici. Disponibilità di BASIC nella loro giovinezza, sapendo che il loro gioco preferito era scritto in C o C++, tu lo chiami.

  • Risorse semplici ed esercitazioni per i linguaggi di programmazione funzionali sono più difficili da trovare. Confrontare il numero di campioni C# in campioni Lisp su Code Project. Tieni presente che il Lisp è più vecchio di 5 volte.

+0

Vorrei anche aggiungere che la complessità dello stile funzionale della programmazione e dei concetti è più difficile da comprendere rispetto a quella orientata agli oggetti che sembrano "dare un senso". Inoltre, la prevalenza di OOP nella forza lavoro è molto più alta rispetto a FP e quindi una persona a caso ha più probabilità di utilizzare un linguaggio OO piuttosto che uno funzionale. – kgrad

+0

Dr. Scheme smentisce il tuo primo punto. È un IDE per gli studenti CS. – RossFabricant

+0

Sì, avevo in mente il Dr. Scheme quando ho attenuato il primo punto con "Most" e "less and less true". Tuttavia, Dr. Scheme, anche se buono, non è esattamente meraviglioso quando si tratta di eseguire il debug delle strutture. Ma ammetto che per un principiante totale, quelli potrebbero non essere molto utili. :) – jfclavette

0

Quindi, la mia domanda è, dovrebbe programmazione funzionale essere insegnato a scuola prima di imperativo, e se sì, perché non è più comune per avviare con esso?

Anche se non ho avuto la fortuna di iniziare con un linguaggio funzionale, ho colleghi che lo hanno fatto. Avevo anche un amico che studiava la matematica e l'unica lingua che ha imparato a scuola era Haskell!

Ci sono davvero due cose: Informatica e Ingegneria Informatica. Anche se la linea è molto sottile, IMO, dipende molto dal corso (come menzionato sopra) e dall'area di messa a fuoco del dipartimento interessato, che è il linguaggio con cui si tagliano i denti. La maggior parte delle scuole di ingegneria iniziano con uno di C, C++ o Java - che hanno un mercato del lavoro potenzialmente ampio. Altri, possono iniziare con Lisp, Haskell ecc.

0

La programmazione funzionale viene insegnata nella maggior parte delle università. Parte del motivo per cui non viene insegnato alle superiori è probabilmente dovuto al mito "La programmazione è difficile".

+0

Qualcuno ha appena fatto un hit-and-downvote? – Rayne

0

Non so sulla tua scuola nei miei studi universitari ML era una parte essenziale del corso di lingue di programmazione di base e c'era un corso extra curriculum dedicato ad Haskel.

12

Molte scuole insegnano programmazione funzionale. Alcuni di loro lo insegnano prima. Penso che il MIT, da molto tempo, insegnasse lo schema nella sua introduzione alle lezioni di programmazione al computer.

Nella mia scuola abbiamo coperto l'ML come parte di una "classe di lingue di programmazione comparativa" che tutti dovevano prendere.

In ogni caso, non penso che la programmazione funzionale sia così difficile da imparare per le persone che provengono da lingue imperative. Almeno non era per me.

Un sacco di gente pensa che la ragione per cui linguaggi come Haskell e Scheme non abbiano ottenuto un'adozione più ampia è perché le persone sono "rovinate" da loro dalla programmazione imperativa. Questa è una sciocchezza.

La vera ragione per cui le lingue non hanno visto un'adozione ampia è perché non usano parentesi graffe. Sul serio.

Lo stile di sintassi C/Algol è prevalente perché alla gente piace il suo aspetto.

La chiave per aumentare l'adozione della programmazione funzionale non è parlare di quanto sia grande Haskell e di quanto siano malvagi gli effetti collaterali, o di ripetere ripetutamente la parola "monade". Invece, basta creare un linguaggio funzionale che utilizzi parentesi graffe e punti e virgola. La gente lo userà.

+3

Quando hai ragione, hai ragione. – Prankster

+2

Questo mi ha fatto ridere, ma penso che tu abbia ragione. – Zifre

+8

Python è piuttosto popolare e non usa parentesi graffe e punti e virgola. – Christian

1

Il flusso di controllo chiaro della programmazione imperativa si presta bene all'implementazione e all'analisi degli algoritmi in un ambiente di insegnamento. La programmazione orientata agli oggetti ne è un'estensione conveniente, quindi è naturalmente ciò che viene usato più spesso. La programmazione funzionale (davvero una programmazione dichiarativa di qualsiasi tipo), d'altra parte, è un paradigma completamente separato che richiede una nuova serie di considerazioni (prestazioni e altro) molte delle quali sono molto più facili da visualizzare se si capisce prima la programmazione imperativa. Dopotutto, alla fine tutto si riduce a un linguaggio imperativo.

+0

+1 perché si riduce a un linguaggio imperativo - l'assemblaggio è imperativo, C è imperativo e la maggior parte dei compilatori emettono un assembly o C. –

1

Ci deve essere un angolo storico di questo (mostrando la mia età) per i curricula a scuola. Funzionale era tutto ciò che dovevo imparare quando ho iniziato.

Ma mettendo da parte, devi iniziare da qualche parte così uno di loro deve essere il primo. Se inizi con un imperativo, ci saranno cose per le quali non ci sarai quando imparerai a funzionare e dovrai abituarti a fare le cose in modo diverso. Se si inizia con il funzionale e si passa all'imperativo, allora ci si deve abituare all'apprendimento di nuovi concetti/costrutti e ricordare che sono lì che lo usano.

Ogni volta che si sta programmando si sta tentando di risolvere un problema. È bene avere entrambi nella tua casella degli strumenti per raggiungere per risolvere il problema in questione. Ecco perché penso che sarebbe meglio iniziare con l'imerativo e poi imparare a funzionare: se ti ritrovi a cercare qualcosa non è indicativo di aver scelto lo strumento sbagliato per risolvere il tuo problema.

Oltre a ciò, mi sembra che sia un problema.

0

Onestamente, penso che questa sia la domanda sbagliata.

Se l'obiettivo di una lezione introduttiva è insegnare informatica di base, algoritmi, risoluzione di problemi a livello di codice, il corso è fondamentale e puoi sceglierne uno basato su chiarezza, semplicità e idee. Alcune lingue funzionali saranno grandiose per questo. Soprattutto se gli studenti hanno poca o nessuna esperienza precedente.

Generalmente questo non è l'obiettivo di molte classi introduttive. Possono richiedere determinate tecniche o determinate lingue per un corso successivo. Potrebbero voler sfruttare determinate librerie, ecc. Potrebbero semplicemente dover abbinare l'elenco delle "caratteristiche" alla casella di controllo di qualcuno.

Quindi penso che tu voglia voltare la domanda. Scopri che cosa sta effettivamente cercando di raggiungere il corso e scegli la lingua migliore che puoi per questo scopo. In alcuni casi, questo potrebbe essere un linguaggio funzionale.

Se quello che stai veramente chiedendo è il modo migliore per insegnare la programmazione a livello introduttivo e l'informatica, questo è un diverso tipo di worm.

1

In realtà stavo proprio parlando a una persona che sta sviluppando lo Bootstrap (un programma di programmazione attualmente gestito da Citizen Schools). Sembrava pensare che lo stile di programmazione funzionale fornisse uno sfondo migliore per l'algebra, poiché colpiva il concetto di funzioni sia come processi che come oggetti (con proprietà proprie). (Naturalmente, i linguaggi di programmazione dichiarativa possono avere anche funzioni di prima classe, ma l'attenzione non è tanto simile.)

Personalmente, penso che sia utile innanzitutto insegnare la programmazione funzionale. L'approccio dichiarativo è insegnato molto presto in classe matematica, quindi la programmazione funzionale fornisce alcuni nuovi concetti che la programmazione dichiarativa non ha. Sono d'accordo con molti dei poster di cui sopra, il fatto che sia un po 'troppo "duro" è un mito, è stato fatto.

0

Penso, dovrebbe, sì.

Inoltre, nessuna applicazione da console e nessun "mixer di tavolozze colori", ma test di unità prima.

Solo se gli studenti si comportano bene e scrivono casi di test con copertura estremamente elevata, è POSSIBILE avere una rapida occhiata a come leggere i caratteri dalla tastiera.

Secondo me, le pratiche di codifica più cattive (odori di codice, antipattern) derivano da un'ignoranza totale verso la teoria e le migliori pratiche.

Quindi, insegnare loro F # prima, vietare l'utilizzo di console i/o e GUI e utilizzare solo i test delle unità.

In secondo luogo, insegnare loro lo stile misto imperativo/funzionale in un contesto OOP con il pieno utilizzo e la spiegazione dei modelli di progettazione.

Quindi - e SOLO quindi possono provare a mettere clickybuttons da qualche parte, forse come ricompensa. Ma prima la teoria e le buone pratiche di codifica. Altrimenti creiamo la prossima generazione di "RAD" - vittime che non possono nemmeno usare indentazione correttamente e scambiano ctrl + c/ctrl + v per lo sviluppo del software.

+0

siamo un negozio MSFT, ma non una persona nella mia azienda usa F # o PowerShell. Perché spingere le persone a schifo? –

Problemi correlati