Quelques pistes pour l'organisation du cours de NSI en Première
I. Rappel de la structure officielle
- Histoire de l'informatique
- Représentation des données : types et valeurs de base (entiers, réels, booléens, chaînes de caractères)
- Représentation des données : types construits (tuples, tableaux, dictionnaires)
- Traitement des données en tables (préparatoire aux bases de données, vues en terminale)
- Interactions entre l’homme et la machine sur le web : distinguer partie statique (html) dynamique côté client (javascript) et dynamique côté serveur ; transmission de paramètres client → serveur
- Architectures matérielles et systèmes d’exploitation : structure d’un ordinateur, circuits combinatoires, protocoles réseau, systèmes d’exploitation, périphériques
- Langages et Programmation : structures de contrôle classiques, typologie et diversité des langages, préconditions et post-conditions, tests, utilisation d’une bibliothèque et de sa documentation
- Algorithmique : présentation de quelques algos classiques, complexité, preuve de terminaison
A priori, 100 heures réparties sur 8 sujets : 12,5 heures/sujet.
II. Suggestion de décomposition horaire
Le tableau suivant donne une idée de la répartition en volume horaire ; il ne s'agit pas d'un planning à suivre. Par exemple, la partie "Histoire de l'informatique" peut tout à fait, comme cela est d'ailleurs suggéré dans le programme, être en partie répartie sur l'année au fur et à mesure de l'introduction de certains concepts.
bloc | titre | volume horaire | Détails |
---|---|---|---|
1 | Algorithmique et programmation de base | 32h |
|
2 | Histoire de l'informatique | 4h | Le volume horaire peut éventuellement être réduit, dans la mesure où ce thème se retrouvera a priori dans le programme de Terminale. Il faut donc trouver une façon de segmenter les choses. Le programme suggère que ces aspects soient abordés au fur et à mesure de leur rencontre dans le cadre des autres points abordés. Cela risque de mener à quelque chose de difficile. Je suggèrerais plutôt la chose suivante :
|
3 | Architectures matérielles | 16h |
|
4 | Applications Web | 16h |
|
5 | Algorithmique avancée | 16h |
|
6 | Traitement de données en tables | 16h |
|
III. Suggestion d'organisation
A. Travail sur projet(s)
1. Organisation
Il est demandé que le quart du volume horaire soit consacré à des projets. Comme la réalisation d'un projet nécessitera d'avoir déjà quelques compétences en algorithmique, il n'est pas pensable de commencer des projets trop tôt. Par ailleurs, bloquer une longue période pour une réalisation de projet risque de plutôt perdre les élèves. Deux façons de procéder peuvent être envisagées :
- Un seul et unique projet
- En fonctionnant ainsi, il s'agira d'un projet d'environ 35 heures. Je suggère alors de consacrer environ 2h par semaines à partir de la moitié de l'année au projet. Le risque est d'avoir un sentiment profond d'échec si cela ne mène finalement à rien de satisfaisant.
- 2 projets
- Dans ce cas, le premier projet devra être un projet relativement court (8h), d'initiation à la démarche projet et de concrétisation des premiers apprentissages. Il pourra se dérouler vers la fin du premier semestre. Le deuxième projet sera quant à lui un projet plus long (27h), qui permettra d'aboutir à une application plus fonctionnelle.
2. Sujet de projet
Le sujet d'un projet dans le cadre d'un enseignement de lycée doit être un projet motivant pour l'élève, et faisable avec le temps imparti et les connaissances de l'élève. Je suggère donc que les élèves soient libres de choisir parmi une liste proposée par l'enseignant. Le fait de laisser les élèves proposer leur propre sujet en première est un choix de l'enseignant, mais il est impératif de vérifier la faisabilité d'un sujet proposé par les élèves, et d'expliquer la non faisabilité le cas échéant.
Les sujets proposés peuvent être pris dans différents domaines :
- Les matières enseignées ;
- les sujets d'intérêts des adolescents ;
- les actualités ;
- les domaines d'intérêt de l'enseignant susceptibles d'intéresser les élèves.
Plus il y aura de sujets, plus il y a de chances que les élèves trouvent un sujet qui les motive. Ne pas hésiter à travailler en réseau pour partager des idées de projet.
3. Démarche pour mener le projet
Afin d'éviter l'échec, utiliser une démarche itérative, et pourquoi pas Agile, est nécessaire.
Réunion de lancement
Le lancement d'un projet devra consister en une première séance pour déterminer notamment :
- Les fonctionnalités à implanter
- L'importance et la charge de chaque fonctionnalité
- Les difficultés et risques potentiels
Cette réunion doit notamment permettre d'établir une priorité des fonctionnalités à implanter, par exemple en essayant de maximiser le retour sur investissement : importance/charge. Par ailleurs, cette réunion peut être l'occasion de réfléchir à l'architecture générale de l'application et à une première répartition des tâches. Enfin, la réunion doit se terminer par une affectation des fonctionnalités à implanter pour la semaine suivante à chacun des membres du projet.
Par la suite, chaque séance doit commencer par une réunion-bilan sur le travail fait par rapport à ce qui était à faire (10 minutes), et une nouvelle répartition de tâches pour la semaine à venir. p>
4. Évaluation du projet
Évaluer un projet est un problème toujours compliqué. Dans l'idéal, une évaluation devrait reposer sur :
- la gestion du projet
- le produit final
- la qualité du code et les démarches mises en oeuvre pour l'assurer
- la documentation
Il est préférable de ne pas être trop ambitieux sur les fonctionnalités à implanter et de privilégier la qualité du travail.
B. Évaluation
Le problème de l'évaluation en informatique est un problème difficile. Les personnels enseignant l'informatique depuis des années dans le supérieur continuent de se poser des questions sur le sujet.
Une évaluation purement théorique est loin d'être satisfaisante. Travailler sur machine est une compétence essentielle de la discipline, et celle-ci doit être prise en compte.
Toutefois, l'évaluation sur machine reste un problème compliqué :
- L'implantation est un processus long, qui permet rarement d'arriver à quelque chose de satisfaisant durant le temps d'une épreuve surveillée ;
- Il est difficile d'accorder une valeur à un travail fait en dehors de l'école ;
- Que doit-on prendre en compte dans un programme ? Le résultat ? L'algorithme ? Le code ?
- Quand un programme vaut-il 18 ? Quand vaut-il 15 ? Pourquoi 15 et pas 15,5 ?
Le choix fait par le ministère pour évaluer les élèves qui arrêtent la spécialité à la fin de la première est celui d'un QCM. C'est un choix que j'estime plutôt judicieux, même si au final on aura du mal, je pense à estimer ainsi à quel point le cours a développé la "pensée informatique" des élèves.
L'utilisation des QCM dans le cadre du cours permet d'effectuer une partie de l'évaluation. Il est tout à fait possible, dans des QCMs, de demander de l'évaluation de code, ou d'élargir le QCM à des questions à trous. L'avantage d'évaluer via un QCM est que cela permet de reconnaître le travail des élèves qui ont assimilé les concepts, mais qui ont encore du mal avec la pratique.
Dans le cadre des évaluations de cours, par contre, évaluer du code produit par les élèves restent indispensable. Le barème doit alors être clair dès le départ et suffisamment détaillé pour qu'il n'y ait quasiement qu'une façon de noter une copie donnée (même si, à chaque fois, on tombera sur des cas non prévus)
C. Structure des cours
Comme cela a déjà été exposé, il est important de varier la structure des cours. Toutefois, les objectifs d'un cours doivent être clairs non seulement pour l'enseignant, mais également pour l'élève. Par contre, pour ce dernier, suivant les cas, il est possible de ne lui présenter les objectifs qu'a posteriori, une fois qu'il a assimilé ce dont il s'agissait.
IV. Quelques structures de cours envisageables
A. Exploration en mode "informatique débranchée"
1. Présentation générale
1. Présentation générale
Ce type de cours permet de mener assez facilement des apprentissages suivant la théorie des situations didactiques. On commence par faire manipuler aux élèves des objets concrets pour les amener à formuler des règles. C'est aussi une façon d'introduire des métaphores qui aideront à la compréhension et qui resteront.
L'enseignant intervient très peu au cours de la séance. par contre, il peut reprendre la main au moment de la formalisation, puis relancer une série d'execices dans le système formalisé.
Une séance de 2 heures peut être décomposée ainsi :
- 45 minutes d'exploration en groupes
- 30 minutes de restitution et de formalisation avec application informatique
- 45 minutes d'exercices sur machine
Bien sûr, ces temps ne sont donnés qu'à titre indicatifs. Dans certains cas, il faudra laisser beaucoup plus de temps à l'exploration, tandis que dans d'autres, on souhaitera diviser par 2 les temps indiqués.
2. Exemples d'utilisation
a. Les concept de variable informatique et d'affectation
Comme cela a déjà été dit, ces 2 concepts sont plus compliqués qu'il n'y paraît, pour plusieurs raisons :
- une variable ressemble à une inconnue en mathématiques, sauf qu'une inconnue représente une valeur, unique a priori que l'on cherche à déterminer, alors que la valeur d'une variable évolue dans le temps ;
- un nom de variable peut tantôt faire
référence au "contenu" — la valeur — quand il est utilisé dans une expression
(
print(" a =", a)
par exemple), tantôt faire référence au "contenant", quand il est utilisé à gauche d'un signe "=" ; - le symbole "=" utilisé pour représenter l'affectation dans beaucoup
de langages est particulièrement perturbant, puisqu'il amène à écrire
des choses comme
x = x + 1
, ce qui peut apparaître comme un non sens complet pour un élève qui vient de suivre 10 ans de cours de mathématiques.
Même si ce concept est sensé avoir déjà été assimilé au collège, y revenir
peut s'avérer nécessaire, surtout que s'ils n'ont vu la programmation que
via Scratch, ils n'auront pas écrit x = x + 1
mais :
,
ce qui n'a pas grand chose à voir.
Présenter des boîtes nommées et des cartes représentant des chiffres est une façon d'aider, en mode débranché, à intégrer les notions de variable et d'affectation. On peut amener les élèves à écrire des "instructions" un peu lourde au départ, puis à simplifier leur écriture progressivement :
- stocker dans boîte bleue la valeur contenue dans boîte rouge
- stocker dans bleue la valeur contenue dans rouge
- bleue reçoit la valeur contenue dans rouge
- bleue reçoit rouge
- bleue ← rouge
- bleue = rouge
Quand on leur demande ensuite de formaliser "augmenter la
valeur stockée dans la boîte bleue de 1" (stocker dans boîte bleue la
valeur contenue dans boîte bleue + 1) et d'effectuer la même suite de
transformations, il y a de fortes chances qu'ils trouvent toute naturelle
l'écriture bleue = bleue + 1
.
b. Les concept de référence et de tas
On organise la classe en groupes de 5. Et pour chaque groupe, on prépare 4 exemplaires d'un même texte. l'élève A est au départ le seul à posséder le livre. l'élève B joue le rôle de photocopieuse et reçoit les 3 autres exemplaires. Le but est que les les élèves C, D et E puissent avoir au contenu du livre sans déranger A.
On envisage un premier cas de figure : lorsqu'un élève veut disposer du texte, il va à la "photocopieuse" (B) qui, au bout d'une minute (cela prend du temps de photocopier) remet la copie à l'élève.
Au cours du scenario, on envisage ce qu'il se passe en cas de modification du document par B après qu'il a récupéré sa copie, ou par A après que tous les autres élèves ont récupéré leur copie.
À la fin du scenario, on compare les textes de chacun, le "temps" pris par le scenario, et le nombre de feuilles utilisées
On envisage un deuxième cas de figure : le document, numéroté, est posé sur un bureau parmi d'autres documents numérotés. Quand un élève veut disposer du document de A, A lui donne juste le numéro du document
Comme dans le cas précédent, on envisage des modifications du document par l'un ou l'autre des propriétaires.
À la fin du scenario, on refait les mêmes évaluations que dans le premier cas
On termine par un dernier cas : on a plusieurs documents, et chacun les appelle comme il veut.
On peut ensuite illustrer tout cela avec Python Tutor, comprendre ce qui est géré par valeur et ce qui est géré par référence en Python, et finir en faisant faire des schémas mémoires aux élèves.
B. Apprentissage à partir de codes existant
1. Présentation générale
Dans ce type de cours, on va donner aux élèves un ou plusieurs programmes qu'il vont devoir dans un premier temps exécuter et comprendre. Dans un deuxième temps, on demandera d'apporter des modifications de plus en plus complexes aux programmes en question. Enfin, on leur demandera d'écrire de zéro un programme.
Ce format de cours peut par exemple être utilisé pour découvrir une API particulière, ou encore une façon de programmer. Les avantages sont les suivants :
- Cela rompt avec un enseignement très magistral
- Cela permet de mieux assimiler la sémantique d'un programme
- Cela force à lire du code écrit par d'autres
- Cela permet d'amener les élèves à lire du code propre et, ainsi, à acquérir de bonnes pratiques de programmation (cependant, on peut de temps en temps donner un programme particulièrement mal écrit pour faire prendre conscience du problème)
2. Exemples d'utilisation
a. Découverte de la bibliothèque matplotlib
On peut commencer à donner quelques exemples de tracés faits via cette bibliothèque. Ensuite, Il devient possible de faire modifier certains programmes pour modifier les tracés (changer les couleurs, changer les axes, changer la fonction tracée, etc.) Enfin, on peut donner une figure en expliquant ce qu'elle représente, puis demander d'écrire le programme permettant d'obtenir le résultat en question.
b. Découverte du style fonctionnel pour les traitements de listes
L'idée est d'apprendre à passer du style impératif classique (avec 2 instanciations différentes dans l'exemple qui suit) :
# déterminer le 5ème nombre pair d'une liste from random import randint liste = [] for i in range(0,100): valeur = randint(0,50) liste.append(valeur) print(liste) def reponse(liste): nbPair = 0; for valeur in liste: if valeur % 2 == 0: nbPair = nbPair + 1 if nbPair == 5: return valeur raise NonTrouve def reponse2(liste): listePairs = [] for valeur in liste: if valeur % 2 == 0: listePairs.append(valeur) try: return listePairs[4] except: raise NonTrouve print("A : ",reponse(liste)) print("B : ",reponse2(liste))
à un style plus fonctionnel :
# déterminer le 5ème nombre pair d'une liste from random import randint liste = [randint(0,50) for i in range(0,100)] def reponse3(liste): try: return list(filter(lambda x: x % 2 == 0, liste))[4] except: raise NonTrouve print(liste) print("C : ",reponse3(liste))
Cela peut permettre d'introduire progressivement ou de mettre en pratique les notions suivantes :
- passage de fonction en paramètre ;
- λ-expression,
- traitement de liste avec
filter()
etmap()
ou avec une des autres fonctions ou classes suivantes : - all
- any
- enumerate
- min
- max
- reversed
- sorted
- sum
- zip
- list
- set
- tuple
C. Travail en groupe selon la méthode du puzzle
1. Présentation générale
On rappelle que ce type de cours se déroule en 2 temps :
- Premier période : des groupes d'élèves sont constitués ; chaque groupe acquiert une expertise sur un domaine (D1, D2, ... Dn)
- Deuxième période : on recrée des groupes constitués, cette fois-ci, d'un "expert" de chaque domaine. Les nouveaux groupes vont devoir réaliser une tâche faisant appel aux différents domaines étudiés dans la première période. Chacun va donc de voir à tour de rôle apprendre aux autres et apprende des autres.
Ce type de cours est particulièrement adapté à des domaines vastess constitués de multiples parties pouvant s'apprendre indépendamment les unes des autres.
2. Exemple d'utilisation : développement d'interfaces graphiques en Python
Entre le fait qu'il ne s'agit pas d'un sujet fondamental du cours, et la multitudes de choses différentes qui sont à connaître pour développer une interface graphique, ce sujet convient très bien ce type de travail. On peut alors découper le sujet en l'ensemble des domaines d'expertise suivant :
- Disposer des zones de texte dans une fenêtre ;
- Créer les principaux types de composants ;
- Réagir à un clic sur un bouton et récupérer une valeur saisie dans un champ ;
- Définir des menus ;
- Dessiner dans un 'canvas'.
Le travail de restitution peut alors être de réaliser une mini application graphique, qui peut par exemple constituer en la saisie des coordonnées de 2 points, puis au dessin de ces 2 points dans un repère orthonormé via un bouton ou un item de menu.