Réflexions sur le programme

Préambule

Pour chaque partie ou sous-partie, je précise dans quel bloc du DIU vous êtes susceptibles de retrouver les informations nécessaires.

I. Aperçu des différentes thèmes

A. Histoire de l'informatique (bloc 1)

Vous pouvez présenter l'introduction des différents paradigmes et des langages les mettant en oeuvre. Les travaux sur les bases de données peuvent aussi être situés dans le temps. Les travaux de Turing peuvent également être abordés dans la partie sur la complexité. Le concept de récursivité peut égament être rapprochée de la démonstration par récurrence et de l'introduction de ce principe par Pascal dans Traité du triangle arithmétique en 1654. Enfin, la partie sur le routage peut être l'occasion de parler de l'histoire du protocole IP et d'Internet. Il est aussi possible de faire un petit historique sur les systèmes de chiffrement (pourquoi et comment).

Plus d'éléments sont donnés dans la partie III. de cette page.

B. Structures de données (blocs 4 et 5)

Il s'agit d'un gros morceau du programme. Je pense qu'il est raisonnable de le découper en 2 sous-parties : les concepts objets d'une part, et les types abstraits de données d'autre part. À noter d'ailleurs une petite erreur dans le programme : quand il est précisé "les listes n'existent pas de façon native en Python", c'est inexact : les listes existent (au sens type abstrait de données) avec une implantation sous la forme d'un tableau dynamique. Ce sont les listes chaînées qui n'existent pas.

1. Vocabulaire de la programmation orientée objet (bloc 4)

Comme l'indique le programme, il faut se limiter au plus simple, sans introduire l'héritage. Mais il est important de parler de l'encapsulation et de sa mise en oeuvre qui doit être systématique.

2. Structures de données (blocs 4 et 5)

Il est à mon avis judicieux de placer cette partie après la précédente, afin d'utiliser des classes pour introduire les différentes structures de données (c.f. les classes Pile et File dans le cours). Il peut être judicieux, pour chacune des méthodes, de faire réfléchir aux préconditions et aux post-conditions avant de les faire écrire (par exemple, sur un pile, la précondition de pop() est que la pile n'est pas vide).

Manipuler les listes chaînées est un très bon exercice algorithmique, mais il faut voir s'il y a suffisamment de temps pour l'aborder.

Pour les graphes, après une présentation des différentes représentations possibles, il vaut mieux aller à fond sur la mise en oeuvre des différents algorithmes sur une représentation plutôt que d'essayer de vouloir tout faire sur toutes les représentations.

C. Bases de données (bloc 4)

Là encore, il s'agit d'un gros morceau du programme. Partir d'un exemple et montrer les limites de la représentation dans une table est à mon avis une bonne approche. Ensuite, on peut revenir sur un cas concret et le modéliser via un diagramme de classes, pour parler ensuite de la clé de chaque table. Ensuite, on peut aborder la transformation diagramme de classes → tables pour introduire les notions de clé étrangère et de contrainte de référence (dans un premier temps, ne présenter que des associations 1-N). Il devient alors possible d'introduire la notion de SGBD, de requête, et les bases de SQL : d'abord requêtes mono-tables puis requêtes multi-tables. Enfin, on peut passer aux associations N-M.

D. Architectures matérielles, systèmes d'exploitation, réseaux (bloc 3)

Je laisse mes collègues rouennais vous parler plus en détail de cette partie. Noter cependant que 2 liens sont faisables avec d'autres parties du cours :

E. Langages de programmation (blocs 1, 2, 4, 5)

Il s'agit d'une partie un peu "fourre-tout" de choses indispensables.

Calculabilité, décidabilité (blocs 1 et 5)
Il ne faut à mon avis pas passer beaucoup de temps sur cette partie, car cela reste peu évident à comprendre.
Récursivité (blocs 1, 2, 5)
La récursivité nécessite par contre beaucoup de temps, non pas que ce soit long à expliquer, mais c'est surtout difficile à comprendre. Il faut notamment bien insister sur la notion de "cas de base" ou "cas d'arrêt", et montrer qu'un programme réursif peut facilement saturer la mémoire (intuitivement, en expliquant qu'il faut mémoriser les variables locales pour chaque appel de la fonction, et que appel après appel, la place nécessaire augmente). Il s'agit d'une notion à aborder avant les arbres, les algorithmes sur les arbres s'écrivant naturellement de façon récursive.
Modularité (bloc 1)
La modularité est un point essentiel d'un développement propre, mais je ne pense pas qu'il faille y passer beaucoup de temps ; ce n'est pas très compliqué, et puis... écrire plusieurs modules se justifiera peu pour la plupart des programmes que les élèves auront à écrire. Ceci dit, il est toujours possible de montrer que l'on peut créer un module typesabstraits contenant les classes Pile et File, et réutiliser ensuite ce module dans différentes applications.
Paradigmes de programmation (blocs 1 et 4)
Voilà une partie sur laquelle on peut passer de 0h à 300h ! Le minimum est je pense de montrer que Python est essentiellement impératif, mais qu'il présente également des aspects fonctionnels. Pour le reste, faites vos propres choix parmi les différents paradigmes.
Mise au point de programmes (bloc 2)
Là encore c'est une partie essentielle, car dans toute tâche de développement, on est confronté à des bugs. Vous pouvez au moins en profiter pour introduire quelques principes introduits pour la plupart dans le bloc 2 : check-list de vérifications, jeux de test, exécution pas-à-pas, assertions.

F. Algorithmique (blocs 2 et 5)

Les algorithmes sur les arbres et les graphes sont à mon avis à traiter en même temps que la définition des structures en question. Pour les autres algorithmes, ils peuvent être traités séparément, répartis dans l'année.

II. Suggestion de répartition dans l'année

Voici une suggestion de répartition des différentes partie du programme sur l'année. Bien sûr, ce n'est qu'une suggestion. Notamment, j'ai regroupé tout le thème 3 sur une même période ; cela peut ne pas convenir à tout le monde.

suggestion de planification pour le programme de Terminale

III. Éléments d'histoire de l'informatique mentionnables par thème

  1. Structures de données
    • Structure de données : interface et implantation
    • Vocabulaire de la programmation objet
      • 1962 : langage SIMULA, premier langage à base de classes
      • 1972 : langage Smalltalk
      • 1983 : langage C++
      • 1995 : langage Java
      • 1991 : OMT
      • 1995 : UML
    • Listes, piles, files et dictonnaires
    • Arbres
    • Graphes
  2. Bases de données
    • Modèle relationnel
      • 1970 : Modèle relationnel et algèbre relationnelle (Codd)
      • 1974 : création du langage SQL
      • 1979 : création du SGBD Oracle
      • 1995 : première version de MySQL
    • Base de données relationnelle
    • SGBD
      • 1979 : création du SGBD Oracle
      • 1995 : première version de MySQL
    • Langage SQL
      • 1974 : création du langage SQL
  3. Architectures matérielles, Systèmes d'exploitation et réseaux
    • Composants intégrés d'un système sur puce
      • 1958 : premier circuit intégré
      • 1975 : microprocesseur motorola 6502
      • 1978 : microprocesseur intel 8086
      • 1993 : premier microprocesseur pentium
    • Gestion des processus par un système d'exploitation
      • 1958 : premier système multi-tâche
      • 1969 : début d'Unix
      • 1984 : première version de MacOS
      • 1985 : première version de Windows (surcouche à MS/DOS)
      • 2001 : MacOS devient multi-tâche préemptif
      • 1995 : Windows devient multi-tâche préemptif
      • 1993 : Windows NT devient multi-tâche prémptif
    • Protocole de routage
      • 1973 : TCP/IP
    • Sécurisation des communications
      • ≈ -50 : code Césear
      • 1942 : Décryptage d'Enigma par Alan Turing
      • 1977 : Cryptographie à clé publique et RSA
  4. Langages et programmation
    • Notion de programme en tant que donnée, calculabilité, décidabilité
      • 1931 : Théorème d'incomplétude de Gödel
      • 1936 : Indécidabilité algorithmique par Turing
    • Récursivité
      • 1654 : première démonstration par récurrence par Blaise Pascal
    • Modularité
    • Paradigmes de programmation
      • IVè siècle av. J.C. : algorithme d'Euclide
      • 1925 : Création du λ-calcul par Church
      • 1958 : Création de LISP
      • 1972 : Création de Prolog
    • Mise au point des programme, Gestion de bugs
      • Il est possible de mentionner quelques-un des bugs marquants de l'histoire de l'informatique (voir par exemple les transparents 2 à 5 de ce cours)
  5. Algorithmique
    • Algorithmes sur les arbres binaires et arbres binaires de recherche
    • Algorithmes sur les graphes
    • Méthode "diviser pour régner"
    • Programmation dynamique
    • Recherche textuelle