Mots-clés : BCM, Disaster recovery, Architecture adaptée, Atelier de génie logiciel, intégration continue, tests, DevOps, …
M8: Identifier, choisir et adapter les solutions appropriées en les justifiant d’un point de vue économique, méthodologique, technologique, sociétal, environnemental, éthique, légal
Niveau avancé: En fonction des projets déterminés autour de la « Valorisation et exploitation de services numériques », savoir identifier, choisir (y‐c défendre) et adapter les solutions les plus appropriées pour les défis rencontrés
BCM Ce thème est apparu pour la première fois ce semestre lors de la conférence IT organisée par le Swiss Digital Center. Le thème était la résilience. Ce terme est extrêmement proche du BCM. J’ai découvert cette proximité avec le BCM en préparant une présentation sur ce thème : LI: BCM . Dans les deux cas, il s’agit de se préparer à une situation de crise et d’y répondre. Dans le cadre de notre travail d’étudiant, nous pouvons également effectuer une petite planification :
Disaster recovery Mon collègue Flàvio a préparé une présentation sur ce sujet: LI Disaster Recovery. Cela complétait ma présentation précédente.
Architecture adaptée
Pour réaliser l'application (projet Ceres) nous avons essayé d'appliquer au moins deux propositions de design patterns:
Repository Pattern : Le fichier reposytory.dart dans le dossier data semble implémenter ce design pattern. Le Repository Pattern permet de centraliser et d'encapsuler la logique d'accès aux données, en fournissant une interface uniforme pour interagir avec différentes sources de données (API, base de données, fichiers locaux, etc.).
Model-View-Controller (MVC) : L'architecture globale semble suivre l'un de ces design patterns, où les modèles (dossier models), les vues (dossier views) et les données (dossier data) sont séparés. Ces patterns facilitent la séparation des responsabilités et la réutilisation du code, tout en rendant l'application plus facile à maintenir et à faire évoluer.
Cependant, vers la fin du projet, nous nous sommes rendu compte que notre architecture n'était pas évolutive. Elle proposait une solution préparée par Firestore pour faciliter la connexion à la base de données.
Cependant, cette solution ne permet pas de changer librement d’opérateur. Peut‐être aurions‐nous dû opter pour une connexion universelle MVC. Plus d’informations à ce sujet sont disponibles dans le document qui a été présenté au client : Proposition de changement MVC
Voici une illustration représentative:
Tests J'ai commencé à réaliser les tests du projet Ceres en lisant la documentation officielle : https://docs.flutter.dev/testing et https://docs.flutter.dev/cookbook/testing/unit/introduction . Mon premier test était assez simple :
Suite aux modifications apportées par mon collègue, ce test a cessé de fonctionner après une fusion. J'ai donc décidé d'en faire un autre. Cette fois-ci, c'était plus compliqué :
Dans ce test j’utilise une version "fausse" de Firestore (FakeFirebaseFirestore) pour simuler une base de données Firestore. L'idée est de tester la méthode getSupplierMailById d'un objet SupplierOrdersRepository. Ce test vérifie que, lorsqu'on appelle getSupplierMailById avec un certain ID, on obtient l'e-mail correct pour ce fournisseur dans Firestore. La structure de ce test est adaptée pour en réaliser plusieurs au cas de besoin.
On commence par la méthode setUp. Ici, une instance de FakeFirebaseFirestore est créée, puis utilisée pour créer une nouvelle instance de SupplierOrdersRepository.
Ensuite, une méthode privée setupDummyFirestoreData est appelée pour ajouter des données factices à Firestore.
Test : ('test', () async {...}); définit un test individuel. Ce test appelle la méthode getSupplierMailById sur SupplierOrdersRepository avec un identifiant de test (idTest), puis vérifie que le résultat est égal à 'ceres@info.ch' en utilisant expect.
La méthode setupDummyFirestoreData ajoute des données factices à l'instance de FakeFirebaseFirestore. Elle crée un document avec l'ID 'supplier_id_test' dans la collection 'suppliers', qui se trouve elle-même dans un document de la collection 'stores'. Ce document a deux champs : 'name', qui est défini comme 'Ceres', et 'email', qui est défini comme 'ceres@info.ch'.
DevOps et Intégration continue: Au début du semestre, j'ai organisé une session de formation sur DevOps. La deuxième partie était prévue pour la fin du semestre, mais en raison d'événements imprévus, elle n'a pas pu avoir lieu. La première partie a été suivie d'un rapport : Rapport SF DevOps . Cette session a été un bon début pour le projet dans cette méthodologie. Le seul projet qui s'y prêtait était le projet Ceres : Réalisation d'une application de gestion d'entrepôt et de commandes de magasins. Il a fallu beaucoup de temps pour comprendre comment utiliser Microsoft Azure DevOps. En fait, ce n'est qu'à la fin du semestre que la première Pipline fonctionnelle a été créée. C'est pourquoi, à titre d'exercice, j'ai décidé de le faire en privé :
Cependant, un élément que nous maîtrisons assez bien est le contrôle de version à l’aide de Github. Des commits réguliers et des “merges” bien organisés sont effectués pour maintenir les versions à jour. Il nous manque encore les tests et leur automatisation. Mais nous savons que c’est possible, Hugo a préparé le premier. Je pense qu’au prochain semestre nous pourrons commencer avec beaucoup plus de connaissances à la fois théoriques et pratiques.
Docker
Pour mieux comprendre le processus DevOps, j’ai décidé de me familiariser avec un des utiles incontournables de DevOps : Docker. Pour le faire, j’ai choisi une formation LinkedIn Learning, pour laquelle j’ai obtenu un diplôme. Docker permet une normalisation des environnements de développement, réduisant le problème de "ça marche sur ma machine" en assurant une cohérence entre les environnements de développement, de test et de production. Il facilite aussi la scalabilité et l'isolation de l'application, chaque conteneur fonctionnant de manière indépendante, permettant aux développeurs de déployer et de mettre à l'échelle chaque service séparément. Cependant pour notre cas, l’utilisation de Docker je trouve que c’est une complexité inutile : pour les petits projets qui ne nécessitent pas une grande scalabilité ou une isolation stricte, l'ajout de Docker peut compliquer inutilement la configuration et le déploiement. De plus, Docker a une courbe d'apprentissage et nécessite une compréhension des images, des conteneurs, des Dockerfiles, etc. C’est une charge de travail supplémentaire pour une petite équipe ou un projet simple. Mon LI sur Docker.
Choix de technologie
Pendant la réalisation du projet Ceres, j’ai eu l’occasion de mettre en place l’automatisation de l’envoi d’e-mails. J’ai dû choisir la solution adaptée, ce qui m’a poussé à faire les recherches: “Dio”, “flutter_email” et “mailer” sont des bibliothèques différentes ayant des objectifs différents en ce qui concerne l’envoi d’e-mails à partir d’applications Flutter.
Alors, si je souhaite envoyer des e-mails à partir d'une application Flutter de manière programmatique, "mailer" est la bibliothèque la plus adaptée. Si le but est de ajouter une fonctionnalité d'envoi de courriels à l'application Flutter, "flutter_email" peut être une bonne option. En revanche, "Dio" ne doit pas être utilisé pour l’envoi d’e-mails.
https://pub.dev/packages/flutter_email_sender
https://pub.dev/packages/mailer
Une autre occasion de réfléchir au choix de la technologie était de faire une "Proposition d'architecture BI" réalisée pour CIMO. Mon rôle consistait à comparer les architectures sur site et en cloud: Proposition d'architecture BI
Atelier de génie logiciel
Mon expérience dans ce domaine est confirmée par ma participation au projet CERS. Le projet comprenait les phases suivantes :
Miro
Product Backlog
Les tests unitaires
À la fin du quatrième sprint, l'application a été remise au client. Malheureusement, nous n'avons pas eu le temps de développer et d'améliorer davantage l'application. Néanmoins, le client a reçu une application avec toutes les fonctionnalités attendues.