Pourquoi apprend-on à mémoriser CS? [fermé]

23

Je prends Advanced Placement Computer Science pour la dernière année au lycée. Il semble que nous apprenions simplement à mémoriser du code et des fonctions et non à être ingénieux et efficaces dans l'utilisation de la documentation et autres.

Pratiquement, j'imagine que de nombreux (sinon tous) travaux de programmation vous permettraient de feuilleter la documentation, de revoir le code passé et le code des autres, faisant essentiellement ce que mon professeur considérerait comme de la "tricherie".

Bien que je convienne que les concepts de base sont essentiels pour mémoriser (dans n'importe quel sujet), il me semble superflu et peu pratique de donner un examen à la plume et au papier pour une classe CS, surtout quand pratiquement vous auriez un compilateur, un débogueur, une référence manuels, et l' ensemble d'Internet à consulter dans n'importe quelle situation de travail dans le monde réel.

Pourquoi CS est-il enseigné en se concentrant sur la mémorisation du code et des fonctions plutôt que sur l'enseignement de compétences utiles, notamment la façon d'utiliser et d'interpréter la documentation, un exemple de code, le débogueur, etc.?

esqew
la source
34
CS ne concerne pas la mémorisation du code et des fonctions. Où diable étudiez-vous CS? Puis-je suggérer que le vrai problème est que le cours que vous suivez est de la merde?
Andres F.
1
@AndresF. OP est en Advanced Placement Computer Science qui est un cours offert aux lycéens (avant l'université).
3
@GlennNelson Oups! Je l'ai mal lu. Ok, dans ce cas: esqew : vous serez soulagé de savoir qu'au niveau universitaire, CS ne concerne (principalement) pas la mémorisation du code. Vous devrez lire beaucoup de choses, cependant;) Une éducation CS n'est pas nécessairement aussi de trouver un emploi (vous serez probablement déçu si vous le pensez)
Andres F.
1
Vous devez savoir que ce n'est pas le cas dans la plupart des collèges. Dans mon école, tous les tests informatiques ont été des notes ouvertes / un livre ouvert.
Casey Patton, le
2
Notez qu'une partie de la réponse est probablement que CS n'est pas un diplôme en programmation . Ne vous attendez pas à apprendre la programmation d'une classe CS. Attendez-vous à apprendre toutes sortes de théories et de concepts sous-jacents qui s'avèrent justement pertinents pour un programmeur. Et bien sûr, vous apprendrez quelques langages de programmation et apprendrez un peu de programmation de base, mais principalement, la programmation réelle est quelque chose qu'ils supposent que vous obtiendrez afin que vous puissiez vous concentrer sur toutes les choses CS , et non l'inverse environ.
jalf

Réponses:

37

Dans une classe de lycée, vous êtes au niveau le plus élémentaire de votre chemin vers la maîtrise. Les choses qui sont couvertes dans votre classe sont le genre de choses qu'un programmeur professionnel devrait savoir froidement. À bien des égards, cela revient à apprendre vos "horaires". Bien sûr, vous pourrez toujours saisir une calculatrice dans un environnement "réel", mais cette mémorisation augmente non seulement votre vitesse dans des tâches plus complexes, mais favorise également une compréhension plus approfondie des principes de base.

Par exemple, vous devez connaître plusieurs algorithmes de tri, comment ils sont mis en œuvre, comment ils fonctionnent, quand ils sont mieux utilisés et quand ne pas les utiliser. Cela pourrait toujours être recherché, mais ne devrait pas l'être - pas plus qu'un mathématicien ne devrait avoir à chercher 6 fois 8.

Jeffrey
la source
9
Vous devez connaître la nature de base des algorithmes de tri, mais cela fait environ 15 ans que j'ai eu l'occasion d'écrire autre chose qu'une sorte de bulle. (Pour un très petit N, c'est parfois la meilleure réponse.)
Loren Pechtel
1
J'aimerais pouvoir dire que tous les cours d'informatique sont aussi bons. À mon lycée, ils ont enseigné la syntaxe de base de java ... Pendant toute l'année. Beaucoup de la classe sont partis se vanter d'être "un programmeur" quand ils ne pouvaient même pas expliquer la différence entre le type Bubble et l'algorithme de Dijkstra.
Daniel Gratzer
2
À titre d'exemple, étant donné que vous pouvez rechercher n'importe quel mot dans un dictionnaire, vous devriez théoriquement être capable de comprendre cet article sur un ton moyen . Mais notre cerveau ne gère qu'un nombre limité d'incompréhensions imbriquées.
Benjol
1
Et la mémorisation surprise de mes horaires n'a été d'aucune utilité pour moi. Combien de temps l'ingénieur logiciel moyen passe-t-il à implémenter des algorithmes de tri? Oh, attendez, probablement environ 0 . Même dans le cas extrêmement improbable où le tri fourni par l'environnement ne vous convient pas, vous n'avez besoin que d'un seul gars pour écrire un algorithme plus approprié - et il peut utiliser les informations triviales disponibles sur quelque chose comme Wikipedia pour sélectionner et mettre en œuvre l'algorithme optimal, puis vous pouvez le réutiliser pour le reste du temps.
DeadMG
2
@kaoD: Et mémoriser la référence ne va pas aider avec ça un petit peu. Cela n'implique rien, c'est juste un copier-coller. La seule différence entre répondre à partir de la mémoire et copier-coller à partir de Wikipédia est que l'une est stockée dans la RAM et l'autre dans votre cerveau. C'est toujours un copier-coller.
DeadMG
14

Il est souvent enseigné de cette façon parce que les enseignants ne connaissent généralement pas d'autre moyen de tester la compréhension. Vos sentiments sont tout à fait corrects car cela ne vaut rien d'être enseigné comme ça. La façon dont les gens sont éduqués en général a désespérément besoin d'une réforme!

La vie s'améliore cependant, au moins à l'UIUC, j'ai constaté que plus vous montez dans vos classes CS, moins les examens sont orientés comme vous le décrivez et dans la majorité de mes cours, nous avons été autorisés à tricher pour toute la merde que vous auriez probablement recherché sur Google si vous étiez réellement assis devant un ordinateur.

Cela étant dit, plus je suis monté dans mes classes, moins ils vous apprennent réellement sur les langues ou comment mettre en œuvre quelque chose. En fait, je n'ai eu qu'un seul cours où ils nous ont réellement appris quoi que ce soit sur la programmation, il s'agissait principalement de concepts mathématiques abstraits et on s'attendait à ce que nous comprenions la partie de la programmation par nous-mêmes (à condition qu'ils soient toujours heureux de vous aider, mais c'était jamais quelque chose à un examen).

rudolph9
la source
2
+1 Amen. J'avais l'habitude d'enseigner la programmation au niveau collégial, et mon objectif était de déplacer les étudiants le plus rapidement possible au point où ils pourraient réaliser leurs propres projets uniques. Je déteste quand les enseignants le traitent comme mémorisant ou faisant les choses de la "bonne façon". Ce que j'ai essayé de faire était de mettre en place suffisamment de compétences pour libérer la créativité des élèves.
Mike Dunlavey
... J'ai eu des étudiants qui étaient très intelligents et très bons pour mémoriser. Il leur faudrait un ou deux tests avant que je puisse vous expliquer que vous devez écrire des programmes pour apprendre la programmation, pas mémoriser des trucs.
Mike Dunlavey
Entendre entendre! C'est drôle, en grandissant, je n'ai jamais été bon à l'école; mauvais score ACT, mauvaises notes, etc. Mais après avoir été introduit à CS, tout était logique. J'ai vraiment du mal dans certains domaines, mais j'ai seulement appris à surmonter les choses qui m'ont retenu en comprenant les concepts que j'ai appris dans mes cours de CS.
rudolph9
10

Ne laissez pas la scolarité interférer avec votre éducation.

-- Mark Twain

Je suis mexicain et je vous le dis parce qu'au Mexique, ce n'est pas exactement un bon endroit pour l'éducation (à tous les niveaux), du moins dans l'enseignement public.

Eh bien, au milieu de ma carrière (CS), je me sens exactement de la même façon que vous vous sentez, alors je commence à apprendre par moi-même et je passe un an à apprendre les algorithmes, Linux, les scripts, le fonctionnement de mon ordinateur, un peu relationnel bases de données, html, css, etc. (un peu sur tous). Et bien sûr, j'ai dû sauter des cours *, baisser mes notes * et obtenir mon diplôme un an après *, le tout pour apprendre.

Après cette année, je reviens à ma routine "normale", de retour aux cours réguliers, aux devoirs, aux examens et aux projets. Les cours étaient toujours ennuyeux, rien de nouveau à apprendre, tout était pareil. J'ai donc décidé de participer à des sites de concours de programmation comme UVA juge en ligne , chef de code et projet euler , puis j'ai regardé quelques conférences au MIT Open Course Ware et j'apprenais toujours par moi-même, mais d'une manière différente.

La leçon: ne laissez pas les choses se produire, faites que les choses se produisent. Si vous n'êtes pas satisfait de la façon dont vous apprenez, changez-le!

* Pas les décisions les plus sages que j'ai prises.

razpeitia
la source
4
"Ne laissez pas les choses se produire, faites que les choses se produisent", - Si jamais il y avait des mots pour vivre, ce sont eux!
GrandmasterB
+1 pour le devis. Je <presque> n'ai pas eu à lire le reste de la réponse
Chani
3

Cela dépend de ce que vous essayez de mémoriser ...

Pour étudier les mathématiques, par exemple, vous devez être familier avec l'algèbre et vous devez souvent être plutôt créatif dans la façon dont vous effectuez les manipulations algébriques afin de simplifier les équations. Mais vous devez avoir mémorisé certains éléments constitutifs afin de pouvoir vous concentrer sur ces éléments intéressants. Vous devez, par exemple, connaître vos tables de multiplication par cœur et vous devez connaître certaines identités afin de pouvoir reconnaître comment manipuler les équations afin d'utiliser ces identités.

Afin d'étudier l'informatique, vous devez également vous familiariser avec les structures de données et les algorithmes de base des blocs de construction, car vous devrez les appliquer à des problèmes de niveau supérieur. Il est très peu probable que vous écriviez, par exemple, votre propre implémentation de liste liée dans le monde réel, vous utiliseriez simplement celle fournie par votre bibliothèque. Mais sachant comment une liste chaînée est implémentée et comment implémenter la vôtre, vous seriez en mesure de déterminer où et si utiliser une liste chaînée lorsque vous commencez à travailler sur des problèmes de niveau supérieur. De même, vous n'écririez jamais votre propre fonction de recherche binaire, mais il est important de comprendre comment cela fonctionne afin de pouvoir raisonner sur des choses comme où une base de données pourrait utiliser un index et où elle ne pourrait pas.

Une fois que vous avez mémorisé certains éléments de base, il est beaucoup plus facile de faire des choses comme interpréter la documentation. La documentation peut indiquer qu'une liste est utilisée et supposer que le programmeur sait implicitement que cela signifie que les insertions sont O (1) et les recherches sont O (n). Les blocs de construction sont également beaucoup plus stables au fil du temps - vous êtes très susceptible d'utiliser de nouveaux débogueurs toutes les quelques années, vous utiliserez probablement la même recherche binaire pendant toute votre carrière.

Justin Cave
la source
Où et s'il faut utiliser une liste chaînée est basé sur des choses comme sa complexité pour diverses opérations et ses performances de mémoire. Vous n'avez pas besoin d'en implémenter un pour connaître ces éléments. Où une base de données peut-elle utiliser une recherche binaire? Pour les clés qu'il sait comparer. Eh bien, c'était facile.
DeadMG
3

"Pourquoi CS est-il enseigné en se concentrant sur la mémorisation ... par opposition à l'enseignement de compétences utiles" - Je pense que vous négligez un peu trop la mémorisation. Tout comme vous devez pratiquer l'écriture de code, interpréter la documentation, utiliser le débogueur, vous devez également pratiquer la mémorisation.

Vous pourriez être surpris de voir à quel point vous pouvez devenir plus efficace si vous n'avez pas à consulter la référence API aussi souvent ou à rechercher autant de commandes de débogueur.

L'une des meilleures choses que j'ai apprises au lycée a été d'observer un ami qui n'a jamais pris de notes en classe. Son argument était qu'il pouvait se rappeler ce qui était important. J'ai commencé à faire la même chose et je pense que cela a amélioré mes compétences en mémorisation, ce que je trouve très utile au quotidien, même avec toutes ces références d'API disponibles.

DXM
la source
2
Ne pas avoir à rechercher l'API passe par la pratique, ne pas enseigner l'API comme une éducation formelle.
DeadMG
@DeadMG: Être capable de se souvenir de plus de choses vient avec la pratique, comme tout le reste. Vous obliger à vous souvenir de certaines API n'est pas un objectif en soi, mais un moyen de former votre tête à conserver les informations afin que vous n'ayez pas à les rechercher aussi souvent. Et je ne parle pas seulement des API, si je me souviens d'une chose supplémentaire, c'est un voyage de moins que je dois faire vers Google / MSDN / un autre fichier source et avec la pratique, cela fait une différence dans la vitesse à laquelle vous êtes capable de travailler .
DXM
Entraînez-vous avec cette API spécifique . Ne pas mémoriser les choses en général. Et le temps consacré à l'éducation est une minuscule note de bas de page par rapport au temps professionnel.
DeadMG
2

Les examens à la plume et au papier ont réellement du sens si l'objectif est de tester une compréhension complète du sujet traité. J'ai passé l'examen Computer Science AB il y a près d'une décennie et je suis d'accord avec la méthode du stylo et du papier.

Vous devez en savoir suffisamment sur tout algorithme que vous apprenez dans les niveaux inférieurs de l'informatique pour pouvoir expliquer comment écrire le code d'implémentation dans votre langue cible. Les élèves devraient également être en mesure d'écrire du code à la main avec une syntaxe généralement correcte. Nous manquons tous parfois un point-virgule ou des parenthèses :). Les compétences de débogage et de conception peuvent également être testées sans déduction à partir d'un IDE utile.

Si un étudiant ne peut pas faire cela, alors il ne possède pas la maîtrise de ce sujet, juste peut-être une familiarité passagère.

Peter Smith
la source
-1: Toute écriture manuscrite d'un code syntaxiquement correct vous indique que la personne est capable d'écrire un programme compilable (probablement environ un million de fois plus lent que l'ordinateur le plus lent) - qui peut ne pas fonctionner comme prévu. Pire, ils ont juste une bonne mémoire et peuvent probablement réciter Shakespare si on le leur demande. Cela indique peu les compétences de la personne en tant que développeur.
mattnz
Cette réponse ne présente aucun raisonnement pour l'avis présenté. Pourquoi quelqu'un devrait-il pouvoir écrire une implémentation pour n'importe quel algorithme de tri dans sa langue préférée?
DeadMG
Le fait n'est pas que cette personne est un bon développeur, c'est qu'elle connaît le matériel informatique enseigné dans sa classe. Si un étudiant a appris à représenter graphiquement une fonction, il est raisonnable de s'attendre à ce qu'il le fasse lors d'un examen. Les bons tests ont également battu la mémorisation en posant des questions qui nécessitent une compréhension conceptuelle, comme implémenter le tri à bulles à l'aide de plusieurs clés pour cette structure de données que je viens de tirer, ou expliquer la différence entre ce pseudo-code de recherche que je vous donne et la recherche binaire.
Peter Smith
-2

D'après mon expérience, la mémorisation s'accompagne d'une pratique simple et il n'est absolument pas nécessaire de l'enseigner. Plus important encore, cette approche signifie uniquement mémoriser ce dont vous avez réellement besoin de vous souvenir dans tout ce que vous faites, pas un tas d'ordures aléatoires dont votre professeur espère que vous pourriez avoir besoin et invariablement vous ne le ferez pas. Le temps passé à mémoriser la mise en œuvre d'un algorithme pourrait être beaucoup mieux consacré à une autre cause.

Après tout, pourquoi auriez-vous besoin de vous entraîner à écrire un algorithme? Une fois que vous l'avez écrit une fois, vous pouvez le réutiliser à tout moment, même en cas de très grande probabilité que quelqu'un d'autre n'ait pas déjà écrit une implémentation disponible gratuitement pour la langue de votre choix et que votre environnement ne fournisse pas déjà une telle un algorithme pour votre utilisation, ce qui n'est pas vrai pour la grande majorité des algorithmes simples comme le tri et autres. Pratiquer quelque chose où il est très peu probable que vous deviez le faire en premier lieu et même si vous le faites, vous ne devrez le faire qu'une seule fois? Pas une utilisation précieuse du temps.

La chose importante à savoir sur Heapsort n'est pas du tout comment l'implémenter. C'est la complexité de fonctionnement dans les meilleurs et les pires cas, et des choses similaires. Mais, surprise, il y a un tableau pratique sur Wikipedia qui vous donnera instantanément ces informations. Encore une fois, il n'y a aucune valeur à avoir cette connaissance. Il est instantanément disponible pour vous à tout moment, jusqu'à la fin des temps, sans frais. Alors pourquoi voudriez-vous le mémoriser? C'est inutile.

D'après mon expérience, il n'y a absolument aucune raison d'exiger qu'un étudiant mémorise quoi que ce soit. Si vous posez une question à laquelle une source de référence peut répondre, alors vous posez une question à laquelle la possibilité d'y répondre n'a aucune valeur.

DeadMG
la source
2
Gee, les gars, ne vous embêtez pas à expliquer vos
votes négatifs
La seule fois où j'avais besoin de connaître le heapsort, c'était quand j'avais besoin d'une file d'attente prioritaire modifiable (le heapsort fonctionne très bien comme file d'attente prioritaire). Pouvoir adapter des algorithmes connus est une bonne raison de savoir comment les implémenter.
David Thornley
@David: Vous n'avez pas besoin de savoir comment fonctionne le heapsort. Une implémentation utilisant n'importe quel algorithme de tri serait très bien.
DeadMG
Pas dans ce cas particulier, ce ne serait pas le cas. Il devait gérer de nombreux événements, fréquemment, sur un système qui pouvait déjà être surchargé. Pour ce projet, nous avions besoin d'efficacité et nous l'avons obtenu. Pour le contexte, cela s'est produit une fois dans une carrière assez longue, et tout mon tri depuis longtemps a été des choses comme la famille de SQL ORDER BYet C ++ std::sort.
David Thornley
@David: Par conséquent, je dirais que ce n'est pas quelque chose dont chaque programmeur a besoin.
DeadMG