IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

3 solutions au problème des 3 couches: le développeur Ophir Lojkine propose d'éliminer la complexité accidentelle et la duplication des efforts
En choisissant la technologie adaptée à chaque problème

Le , par gayepej

14PARTAGES

18  0 
Pourquoi il faut repenser l’architecture logicielle pour les développeurs solo et les petites équipes,
Yurii Rashkovskii estime que le modèle à trois niveaux freine le développement d’applications web

Dans un billet, Yurii Rashkovskii, un développeur et entrepreneur, a critiqué le modèle d’architecture logicielle à trois niveaux (base de données, backend et frontend), qui est souvent utilisé pour développer des applications web. Il affirme que ce modèle impose aux développeurs de nombreuses tâches fastidieuses et répétitives, qui les empêchent de se concentrer sur l’innovation et la création de nouvelles fonctionnalités pour les utilisateurs.

Yurii Rashkovskii a donné l’exemple d’ajouter une catégorie à chaque article de blog, qui semble être une chose simple à faire, mais qui nécessite en réalité de modifier le schéma de la base de données, les définitions des structures de données, les requêtes, les validations, les composants d’affichage, les tests et la synchronisation entre les trois couches. Il souligne que chaque couche et leur intégration occupent beaucoup de temps et d’énergie aux développeurs, qui doivent souvent répéter les mêmes opérations dans des langages et des environnements différents.

Il souligne également que ce modèle entraîne des inefficacités pour les utilisateurs finaux, qui doivent subir des temps de chargement plus longs et des fonctionnalités limitées. Il suggère qu’il faut repenser l’architecture logicielle pour la rendre plus simple et plus efficace.

Il suggère de repenser l’architecture logicielle pour la rendre plus simple et plus efficace. Il propose d’éliminer les couches intermédiaires inutiles et de réduire le nombre d’opérations à effectuer pour ajouter une nouvelle fonctionnalité. Il affirme que cela permettrait aux développeurs de se libérer des contraintes du modèle à trois niveaux et de se concentrer sur la valeur ajoutée pour les utilisateurs.

La perspective de Yurii Rashkovskii

Trois est un nombre magique. C'est le nombre de choses que nous pouvons garder à l'esprit sans perdre notre concentration. Donc, logiquement, une architecture logicielle à trois niveaux (base de données, backend et frontend) est un excellent modèle.

N'est-ce pas ? Nous le pensions aussi.

Alors pourquoi la création d'une fonctionnalité prend-elle autant de temps ?

En tant qu'ingénieurs, responsables techniques et développeurs, nous nous retrouvons souvent embourbés dans les complexités de la « plomberie » des applications.

Le modèle à trois niveaux impose aux développeurs un éventail de trivialités chronophages. Du mélange incessant d'octets entre les trois couches à la définition fastidieuse des structures de données trois fois, nous luttons contre la surcharge de synchronisation entre différentes bases de code tout en nous efforçant d'optimiser les performances, de gérer les modifications de schéma de base de données et de maintenir la cohérence des données.

Cela nous laisse aspirer à plus de temps pour innover et créer de nouvelles fonctionnalités intéressantes pour nos utilisateurs.

Maintenant, c'est logique : nous avons perdu de vue que même dans une architecture claire à 3 niveaux, il y a plus de trois choses à considérer. Nous, développeurs solo et petites équipes, devons toujours réserver un espace mental aux questions non techniques, telles que les utilisateurs, leurs besoins et la communication. Et même dans le domaine technique, avoir trois couches bien séparées nous oblige encore à penser à deux autres choses : la communication et la synchronisation entre les couches consécutives.


En regardant l'architecture à trois niveaux, nous pouvons voir comment chaque niveau et leur intégration nous occupent. Disons que vous avez une petite application de blog et que vous souhaitez ajouter une « catégorie » à chaque article de blog. Cela ressemble à une chose simple à ajouter. Mais si vous suivez toutes les bonnes pratiques typiques du développement web moderne, voici ce que vous devrez probablement faire :
  • Écrivez une migration de schéma de base de données qui crée la nouvelle structure de catégorie de publication dans la base de données. Éventuellement, écrivez une migration "vers le bas" qui la supprime pour pouvoir annuler vos modifications rapidement si nécessaire.
  • Mettez à jour vos définitions de structure Go, vos classes Java ou toutes les définitions de structure spécifiques au langage backend que vous utilisez, en conservant idéalement la compatibilité avec l'ancien et le nouveau schéma de base de données. Écrivez des tests unitaires backend pour les fonctions qui gèrent cette nouvelle structure de données.
  • Écrivez de nouvelles requêtes de base de données et documentez les modifications dans vos réponses API.
  • Mettez à jour les types TypeScript dans votre interface pour ajouter le nouveau champ, tout en conservant la possibilité d'analyser les réponses du backend avec et sans le champ. Écrivez des tests unitaires pour cette logique.
  • Mettez à jour vos composants React pour afficher la catégorie de la publication.
  • Assurez-vous que la validation des données pour la catégorie est cohérente sur toutes les couches.
  • Rédigez un test d'intégration pour vous assurer que le nouveau code sur chacune des trois couches fonctionne correctement avec le reste du système.
  • Synchronisez le déploiement des mises à jour entre le schéma de base de données, le backend et le frontend. Si plusieurs équipes travaillent sur le projet, assurez-vous qu'elles sont toutes sur la même longueur d'onde quant au moment et à la manière dont le déploiement aura lieu.

En fin de compte, ce qui n'est qu'une minuscule ligne de texte en haut des articles de blog pour les utilisateurs devient une tâche ardue, représentant des dizaines d'heures de travail d'ingénierie à mettre en œuvre.

Cette inefficacité s'étend aux utilisateurs finaux. Mélanger des octets entre plusieurs couches a un coût : latence du réseau, sérialisation et désérialisation des données, etc. Difficile de convaincre les gens qu'il est normal de charger un post sur Reddit, qui ne contient pas plus de quelques octets d'informations utiles, pour prendre des dizaines de secondes sur leur connexion 3G de vacances. Il est également difficile d'expliquer pourquoi nous ne pouvons pas faire quelque chose d'insignifiant pour l'utilisateur car cela prendrait trop de ressources.


Comment en est-on arrivé à l'architecture à trois niveaux ?

Yurii explique que ce modèle est né de la volonté d’optimiser la division du travail et de réduire la complexité des applications web, en permettant d’atteindre l’excellence dans chaque fonction spécialisée. Il reconnaît que ce modèle peut être adapté aux grandes organisations avec des équipes spécialisées, mais qu’il est contre-productif dans les petits contextes. Il souligne également que ce modèle entraîne des cycles de livraison plus longs à cause du surcoût de synchronisation et de communication entre les différentes parties du système.

Citation Envoyé par Yurii Rashkovskii
La spécialisation est excellente lorsque vous avez un tapis roulant. Cela implique que vos entrées et sorties sont stables, prévisibles et que votre timing est défini. Les petites organisations et les développeurs individuels peuvent ne pas avoir un tel luxe. Au lieu de cela, ils peuvent bénéficier de la capacité de réagir et de s'adapter plus rapidement. Ainsi, plus leur cycle d'expédition est court, mieux c'est.
Il a rappelé les solutions alternatives que les développeurs ont adoptées pour atténuer les problèmes du modèle à trois niveaux. Il cite notamment :
  1. Les outils no-code : des outils comme Budibase qui permettent de construire rapidement une application complète sans avoir à écrire de code. Mais ces outils sont souvent inflexibles et difficiles à maintenir sur le long terme. Ils ne sont pas adaptés aux applications qui doivent évoluer et grandir dans le futur sans avoir à être réécrites entièrement. Ils ne permettent pas non plus de bénéficier des avantages des logiciels modernes de gestion de version. De plus, peu d'outils no-code sont intéressés par le fait de faciliter la sortie de leur plateforme.
  2. Le backend as a service (BaaS) : des services comme Firebase qui fournissent des backends pré-faits et standardisés, qui suppriment une grande partie du travail de duplication sur la base de données et le backend et qui accélèrent considérablement le développement des applications. Cependant, ces services sont souvent conçus pour retenir leurs utilisateurs captifs. Ils rendent le développement local difficile. Ils rendent l'application moins autonome et plus coûteuse à héberger, déployer et maintenir. Beaucoup de ces BaaS finissent par être abandonnés ou rachetés, obligeant tout le monde à réécrire leur code pour utiliser autre chose. Et même quand tout se passe bien avec le fournisseur, il faut quand même gérer la synchronisation entre le frontend et le BaaS.
  3. Les serveurs web database-over-HTTP : des outils comme PostgREST et Hasura GraphQL qui exposent une base de données sur HTTP. Ils réduisent énormément le travail des développeurs sur le backend, tout en étant assez légers, faciles et peu coûteux à déployer. Mais ils ne résolvent qu'une partie du problème. Leur objectif n'est pas d'être une approche suffisante pour construire une application complète, et ils nécessitent toujours de passer du temps à synchroniser le code du frontend et la structure de la base de données. On ne peut pas faire grand-chose de plus pour répondre à une requête web que de représenter le contenu de la base de données tel qu'il est, sans traitement, mais en JSON.

Mais Yurii n'est pas satisfait des solutions existantes

Nous considérons toutes les solutions mentionnées ci-dessus comme des pas dans la bonne direction, mais nous ne sommes toujours pas satisfaits de l'état des
...
La fin de cet article est réservée aux abonnés. Soutenez le Club Developpez.com en prenant un abonnement pour que nous puissions continuer à vous proposer des publications.

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de yahiko
Rédacteur/Modérateur https://www.developpez.com
Le 08/08/2023 à 18:22
J'ai quand même l'impression que cela fait un moment que l'industrie du logiciel a conscience du tort qu'à fait le modèle MVC aux applications.
La Clean Architecture est une solution élégante et relativement efficace du point de vue de la mise en œuvre, et répond à la fois à la problématique du couplage et de la redondance du modèle tel qu'évoqué dans l'article.
Dommage que l'auteur n'en parle pas et que pour palier les inconvénients du MVC, il sous-entend utiliser la méthode R.A.C.H.E.
4  2 
Avatar de Aspartame
Membre confirmé https://www.developpez.com
Le 09/08/2023 à 22:36
Et Omnigres, un outil sur lequel lui-même il travaille
...

ceci explique cela non ?
1  0 
Avatar de Zulut
Candidat au Club https://www.developpez.com
Le 09/08/2023 à 0:30
Je trouve que cette approche Database-first a l'avantage de la simplicité, souvent gage de qualité. Elle permet un développement rapide sur une seule couche. Pour autant, l'idée d'un mapping automatique s'appuyant sur du sql est ancien et plus ou moins abandonné (voir Access), ce qui me fait me poser la question : est-ce judicieux de s'appuyer sur du sql?

L'inconvénient que je vois est le manque d'evolutivité, maintenabilite et reutilisabilité par rapport à une approche objet (design patterns VS stockage des fichiers SQL...)

Ne serait il pas envisageable d'avoir une approche object-first simplifiée au maximum? avec par exemple uniquement des pojo java accompagnés de mappings ou annotations simples (style orm et gui)? L'avantage évident serait un meilleur design, tout en permettant un développement rapide sur une seule couche (objet).

Cependant, je suis d'accord pour dire que l'approche database first est plus concise car elle évite d'avoir une couche intermédiaire objet.

Au final, les 2 approches me plaisent bien même si, dans un context d'application simple, j'ai tout de meme une légère préférence pour celle qui me permet une plus grande créativité (car on sait jamais, l'application simple peut grandir! 😁
0  0 
Avatar de walfrat
Membre émérite https://www.developpez.com
Le 09/08/2023 à 12:22
Et bien tout d'abord, merci pour ce retour de message, on se voit bien confirmer que le MVC n'était pas le sujet central de la discussion.

Je pense qu'il y a un petit manque de recul déjà sur pourquoi une grosse majorité fait comme cela aujourd'hui ? A savoir trois couches chacunes une part de développement importante malgré le découpage en responsabilité.

Je veux dire par là : faire une application avec une IHM légère, c'est ce qu'on faisait dans les années 2000 avec principalement du PHP qui pissait du HTML.

Je vois plusieurs éléments de réponses :
  • Des exigences accrus en matières d'ergonomies
  • Des exigences accrus en termes de temps de réponses de l'application
  • Des exigences accrus en termes de sécurité
  • Les gros : GAFAM, Deezer , Spotifity qui y vont tous de leur bonne recommandant sur comment ils ont fait.


Sur l'ergonomie : cela limite l'utilisation d'application type PHP/HTML/CSS et peu de JS comme à l'époque car il faut des composant graphiques beaucoup plus riche.
Sur les temps de réponses : cela tend à diminuer le volume globale d'échange entre le client et le serveur a profit d'une API plus riche et détaillée pour chaque opération, ce qui fait donc "grossir" le code du client et du serveur.
Sur la sécurité : cela complexifie et fait encore une fois gonfler le code a tous les niveaux.
Les gros : Les conseils qu'ils donnent sont réel et efficaces, mais il faut comprendre qu'ils font des sites web pour des millions de personnes, et donc pour cela, il faut encore potentiellement complexifier et grossir le code du client/serveur pour le supporter correctement.

Pour savoir quoi faire ou pas, il faut donc déjà que le développeur comprenne quel sont les exigences sur son applications: s'il y a un gros besoin en ergonomies, il n’échapperas sans doute pas à un frontend riche.
Sur le côté performance, beaucoup de conseils de ces dernières années sont tournés vers le mobile, si tu en fais, c'est cool t'as plein de conseils lié à ça, si ton projet n'est clairement pas adressés aux mobiles, il faut faire la part des choses pour ne pas complexifier le code inutilement.

Là où je coince sur les solutions avancés dans cet article c'est notamment sur les exigences de sécurités : si on considère que la "petite équipe" ou "développeur seul" va devoir faire un site web exposé sur internet, tu vas forcément te retrouver avec une couches d'authentification/sécurité et d'ergonomies (parce que tu peux pas vraiment faire un truc style années 90 en termes d'ergonomies aujourd'hui pour les utilisateur) et du coup tel que c'est exposé ici dans l'article je ne vois que la catégorie des applis avec du templating côté serveur qui peut faire potentiellement l'économie d'un frontend riche.
0  0 
Avatar de psykokarl
Membre confirmé https://www.developpez.com
Le 09/08/2023 à 17:25
Citation Envoyé par walfrat Voir le message
Là où je coince sur les solutions avancés dans cet article c'est notamment sur les exigences de sécurités : si on considère que la "petite équipe" ou "développeur seul" va devoir faire un site web exposé sur internet, tu vas forcément te retrouver avec une couches d'authentification/sécurité et d'ergonomies (parce que tu peux pas vraiment faire un truc style années 90 en termes d'ergonomies aujourd'hui pour les utilisateur) et du coup tel que c'est exposé ici dans l'article je ne vois que la catégorie des applis avec du templating côté serveur qui peut faire potentiellement l'économie d'un frontend riche.
Je vois la chose comme une interface graphique SQL, un peu comme le propose un phpMyAdmin, mais d'avantage orienté utilisateur final que administrateur :

  • une interface graphique plus sexy, légèrement customisable.
  • des droits d’accès en lecture/écriture géré par le SGBD
  • utilisation systématique de vue/tables virtuelles
  • utilisation systématique de procédure stockées
  • génération de code automatique niveau back : repository, DTO avec les types basés sur le schema bdd (nom procédure stockée, nom de table, type des colonnes, etc => donc pas de redondance).
  • proposition d'une api qui va bien.
  • etc...

Il y a matière a faire pas mal de chose. Les questions que je me poserai tourneraient d'avantage de la scalabilité, de la gestion des requetes en asynchrone, etc, qui devront probablement être géré par le backend de toute façon.
La techno est présentée comme un outil pour développeur solo, ou une très petite équipe. Je ne vois pas le développeur solo créer un site à fort traffic. Ça peut faire le boulot pour un outil interne, pas forcément en ligne, si il fait fait bien ce qu'on lui demande.
Il y a même moyen que le projet soit repris pour des sites à fort traffic dans un second temps. Si l'aspect bdd est gérée de façon optimale des outils backend seront développés pour gérer les limitations de l'outil.
0  0 
Avatar de psykokarl
Membre confirmé https://www.developpez.com
Le 09/08/2023 à 11:36
Citation Envoyé par Zulut Voir le message
L'inconvénient que je vois est le manque d'evolutivité, maintenabilite et reutilisabilité par rapport à une approche objet (design patterns VS stockage des fichiers SQL...)
L’inconvénient vient principalement du manque de connaissance du langage SQL et de la confusion générale entre le langage (le SQL) et le moteur de stockage/recherche qui tourne en arrière plan (qui pourrait être n'importe quoi). Niveau évolutivité, maintenabilité, évolutivité, le SQL propose avant tout de restituer les données demandées, sous la forme demandée. Le SQL est quasiment le langage le langage de mapping ultime.
Le problème du SQL est qu'il ne permet pas réellement de choisir l'algo de stockage et/ou de recherche et encore moins de le créer. Les techniques d'optimisation de recherches sont peu élégantes, ce qui ne manquera pas d'en rebuter. Les algos qui tournent en arrière fond ne sont pas forcément pertinent pour le type d'utilisation souhaité. Cela explique intérêts pour les SGBD non relationnel.
0  1 
Avatar de gayepej
Membre du Club https://www.developpez.com
Le 09/08/2023 à 22:08
Citation Envoyé par psykokarl Voir le message

Les questions que je me poserai tourneraient d'avantage de la scalabilité, de la gestion des requêtes en asynchrone, etc, qui devront probablement être géré par le backend de toute façon.
Pour le passage à l'échelle, il y a plusieurs aspects à prendre en compte:

  • La performance. Pour cela, il n'y a pas vraiment à s'inquiéter. SQLPage est écrit en rust, et on peut compter sur un gain de performance d'au moins ~10x par rapport à quelque chose écrit à la main en python, par exemple. SQLPage propose en plus une version serverless, pour un passage à l'échelle horizontal quasiment infini à très faible coût.
  • La sécurité et la gestion des permissions. La plupart des questions de sécurité de base ne se posent pas vraiment avec SQLPage, et on peut utiliser le composant authentification pour gérer les permissions.
  • La gestion de la complexité. Ici, je conseillerais de passer sur d'autres technologies progressivement, en gardant la même base de données, au fur et à mesure que les besoins en interface graphique et en logique métier se complexifient et deviennent difficile à gérer en SQL avec les composants fournis par SQLPage. Comme l'outil n'impose pas de structure de base de données, il joue très bien avec n'importe quel autre backend qui se connecte à la même base de données. Et pour le frontend, on peut commencer par développer un composant react à l'intérieur de SQLPage avant de migrer vers un front entièrement en javascript, par exemple.
0  1