Perché CS viene insegnato ad essere memorizzato? [chiuso]


23

Ho frequentato Advanced Placement Computer Science per lo scorso anno al liceo. Sembra che ci venga insegnato semplicemente a memorizzare codice e funzioni e non come essere intraprendenti ed efficienti nell'uso della documentazione e simili.

Praticamente, immagino che molti (se non tutti) i lavori di programmazione ti permetterebbero di sfogliare la documentazione, rivedere il codice passato e il codice di altri, essenzialmente facendo ciò che il mio insegnante considererebbe "barare".

Anche se concordo sul fatto che i concetti fondamentali sono essenziali da memorizzare (in qualsiasi argomento), mi sembra superfluo e poco pratico fare un esame a penna e carta per una lezione di CS, specialmente quando praticamente avresti un compilatore, un debugger, un riferimento manuali e l' intera Internet a cui fare riferimento in qualsiasi situazione di lavoro nel mondo reale.

Perché CS viene insegnato concentrandosi sulla memorizzazione di codice e funzioni anziché insegnare abilità utili tra cui come utilizzare e interpretare la documentazione, il codice di esempio, il debugger e simili?


34
CS non riguarda la memorizzazione di codice e funzioni. Dove diavolo stai studiando CS? Posso suggerire che il vero problema è che il corso che stai prendendo è una schifezza?
Andres F.

1
@AndresF. OP è in Advanced Placement Computer Science che è un corso offerto ai liceali (prima dell'università).

3
@GlennNelson Oops! L'ho letto male. Ok, in quel caso: esqew : sarai sollevato nel sapere, a livello universitario, il CS non riguarda (principalmente) la memorizzazione del codice. Dovrai leggere un sacco di cose, però;) Un'educazione alla CS non riguarda necessariamente la ricerca di un lavoro (probabilmente rimarrai deluso se pensi che lo sia)
Andres F.

1
Dovresti sapere che non è così nella maggior parte dei college. Nella mia scuola, ogni singolo test di informatica è stato open notes / open book.
Casey Patton

2
Si noti che una parte della risposta molto probabilmente è che CS non è un grado di programmazione . Non aspettarti di imparare la programmazione da una lezione CS. Aspettatevi di apprendere ogni sorta di teoria e concetti sottostanti che sono così rilevanti per un programmatore. E certo, imparerai alcuni linguaggi di programmazione e ti verrà insegnato un po 'di programmazione di base, ma principalmente, la programmazione effettiva è qualcosa che presumono che otterrai in modo da poterti concentrare su tutto il materiale CS , e non viceversa. in giro.
jalf

Risposte:


37

In una classe di scuola superiore, sei nel livello più elementare del tuo percorso verso la padronanza. Le cose che rientrano nella tua classe sono il tipo di cose che un programmatore professionista dovrebbe conoscere a freddo. In molti modi, questo è simile all'apprendimento delle tue "tabelle dei tempi". Ovviamente sarai sempre in grado di afferrare una calcolatrice in un ambiente "reale", ma questa memorizzazione non solo aumenta la tua velocità in compiti più complessi, ma promuove anche una comprensione più approfondita dei principi di base.

Ad esempio, dovresti conoscere diversi algoritmi di ordinamento, come sono implementati, come funzionano, quando vengono utilizzati al meglio e quando non utilizzarli. Questo potrebbe sempre essere cercato, ma non dovrebbe esserlo - più di quanto un matematico dovrebbe cercare 6 volte 8.


9
Dovresti conoscere la natura di base degli algoritmi di ordinamento, ma sono passati circa 15 anni da quando ho avuto occasione di scrivere qualcosa di diverso da un ordinamento a bolle. (Per N molto piccola a volte è la risposta migliore.)
Loren Pechtel,

1
Vorrei poter dire che tutte le lezioni di Informatica sono così buone. Al mio liceo hanno insegnato la sintassi di base di Java ... Per tutto l'anno. Molti della classe si sono vantati di essere "un programmatore" quando non potevano nemmeno spiegare la differenza tra Bubble sort e l'algoritmo di Dijkstra.
Daniel Gratzer,

2
Ad esempio, dato che puoi cercare qualsiasi parola in un dizionario, teoricamente dovresti essere in grado di capire questo articolo su meanone . Ma i nostri cervelli gestiscono solo un numero limitato di incomprensioni nidificate.
Benjol,

1
E a sorpresa, memorizzare le mie tabelle dei tempi non mi è stato assolutamente utile. Quanto tempo impiega l'ingegnere software medio a implementare algoritmi di ordinamento? Oh aspetta, probabilmente circa 0 . Anche nella remota possibilità che l'ordinamento fornito dall'ambiente non sia abbastanza buono per te, hai solo bisogno di un ragazzo per scrivere un algoritmo più appropriato e può usare le informazioni banalmente disponibili su qualcosa come Wikipedia per selezionare e implementare l'algoritmo ottimale- e quindi è possibile riutilizzarlo per il resto del tempo.
DeadMG

2
@kaoD: Memorizzare il riferimento non sarà di alcun aiuto. Non implica ideare nulla, è solo una copia incolla. L'unica differenza tra la risposta dalla memoria e il copia-incolla da Wikipedia è che uno è memorizzato nella RAM e uno è archiviato nel tuo cervello. È ancora un copia-incolla.
DeadMG

14

Viene spesso insegnato in questo modo perché gli insegnanti generalmente non conoscono altri modi per testare la comprensione. I tuoi sentimenti sono completamente corretti in quanto è inutile insegnare in questo modo. Il modo in cui le persone vengono educate in generale ha un disperato bisogno di riforme!

La vita migliora però, almeno all'UIUC ho scoperto che più vai nelle tue lezioni di CS più gli esami sono orientati mentre descrivi e nella maggior parte dei miei corsi ci è stato permesso un cheat sheet per tutte le schifezze che avresti probabilmente cercato su Google se fossi effettivamente seduto a un computer.

Detto questo, più in alto sono andato nelle mie lezioni meno insegnano effettivamente le lingue o come implementare qualcosa. In realtà ho avuto solo una lezione in cui ci hanno insegnato qualcosa sulla programmazione, sono stati per lo più concetti matematici astratti e ci si aspettava di capire da soli la parte di programmazione (a condizione che fossero sempre felici di aiutare ma questo era mai qualcosa su un esame).


2
+1 Amen. Insegnavo programmazione a livello universitario e il mio obiettivo era spostare gli studenti il ​​più rapidamente possibile al punto da poter realizzare i loro progetti unici. Lo odio quando gli insegnanti lo trattano come memorizzare o fare le cose "nel modo giusto". Quello che ho cercato di fare è stato mettere in atto abbastanza competenze per liberare la creatività degli studenti.
Mike Dunlavey,

... Avevo studenti molto intelligenti e bravissimi a memorizzare. Ci vorrebbero uno o due test prima che potessi comunicare che devi scrivere programmi per imparare a programmare, non per memorizzare cose.
Mike Dunlavey,

Senti senti! È divertente, crescendo non sono mai stato bravo a scuola; punteggio ACT cattivo, voti scadenti, ecc. Ma dopo essere stati introdotti in CS tutto aveva senso. Sicuramente faccio fatica in alcune aree, ma ho imparato solo a superare le cose che mi hanno trattenuto attraverso la comprensione dei concetti che ho imparato nelle mie lezioni di CS.
rudolph9,

10

Non lasciare che la scuola interferisca con la tua educazione.

- Mark Twain

Sono messicano e te lo dico perché in Messico non è esattamente un buon posto per l'istruzione (a qualsiasi livello), almeno nell'istruzione pubblica.

Bene, nel mezzo della mia carriera (CS) mi sento esattamente come ti senti, quindi inizio a imparare da solo e passo un anno a imparare algoritmi, Linux, script, come funziona il mio computer, un po 'di relazione database, html, css, ecc. (un po 'su tutto). E, naturalmente, ho dovuto saltare le lezioni *, deludere i miei voti * e laurearmi un anno dopo *, tutto per imparare.

Dopo quell'anno, torno alla mia routine "normale", torno a lezioni regolari, compiti a casa, esami e progetti. Le lezioni erano ancora noiose, niente di nuovo da imparare, tutto era uguale. Così ho deciso di partecipare a siti di contest di programmazione come il giudice UVA online , lo chef di codice e l' euler del progetto , quindi ho visto alcune lezioni al MIT Open Course Ware e stavo ancora imparando da solo, ma in modo diverso.

La lezione: non lasciare che le cose accadano, fai accadere le cose. Se non sei soddisfatto del modo in cui stai imparando, cambialo!

* Non le decisioni più sagge che abbia preso.


4
"Non lasciare che le cose accadano, fai accadere le cose", - Se mai ci fossero parole per vivere, sono quelle!
GrandmasterB,

+1 per il preventivo. <almost> non ho dovuto leggere il resto della risposta
Chani

3

Dipende da cosa stai cercando di memorizzare ...

Per studiare la matematica, ad esempio, devi avere familiarità con l'algebra e spesso devi essere piuttosto creativo nel modo in cui esegui manipolazioni algebriche per semplificare le equazioni. Ma devi aver memorizzato alcuni blocchi predefiniti per poterti concentrare su quei pezzi interessanti. Devi, ad esempio, conoscere a memoria le tue tabelle di moltiplicazione e devi conoscere alcune identità in modo da poter riconoscere come manipolare le equazioni al fine di utilizzare quelle identità.

Allo stesso modo, per studiare informatica, devi avere familiarità con le strutture e gli algoritmi di base dei blocchi predefiniti perché dovrai applicarli a problemi di livello superiore. È altamente improbabile che tu, ad esempio, tu scriva la tua implementazione di elenchi collegati nel mondo reale, utilizzeresti semplicemente quello fornito dalla tua libreria. Ma sapendo come viene implementato un elenco collegato e come implementare il tuo, saresti in grado di ragionare su dove e se usare un elenco collegato quando inizi a lavorare su problemi di livello superiore. Allo stesso modo, non scriveresti mai la tua funzione di ricerca binaria, ma è importante capire come funziona in modo da poter ragionare su cose come dove un database potrebbe usare un indice e dove no.

Dopo aver memorizzato alcuni elementi di base, è molto più facile fare cose come interpretare la documentazione. La documentazione potrebbe indicare che viene utilizzato un elenco e presumere che il programmatore sappia implicitamente che ciò significa che gli inserti sono O (1) e le ricerche sono O (n). I mattoni sono anche molto più stabili nel tempo: è molto probabile che utilizzerai nuovi debugger ogni pochi anni, probabilmente utilizzerai la stessa ricerca binaria per tutta la tua carriera.


Dove e se utilizzare un elenco collegato si basa su elementi quali le complessità per varie operazioni e le prestazioni della memoria. Non è necessario implementarne uno per conoscere una di queste cose. Dove può un database utilizzare una ricerca binaria? Per chiavi che sa come confrontare. Bene, è stato facile.
DeadMG

3

"Perché CS viene insegnato concentrandosi sulla memorizzazione ... anziché insegnare abilità utili" - Penso che tu stia scontando un po 'troppo la memorizzazione. Proprio come dovresti esercitarti a scrivere codice, interpretare la documentazione, usare il debugger, dovresti anche esercitarti con la memorizzazione.

Potresti essere sorpreso di quanto più efficiente puoi diventare se non devi andare spesso al riferimento API o cercare quanti comandi di debugger.

Una delle cose migliori che ho imparato al liceo è stata osservare un amico che non ha mai preso appunti in classe. La sua tesi era che poteva ricordare ciò che era importante. Ho iniziato a fare la stessa cosa e penso che abbia migliorato le mie capacità di memorizzazione che trovo molto utili su base giornaliera anche con tutti quei riferimenti API facilmente disponibili.


2
Non dover cercare l'API viene attraverso la pratica, non insegnare all'API come istruzione formale.
DeadMG

@DeadMG: Essere in grado di ricordare più cose arriva con la pratica, proprio come tutto il resto. Richiedere di ricordare determinate API non è un obiettivo in sé, ma un mezzo per allenare la tua testa a conservare le informazioni in modo da non doverle cercare spesso. E non sto parlando solo di API, se ricordo qualcosa in più, è un viaggio in meno che devo fare su Google / MSDN / un altro file sorgente e con la pratica questo fa la differenza nella velocità con cui sei in grado di lavorare .
DXM,

Fai pratica con quella specifica API . Non memorizzare le cose in generale. E il tempo trascorso nell'istruzione è una piccola nota in calce rispetto al tempo professionale.
DeadMG

2

Gli esami su carta e penna hanno effettivamente senso se l'obiettivo è quello di testare una comprensione completa dell'argomento in questione. Ho sostenuto l'esame Computer Science AB quasi un decennio fa e sono d'accordo con il metodo penna e carta.

Dovresti conoscere abbastanza qualsiasi algoritmo che impari nei livelli inferiori di Informatica per essere in grado di capire come scrivere il codice di implementazione nella tua lingua di destinazione. Gli studenti dovrebbero anche essere in grado di scrivere il codice a mano con la sintassi per lo più corretta. Tutti ci mancano un punto e virgola o una parentesi a volte :). Anche le capacità di debug e progettazione possono essere testate senza deduzione da un IDE utile.

Se uno studente non può farlo, allora non possiede la padronanza di quell'argomento, forse solo una familiarità passeggera.


-1: tutte le mani che scrivono il codice sintatticamente corretto ti dicono che la persona è in grado di scrivere un programma compilabile (probabilmente circa un milione di volte più lento del computer più lento) -che potrebbe non funzionare come previsto. Peggio ancora, hanno solo una buona memoria e probabilmente possono recitare Shakespare se gli viene chiesto. Va ben poco per indicare l'abilità della persona come sviluppatore.
Mattnz,

Questa risposta non presenta alcun ragionamento per l'opinione espressa. Perché qualcuno dovrebbe essere in grado di scrivere un'implementazione per qualsiasi algoritmo di ordinamento nella sua lingua preferita?
DeadMG

Il punto non è che questa persona sia un buon sviluppatore, è che conoscono il materiale di Informatica insegnato nella loro classe. Se a uno studente è stato insegnato come rappresentare graficamente una funzione, è ragionevole aspettarsi che lo studente lo faccia durante un esame. Buoni test hanno anche battuto la memorizzazione ponendo domande che richiedono una comprensione concettuale come implementare l'ordinamento a bolle usando più tasti per questa struttura di dati che ho appena estratto dal nulla, o spiegare la differenza tra questo codice psearch che ti do e la ricerca binaria.
Peter Smith,

-2

Nella mia esperienza, la memorizzazione viene fornita con una pratica semplice e non è assolutamente necessario insegnarla affatto. Ancora più importante, questo approccio significa solo memorizzare ciò che è effettivamente necessario ricordare in qualsiasi cosa tu stia facendo, non un mucchio di spazzatura casuale che il tuo insegnante spera che potresti aver bisogno e invariabilmente non lo farai. Il tempo impiegato per memorizzare l'implementazione di alcuni algoritmi potrebbe essere molto meglio dedicato ad altre cause.

Dopo tutto, perché mai dovresti esercitarti a scrivere un algoritmo? Una volta che lo scrivi una volta, puoi riutilizzarlo per tutto il tempo, anche nella possibilità estremamente remota che qualcun altro non abbia già scritto un'implementazione disponibile gratuitamente per la lingua di tua scelta e che il tuo ambiente non fornisca già tale un algoritmo per il tuo uso, che è banalmente non vero per la stragrande maggioranza di algoritmi semplici come l'ordinamento e simili. Praticare qualcosa in cui è altamente improbabile che tu debba mai farlo in primo luogo e anche se lo fai, dovrai mai farlo solo una volta? Non è un prezioso uso del tempo.

La cosa importante da sapere su Heapsort non è affatto come implementarla. È la complessità operativa nei casi migliori e peggiori e cose simili. Ma, sorpresa, c'è un comodo tavolo da dandy su Wikipedia che ti darà immediatamente queste informazioni. Quindi, di nuovo, non ha valore avere quella conoscenza. È immediatamente disponibile per te ogni volta che lo desideri da ora fino alla fine dei tempi, senza alcun costo. Allora perché vorresti memorizzarlo? È inutile.

Nella mia esperienza, non c'è assolutamente alcun motivo per richiedere a uno studente di memorizzare qualcosa. Se stai ponendo una domanda a cui è possibile rispondere da una fonte di riferimento, allora stai ponendo una domanda a cui poter rispondere non ha alcun valore.


2
Ragazzi, non perdete tempo a spiegare i vostri
voti negativi

L'unica volta che avevo bisogno di sapere heapsort era quando avevo bisogno di una coda di priorità modificabile (heapsort funziona alla grande come una coda di priorità). Essere in grado di adattare algoritmi noti è una buona ragione per saperli implementare.
David Thornley,

@ David: non devi sapere come funziona heapsort. Un'implementazione che utilizza qualsiasi algoritmo di ordinamento andrebbe bene.
DeadMG

Non in quel caso particolare, non lo farebbe. Doveva gestire molti eventi, spesso, su un sistema che potrebbe essere già sottoposto a un sovraccarico. Per quel progetto, avevamo bisogno di efficienza e ce l'abbiamo fatta. Per il contesto, ciò è accaduto una volta in una carriera piuttosto lunga e tutto il mio ordinamento per lungo tempo è stato qualcosa come la famiglia di SQL ORDER BYe C ++ std::sort.
David Thornley,

@ David: Quindi, suggerirei che difficilmente è qualcosa di cui ogni programmatore ha bisogno.
DeadMG
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.