Criteri per la scelta della lingua per il primo corso di programmazione


35

Come educatore CS a livello universitario, la questione di quale linguaggio di programmazione insegnare nel primo corso di programmazione viene spesso discussa. Ci sono migliaia di lingue tra cui scegliere e molta febbre religiosa (o febbrile) che supporta un campo linguistico rispetto a un altro. Tutto questo pregiudizio soggettivo che circonda ciascun linguaggio di programmazione rende molto difficile per un educatore sceglierne uno.

La mia domanda è:

Quali criteri oggettivi può utilizzare un educatore per selezionare un linguaggio di programmazione da utilizzare come base per un corso di programmazione universitaria del primo anno? Qual è la base per questi criteri?

Nota : non voglio vedere un elenco di linguaggi di programmazione e perché sono i migliori da usare. La domanda non riguarda la lingua migliore, si tratta dei criteri per selezionare una lingua . Tuttavia, le risposte possono utilizzare linguaggi di programmazione per illustrare punti particolari.


Questa domanda è stata ispirata da un'altra domanda che è stata considerata fuori tema: https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language .


1
Meta thread aperto sull'opportunità o meno di questa domanda: meta.cs.stackexchange.com/questions/362/…
Dave Clarke,

7
<Afferra i popcorn> Per parafrasare Otto Neugebauer : nessun primo linguaggio di programmazione conosciuto dall'uomo è in grado di rovinare tutti.
JeffE,

3
@Raphael: Penso che la risposta di Dijkstra sarebbe probabilmente " Ogni primo linguaggio di programmazione conosciuto dall'uomo è in grado di rovinare tutti".
JeffE,

2
@ edA-qamort-ora-y, sì, dovrebbero essere esposti a diversi paradigmi di programmazione. No, questo non può essere fatto nel primo corso.
vonbrand,

3
Lo abbiamo fatto SMLsemplicemente perché è improbabile che uno studente conosca prima quella lingua. Questo ha bilanciato ogni studente più o meno allo stesso livello per iniziare il corso.
Markus Malkusch

Risposte:


14

Aggiungerò i miei due centesimi, anche se credo che questo argomento sia una fossa senza fondo. Non fraintendetemi, penso che sia una domanda affascinante, ma probabilmente non la risolveremo qui con soddisfazione di tutti.

In poche parole, direi che la lingua dovrebbe fare quello che vuoi che faccia , nel modo più semplice e inequivocabile possibile, e non di più .

La mia esperienza personale deriva dal tutoraggio di diverse generazioni di studenti del primo e del secondo anno con il linguaggio di programmazione Oberon . Le persone che conoscono questa lingua riconosceranno la sua influenza nelle mie opinioni. Si noti che questo linguaggio è stato utilizzato per insegnare "Algoritmi e strutture dati". All'epoca (allora), la programmazione funzionale e la progettazione orientata agli oggetti venivano insegnate in corsi separati a partire dal secondo anno.

Importante : prima di entrare nei dettagli di qualsiasi lingua, tuttavia, vorrei sottolineare che la cosa più importante è essere assolutamente chiari, per te e per i tuoi studenti, su quali siano gli obiettivi del tuo corso. Stai insegnando la programmazione in ? O algoritmi e strutture dati? O ingegneria del software? Prima di scegliere una lingua, vale la pena di pensare un momento a dove stai andando con essa. Le differenze a questo livello (obiettivi) è ciò che probabilmente, a mio avviso, porta alla maggior parte dei disaccordi su questo argomento.

I punti che ritengo importanti possono sovrapporsi a diverse cose che sono già state dette, ma credo che la maggior parte finisca per essere sottoinsiemi di uno dei seguenti quattro:

  • Semplicità : gli studenti sono generalmente lì per insegnare la programmazione, gli algoritmi e le strutture di dati, e non le caratteristiche e le complessità di un linguaggio di programmazione specifico. Wirth ha usato la citazione di Einstein "Rendilo il più semplice possibile, ma non più semplice" come principio guida nella progettazione di Oberon, e ci sono molte altre lingue là fuori che lo fanno altrettanto bene. Il tuo linguaggio di programmazione preferito dovrebbe essere in grado di implementare tutti i concetti richiesti nella tua lezione, ma dovrebbe farlo con il più piccolo set possibile di caratteristiche / dettagli. Il linguaggio di programmazione è di solito solo lo strumento, non l'obiettivo.

  • Unambiguity : un fratello stretto di semplicità, ci dovrebbe essere un costrutto per ogni concetto, con il minor numero possibile di sovrapposizioni. Pensalo come se ci fosse un solo modo "giusto" per attuare ogni concetto. Tre diversi tipi di loop che semanticamente fanno tutti la stessa cosa? O quindici modi diversi per incrementare una variabile? Non bene. Questo rende anche correggere i compiti o in genere solo la comprensione del codice dei tuoi studenti un sacco più facile. I tuoi assistenti didattici lo apprezzeranno.

  • Portabilità : gli studenti andranno in classe con macchine Linux, Windows e OSX e l'ambiente di programmazione dovrebbe essere il più simile (identico) possibile tra tutti e tre. I risultati di qualsiasi programma dovrebbero anche essere identici. Questo è un altro aspetto che gli assistenti all'insegnamento, responsabili della valutazione dei compiti e della gestione di domande / problemi, apprezzeranno molto.

  • Preferenza del settore : Seriamente, dovremmo iniziare a preoccuparci solo se "Industry" stesso decide mai quale linguaggio di programmazione preferisce. Dall'invenzione dei computer questo è stato un obiettivo in costante movimento. Per il momento, se i tuoi studenti imparano davvero come programmare, non dipenderà dalla lingua. Vi sono, tuttavia, alcune aree in cui l'industria riesce a concordare uno standard, ad esempio VHDL per la progettazione di circuiti o SQL per query di database, quindi questo è ancora un punto valido.

Ancora una volta, come una lingua si adatta a questo elenco dipende fortemente da ciò che stai cercando di insegnare!


4
In realtà c'è una divisione nella progettazione dei circuiti tra VHDL e Verilog.
avakar,

@avakar: Aw, merda. Risolverò questo nella mia risposta, grazie per averlo sottolineato!
Pedro,

Yikes, leggi questo e l'ho pensato come uno dei miei docenti. +1 per Oberon, a condizione che l'opzione Usa parole chiave minuscole sia abilitata automaticamente; così doloroso da scrivere WHILE expr DO stmts ENDecc.
Callum Rogers,

3
+1 per "quali sono gli obiettivi del tuo corso?" e una nota aggiuntiva, uno degli obiettivi più comuni anche se non è scritto è quello di fornire le basi per altre cose (corsi e stage) che hanno la programmazione come prerequisito.
AProgrammer

Un punto importante (almeno oggi) è che consente agli studenti di creare programmi visivamente attraenti presto e indolore. Sono esposti a così tante applicazioni e giochi ad alta intensità grafica che pensano naturalmente che sia così che i computer dovrebbero interagire con le persone.
vonbrand,

13
  • Sviluppare il pensiero algoritmico per risolvere i problemi come obiettivo principale: Una cosa negativa dell'utilizzo di un paradigma orientato agli oggetti nel primo corso è che coinvolgere nuovi studenti in cose come eredità, polimorfismo, ecc., Li distrae dall'obiettivo principale sopra menzionato. In effetti, l'introduzione di considerazioni secondarie accanto a questo obiettivo principale, come ingegneria del software, portabilità, utilità del settore ecc., Sono controproducenti, per il motivo indicato.

  • Non un linguaggio orientato agli oggetti: al giorno d'oggi, la maggior parte delle università inizia a insegnare a programmare proprio con un linguaggio orientato agli oggetti. Penso che questo sia un errore. Ci sono cose al mondo che possono essere veramente comprese solo in contrasto con il suo contrario. Senza essere esposti a un paradigma procedurale di programmazione (dati e funzioni come due aspetti distinti del programma), l'idea di base dell'orientamento agli oggetti (dati e comportamento visti come intrinsecamente legati) può mancare a molti. E poiché la programmazione orientata agli oggetti è così importante, mancare la sua idea di base non è cosa da poco. Inoltre, poiché molto probabilmente in corsi più senior gli studenti CS programmeranno principalmente in OO, devono essere esposti anche al lato procedurale delle cose.

Quindi, alla fine, sceglierei un linguaggio procedurale, evitando caratteristiche avanzate, concentrandomi sullo sviluppo del pensiero algoritmico. Ma, evitando funzionalità avanzate, non intendo evitare problemi difficili. Voglio dire, anche se problemi impegnativi, gli studenti dovrebbero essere tenuti a risolverlo usando i primi principi, strumenti semplici.


Puoi iniziare abbastanza facilmente con un sottoinsieme di, per esempio, Java per mostrare prima lo stile procedurale. Quindi apri la scatola di Pandora e mostri come appaiono le stesse cose con OOP.
Raffaello

3
@Raphael: è impossibile evitarlo public static void main()in Java, che deve essere nel contesto di qualche classe. Ciò rende Java meno ideale come prima lingua, anche se ovviamente l'ostacolo non è troppo grande.
Dave Clarke,

Un buon IDE può rinviare public static void main()per molto tempo. BlueJ è un buon esempio di IDE che consente agli studenti di scrivere programmi senza un singolo in mainqualsiasi punto.
Barry Brown,

2
Il problema con OOP è che per la gamma di problemi relativi ai giocattoli coperti nel primo anno o giù di lì di programmazione si mette in mezzo, senza alcun chiaro vantaggio. OOP diventa importante (ed è apprezzato) quando i tuoi programmi sono circa mille righe. "Java senza OOP" è orribile, molte cose completamente opache che "devono essere scritte in questo modo" vanno contro le persone che imparano , non il pappagallo.
vonbrand,

11

Dato che stiamo parlando del primo corso di programmazione in un programma di informatica, direi che l'aspetto più importante sarebbe quali concetti fondamentali di CS insegneranno ai tuoi studenti. Poiché non esiste un linguaggio in grado di insegnare tutti i concetti contemporaneamente, è necessario considerare quali concetti saranno necessari più avanti.

Non sono d'accordo con l'idea di @ Kaveh secondo cui la rilevanza del settore è importante; può essere un bonus, ma qui è di minore importanza. Con solide basi nei principi CS, l'apprendimento di una lingua "industriale" nei corsi successivi sarà relativamente facile.

Come nota a margine, indipendentemente dalla lingua scelta per essere la prima, è importante sottoporre i tuoi studenti a un'altra lingua, radicalmente diversa, il più presto possibile.


1
La pertinenza del settore può essere considerata secondaria ma non credo che sia un problema minore. Poiché questa è un'introduzione al corso di programmazione, non vedo perché si vorrebbe insegnare tutti i concetti in esso, spesso c'è un secondo corso di programmazione e un altro corso sull'argomento del linguaggio di programmazione in cui vengono discusse varie lingue e molti altri i corsi si sono concentrati su aree di applicazione specifiche, ad es. programmazione per il web, ecc.
Kaveh

@Kaveh: Mi sembra il curriculum di un'università tecnica.
Raffaello

6
"è importante sottoporre i tuoi studenti a un'altra lingua, radicalmente diversa, il più presto possibile". -- assolutamente corretto. Mettiamo i novelli che pensano di poter programmare direttamente introducendo prima la programmazione funzionale: quasi tutti sono nuovi a questo paradigma e più C (++) sei stato esposto a più è apparentemente più difficile.
Raffaello

3
@Kaveh: le lingue progettate per far fare le cose nel mondo reale non sono necessariamente ottimali per insegnare concetti o sviluppare abilità. Gli obiettivi sono molto diversi.
JeffE,

1
@Kaveh: non ho mai scritto che la conoscenza delle lingue utilizzate nell'industria non è importante. Quello che voglio dire è che dato un solido primo linguaggio di programmazione, i corsi successivi non avranno problemi a insegnare agli studenti qualcosa su ciò che faranno realmente quando si laureeranno. Avendo fatto parte dell'insegnamento di diversi corsi introduttivi (come un TA), direi che le abilità che impari non sono niente di quelle necessarie nell'industria (c'è troppo poco tempo per quello). In questo caso, trovo che sia meglio fornire loro concetti concreti in modo che possano diventare programmatori migliori, non solo programmatori $ LANGUAGE.
evilcandybag,

8

La mia principale preoccupazione è l' universalità , nel senso che l'apprendimento di questo linguaggio di programmazione dovrebbe rendere lo studente in grado di gestire la maggior parte dei linguaggi di programmazione.

Per quanto mi dispiaccia, questo criterio esclude i linguaggi funzionali puri. Si applica anche al corso che non dovrebbe usare caratteristiche esotiche della lingua.

... ma questo è solo buon senso.


1
Con le monadi come in Haskell, è discutibile che questo criterio non sia più applicabile ai linguaggi funzionali puri.
Dave Clarke,

@DaveClarke: le monadi sono un modo molto carino di fare cose non funzionali. Ma non è troppo rischioso imparare prima queste cose con la monade in testa invece che direttamente? (Forse non lo è, non lo so!)
jmad

2
@jdam: probabilmente hai ragione. Il problema non è nelle monadi, di per sé, ma nella generalità e nella difficoltà di presentare buoni messaggi di errore al programmatore. La variante Haskell Helium affronta questi problemi ed è stata utilizzata con successo con gli studenti del primo anno.
Dave Clarke,

@DaveClarke: wow non ne ho sentito parlare. È molto bello! Sfortunatamente, sebbene sia molto utile per l'apprendimento di Haskell, non risolve il problema che potrebbe non aiutare l'apprendimento di altre lingue.
jmad

4
@Ben: la mia sensazione è che la gestione manuale della memoria sia qualcosa che al giorno d'oggi è specifico per alcune lingue (e che si impara in questi casi specifici) più che una cosa fondamentale della programmazione. Se non sei d'accordo, suppongo che indichi C (o C ++).
jmad

8

Quando si sceglie un primo linguaggio di programmazione, ci sono molti problemi che devono essere considerati. Molti di questi sono stati considerati nelle risposte sopra. Ne includo altri 3 in quanto questi erano parte della mia risposta alla domanda chiusa ( https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language ) che originariamente ha ispirato questa domanda . Ho copiato la mia risposta qui (e modificata) in base all'attuale politica di eliminazione delle domande chiuse.

Ecco 3 punti da considerare, usando alcuni linguaggi di programmazione come esempi.

Programmazione in grande vs programmazione in piccolo

Quando si impara per la prima volta a programmare, è necessario imparare a programmare in piccolo , prima di passare a imparare i meccanismi per aiutare la programmazione in generale .

Programmando in piccolo, intendo scrivere programmi con meno di 100 righe. Questi programmi includeranno algoritmi che manipolano strutture dati semplici, hanno un flusso di controllo semplice e risolvono problemi semplici. In generale non saranno considerati come domande .

Programmando in generale, intendo scrivere programmi di grandi dimensioni creati da molti componenti / classi, basati su un'API, con una GUI, un database, possibilmente in una configurazione client-server.

Le cose a cui un programmatore deve pensare quando programmano in piccolo sono molto diverse da quando programmano in grande. La programmazione in generale richiede al programmatore di pensare alla modularità, alle buone interfacce, al buon design, alla riusabilità e a molti altri problemi. I moderni linguaggi di programmazione forniscono molti costrutti per aiutare a programmare in generale. Questi costrutti includono classi, moduli, interfacce, nascondere informazioni, ecc. Quando si programma in piccolo, questi problemi sono molto meno importanti.

Un linguaggio di programmazione come C ++ ha molte funzionalità per aiutare la programmazione in generale, ma è più difficile sedersi e iniziare a scrivere un programma molto semplice. Java è simile.

D'altra parte, un linguaggio come Python, Ruby, Scheme o Haskell rende molto più semplice scrivere direttamente un programma.

Alto livello vs basso livello

Lingue come C ++ e C sono piuttosto di livello inferiore. Consentono al programmatore di manipolare direttamente i riferimenti nella memoria. Tuttavia, ciò consente di scrivere codice molto efficiente, i dettagli di basso livello possono essere difficili per un primo programmatore per imparare la lingua. Alcuni sosterrebbero che questi dettagli di basso livello ostacolano la scrittura della logica per risolvere il problema.

Un linguaggio di livello superiore come Python rende più facile esprimere concetti più direttamente in termini di dominio problematico.

Digitato staticamente vs digitato dinamicamente

C ++, Haskell, Java e molte altre lingue sono tipizzate staticamente. Ciò significa che il compilatore trova automaticamente i luoghi in cui si verificano potenziali errori in base ai tipi di valori previsti in ciascuna posizione nel codice. C'è un po 'di una guerra religiosa sul fatto che la digitazione statica sia una buona cosa o meno, ma mi starò alla larga da quella. Un problema con la tipizzazione statica per i nuovi programmatori è che i messaggi di errore segnalati dal compilatore sono spesso difficili da capire. Questo è particolarmente vero con i modelli C ++ e i programmi Haskell in generale.

Python, Ruby e Scheme sono digitati dinamicamente. Ciò significa che vengono rilevati errori mentre il programma è in esecuzione. Si può sostenere che questo è troppo tardi per rilevare gli errori (ma si può anche usare il test per evitare tali errori). Ancora una volta, evitando l'argomento religioso, il vantaggio del tipo di errori che si incontrano quando si scrivono programmi semplici in un linguaggio di programmazione tipizzato in modo dinamico sono del tipo in cui questo oggetto non sa come fare questa operazione . Nel contesto di un piccolo programma, questi errori sono facili da capire e rintracciare.

Linguaggi come C hanno una digitazione debole, il che significa che sebbene il compilatore aiuti con alcuni errori, il runtime non riesce a intrappolare altri che si verificano, come accessi alla memoria non validi. Di conseguenza, il messaggio di errore restituito al programmatore è simile a "Programma bloccato". Un linguaggio tipizzato in modo dinamico intrappolerebbe questi errori e li convertirebbe in un messaggio di errore più comprensibile.

Altri

Per altre lingue possono entrare in gioco diverse considerazioni, come il supporto fornito dall'ambiente di programmazione, le API disponibili, la qualità dei libri e le esercitazioni online, ecc.


Sono pienamente d'accordo.
vonbrand,

1
Ho anche le mie preferenze sulla contesa "tipi statici vs dinamici". Tuttavia, in un programma CS generale, fintanto che entrambi vengono insegnati come un punto, credo che l'ordine non abbia molta importanza. Se viene presentato solo un lato della medaglia, tuttavia, questo è un grosso problema per me.
chi

8

Come osservazione introduttiva, considera la possibilità di presentare più di una lingua (in un corso). Nel mio primo mandato abbiamo mostrato sia SML che Java. Il contrasto aveva un suo messaggio molto importante: scegliere lo strumento giusto per il lavoro.

Ma ora per i criteri, in ordine arbitrario.

La difficoltà di apprendimento è una questione soggettiva, ma importante: non vuoi che lo studente perda tempo nell'apprendimento della lingua, ma nel fare cose con essa. Probabilmente, linguaggi dinamici come Ruby possono vincere su questo fronte: puoi dar loro da mangiare qualsiasi cosa e sul web ci sono ottimi tutorial "fittizi". Se ricordo bene, ci sono anche studi che dimostrano che gli studenti che non hanno programmato prima ottengono risultati migliori con linguaggi funzionali che con altri.

Ricchezza : le lingue devono essere abbastanza ricche per tutti i concetti che vuoi insegnare. Ad esempio, se si desidera discutere di funzioni di ordine superiore, è necessario un linguaggio in cui le funzioni siano valori, come i linguaggi funzionali o Scala.

Scalabilità : è probabile che i tuoi studenti non imparino più lingue da soli rispetto a quelli che mostri loro. Quindi vuoi che la lingua o le lingue che hai scelto vengano ridimensionate nel corso dei loro studi: ora devono scrivere i tuoi esercizi per animali domestici, ma potrebbero anche attaccare un progetto di medie dimensioni in seguito. Java e linguaggi con un'ecosfera simile sono buone scelte qui.

Supporto dello strumento : è legato alla scalabilità. Se ti aspetti / vuoi che i tuoi studenti siano produttivi con la lingua, allora devono esistere buoni IDE, responsabili della costruzione e biblioteche. Anche le conchiglie interattive (Ruby, Scala) sono belle, soprattutto per i principianti. Gli strumenti devono funzionare anche su tutte le principali piattaforme.

Documentazione : probabilmente non vuoi insegnare effettivamente la lingua ma chiedi agli studenti di insegnarsi da soli con la tua (astratta) guida. Pertanto, una buona documentazione è importante. Discutibile, più una lingua è popolare e consolidata, migliore è la documentazione. Ad esempio, la documentazione di Scala è piuttosto scarsa (ma sta migliorando). Strumenti come Hoogle sono un vantaggio.

Disponibilità : in realtà ci sono persone che insegnano usando Matlab o Visual C ++. Considera che non tutti potrebbero avere una licenza o una macchina in grado di eseguire i programmi necessari. Probabilmente dovresti preferire le lingue gratuite che funzionano su una varietà di piattaforme.

Pulizia : probabilmente vorrai modellare il modo in cui i tuoi studenti pensano. Più la lingua è disordinata, più saranno difficili da pensare; Non proporrei mai PHP in un corso. I linguaggi dinamici in generale presentano degli svantaggi: consentono, a volte addirittura promuovono, cattive abitudini.

Quali criteri sono più importanti per te rispetto agli altri dipende anche da cosa vuoi insegnare. È letteralmente un corso di programmazione? È un corso di algoritmi e strutture dati? È un corso che introduce concetti di linguaggi di programmazione in diversi paradigmi? È un corso sullo sviluppo di software in generale?


For example, if you want to discuss higher-order functions, you need a language where functions are values, such as functional languages or Scala. ... o C o Pascal, che hanno avuto entrambi i puntatori di funzione praticamente per sempre. Praticamente l'unico linguaggio (mainstream) che questo criterio in realtà chiude è Java.
Mason Wheeler,

Cercare di insegnare ai neofiti un miscuglio di diverse sintassi e concetti sottostanti è solo un rimescolamento del cervello.
vonbrand,

6

Domanda affascinante; Mi piace la tua enfasi su criteri oggettivi. Vogliamo che le matricole imparino:

concetti di programmazione : il primo linguaggio di programmazione deve supportare: chiamate di funzione, iterazione, ricorsione

idee fondamentali : il primo linguaggio di programmazione deve supportare gli array (per i primi passi di una delicata introduzione su come funziona davvero la memoria e come funzionano i puntatori)

capacità pratiche di programmazione : come usare il debugger, come usare il profiler, come risolvere grandi problemi (un linguaggio di alto livello), come mettere insieme sistemi di grandi dimensioni, come abbattere problemi (decomposizione dei problemi), come evitare di scrivere codice complicato, come comunicare agli umani l'intento dietro una serie (spesso criptica) di dichiarazioni eseguibili.

il fatto che esistono librerie pre-scritte per cose come sort () e come usarle - cioè il fatto che non è necessario scrivere tutto da zero.

Altri criteri per una prima lingua :

interpretato (feedback rapido aiuta il processo di apprendimento).

un ambiente interattivo che accelera l'apprendimento, i test e il debug.

codice sorgente di alta qualità è disponibile per gli studenti a leggere in quella lingua

"facile da leggere", "sintassi che si avvicina al linguaggio naturale" (per facilitare la lettura e la classificazione del SourceCode)

portatile (funziona su Mac OS, Windows, Unix). Almeno un'implementazione software gratuita della lingua.

veloce da insegnare, "pochi gotchas" - per esempio, "[I] t potrebbe essere più veloce da insegnare prima ai principianti Python e poi Java, piuttosto che Java come primo OOPL". - "Confronto tra linguaggi di programmazione orientati agli oggetti" e TelescopeRule

Matthias Felleisen ha sviluppato un linguaggio di programmazione con messaggi di errore su misura per un pubblico principiante. Sottolinea che la scelta della lingua particolare non è importante quanto l'insegnamento di una buona metodologia di progettazione. In effetti, vede il primo corso CS come una lezione di arti liberali, insegnando il pensiero critico, la risoluzione dei problemi e l'attenzione ai dettagli.

criteri per un secondo linguaggio di programmazione

Roba che vogliamo che gli studenti imparino, ma forse questo può attendere il secondo linguaggio di programmazione:

un linguaggio "rilevante" che non sia "non troppo esoterico"; qualcosa di "popolare nel settore"

Teoria della complessità: come riconoscere compiti impossibili con la tecnologia attuale.

roba di livello superiore: come scegliere lo strumento giusto per il lavoro , come utilizzare un compilatore, strutture, programmazione orientata agli oggetti, programmazione funzionale, programmazione logica, progettazione di compilatori, composizione e manipolazione di funzioni (nel senso di Lisp / ML), programmazione concorrente e distribuita,

materiale di basso livello: puntatore aritmetico, architettura del computer. gestione della memoria, stack frame, programmazione degli assiemi, architettura della macchina, driver di dispositivo e progettazione del sistema operativo (quindi la macchina "non sembrerà una scatola nera spaventosa che non riescono a penetrare")

EDIT: Trovo deludente che pubblicare un riassunto di qualcosa che ho scritto, in collaborazione con molti altri, "potrebbe non essere un post legale".

Quindi sto aggiungendo una citazione più formale al mio precedente link informale, cercando di rispettare il fair use e altre questioni relative al copyright del wiki.

Questa risposta è una sintesi della prima lingua di Freshman (Anon 2011) presso il Portland Pattern Repository.

(Anon 2011) Molti autori anonimi e vari altri. "Freshmans First Language". Portland Pattern Repository. 27 settembre 2011. http://c2.com/cgi/wiki?FreshmansFirstLanguage .


Hai verificato con gli autori originali se ti è consentito riprodurre il loro contenuto? La fonte è un sito Web aziendale e non sono riuscito a trovare una dichiarazione che il contenuto fosse gratuito, quindi potrebbe non essere un post legale!
Raffaello

1
@Raphael La fonte è una wiki (quindi potenzialmente ha molti autori diversi). Se l'autore (qualsiasi coautore) di questo materiale non desidera che venga incluso qui, deve inviare un avviso di rimozione DMCA all'indirizzo [indirizzo di contatto elencato in fondo a questa pagina] (mailto: team+cs@stackexchange.com) . Inoltre, le informazioni non sono coperte da copyright, solo il modo in cui sono espresse. Un po 'di refactoring e rimozione di WordsRunTogetherWikiWikiStyle migliorerebbe questa risposta e eliminerebbe qualsiasi rischio di violazione del copyright.
Gilles 'SO- smetti di essere malvagio'

1
+ Buona risposta, ma ho un obiettivo da scegliere: i profiler. Non c'è teoria dietro di loro - solo "conoscenza comune". Non è generalmente apprezzato dagli accademici che ci sono molti problemi che non trovano, e un'altra tecnica lo fa. Controlla questo link
Mike Dunlavey,

5

Penso che la semplicità e la facilità di apprendimento siano uno dei criteri principali. In un corso introduttivo sulla programmazione vorremmo evitare inutili ostacoli alla programmazione e concentrarci il più possibile sui principi della programmazione e della risoluzione algoritmica dei problemi. Gli studenti del primo anno spesso non hanno la capacità di pensare in modo algoritmico ai problemi, quindi il corso riguarda anche l'insegnamento del pensiero algoritmico.

Un altro criterio è l'utilità della lingua nel settore. Non vorremmo insegnare una lingua inutile nel settore. Una chiara maggioranza degli studenti lavorerà nel settore, quindi si dovrebbe avere un occhio su ciò che viene utilizzato (e verrà utilizzato quando gli studenti si laureano) nel settore.

Il terzo criterio sarebbero i corsi che gli studenti seguiranno negli anni successivi. I corsi, in particolare i corsi richiesti, non sono progettati su se stessi ma in coordinamento con altri corsi.

L'ultima a cui riesco a pensare in questo momento è la stessa della risposta di jmad, la lingua dovrebbe facilitare l'apprendimento di altre lingue importanti. Dovrebbe essere abbastanza ricco e prendere le lingue importanti successive sarebbe facile (qui, significa importante dal punto di vista degli studenti).

Penso che molte università abbiano spostato la loro principale introduzione al corso di programmazione da Java / C ++ / C a Python sebbene possano fornire di tanto in tanto introduzione alla programmazione in altri linguaggi (spesso per specialisti non informatici, ad esempio C per specialisti in ingegneria elettrica) sebbene possano mostrare flessibilità se l'istruttore vuole sperimentare l'insegnamento di un'altra lingua una volta ogni tanto.


3
Non giudicherei estremamente utile l'utilità nell'industria in un corso introduttivo di programmazione. Un programmatore di successo in natura dovrà probabilmente imparare un certo numero di lingue durante la sua carriera, alcune delle quali "sul posto di lavoro", quindi la capacità di imparare e imparare nuove lingue è un'abilità chiave che deve essere insegnata. Di conseguenza, non mi aspetterei che la prima lingua insegnata in un corso universitario sia necessariamente la più forte quando si diplomano.
Ben

1
@Ben: l'utilità nel settore è particolarmente importante se gli studenti non si specializzano in CS. Da dove vengo molte persone vanno a lavorare sulla biologia o altre scienze e, dato che non avranno il tempo di imparare molte lingue, imparare qualcosa di comune nel loro ecosistema come Python sarà probabilmente più utile di ML, Java o C.
hugomg

1
Parlando come qualcuno dell'industria (un settore particolare, non necessariamente rappresentativo), non penso che la rilevanza del settore sia un fattore quando si tratta di futuri programmatori di livello 1. L'esposizione a più paradigmi rende i programmatori migliori, anche se nel mio dominio (programmazione integrata) usiamo principalmente C. I particolari di una lingua possono essere appresi in un manuale, i concetti generali vengono meglio insegnati a scuola. Per i programmatori occasionali (ad es. Scienziati), le priorità sono diverse, ma concentrarsi troppo su Fortran può far ignorare Numpy quando è quello che dovrebbero usare.
Gilles 'SO- smetti di essere malvagio'

5

Quindi, abbandonerò immediatamente la mia reazione istintiva, che è che tutti dovrebbero imparare a programmare tramite SICP perché Lisp è la cosa giusta.

Sono già stati offerti molti buoni criteri per selezionare una lingua ... la semplicità e la portabilità sono tra le più importanti. Tuttavia, penso anche che sia vitale per gli studenti che non conoscono la programmazione non avere un'idea sbagliata (o non avere idea) di ciò che accade dietro le quinte con i linguaggi moderni.

Sebbene alcuni di questi altri post abbiano offerto criteri eccellenti, mi piacerebbe usare un linguaggio particolare per illustrare l'aspetto di "soddisfare i criteri".

Alcune di queste preoccupazioni sono state affrontate (molto meglio di quanto potessi tentare) nel post sul blog di Joel Spolsky, The Perils of JavaSchools . La scelta di linguaggi come Java o Python chiude due dei concetti più difficili (e più vitali) in CS; vale a dire, puntatori e ricorsione.

Naturalmente, insegnare un corso introduttivo in C sarà incredibilmente denso, ma probabilmente mancherà anche molti concetti importanti relativi alla ricorsione. Allo stesso modo, un corso tenuto in Lisp dovrà puntatori indirizzo che figura sotto le coperte, come care cdrimplicano importanti concetti relativi alla liste collegate, mentre lasciando la maniglia lingua dei dettagli.

Fondamentalmente, quello che sto arrivando è che gli studenti devono comprendere i fondamenti delle strutture dati e degli algoritmi, nonché l'implementazione pratica.

Sono anche in disaccordo con il suggerimento di non usare un linguaggio orientato agli oggetti. Penso che l'utilità dei linguaggi orientati agli oggetti per modellare il mondo reale sia una risorsa positiva per i nuovi programmatori, purché sia ​​chiarita la mancata corrispondenza dell'impedenza e che i linguaggi orientati agli oggetti siano un paradigma tra i tanti.

Proporrei che Ruby (suggerito come possibilità anche da un altro post) esemplifica molte qualità da cercare in una lingua da usare per un corso introduttivo al corso di programmazione.

Giustificerò momentaneamente questa affermazione, ma prima voglio commentare una tendenza che mi disturba nei corsi di introduzione al CS. Lavoro in un'università che, come molte scuole, ha recentemente iniziato a utilizzare Python per i suoi corsi introduttivi. Sono fermamente convinto che Python sia il nuovo BASIC e che la tendenza del linguaggio sia quella di scegliere la cordialità del newb piuttosto che il potere e l'espressività, come ho recentemente sostenuto altrove . Questo è un disservizio, e dobbiamo pensare ai programmatori che diventeranno, non ai newb che sono in questo momento.

Comunque, giustificando Ruby come linguaggio introduttivo ...

  • Ruby, sebbene non ottimizzato per la coda, fa piuttosto bene la ricorsione. Quindi c'è quello.
  • Ruby è multi-paradigma. Sebbene sia un linguaggio orientato agli oggetti puro, abbraccia anche la programmazione funzionale, oltre ad avere alcune ruote di addestramento imperative, derivate dal C. Confronta questo con Python, che è un linguaggio procedurale con alcune OO appiccicose (anche se i bulloni stanno mostrando), e alcuni elementi funzionali (che il BDFL di Python ha ripetutamente tentato di eliminare ).
  • CRuby (alias MRI o 'Ruby Classic') è scritto ed esteso in C. Puoi insegnare agli studenti i suggerimenti, la gestione della memoria e il dio terribile malloc()insegnando loro ad estendere la lingua in C.
  • Anche se si tratta di un linguaggio dinamico di alto livello, puoi insegnare molto su strutture di dati, tipi, ecc .; ci sono librerie (gemme) per qualsiasi cosa tu possa immaginare, dagli alberi rosso-neri a fare cose strane con la tipizzazione delle anatre.

Ad ogni modo, non c'è sostituto per l'apprendimento di molte lingue, da molti paradigmi, che tu le usi in modo professionale o meno. Fondamentalmente, penso che tutti dovrebbero capire , se non usare , C e Lisp. Ruby è il miglior compromesso che mi viene in mente per un semestre introduttivo.

Comunque ... quelli sono i miei $ 0,02. Non sto cercando di convincerti ad usare Ruby, intendiamoci ... semplicemente usandolo come un esempio di qualità da cercare in una lingua per insegnare un corso introduttivo.


2
"Credo fermamente che Python sia il nuovo BASIC" - lo copia. "due dei concetti più difficili (e più vitali) in CS; vale a dire, puntatori e ricorsione" - Non ho mai imparato un linguaggio che si occupa esplicitamente dei puntatori e non mi sono mai perso nulla. Quando ho imparato come funzionano i compilatori, i puntatori sono stati spiegati abbastanza rapidamente.
Raffaello

Concordo sul fatto che una lingua multi-paradigma ha il suo fascino (sebbene insegnare da due a tre lingue "pure" potrebbe essere migliore), ma non sceglierò Ruby per questo motivo. Altre lingue per un lavoro migliore, imho, in particolare rispetto alla biblioteca di base. Scala, ad esempio, ha un'intera biblioteca di collezioni immutabili.
Raffaello

3
Credo anche che Python sia il nuovo BASIC. Ma perché è un argomento contro Python?
JeffE,

1
@Raphael, i puntatori sono difficili solo quando inizi con C, il che ti costringe in qualche modo ad essere esposto ai puntatori quando troppe cose non sono sistemate e dove hanno una relazione confusa con le matrici. I puntatori non sono stati difficili per me quando mi sono autodidatta Pascal. I puntatori non erano difficili per le persone della mia classe a cui venivano insegnate loro in Algol 68 (qui sono chiamati riferimenti, ma sono puntatori con un altro nome, proprio come in Java; ciò che è difficile in Algol 68 sono le regole di dereference automatiche), i puntatori non sono nemmeno difficili con C ++ se non inizi insegnando il sottoinsieme C.
AProgrammer

1
@DaveClarke: rientra con uno spazio bianco, che più che compensa quelli.
Raffaello

5

Il mio primo linguaggio di programmazione era un linguaggio di assemblaggio di giocattoli. Il secondo era Fortran. Nel mezzo, mi hanno insegnato una notazione di "algoritmi", che era approssimativamente Algol 60. Sono risultato abbastanza bene. In effetti, penso che ciò che mi è stato insegnato sia stato praticamente perfetto.

Quando ho guardato per la prima volta la programmazione funzionale, in articoli di ricerca sebbene non in un linguaggio implementato, sono andato "wow, questo è completamente diverso. È abbastanza matematico!" Molte persone a cui viene insegnata la programmazione funzionale hanno ancora lo stesso tipo di esperienza "wow". Penso che sia fantastico.

Penso che la programmazione imperativa e la programmazione funzionale siano due modi completamente diversi di guardare il mondo. Saremmo dannosi per i nostri studenti se li privassimo di quella diversa esperienza.

Il miglior primo linguaggio di programmazione dovrebbe essere il più semplice possibile e il più chiaro possibile, in modo che gli studenti possano concentrarsi su come pensare chiaramente. Sfortunatamente, la semplicità e la chiarezza dell'assemblaggio, Fortran e Algol 60 non hanno eguali nella maggior parte dei linguaggi di programmazione moderni. Haskell è una buona eccezione. Ma Haskell avrebbe reso il mio secondo linguaggio di programmazione ideale, non il primo. Eiffel o Oberon potrebbero forse adattarsi al conto.


5

Alla North Carolina School of Science and Mathematics , abbiamo introdotto gli studenti in Python dal 2004. Lo usiamo per insegnare la programmazione procedurale, perché pensiamo che la capacità di scrivere procedure brevi e corrette sia vitale per progredire in seguito con strumenti più pesanti, incluso OO programmazione.

Ci piace per questi motivi.

  1. Python non è un linguaggio in formato libero. Costringe gli studenti a scrivere il loro codice in blocchi usando il rientro. (Come nota tecnica, usiamo l'editor di testo vim e inseriamo [ set tabstop=4 set et] in .vimrc per eliminare fastidiosi problemi e per rendere evidente il rientro del codice ma non per causare una brutta deriva orizzontale eccessiva). I nostri studenti si abituano a vedere la struttura gerarchica dei programmi delimitati da spazi bianchi. Di conseguenza, le loro abitudini di formattazione tendono ad essere molto buone mentre programmano in altre lingue.

  2. La semplicità sintattica di Python lo rende adatto ai principianti. Programmi semplici possono essere scritti con un minimo di parole chiave arcane e incantesimi magici. Vogliamo che uno studente che normalmente non penserebbe alla programmazione ci provi. Nota la deliziosa semplicità di Python hello.py; è chiaro ciò che sta accadendo.

  3. Python è digitato in modo dinamico e anatra. Questo rende semplice l'introduzione delle variabili. Dico ai miei studenti che le variabili sono solo etichette. Indicano gli oggetti. Invia un messaggio a un oggetto usando il nome della variabile, così come qualcuno ti invia un messaggio chiamandoti al telefono.

  4. Python è uno strumento che gli studenti ambiziosi non supereranno. Ha librerie sofisticate che ospitano cose utili. È un potente strumento creativo accessibile ai principianti.

  5. Python è gratuito e funziona su tutte le principali piattaforme. La nostra scuola è un ambiente operativo eterogeneo con tutti i tipi di macchine. Non dobbiamo preoccuparci di mal di testa come problemi di compatibilità. Funzionerà praticamente su qualsiasi computer.

  6. Python ha una documentazione eccellente. Incoraggiamo i nostri studenti a esplorare, armeggiare e colorare al di fuori delle linee. Imparano presto ad usare la documentazione di Python e spesso finiscono per esplorare cose interessanti al di fuori della classe.

Siamo rimasti molto soddisfatti di Python.


1
Benvenuto! Questo è un bel caso di studio, ma fa poco per rispondere alla domanda dopo i criteri di selezione, imho. Leggere i tuoi oggetti all'indietro può in qualche modo farlo, ma non sono sicuro che tu lo intendessi in quel modo.
Raffaello

Non era previsto alcun ordine particolare. È un "e".
ncmathsadist l'

3

Direi che la lingua (sotto alcune limitazioni) non ha molta importanza, come quello che fai con la lingua. Puoi imparare lo stesso su sviluppo software, algoritmi, programmazione orientata agli oggetti, hardware del computer e così via nella maggior parte delle lingue. La chiave è, per sviluppare qualcosa di interessante, che utilizza tutti questi concetti.

(risposta migrata da https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language/ )


1

TL; DR: Non c'è modo dirispondere obiettivamente a questo perché non esiste una base obiettiva per i criteri alla base. È arbitrario come cercare di discutere se il blu è, oggettivamente , un colore "migliore" del rosso, o se il gelato alla vaniglia è oggettivamente "più gustoso" del cioccolato.


Penso che ci siano già dei post meravigliosi, ma aggiungerò i miei 2 centesimi.

Quali criteri oggettivi può utilizzare un educatore per selezionare un linguaggio di programmazione da utilizzare come base per un corso di programmazione universitaria del primo anno?

Questa domanda è simile alla domanda se c'è un modo per scegliere oggettivamente il primo sapore di gelato che qualcun altro dovrebbe provare quando visita un gelato per la prima volta. No, non esiste un modo oggettivo per scegliere qualcosa che è intrinsecamente soggettivo .

Perché? Perché anche quando esaminiamo i criteri ragionevoli menzionati nella risposta di Pedro , tutti avranno comunque una visione soggettiva di come ogni fattore "regge" contro le opinioni di qualcun altro.

Ad esempio, Ruby è oggettivamente "più semplice" di Python? Più semplice in che senso? Rispetto a cosa? Che cosa significa "più semplice" per te ? Significa "meno righe di codice"? Significa "più facile da leggere e capire"? E gli altri? Perché qualcuno dovrebbe essere d'accordo con una particolare selezione qui? Non penso che possiamo rispondere obiettivamente a questa domanda .

Questo porta alla domanda successiva.

Qual è la base per questi criteri?

Per quanto ragionevoli possano essere alcuni criteri, penso che questo sia più fondato sulla preferenza soggettiva di qualsiasi altra cosa. Ad esempio, non c'è motivo per cui dovrei semplicemente accettare i criteri di Pedro di semplicità , non ambiguità , portabilità e preferenze del settore, a prescindere da quanto ragionevole qualcuno potrebbe pensare che sia. In effetti, la preferenza del settore è soggettiva per definizione e porterebbe semplicemente a un circolo vizioso. (Ognuno viene addestrato in esso, quindi tutti lo usano nell'industria, motivo per cui tutti vengono addestrati in esso, ...)

Ad esempio, perché no

  • Efficienza: i tempi di esecuzione e l'impronta della memoria possono essere effettivamente misurati.
  • Dimensioni: il minor numero possibile di parole riservate renderebbe più facile l'apprendimento della lingua.
  • Set di funzionalità: un set più ampio di funzionalità supportate (ad esempio lambda, generici, orientamento agli oggetti, sovraccarico dell'operatore, ecc.) Consentirebbe di insegnare più concetti senza dover cambiare lingua e tornare al punto di partenza.
  • Interoperabilità: un linguaggio che semplifica il lavoro con altre lingue e sistemi nativi (ad es. API Win32 da C # o Python, ecc.) Potrebbe essere sviluppato come un investimento a lungo termine migliore, ecc.

Il punto è che, mentre potrei elaborare un diverso insieme di criteri di valutazione ed essere comunque considerato ragionevole, non possiamo affermare che sia oggettivamente superiore / inferiore a quello di qualcun altro.

In conclusione, non esiste una base obiettiva per i criteri. È arbitrario come cercare di discutere se il blu è, oggettivamente , un colore "migliore" del rosso, o se il gelato alla vaniglia è oggettivamente più gustoso del cioccolato.

Questo non vuol dire che non puoi avere buoni motivi per giustificare le tue preferenze, ma alla fine sono solo le tue preferenze.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.