ZEP-10 Module d'exercices

Car apprendre c'est bien, pratiquer, c'est mieux !

L'auteur de ce sujet a trouvé une solution à son problème.
Staff
Auteur du sujet
Cartouche
ZEP 10
Titre Module d'exercices
Révision 1
Date de création 24 Juillet 2014
Dernière révision 24 Juillet 2014
Type Feature
Statut Rédaction

Motivations

C'est un fait connu que c'est en forgeant qu'on devient forgeron. L'informatique, et plus largement les sciences n'échappent pas à cette règle. Quand on apprend un langage, une nouvelle technologie ou tout simplement des nouvelles connaissances, il est conseillé de pratiquer à côté si on veut espérer retenir les connaissances engrangées. La pratique passe souvent parce ce qu'on appelle scolairement des exercices. Trouver des exercices par soi-même est parfois difficile et même pas forcément conseillé quand on est au stade d'apprenant. Le module d'exercices serait donc un outil pratique pour les lecteurs afin qu'ils puissent tester leurs connaissances.

Types d'exercices

Contrairement à l'école, corriger un exercice requiert un processus automatique. Cela m'a donc amené à penser à 4 types d'exercices différents

Les QCMs

Un QCM, ou questions à choix multiples est une façon de tester les connaissances sans que le concepteur se complique la vie. Souvent, ça permet de s'assurer que la personne à compris la base d'un tutoriel par exemple. Ce n'est pas très poussé mais c'est toujours utile. De plus, un concepteur vicieux peut facilement faire des QCMs piégieux.

Exercices simples

Pour ce type d'exercices, on attend de l'utilisateur une réponse, ou plusieurs réponses qu'il devra indiquer par exemple dans un champ input. On peut donc avoir des questions de la forme :

  1. Quel est la solution de l'équation $10x-2=418$ ?
  2. Quel fonction permet d'allouer un tableau et d'initialiser ses éléments à $0$ en C ?
  3. Que vaut $\sqrt{4}$ ?

Ce type d'exercice est un peu plus poussé que le QCM. On attend du lecteur une réflexion un peu plus poussée et la réponse sera moins automatique que pour un QCM.1 Cependant, comme le montre la question $3$, la réponse n'est pas forcément unique. On se penchera sur cette difficulté dans le paragraphe suivant.

Des exercices compliqués

Le nom est pas bon, c'est juste pour l'opposé aux exercices simples. Cet exercice demandera au lecteur d'écrire du code pour répondre à la question, par exemple :

  1. Calculer le PGDC de deux entiers $m$ et $n$
  2. Calculer le $n$ième nombre premier

Ici, l'utilisateur se frotte réellement au langage, et cela lui demande un peu plus d'investissement. On verra les problèmes que peut soulever la mise en place des ces exercices dans le prochaine paragraphe.

Des exercices ouverts

Dans le cadre d'un TP de programmation, ou bien tout simplement l'exerice de SpaceFox Le Javaquarium, il est difficile de vérifier automatiquement qu'un code vérifie l'énoncé. Ces exercices sont donc ouverts et le lecteur peut consulter l'énoncé à tout moment.

Quelques problèmes de conceptions

Je pense que les QCMs et les exercices ouverts ne posent pas de difficulté immédiate dans la conception. Pour le premier, on a comme exemple le SDZ, et pour le dernier c'est juste du texte.

En ce qui concerne les exercices simples. Les réponses pouvant être ambiguës, la réponse attendue par le créateur de l'exercice doit alors matcher la réponse de l'utilisateur. Cela demande donc que le créateur utilise des expressions régulières. Et donc comme contrainte, un exercice simple ne peut accepter que des langages réguliers.

Ce qui m'amène aux problèmes compliqués. Eux, demandant un code source, si on veut analyser le code source directement, le langage étant algébrique, c'est un peu plus compliqué. Et construire un automate qui accepte tous les codes sources répondant à un énoncé est bien trop fastidieux. Je pense donc qu'une solution pour palier à ce problème est d'utiliser ce qui est fait ailleurs, comme sur uva, spoj ou même France IOI. C'est à dire, que le concepteur de l'exercice doit fournir un jeu de tests assez éxhaustif afin de s'assurer de la validité du code source demandé. Un jeu de tests étant un ensemble de couples entrées/sorties.

Proposer et résoudre un exercice

N'importe quel membre de zds peut proposer un exercice en suivant le principe établi au paragraphe précédent. Ensuite, un validateur doit vérifier que l'exercice proposé est convenable, que la solution attendue par le créateur est correcte, ou bien que les jeux de tests proposés sont corrects et pas triviaux.

Bien qu'un exercice soit consultable par tous le monde, pour les exercices simples et compliqués, seul un membre enregistré du zds pourra proposer une solution. Cela afin d'éviter des surcharges inutiles.

Proposer une correction

Ces paragraphes concernent seulement les exercices simples et compliqués. Un membre ayant résolu l'exercice peut alors se voir proposer une option : Proposer une correction. La correction est proposée, et un valido doit alors l'accepter. Si le valido accepte plusieurs corrections pour un seul et même exercice c'est alors que les approches sont différentes. Pour les exercices simples une correction pourra être par exemple un raisonnement, une preuve mathématiques, tandis que pour les exercices compliqués, ça sera un code source. Ainsi un valido pourra choisir plusieurs corrections pour des langages différents dans le cadre un d'exercice compliqué. Voir même plusieurs corrections au sein du même langage si les approches sont distinctes.

Un forum pour les exercices

A discuter, mais je pense qu'il serait intéressant de faire deux forums à part entière pour les exercices.

Un forum de réfléxion

Dès qu'un exercice a été validé par le processus décrit plus haut, alors un forum est automatiquement crée pour cet exercice. Evidemment, poster une solution sur ce forum est une interdiction. L'idée est donc de discuter/réfléchir autour de cet exercice.

Un forum pour commenter les solutions

Une fois qu'un membre a résolu un exercice, il a accès à ce forum. Son utilité est donc de commenter une solution de discuter des différentes approches etc… Ce forum pour moi n'est pas inutile et peut-être essentiel si on veut progresser. Par exemple, si on demande d'implémenter la fonction factorielle, le programmeur de base ne pensera pas à la récursivité terminale et c'est en utilisant ce forum qu'il pourra apprendre ce que c'est. De même, en implémentant la fonction Fibonacci, on peut parler de programmation dynamique.

Quelques questions ouveres

Pour les exercices compliquées, cela demande d'avoir un juge acceptant plusieurs langages. Je pense qu'il faudra donc définir quels sont les langages que l'on veut accepter de façon général.

Afin d'éviter les surcharges, une solution serait que lorsque l'utilisateur fait une soumission, elle est mise en liste d'attente. Et on interdit à ce qu'un utilisateur ait plus de $2$ soumissions dans cette liste d'attente.

Je pense qu'il faudra aussi discuter d'un peu plus en détails de l'interface utilisateur et même de l'expérience utilisateur. Est-ce que c'est gérable à terme que les validos doivent valider des corrections/propositions d'exercices ?

Peut-être avez vous d'autres types d'exercices en tête ? Ou bien vous pensez qu'un type décrit ici est inutile

Un exercice peut-il être rattaché à un tutoriel en particulier ? Si oui, quel est son intérêt ?

Comment implémenter cette ZEP techniquement ? J'y ai répondu partiellement et très vaguement. Mais je suppose que vous aurez de meilleurs idées.


  1. On peut même imaginer des exercices de ce genre façon Projecteuler, ou l'utilisateur doit écrire un programme pour donner le résultat. 

Édité par Alex-D

+5 -0
Staff
Auteur du sujet

Je n'ai pas pris le temps d'éditer quoi que ce soit suite au poste d'Eskimon. Dans tous ce que j'ai proposé, les exercices étaient à la base dans un module à part. Sur les quatre types d'exercices que je propose, on peut très facilement intégrer les deux premiers dans un tutoriel.

Ajouter à cela, je pense qu'il peut-être intéressant de prévoir un petit éditeur de code intégrable dans un tutoriel, pour éditer des codes en live.

+0 -0
Staff

J'aime bien l'idée d'un module a part, permetant de bien séparer les deux et faciliter la création par d'autres personnes que les auteurs de cours. D'autant qu'avec les tags, on doit pouvoir mettre en liens automatiquement cours et exercices tout en laissant la possibilité à un auteur de faire un liens explicite avec des exos.

+4 -0

Cette idee me semble bien sympatique, d'autant plus que je suis un france-IOI-tien (?), cependant, je ne sais pas si on peux rattacher ce module aux valido, etant donne que ce n'est pas vraiment le meme esprit que les tutos, faudrait ptet faire deux categories de validos ;)

Sinon, pour l'idee des forums, ce serait bien que quelque chose soit mis en place pour qu'un membre puisse demander de l'aide en montrant son code sans que cette demande soit accessible des membres n'ayant pas encore resolu l'exercice1


  1. oui je sais, ca ressemble etrangement au forum de Fr-IOI 

On ira, on saura …

+2 -0

Je déterre le sujet puisqu'on en a parler dans le forum de programmation (merci à Kje !)

Je propose de commencer à donner des exercices en tout genre pour commencer à étoffer un peu, pour mettre du contenu. En attendant de trouver la solution la plus adéquate, pourquoi ne pas faire comme d'autre site avec un post épinglé ? Si vous êtes d'accord, je commence à vous envoyer des exos d'algo de niveaux plus où moins compliqué qui font appel aux tableaux :D

+0 -0
Staff

En fait, si tu veux faire des exos sur le forum, tu n'a pas besoin de ce sujet. Fais le, hésite pas ! Il y en a déjà faut pas hésiter. Les épingler, pourquoi pas, faut voir si ça va pas vite devenir bordélique. Il serait peut être plus pertinent de bien taguer tous les sujets d'exo avec le meme tag pour pouvoir les lister facilement. Si apres il y en a pas mal et que ça a du succes, on pourra envisager un forum dédié.

Ce sujet est justement là pour discuter de comment on pourrait en faire un module dédié, hors du forum, les contraintes, ect. Une ZEP c'est un peu un sujet pour rédiger une spec. de dev de façon communautaire qui, une fois accepté, va être prit en charge par un ou plusieurs dev.

+1 -0

D'accord ! Justement je comprenais pas trop.

En fait je parlais pas de faire un forum, plutôt un thread avec des liens interne (comme sur OC dans le forum C), ce qui est un moyen temporaire pas trop mal je trouve :).

Eh bien je m'y atèle quand j'ai finis mon projet !

+0 -0

Hello !
Il existe un site de formation de programmation en ligne qui propose des exercices de code. Il est bien fichu puisqu'il arrive à vérifier si le code répond à l'énoncé, de manière automatique. Il s'appelle CodeSchool.

Je ne connais pas son fonctionnement exact mais. 1. Les exercices sont très progressifs, il n'y a que quelques lignes à saisir à chaque fois.
2. Il n'est possible d'écrire que dans une zone spécifique du code, celle où l'on attend une modification.
Ces deux premiers points permettent une validation plus facile.
3. Il y a ensuite une petite tricherie qui consiste à forcer la main de l'utilisateur dans le choix des noms de variables.
4. Il reste tout de même des morceaux mystérieux car il arrive à interpréter le code en quasi temps réel pour afficher des erreurs de code.

De ce que j'ai vu c'est tout en JavaScript.

Voilà pour ma petite contribution à l'édifice, je vous laisse aller voir c'est assez bluffant.

Nicolas.

Édité par Mafzst

Developpeur web Symfony AngularJS

+2 -0

Il reste tout de même des morceaux mystérieux car il arrive à interpréter le code en quasi temps réel pour afficher des erreurs de code.

Il faut des VM côté serveur pour lancer le code envoyé de façon asynchrone (AJAX). Sur ZdS on aura, je pense, pas les moyens de mettre en place un tel système. Il faudrait arriver à avoir des VM bien configurées pour chaque langage/framework/… ce qui me semble assez imposant techniquement et demanderait un serveur dédié (dans tous les sens du terme).

De ce que j'ai vu c'est tout en JavaScript.

Il n'y a pas des masses de choix en terme de dynamique côté client ^^

Je me demandais : les articles de ce genre, c'est-à-dire expliquant un bout de code, une fonctionnalité d'une bibliothèque… ont-ils leur place ici ? D'un côté je ne vois pas très bien quels seraient les critères de sélection, de l'autre c'est en lisant/étudiant du code qu'on apprend.

Vayel

Cela pourrait-il être intégré à cette ZEP ?

+0 -0
Staff

Je me demandais : les articles de ce genre, c'est-à-dire expliquant un bout de code, une fonctionnalité d'une bibliothèque… ont-ils leur place ici ? D'un côté je ne vois pas très bien quels seraient les critères de sélection, de l'autre c'est en lisant/étudiant du code qu'on apprend.

Vayel

Cela pourrait-il être intégré à cette ZEP ?

Vayel

J'ai du mal à voir le rapport, pourrais tu expliciter un peu ?

Des analyses de code feraient-elles parti de ce qu'on appelle "exercice" ? De ce que j'en ai compris, cette ZEP définit quelles sortes d'exercices il y aurait, mais aussi comment les rattacher à un tutoriel. D'où la question : une analyse de code pourrait-elle être rattachée à un tutoriel, comme les exercices, ou doit-elle rester ailleurs (forum, article…) ?

+0 -0
Staff

Des analyses de code feraient-elles parti de ce qu'on appelle "exercice" ?

Un exercice est caractérisé par un énoncé. C'est au niveau du nombre de réponses possibles que ça se complique. Dans ton cas, l'analyse de code serait plutôt la correction possible d'un exercice.

Après la question serait de savoir si ça peut être fait automatiquement ou pas. Dans certains cas on peut analyser le résultat d'un code, on peut vérifier qu'un code respecte certaines syntaxes du langage, etc. Cependant, je pense que pour une première ZEP, mettre en place une version simple du module ainsi que son architecture et son intégration dans le contenu, serait déjà une bonne porte ouverte.

J'avais pas vu l'aspect "exécuter du code".

Ce qui reste envisageable (bien qu'assez imposant quand même), c'est d'utiliser une JVM (un programme Java en fait) qui permettrait donc de compiler/exécuter :

  • du Java via javax.tools.JavaCompiler
  • du Python via Jython, qui il me semble renvoie des messages d'erreurs et des stacktraces assez proches de celles "en natif"
  • du Ruby via JRuby
  • du JS via Nashorn ou le ScriptEngine
  • du Groovy assez simplement (lang-groovy.jar)

Et sans doute d'autres.

Le tout de façon asynchrone et isolé (mais la JVM devrait nous permettre d'isoler les contextes, de pas aller set des variables d'environnement et tout le bordel).

Ca permettrait de s'affranchir de n VMs, au prix d'un sacré drop de langages et du coup me semble rendre le truc possiblement viable, sans être foufou non plus.

Pour gérer l'asynchrone et mapper ça sur un serveur http (ou même carrément websocket) ça sera trivial.

Happiness is a warm puppy

+1 -1

T'as quoi en tête ? Ça m'intéresserait comme sujet en fait de bricoler un proto qui permet d'exécuter quelques scripts simples indépendamment de l'os, fastoche à setup partout et de brancher ça sur une API. Honnêtement avec une jvm ça me semble jouable en une petite journée de boulot .

Happiness is a warm puppy

+0 -0
Staff

J'en avait mit de côté, je vais essayer de retrouver. Je sais que open-edx a un projet dédié. Ça a été fait pour python a la base mais normalement ça marche pour tout.

Le tuto officiel de go utilise aussi un truc du genre.

Ce que je reproche a une jvm c'est que ça limite beaucoup les cibles.

+0 -0

Y'a ça sachant que la liste me semble furieusement pas à jour. Je crois que certains projets ont été abandonnés.

Après si tu me trouves un truc propre à installer (partout), sans avoir besoin de 95 dépendances à installer à la main, qui cloisonne proprement l'environnement, qui soit "invocable" depuis un langage que je connais et qui donne des résultats propres moi ça me va complètement ! Je plug une API dessus et roulez jeunesse.

Happiness is a warm puppy

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte