.. _prog-e3-intro: ************ Introduction ************ Pendant longtemps, programmer signifiait essentiellement connaitre la syntaxe d'un langage de programmation, mémoriser les bibliothèques, éviter les erreurs de compilation et d'exécution, et être capable d'écrire manuellement des algorithmes standards. C'était la compétence centrale de l'informatique, et c'est ce qui était enseigné dans les cours d'introduction à la programmation. .. important:: Avec les IA génératives, une très grande partie de ce travail devient automatisable. Une IA peut aujourd'hui produire rapidement du code correct en Python, C, JavaScript, SQL, etc., à partir d'une description fonctionnelle. L'abstraction a franchi une nouvelle étape : on peut désormais se concentrer sur la **conception** et le **test** du logiciel, plutôt que sur sa **programmation**. Les tâches déléguées à l'IA sont celles qui sont répétitives, fastidieuses, et qui demandent une connaissance approfondie de la syntaxe et des bibliothèques. La compétence centrale devient la **conception** du logiciel, c'est-à-dire la capacité à comprendre le problème à résoudre, à modéliser les données et les comportements, et à spécifier précisément ce que le programme doit faire. Des connaissances élargies en informatique sont maintenant nécessaires : bases de données, protocoles de communication, structures de données, algorithmes, complexité, sécurité, etc. L'IA doit être utilisée comme un outil d'assistance à l'apprentissage. .. figure:: images/prog-e3-01-intro-fig-01.png :width: 50 % :align: center L'évolution de l'abstraction en programmation .. figure:: images/prog-e3-01-intro-fig-02.png :width: 50 % :align: center Cela déplace la valeur vers d'autres niveaux d'abstraction. Aujourd'hui, savoir écrire du code reste une compétence utile, mais elle peut être confiée à l'IA et s'insère dans un workflow plus large de conception et d'architecture logicielle : * 🚹 comprendre les concepts fondamentaux, * 🚹 modéliser les problèmes, * 🚹 spécifier précisément les comportements, * 💻implémenter dans un langage de haut niveau, * 🚹 tester et vérifier les programmes. .. important:: Si on peut oser une analogie, lire une langue étrangère est plus facile que l'écrire, et la compréhension d'une langue est plus facile que sa production. De même, lire du code est plus facile que de l'écrire et comprendre un langage de programmation est plus facile que de le produire. .. important:: Maitriser la syntaxe d'un langage de programmation reste cependant une compétence fondamentale, notamment pour : * lire du code existant, * comprendre les performances, * déboguer, * détecter les hallucinations de l'IA, * connaître les idiomes, * comprendre les modèles d'exécution, etc. .. quiz:: qIntro :title: Impact des IA génératives sur la programmation - Les IA génératives permettent de :quiz:`{"type":"FB","answer":"générer","flags":"fuzzy","size":15}` du code automatiquement à partir d'une description fonctionnelle. - La compétence centrale en informatique passe de la programmation à la :quiz:`{"type":"FB","answer":"conception","flags":"sequence,fuzzy","size":10}` et au :quiz:`{"type":"FB","answer":"test","flags":"sequence,fuzzy","size":10}`. - :quiz:`{"type":"TF","answer":"T"}` Lire du code est plus facile que de l'écrire. - :quiz:`{"type":"TF","answer":"T"}` Maitriser la syntaxe d'un langage reste fondamental même avec les IA génératives. Avant l'IA ========== .. figure:: images/prog-e3-01-intro-fig-03.png :width: 50 % :align: center Avant l'IA Avant l'IA, la programmation était la compétence centrale, car elle était nécessaire pour transformer une idée en un programme exécutable. La maîtrise d'un langage de programmation spécifique était essentielle pour écrire du code correct et efficace. .. quiz:: qAvantIA :title: Programmation avant les IA génératives - Avant l'IA, la programmation était :quiz:`{"type":"FB","answer":"centrale","flags":"fuzzy","size":8}` pour transformer une idée en programme. - :quiz:`{"type":"TF","answer":"T"}` La maîtrise d'un langage était essentielle avant l'émergence des IA génératives. - Avant l'IA, :quiz:`{"type":"SC","values":"l'IA générait du code,la programmation était la compétence centrale,les tests étaient optionnels","answer":"la programmation était la compétence centrale"}` pour créer des programmes. Aujourd'hui =========== .. figure:: images/prog-e3-01-intro-fig-04.png :width: 50 % :align: center Aujourd'hui Aujourd'hui, avec les IA génératives, la programmation est devenue plus accessible et automatisée. La compétence centrale est désormais la **conception et le test** du programme, qui nécessite une compréhension approfondie du problème à résoudre et une capacité à structurer une solution efficace. La maîtrise d'un langage de programmation spécifique n'est plus aussi cruciale, car les outils de développement modernes permettent de générer du code automatiquement à partir de la conception du programme. .. quiz:: qAujourdhui :title: Programmation avec les IA génératives - :quiz:`{"type":"TF","answer":"T"}` Aujourd'hui, les IA génératives permettent de générer du code automatiquement. - La compétence centrale est désormais la :quiz:`{"type":"FB","answer":"conception","flags":"sequence,fuzzy","size":10}` et le :quiz:`{"type":"FB","answer":"test","flags":"sequence,fuzzy","size":10}` du programme. - La maîtrise d'un langage spécifique est :quiz:`{"type":"TF","answer":"F"}` plus cruciale qu'avant. - Les outils modernes permettent de générer du code à partir de la :quiz:`{"type":"FB","answer":"conception","flags":"fuzzy","size":11}` du programme. La spécification ================ La définition des spécifications d'un programme est une étape fondamentale, souvent négligée par manque de temps, l'apprentissage de la syntaxe d'un langage étant fortement chronophage. Cela consiste en savoir exprimer précisément : * les entrées et les sorties du programme, * ce que le programme doit faire, * ce qu'il ne doit pas faire, * comment gérer les cas limites, etc. C'est exactement le type d'information que les IA consomment efficacement. .. tip:: On passe progressivement de ``écrire du code`` à ``écrire des spécifications formelles``, qui sont ensuite traduites en code par l'IA. .. quiz:: qSpecification :title: Spécification des programmes - La spécification doit exprimer précisément les :quiz:`{"type":"FB","answer":"entrées","flags":"sequence,fuzzy","size":10}` et les :quiz:`{"type":"FB","answer":"sorties","flags":"sequence,fuzzy","size":10}` du programme. - La spécification est une étape souvent :quiz:`{"type":"FB","answer":"négligée","flags":"fuzzy","size":8}` par manque de temps. - On passe de l'écriture du code à l'écriture de :quiz:`{"type":"FB","answer":"spécifications formelles","flags":"sequence,fuzzy","size":22}`. - :quiz:`{"type":"TF","answer":"T"}` La spécification permet à l'IA de générer du code automatiquement. La validation ============= L'IA générative assurant la transition entre la spécification et l'implémentation, la question de la validation devient centrale. Comment s'assurer que le programme généré correspond bien à l'intention exprimée dans les spécifications ? Comment s'assurer que le programme est correct, robuste, et gère correctement les cas limites ? La validation consiste à vérifier que le programme correspond bien aux spécifications. Il existe 3 grandes classes de méthodes pour cela: * les tests unitaires, * les tests de propriété, * les preuves formelles. Les tests unitaires sont des cas d'entrée spécifiques pour lesquels on connaît la sortie attendue. Ils permettent de vérifier que le programme fonctionne correctement pour ces cas, mais ne garantissent pas la correction du programme dans tous les cas. Les tests de propriété, quant à eux, vérifient que certaines propriétés sont toujours vraies pour toutes les entrées possibles. Par exemple, on peut vérifier que le score d'un joueur ne devient jamais négatif. Cela permet de détecter des erreurs plus générales que les tests unitaires, mais ne garantit pas non plus la correction du programme. Les preuves formelles sont des démonstrations mathématiques qui montrent que le programme est correct pour toutes les entrées possibles. Elles sont très rigoureuses, mais aussi très coûteuses en temps et en expertise. Dans le cadre de ce cours on se contentera de tests unitaires et de tests de propriété. .. quiz:: qValidation :title: Validation et tests - Il existe :quiz:`{"type":"FB","answer":"3","flags":"fuzzy","size":1}` grandes classes de méthodes de validation. - Les tests :quiz:`{"type":"FB","answer":"unitaires","flags":"fuzzy","size":9}` vérifient des cas d'entrée spécifiques. - Les tests de propriété vérifient que certaines propriétés sont :quiz:`{"type":"FB","answer":"toujours vraies","flags":"sequence,fuzzy","size":15}` pour toutes les entrées. - :quiz:`{"type":"TF","answer":"T"}` Les preuves formelles garantissent la correction du programme pour tous les cas. Le choix du langage =================== Le choix du langage de programmation est une question importante, mais qui devient secondaire avec les IA génératives. En effet, ces outils sont capables de générer du code dans de nombreux langages à partir d'une même spécification. Dans le cadre de l'apprentissage de l'informatique, il est judicieux de connaitre : - un langage de haut niveau, qui permet de mieux se concentrer sur la logique du programme ; - et un langage de bas niveau, qui permet de mieux comprendre les détails de l'implémentation. Dans le cadre de ce cours, le langage de haut niveau choisi est Python, pour sa simplicité et sa lisibilité, sa bibliothèque standard riche, et sa large adoption dans l'industrie et la recherche. C'est devenu de fait le langage de l'intelligence artificielle. Le langage de bas niveau choisi est C, pour sa proximité avec le matériel, sa performance, et son influence sur de nombreux autres langages. En particulier, les fonctions Python sont implémentées en C pour des raisons de performance. .. important:: Pour la conception de logiciels, le choix du langage peut être dicté par les contraintes du projet : les performances requises, la plateforme cible, les compétences de l'équipe de développement, etc. .. quiz:: qLanguageChoice :title: Choix du langage de programmation - Le choix du langage devient :quiz:`{"type":"FB","answer":"secondaire","flags":"fuzzy","size":9}` avec les IA génératives. - Pour apprendre l'informatique, il est judicieux de connaître un langage :quiz:`{"type":"FB","answer":" haut niveau","flags":"sequence,fuzzy","size":10}` et un langage :quiz:`{"type":"FB","answer":" bas niveau","flags":"sequence,fuzzy","size":10}`. - Le langage choisi pour la programmation de haut niveau est :quiz:`{"type":"FB","answer":"Python","flags":"fuzzy","size":6}`. - Le langage choisi pour la programmation de bas niveau est :quiz:`{"type":"FB","answer":"C","flags":"fuzzy","size":1}`. - Python est devenu le langage de facto de :quiz:`{"type":"FB","answer":"l'intelligence artificielle","flags":"sequence,fuzzy","size":25}`. Exemple de spécification et de modélisation =========================================== Les concepts ci dessus peuvent être illustrés par un exemple concret : la conception d'un programme pour gérer une partie d'awalé entre deux joueurs. La spécification du problème ---------------------------- Pour le jeu d'awalé, on peut spécifier le problème en répondant aux questions suivantes. * Quel est le besoin ? Il s'agit de permettre à deux joueurs de jouer une partie d'awalé, en respectant les règles du jeu, et en affichant le plateau dans un terminal. * Qui utilise le programme ? Le programme est utilisé par des joueurs humains ainsi que par des observateurs qui veulent suivre la partie. * Quelles sont les entrées ? Les entrées sont les paramètres de la partie (la taille du plateau, le nombre de graines initiales), les coups joués par les joueurs (saisis dans le terminal), etc. * Quelles sont les sorties ? Les sorties sont l'affichage du plateau de jeu dans le terminal après chaque coup, le résultat final de la partie (qui a gagné, ou s'il y a égalité), etc. * Quelles sont les contraintes ? Le programme doit respecter les règles de l'awalé, être facile à utiliser, et être suffisamment rapide pour ne pas dégrader l'expérience de jeu. Ceci peut se traduire en préconditions et postconditions pour les fonctions qui implémentent ces règles. * un joueur peut déplacer les graines d'une case vers les cases suivantes dans le sens inverse des aiguilles d'une montre, * un joueur capture les graines de l'adversaire si la dernière graine déposée tombe dans une case contenant 2 ou 3 graines, * la partie se termine lorsque l'un des joueurs n'a plus de graines ou lorsque les deux joueurs ont capturé au moins 25 graines, * le joueur qui a capturé le plus de graines gagne la partie. Par exemple, la fonction qui gère le déplacement des graines peut avoir comme précondition que le coup joué est valide (c'est-à-dire que la case choisie contient au moins une graine), et comme postcondition que les graines ont été déplacées selon les règles du jeu. * Quels cas particuliers doivent être gérés ? Il faut gérer les cas où un joueur tente de jouer un coup invalide (par exemple, une case vide), les cas où la partie se termine prématurément (par exemple, si un joueur ne peut plus jouer), et les cas où il y a égalité. .. quiz:: qAwaleMod :title: Spécification du jeu d'awalé - Le plateau d'awalé peut être modélisé comme une :quiz:`{"type":"FB","answer":"liste","flags":"sequence,fuzzy","size":20}` de 12 cases. - Un joueur capture les graines si la dernière graine tombe dans une case avec :quiz:`{"type":"FB","answer":"2 ou 3","flags":"sequence,fuzzy","size":7}` graines. - La partie se termine lorsqu'un joueur :quiz:`{"type":"FB","answer":"n'a plus de graines","flags":"sequence,fuzzy","size":18}`. - Les entrées du programme incluent les :quiz:`{"type":"FB","answer":"paramètres","flags":"sequence,fuzzy","size":10}` de la partie et les :quiz:`{"type":"FB","answer":"coups joués","flags":"sequence,fuzzy","size":10}`. Modélisation du problème ------------------------ Pour résoudre un problème, il faut d'abord le modéliser, c'est-à-dire trouver une représentation abstraite qui capture les éléments essentiels du problème. Pour le jeu d'awalé, on peut modéliser : * le plateau de jeu comme une liste de 12 cases, chacune contenant un certain nombre de graines, * les règles du jeu comme des fonctions qui prennent en entrée l'état du plateau et le coup joué par un joueur, et qui produisent en sortie le nouvel état du plateau, * les tours de jeu comme une boucle qui alterne entre les deux joueurs, * les conditions de victoire comme des fonctions qui vérifient si un joueur a gagné ou si la partie est terminée. .. quiz:: qModelization :title: Modélisation du problème - La modélisation consiste à trouver une représentation :quiz:`{"type":"FB","answer":"abstraite","flags":"sequence,fuzzy","size":10}` qui capture les éléments essentiels. - Les règles du jeu peuvent être représentées comme des :quiz:`{"type":"FB","answer":"fonctions","flags":"fuzzy","size":9}` qui transforment l'état du jeu. - Les tours de jeu peuvent être implémentés avec une :quiz:`{"type":"FB","answer":"boucle","flags":"fuzzy","size":6}` qui alterne entre les joueurs. - Les conditions de victoire sont vérifiées par des :quiz:`{"type":"FB","answer":"fonctions","flags":"fuzzy","size":9}` qui examinent l'état du jeu.