Fondements de l’ingénierie logicielle

À travers ce module, nous poserons les fondations de l’ingénierie logicielle : un vocabulaire commun pour passer du besoin à une solution construisible. Il y sera présenté la conception d’applications (le comment détaillé), l’architecture (la charpente d’ensemble et ses décisions structurantes) et la chronologie type d’un projet (de la planification à l’exploitation). Il s’agit d’un aperçu de l’ingénierie logicielle : nous ne couvrirons pas toutes les technologies mentionnées, mais l’objectif est de vous y situer et de vous donner des repères solides pour la suite de vos apprentissages.


1) Notion de conception d’applications

Le but : transformer les besoins en une solution détaillée prête à construire.

  • Organisation interne des modules/composants, contrats d’API, gestion des erreurs, modèle de données et règles métier, flux UI/UX.
  • Choix de patrons (Observer, Strategy, Adapter…), de tactiques (cache, pagination, idempotence) et de contraintes (validation, sécurité, performance).

La portée (vs architecture)

  • Architecture = charpente globale (frontières, styles d’intégration, décisions coûteuses à changer).
  • Conception = comment réaliser une capacité dans ce cadre (algorithmes, signatures, schémas, tests).

Artefacts typiques

  • UML (classes, séquence, états), schémas de données, contrats API (OpenAPI/GraphQL), maquettes UI, règles de validation, tests d’acceptation.

2) Notion d’architecture logicielle

Le but : définir la structure d’ensemble, les relations et les principes qui guident la conception et l’évolution.

Un peu comme pour le bâtiment où l’on fixe d’abord fondations et ossature, l’architecture logicielle regroupe les décisions précoces (frontières, styles, interactions) qui orientent durablement le système ; et ce même si le développement moderne privilégie l’adaptabilité plutôt qu’une planification rigide, ces choix initiaux restent parfois coûteux à modifier.

Une définition selon ISO/IEC/IEEE 42010

Il existe une définition standard de l’architecture logicielle, qui résulte d’un effort conjoint entre l’Organisation internationale de normalisation (International Organization for Standardization - ISO) et l’Institute of Electrical and Electronics Engineers (IEEE).

La description de l’architecture des systèmes et de l’ingénierie logicielle ISO/IEC/IEEE 42010 est une norme internationale qui définit l’architecture logicielle comme :

ENFundamental concepts or properties of a system in its environment embodied in its elements, relationships, and in the principles of its design and evolution.

FRConcepts ou propriétés fondamentaux d’un système dans son environnement, incarnés par ses éléments, leurs relations, et par les principes de sa conception et de son évolution.

Les points clés de la norme (en bref)
  • L’architecture est fondamentale au système.
  • Un système logiciel est situé dans un environnement (contraintes, systèmes voisins) dont l’architecture tient compte.
  • Une description d’architecture documente l’architecture et communique aux parties prenantes comment l’architecture répond aux besoins du système.
  • Les vues d’architecture sont produites à partir de la description de l’architecture, et chaque vue couvre une ou plusieurs préoccupations (concerns) des différentes parties prenantes;

Une définition qui provient du PMI.org

L’architecture logicielle d’un programme ou système, ce sont la ou les structures du système, comprenant des éléments logiciels, leurs propriétés visibles et les relations entre eux.

Un système logiciel contient des structures, et cette définition note qu’un système logiciel est composé d’une ou plusieurs d’entre elles. C’est la combinaison de ceux-ci qui forme l’architecture logicielle globale. Un grand projet logiciel peut avoir plusieurs équipes qui y travaillent, chacune responsable d’une structure particulière.

L’architecture est une abstraction

  • Elle décrit les structures, leurs éléments et les relations entre éléments.
  • Elle se concentre sur les aspects publics (interfaces, contrats, protocoles) et la façon d’interagir — pas sur chaque détail d’implémentation interne.
  • Elle capture surtout les décisions importantes qui façonnent la qualité, la longévité et l’utilité du système.

En quoi l’architecture est importante ?

La tentation est de coder tout de suite ; pourtant, l’architecture pose les fondations : elle concentre des décisions précoces qui orientent tout le reste et conditionnent les qualités du système. Et comme tout logiciel a une architecture (explicite ou non), plus le système est vaste ou complexe, plus une architecture pensée augmente les chances de succès.

Aligner la solution sur les besoins
Elle permet de répondre aux exigences fonctionnelles et non fonctionnelles (sécurité, performance, etc.) en collaboration avec les parties prenantes.
Activer / inhiber les qualités
Les attributs de qualité dépendent fortement des choix architecturaux. Ce sont des propriétés mesurables et testables (ex. : maintenabilité, sécurité, performances).
La prédiction des qualités du système
On anticipe la capacité du système à atteindre ses exigences non fonctionnelles (évite des retouches tardives coûteuses).
Faciliter la communication entre les parties prenantes
Les vues et documents fournissent un langage commun aux équipes (métier, dev, QA, ops, sécu).
Gérer le changement
Les modifications sont inévitables (marché, nouvelles exigences, modifications des processus métier, avancées technologiques, correctifs). Une bonne architecture localise l’impact :
  • Changement local (1 élément)
  • Changement multi-éléments (sans toucher l’architecture)
  • Changement architectural (frontières, styles…)
Fournir un modèle réutilisable
On réemploie non seulement du code, mais aussi des décisions (patrons, principes, contraintes) déjà éprouvées, ce qui économise des ressources, telles que du temps et de l'argent.
Imposer des contraintes de mise en œuvre
L’architecture introduit des contraintes d’implémentation et restreint les choix de conception. Cela réduit la complexité du système logiciel et empêche les développeurs de prendre des décisions incorrectes.
Améliorer les estimations
Une architecture claire aide à découper le travail, mieux estimer coûts/délais/efforts et piloter le projet. Les deux principales approches de l'estimation de la gestion de projet sont les suivantes :
  • Approche descendante (top-down approach) : partir des livrables finaux et des objectifs, puis les décompose en plus petits lots de travaux
  • Approche ascendante (bottom-up approach) : partir des tâches spécifiques, puis regrouper en lots de travail
Former & embarquer
Les vues et décisions servent de support d’onboarding pour les nouveaux membres et pour la maintenance (l'une des phases les plus longues et coûteuses d'un projet logiciel) : compréhension des structures/éléments et de leurs interactions, utile sur la durée.

Qui consomme l’architecture ?

Il existe une variété de parties prenantes dans un système logiciel, telles que : les utilisateurs finaux du système, les analystes commerciaux, les experts du domaine, le personnel d’assurance qualité, les gestionnaires, ceux qui peuvent s’intégrer au système et les membres du personnel des opérations.

  • Les utilisateurs finaux (indirectement, via les qualités perçues)
  • Les analystes commerciaux (traçabilité besoins ↔ solution)
  • Les experts métier (règles et périmètre)
  • Le personnel d’assurance qualité (développeurs & QA) (contrats, dépendances, tests)
  • Ops / sécurité (déploiement, observabilité, conformité)
  • Intégrateurs / équipes voisines (interfaces et frontières)
  • Gestionnaires (projet/produit/technique) (priorisation, budget, risques, jalons)

Chacune de ces parties prenantes est affectée dans une certaine mesure par l’architecture logicielle. Alors que certaines parties prenantes auront accès et seront intéressées par l’examen de l’architecture logicielle et de sa documentation, d’autres non.

Certaines de ces parties prenantes sont des consommatrices indirectes de l’architecture dans la mesure où elles se soucient du logiciel, et comme l’architecture logicielle est le fondement du système, elles deviennent des consommateurs indirects de l’architecture.

Lorsque nous discutons des consommateurs d’une architecture logicielle, nous ne pouvons pas omettre les développeurs qui travaillent sur ce logiciel. En tant qu’architecte logiciel, il est indispensable de penser à vos développeurs, dont le travail est directement affecté par l’architecture logicielle. Ce sont eux qui travailleront quotidiennement sur le logiciel.

Quel est le rôle de l’architecte logiciel

Alors, maintenant que nous savons ce qu’est l’architecture logicielle, son importance et ses avantages, et que nous comprenons qu’il existe une variété de parties prenantes qui en sont affectées, examinons le rôle de l’architecte logiciel.

L’architecte logiciel est la personne qui porte les décisions structurantes du système, aligne les parties prenantes sur les qualités visées et documente les compromis pour guider l’évolution.

Il arrive qu’un projet se fasse sans architecte désigné : le succès ou l’échec peut alors tenir à d’autres facteurs. Lorsque personne ne reçoit spécifiquement le titre d’architecte logiciel, un membre de l’équipe endosse souvent de fait les décisions d’architecture (on parle d’architecte accidentel) ou alors ces décisions émergent collectivement entre développeurs. Enfin, sur des projets plus vastes ou complexes, mieux vaut désigner explicitement ce rôle pour assurer cohérence et gestion des risques.

À retenir

L’architecture logicielle est la structure ou les structures d’un système, leurs éléments et les relations entre ces éléments. C’est une abstraction d’un système logiciel. L’architecture logicielle est importante, car tous les systèmes logiciels ont une architecture, et cette architecture est la base du système logiciel. L’architecture logicielle offre un certain nombre d’avantages, tels que l’activation et l’inhibition des attributs de qualité, vous permettant de prédire les qualités du système logiciel, facilitant la communication avec les parties prenantes et vous permettant d’apporter plus facilement des modifications. Il fournit également un modèle réutilisable qui pourrait être utilisé dans plusieurs produits logiciels, impose des contraintes de mise en œuvre qui réduisent la complexité et minimisent les erreurs des développeurs, améliorent les estimations des coûts/efforts et servent de formation aux nouveaux membres de l’équipe. Les architectes logiciels sont des leaders techniques qui sont ultimement responsables des décisions techniques, de l’architecture et de sa documentation. Ils exécutent un certain nombre de tâches et sont censés avoir des connaissances sur une variété de sujets, à la fois techniques et non techniques.


3) Chronologie de développement d’un système

La planification du projet

Objectifs : clarifier la vision, le périmètre (in/out), les risques et le cadre (équipe, budget, jalons).

Livrables : one-pager, parties prenantes/RACI, roadmap, backlog initial, critères de succès (KPI).

Outils : doc de vision, tableau de bord projet, gestion d’issues (GitLab/GitHub).

L'analyse

Objectifs : investiguer le problème pour comprendre le besoin et le rendre testable (vérifiable objectivement).

Livrables : SEL préliminaire, user stories / use cases, critères d’acceptation, exigences mesurables, glossaire, esquisses UI.

Outils : ateliers, PlantUML/draw.io, Figma (prototypage low-fi).

La conception

Objectifs : définir comment réaliser la solution dans le cadre architectural afin de répondre aux besoins.

Livrables : vues C4 (Contexte/Conteneurs/Composants), UML (classes/séquence), schéma de données, contrats API.

Outils : PlantUML/draw.io, OpenAPI, linters de schémas, checklists qualité.

La mise en œuvre

Objectifs : construire, valider et livrer en continu.

Livrables : code + tests (unitaires/intégration), pipeline CI/CD, artefacts versionnés, doc d’utilisation.

Outils : IDE, Git (PR/MR), CI/CD, Docker (packaging), gestion de secrets, Helm/Kustomize

L'exploitation et support

Objectifs : opérer de façon fiable, apprendre de la prod et itérer.

Livrables : SLI/SLO, monitoring/alerting, logs/métriques/traces, runbooks, gestion d’incidents, plan de mises à jour/sécurité, feedback vers le backlog.

Outils : Grafana/Prometheus (*monitoring*), pages de statut, post-mortems.


Analyse, modélisation et conception — repères rapides

AspectAnalyseModélisationConception
ButÉliciter, clarifier les besoinsStructurer et visualiserDéfinir la solution technique
QuestionsQuel problème? Pour qui?
Quelles règles? Quels NFR?
Comment représenter fidèlement?
Quelles frontières?
Quelles technologies, patterns, composants, APIs?
LivrablesSEL (exigences F/NF), user stories, critères d’acceptation, glossaireUse cases, MDD (modèle de domaine), SSD, maquettes, C4 ContexteVues C4 (Conteneurs/Composants), diagrammes de classes (conception), schéma de données, contrats d’API, décisions (ADR)
NiveauMétier / besoinsAbstrait (peut être métier ou technique)Technique / implémentable
ActeursClient/PO, analyste, archiTous (métier + tech)Archi, devs, ops/sécu
Risques traitésMalentendus, périmètreAmbiguïtés, incohérencesPerformance, sécurité, coût, maintenabilité
Important : la modélisation n’est pas une phase en soi — c’est une activité qui sert l’analyse (modèles métier) et la conception (modèles techniques).