Ideale sequenza di apprendimento del linguaggio di programmazione? [chiuso]


17

Cosa pensi? Qual è la sequenza ideale di apprendimento del linguaggio di programmazione che coprirà oggi la maggior parte delle lingue e dei paradigmi più utilizzati e che aiuterà a comprendere le basi, le idee e le pratiche di programmazione comuni? Puoi anche suggerire la sequenza di apprendimento per i paradigmi piuttosto che per le lingue.

NB: Questa è la porta della domanda che ho posto in StackOverflow ed è stata chiusa per essere soggettiva e polemica.


Ottima domanda Quali sarebbero state le risposte se questa domanda fosse orientata alle prestazioni? Sono curioso: programmers.stackexchange.com/questions/16323/… : D
JoeBilly

4
Sono COMPLETAMENTE sorpreso e felice che Lisp si presenti comunemente sulle domande di alto livello.
Inaimathi,

1
Questa domanda è stata posta anche qui (anche se penso che questa sia arrivata per prima): programmers.stackexchange.com/questions/41720/…
oosterwal

Risposte:


26

Python, Lisp, C, Haskell

Supponendo che la domanda riguardasse una sequenza di apprendimento ideale per i neofiti della programmazione (poiché gli esperti della programmazione avranno avuto la loro sequenza di apprendimento (probabilmente accidentale)), suggerirei di leggere il saggio di Norvig su come imparare la programmazione in 10 anni , quindi:

  1. Python : inizia con un linguaggio dinamico, di alto livello, OO e funzionale. Perché è davvero importante che i principianti si sentano produttivi al più prestoe non essere disattivato da sintassi aliena, mancanza di librerie, mancanza di multipiattaforma, mancanza di risorse di apprendimento e mancanza di comunità. Python è altamente leggibile, ha tonnellate di buone librerie (specialmente librerie scientifiche - uno scienziato / ingegnere moderno deve sapere come programmare), è facilmente gestibile dalla maggior parte dei sistemi operativi, ha tonnellate di tutorial e interi libri gratuiti ed è generalmente facile da usare - pur essendo abbastanza potente da crescere con te mentre diventi un programmatore avanzato che lavora su grandi problemi. È anche importante rafforzare convenzioni importanti + utili per un principiante: la leggibilità del codice conta MOLTO e dovresti scrivere codice per te e gli altri per capirlo facilmente.

  2. Lisp: In particolare, almeno sfoglia la struttura e l'interpretazione dei programmi per computer o guarda i video della SICP , e tieni gli occhi ben aperti vedendo le basi e il potere espressivo della programmazione: si può fare così tanto con così poco. Scopri come Lisp può esprimere non solo il paradigma funzionale, ma OO, logico / dichiarativo e altro ancora, come la creazione di nuovi linguaggi specifici del dominio. Leggi PAIP di Norvig per vedere cosa può fare un maestro con la lingua. Quindi dai un'occhiata a Clojure , un moderno dialetto Lisp che potrebbe essere una delle Next Big Things.

  3. C: Solo perché è la lingua-franca dell'informatica. :) Possibilmente facoltativo in questi giorni se uno è principalmente un programmatore in un particolare dominio non software. Lo trovo brutto ma vale la pena sapere per ottenere un apprezzamento per l'hardware sottostante. Vai con K&R , ovviamente.

  4. Haskell : puro potere funzionale. Dove attuale Com.Sci. teoria e potere espressivo pratico si incontrano. Vedi Real World Haskell .

Dopo il tour di cui sopra, si sarebbe molto abili nell'affrontare i problemi e nell'esprimere soluzioni in codice, e ci si sentirebbe totalmente a proprio agio con i paradigmi qui :

testo alternativo


Sostituirei (naturalmente) Smalltalk a Python come # 1, ma dico che sapere che Python (a) è molto più popolare di Smalltalk e che (b) far parlare Smalltalk con altre lingue è difficile come lo è in Java , vale a dire abbastanza difficile da frustrare un principiante. La "sceneggiatura" di Python sembra piuttosto un grande vantaggio.
Frank Shearar,

Sono d'accordo con la tua dichiarazione di produttività. Penso che imparare la C come prima lingua assoluta sia un sacco di bollock. Ma dovrebbe sicuramente essere nello stack da qualche parte.
Mark Canlas,

+1 Non sono sicuro che Haskell dovrebbe essere in cima, ma per essere onesti, non lo so ancora ed è il prossimo nella mia lista, quindi potrebbe finire per essere l'ultima lingua che imparo.
Inaimathi,

2
1 clic per visualizzare il diagramma a dimensioni intere @ i54.tinypic.com/168ity1.jpg
Mike Clark,

Lo farei +1 se C non fosse nell'elenco
Balog Pal

28

Ecco come lo farei:

  1. Python (o Ruby o Lua): un linguaggio interpretato, nessun tipo, puoi fare cose in poche righe. Enorme libreria (Python è il migliore per questo immagino). Puoi approfondire gli algoritmi perché non ci sono distrazioni. Nessuna compilazione necessaria, basta eseguire. Inoltre, con Python insegni implicitamente un buon stile, poiché il rientro in Python è obbligatorio. Puoi anche insegnare l'orientamento agli oggetti (in Lua è più un problema). Lo scopo qui è divertirsi e mostrare allo studente cosa si può fare.

  2. C ++ (o forse Java): un linguaggio tipizzato e veloce. Se hai bisogno di Orientamento agli oggetti, allora conosci già alcuni concetti. L'idea principale è "tradurre" ciò che hai fatto in Python e farlo con i nuovi vincoli (principalmente i tipi). Ora, se hai i concetti giusti, l'aggiunta di tipi non è un problema. Il prossimo passo è pensare a un livello più basso (Java non aiuta qui) e insegnare bene i puntatori . Con questo intendo spiegare un po 'lo spazio degli indirizzi, la CPU, il sistema operativo, in modo che tu possa iniziare a vedere sotto il tuo programma. Un linguaggio compilato introduce la distinzione tra interpretazione e compilazione, molto utile per spiegare cos'è il linguaggio macchina, ecc.

  3. Assemblea : Infine, niente magia, basta parlare con la macchina. C'è un dibattito sulla sintassi Intel e GAS, non è importante. Se hai MIPS, credo che sia meglio per l'insegnamento, ma suppongo che x86 sia più conveniente poiché è più diffuso (x86_64 meglio poiché ha più registri e contenuti). Devi solo rimuovere parte della complessità e lasciare che gli studenti indagino ulteriormente se lo desiderano.

(Questi primi 3 sono la "profondità". Fino ad ora, siamo scesi fino a toccare il fondo, che è "vicino al metallo", come si suol dire. Penso che questo sia molto importante, molte domande in programmazione sono risolto quando hai un'idea chiara di ciò che sta accadendo. Quando lo sai, puoi acquisire ulteriori conoscenze con fiducia.)

  1. Schema (o Common Lisp o Clojure): Come diceva @dukeofgaming, le lingue Lisp ti consentono di insegnare bene la ricorsione (per questo Schema è meglio, poiché non ha loop espliciti). Ma andrei a insegnare altre due cose: chiusure e macro. Le macro sono ciò che separa le lingue Lisp dalle altre. Personalmente non mi piacciono le macro Scheme ma questo non è troppo importante. Penso che le macro di Clojure siano belle, per esempio (ma la ricorsione in Clojure non è così pulita, poiché la JVM non ha ricorsione della coda). Le chiusure sono un concetto molto importante, una volta che le hai individuate "vedi" Javascript all'istante. Dopo aver studiato C ++, Python e Lisp, Javascript diventa "banale".

  2. Haskell : Per un linguaggio funzionale, non penso che tu possa battere Haskell. Lisp e Scheme sono considerati funzionali, ma per enfatizzare la programmazione funzionale, devi costringere gli studenti a pensare senza stato. Haskell ha anche altre cose molto belle, come il curry e il pattern matching per "destrutturare". Non conosco molto Haskell, ma la concisione del codice che puoi scrivere è semplicemente meravigliosa. Conoscere bene Haskell rende molto più semplice il percorso per comprendere Erlang.

  3. Avanti : un linguaggio di stack. Rompe completamente di nuovo la tua logica (se Lisp e Haskell non fossero abbastanza). Andrei fino a insegnare Jones's Forth poiché conoscono l'assemblea e quindi puoi capire totalmente cosa sta succedendo. (Conoscere Forth apre PostScript, per esempio.)

(Quindi questi ultimi 3 sono l'ampiezza che stavi dicendo. Per me, queste lingue sono abbastanza strane da cambiare il tuo modo di pensare. Hanno fatto almeno per me. E penso che con queste, capisci abbastanza paradigmi per imparare una nuova lingua molto velocemente.)

Opzionalmente, puoi studiare questi:

  1. SmallTalk : un linguaggio puramente orientato agli oggetti. Per vedere cosa succede quando prendi sul serio l'orientamento agli oggetti, la lingua non ha bisogno di "se", "per". Tutto è un messaggio: grande realizzazione di nuovo. (Ciò renderebbe semplice Objective-C ora.)

  2. Vai : un (bellissimo) linguaggio con enfasi sulla concorrenza. Trovo che Go sia molto gentile e comodo da programmare.

  3. Prolog : un altro paradigma di programmazione. Non ho scritto alcun Prolog ma capisco che è ancora un altro linguaggio strabiliante.


6
Python e Ruby (non conosco Lua) sono linguaggi fortemente tipizzati. Penso che intendi dire che sono dinamicamente piuttosto che digitati staticamente.
Daniel Roseman,

13
Si prega di trattare C e C ++ come due lingue separate.
David Thornley,

1
Bjarne dice : "Non esiste un linguaggio chiamato" C / C ++ ". La frase è solitamente usata da persone che non hanno idea della programmazione (ad esempio personale delle risorse umane e manager scadenti). In alternativa, è usata da persone che semplicemente non lo fanno conoscere C ++ (e spesso non C). "
Fredoverflow

1
Vorrei che qualcuno discutesse se il montaggio dovesse precedere il C ++. A quel punto sarebbe abbastanza facile avvicinarsi all'assemblaggio, a causa dei concetti semplici e di un piccolo set di strumenti forniti, tuttavia lavorare con la memoria grezza e i riferimenti di memoria grezza dovrebbe essere molto utile quando ci si avvicina al C ++, dove usare riferimenti nominali per indirizzare sia arbitrari posizioni e valori di memoria confondono lo sh * out della maggior parte delle persone.
Filip Dupanović,

1
Ho dato ai miei due studenti CS un corso di una settimana in un assemblatore inventato. praticamente ho inventato un set di istruzioni minimale e un interprete. Quindi potrebbero scrivere (e vedere eseguire) alcune routine molto semplici, complete di tempistiche. Quindi ho aggiunto elementi come la memorizzazione nella cache dei dati e il prefetching in modo che potessero vedere come le caratteristiche architettoniche interagiscono con le prestazioni. Sospetto che un assemblatore artificiale e un computer possano consentire una maggiore flessibilità ed efficienza di apprendimento, se lo scopo è didattico, piuttosto che l'acquisto di qualcosa che potrebbero usare.
Omega Centauri,

12
  • Quello di cui hai bisogno ora
  • Quello che ti serve dopo
  • Quello che ti serve dopo

Seriamente, avrei potuto imparare BASIC, COBOL, Fortran, Forth, Pascal e Prolog ai miei tempi, ma non ho mai avuto particolare bisogno di usarli e non riesco davvero a vedere in che modo hanno influenzato il mio uso di altri le lingue, tranne forse l'applicazione errata di paradigmi l'uno nell'altro. Mi ci sono voluti anni per disimparare BASIC abbastanza da scrivere effettivamente Pascal strutturato, un paio d'anni per smettere di scrivere il codice Pascal in C, e un altro paio d'anni per capire davvero OOP quando ho iniziato a usare Objective-C e Java. D'altra parte, dal momento che ho lavorato (quasi) esclusivamente in linguaggi OO, sono stato in grado di concentrarmi sul miglioramento del mio uso dei linguaggi OO, senza cercare di farli apparire come Scheme o PostScript.


4
Sai, penso che ci sia un certo valore nell'apprendere una nuova lingua anche se non ne hai bisogno ... tuttavia sono d'accordo con il sentimento generale che spesso è meglio imparare una lingua perché pensi che la troveresti utile piuttosto perché è quello che pensi di "dover" imparare.
Tim Goodman,

8

È difficile affermare che qualsiasi sequenza sia l'ideale, ma esporrò un piano che posso giustificare:

  1. C

    L'apprendimento del C richiede pazienza e diligenza e ti introdurrà ai modi di base in cui i computer gestiscono i dati e ti mostrerà quasi il più ampio insieme di responsabilità che un programmatore può accettare per gestire una macchina del genere.

  2. Perl

    Come antidoto al rigore richiesto da C, prova l'incredibilmente perdonante Perl. Ciò che ha richiesto una settimana per scrivere in C è possibile scrivere in un'ora in Perl. Introduce un diverso tipo di piacere nella programmazione e mostra come l'esclusione di determinate preoccupazioni e dettagli libera il programmatore di concentrarsi su cose diverse.

  3. C ++ o forse Java

    Poi vedrai come l'attenzione di C sugli aspetti primitivi e di basso livello della programmazione serve come base per aumentare il livello di astrazione, notando i mestieri che si fanno in efficienza quando si sale in astrazione. Scopri come formare astrazioni che possano ancora conservare l'efficienza che conta per il tuo programma.

  4. Lisp comune

    Questa è la ricompensa per lo slogan precedente. Troverai echi di ciò che hai imparato in tutte le lingue precedenti e vedrai quanto stupide appariranno così tante concessioni precedenti durante la programmazione in Lisp. Il preprocessore di C e i modelli di C ++ preparano ad apprezzare il sistema macro di Lisp. Riacquisterai la facilità di espressione di Perl, le opportunità di ottimizzazione di basso livello di C, le capacità di costruzione dell'astrazione di C ++ o Java e supererai tutte. Nessuno dei tre precedenti - forse tranne il debugger di Perl - ti avrà preparato per l'esperienza di programmazione interattiva con un REPL capace ("read, eval, print loop"). Lavorare con un'immaginebasato su un ambiente - che cambia la relazione tra il codice sorgente e l'idea di un "programma eseguibile" - cambierà tutta la tua idea di cosa significhi costruire un programma.

Oltre a questi quattro, esplorare altri stili di programmazione, come la programmazione funzionale in Haskell o la programmazione logica in Prolog, rende più comprensibile la gamma di programmazione - ampia conoscenza, se vuoi - ma a quel punto il tuo tempo viene servito meglio migliorando il tuo mestiere - profonda conoscenza - con qualsiasi lingua tu conosca.

Avendo assaggiato abbastanza lingue distinte, la tua opinione si alzerà per concentrarsi sulle idee che trascendono una qualsiasi di esse. È un po 'come la differenza tra imparare a guidare l'auto di tuo padre e saper guidare qualsiasi macchina: potresti non divertirti a guidare il minivan a noleggio per qualche giorno, conoscendo appieno i piaceri della guida di un'auto sportiva preferita, ma capirai come gestirlo e sicuramente convincerai più della povera bestia che di un dilettante.


4
+1 per C e Lisp comune, ma Perl come seconda lingua ?? :) Python servirebbe in modo superbo come linguaggio dinamico, incoraggiando al contempo buone abitudini di programmazione - come il codice è molto leggibile per te e gli altri, nelle settimane, mesi o anni dopo la scrittura iniziale del programma.
limist

1
Per quanto riguarda la raccomandazione Perl: sono solo io a mostrare la mia età. Certo, oggi, Python o Ruby sarebbero sostituti stretti, ma entrambi sono più dogmatici del Perl e più orientati verso l'orientamento agli oggetti in stile classe come un sacco di metodi che un nuovo programmatore che esce da C non fa non è ancora necessario. Ricordo che quando ho imparato il Perl, sono stato immediatamente spaventosamente produttivo, e non molto tempo dopo ho iniziato a usare le sue strutture orientate agli oggetti. Troppo spesso, tutto ciò che l'attenzione di OO è solo distrazione e cerimonia non necessaria.
seh,

Non sono d'accordo con la tua opinione "le operazioni che si fanno in efficienza quando si sale in astrazione". Uno dei pilastri del C ++ è che un programma che utilizza le strutture del C ++ non è mai più lento di un programma C equivalente . Ad esempio, l' utilizzo di funzioni virtuali in C ++ non è mai più lento della simulazione di funzioni virtuali in C.
fredoverflow

Vero, Fred, e questo è ciò che intendevo: sfruttare le funzionalità senza pensare a come funzionano possono comportare costi - costi che potresti aver evitato prima evitando anche la funzionalità delle funzionalità, perché sarebbe stato proibitivamente complicato o semplicemente insufficientemente idiomatico per implementare manualmente. Ad esempio, lamentarsi del fatto che RTTI sia "troppo lento" solleva immediatamente la questione di come altrimenti si risolverà il problema.
seh

6

1. Smalltalk

Progettato originariamente almeno in parte come un modo per i bambini di utilizzare i computer per imparare. La sintassi è abbastanza semplice da descrivere in un paragrafo. Come LOGO, esemplifica il principio "barriera bassa all'ingresso, soffitto alto".

Smalltalk è un linguaggio OO puro , nel senso che "tutto è un oggetto".

Insegna anche molte tecniche funzionali, in particolare nella sua API Collection: concatenare messaggi, funzioni di ordine superiore, mappare, ridurre e così via.

La community di Squeak è vivace e accogliente. Vedrai anche molte discussioni su tecniche avanzate: proprio come la comunità lisp, ci sono molti Smalltalker molto esperti nella mailing list disposti a condividere le loro conoscenze. (Non fa male che la comunità di Squeak abbia una grande sottopopolazione di educatori professionisti.) C'è anche un altro elenco per principianti.

2. PROLOG

Un linguaggio di programmazione logica che ti darà una visione del calcolo molto diversa da qualsiasi altro linguaggio. Prolog è anche altamente dichiarativo (ma non completamente: l' !operatore o cut può avere un significativo effetto semantico su un predicato).

3. Lisp comune

Sostituisci lo schema qui, se lo desideri. Common Lisp supporta molteplici paradigmi, in particolare OO e funzionali. Ha anche una lunga storia (Lisp è il secondo linguaggio più antico ancora ampiamente usato: solo il più vecchio di FORTRAN).

4. Haskell

(Avvertenza: ho appena iniziato a impararlo.) Probabilmente il linguaggio funzionale più puro del pianeta. Ha un sistema di tipo statico molto avanzato. Handy intro libri esistono.

5. C o Delphi

Devi sapere come funzionano i computer. Devi sapere come funzionano effettivamente la memoria e la CPU. Entrambi sono tradizionalmente "vicini al metal" e hanno comunità che incoraggiano a pensare a come il loro linguaggio si compila in assemblea.

Perché questo ordine?

Smalltalk è molto facile da imparare, quindi puoi iniziare rapidamente a concentrarti sulla risoluzione dei problemi piuttosto che sulla lotta contro un compilatore ("bassa barriera all'ingresso"). Una volta che inizi a programmare, non c'è limite artificiale a ciò che puoi fare: "soffitto alto".

Una volta che hai una buona idea di come funziona OO (e - a condizione che ci siano MOLTE diverse interpretazioni sul significato di "OO" - è giusto dire che OO domina il mercato), passare a Prolog ti assicura di non iniziare pensando che OO è l'unico modo. Prolog è molto diverso dalla maggior parte delle lingue e allungherà i muscoli mentali in modo da non iniziare a pensare di sapere tutto.

Il Lisp comune, a sua volta, è la lingua di un adulto. Ha uno standard maturo, ha guidato la progettazione del linguaggio per decenni (insieme a Smalltalk) - tutte quelle nuove fantasiose funzionalità che la tua lingua preferita ha appena acquisito? È probabile che le idee vengano incubate in Lisp o Smalltalk. Anche il Lisp comune è un po 'verrucoso e troverai la verruche ovunque tu vada.

Il quarto di Haskell nella lista perché (mi hanno detto: ho appena iniziato a impararlo) la sua purezza significa che alcune cose molto comuni (come l'I / O) sono più difficili da fare rispetto a linguaggi meno puramente funzionali. La gente di Haskell usa anche alcune terminologie abbastanza esotiche (parole come "catamorfismo", diciamo), e probabilmente staresti meglio con qualche esperienza di programmazione sotto la cintura prima di affrontarla. (Ma devo ripetere, ho appena iniziato a impararlo! Prendi questa opinione con un pizzico di sale!)

E perché C / Delphi dura? Perché se non lavori nei sistemi embedded, non dovresti davvero imparare la programmazione pensando che la gestione manuale della memoria sia tutto ciò che c'è. La raccolta dei rifiuti ha funzionato abbastanza bene per una macchina di livello anni '80. Il tuo telefono è così potente!

Infine, non ho inserito Erlang nell'elenco sopra, anche se dovrei davvero.


2
È una sequenza di apprendimento ?
Wizard79,

È chiaramente una sequenza (di lunghezza 1).
Frank Shearar,

Meno facetiously: fornirò un passo nella sequenza e tu fornirai l'altro, e la comunità voterà sull'ordinamento di detta sequenza, va bene?
Frank Shearar,

3
@Frank Non intendevo questo. Mi aspettavo sequenze complete. E penso che l'ordinamento non possa essere fatto votando.
Gulshan,

Per favore gente: se avete intenzione di votare, spiega perché .
Frank Shearar,

5
  1. Pitone. Un'ottima introduzione alla programmazione. Ciò si collegherà anche a qualsiasi precedente esposizione alla programmazione.

  2. Schema. Ottima anche la programmazione. Se hai a che fare con la programmazione dei novizi, potresti voler insegnare questo e Python in secondo luogo. Un'alternativa sarebbe prima Python e poi Common Lisp invece di Scheme: più lavoro, ma più ricompensa.

  3. C. Un linguaggio di basso livello che rimane vicino al silicio. Buono per imparare cosa può fare un computer. Potresti sostituire qualche forma di linguaggio assembler, ma C è abbastanza vicino alle basi e molto più facile da lavorare.

  4. Prolog. In alternativa, sostituisci qualsiasi linguaggio di uso generale in stile dichiarativo, se riesci a trovarne uno che ti piace di più.

  5. Haskell. Per il sistema di tipi e la pura funzionalità, se non altro.

  6. Ci sono diversi candidati qui, poiché è impossibile coprire tutti i concetti con sei lingue. Vale la pena di imparare Lisp comune, anche se solo per il sistema macro e il sistema a oggetti (che è diverso dalla maggior parte degli altri che ho visto). Forth, Tcl e APL sono tutti linguaggi strani che hanno visto un certo successo, e uno di questi sarebbe utile per impedire allo studente di sentirsi come se avesse imparato tutto. Erlang sarebbe utile per la concorrenza.


"Se hai a che fare con la programmazione di novizi, potresti voler insegnare questo e Python in secondo luogo." Molto d'accordo. È un approccio che la mia ex università ora prende e sembra funzionare molto bene.
pyvi,

Questa è una lista abbastanza buona, probabilmente annullerei l'ordine su Haskell e Prolog. Se lo studente fosse particolarmente mal sperimentato, ne eliminerei sei, salgo la lista e inizio con qualcosa di più semplice.
Orbling

4

Sono state fornite molte buone risposte, ma non ho visto nessuno che offre SQL. È un animale completamente diverso rispetto alla maggior parte degli altri elencati e molto importante per qualsiasi programmatore che abbia a che fare con database.

Potresti anche considerare alcuni 'linguaggi' di scripting a livello di sistema operativo, come Batch, grep, awk, ecc. Anche 'Make' potrebbe rientrare in questa categoria.

Un'altra lingua che potresti prendere in considerazione (se non è ancora completamente morta) è COBOL. È sufficientemente diverso dagli altri linguaggi procedurali che merita una menzione. Le variazioni di C, Fortran, Basic, ecc. Sono diventate così simili che una volta acquisito familiarità con uno, spostarsi su un altro non è un grosso problema, ma a COBOL mancano molti costrutti dati per scontati negli altri. (Sono passati almeno 20 anni da quando ho fatto qualcosa con COBOL, quindi le mie osservazioni potrebbero non essere più valide riguardo a questa lingua.)

Potresti voler menzionare APL solo da un punto di vista storico o lasciarlo riposare in pace. La tua scelta.


1
Il motivo per cui non ho suggerito SQL è che non è un linguaggio generico. Preferirei colpire gli studenti con qualcosa di dichiarativo e più generale, come Prolog. I linguaggi di scripting a livello di sistema operativo non offrono nulla che un linguaggio più generale come Python o Perl non offrirà. L'ultima volta che ho toccato COBOL, non offriva concetti che non si potesse migliorare in altre lingue. Mi piace il suggerimento APL, non tanto per il valore storico quanto che è un linguaggio molto diverso.
David Thornley,

@ David Thornley: concordo sul fatto che SQL non è un linguaggio generico. SQL ha alcuni concetti logici e teorici interessanti come operazioni di base che non emergono in molti altri linguaggi, ad es. unione, unione, raggruppamento, ecc. che vale la pena notare per chiunque abbia a che fare con database.
oosterwal,

Tutte le cose che vorrei vedere insegnate a uno studente, sebbene alcune di esse abbiano un aspetto storico. L'apprendimento dei linguaggi di script è un po 'essenziale, ma potrebbe essere fatto insieme agli altri, lo stesso per SQL, è un linguaggio di servizio per le primarie. Se lo studente era molto bravo in matematica, allora iniziare con APL potrebbe essere carino (o forse R, poiché è molto più facile da leggere, ma può essere usato in modo simile).
Orbling

2

Suggerirei prima di leggere Eric Raymonds "Come diventare un hacker" poiché ha alcuni punti molto interessanti su come iniziare, incluso Lisp che ha il concetto di "codice è dato e dati è codice".

Per la programmazione suggerirei anche Haskell, Prolog, SQL e il linguaggio assembly (solo alcuni).

Indipendentemente da ciò che vuoi imparare, prenditi il ​​tempo per impararlo correttamente e scrivere quantità di codice non banali. È molto simile alla bicicletta: non puoi impararlo da un libro.


2

Primo> Cosa vuoi fare quando inizi a programmare? Imparare a essere un programmatore di giochi è diverso dall'imparare a essere un programmatore di database per un'azienda ... è diverso da un programmatore basato sul web ...

Secondo> Dopo aver iniziato l'apprendimento, vuoi iniziare in alto e scendere verso il basso? Oppure inizia in basso e fatti strada. L'apprendimento di C # (alto livello) è molto diverso dall'apprendimento dell'Assemblea (basso livello).

Un'enorme scelta dipenderà da ciò che vuoi fare. Molto probabilmente la programmazione di un driver includerà C o Assembly ... La programmazione di un sito Web sarà PHP, C #, asp, ecc ... Non toccherai l'assemblaggio per la programmazione web ... ecc ...

Per quanto riguarda le basi ... una volta che decidi COSA vuoi fare, è più facile scegliere una lingua. Ad esempio, sono diventato un analista di dati in un ospedale. Quindi la mia "scelta" di lingue è SQL / TSQL / DB2 per l'accesso ai dati, C # WPF per client Windows, Silverlight per client Web, alcuni RPG / CL per la logica back-end IBM ...

Personalmente mi attengo a un buon libro + costruisco il tuo programma per praticare la lingua. Mi piace APress e mi è piaciuto leggere C # 2008 Illustrated durante l'apprendimento di C #. Hanno altri libri che racchiudono le basi per i non esperti e per gli esperti.


2

Un nuovo arrivato ha bisogno solo di una lingua per iniziare, dopo aver appreso la seconda lingua, stanno già progredendo oltre molti sviluppatori concorrenti. Vorrei imparare nel seguente ordine:

  • Smalltalk: questo è il miglior OO e una semplice esposizione ti aprirà gli occhi sul modo in cui le cose dovrebbero essere fatte. Meglio imparare concetti OO su.
  • Java o C #: fornisce un approccio più architettonico e pianificato a OO, introducendo tipi controllati staticamente.
  • Ruby o Python - Non puoi apprezzarlo fino a quando non hai sentito Java o C #
  • Erlang - concorrenza fatta in un modo che sembra facile. È molto meglio di quanto possano fare le tue lingue OO o C.
  • Lisp, Haskell o altri linguaggi funzionali: è un approccio diverso per risolvere i problemi.
  • C - O costruendo estensioni native per Java o implementando algoritmi di livello inferiore, questo è tanto vicino all'assemblaggio di quanto qualcuno ha bisogno fino a quando non scrivono compilatori

Puoi chiedere "dov'è il C ++?" e che dire di X? Onestamente, l'apprendimento di più lingue fa un paio di cose: arricchisce la tua esperienza e fornisce un impulso per imparare più lingue. L'elenco delle lingue che conosco bene (Java, C #, Ruby, C ++, Javascript) sono tutte orientate agli oggetti, ma principalmente perché è quello che devo fare ogni giorno al lavoro. L'elenco delle lingue a cui sono stato esposto (Smalltalk, Python, Erlang, JESS, C, Assembly [Motorola 6502/6510], Go) mi hanno insegnato lezioni preziose. Posso almeno capire cosa sta succedendo con quelle lingue. Ci sono molte cose che non ho esplorato, ma molto bene in futuro. Ci sono anche alcuni linguaggi di markup: HTML, XSL: FO, XSLT, CSS, XML, SGML a cui le persone hanno bisogno di essere esposti se lavoreranno con il web in qualche modo.

Dopo aver appreso almeno due lingue diverse, non credo davvero che dovresti limitare ciò che qualcuno che ha il desiderio di imparare decide di raccogliere dopo. L'apprendimento dovrebbe essere un'esperienza organica e troppa struttura nel processo crea un gruppo di persone che la pensano esattamente allo stesso modo. Una monocultura per così dire.


2

La maggior parte di queste risposte sembrano più o meno le stesse, quindi offrirò un'opinione diversa. Ho a lungo creduto che la prima lingua migliore fosse il Tcl.

Perché? Per uno, è molto facile da imparare. Non c'è molta sintassi del linguaggio, quindi lo studente può concentrarsi maggiormente sui concetti di programmazione e meno sulle peculiarità sintattiche di un particolare linguaggio. Al momento della stesura di questo documento, Tcl ha esattamente 12 regole che governano l'intera lingua (rispetto alle undici degli ultimi due decenni).

Per un altro, Tcl viene fornito con un fantastico linguaggio GUI integrato, in modo da poter ottenere una gratificazione relativamente istantanea e apprendere le basi della programmazione guidata dagli eventi.

Terzo, è estensibile. Vuoi insegnare un ciclo ripetuto? Puoi scrivere un comando che esegue un ciclo di ripetizione in modo che non solo tu possa imparare come usare la ripetizione ... fino a quando, puoi imparare come è diverso da un ciclo while perché in realtà l'hai scritto tu stesso.

Inoltre, poiché è estensibile, si può facilmente seguire C. È possibile imparare le basi di C e imparare a) estendere Tcl con nuovi comandi scritti in un'altra lingua oppure b) imparare come aggiungere un linguaggio di scripting a un programma scritto in C.

Una volta che hai imparato Tcl e C, la maggior parte delle altre lingue si trovano da qualche parte tra questi due estremi e dovrebbe essere relativamente facile da imparare. Il mio elenco completo, con i quattro che vorrei insegnare dopo Tcl e C sono:

  1. Tcl
  2. C
  3. Python - per i concetti di OO, in più è il comportamento di definire i blocchi per rientro in contrasto con altri linguaggi.
  4. Ruby - per una diversa interpretazione di OO, oltre a binari per conoscere i framework
  5. java: viene utilizzato ovunque, è necessario conoscerlo e conoscere la JVM
  6. groovy - torna indietro a linguaggi dinamici

1

Assembly Assembly, C, SQL, C #

Lo so, noioso e vecchio stile. E l'intera domanda ignora la parte davvero difficile della programmazione, che è la risoluzione dei problemi, la modellazione del dominio e la costruzione di algoritmi. Ma ecco perché:

  1. non puoi farti strada attraverso il linguaggio assembly; o lo capisci o no. il compilatore non ti salverà, non c'è un sovraccarico di framework o librerie e non puoi nasconderti dall'architettura della macchina; è pura programmazione (a livello di principiante aggiungere due numeri)

  2. dopo aver scritto alcuni programmi in linguaggio assembly di più di qualche centinaio di righe, i puntatori e la gestione della memoria non sono più misteriosi e dovresti aver iniziato a notare gli schemi nel codice (if, switch, array, loop, ecc. ). C fa risaltare quei motivi alla luce del sole e li fa risplendere. La libreria standard è utile senza essere immensa, ma non preoccuparti di macro / template / ecc. in questa fase.

  3. ora passa ai database con SQL. Non esagerare con le procedure memorizzate, basta ottenere le basi di tabelle e query.

  4. dopo aver scritto alcuni programmi in C di più di qualche centinaio di righe, puntatori, strutture e gestione della memoria sono una seconda natura e costrutti procedurali sono vecchi amici. Inizierai a notare modelli di ordine superiore: queste funzioni si adattano sempre a questa struttura di dati, questa parte del codice è proprio come quella parte del codice ad eccezione dei metodi X, Y e Z e così via. Aggiungi a questo la tua conoscenza dei dati relazionali e ora sei pronto per un linguaggio orientato agli oggetti. Con una struttura enorme e documentazione generalmente ottusa. Benvenuto nel mondo reale! Esplora le GUI, scrivi app desktop, scrivi siti web, scrivi servizi web, scrivi quello che ti piace. Vai a cercare lavoro se sei così propenso.

Ora sei un Jedi programmatore? Un codice ninja? No , ora sei semplicemente competente. Ma hai una solida base da cui partire per esplorare le nuove brillanti cose divertenti.


1

Hai bisogno di fondamentali:

  1. Codice macchina
  2. linguaggio assembly
  3. C
  4. blesità

Dopodiché probabilmente non ha importanza.


0

OK, questo è l'ultimo giorno per la generosità. E sto aggiungendo la mia risposta. La mia sequenza suggerita

C, C ++, JAVA / C #, Python / Ruby, qualsiasi altra lingua (Assembly / Lisp / Prolog ecc.)

  • Non penso che la prima lingua debba essere la più semplice. Piuttosto penso che dovrebbe dare l'idea generale di come funziona il computer mantenendo un po 'di astrazione.
  • La transizione da C a C ++ sarà più semplice. Ci sarà OOP, il paradigma più usato in questi giorni.
  • La transizione da C ++ a C # / Java sarà più semplice. Preferisco C # perché incorpora molti paradigmi come la programmazione funzionale.
  • Quando qualcuno ora verrà a linguaggi dinamici come Python o Ruby, ci sarà un " WoW ". Sarà più facile sentire la bellezza della digitazione dinamica. Ma prima l'apprendimento di linguaggi dinamici e quelli statici in seguito causeranno " Oh! Perché devo aggiungere tutti questi? "
  • Ora, i paradigmi e le lingue più utilizzati sono quasi terminati. Quindi, esplora quello che vuoi. Da Assembly a Lisp, Prolog o Haskell. E scopri nuovi contesti e funzionalità di vari linguaggi di programmazione.

Qui C è solo per iniziare.
Gulshan,

la preferenza di C # rispetto a Java dipende da molti fattori, direi che entrambi sono quasi uguali.
prasonscala,

0

Schema, C, C ++

Sarò di parte e userò il modello che la mia università attualmente utilizza per il suo curriculum informatico di base. Ero contrario durante il mio primo anno, ma negli anni successivi ne sono grato. Il modello si basa sul non richiedere alcuna esperienza di programmazione ma sulla capacità di apprendere.

  1. Schema
    Stiamo imparando prima la programmazione, meno magia, meglio è. La lingua di insegnamento di Scheme presenta una definizione chiara e ragionevole di una lingua, un insieme veramente piccolo di assiomi (la "magia") su cui puoi costruire ed espandere. Chiunque sia in grado di comprendere le funzioni matematiche può tracciare e ragionare sui programmi Schema. Iniziare con Scheme fornisce un modo pulito ma potente di pensare al calcolo senza preoccuparsi dei dettagli specifici della lingua.

  2. C Il
    passaggio da Schema a C è drastico, ma ti consente di conoscere l'importantissima mappatura delle lingue di alto livello su lingue di basso livello. Imparare il modello di memoria (puntatori, heap, stack ecc.) E come vengono compilati ed eseguiti i programmi, come funzionano i puntatori, lo stack e l'heap sono abilità essenziali. Attraverso questa comprensione di basso livello puoi iniziare ad analizzare i programmi ad un livello superiore (Big O). Puoi iniziare a creare i tuoi tipi di dati astratti, giocando con diverse implementazioni (ad esempio una tabella hash semplice rispetto a un albero binario per un set).

  3. C ++
    Attraverso l'apprendimento del C e dello Schema iniziamo a vedere diversi paradigmi di linguaggi di programmazione e come possono applicarsi a problemi diversi. Ora puoi affrontare gli aspetti più spaventosi della programmazione: scelta e compromessi. La scelta del linguaggio di programmazione può influire sulle prestazioni, sulla leggibilità, sulla manutenibilità, sulla solidità, ecc. Per risolvere problemi più grandi di quelli che puoi tenere in testa, questa scelta è ottima ma anche pericolosa. C ++ tenta di fare il minor numero possibile di scelte per il programmatore. Attraverso l'apprendimento del C ++ imparerai come fare questi compromessi e le tue scelte per risolvere i tuoi problemi.

Potresti non usare nessuna di queste lingue nell'industria o mai toccarle di nuovo, ma il processo di apprendimento delle lingue ti aiuta a capire le altre lingue che utilizzerai. Un altro aspetto è imparare gli strumenti intorno a una lingua specifica. Esecuzione di gcc attraverso la riga di comando, apprendimento di Vim, passaggio a un programma tramite GDB, creazione di file, controllo del codice tramite SVN, scrittura di script shell per automatizzare i test ecc.

Intendiamoci, il curriculum di base ha anche altri corsi (architettura dei computer, strutture dati e algoritmi, compilatori, sistemi operativi ecc.). Quindi semplicemente imparare queste lingue non è abbastanza per essere abili nella programmazione.


0

Passare da una lingua di base a quella di alto livello è la strada da percorrere. In questo modo hai ancora un'idea di cosa sta succedendo nella parte posteriore.

  • C - Puntatori e gestione della memoria
  • C ++ - Nozioni di base OO e ancora molto popolare
  • Java / C # - Lingue più popolari
  • Qualche assemblaggio di base
  • Linguaggio funzionale - Ad esempio Haskell
  • Linguaggio di script - Ad esempio Python

0
  1. Pitone. Per fare cose, fai la normale programmazione. Procedurale, OO e (in parte) funzionale.

  2. Espressioni regolari. Sono nella libreria Python, ma è un DSL separato.

  3. Shell (BASH o altro). "&", "|", ";" gli operatori per combinare i processi sono critici e spiacevoli in Python.

  4. SQL. Questa è - per ora - la lingua franca per l'accesso ai dati.

  5. XHTML. Questa è - per ora - la lingua franca per la presentazione dei dati.

  6. CSS.

Forse C se fosse necessario.


Sembra che tu abbia lasciato fuori il palcoscenico della " profonda illuminazione ". È quel numero 7?
Segna C

@Mark C: sto solo cercando di coprire "la maggior parte delle lingue e dei paradigmi pesantemente usati oggi". Nella mia esperienza, questi "altri" o DSL sono forse più usati dei linguaggi di programmazione. Non sono sicuro che questo porti a una profonda illuminazione, ma solo all'esposizione a molte lingue effettivamente utilizzate.
S.Lott

Hai ragione, vedo che l'ha detto, poi ho notato che ha anche detto "o paradigmi". Era solo di buon umore.
Marco C

@Mark C: Ma SQL e CSS sono gli "altri paradigmi" che sono i più interessanti. In effetti Regular Expressions è un paradigma che causa molte domande su StackTranslate.it.
S.Lott

0

Inizia vicino al metallo:

  1. assembler
  2. C
  3. C ++
  4. C #
  5. blesità
  6. Python o Ruby

Ora il problema con un approccio così ampio è che nessuno può diventare remotamente capace in queste lingue senza anni di studio.

  1. Assemblatore: 3 mesi
  2. C: 6 mesi
  3. C ++: 2 anni
  4. C #: 6 mesi
  5. Lisp: 3 mesi
  6. Python / Ruby: 3 mesi

A meno che il tuo intento non sia quello di insegnare loro "Ciao mondo", che dovrebbe richiedere circa un mese per tutti e 6.


-1

Perché non andare direttamente e imparare VB o C #. Entrambi secondo me sono lingue complete che vanno dal principiante all'avanzato, imho.


4
Perché non è ampia, e quindi non è una risposta alla domanda. Inoltre, se pensi che uno (o entrambi) copra tutto ciò che dovresti imparare, tu stesso devi imparare più lingue.
David Thornley,
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.