% INF3135 — Construction et maintenance de logiciels % UQAM — Département d'informatique % Plan de cours — Été 2023 * Horaires, locaux et enseignants: Responsable(s) du cours ======================= Coordination ------------ Beaudry, Éric PK-4635 Enseignement ------------- Dogny, Gnagnely Serge PK-4115 Groupes: 020 Description =========== Objectifs --------- Initier les étudiants à la programmation à l'aide d'un langage impératif et procédural. Familiariser les étudiants à la construction professionnelle de logiciels et à leur maintenance. Sommaire du contenu ------------------- - Notions de base de la programmation procédurale et impérative en langage C sous environnement Unix/Linux (définition et déclaration, portée et durée de vie, fichier d'interface, structures de contrôle, unités de programme et passage des paramètres, macros, compilation conditionnelle). - Décomposition en modules et caractéristiques facilitant les modifications (cohésion et couplage, encapsulation et dissimulation de l'information, décomposition fonctionnelle). - Style de programmation (conventions, documentation interne, gabarits). - Débogage de programmes (erreurs typiques, traces, outils). - Assertions et conception par contrats. - Tests (unitaires, intégration, d'acceptation, boîte noire vs. boîte blanche, mesures de couverture, outils d'exécution automatique des tests). - Évaluation et amélioration des performances (profils d'exécution, améliorations asymptotiques vs. optimisations, outils). - Techniques et outils de base pour la gestion de la configuration. Système de contrôle de version. Modalité d'enseignement ----------------------- Ce cours comporte une séance obligatoire de laboratoire (2 heures). Préalables académiques ---------------------- - INF1120 - Programmation I (pour le certificat en réseaux et systèmes de télécommunications et le baccalauréat en systèmes informatiques et électroniques) - INF2050 - Outils et pratiques de développement logiciel Objectifs détaillés =================== Ce cours vise à introduire les étudiants à la construction professionnelle de logiciels. Il vise aussi à familiariser les étudiants avec la programmation procédurale et impérative. À la fin du cours, l'étudiant devrait être capable de : - développer et modifier des composants logiciels écrits dans un langage impératif et procédural; - bien maîtriser le langage C et le compilateur du C sous UNIX/Linux; - utiliser les notions de module, de cohésion et couplage, de complexité structurale, de dissimulation de l'information, etc., pour évaluer la qualité d'un composant logiciel; - expliquer et utiliser les principales techniques de modularisation : décomposition fonctionnelle, dissimulation de l'information, filtres et pipelines; - utiliser des assertions (pré/post-conditions, invariants) pour documenter des composants logiciels et assurer leur bon fonctionnement; - déboguer un programme à l'aide de techniques, stratégies et outils appropriés; - vérifier le bon fonctionnement d'un composant logiciel à l'aide de tests fonctionnels et structurels, et d'évaluer à l'aide des notions et outils appropriés la qualité des tests (par ex., complexité cyclomatique, mesures de couvertures des tests); - évaluer de façon empirique à l'aide d'outils appropriés (par ex., profils d'exécution) les performances d'un composant logiciel de façon à pouvoir, si nécessaire, en améliorer les performances; - utiliser divers outils (outil de gestion de configuration, fichiers Makefile, langage de scripts) pour organiser le développement de programmes comportant plusieurs composants ou modules; - expliquer les notions de base de la maintenance des logiciels et appliquer certaines techniques de maintenance (tests de régression exécutés automatiquement, remodelage de programmes). Contenu détaillé ================ **Environnement Linux/Unix, Introduction au langage C et aux outils de développement.** Introduction au langage C. Phases de compilation. Éditeurs de texte. Environnements de développement. Gestion de sources (rappels). **Les bases du langage C.** Types de bases. Variables et constantes. Opérateurs. Mots-clés. Instructions de contrôle d'exécution. Structures et unions. Variables et leur portée. Énoncés et expressions. Fichiers. Fonctions. Pointeurs. Tableaux. Tableaux à plusieurs dimensions. Préprocesseur. Mémoire et allocation dynamique. Entrées et sorties(`printf`, `scanf`, `stdin`, `stdout`, `stderr`). Tubes et redirection. **Construction automatisée de base.** Ficher `Makefile` et outil `make`. **Autres outils de compilation et configuration automatique.** Limites de `make`. Aperçu d'autres outils rependus (CMake, Autoconf/Automake). **Modularité.** Cohésion et couplage. Encapsulation et dissimulation de l'information. Décomposition fonctionnelle. **Maintenance.** Notion de base de la maintenant de logiciels. Types de maintenance. **Tests.** Niveaux de tests (boîte noire, boîte blanche). Types de tests (unitaires, intégration, acceptation). **Débogage de programmes.** Erreurs typiques. Outils : GNU gdb, Valgrind. Techniques. **Structures de données.** Tableau dynamique. Ensemble. Tableau associatif. Pile. File. **Évaluation et amélioration des performances.** Profils d'exécution, améliorations asymptotiques *vs* optimisations de code. Outils. **Bibliothèques en C.** Conception et intégration; statique vs dynamique, Aperçu de bibliothèques C populaires. Calendrier ========== \#Semaine Cours ----------- ----------------------------------------------------------- 1 Environnement Linux et introduction au C 2 Base du langage C - partie 1 3 Base du langage C - partie 2 4 Base du langage C - partie 3 5 Modularité 6 Construction automatisée **7** **Examen de mi-session** 8 Autres outils de compilation et configuration automatique 9 Maintenance 10 Tests 11 Débogage de programmes 12 Structures de données 13 Évaluation et amélioration des performances 14 Bibliothèques en C **15** **Examen final** Ateliers (laboratoires) ======================= - Les ateliers concernent la matière vue. - Ne pas prendre de retard dans vos devoirs. - Les ateliers sont obligatoires et individuels à raison de 2 heures par semaine. Modalités d'évaluation ====================== Description sommaire Date Pondération ---------------------- ------------------------ ------------- Examen intra 20 juin 2023 25 % Examen final 8 août 2023 25 % TP1 4 juin 2023 à 23:55 15 % TP2 9 juillet 2023 à 23:55 15 % TP3 13 août 2023 à 23:55 20 % Seuil de passage ---------------- L'étudiant doit obtenir au moins 50 % dans les examens et au moins 50% dans les travaux afin de réussir le cours. Dans le cas contraire, l'échec sera attribué. Les règlements concernant le plagiat seront strictement appliqués. Pour plus de renseignements, consultez le site suivant : Directives aux examens ---------------------- - Avoir votre carte d'étudiant UQAM valide. - L'examen à faire seul sans aucune aide externe. - Vous ne pouvez pas collaborer avec un partenaire. - Vous ne pouvez pas prendre les notes personnelles d'un voisin. - Bien lire les questions. - Vous devez réfléchir avant de répondre. - Répondre dans les espaces prévus. - WebCamera et micro actif durant toute la durée de l'examen. - **Signer la feuille de présence avant votre départ (si en présentiel)** Directives des travaux pratiques -------------------------------- - Remise électronique **privée** via le GitLab du Département d'informatique (`gitlab.info.uqam.ca`). - Travaux à faire individuellement. - La qualité du français sera prise en considération (jusqu'à 10% de pénalité). Communication ------------- - Vous devez **toujours** et uniquement utiliser votre courriel UQAM lors de vos communications avec l'enseignant. - ListServ est utilisé pour les communications aux groupes. - ListServ UQAM fonctionne uniquement avec le courriel UQAM. - Un canal Mattermost est aussi disponible pour les échanges avec l'équipe enseignante. Médiagraphie ============ VC Kernighan, B.W. et Ritchie, D.M. -- Le langage C -- deuxième édition, MASSON, PARIS, 1990. UC . Site web du cours INF1070 Utilisation et administration des systèmes informatiques. VC Blaquelaire, J.P. -- *Méthodologie de la programmation en C (4e édition)* -- DUNOD, 2005. \[QA76.73 C15B75\]. VC Kernighan, B.W. et R. Pike, R. -- *The Practice of Programming* -- ADDISON-WESLEY, 1999. VC Kernighan, B.W. et R. Pike, R. -- *La programmation - En pratique* -- VUIBERT, 2001. \[QA76.6K48814\]. VC Loukides, M. et Oram, A. -- *Programming with GNU Software* -- O'REILLY, 1997. VC McConnell, S. -- *Code Complete - A Practical Handbook of Software Construction* -- (SECOND EDITION). MICROSOFT PRESS, REDMOND, WA, 2004. VC ZELLER, A. and KRINKE, J. -- *Essential Open Source Toolset* -- JOHN WILEY & SONS, LTD, 2005.