mindmap
root((Génie Logiciel))
Processus
Agile
Scrum
Kanban
DevOps
CI/CD
Infrastructure as Code
Qualité
Tests
Unitaires
E2E
Standards
Clean Code
SOLID
Architecture
Cloud Native
Containers
Serverless
Microservices
API First
Event-Driven
Pratiques
Clean Code
Refactoring
Code Review
CI/CD
Tests auto
Déploiement continu
Software Engineering 101
Génie Logiciel : Fondamentaux et Pratiques Modernes
Ce cours explore les fondements du génie logiciel, combinant théorie et pratique pour une compréhension complète du développement logiciel moderne.
Objectifs pédagogiques: - Maîtriser les concepts fondamentaux - Comprendre les différentes approches - Acquérir des compétences pratiques - Développer un esprit critique
Introduction au génie logiciel
Le génie logiciel aujourd’hui
Le génie logiciel est une discipline en constante évolution qui répond aux défis modernes du développement logiciel:
1. Complexité des systèmes - Architectures distribuées - Intégration de multiples technologies - Systèmes hautement concurrents - Sécurité renforcée
2. Contraintes du marché - Time-to-market réduit - Innovation continue - Adaptation rapide aux changements - Compétition mondiale
3. Exigences de qualité - Fiabilité critique - Performance optimale - Sécurité robuste - Expérience utilisateur fluide
4. Pratiques modernes - Agilité et DevOps - Architecture cloud-native - Automatisation poussée - Développement durable
Définition et objectifs du génie logiciel
Le génie logiciel est une discipline qui intègre les principes d’ingénierie et de gestion pour créer des logiciels fiables et efficaces.
flowchart LR A[Problème] --> B[Analyse] B --> C[Conception] C --> D[Implémentation] D --> E[Test] E --> F[Déploiement] F --> G[Maintenance]
Qualités d’un logiciel
Les qualités essentielles d’un logiciel moderne s’articulent autour de plusieurs dimensions:
graph TB
A[Qualités<br>Logicielles] --> B[Externes]
A --> C[Internes]
B --> D[Fiabilité]
B --> E[Performance]
B --> F[Utilisabilité]
C --> G[Maintenabilité]
C --> H[Testabilité]
C --> I[Portabilité]
style A fill:#f9f,stroke:#333,stroke-width:4px
style B fill:#bbf,stroke:#333
style C fill:#bbf,stroke:#333
| Qualité | Description | Mesures |
|---|---|---|
| Fiabilité | Capacité à fonctionner sans défaillance | MTBF, taux d’erreurs |
| Maintenabilité | Facilité à être modifié et corrigé | Complexité cyclomatique, dette technique |
| Performance | Optimisation des ressources | Temps de réponse, utilisation mémoire |
| Sécurité | Protection contre les menaces | Vulnérabilités, conformité OWASP |
| Scalabilité | Capacité d’adaptation à la charge | Temps de réponse sous charge |
| Testabilité | Facilité à être testé | Couverture de tests, isolabilité |
Principes de base du développement logiciel
- Abstraction: Représenter les concepts essentiels sans détails d’implémentation
- Modularité: Décomposer en modules cohérents et faiblement couplés
- Encapsulation: Masquer les détails d’implémentation
- Séparation des préoccupations: Diviser le système en parties distinctes
Cycle de vie du logiciel
Le cycle de vie comprend toutes les phases depuis la conception jusqu’à la fin de vie du logiciel.
stateDiagram-v2
direction LR
classDef analysisPhase fill:#d4f1f9,stroke:#05668d,stroke-width:2px
classDef designPhase fill:#ffdac1,stroke:#d95204,stroke-width:2px
classDef devPhase fill:#c8e6c9,stroke:#2e7d32,stroke-width:2px
classDef testPhase fill:#e8daef,stroke:#6a1b9a,stroke-width:2px
classDef deployPhase fill:#ffecb3,stroke:#ff8f00,stroke-width:2px
classDef maintainPhase fill:#f5b7b1,stroke:#922b21,stroke-width:2px
Analyse --> Conception
Conception --> Implémentation
Implémentation --> Test
Test --> Déploiement
Déploiement --> Maintenance
Maintenance --> Analyse: Évolution
note right of Analyse: <b>Définition des besoins</b>\nCompréhension du problème\nSpécification des exigences
note right of Conception: <b>Architecture et design</b>\nStructure du système\nInterfaces et composants
note right of Implémentation: <b>Développement</b>\nÉcriture du code\nUnités fonctionnelles
note right of Test: <b>Validation</b>\nVérification fonctionnelle\nAssurance qualité
note right of Déploiement: <b>Mise en production</b>\nInstallation\nConfiguration
note right of Maintenance: <b>Évolution</b>\nCorrections\nAméliorations\nAdaptation
state "Analyse" as Analyse
state "Conception" as Conception
state "Implémentation" as Implémentation
state "Test" as Test
state "Déploiement" as Déploiement
state "Maintenance" as Maintenance
class Analyse analysisPhase
class Conception designPhase
class Implémentation devPhase
class Test testPhase
class Déploiement deployPhase
class Maintenance maintainPhase
Processus de développement
Évolution des méthodologies
Les processus de développement ont considérablement évolué pour répondre aux défis modernes:
1. Approches traditionnelles - Cycle en cascade - Modèle en V - Processus unifié
2. Méthodes agiles - Scrum et ses rituels - Kanban et le flux continu - XP et les pratiques d’ingénierie
3. Approches hybrides - Scrumban - SAFe - DevOps
Modèles classiques (Waterfall, V-model)
Le modèle en cascade suit une approche linéaire et séquentielle:
- Analyse des besoins
- Conception
- Implémentation
- Test
- Déploiement
- Maintenance
Avantages: Structure claire, documentation complète
Inconvénients: Peu flexible, retour client tardif
Le modèle en V associe chaque phase de développement à une phase de test:
Voici un diagramme Mermaid pour le modèle en V qui illustre clairement la correspondance entre les phases de développement et de test:
flowchart TD
classDef devPhase fill:#ffdac1,stroke:#d95204,stroke-width:2px
classDef testPhase fill:#e8daef,stroke:#6a1b9a,stroke-width:2px
classDef centerPhase fill:#c8e6c9,stroke:#2e7d32,stroke-width:2px
A[Analyse des besoins] -->|développement| B[Conception système]
B -->|développement| C[Conception détaillée]
C -->|développement| D[Codage]
D -->|validation| E[Tests unitaires]
E -->|validation| F[Tests d'intégration]
F -->|validation| G[Tests système]
G -->|validation| H[Tests d'acceptation]
A -.->|validation| H
B -.->|validation| G
C -.->|validation| F
subgraph Développement
A
B
C
end
subgraph Implémentation
D
end
subgraph Validation
E
F
G
H
end
class A,B,C devPhase
class D centerPhase
class E,F,G,H testPhase
NoteA["Définition des exigences<br>Expression des besoins"]
NoteB["Architecture globale<br>Interfaces principales"]
NoteC["Design des composants<br>Algorithmes"]
NoteD["Programmation<br>Implémentation"]
NoteE["Validation des modules<br>individuels"]
NoteF["Validation des<br>interactions"]
NoteG["Validation de<br>l'architecture"]
NoteH["Validation des<br>besoins initiaux"]
A -.-> NoteA
B -.-> NoteB
C -.-> NoteC
D -.-> NoteD
E -.-> NoteE
F -.-> NoteF
G -.-> NoteG
H -.-> NoteH
classDef noteStyle fill:#f0f0f0,stroke:#aaa,stroke-dasharray:5
Avantages: Emphase sur les tests, traçabilité
Inconvénients: Rigidité, adaptation difficile au changement
Approches agiles (Scrum, Kanban)
Les méthodes agiles favorisent:
- Livraison incrémentale et itérative
- Adaptation aux changements
- Collaboration étroite avec le client
- Amélioration continue
- Individus et interactions plutôt que processus et outils
- Logiciel fonctionnel plutôt que documentation exhaustive
- Collaboration avec le client plutôt que négociation de contrat
- Adaptation au changement plutôt que suivi d’un plan
Scrum
- Sprints: Cycles de travail de 2-4 semaines
- Rôles clés:
- Product Owner (responsable du produit)
- Scrum Master (facilitateur)
- Équipe de développement (auto-organisée)
- Rituels:
- Daily Stand-up (synchronisation quotidienne)
- Sprint Planning (planification)
- Sprint Review (démonstration)
- Sprint Retrospective (amélioration)
- Forces: Cadre structuré, livraison rapide, collaboration
Voici une amélioration de la section Kanban sous forme d’un slide complet et visuellement engageant :
Kanban
flowchart LR
subgraph "Backlog" ["Backlog"]
B1["User story #1"]
B2["User story #2"]
B3["User story #3"]
B4["..."]
end
subgraph "À faire" ["À faire (WIP: 3/3)"]
T1["Tâche #4"]
T2["Tâche #5"]
T3["Tâche #6"]
end
subgraph "En cours" ["En cours (WIP: 2/2)"]
P1["Tâche #7"]
P2["Tâche #8"]
end
subgraph "Test" ["Test (WIP: 1/2)"]
R1["Tâche #9"]
end
subgraph "Terminé" ["Terminé"]
D1["Tâche #1"]
D2["Tâche #2"]
D3["Tâche #3"]
end
Backlog --> "À faire"
"À faire" --> "En cours"
"En cours" --> "Test"
"Test" --> "Terminé"
style "À faire" fill:#ffcccb,stroke:#333
style "En cours" fill:#ffffcc,stroke:#333
style "Test" fill:#ccffcc,stroke:#333
style "Terminé" fill:#ccccff,stroke:#333
%% Indicateurs métriques
CycleTime["Cycle Time: 2.3 jours"]
LeadTime["Lead Time: 6.5 jours"]
Throughput["Débit: 8 tâches/semaine"]
Principes fondamentaux:
- Visualisation du flux de travail : Représentation claire de chaque étape du processus
- Limitation du travail en cours (WIP) : Prévention de la surcharge et identification des goulots d’étranglement
- Gestion du flux : Optimisation pour un mouvement fluide et prévisible des tâches
- Politiques explicites : Règles claires pour chaque étape du processus
- Boucles de feedback : Réunions, métriques et révisions régulières
- Amélioration collaborative : Évolution progressive basée sur des données empiriques
Métriques clés:
- Lead time : Temps total depuis la demande jusqu’à la livraison
- Cycle time : Temps de traitement effectif d’une tâche
- Throughput : Nombre de tâches complétées par unité de temps
- Taux de blocage : Pourcentage de tâches bloquées
Forces: Flexibilité, visualisation immédiate des problèmes, adaptation continue, réduction du gaspillage, prévisibilité accrue
Idéal pour: Environnements avec flux de travail continu, équipes de maintenance, projets à priorités changeantes
XP (Extreme Programming)
- Pratiques techniques rigoureuses:
- Programmation en binôme
- Développement piloté par les tests (TDD)
- Intégration continue
- Refactoring fréquent
- Cycles courts et feedback constant
- Client sur site pour consultation immédiate
- Design simple et évolutif
- Forces: Qualité technique élevée, adaptabilité, réduction des défauts
flowchart TD
A[Exigences] --> B[Planning]
B --> C[Conception simple]
C --> D[Tests]
D --> E[Programmation en binôme]
E --> F[Intégration continue]
F --> G[Livraison fréquente]
G --> A
Scrumban
- Hybride entre Scrum et Kanban
- Combine itérations de Scrum et flux continu de Kanban
- Planification à la demande (quand le backlog s’épuise)
- Métriques de flux pour optimiser le processus
- Forces: Flexibilité accrue de Scrum, visualisation améliorée
flowchart LR
A[Backlog] --> B[Planifié]
B --> C[En cours]
C --> D[Test]
D --> E[Terminé]
subgraph "Priorités dynamiques"
A
end
subgraph "Sprint flexible"
B
C
D
end
subgraph "Mesure continue"
E
end
Processus unifié
Le Processus Unifié (RUP) combine aspects itératifs et incrémentiels:
- Phases: Inception, Élaboration, Construction, Transition
- Aspects: Risques, Architecture, Valeur métier, Compétences
- Disciples: Modélisation, Implémentation, Test, Déploiement, etc.
RAD (Rapid Application Development)
- Définition: Méthodologie créée par James Martin (1991) pour accélérer le développement
- Objectif: Livrer rapidement des applications fonctionnelles (60-90 jours)
- Principes: Prototypage rapide, implication continue des utilisateurs, équipes pluridisciplinaires
- Phases: 1) Planification des besoins → 2) Conception utilisateur (prototypes) → 3) Construction rapide → 4) Transition
- Forces: Développement rapide, forte adhésion utilisateur, visibilité précoce des résultats
- Limites: Évolutivité limitée, nécessite utilisateurs disponibles et développeurs expérimentés
- Cas d’usage: Projets de taille moyenne, besoins utilisateurs évolutifs, applications avec forte composante UI
- Évolution: A inspiré DSDM, certains aspects d’XP, et les plateformes low-code/no-code modernes
- Différenciation: Plus structuré que les méthodes purement agiles, mais plus flexible que le cycle en cascade
flowchart LR
A[1. Planification<br>• Définition périmètre<br>• Ateliers JAD] --> B[2. Conception utilisateur<br>• Prototypage<br>• Validation immédiate]
B --> C[3. Construction<br>• Développement rapide<br>• Tests continus]
C --> D[4. Transition<br>• Finalisation<br>• Formation]
D -.-> B
style A fill:#f9d5e5,stroke:#333
style B fill:#eeeeee,stroke:#333
style C fill:#e3eaa7,stroke:#333
style D fill:#b5ead7,stroke:#333
Analyse et spécification des besoins
L’ingénierie des exigences comprend:
- Élicitation: Découvrir les besoins des parties prenantes
- Analyse: Clarifier et prioriser les exigences
- Spécification: Documenter les exigences
- Validation: Vérifier la cohérence et la pertinence
- Gestion: Suivre l’évolution des exigences
Techniques de collecte des besoins
- Interviews et questionnaires
- Ateliers et brainstorming
- Observation et ethnographie
- Prototypage et scénarios d’utilisation
- Analyse de documents existants
- Spécifique
- Mesurable
- Atteignable
- Réaliste
- Temporellement défini
Conception logicielle
- Définition: Processus de transformation des exigences en représentation implémentable
- Objectif: Créer un plan détaillé pour guider l’implémentation
- Position: Phase intermédiaire entre analyse des besoins et codage
- Résultat: Ensemble de modèles, schémas et spécifications techniques
Approches fondamentales
- Conception descendante (Top-Down)
- Commence par la vision globale, Décompose progressivement en sous-systèmes, Favorise la compréhension des objectifs généraux
- Conception ascendante (Bottom-Up)
- Commence par les composants de bas niveau, Les assemble progressivement en systèmes plus grands, Favorise la réutilisation et le pragmatisme
- Conception orientée objet (OOD)
- Organisation autour d’objets plutôt que d’actions, Encapsulation des données avec comportements associés, Relations basées sur héritage, composition, agrégation
Niveaux de conception
- Architecture logicielle
- Structure globale du système
- Décomposition en sous-systèmes/modules
- Définition des interfaces principales
- Choix des styles architecturaux (couches, microservices, etc.)
- Conception détaillée
- Spécification précise des classes/modules
- Algorithmes et structures de données
- Protocoles de communication
- Relations entre composants
Méthodologies de conception logicielle
timeline
title Évolution des méthodologies de conception
1970s : Structured Design
1980s : Object-Oriented Design
1990s : Design Patterns : UML
2000s : Agile Methods : TDD : Refactoring
2010s : DDD : BDD : Microservices
2020s : API-first : Event-driven : Continuous Design
Domain-Driven Design (DDD)
Philosophie: Alignement du code sur le modèle mental du métier
Étapes clés: 1. Établir un langage omniprésent 2. Identifier les bounded contexts 3. Modéliser le domaine (entités, agrégats, services) 4. Implémenter en préservant l’intégrité du modèle
Test-Driven Development (TDD)
Philosophie: Les tests guident la conception
Étapes clés: 1. Écrire un test qui échoue (RED) 2. Écrire le code minimal pour passer le test (GREEN) 3. Améliorer le code sans changer son comportement (REFACTOR) 4. Répéter
Behavior-Driven Development (BDD)
Philosophie: Les comportements attendus définissent le logiciel
Étapes clés: 1. Spécifier le comportement en langage naturel structuré (Given-When-Then) 2. Automatiser les spécifications en tests exécutables 3. Développer pour satisfaire les comportements 4. Utiliser les scénarios comme documentation vivante
Model-Driven Architecture (MDA)
Philosophie: Les modèles abstraits sont la source de vérité
Étapes clés:
- Créer un modèle indépendant de la plateforme (PIM)
- Transformer en modèle spécifique à la plateforme (PSM)
- Générer le code à partir du PSM
- Affiner et compléter l’implémentation
Feature-Driven Development (FDD)
Philosophie: Organiser le développement autour des fonctionnalités utilisateur
Étapes clés:
- Développer un modèle global
- Construire une liste de fonctionnalités
- Planifier par fonctionnalité
- Concevoir par fonctionnalité
- Implémenter par fonctionnalité
Continuous Design
Philosophie: La conception évolue progressivement avec le code
Étapes clés:
- Commencer avec un design minimal viable
- Intégrer continuellement les changements
- Refactoriser régulièrement
- Utiliser les métriques pour guider l’évolution
- Adapter la conception aux nouveaux besoins
Event Storming
Philosophie: Exploration collaborative du domaine par les événements
Étapes clés:
- Identifier les événements du domaine (post-its)
- Ajouter les commandes qui déclenchent ces événements
- Identifier les agrégats et règles métier
- Organiser en bounded contexts
- Dériver le modèle de domaine
Voici une section améliorée et détaillée sur la modélisation UML pour votre cours :
Modélisation avec UML
Le langage UML (Unified Modeling Language) est une notation standardisée pour visualiser, spécifier, construire et documenter les artefacts d’un système logiciel. Développé dans les années 1990 et maintenu par l’OMG (Object Management Group), il constitue aujourd’hui le standard de facto pour la modélisation orientée objet.
Diagrammes structurels
Les diagrammes structurels représentent l’architecture statique du système :
Objectif : Représenter les classes, leurs attributs, méthodes et relations.
Éléments clés : - Classes et interfaces - Attributs et méthodes avec visibilité - Relations : association, agrégation, composition, héritage, etc. - Cardinalités et rôles
classDiagram
class Véhicule {
-marque: String
-modèle: String
+démarrer(): void
+arrêter(): void
}
class Voiture {
-nombrePortes: int
+ouvrirCoffre(): void
}
class Moto {
-cylindrée: int
+faireUnWheeling(): void
}
Véhicule <|-- Voiture : hérite de
Véhicule <|-- Moto : hérite de
class Conducteur {
-nom: String
-permis: String
+conduire(v: Véhicule): void
}
Conducteur "1" --> "0..n" Véhicule : conduit >
Objectif : Montrer une “photo instantanée” d’instances de classes et leurs relations à un moment donné.
Éléments clés : - Instances d’objets nommées - Valeurs d’attributs concrètes - Liens entre objets (instances d’associations)
classDiagram
class "renault: Voiture" {
marque = "Renault"
modèle = "Clio"
nombrePortes = 5
}
class "ducati: Moto" {
marque = "Ducati"
modèle = "Monster"
cylindrée = 900
}
class "jean: Conducteur" {
nom = "Jean Dupont"
permis = "B, A"
}
"jean: Conducteur" --> "renault: Voiture" : conduit
"jean: Conducteur" --> "ducati: Moto" : conduit
Objectif : Représenter l’organisation physique des composants d’un système et leurs dépendances.
Éléments clés : - Composants logiciels - Interfaces fournies et requises - Relations de dépendance
flowchart TD
subgraph UI[Interface utilisateur]
Vue[Vue]
end
subgraph Business[Couche métier]
Service[Service]
ViewModel[ViewModel]
end
subgraph Data[Couche données]
Repository[Repository]
DAO[DAO]
end
Database[(Base de données)]
Vue -- utilise --> ViewModel
ViewModel -- utilise --> Service
Service -- utilise --> Repository
Repository -- utilise --> DAO
DAO -- accède --> Database
style UI fill:#f9d5e5,stroke:#333
style Business fill:#eeeeee,stroke:#333
style Data fill:#e3eaa7,stroke:#333
Objectif : Montrer la configuration physique du matériel et la distribution des composants logiciels.
Éléments clés : - Nœuds (hardware) - Artefacts (composants déployés) - Connexions réseau
flowchart TD
subgraph "Poste client"
Browser[Navigateur web]
end
subgraph "Serveur d'application"
WebServer[Serveur Web]
AppServer[Serveur d'application]
end
subgraph "Serveur de données"
DB[Base de données]
end
Browser -- HTTPS --> WebServer
WebServer -- API --> AppServer
AppServer -- JDBC --> DB
style "Poste client" fill:#d4f1f9,stroke:#05668d
style "Serveur d'application" fill:#c8e6c9,stroke:#2e7d32
style "Serveur de données" fill:#ffecb3,stroke:#ff8f00
Objectif : Organiser les éléments du modèle en groupes pour simplifier les diagrammes complexes.
Éléments clés : - Paquetages (namespaces/modules) - Dépendances entre paquetages - Visibilité des éléments
classDiagram
namespace UI {
class Vue
class Controller
}
namespace Core {
class Service
class Model
}
namespace Data {
class Repository
class Entity
}
UI --> Core : utilise
Core --> Data : utilise
Diagrammes comportementaux
Les diagrammes comportementaux illustrent le fonctionnement dynamique du système :
Objectif : Décrire les fonctionnalités du système du point de vue utilisateur.
Éléments clés : - Acteurs (utilisateurs ou systèmes externes) - Cas d’utilisation (fonctionnalités) - Relations entre cas d’utilisation (inclusion, extension)
flowchart TD
User[Utilisateur] --- UC1[S'authentifier]
User --- UC2[Consulter catalogue]
User --- UC3[Passer commande]
Admin[Administrateur] --- UC4[Gérer produits]
Admin --- UC5[Suivre commandes]
UC3 -.-> UC1: <<include>>
UC5 -.-> UC3: <<extend>>
style User fill:#f9d5e5
style Admin fill:#f9d5e5
style UC1 fill:#d4f1f9,stroke:#05668d
style UC2 fill:#d4f1f9,stroke:#05668d
style UC3 fill:#d4f1f9,stroke:#05668d
style UC4 fill:#d4f1f9,stroke:#05668d
style UC5 fill:#d4f1f9,stroke:#05668d
Objectif : Modéliser les interactions entre objets dans le temps, montrant l’ordre des messages échangés.
Éléments clés : - Objets (instances de classes) - Lignes de vie et messages - Activations (périodes d’exécution) - Fragments d’interaction (alternatives, boucles)
sequenceDiagram
actor Client
participant Interface
participant Controller
participant Service
participant Repository
participant Database
Client->>Interface: saisirCommande()
activate Interface
Interface->>Controller: créerCommande(données)
activate Controller
Controller->>Service: validerCommande(données)
activate Service
alt Commande valide
Service->>Repository: sauvegarderCommande(commande)
activate Repository
Repository->>Database: insert(commande)
Database-->>Repository: confirmation
Repository-->>Service: commandeSauvegardée
deactivate Repository
Service-->>Controller: commandeValidée
else Commande invalide
Service-->>Controller: erreurValidation
end
deactivate Service
Controller-->>Interface: résultatCommande
deactivate Controller
Interface-->>Client: afficherConfirmation()
deactivate Interface
Objectif : Décrire les flux de travail, processus métier ou algorithmes avec leurs points de décision.
Éléments clés : - Actions et activités - Transitions et conditions - Bifurcations et jointures (parallélisme) - Partitions (swimlanes)
stateDiagram-v2
[*] --> ReceptionCommande
state "Traitement commande" as Process {
ReceptionCommande --> VerificationStock
state "Vérification parallèle" as fork_state
VerificationStock --> fork_state
fork_state --> VerificationPaiement
fork_state --> ReservationStock
VerificationPaiement --> join_state
ReservationStock --> join_state
state join_state <<join>>
join_state --> PreparationCommande
PreparationCommande --> Expédition
}
Expédition --> Livraison
Expédition --> [*] : Annulation
Livraison --> [*]
Objectif : Illustrer les différents états d’un objet au cours de son cycle de vie et les transitions entre ces états.
Éléments clés : - États (représentant une condition ou situation) - Transitions (changements d’état) - Événements déclencheurs - Actions et activités dans les états
stateDiagram-v2
[*] --> Créée
Créée --> EnAttente : soumettre()
EnAttente --> EnCours : accepter()
EnAttente --> Annulée : refuser()
EnCours --> Expédiée : expédier()
EnCours --> Annulée : annuler()
Expédiée --> Livrée : livrer()
Expédiée --> Retournée : retourner()
Livrée --> [*]
Annulée --> [*]
Retournée --> [*]
state Créée {
[*] --> AvecProduits : ajouterProduits()
AvecProduits --> AvecAdresseLivraison : spécifierAdresse()
AvecAdresseLivraison --> PrêteÀSoumettre : spécifierPaiement()
}
Objectif : Montrer les interactions entre objets en se concentrant sur la structure des échanges plutôt que sur leur chronologie.
Éléments clés : - Objets et leurs liens - Messages numérotés - Conditions et itérations
flowchart LR
Client -- "1: créerCommande()" --> Panier
Panier -- "2: ajouterProduit()" --> LignePanier
Panier -- "3: calculerTotal()" --> LignePanier
Panier -- "4: valider()" --> CommandeService
CommandeService -- "5: convertirEnCommande()" --> Panier
CommandeService -- "6: enregistrer()" --> CommandeRepository
Bonnes pratiques UML
- Niveau de détail adapté : Inclure uniquement les informations pertinentes pour l’audience cible
- Cohérence : Maintenir une terminologie et des conventions cohérentes entre diagrammes
- Modularité : Diviser les modèles complexes en sous-modèles plus simples
- Annotation : Ajouter des notes pour clarifier les aspects ambigus
- Évolution progressive : Commencer par des modèles simples et les affiner itérativement
Outils de modélisation UML
- Outils dédiés : Enterprise Architect, Visual Paradigm, Modelio
- IDE avec support UML : IntelliJ IDEA, Eclipse avec plugins
- Outils collaboratifs : Lucidchart, draw.io
- Langages textuels : PlantUML, Mermaid
Implémentation
- Définition: Phase de transformation des spécifications en code exécutable
- Objectif: Produire un logiciel fonctionnel selon les spécifications établies
- Résultats: Code source, documentation technique, tests automatisés
Bonnes pratiques de programmation
- DRY (Don’t Repeat Yourself): Éviter la duplication de code
- KISS (Keep It Simple, Stupid): Privilégier la simplicité
- YAGNI (You Aren’t Gonna Need It): Ne pas anticiper des besoins hypothétiques
- Separation of Concerns: Diviser le code en responsabilités distinctes
- Fail Fast: Détecter et signaler les erreurs au plus tôt
Tests et Qualité
Assurance qualité approfondie
L’assurance qualité englobe plusieurs aspects:
- Stratégie de test
- Pyramide de tests
- Couverture du code
- Automatisation
- Métriques
- Complexité cyclomatique
- Dette technique
- Taux de défauts
Gestion de projet logiciel
- Définition: Ensemble des activités de planification, d’organisation, de suivi et de contrôle d’un projet de développement logiciel.
- Objectif: Livrer un produit conforme aux exigences, dans les délais et le budget alloués.
Approches de gestion de projet
- Prédictives (plan-driven)
- Approche traditionnelle (cascade, cycle en V)
- Planification détaillée en amont
- Contrôle du respect du plan
- Adapté aux projets à exigences stables
- Adaptatives (change-driven)
- Approches agiles (Scrum, Kanban, XP)
- Planification progressive
- Inspection et adaptation continues
- Adapté aux projets à forte incertitude
Planification et estimation
- Techniques d’estimation
- Analogique: Comparaison avec projets similaires
- Paramétrique: Utilisation de métriques (points de fonction, lignes de code)
- Bottom-up: Décomposition et estimation des éléments individuels
- Expert: Jugement basé sur l’expérience
- Planning poker: Estimation collaborative et consensuelle
- Outils de planification
- WBS (Work Breakdown Structure) : Décomposition hiérarchique des tâches
- Diagrammes de Gantt (PERT, CPM) : Visualisation des dépendances et durées
- Backlog produit et planification de sprint : Liste des fonctionnalités et ordonnancement par priorité
- Story mapping : Visualisation des fonctionnalités par scénarios utilisateur
- Méthode du chemin critique (CPM) : Identification des tâches critiques
- Story mapping : Visualisation des fonctionnalités par scénarios utilisateur
Maintenance et évolution
- Types de maintenance
- Corrective: Correction des défauts
- Adaptative: Adaptation aux changements d’environnement
- Perfective: Amélioration des fonctionnalités
- Préventive: Prévention des problèmes futurs
Refactoring
Le refactoring améliore la structure du code sans en modifier le comportement externe:
- Extraction de méthode
- Simplification des conditions
- Élimination du code dupliqué
- Réorganisation des classes
La gestion des versions
La gestion des versions est un aspect crucial du développement logiciel moderne, permettant de:
- Suivre l’évolution du code source et des composants
- Coordonner le travail des équipes
- Faciliter la livraison de nouvelles fonctionnalités
- Assurer la traçabilité des changements
- Maintenir plusieurs versions du produit
Versionnement sémantique (SemVer)
- Principe: MAJOR.MINOR.PATCH
- MAJOR: Changements incompatibles avec l’API précédente
- MINOR: Ajouts de fonctionnalités compatibles
- PATCH: Corrections de bugs compatibles
- Exemples:
0.0.1: Version initiale1.0.0: Version initiale stable1.1.0: Ajout de nouvelles fonctionnalités1.1.1: Correction de bugs2.0.0: Changements cassant la compatibilité
- Suffixes additionnels:
-alpha: Version instable en développement interne-beta: Version en test externe-rc.1: Release candidate (quasi-finale)
Systèmes de gestion de versions (VCS)
- Centralisés: SVN, CVS
- Serveur central unique
- Check-out, check-in
- Risque de conflits
- Décentralisés: Git, Mercurial
- Copie locale complète
- Branches, merges, commits locaux
- Facilité de collaboration
Workflows de développement
- Définition: organisation des branches et des cycles de vie du code source
- Objectifs: Isoler les développements, faciliter les tests, garantir la stabilité
- Exemples:
- GitFlow: Branches principales (main, develop) et branches de support (feature, release, hotfix)
- Feature Flow: Branches principales (main) et branches de fonctionnalités temporaires
- Forking Workflow: Forks et pull requests pour contribuer à un projet
Intégration continue (CI) et livraison continue (CD)
- Intégration continue (CI)
- Build et tests automatiques à chaque commit
- Détection rapide des problèmes d’intégration
- Validation de la qualité du code (linting, tests unitaires)
- Livraison continue
- Package automatique en artefacts déployables
- Tests d’intégration et système automatisés
- Validation par les équipes QA
Déploiement continu (CD)
- Mise en production automatique après validation CI
- Déploiement progressif (canary, blue-green)
- Surveillance et rollback automatique si problème