5 points par GN⁺ 2025-03-29 | 2 commentaires | Partager sur WhatsApp
  • Un livre dans lequel Harry, auteur de "TDD with Python", et Bob, architecte logiciel, expliquent comment comprendre et maîtriser des architectures logicielles complexes
  • Il partage une synthèse de techniques d’architecture réellement utilisées dans une entreprise d’e-commerce
  • MADE.com est une entreprise européenne de vente de meubles en ligne, qui exploite une chaîne d’approvisionnement mondiale
    • Son objectif est de minimiser les stocks grâce à l’optimisation logistique, et de coordonner l’arrivée de la logistique avec les commandes des consommateurs
  • Mais le monde réel est complexe et imprévisible, ce qui les conduit à construire des logiciels intelligents qui reflètent cette réalité afin d’automatiser ces processus
  • Ce livre traite des modèles d’architecture conçus pour résoudre ce type de problèmes concrets

Pourquoi Python

  • Python est un langage en forte croissance à l’échelle mondiale et s’attaque de plus en plus à des problèmes d’entreprise complexes
  • La plupart des livres d’architecture existants utilisent des exemples en Java ou en C#, ce qui les rend moins accessibles aux utilisateurs de Python
  • Ce livre présente les modèles d’architecture classiques d’une manière adaptée à la communauté Python

Introduction au TDD, au DDD et à l’architecture orientée événements

  • TDD (Test-Driven Development):
    • Le développement piloté par les tests permet de refactorer en toute sécurité et d’ajouter des fonctionnalités plus facilement
    • Il faut privilégier des tests unitaires rapides et sans dépendances, et réduire au minimum les tests end-to-end, lents et instables
  • DDD (Domain-Driven Design):
    • L’accent est mis sur le modèle métier, mais il est important de réduire la dépendance à l’infrastructure et aux frameworks
  • Architecture orientée événements:
    • La communication par messages entre microservices permet de maîtriser la complexité
    • Il faut réfléchir à la manière de l’intégrer avec les outils Python existants comme Flask, Django et Celery

Remarque : la plupart des modèles présentés dans ce livre s’appliquent aussi à une architecture monolithique

  • L’objectif de ce livre est de présenter, en Python, des modèles d’architecture qui prennent en charge le TDD, le DDD et les services orientés événements, ainsi que leur mise en œuvre

Public visé par ce livre

  • Des développeurs ayant déjà travaillé sur des applications Python complexes
  • Aucune connaissance préalable des modèles d’architecture ou du DDD n’est nécessaire
  • L’ouvrage est conçu pour être suivi même sans habitude du style TDD, qui consiste à écrire les tests avant l’implémentation
  • Flask, SQLAlchemy, pytest, Docker et Redis sont utilisés, mais ce ne sont pas des prérequis
  • L’objectif est une conception d’architecture indépendante des technologies, et non centrée sur une technologie particulière

Aperçu du contenu d’apprentissage

Part 1

  • Modélisation de domaine et DDD (chapitres 1, 2 et 7)
    • Présentation de la manière de construire un modèle de domaine sans dépendances externes
    • Méthodes pour écrire des tests unitaires rapides et réflexion sur leur lien avec l’intégrité des données
    • Explication de la manière de choisir le bon Aggregate
  • Modèles Repository, Service Layer et Unit of Work (chapitres 2, 4 et 5)
    • Abstraction de la couche de persistance afin de séparer le modèle des dépendances externes
    • Conception d’une couche de services comme point d’entrée du système
    • Adapté à la création de points d’entrée légers comme une API Flask ou une CLI
  • Réflexions sur les tests et l’abstraction (chapitres 3 et 5)
    • Exploration des critères et du rôle dans le choix du bon niveau d’abstraction
    • Écriture de tests unitaires à un niveau d’abstraction élevé pour atteindre une pyramide de tests équilibrée

Part 2

  • Architecture orientée événements (chapitres 8 à 11)
    • Présentation des modèles Domain Events, Message Bus et Handler
    • Les interactions au sein du système sont déclenchées par des événements
    • Explication de la manière d’intégrer des microservices via les événements
    • Distinction entre commande (command) et événement (event)
    • L’ensemble de l’application évolue vers un système de traitement de messages
  • CQRS (Command-Query Responsibility Segregation) (chapitre 12)
    • Présentation de l’efficacité structurelle permise par la séparation des responsabilités entre commandes et requêtes
    • Inclut des exemples d’implémentation avec ou sans utilisation d’événements
  • Injection de dépendances (chapitre 13)
    • Clarification des dépendances explicites et implicites
    • Implémentation d’un framework simple d’injection de dépendances

Annexes et guide pratique

  • Comment l’appliquer à un projet existant (épilogue)
    • Appliquer ces modèles à un système existant est plus difficile que sur un exemple simple
    • Le livre fournit des stratégies d’application et des ressources de référence pour cela
  • Exercices de code et exemples GitHub
    • L’ensemble du contenu du livre est réuni dans un seul projet d’exemple
    • Le code est fourni chapitre par chapitre via des branches GitHub
    • Méthodes de pratique :
      • Reproduire soi-même l’application d’exemple
      • Essayer d’appliquer les modèles à son propre projet
      • Utiliser les "Exercise for the Reader" de chaque chapitre pour écrire du code d’entraînement

Astuce : il est recommandé, au début de chaque chapitre, de faire un checkout de la branche GitHub correspondante afin d’apprendre avec du code réellement fonctionnel

2 commentaires

 
xguru 2025-03-29

Il existe une édition en coréen : Architecture Patterns with Python

 
GN⁺ 2025-03-29
Avis Hacker News
  • Ce livre est une véritable mine d’or sur les patterns d’architecture. J’apprécie le fait qu’il rende le sujet facile à comprendre

    • Mais, en pratique, ces patterns peuvent engendrer des problèmes de complexité et de performances, surtout lorsqu’on utilise un framework déjà très prescriptif comme Django
    • J’ai utilisé Python dans de grandes comme de petites entreprises. Dans les grandes entreprises qui utilisent des patterns d’architecture stricts, le code est « propre » mais trop complexe et lent
    • À l’inverse, dans les grandes entreprises qui ignoraient ces patterns, le code était vraiment sale, mais la productivité était élevée. Même avec un code désordonné, on pouvait le lire, le comprendre et le modifier
    • C’est peut-être très personnel, mais j’étais plus productif dans les entreprises au code non structuré. Cela évitait les débats sur le « clean code »
  • Une partie de ce livre est très utile, surtout lorsqu’il traite de concepts qui ne sont pas limités à Python ou à un langage particulier

    • Mais d’autres parties posent problème. Cela peut être risqué quand un développeur peu expérimenté essaie de tout implémenter d’un coup
    • Par exemple, le pattern repository est généralement utile, mais dans beaucoup de cas, y compris dans les exemples du livre, il ne fait qu’ajouter de la complexité
    • La service layer et l’unité de travail sont utiles pour les applications complexes, mais dans des systèmes composés de petits services, elles peuvent devenir excessivement lourdes
    • Les design patterns, comme n’importe quel autre outil, exigent de comprendre quand il faut les utiliser et quand il ne faut pas. Le livre donne quelques conseils à ce sujet, mais cela devrait être davantage mis en avant
  • Je vois Python comme un bon langage de glue

    • Une prise de distance vis-à-vis de la mentalité OOP imposée. Une prise de distance vis-à-vis de l’idée de forcer l’encapsulation et l’héritage partout
    • Une prise de distance vis-à-vis de SOLID, du clean coding, de la clean architecture, des patterns GoF et d’Uncle Bob
    • Je suis un flux impératif ou fonctionnel, avec aussi peu d’OOP que possible
    • Quand j’utilise Python, je veux une expérience sans objets ni patterns
    • Cela ne veut pas dire que ce livre n’a aucune valeur. Il est utile pour apprendre les patterns. Mais il ne faut pas chercher à tout faire entrer dans la programmation réelle
  • Je suis développeur TypeScript, mais ce livre fait partie de mes livres d’architecture préférés. Je m’y réfère en permanence

    • J’utilise presque religieusement le pattern de fausse unité de travail / faux service pour les tests. Cela aide à simuler les services tiers
    • Je recommande de nommer les événements d’une manière spécifique au domaine. Cela résout les aspects pénibles à expliquer aux coéquipiers
    • Cosmic Python est entièrement disponible en ligne, donc facile à partager par lien. Globalement, c’est une ressource excellente et formatrice
  • J’ai commencé à écrire du Python professionnellement il y a quelques années. Je venais de Kotlin et de TypeScript, et même si le langage était facile d’accès, j’avais du mal à obtenir un couplage faible et une bonne testabilité

    • Sur la recommandation d’un collègue, j’ai acheté ce livre et je l’ai lu du début à la fin. Il m’a aidé à comprendre comment gérer la complexité dans des codebases Python complexes
    • Je ne suis pas tous les patterns, mais j’ai compris les possibilités et comment appliquer à Python l’expérience acquise avec d’autres paradigmes
    • Je le recommande vivement. Il vaut le coup
  • C’est vraiment l’un des excellents livres de programmation Python. J’ai regretté l’absence de typage statique dans le code, mais c’était un choix délibéré des auteurs

  • Merci pour le partage de cette excellente ressource

  • J’ai lu l’édition papier de ce livre il y a deux ans et demi ou trois ans. J’ai beaucoup apprécié. Il garde les tests comme sujet de premier plan et se met continuellement à jour avec chaque ajout

    • Le fait d’avoir des tests prêts, faciles à écrire et faciles à mettre à jour rend le processus de développement plus agréable. On a moins besoin d’exécuter manuellement le code pour vérifier les problèmes
    • La partie orientée événements était intéressante, mais pas vraiment pratique à implémenter dans mon travail actuel
  • Il n’y a aucune mention de Polylith. Je me demande si c’est pertinent

  • Ce livre était une excellente lecture. Je travaillais il y a trois ans dans un environnement DDD en C#/.NET, et revisiter maintenant ces concepts en Python m’aide à en distiller l’essentiel

    • Si ces sujets vous intéressent, je le recommande vivement