Adloun

Conduire un projet

Cours complet · NSI (première), chapitre 11 · première, spécialité numérique et sciences informatiques

Travailler ce chapitre sur Adloun Exercices corrigés de ce chapitre

« Une part de l'horaire de l'enseignement d'au moins un quart du total en classe de première doit être réservée à la conception et à l'élaboration de projets conduits par des groupes de deux à quatre élèves. » — Programme de NSI

Un quart de l'année. Ce chapitre n'est donc pas un appendice : il décrit ce à quoi une séance sur quatre est consacrée. Le programme en donne la raison — « un enseignement d'informatique ne saurait se réduire à une présentation de concepts ou de méthodes sans permettre aux élèves de se les approprier en développant des projets applicatifs ».

Les dix chapitres précédents ont fourni les outils. Celui-ci dit comment s'en servir sans que le groupe s'effondre en cours de route.

11.1 Choisir un sujet

ImportantLe sujet vous appartient

Le programme est explicite : « dans la mesure du possible, il convient de laisser le choix du thème du projet aux élèves eux-mêmes ». Un sujet choisi est mené ; un sujet imposé est subi.

Les pistes que cite le programme, à titre d'exemples :

AttentionLa cause d'échec numéro un : trop ambitieux

Le programme la nomme sans détour : « les professeurs veillent à ce que les projets restent d'une ambition raisonnable afin de leur permettre d'aboutir ».

Un projet trop grand ne produit pas un demi-résultat : il ne produit rien. Trois quarts d'un jeu ne se jouent pas ; les trois quarts d'un site ne s'ouvrent pas. Mieux vaut un morpion qui fonctionne, se teste et se présente, qu'un jeu de stratégie dont il ne restera que des morceaux.

Méthode : Le test du noyau minimal

Avant de vous engager, écrivez en une phrase ce que fera votre programme dans sa version la plus dépouillée — celle qui, seule, mérite encore d'être montrée. Si cette phrase demande un « et » de plus, c'est déjà trop.

Puis dressez à côté la liste des extensions souhaitables. Elles viendront après, si le temps le permet. Un projet se construit du noyau vers l'extérieur, jamais l'inverse.

Figure : Le noyau minimal, et ce qui viendra après s'il reste du temps. C'est la parade à la cause

d'échec que le programme nomme lui-même : l'ambition déraisonnable.</div>

11.2 Spécifier avant de coder

Tout le chapitre 3 s'applique, à l'échelle du groupe cette fois. Le document de départ tient en une page et répond à quatre questions.

QuestionCe qu'on écrit
Que fait le programme ?une phrase, du point de vue de l'utilisateur
Quelles données entrent, quelles données sortent ?formats précis
Comment sait-on qu'il marche ?les cas de test, écrits avant le code
Qu'est-ce qui n'en fait pas partie ?la liste de ce qu'on renonce à faire
Important

La quatrième ligne est celle qu'on oublie, et c'est la plus utile. Écrire noir sur blanc « le programme ne gère pas plusieurs joueurs en réseau » évite trois semaines de discussions et un abandon en février.

11.3 Découper, répartir, assembler

Un projet à plusieurs ne se découpe pas au hasard : ce sont les interfaces, fixées d'avance, qui permettent à chacun d'avancer sans attendre les autres.

Figure : Découper par interfaces. Chacun connaît le prototype des fonctions des autres — nom, paramètres, valeur renvoyée — et n'a pas besoin de lire leur code.

Méthode : Découper en modules qui se testent seuls

Le découpage réussi n'est pas celui qui répartit équitablement le travail : c'est celui où chaque morceau peut être écrit et testé sans attendre les autres. Pour un jeu sur grille, par exemple :

ModuleInterfaceSe teste seul ?
grille`creer`, `lire`, `ecrire`oui
règles`coup_legal`, `appliquer`, `gagnant`oui
affichage`afficher(grille)`oui
partieenchaîne les troisen dernier

Chaque module est défini par ses prototypes — noms, arguments, résultats — fixés ensemble au début. C'est ce contrat qui permet à deux personnes de travailler en parallèle : celle qui écrit l'affichage n'a pas besoin que les règles soient finies, elle a besoin de savoir ce que grille lui donnera.

AttentionLe piège de la répartition par « chacun sa partie »

Répartir sans fixer les interfaces d'abord conduit invariablement au même désastre : trois morceaux qui fonctionnent séparément et refusent de s'emboîter, découvert la veille de la présentation. Les prototypes se décident avant la première ligne de code, et se notent.

11.4 Les points d'étape

Important

Le programme les impose : « la gestion d'un projet inclut des points d'étape pour faire un bilan avec le professeur, valider des éléments, contrôler l'avancement du projet ou adapter ses objectifs, voire le redéfinir partiellement, afin de maintenir la motivation des élèves ».

Notez ce que dit cette phrase : un point d'étape peut conclure qu'il faut réduire le projet. Ce n'est pas un échec, c'est le mécanisme normal. Le seul vrai échec est de s'en apercevoir trop tard.

ÉtapeCe qui doit existerDécision possible
1le sujet, le noyau minimal en une phraserecentrer
2les prototypes des modules, les cas de testredécouper
3un module qui tourne et passe ses testsréduire la suite
4le noyau minimal completajouter des extensions
5tests, corrections, présentationgeler le code
Figure : Les cinq points d'étape. Le programme les impose, et prévoit qu'ils puissent conclure

qu'il faut « adapter ses objectifs, voire le redéfinir partiellement ».</div>

Méthode : Le journal de bord

Tenir, à plusieurs, un fichier où l'on note à chaque séance : ce qui a été fait, ce qui bloque, ce qui a été décidé et pourquoi. Dix lignes par séance suffisent.

Ce document sert trois fois : à retrouver pourquoi telle décision a été prise, à rédiger la présentation sans rien reconstituer de mémoire, et à établir la part réelle de chacun.

11.5 Tester, jusqu'au bout

Le chapitre 3 l'a établi : « le succès d'un jeu de tests ne garantit pas la correction d'un programme ». Cela ne dispense pas de tester — cela oblige à tester bien.


# tests_grille.py — écrit AVANT grille.py, et exécuté à chaque séance
from grille import creer, lire, ecrire

def test_creation():
    g = creer(3, 3)
    assert len(g) == 3 and len(g[0]) == 3
    assert all(lire(g, i, j) == 0 for i in range(3) for j in range(3))

def test_ecriture_independante():
    """Le piège du chapitre 4 : deux lignes ne doivent pas être la même."""
    g = creer(2, 2)
    ecrire(g, 0, 0, 5)
    assert lire(g, 1, 0) == 0, "les lignes partagent la meme memoire !"

def test_hors_grille():
    g = creer(3, 3)
    refuse = False
    try:
        ecrire(g, 5, 0, 1)
    except AssertionError:
        refuse = True
    # Le verdict est HORS du try : un assert placé dedans serait avale
    # par le except, et le test passerait quoi qu'il arrive.
    assert refuse, "aurait du refuser une case hors grille"

for test in (test_creation, test_ecriture_independante, test_hors_grille):
    test()
    print("ok", test.__name__)

Méthode : Trois habitudes qui sauvent un projet

  • Rejouer tous les tests à chaque séance, pas seulement ceux du module qu'on vient de toucher. Une correction en casse souvent une autre ailleurs.
  • Garder une version qui marche. Avant toute modification importante, conserver une copie datée. Une version dégradée mais fonctionnelle vaut infiniment mieux qu'une version améliorée qui ne démarre plus la veille de la présentation.
  • Écrire le test avant la correction. Devant un défaut, produire d'abord le cas qui le déclenche. On sait alors qu'il est réellement corrigé — et qu'il ne reviendra pas.

11.6 Présenter

Le programme range la présentation parmi les compétences transversales : « présenter un problème ou sa solution, développer une argumentation dans le cadre d'un débat ».

MomentCe qu'on montre
Le problèmece qu'on a voulu faire, et pourquoi ce sujet
La démonstrationle programme qui tourne, sur un cas préparé
Les choixdeux ou trois décisions techniques, et leurs raisons
Les limitesce qui ne marche pas, et ce qu'on sait en dire
Le partage du travailqui a fait quoi, honnêtement
ImportantDire les limites est un point fort, pas un aveu

Un groupe qui annonce « notre détection de fin de partie échoue sur les diagonales, nous savons pourquoi et voici ce qu'il aurait fallu faire » montre qu'il a compris son programme. Un groupe qui présente une démonstration soigneusement choisie pour éviter le défaut montre l'inverse.

C'est la même exigence que la docstring honnête du chapitre 5 : ne promettez pas plus que ce que vous garantissez.

11.7 Une grille pour s'auto-évaluer

CritèreCe qu'on vérifie
Aboutissementle noyau minimal fonctionne de bout en bout
Spécificationchaque fonction a son prototype, ses préconditions, sa docstring
Testsun jeu de tests existe, couvre les cas limites, et passe
Structurele découpage en modules est net ; aucun ne dépend des détails d'un autre
Correctionles boucles non bornées ont un variant identifié
Travail collectifle journal de bord montre une contribution réelle de chacun
Honnêtetéles limites sont connues, mesurées et annoncées
iRemarque

Cette grille n'invente rien : chaque ligne renvoie à un chapitre. Spécification et tests au chapitre 3, structure aux chapitres 4 et 5, variants au chapitre 7, honnêteté partout. Un projet réussi n'est pas un exercice de plus — c'est la mise en œuvre simultanée de tout ce qui précède.

Repère historique : Pourquoi les projets informatiques échouent

La question n'est pas scolaire. En 1968, une conférence de l'OTAN à Garmisch réunit les informaticiens autour d'un constat brutal : les grands programmes livrent en retard, coûtent plus que prévu et fonctionnent mal. C'est là qu'est forgée l'expression génie logiciel, pour désigner ce qui manquait alors — une discipline de conception, et pas seulement l'art de coder.

Les causes relevées à l'époque sont exactement celles qui menacent un projet de première : spécification floue, ambition mal calibrée, modules qui ne s'emboîtent pas, tests repoussés à la fin. Un demi-siècle plus tard, les remèdes n'ont pas changé — écrire ce qu'on va faire, découper, tester tôt, mesurer l'avancement.

Continuer sur Adloun : animation, QCM, fiches, exercices