Tutoraggio degli studenti che stanno lottando con le nozioni di base in C ++ [chiuso]


26

Sto tutorando alcuni studenti che hanno grossi problemi nell'apprendimento delle basi del loro primo linguaggio di programmazione: C ++. Ho conosciuto molti studenti eccellenti e brillanti che hanno fallito o abbandonato il loro primo corso di CS. Tutti quelli che sto insegnando danno un resoconto simile della sua esperienza in classe: l'istruttore si muove troppo velocemente, nulla nelle lezioni ha alcun senso, et al. Prima di questa lezione CS, la maggior parte di questi studenti in difficoltà non aveva espresso alcun interesse per i computer come qualcosa di più di elaboratori di testi, browser Web o altre forme di intrattenimento. Il computer è una blackbox che funziona, quindi perché scherzarci?

La mia ipotesi migliore è che abbiano problemi a collegare le astrazioni dell'informatica con concetti familiari. Vale a dire, questi studenti potrebbero sapere come imparare la matematica, la biologia o la fisica, ma quelle tecniche non funzionano quando si tratta di programmazione.

Qualcuno ha qualche suggerimento o consiglio? Gli studenti che sto aiutando non meritano di fallire questa lezione. È chiaro che l'istruttore non sta prendendo in considerazione lo stile di apprendimento di questi studenti. Vale a dire, l'istruttore non sta fallendo i suoi studenti.


2
Commentatori: se hai una risposta, lasciala come risposta: non lasciarla come commento. Se la tua risposta è già stata aggiunta, votala. Se vuoi discutere l'argomento di questa domanda con altri, usa la chat .

1
Non lo fanno? Dalla mia esperienza ci sono abbastanza persone che programmano e non dovrebbero ...

Risposte:


42

Ci sono alcune cose con cui praticamente ogni principiante lotta. Gli studenti devono sapere come leggere il codice prima di poter imparare a scrivere il codice.

  • La natura sequenziale dei linguaggi imperativi. Le persone hanno difficoltà a capire che le funzioni vengono eseguite in sequenza, un elemento alla volta, come una ricetta. Un modo per ovviare a questo è mostrare del codice che funziona attraverso un debugger.
  • L'operatore di assegnazione ( =) in linguaggi di tipo C è estremamente fuorviante. È necessario spiegare con molta attenzione che a = 5significa "assegnare 5 alla variabile a, non " a è uguale a 5 ".
  • Per i principianti, è sicuro descrivere le funzioni come blocchi strutturati di codice a cui altre funzioni possono saltare. Inoltre, i principianti hanno difficoltà a comprendere che in C ++ gli argomenti delle funzioni sono identificati per ordine, non per nome.
  • La maggior parte dei linguaggi di programmazione imperativi ha alcuni componenti dichiarativi e alcuni componenti procedurali e C ++ non fa eccezione. Assicurati che lo studente capisca che alcune parti del codice descrivono la struttura del programma e altre parti (funzioni) descrivono cosa dovrebbe fare il programma.
  • Passare attraverso un programma con il debugger è uno strumento di insegnamento estremamente importante e spesso trascurato .
  • Le espressioni hanno tipi . 3+3è un numero intero, 3.5 + 3è un doppio, "3" + "3"(in C #) è una stringa, x == 5 * 3 + 25è un valore booleano (o intero in C ++). Trascorrere molto tempo per assicurarsi che lo studente sia completamente a suo agio con questa nozione.
  • L'ambito variabile è qualcosa che i principianti vengono sempre confusi. Spiegare allo studente come funziona l'ambito e assicurarsi che sappiano che un ambito xdefinito è diverso da un ambito xdefinito in un altro ambito.
  • Ogni variabile viene referenziata almeno tre volte nel corso della sua vita: dichiarazione, assegnazione (spesso eseguita sulla stessa riga della dichiarazione), consumo. Se manca uno di questi, allora c'è un errore concettuale da qualche parte. Per lo stesso motivo, se stai analizzando un programma di lavoro, puoi sempre cercare queste tre cose nel codice per capire lo scopo di una variabile.
  • for i loop non dovrebbero essere insegnati fino a quando non vengono utilizzati esempi adeguati di iterazione while vengono forniti loop. La sintassi abbreviata è confusa e lascia gli studenti chiedendosi perché non possono semplicemente usare i whileloop. Avere un cheat sheet che descrive un forloop in termini di whileloop può essere utile.
  • Matrici e puntatori sono abbastanza facili da insegnare, ma un incubo da imparare. In altre parole, fino allo scatto, la pratica è importante.
  • L'idea che il codice sia un testo e che un programma compilato sia in effetti un file è inafferrabile per alcuni principianti. Assicurati di mostrare loro i file .cpp, .h e binari nella shell.

I componenti OOP di C ++ sono una bestia completamente diversa e spero che l'istruttore non ci arrivi, perché OOP è meglio insegnare usando linguaggi progettati da zero per essere OOP. Nella mia esperienza, insegnare OOP attraverso il C ++ non è mai andato bene.


2
"Le persone hanno difficoltà a capire che le funzioni sono eseguite in sequenza"? Penso che praticamente non ci siano problemi con nessuno (tranne, forse, le persone che hanno già imparato un linguaggio funzionale prima di iniziare la procedura). Ma sono d'accordo su tutto ciò che dici.
lasciato circa il

3
+1 per il passaggio con il debugger, in modo da avere un'idea della differenza tra il programma stesso e l'esecuzione di esso.
Mike Dunlavey,

4
@leftaroundabout Saresti sorpreso. La matematica è per lo più dichiarativa, quindi i linguaggi imperativi possono respingere chiunque abbia imparato l'algebra.
Rei Miyasaka,

2
Questa risposta sembra essere solo un po '"sconcertante". I concetti sono senza dubbio corretti e certamente importanti, ma insegnare in questo modo è un po 'come cercare di insegnare a qualcuno come guidare agitando le regole della strada.
riwalk

@ Stargazer712 Tutti imparano le regole della strada prima di poter provare la prova su strada. Potrei presentare idee a soffio largo come "la pratica è la chiave" o "essere creativi" o "pensare in modo logico", ma queste cose sono presumibilmente abbastanza ovvie per qualsiasi istruttore, così come per la maggior parte degli studenti. Si potrebbe anche insegnare cose astratte come la matematica discreta o la teoria del linguaggio come precursore della programmazione, ma ciò diventa importante solo quando la meccanica è così complessa che i problemi non possono essere risolti solo dall'intuizione. Prima o poi le persone devono smettere di essere zen e iniziare a insegnare contenuti .
Rei Miyasaka,

19

Hai già insegnato programmazione?

Ho insegnato programmazione a major CS e non CS per quattro anni. Il primo semestre, la mia esperienza è stata come la tua, fino a quando ho imparato alcune cose.

Ciò che mi sembrava vacuamente semplice non lo era affatto per i principianti.

Indipendentemente dal linguaggio, devi mettere in atto una struttura mentale - cose così ovvie che non ti rendi nemmeno conto di conoscerle, come:

  • I computer fanno solo una cosa alla volta. (Chiunque dica di avere parallelismo e pipeline, vattene. Torna quando gli studenti sanno qualcosa.) I computer possono fare solo un piccolo numero di cose diverse e non possono iniziare a fare un passo fino a quando il precedente non è finito. Sto solo dicendo questo, perché i computer sembrano fare così tante cose, e istantaneamente, che per un principiante sembra che facciano tutto in una volta, e leggano anche la tua mente.

  • Le variabili sono importanti. È essenziale capire che il nome di una variabile e il suo contenuto in fase di esecuzione sono due cose completamente diverse. I principianti hanno difficoltà con questo. Se dico "Scrivi un programma per inserire il tuo nome e poi ti saluto", devono capire che hanno bisogno di una variabile per contenere il loro nome, e devono trovare un nome per la variabile e sono tentati chiamarlo come se stesso e chiedersi cosa significhi "input".

  • C'è un'enorme differenza tra l'ora in cui si scrive / modifica il programma e l'ora in cui viene eseguito. Durante i loro primi esercizi, devono essere ricordati abbastanza spesso.

Il linguaggio che ho usato era BASIC, perché è molto semplice per i principianti. Non è difficile passare ad altre lingue dopo aver sviluppato una serie di abilità di programmazione di base.

Spesso scrivevamo un programma alla lavagna e poi "giocavamo al computer". Cioè, metti una X accanto all'istruzione corrente, fallo manualmente, quindi sposta la X sull'istruzione successiva. Le variabili erano rettangoli sul tabellone, dove scrivevamo i contenuti attuali. Quando si verifica un compito, lo cancelliamo e inseriamo il nuovo valore.

Un trucco che ho sviluppato è stato un computer decimale simulato, con 1000 posizioni di memoria, ciascuna in grado di contenere un numero di 4 cifre. C'era una piccola serie di "codici operativi" come caricare l'accumulatore, aggiungere, memorizzare, saltare, ecc. Vorrei che scrivessero piccoli programmi in questo "linguaggio macchina" e poi lo facessi un singolo passo per vederlo funzionare. Successivamente, concetti come variabili, salto e così via sono molto più facili da spiegare.

Spero che sia d'aiuto.


Mi piace l'idea del computer simulato. Hai un linguaggio formale o discuti le idee in pseudocodice / inglese semplice?
Rei Miyasaka,

@Rei: ho scritto (in BASIC) un simulatore chiamato Simple. Era tutta l'interfaccia della tastiera. L'utente può inserire valori in "memoria"; quindi potevano eseguire un singolo passaggio ed esaminare l'accumulatore e la memoria in ogni punto, se lo desideravano. Penso che questo sia stato davvero importante perché li ha indotti a farlo, non solo a parlarne.
Mike Dunlavey,

Ah ok Grazie, dovrei provare qualcosa del genere.
Rei Miyasaka,

Questa dovrebbe essere la risposta n. 1 secondo me.
riwalk

12

A mio avviso, il C ++ è eccessivo come prima lingua.

Se fossi in te e avessi abbastanza tempo a disposizione, vorrei introdurre concetti di programmazione e CS usando Python (o simili).

Quando i concetti sono chiari, vale a dire quando sono a loro agio con strutture di dati di base, indiretta, algoritmi di base, ecc., Introdurrei lentamente C ++ e saranno molto rapidamente in grado di relazionarsi con ciò che avrebbero già imparato.


2
Sono d'accordo, ma i prof di solito non hanno il diritto di scegliere quale lingua insegnare, e tanto meno TA.
Rei Miyasaka,

4
Non sono d'accordo su Python. Ho seguito la mia prima lezione CS 101 su C ++ e poi sono passato a una scuola che insegnava CS 101 a Python. Gli studenti Python erano COSÌ confusi anche sulle basi quando tutti prendemmo la stessa classe CS 201 ... Ma tutti gli studenti C ++ eccellevano.
Oghma Osiris,

@OghmaOsiris, Francamente, non so abbastanza di Python, ma potrebbe essere quello a cui hai assistito potrebbe essere stata semplicemente la manifestazione di un pregiudizio all'auto-selezione. Dopotutto, il C ++ fa davvero paura per alcuni studenti (specialmente per gli studenti più inesperti nella programmazione).
Stephan Branczyk,

@Oghma Cos'era la classe 201? Se è qualcosa di basso livello, dovrebbe probabilmente essere il suo ramo con C come prerequisito.
Rei Miyasaka,

1
@OghmaOsiris: Hmmm Non sono d'accordo, beh, non sono d'accordo, condivido un'esperienza diversa nel mio passaggio universale a Python poiché una prima lingua si è rivelata molto utile per quanto ne so (la prima era Java no C ++). Non penso che le esperienze individuali contino come una cosa dell'una sia migliore dell'altra, che è una guerra a fiamma senza fine. Potrei argomentare, però, che Python potrebbe essere un ottimo linguaggio di programmazione per cominciare perché non si mette in cammino, in realtà lo fa meglio della maggior parte dei linguaggi di programmazione, che attira molti studenti ....
Trufa

4

Ecco cosa consiglierei:

  1. Fornisci loro tutti i dettagli di cui hanno bisogno per capirlo
  2. Incoraggiali a cercare di capire i dettagli
  3. Assicurati che i dettagli siano memorizzati in forma compatta ogni volta che ne hanno bisogno

Fondamentalmente, ti consiglio di creare un singolo foglio A4 che contenga tutti i dettagli necessari. Una specie di manuale di riferimento che ha tutti i dettagli. Alcuni libri possono anche aiutare, ad esempio il libro "Il linguaggio di programmazione C" ha aiutato moltissimo perché aveva tutti i dettagli necessari disponibili in forma compatta. La compressione delle informazioni è una parte necessaria nella creazione della carta a4 che contiene tutti i dettagli.


3

La programmazione è sostanzialmente diversa dagli altri domini comuni che uno studente incontra. Molti studenti prima del college sono riusciti semplicemente prestando attenzione in classe e forse facendo alcuni compiti a casa con problemi facili e le risposte nella parte posteriore del libro. Si tratta più di memorizzare i processi e quindi di crearli. È anche la prima volta che molti studenti ottengono ripetutamente la risposta sbagliata (errori di sintassi, errori logici, errori di seg, ecc.). Questo può drenare la motivazione degli studenti quando si lavora su programmi.

Per sapere veramente cosa sta succedendo con la programmazione, dovranno PRATICARE MOLTO. Una tecnica spesso trascurata è quella di farli scrivere il codice psuedo in qualunque lingua madre sia la prima. Chiedi loro di continuare ad espanderlo fino a quando non avranno una soluzione abbastanza dettagliata al problema. Quindi si tratta di tradurlo in codice reale.


3

Quando ero al college, ero un tutor per l'introduzione al corso di programmazione tra gli altri corsi. Il problema che stai descrivendo non è raro. A seconda di quale sia il tuo ruolo specifico, potresti avere diversi approcci che desideri adottare.

In primo luogo, se questo è un problema diffuso che interessa porzioni significative degli studenti in classe, se hai accesso a farlo, mi rivolgerei al professore che insegna al corso con un feedback specifico su quali concetti gli studenti non riescono a comprendere, in modo che lui o può o incorporare un'ulteriore revisione di quel materiale man mano che si ripresenta nel termine, o migliorare il curriculum per i termini futuri.

Se insegni una sezione di discussione per il corso oltre al tempo di laboratorio, sarebbe un momento meraviglioso per spiegare le cose che erano confuse durante la lezione e contribuire a renderle più concrete e assicurarsi che i fondamenti fossero tutti compresi.

Se l'unica volta che lavori con questi studenti è durante il tuo tempo nel laboratorio di tutoraggio, puoi comunque usare questo tempo per insegnare agli studenti uno a uno, o pochi alla volta, i mattoni concettuali di cui hanno bisogno per capire e completa i compiti.

Potrebbero sentirsi così persi in classe che non sanno nemmeno dove fermarsi e fare domande. In tal caso, torna alle basi con loro. Dove erano nel corso l'ultima volta che hanno capito cosa stava succedendo? Se non sono sicuri o "mai" compresi, potresti dover ricominciare da capo a spiegare il mondo, insegnando loro cose come una variabile, come il computer prende la loro lista di "istruzioni" e cerca di fateli in ordine, ma il computer non è così "intelligente" come noi, quindi dovete essere molto letterali e dire cose che il computer capisce esattamente, ecc.

Questo è in realtà un punto di lotta e frustrazione che ho visto abbastanza frequentemente nei corsi di programmazione non-major. Gli studenti scrivono del codice. Sembra "a proposito" giusto, ma poi vanno a compilarlo e dà un errore, un errore molto enigmatico. E non hanno idea di cosa ci sia che non va. E fissa il loro codice per ore. Poi finalmente ho capito che era qualcosa che sembra banale, come un punto e virgola mancante o un tutore nel posto sbagliato. Poi lo compilano di nuovo, e c'è ancora un errore, è qualcos'altro. Hanno digitato un nome variabile in modo diverso la seconda volta che lo hanno usato. E così via. Quindi chiedono aiuto a un amico, un tutor o qualcuno, e possono rispondere dall'alto della testa "oh, basta aggiungere questo lì e poi funzionerà". Quindi la loro esperienza è che la programmazione è un po '"misteriosa"

Questa è un'area come tutor, dove hai molto spazio per aiutarti. A seconda del loro livello di frustrazione, potrei avere approcci diversi per aiutarli a capire perché il loro codice non funziona. Se riescono a ottenerlo, potrei dare loro dei suggerimenti e provare ad aiutarli a capire da soli. Ma se sono solo alla fine della loro corda per essere pronti a rinunciare frustrati, spesso darò loro un paio di risposte gratuite e poi proverò almeno a porre loro domande come "capisci perché questo cambiamento ha risolto il tuo programma? ?"

Per alcuni studenti, in particolare i non-major, potrebbero non avere la metodica attenzione ai dettagli necessaria per essere un buon programmatore o godere della programmazione. Puoi tenerli a mano attraverso strategie per aiutarli a prestare attenzione ai dettagli ed essere abbastanza metodici per risolvere i problemi anche se è una sfida per loro.

Ma anal-ritentivo sugli studenti che indentano il loro codice "correttamente" - così spesso, i programmatori principianti creano problemi con l'annidamento e l'ambito perché hanno parentesi graffe o simili perché non prestano attenzione a ciò che è nidificato sotto ciò. Fornisci loro una lista di "cose ​​da controllare quando il tuo programma non verrà compilato", come indentare correttamente tutto il codice e assicurarti che le parentesi graffe corrispondano, assicurati che tutte le righe finiscano in punto e virgola, specialmente attorno al numero di riga in cui viene visualizzato il primo errore su, ecc.

Insegnate loro a compilare presto e compilare spesso. Scrivi il codice skeleton minimo (diciamo ciao mondo), compila / prova. Aggiungi qualche riga, compila di nuovo. È molto più facile trovare errori se stai guardando solo un piccolo secchio di modifiche e non un grosso secchio.

Aiutali a imparare come scomporre un problema in piccoli problemi risolvibili. Questa è la stessa cosa che facciamo come programmatori professionisti che risolvono problemi molto più difficili che non sappiamo risolvere. Continui a scomporlo in pezzi fino ad arrivare a qualcosa che o sai come risolvere o puoi fare qualche ricerca per imparare a risolvere. "Quali passi dovresti prendere per arrivare a una soluzione funzionante?" Bene, prima avresti bisogno di un po 'di codice scheletro (ciao mondo). Sai come farlo? Sì, fantastico, quindi quando abbiamo finito di parlare puoi iniziare facendo così! Quindi deve leggere un file come input. Ti ricordi di averlo letto nel capitolo 4? Non proprio? Perché non vai a dargli un'occhiata dopo aver fatto ciao il mondo in esecuzione, e vedere quanto vicino puoi arrivare a farlo funzionare e poi richiamarmi e io ' Ti aiuterò un po 'di più quando rimarrai bloccato. Le prime volte potrebbe essere necessario creare un elenco numerato per loro dei passaggi necessari per risolvere il problema, in modo che possano imparare dall'esempio come scomporre il problema.

Se stanno ricevendo un po 'di materiale in classe, ma non tutto, incoraggiali a porre domande in classe, perché nove volte su dieci, non sono gli unici studenti a non capire, e il professore probabilmente ha semplicemente sorpreso qualcosa di importante.

Se trascorrono "ore" a fissare un bug ma non a capirlo, è una perdita di tempo, non stanno imparando molto da esso. Spesso i bug sono problemi di insight, ed è una questione di trovare la giusta intuizione per risolverlo, e potrebbero non avere un talento per questi tipi di problemi. Suggerisci altri approcci generali da adottare quando rimangono bloccati: chiedi aiuto a un altro amico della classe (conosci alcuni compagni di classe se necessario per farlo), inizia a fare i compiti in anticipo in modo che abbiano il tempo di fermarsi e poi entrano il laboratorio del tutor e porre domande durante gli orari di apertura o andare negli orari di ufficio del professore. Se sono abituati a stipare, che funziona bene per i soggetti della memorizzazione, colpiranno un muro di frustrazione quando " di fronte alla programmazione che riguarda più la risoluzione dei problemi che la memorizzazione. Mostra loro come cercare esempi di sintassi dal loro libro di testo, stackoverflow, ecc. Incoraggiali a pubblicare una domanda su un forum di domande di classe privata, se presente.

Insegna loro come restringere la posizione in cui il codice smette di funzionare. Commenta le cose fino a quando non torni a qualcosa che funziona, quindi aggiungi lentamente le cose fino a quando non ottieni di nuovo quel segfault.

Molte di queste idee potrebbero essere trasformate in dispense se escono molto. Di solito le strategie sono la parte in cui i professori sorvolano: trascorrono il loro tempo sulla sintassi, sulla semantica di come scrivere loop, array, I / O, ecc. Ma non c'è abbastanza tempo speso per "cosa devo fare quando provo eseguire il mio codice e semplicemente non si compila o si blocca su di me? "

Quando si tratta di cose concettuali, in particolare fondamentali, come "cos'è una variabile" o "cos'è un ciclo?" non capire che impedirà loro di essere in grado di tenere il passo con il resto del corso. In un corso basato su lezioni, il professore potrebbe non avere il tempo di rispondere a tutte le domande o aiutare la lampadina a spegnersi per ogni singolo studente. E questo è uno dei motivi per cui i tutor sono così importanti per l'apprendimento della programmazione. Potrebbero aver bisogno di istruzioni personalizzate con analogie aggiuntive per rendere concreto un determinato argomento.

Dato che insegni in C ++, immagino che le lezioni emergano come un argomento astratto che alcuni studenti hanno difficoltà a "ottenere". Spesso l'astrazione delle classi viene insegnata con esempi corrispondenti ad alcuni oggetti casuali del mondo reale, come una "macchina ATM", e vengono fatte analogie con l'oggetto del mondo reale. Potresti avere variabili per tenere traccia di quanti soldi ci sono dentro, hai dei metodi, che sono come regole che dicono alla macchina bancomat come rispondere a condizioni particolari, ecc. A volte un'analogia è quella che "si attacca" per una persona in particolare e altri studenti ne comprendono meglio uno diverso.

Quando possibile, disegna immagini per loro. Come un diagramma di sequenza di ciò che accade nel tempo per aiutarli a vedere il quadro generale di ciò che fa il codice che stanno scrivendo. L'utente fa clic su questo pulsante. Quindi il programma dovrebbe rispondere eseguendo x, ye z. Disegna una matrice come un gruppo di caselle postali presso l'ufficio postale che può contenere ciascuna un solo numero e puntatori come frecce che puntano verso "l'indirizzo" nella parte anteriore della scatola. Eccetera.


2

Di tutte le meravigliose scelte per i linguaggi di programmazione là fuori, questo college utilizza il C ++ come classe CS di introduzione per le major non CS ?? Nelle mani di un talentuoso istruttore, potrebbe essere concepibile da remoto - ma perché renderlo così difficile?

Quando ho imparato "Pascal" nel mio corso introduttivo di CS sul college, abbiamo trascorso le prime 3 settimane a lavorare con " Karel il robot ". Questo era un ambiente di programmazione simile a un logo sandbox molto semplice in cui tutti i concetti di base (inclusa la ricorsione) sono stati esplorati a fondo prima di farlo in Pascal. In "Karel il robot", controlli un robot nello spazio 2D usando un piccolo set di comandi semplici. Ciò fornisce agli studenti un'utile base concreta su cui possono attingere per quello che succederà dopo.

Forse ora ci sono linguaggi di programmazione didattica più moderni che ricoprono il ruolo di "Karel the Robot"? Probabilmente è troppo tardi per i tuoi studenti adesso, comunque.


Avevamo un programma simile chiamato Alice.
Oghma Osiris,


@OghmaOsiris Il collegamento Alice è interrotto. Il trailing "è stato aggiunto all'URL.
Zoot

Sì, senza di essa la fine ')' è stata interrotta.
OghmaOsiris,


2

Oltre a ciò che è stato detto, suppongo che come principianti debbano solo graffiare la superficie, quindi adatta il tuo curriculum di conseguenza per evitare cose complesse.

0-dai loro un semplice problema (diciamo valuta un'espressione).

1-dare loro il tempo di capirlo.

2-dare loro la risposta.

3-passare attraverso la risposta riga per riga

4-chiedi loro di confrontare la tua risposta con il loro atteggiamento

5-chiedi loro di trarre la lezione da questo problema

6-aggiungere un ulteriore passaggio al problema SAME, ad esempio una condizione che richiede un'istruzione IF

7-ripetere l'operazione sopra su diversi problemi. A quel punto avrebbero compreso le basi del linguaggio e come usare l'ambiente. Sarebbe pronto per ciò che verrà dopo.

Anche,

-hanno un semplice problema bonus per loro di provare a casa ogni 2 classi circa

-impegnarsi con ogni studente per vedere qual è il punto che gli impedisce di andare oltre

-fornire materiale di riferimento facile, dimenticare argomenti complessi e libri complessi

-metti frequentemente il loro feedback e usalo

-affermali a prepararsi per il prossimo argomento prima che arrivino in classe


2

Ciò che mi ha aiutato quando ho attraversato CS 101 è stato imparare la logica prima ancora di guardare il codice. Abbiamo esaminato le tabelle di verità e il calcolo preposizionale solo per iniziare a pensare "questo è vero o falso" e non "questo equivale a questo o quello".

Proprio così c'era quando tutto ha fatto clic per me. Una volta capito che la programmazione sta fondamentalmente semplicemente manipolando i valori vero / falso nel suo nucleo, tutto è diventato relativamente semplice.

E questo ha fatto sì che non importava quale lingua stavo usando, la logica è la stessa ovunque. La sintassi potrebbe essere fonte di confusione, ma posso dire cose come "Ok, in Obj CI inviare messaggi a classi come questa e in C ++ i messaggi sono stati inviati in questo modo. Ma l'algoritmo non è cambiato affatto". eccetera.


2

C'è un articolo ACM o IEEE da qualche parte che approfondisce alcuni dei motivi per cui i principianti (anche i laureati CS che iniziano sul campo) devono sedersi dietro un programmatore senior e vederli codificare un problema.

I professionisti spesso si accoppiano per problemi difficili. Troppo spesso viene detto agli studenti di non farlo. Vantaggi dell'accoppiamento (alternandosi con la tastiera): 1. Lo studente viene informato immediatamente di ciò che sta facendo di sbagliato. Feedback immediato. 2. Quando lo studente osserva l'insegnante, lo studente riprende cose che l'insegnante non avrebbe mai pensato di sottolineare.

Invece di lasciare che uno studente sviluppi cattive pratiche, vengono stroncati sul nascere. (Vorrei girare # 1 con # 2 qui e lasciare che lo studente guardasse l'istruttore / TA PRIMA )

Insegnare a CS con un set statico di diapositive powerpoint non si presta bene al processo temporale di scrittura di un programma. (Concesso che ci sono trucchi che puoi fare con funzioni crescenti riga per riga, ma di solito sono imbarazzanti.)

Gli studenti devono sapere dove iniziare a scrivere e dove fermarsi e compilare. I nostri cervelli sono per lo più cablati per leggere da sinistra a destra dall'alto verso il basso, ma un programma è come un tutto scegli il tuo libro di avventura stipato in una singola pagina!

Troppo spesso un principiante copia un intero programma e quindi lo compila. Perfino un professionista potrebbe fare una prima rottura in quel modo, prima di rendersi conto che avrebbe dovuto lasciare tutte le funzioni vuote e compilare il programma, per poi aggiungere iterativamente in uno scheletro funzionante.

Inoltre, è collegata l'idea ridicola che CS dovrebbe essere insegnato senza un computer e solo carta e matita. Mi chiedo quanti professionisti della programmazione impiegati pensano davvero che questo sia il modo migliore, o se è proprio quello che fanno gli istruttori CS perché a loro stessi non piace lavorare con i computer? Qualsiasi tentativo di rimuovere un computer dall'immagine è mediocre. Ciò rende la programmazione meno divertente e meno interattiva di quanto dovrebbe essere. Passiamo da molto tempo a inserire i dati in una scheda perforata e ad attendere pazientemente. Gli sviluppatori professionisti di oggi sono fan della gratificazione istantanea. Fortunatamente anche la maggior parte degli studenti.

Ovviamente il disegno di graziosi disegni con carta e matita prima e durante il processo di sviluppo è un potente strumento sia per i programmatori professionisti che per i principianti. Questo come il tempo "mani sulla tastiera" dovrebbe essere speso anche per l'accoppiamento! Forse qui potrebbe avere senso lasciare che lo studente tenti il ​​primo round prima di guardare l'insegnante, anche se con questo vale probabilmente la pena vedere il vero processo di pensiero dell'insegnante.

Infine, i tasti di scelta rapida e i trucchi di modifica utilizzati dallo sviluppatore professionista non sono "rumori" per l'apprendimento dello studente. Soprattutto, coinvolgono e interessano lo studente. In secondo luogo, sensibilizzano ai bisogni di sviluppo comuni. Inoltre, le più elementari di queste pratiche sono spesso facili da eseguire ma inizialmente non ovvie. Un giovane studente di bottega di legno può facilmente imparare a rimuovere un chiodo con l'artiglio di un martello, ma nella maggior parte dei casi bisogna prima dire che è a questo che serve l'artiglio. Alcune cose estremamente facili da fare non sono semplicemente banali da imparare senza essere insegnate. Anche gli sviluppatori professionisti dimenticano continuamente questi "trucchi" e beneficiano di strumenti di refactoring come resharper per rimuovere codice ridondante o non raggiunto, ecc.


1
a proposito, se qualcuno potesse indicarmi il titolo di quell'articolo lo apprezzerei!
David,

2

La programmazione informatica è spesso uno dei primi corsi in cui l'abilità cognitiva della sintesi è richiesta per un voto di passaggio. Questa abilità è molto difficile da impartire a qualcun altro. Puoi spiegare tutti i componenti che hanno a loro disposizione e come funzionano. Puoi dare una moltitudine di esempi di come altre persone hanno usato la sintesi per combinare quei componenti in un insieme più utile, ma c'è solo così tanto che puoi fare senza qualcosa che "fa clic" nella mente dello studente.

Nella mia esperienza è l'abilità di sintesi che sfugge molto spesso alle persone che non "ottengono" la programmazione. Hanno una perfetta comprensione delle parti, come variabili, funzioni e loop, ma fanno domande del tipo: "Capisco perché funziona, ma come facevi a sapere che dovevi mettere un loop lì?" Devi semplicemente esercitarti finché non lo ottieni.


2

Per citare in errore Aaron Hillegass, ricordare loro che non sono stupidi, è solo difficile. La programmazione è difficile a cui allenare la mente, è un altro modo di pensare, e mentre potrebbero essere alle prese con le basi, sono probabilmente abbastanza consapevoli di esserlo e li renderanno piuttosto scoraggiati.

Lo dico come qualcuno che ha fallito anche nel suo primo corso di CS per il primo anno, avevo programmato molto prima e ho ottenuto tutti i concetti (VB, sì piccola) ma C ++ non mi farebbe clic. Ho finito per tornare alle basi e lavorarci da lì, poi ha cliccato, ma se qualcuno avesse detto "Non sei un idiota, questo è solo difficile" mi avrebbe semplificato la vita.


0

Hai detto "questi studenti potrebbero sapere come imparare la matematica, la biologia o la fisica, ma quelle tecniche non funzionano quando si tratta di programmazione".

C'è una ragione per questo, la programmazione richiede qualcosa che quelle altre discipline non richiedono necessariamente: creatività e ... fantasia . La capacità di "immaginare le cose al lavoro". Personalmente ho scoperto che un tale requisito è più presente (ovviamente, con tutte le dovute eccezioni) dalle persone che provengono dalla scuola tecnica (elettronica ed elettromeccanica in particolare: devono "immaginare i flussi elettrici e come si controllano", poiché non possono vederli!) che dalla "scienza pura" (dove tutto sembra girare intorno alla matematica).

Per questi ultimi casi, la "cognizione visiva" deve essere aiutata. È importante non solo concentrarsi sulla nozione e sul testo (il tipo -> compila -> guardare gli errori non possono funzionare se non si è in grado di "leggere" gli errori) ma fornire un modo per visualizzare le cose, sia in fase di progettazione ( simulando ciò che accade sulla macchina: preparatevi con una lavagna e un set di post-it colorati) e al momento dell'esecuzione.

Affinché quest'ultima parte abbia successo, è necessario fornire la nozione essenziale di sistemi operativi e "come i programmi si imbattono in una macchina" (e che cos'è quella macchina). E un IDE non intimidatorio deve essere dato. Normalmente ho "blocchi di codice personalizzati" con molte cose rimosse per "non distrarre". La nozione di progetto fatto di fonti per generare oggetti da collegare alla libreria deve essere data PRIMA di iniziare a parlare di una lingua.

Il mondo ciao tradizionale C ++ richiede un punto di ingresso e un dispositivo di output. Lo studente deve averne già familiarità. Il successo di questo tipo di corsi dipende dai primissimi giorni. È necessario stimolare una visualizzazione di ciò che accade all'interno di un computer per consentire loro di capire cos'è la programmazione.
Il resto è sintassi (scienza) e astrazione (fantasia)

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.