Over-architecture : Pourquoi et comment l’Ă©viter ?

L’objectif de cet article est de vous prĂ©senter les pistes pour identifier l’over-architecture et ses consĂ©quences :

  • Un rapide rappel de ce qu’est l’architecture.
  • Les causes et les consĂ©quences de l’over-architecture
  • Un exemple concret chez TheCodingMachine

Qu’est ce que l’architecture chez TheCodingMachine ?

◇ L’architecture va de pair avec l’analyse fonctionnelle (spécification fonctionnelle).
L’architecture répond au “comment”, quand la spécification fonctionnelle répond à “quoi faire”.

◇ Il y a de nombreuses façons de coder, l’architecture permet de donner une cohérence au système afin de faciliter la diffusion de la connaissance de l’application.

◇ L’architecture c’est aussi le maintien et l’évolutivité de l’application, c’est-à-dire la scalabilité du code (ne pas tout écrire dans le controller)

L’architecture transmet donc une intention, elle résulte généralement par la combinaison de best practices et de plusieurs “patron de conception”.
Bref, le besoin et les dĂ©veloppeurs sont les centres d’intĂ©rĂŞts de l’architecture. La “bonne” architecture Ă©tant un concept subjectif, il est important de choisir des critères de rĂ©ussite. GĂ©nĂ©ralement, on priorise ces critères de rĂ©ussite. Quelques critères de rĂ©ussite communs:
Maintenabilité, scalabilité, rapidité d’écriture du code, performance globale de l’application.

Pourquoi parlons nous donc d’over architecting ? Pouvons-nous rendre le code “trop” scalable ? Trop maintenable ? Trop proche du besoin ?
En réalité, on parle plutôt d’une architecture qui ne correspond pas au contexte de l’application.

Machine Rube Goldberg complexe pour manger, illustrant l'over-architecture.

Définissons ensemble le contexte d’un projet chez TheCodingMachine:

Ă€ TheCodingMachine, on dĂ©veloppe gĂ©nĂ©ralement des applications pour des projets mĂ©tiers. On ne code pas des briques Ă  vocation technique, comme un framework ou un paquet open source. Les applications que l’on dĂ©veloppe sont orientĂ©es business, et ne sont pas utilisĂ©es dans d’autres contextes mĂ©tiers (c’est-Ă -dire sur d’autres projets). Nous codons aussi des applications qui sont souvent maintenues par d’autres dĂ©veloppeurs, internes ou externes Ă  TheCodingMachine. Il est donc important que l’organisation du code soit claire, concise et classique, afin que le dĂ©veloppeur suivant puisse savoir oĂą et comment chercher le bout de code en question. Il nous faut donc aussi respecter les intentions initiales, afin que le code soit cohĂ©rent. Cela ne signifie pas qu’il faut maintenir la dette technique. Si les intentions initiales ne correspondent plus au besoin, il ne faut pas hĂ©siter Ă  introduire de nouveaux concepts ou de modifier les concepts existant via du refactoring.

Dans notre contexte , l’over-architecture c’est donc Ă©crire du code rĂ©utilisable qui n’est jamais rĂ©utilisĂ©. On introduit des concepts techniques très abstraits qui ne correspondent plus au besoin. L’utilisation de ce code abstrait est plus complexe et donc, plus susceptible de bugger. Pire encore, la courbe d’apprentissage pour l’onboarding d’un dĂ©veloppeur ou pour la transmission de connaissances est immense. On est tous tombĂ© sur un projet oĂą “Je comprends rien Ă  ce projet”, “Je ne sais pas par oĂą commencer pour chercher”
D’expérience, il y a au moins trois raisons pour lesquelles un développeur veux écrire du code réutilisable:

giphy

â—‰ La première, le dĂ©veloppeur (ou l’architecte) prĂ©voit une abstraction pour une fonctionnalitĂ© potentielle, “au cas où”. DĂ©jĂ  qu’il est rare que le besoin final soit le mĂŞme que celui initialement prĂ©vu (c’est pour ça qu’on essaie d’être “agile”), il est encore plus rare qu’un besoin potentiel se concrĂ©tise. Cette prĂ©paration au besoin future a un coĂ»t, alors qu’elle ne bĂ©nĂ©ficie pas au projet. Dans un forfait, ce coĂ»t n’est pas forcĂ©ment amortit. De plus, mĂŞme si ce besoin se concrĂ©tise, les techniques, outils, ont Ă©voluĂ© entre temps. Cela ne signifie pas qu’il ne faut pas prendre du recul sur votre code, au contraire, je vous conseille de rester “agile”, c’est-Ă -dire d’itĂ©rer sur votre code au fil du besoin. RĂ©pondez Ă  la feature spĂ©cifiĂ©e, prenez du recul lorsque la “feature potentielle” se concrĂ©tise et faites du refactoring Ă  ce moment. Il est donc important de comprendre le mĂ©tier pour proposer l’équilibre entre complexitĂ© et rĂ©utilisabilitĂ©. Nous ne pouvons pas prĂ©dire le futur, alors pourquoi Ă©crire du code qui gère tous les scĂ©narios. Par contre, il est possible d’analyser le passĂ© et d’architecturer un code qui correspond aux fonctionnalitĂ©s spĂ©cifiĂ©es et aux fonctionnalitĂ©s existantes. N’essayez pas de caler votre architecture sur celle d’Amazon, de Google, de Netflix. Leurs besoins sont spĂ©cifiques et ils ont besoin de couvrir bien plus de scĂ©narios que nos projets classiques. (bien que tout aussi passionnant).

â—‰ Deuxième raison, le dĂ©veloppeur ou l’architecte essaye d’être state-of-art, de montrer son savoir-faire. Il fait donc un dĂ©coupage du code très imposant, de manière Ă  respecter certains principes d’architecture parfaite (comme les principes SOLID). Il pose des bases techniques très rĂ©utilisables dans l’application. Pour faire simple : il Ă©crit un framework dĂ©diĂ© au projet. Plus le code est rĂ©utilisable/extensible, plus il est long Ă  Ă©crire et plus il est sujet aux bugs, donc plus la maintenance est coĂ»teuse. Trop de dĂ©coupage signifie aussi plus de friction entre les composants de l’application, c’est-Ă -dire plus de bug lors de leur assemblage. Modifier et comprendre un code rĂ©utilisĂ© (et donc configurable) de manière transverse dans l’application est très difficile lorsqu’on ne l’a pas mise en place. Une bonne manière d’apprĂ©hender ce raisonnement est le principe KISS (Keep It Simple, Stupid) et relaxez-vous, personne ne vous juge (mĂŞme votre reviewer de PR). C’est de la responsabilitĂ© du framework (et des paquets utilisĂ©s) d’être flexible. Si vous tenez Ă  Ă©crire un code flexible, crĂ©er votre propre paquet open source ou proposez ces features aux dĂ©veloppeurs du framework en question (en bonus, avec une petite PR sur ce framework).

◉ Et pour finir, c’est toujours plus fun d’écrire du code configurable, réutilisable et extensible par les autres développeurs. Cette envie, je l’ai tous les jours. Dans ce cas, intéressez-vous à l’open source, aidez à la maintenance des projets. En plus d’apprendre, votre code sera vraiment utilisé par des centaines voire milliers de développeurs.

J’aimerais finir par ajouter que la complexité n’est pas un problème, tant que cette complexité est nécessaire au projet.

RĂ©cemment, j’ai rĂ©ouvert un de mes anciens projets qui, avec du recul, est victime d’over-architecture. L’objectif du projet Ă©tait d’exporter certaines entitĂ©s de la base de donnĂ©es vers une archive contenant un ensemble de fichiers json. Cette application est dĂ©veloppĂ©e avec un framework MVC. Pour cet article, vous pourrez observer trois approches diffĂ©rentes:

Avec une approche “Quick And Dirty”:

Les dangers de lover architecture chez TheCodingMachine Google Docs

Ici, tout est codé directement dans la Commande ou dans le Controller. Cette approche a l’avantage d’être facile à coder et à comprendre, par contre, il y a énormément de duplication de code entre la commande et le controller. De plus, plus il y a de type d’entités à mapper, plus le code au sein du controller (et de la commande) grossit. Avec un petit peu de refactoring, nous arrivons facilement à:

Les dangers de lover architecture chez TheCodingMachine Google Docs 1

Ici, le code est scalable pour le besoin (l’ajout de nouvelle entité à exporter ne fait pas grossir le use case) et le code d’export est réutilisable dans d’autres contextes. Le code est donc mutualisé entre le controller et la commande d’export. Cette architecture est suffisante pour le besoin et assez rapide à développer. Cette architecture représente donc, à mon sens, celle qui doit être réalisée. Celle qui a été développé pour le projet est une architecture proche des principes SOLID, poussée à l’extrême:

Les dangers de lover architecture chez TheCodingMachine Google Docs 2

Ici le code est abstrait, rĂ©utilisable dans d’autres projets, extensible pour des nouveaux besoins. Par contre, la mise en place de l’architecture est coĂ»teuse, difficile Ă  maintenir et difficile Ă  comprendre. Pire encore, le code n’a jamais Ă©tĂ© Ă©tendu, et aucune nouvelle fonctionnalitĂ© liĂ©e Ă  ce dĂ©veloppement a Ă©tĂ© dĂ©veloppĂ©e. Bref, le temps de mise en place par rapport au cas prĂ©cĂ©dent a Ă©tĂ© perdu. N’oublions pas, les bonnes pratiques n’ont pas d’impact si aucun dĂ©veloppeur n’utilise ou Ă©tend votre code.

giphy

Pour conclure cet article:
◇ Personne ne prête attention à votre code si personne n’utilise votre code
◇ Des architectures pour votre projet, pas pour le projet qu’il pourrait devenir
â—‡ Refactorez au fil du besoin
◇ Soyez agile, itérez sur le code, sprint par sprint
◇ Restez simple, “keep it simple”

Publié le 18 octobre 2022


Suivez-nous pour recevoir le meilleur de l'info Tech.

Un mail par mois avec nos derniers articles. Tout simplement.

Articles similaires TAG