Tutorat des étudiants qui ont du mal avec les bases du C ++ [fermé]


26

Je donne des cours particuliers à quelques étudiants qui ont beaucoup de mal à apprendre les bases de leur premier langage de programmation: C ++. J'ai connu de nombreux étudiants excellents et brillants qui ont échoué ou abandonné leur premier cours CS. Tous ceux à qui je donne des cours donnent un compte rendu similaire de leur expérience en classe: l'instructeur avance trop vite, rien dans les cours n'a de sens, et al. Avant ce cours de CS, la plupart de ces étudiants en difficulté n'avaient exprimé aucun intérêt pour les ordinateurs comme autre chose que des traitements de texte, des navigateurs Web ou toute autre forme de divertissement. L'ordinateur est une boîte noire qui fonctionne, alors pourquoi jouer avec?

Ma meilleure supposition est qu'ils ont du mal à connecter les abstractions de l'informatique avec des concepts familiers. C'est-à-dire que ces étudiants savent peut-être apprendre les mathématiques, la biologie ou la physique, mais ces techniques ne fonctionnent pas en matière de programmation.

Quelqu'un a-t-il des suggestions ou des conseils? Les étudiants que j'aide ne méritent pas l'échec de ce cours. Il est clair que l'instructeur ne prend pas en compte le style d'apprentissage de ces élèves. C'est-à-dire que l'instructeur n'échoue pas à ses élèves.


2
Commentateurs: si vous avez une réponse, laissez-la comme réponse: ne la laissez pas comme commentaire. Si votre réponse a déjà été ajoutée, votez-la. Si vous souhaitez discuter du sujet de cette question avec d'autres personnes, utilisez le chat .

1
Non? D'après mon expérience, il y a suffisamment de gens qui programment et ne

Réponses:


42

Il y a quelques choses avec lesquelles pratiquement tous les débutants ont du mal. Les élèves doivent savoir lire le code avant d'apprendre à écrire du code.

  • La nature séquentielle des langues impératives. Les gens ont du mal à comprendre que les fonctions sont exécutées en séquence, un élément à la fois, comme une recette. Une façon de résoudre ce problème consiste à montrer du code fonctionnant via un débogueur.
  • L'opérateur d'affectation ( =) dans les langages de style C est extrêmement trompeur. Vous devez expliquer très attentivement que cela a = 5signifie «attribuer 5 à la variable a, et non « a est égal à 5 ​​».
  • Pour les débutants, il est prudent de décrire les fonctions comme des blocs de code structurés auxquels d'autres fonctions peuvent accéder. De plus, les débutants ont du mal à comprendre qu'en C ++, les arguments de fonction sont identifiés par ordre, pas par nom.
  • La plupart des langages de programmation impératifs ont des composants déclaratifs et des composants procéduraux, et C ++ ne fait pas exception. Assurez-vous que l'élève comprend que certaines parties du code décrivent la structure du programme et que d'autres parties (fonctions) décrivent ce que le programme doit faire.
  • Passer à travers un programme avec le débogueur est un outil d'enseignement extrêmement important et souvent négligé .
  • Les expressions ont des types . 3+3est un entier, 3.5 + 3est un double, "3" + "3"(en C #) est une chaîne, x == 5 * 3 + 25est un booléen (ou un entier en C ++). Passez beaucoup de temps pour vous assurer que l'élève est parfaitement à l' aise avec cette notion.
  • La portée variable est quelque chose que les débutants confondent tout le temps. Expliquez à l'étudiant comment fonctionne la portée et assurez-vous qu'il sait qu'une xdéfinition dans une portée est différente d'une xdéfinition dans une autre portée.
  • Chaque variable est référencée au moins trois fois dans sa durée de vie: déclaration, affectation (souvent effectuée sur la même ligne que la déclaration), consommation. Si l'un d'eux manque, il y a une erreur conceptuelle quelque part. Pour la même raison, si vous analysez un programme de travail, vous pouvez toujours rechercher ces trois choses dans le code pour comprendre le but d'une variable.
  • forles boucles ne doivent pas être enseignées tant que des exemples adéquats d'itération utilisant des whileboucles ne sont pas fournis. La syntaxe abrégée prête à confusion et laisse les élèves se demander pourquoi ils ne peuvent pas simplement utiliser des whileboucles. Avoir une feuille de triche qui décrit une forboucle en termes de whileboucle peut être utile.
  • Les tableaux et les pointeurs sont assez faciles à enseigner, mais un cauchemar à apprendre. En d'autres termes, jusqu'à ce qu'il clique, la pratique est importante.
  • L'idée que le code est du texte et qu'un programme compilé est en fait un fichier est insaisissable pour certains débutants. Assurez-vous de leur montrer les fichiers .cpp, .h et binaires dans le shell.

Les composants OOP de C ++ sont une bête complètement différente, et j'espère que l'instructeur n'y arrivera pas - parce que OOP est mieux enseigné en utilisant des langages conçus à partir de zéro pour être OOP. D'après mon expérience, l'enseignement de la POO via C ++ ne s'est jamais bien passé.


2
"Les gens ont du mal à comprendre que les fonctions sont exécutées dans l'ordre"? Je pense que c'est la chose avec laquelle pratiquement personne n'a de problèmes (sauf, peut-être, les personnes qui ont déjà appris un langage fonctionnel avant de commencer la procédure). Mais je suis d'accord sur tout ce que vous dites d'autre.
leftaroundabout

3
+1 pour marcher avec le débogueur, afin qu'ils aient une idée de la différence entre le programme lui-même et son exécution.
Mike Dunlavey

4
@leftaroundabout Vous seriez surpris. Les mathématiques sont principalement déclaratives, donc les langages impératifs peuvent rejeter toute personne qui a appris l'algèbre.
Rei Miyasaka

2
Cette réponse semble être un peu juste "claquant des concepts." Les concepts sont sans aucun doute corrects et sont certainement importants, mais enseigner de cette façon, c'est un peu comme essayer d'apprendre à quelqu'un à conduire en dérogeant aux règles de la route.
riwalk

@ Stargazer712 Tout le monde apprend les règles de la route avant d'être autorisé à faire l'essai routier. Je pourrais présenter des idées larges et moelleuses comme «la pratique est la clé» ou «être créatif» ou «penser logiquement», mais ces choses sont sans doute assez évidentes pour tout instructeur, ainsi que pour la plupart des étudiants. On pourrait également enseigner des choses abstraites comme les mathématiques discrètes ou la théorie du langage en tant que précurseur de la programmation, mais cela ne devient important que lorsque la mécanique est si complexe que les problèmes ne peuvent pas être résolus par l'intuition seule. Tôt ou tard, les gens doivent cesser d'être zen et commencer à enseigner le contenu .
Rei Miyasaka

19

Avez-vous déjà enseigné la programmation?

J'ai enseigné la programmation aux majors CS et non CS pendant quatre ans. Le premier semestre, mon expérience a été comme la vôtre, jusqu'à ce que j'apprenne quelques choses.

Ce qui me paraissait vacueusement simple n'était pas du tout simple pour les débutants.

Quel que soit le langage, vous devez mettre en place un cadre mental - des choses si évidentes que vous ne réalisez même pas que vous les connaissez, telles que:

  • Les ordinateurs ne font qu'une chose à la fois. (Quiconque dit avoir du parallélisme et des pipelines, s'en va. Revenez quand les élèves sauront quelque chose.) Les ordinateurs ne peuvent faire qu'un petit nombre de choses différentes, et ils ne peuvent pas commencer une étape tant que la précédente n'est pas terminée. Je dis seulement cela, parce que les ordinateurs semblent faire tellement de choses, et les faire instantanément, que pour un débutant, il semble qu'ils font tout à la fois, et lisent aussi votre esprit.

  • Les variables sont importantes. Il est essentiel de comprendre que le nom d'une variable et son contenu au moment de l'exécution sont deux choses entièrement différentes. Les débutants ont du mal avec ça. Si je dis "Ecrivez un programme pour saisir votre nom puis vous dire bonjour", ils doivent comprendre qu'ils ont besoin d'une variable pour conserver leur nom, et ils doivent trouver un nom pour la variable, et ils sont tentés de lui donner son nom et de se demander ce que signifie "entrée".

  • Il y a une énorme différence entre l'heure à laquelle vous écrivez / éditez le programme et l'heure à laquelle il s'exécute. Lors de leurs premiers exercices, il faut le rappeler assez souvent.

La langue que j'ai utilisée était BASIC, car elle est très simple pour les débutants. Il n'est pas difficile de passer à d'autres langues après avoir développé un ensemble de capacités de programmation de base.

Nous écrivions souvent un programme au tableau, puis «jouions à l'ordinateur». Autrement dit, placez un X à côté de l'instruction actuelle, faites-le manuellement, puis déplacez le X à l'instruction suivante. Les variables étaient des rectangles sur le tableau, où nous écririons le contenu actuel. Lorsqu'une affectation se produisait, nous l'effaçions et introduisions la nouvelle valeur.

Une astuce que j'ai développée était un ordinateur décimal simulé, avec 1000 emplacements de mémoire, chacun capable de contenir un nombre à 4 chiffres. Il y avait un petit ensemble d '«opcodes» comme charger l'accumulateur, ajouter, stocker, sauter, etc. Ensuite, des concepts tels que les variables, le saut, etc. sont beaucoup plus faciles à expliquer.

J'espère que ça t'as aidé.


J'aime cette idée d'ordinateur simulée. Avez-vous un langage formel pour cela, ou discutez-vous simplement des idées en pseudocode / en anglais simple?
Rei Miyasaka

@Rei: J'ai écrit (en BASIC) un simulateur appelé Simple. C'était toute l'interface clavier. L'utilisateur peut entrer des valeurs dans la "mémoire"; ensuite, ils pouvaient le faire en une seule étape et examiner l'accumulateur et la mémoire à chaque point, s'ils le voulaient. Je pense que c'était vraiment important parce que cela les a fait le faire , pas seulement en parler.
Mike Dunlavey

Ahh d'accord. Merci, je devrais essayer quelque chose comme ça.
Rei Miyasaka

Cela devrait être la réponse n ° 1 à mon avis.
riwalk

12

À mon avis, le C ++ est une exagération en tant que première langue.

Si j'étais vous et que vous aviez suffisamment de temps, j'irais introduire des concepts de programmation et de CS en utilisant Python (ou similaire).

Lorsque les concepts sont clairs, c'est-à-dire lorsqu'ils sont à l'aise avec les structures de données de base, l'indirection, les algorithmes de base, etc., j'introduirais lentement le C ++ et ils pourront très rapidement se rapporter à ce qu'ils auraient déjà appris.


2
Je suis d'accord, mais les profs n'ont généralement pas le droit de choisir la langue à enseigner, encore moins les assistants techniques.
Rei Miyasaka

4
Je ne suis pas d'accord sur Python. J'ai suivi ma première classe CS 101 en C ++, puis je suis passé à une école qui enseignait CS 101 en Python. Les étudiants Python étaient tellement confus même sur les bases quand nous avons tous pris le même cours CS 201 ... Mais tous les étudiants C ++ ont excellé.
OghmaOsiris

@OghmaOsiris, Franchement, je n'en sais pas assez sur Python, mais c'est peut-être ce dont vous avez été témoin qui pourrait simplement avoir été la manifestation d'un biais d'auto-sélection. Après tout, le C ++ est vraiment effrayant pour certains étudiants (en particulier pour les étudiants les plus inexpérimentés en programmation).
Stephan Branczyk

@Oghma Quelle était la classe 201? Si c'est quelque chose de bas niveau, ce devrait probablement être sa propre branche avec C comme condition préalable.
Rei Miyasaka

1
@OghmaOsiris: Hmmm je dois être en désaccord, enfin pas en désaccord, partager une expérience différente dans mon passage à Python en tant que première langue s'est avéré très utile à ma connaissance (le premier était Java sans C ++). Je ne pense pas que les expériences individuelles comptent comme le fait que l'une soit meilleure que l'autre, c'est une guerre de flammes sans fin. Je pourrais dire cependant que Python pourrait être un excellent langage de programmation pour commencer parce qu'il ne se met pas en route, il fait en fait mieux que la plupart des langages de programmation, ce qui attire de nombreux étudiants ....
Trufa

4

Voici ce que je conseillerais:

  1. Donnez-leur tous les détails dont ils ont besoin pour le comprendre
  2. Encouragez-les à essayer de comprendre les détails
  3. Assurez-vous qu'ils ont les détails stockés sous forme compacte chaque fois qu'ils en ont besoin

Fondamentalement, je vous conseillerais de créer du papier a4 unique contenant tous les détails nécessaires. Une sorte de manuel de référence qui contient tous les détails. Certains livres peuvent également aider, par exemple le livre "The C Programming Language" qui a énormément aidé car il avait tous les détails nécessaires disponibles sous forme compacte. La compression des informations est une partie nécessaire dans la création du papier a4 qui contient tous les détails.


3

La programmation est sensiblement différente des autres domaines communs rencontrés par un étudiant. De nombreux étudiants avant l'université ont réussi en faisant simplement attention en classe et peut-être en faisant quelques devoirs avec des problèmes faciles et les réponses au dos du livre. Il s'agit davantage de mémoriser des processus, puis de les créer. C'est également la première fois que de nombreux étudiants obtiennent à plusieurs reprises la mauvaise réponse (erreurs de syntaxe, erreurs logiques, erreurs de segmentation, etc.). Cela peut drainer la motivation des étudiants lorsqu'ils travaillent sur des programmes.

Pour vraiment savoir ce qui se passe avec la programmation, ils devront PRATIQUER BEAUCOUP. Une technique souvent négligée consiste à leur faire écrire du code pseudo dans leur langue maternelle. Demandez-leur de continuer à développer cela jusqu'à ce qu'ils aient une solution assez détaillée au problème. Il s'agit ensuite de traduire cela en vrai code.


3

Quand j'étais au collège, j'étais un tuteur pour le cours d'introduction à la programmation parmi d'autres cours. Le problème que vous décrivez n'est pas rare. Selon votre rôle spécifique, vous pouvez adopter différentes approches.

Premièrement, s'il s'agit d'un problème répandu affectant une partie importante des élèves de la classe, si vous y avez accès, j'aborderais le professeur enseignant le cours avec des commentaires spécifiques sur les concepts que les élèves ne parviennent pas à saisir, afin qu'il ou elle peut soit incorporer un examen supplémentaire de ce matériel au fur et à mesure qu'il reviendra au cours du trimestre, soit améliorer le programme d'études pour les termes futurs.

Si vous enseignez une section de discussion pour le cours en plus de votre temps de laboratoire, ce serait un moment merveilleux pour exposer les choses qui prêtaient à confusion en cours et aider à les rendre plus concrets et à vous assurer que les fondamentaux étaient tous compris.

Si la seule fois où vous travaillez avec ces étudiants est pendant votre séjour dans le laboratoire de tutorat, vous pouvez toujours utiliser ce temps pour enseigner aux étudiants, individuellement ou individuellement, les blocs de construction conceptuels dont ils ont besoin pour comprendre et terminer leurs devoirs.

Ils peuvent se sentir tellement perdus en classe qu'ils ne savent même pas où s'arrêter et poser des questions. Si tel est le cas, revenez aux bases avec eux. Où étaient-ils dans le cours lorsqu'ils ont pour la dernière fois compris ce qui se passait? S'ils ne sont pas sûrs ou "jamais" compris, vous devrez peut-être remonter jusqu'au début pour expliquer le monde bonjour, en leur enseignant des choses comme ce qu'est une variable, comment l'ordinateur prend leur liste d '"instructions" et essaie de faites-les dans l'ordre, mais l'ordinateur n'est pas aussi "intelligent" que nous, vous devez donc être très littéral et dire les choses exactement pour que l'ordinateur les comprenne, etc.

C'est en fait un point de lutte et de frustration que j'ai vu assez souvent dans les cours de programmation non majeurs. Les élèves écrivent du code. Cela semble "à peu près" correct, mais ensuite ils vont le compiler et cela donne une erreur, une erreur très cryptique. Et ils n'ont aucune idée de ce qui ne va pas. Et regardez leur code pendant des heures. Puis enfin comprendre que c'était quelque chose qui semble insignifiant, comme un point-virgule manquant ou une accolade au mauvais endroit. Ensuite, ils vont à nouveau le compiler, et il y a encore une erreur, c'est autre chose. Ils ont orthographié un nom de variable différemment la deuxième fois qu'ils l'ont utilisé. Etc. Alors, ils demandent de l'aide à un ami ou un tuteur ou à quelqu'un, et ils peuvent répondre du haut de leur tête "oh ajoutez-y simplement là et alors cela fonctionnera." Donc, leur expérience est que la programmation est un peu "mystérieuse"

C'est un domaine en tant que tuteur, où vous avez beaucoup de place pour vous aider. Selon leur niveau de frustration, je pourrais avoir différentes approches pour les aider à comprendre pourquoi leur code ne fonctionne pas. S'ils l'obtiennent, je pourrais leur donner des indices et essayer de les aider à comprendre par eux-mêmes. Mais s'ils sont juste au bout de leur corde sur le point d'abandonner frustrés, je leur donnerai souvent quelques réponses gratuites, puis j'essaierai au moins de leur poser des questions telles que "comprenez-vous pourquoi ce changement a corrigé votre programme ? "

Pour certains étudiants, en particulier les non-majeurs, ils peuvent ne pas avoir l'attention méthodique aux détails nécessaire pour être un bon programmeur ou apprécier la programmation. Vous pouvez les manipuler par le biais de stratégies pour les aider à prêter attention aux détails et être suffisamment méthodique pour résoudre les problèmes, même si cela représente un défi pour eux.

Mais réticents à ce que les étudiants mettent en retrait leur code "correctement" - si souvent, les programmeurs débutants créent des problèmes d'imbrication et de portée car ils ont des accolades qui ne correspondent pas ou similaires parce qu'ils ne font pas attention à ce qui est imbriqué sous quoi. Donnez-leur une liste de contrôle des "choses à vérifier lorsque votre programme ne compilera pas", comme indenter correctement tout le code et assurez-vous que les accolades correspondent, assurez-vous que toutes les lignes se terminent par des points-virgules, en particulier autour du numéro de ligne où la première erreur s'affiche. , etc.

Apprenez-leur à compiler tôt et à compiler souvent. Écrivez le code squelette minimum (disons bonjour au monde), compilez / testez. Ajoutez quelques lignes, compilez à nouveau. Il est beaucoup plus facile de trouver des erreurs si vous ne regardez qu'un petit ensemble de modifications et non un grand ensemble.

Aidez-les à apprendre à décomposer un problème en petits problèmes résolubles. C'est la même chose que nous faisons en tant que programmeurs professionnels qui résolvent des problèmes beaucoup plus difficiles que nous ne savons pas résoudre. Vous continuez à le décomposer jusqu'à ce que vous arriviez à quelque chose que vous savez résoudre ou que vous puissiez faire des recherches pour apprendre à résoudre. "Quelles mesures devez-vous prendre pour arriver à une solution de travail?" Eh bien, vous auriez d'abord besoin d'un code squelette (bonjour le monde). Savez-vous comment le faire? Oui, super, alors quand nous aurons fini de parler, vous pouvez commencer par faire ça! Il doit ensuite lire un fichier en entrée. Vous souvenez-vous d'avoir lu à ce sujet au chapitre 4? Pas vraiment? Pourquoi n'iriez-vous pas jeter un coup d'œil à cela après avoir lancé Hello World, et voir à quel point vous pouvez vous rapprocher de cela, puis rappelez-moi et je Je vais vous aider un peu plus quand vous serez coincé là-dessus. Les premières fois, vous devrez peut-être leur faire une liste numérotée des étapes nécessaires pour résoudre le problème, afin qu'ils puissent apprendre par exemple comment décomposer le problème.

S'ils obtiennent une partie mais pas la totalité du matériel en classe, encouragez-les à poser des questions en classe, car neuf fois sur dix, ils ne sont pas le seul élève à ne pas comprendre, et le professeur a probablement simplement ignoré quelque chose d'important.

S'ils passent des "heures" à regarder un bug sans le comprendre, c'est une perte de temps, ils n'en tirent pas grand-chose. Souvent, les bogues sont des problèmes de perspicacité, et il s'agit de trouver la bonne perspicacité pour le résoudre, et ils peuvent ne pas avoir un talent pour ces types de problèmes. Suggérez d'autres approches générales à adopter lorsqu'ils sont coincés: demandez de l'aide à un autre ami de la classe (apprenez à connaître certains camarades de classe si nécessaire pour le faire), commencez leurs devoirs bien à l'avance afin qu'ils aient le temps de s'arrêter, puis le laboratoire de tuteur et poser des questions pendant les heures d'ouverture, ou aller aux heures de bureau du professeur. S'ils sont habitués au bourrage, ce qui fonctionne bien pour les sujets de mémorisation, ils heurteront un mur de frustration lorsqu'ils face à la programmation qui est plus une question de résolution de problèmes que de mémorisation. Montrez-leur comment rechercher des exemples de syntaxe dans leur manuel, stackoverflow, etc. Encouragez-les à publier une question sur un forum de questions de classe privée, le cas échéant.

Apprenez-leur à préciser où le code cesse de fonctionner. Commentez les éléments jusqu'à ce que vous reveniez à quelque chose qui fonctionne, puis ajoutez-les lentement jusqu'à ce que vous obteniez à nouveau ce défaut de segmentation.

Un grand nombre de ces idées pourraient être transformées en documents à distribuer si elles se présentent souvent. Les stratégies sont généralement la partie que les professeurs passent sous silence - ils passent leur temps sur la syntaxe, la sémantique de la façon d'écrire des boucles, des tableaux, des E / S, etc. Mais pas assez de temps consacré à "ce que je fais quand j'essaie pour exécuter mon code et il ne compile pas ou tombe en panne sur moi? "

En ce qui concerne les choses conceptuelles, en particulier les fondamentaux, comme "qu'est-ce qu'une variable", ou "qu'est-ce qu'une boucle?" ne pas comprendre cela les empêchera de suivre le reste du cours. Dans un cours magistral, le professeur peut ne pas avoir le temps de répondre à toutes les questions ou d'aider à éteindre l'ampoule pour chaque étudiant. Et c'est en partie pourquoi les tuteurs sont si importants pour l'apprentissage de la programmation. Ils peuvent avoir besoin d'un enseignement individualisé avec des analogies supplémentaires pour concrétiser un sujet particulier.

Puisque vous enseignez en C ++, j'imagine que les cours apparaissent comme un sujet abstrait que certains étudiants ont du mal à "obtenir". Souvent, l'abstraction des classes est enseignée avec des exemples correspondant à un objet du monde réel aléatoire, comme une "machine ATM", et des analogies sont faites avec l'objet du monde réel. Vous pourriez avoir des variables pour garder une trace de la quantité d'argent à l'intérieur, vous avez des méthodes, qui sont comme des règles qui disent à la machine atm comment répondre à des conditions particulières, etc. Parfois, une analogie est celle qui "colle" pour une personne particulière et les autres élèves en saisissent mieux un autre.

Dans la mesure du possible, dessinez des images pour eux. Comme un diagramme de séquence de ce qui se passe au fil du temps pour les aider à avoir une vue d'ensemble de ce que fait le code qu'ils écrivent. L'utilisateur clique sur ce bouton. Ensuite, le programme devrait répondre en faisant x, y et z. Dessinez un tableau comme un tas de boîtes postales au bureau de poste qui ne peut contenir qu'un seul numéro, et des pointeurs comme des flèches pointant vers "l'adresse" sur le devant de la boîte. Etc.


2

De tous les merveilleux choix pour les langages de programmation, ce collège utilise C ++ comme classe d'introduction CS pour les majors non CS ?? Entre les mains d'un instructeur talentueux, cela pourrait être envisageable à distance, mais pourquoi le rendre si difficile?

Quand j'ai appris "Pascal" dans mon cours d'introduction au CS, nous avons passé les 3 premières semaines à travailler avec " Karel le robot ". Il s'agissait d'un environnement de programmation de type sandbox très simple où tous les concepts de base (y compris la récursivité) ont été explorés à fond avant de le faire en Pascal. Dans "Karel le robot", vous contrôlez un robot dans l'espace 2D à l'aide d'un petit ensemble de commandes simples. Cela donne aux élèves une base concrète utile sur laquelle ils peuvent s'appuyer pour ce qui se passera ensuite.

Peut-être existe-t-il maintenant des langages de programmation pédagogique plus modernes qui remplissent le rôle de "Karel le Robot"? Mais probablement trop tard pour vos élèves maintenant.


Nous avions un programme similaire appelé Alice.
OghmaOsiris


@OghmaOsiris Le lien Alice est rompu. La fin "a été ajoutée à l'URL.
Zoot

Ouais, sans ça la fin ')' a été coupée.
OghmaOsiris


2

En plus de ce qui a été dit, je suppose qu'en tant que débutant, ils n'ont qu'à gratter la surface, alors adaptez votre programme en conséquence pour éviter des choses complexes.

0-leur donner un problème simple (disons évaluer une expression).

1-leur donner le temps de le comprendre.

2-donnez-leur la réponse.

3-passer par la réponse ligne par ligne

4-demandez-leur de comparer votre réponse avec leur réponse

5-leur demander de tirer la leçon de ce problème

6-ajouter une étape supplémentaire au même problème, par exemple une condition nécessitant une instruction IF

7-répétez la tâche ci-dessus sur plusieurs problèmes. D'ici là, ils auraient compris les bases de la langue et comment utiliser l'environnement. Le serait prêt pour la suite.

Également,

-ont un problème simple bonus pour eux d'essayer à la maison toutes les 2 classes environ

-engager avec chaque élève pour voir quel est le point qui l'empêche d'aller plus loin

-fournir du matériel de référence facile, oublier des sujets complexes et des livres complexes

-obtenir fréquemment leurs commentaires et les utiliser

-les demander de se préparer au sujet suivant avant de venir en classe


2

Ce qui m'a aidé lorsque j'ai parcouru CS 101, c'est d'apprendre la logique avant même de regarder le code. Nous avons parcouru les tables de vérité et le calcul prépositionnel juste pour commencer à penser "ceci est vrai ou faux" et non "ceci est égal à ceci ou cela".

C'était juste là quand tout a cliqué pour moi. Une fois que j'ai compris que la programmation consiste simplement à manipuler des valeurs vraies / fausses à sa base, tout est devenu relativement simple.

Et cela fait que peu importe la langue que j'utilisais, la logique est la même partout. La syntaxe peut être déroutante, mais je peux dire des choses comme "Ok, dans Obj CI envoyer des messages à des classes comme celle-ci et en C ++ les messages ont été envoyés de cette façon. Mais l'algorithme n'a pas changé du tout." etc.


2

Il y a un article ACM ou IEEE quelque part qui explique en détail pourquoi les débutants (même les diplômés CS commençant dans le domaine) doivent s'asseoir derrière un programmeur senior et les regarder coder un problème.

Les professionnels s'associent souvent pour des problèmes difficiles. On dit trop souvent aux étudiants de ne pas le faire. Avantages de l'appariement (à tour de rôle au clavier): 1. L'élève apprend immédiatement ce qu'il fait mal. Rétroaction instantanée. 2. Lorsque l'apprenant regarde l'enseignant, l'apprenant reprend des choses qu'il n'aurait jamais pensé signaler.

Plutôt que de laisser un élève développer de mauvaises pratiques, ils sont étouffés dans l'œuf. (Je retournerais # 1 avec # 2 ici et laisserais l'étudiant regarder le moniteur / TA en premier )

Enseigner CS avec un ensemble statique de diapositives PowerPoint ne prête pas bien au processus temporel d'écriture d'un programme. (Certes, il existe des astuces que vous pouvez faire en augmentant les fonctions ligne par ligne, mais elles sont généralement maladroites.)

Les apprenants doivent savoir où commencer à écrire, et où s'arrêter et compiler. Nos cerveaux sont principalement câblés pour lire de gauche à droite de haut en bas, mais un programme est comme un tout choisissez votre propre livre d'aventure entassé dans une seule page!

Trop souvent, un débutant copiera un programme entier puis compilera. Même un professionnel pourrait donner une première chance à cela, avant de se rendre compte qu'il aurait dû laisser toutes les fonctions vides et compiler le programme, puis l'ajouter de manière itérative dans un squelette fonctionnel.

En outre, l'idée ridicule que la CS devrait être enseignée sans ordinateur et seulement avec un crayon et du papier est liée. Je me demande combien de professionnels de la programmation employés pensent vraiment que c'est la meilleure façon, ou si c'est juste ce que font les instructeurs CS parce qu'ils n'aiment pas eux-mêmes travailler avec des ordinateurs? Toute tentative de supprimer un ordinateur de l'image est moyenne. Cela rend la programmation moins amusante et moins interactive qu'elle ne devrait l'être. Nous sommes depuis longtemps passés à saisir des données sur une carte perforée et à attendre patiemment. Les développeurs professionnels d'aujourd'hui sont fans de gratification instantanée. Heureusement, la plupart des étudiants le sont aussi.

De toute évidence, le dessin de jolis dessins au crayon et au papier avant et pendant le processus de développement est un outil puissant pour les programmeurs professionnels et débutants. Ce temps comme le "clavier" devrait également être consacré à l'appairage! Ici, il serait peut-être judicieux de laisser l'élève tenter le premier tour avant de regarder l'enseignant, même si cela vaut probablement la peine de voir le véritable processus de réflexion de l'enseignant.

Enfin, les touches de raccourci et les astuces d'édition que le développeur professionnel utilise ne sont pas du «bruit» pour l'apprentissage de l'étudiant. Plus important encore, ils engagent et intéressent l'élève. Deuxièmement, ils sensibilisent aux besoins communs de développement. De plus, les pratiques les plus élémentaires sont souvent faciles à exécuter mais pas évidentes au départ. Un jeune étudiant en atelier de menuiserie peut facilement apprendre à retirer un clou avec la griffe d'un marteau, mais dans la plupart des cas, il faut d'abord dire que c'est à cela que sert la griffe. Certaines choses extrêmement faciles à faire ne sont tout simplement pas triviales à apprendre sans être enseignées. Même les développeurs professionnels oublient ces "astuces" tout le temps et bénéficient d'outils de refactoring comme resharper pour supprimer le code redondant ou non atteint, etc.


1
btw, si quelqu'un pouvait me pointer vers le titre de cet article, je l'apprécierais!
David

2

La programmation informatique est souvent l'un des premiers cours où l'habileté cognitive de synthèse est requise pour une note de passage. Cette compétence est très difficile à transmettre à quelqu'un d'autre. Vous pouvez expliquer tous les composants dont ils disposent et comment ils fonctionnent. Vous pouvez donner une multitude d'exemples de la façon dont d'autres personnes ont utilisé la synthèse pour combiner ces composants en un tout plus utile, mais il n'y a que beaucoup de choses que vous pouvez faire sans quelque chose de «cliquetant» dans l'esprit de l'élève.

D'après mon expérience, c'est l'habileté de la synthèse qui échappe le plus souvent aux personnes qui n'obtiennent pas de programmation. Ils ont une parfaite compréhension des parties, comme les variables, les fonctions et les boucles, mais ils posent des questions comme: "Je comprends pourquoi cela fonctionne, mais comment saviez-vous que vous deviez y mettre une boucle?" Vous devez simplement pratiquer jusqu'à ce que vous l'obteniez.


2

Pour citer mal Aaron Hillegass, rappelez-leur qu'ils ne sont pas stupides, c'est juste difficile. Il est difficile de former votre esprit à la programmation, c'est une toute autre façon de penser, et bien qu'ils puissent avoir du mal avec les bases, ils sont probablement très conscients qu'ils le sont et cela les rendra assez découragés.

Je dis cela en tant que personne qui a également échoué à son cours de CS de première année, j'avais déjà programmé beaucoup de choses et obtenu tous les concepts (VB, ouais bébé) mais C ++ ne voulait tout simplement pas cliquer pour moi. J'ai fini par revenir à l'essentiel et à travailler à partir de là, puis ça a cliqué, mais si quelqu'un avait dit "Tu n'es pas un idiot, c'est juste dur" ça m'aurait facilité la vie.


0

Vous avez dit "ces étudiants savent peut-être apprendre les mathématiques, la biologie ou la physique, mais ces techniques ne fonctionnent pas en matière de programmation".

Il y a une raison à cela, la programmation nécessite quelque chose que les autres disciplines n'exigent pas nécessairement: la créativité et ... la fantaisie . La capacité à "imaginer les choses au travail". Personnellement, j'ai trouvé qu'une telle exigence est plus présente (bien sûr, à toutes les exceptions près) chez les personnes venant de l'école technique (électronique et électromécanique en particulier: ils doivent "imaginer les flux électriques et comment ils se contrôlent", car ils ne peuvent pas les voir!) que de la "science pure" (où tout ressemble à tourner autour des mathématiques).

Pour ces derniers cas, la "cognition visuelle" doit être aidée. Il est important non seulement de se concentrer sur la notion et le texte (le type -> compiler -> regarder les erreurs ne peut pas fonctionner si vous n'êtes pas en mesure de "lire" les erreurs) mais de fournir un moyen de visualiser les choses, soit au moment de la conception ( en simulant ce qui se passe sur la machine: être préparé avec un tableau blanc et un ensemble de post-it colorés) et au moment de l'exécution.

Pour que cette dernière partie soit réussie, il faut donner une notion essentielle des systèmes d'exploitation et «comment les programmes s'exécutent dans une machine» (et ce qu'est cette machine en fait). Et un IDE non intimidant doit être donné. J'ai normalement un "bloc de code personnalisé" avec beaucoup de choses supprimées pour "ne pas distraire". La notion de projet fait de sources pour générer des objets à relier à la bibliothèque doit être donnée AVANT de commencer à parler d'un langage.

Le monde bonjour traditionnel C ++ nécessite un point d'entrée et un périphérique de sortie. L'élève doit déjà le connaître. Le succès de ce type de cours dépend des premiers jours. Vous devez stimuler une visualisation de ce qui se passe à l'intérieur d'un ordinateur pour leur permettre de comprendre ce qu'est la programmation.
Le reste est la syntaxe (science) et l'abstraction (fantaisie)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.