À Propos de Moi

Profile

Professionnel polyvalent combinant expertise technique et créative, je suis animé par la résolution de problèmes et l'innovation technologique.

Mon parcours atypique, enrichi par des expériences entrepreneuriales, témoigne de ma capacité d'adaptation et de ma soif d'apprentissage continue.

En reconversion professionnelle, je cherche à combiner mes compétences techniques et mon expérience entrepreneuriale pour relever de nouveaux défis technologiques.

Compétences

Image vectorielle représentant un développeur en train de coder une application web sur un bureau bien rangé avec un café à côté du clavier de son pc
C1 : Réaliser un développement d'application
Partir des exigences et aller jusqu'à une application complète
Illustrations de plusieurs formules et graphiques mathématiques
C2 : Optimiser des applications
Sélectionner les algorithmes adéquats pour répondre à un problème donné
Illustration d'un réseau local comprenant de nombreux objets connectés et un cloud
C3 : Administrer des systèmes informatiques communicants complexes
Déployer des services dans une architecture réseau
une illustration d'une personne devant un écran d'ordinateur en train d'étudier des données
C4 : Gérer des données de l'information
Optimiser une base de données, interagir avec une application et mettre en œuvre la sécurité
Illustration d'une réunion entre 4 personnes autour d'une table.
C5 : Conduire un projet
Appliquer une démarche de suivi de projet en fonction des besoins métiers des clients et des utilisateurs
3 personnes autour d'une table travaillant ensemble sur un ordinateur.
C6 : Collaborer au sein d'une équipe informatique
Situer son rôle et ses missions au sein d'une équipe informatique

C1 : Réaliser un développement d'application

Partir des exigences et aller jusqu'à une application complète

Architecture API REST Spring Boot avec documentation Swagger

Architecture en couches Spring Boot et interface Swagger

Diagramme de l'architecture en couches et capture d'écran Swagger

Cette trace illustre l'architecture complète d'une API REST développée avec Spring Boot, présentant à la fois la structure en couches de l'application et son interface de documentation Swagger. Le diagramme montre l'organisation en 5 couches distinctes (Contrôleur, Service, Correspondance (Mapper), DAO, Entité/DTO) avec leurs interactions, depuis la réception d'une requête client jusqu'à l'accès aux données PostgreSQL.

La capture d'écran Swagger démontre le fonctionnement concret du point de terminaison GET /ville/{id} qui retourne les détails d'une ville (Besançon, code postal 25000) au format JSON, validant ainsi l'implémentation de bout en bout.

Architecture en couches Spring Boot et interface Swagger

Exemple d'une requête via l'interface swagger

Savoirs mobilisés

Cette réalisation m'a permis d'approfondir mes connaissances sur l'architecture en couches et les principes de séparation des responsabilités dans une application Spring Boot. Ces concepts sont cruciaux en début de développement car ils établissent les fondations structurelles de l'application : une architecture bien pensée dès le départ évite la dette technique et facilite grandement les évolutions futures.

J'ai consolidé ma compréhension des modèles DAO (Objet d'Accès aux Données) et DTO (Objet de Transfert de Données), ainsi que l'importance de la correspondance entre les entités métier et les objets de transfert. Cette séparation claire des couches est essentielle dans un contexte où l'application sera reprise par d'autres développeurs : elle garantit une lisibilité du code, une maintenabilité optimale et permet à de nouveaux intervenants de comprendre rapidement l'organisation du projet sans avoir à analyser l'ensemble du code.

L'adoption de ces patterns dès les premières phases de développement assure également une évolutivité maîtrisée : chaque couche ayant sa responsabilité spécifique, les modifications futures (ajout de nouvelles fonctionnalités, changement de base de données, évolution des API) peuvent être réalisées de manière isolée et sécurisée, minimisant les pertes de temps et facilitant le travail collaboratif.

Savoir-faire mis en œuvre

J'ai conçu et implémenté une architecture respectant les bonnes pratiques du développement Spring Boot. J'ai structuré l'application en couches bien définies : le VilleController pour exposer le point de terminaison REST, le VilleServiceImpl implémentant la logique métier via l'interface VilleServiceInterface, le VilleMapper pour la transformation entre entités et DTO, et le VilleDaoImpl pour l'accès aux données via l'interface VilleDaoInterface.

J'ai mis en place un système de correspondance robuste permettant de séparer clairement les préoccupations : l'entité Ville pour la persistance avec ses attributs (id, nom, codePostal) et le VilleDto pour les échanges avec les clients. Cette approche garantit l'encapsulation des données métier et facilite l'évolution de l'API. Sur directive de mon tuteur de stage, j'ai automatisé la création des implémentations des DTO à l'aide de MapStruct, améliorant ainsi la productivité et réduisant les erreurs de correspondance manuelle.

J'ai configuré Swagger UI pour documenter automatiquement l'API, permettant aux développeurs et clients de tester directement les points de terminaison. La capture montre le bon fonctionnement du point de terminaison GET /ville/1 qui retourne un code HTTP 200 avec les données de Besançon au format JSON, validant ainsi l'intégralité de la chaîne de traitement.

J'ai veillé à respecter les conventions REST et à implémenter une gestion cohérente des réponses HTTP. L'utilisation de PostgreSQL comme base de données de production démontre ma capacité à intégrer des technologies robustes dans un environnement professionnel. Cette architecture modulaire facilite la maintenance, les tests unitaires et l'évolutivité de l'application.

Tests d'intégration avec Testcontainers et PostgreSQL

Diagramme de l'architecture des tests d'intégration avec Testcontainers

Architecture des tests d'intégration avec Testcontainers et PostgreSQL

Ce diagramme illustre l'architecture de tests d'intégration mise en place pour valider la couche de persistance de notre application. Il présente l'utilisation de Testcontainers avec PostgreSQL, montrant comment j'ai organisé les tests unitaires (JUnit 5) pour interagir avec une base de données réelle conteneurisée.

On y voit la hiérarchie des classes de test (PersistenceTest, DaoTest, TestEntiteDaoImpl), la configuration du conteneur PostgreSQL personnalisé (PcaPostgresqlContainer), ainsi que l'initialisation automatique du schéma via des scripts SQL.

Savoirs mobilisés

Cette mise en œuvre m'a permis d'approfondir mes connaissances sur les tests d'intégration et leur importance pour valider la couche de persistance avec une vraie base de données. J'ai analysé les différentes approches possibles : l'utilisation d'une base de données embarquée HSQLDB (plus rapide mais avec une syntaxe différente de PostgreSQL) contre Testcontainers avec PostgreSQL (plus lent mais fidèle à l'environnement de production). J'ai compris les enjeux de compatibilité entre les dialectes SQL et l'importance de tester dans des conditions proches de la production.

Savoir-faire mis en œuvre

J'ai fait le choix technique d'utiliser Testcontainers avec PostgreSQL plutôt qu'une base embarquée HSQLDB, privilégiant la fidélité à l'environnement de production malgré un temps d'exécution plus long. Cette décision m'a permis d'éviter les problèmes de compatibilité syntaxique entre HSQLDB et PostgreSQL (gestion des séquences, syntaxe SQL spécifique) qui auraient nécessité des adaptations complexes des scripts d'initialisation.

J'ai conçu et implémenté une stratégie de tests d'intégration robuste en créant une classe PcaPostgresqlContainer héritant de PostgreSQLContainer que j'ai personnalisée pour répondre aux besoins spécifiques de notre projet. J'ai notamment redéfini la méthode stop() pour éviter que JUnit ferme prématurément le conteneur avant la fin de tous les tests.

J'ai structuré une hiérarchie de classes de test cohérente, avec PersistenceTest comme classe de base contenant la configuration partagée du conteneur PostgreSQL, puis DaoTest et TestEntiteDaoImpl pour les tests spécifiques. Cette organisation m'a permis de mutualiser la configuration tout en gardant une séparation claire des responsabilités.

J'ai mis en place un mécanisme d'initialisation automatique de la base de données via le fichier init-sequence.sql, garantissant que chaque exécution de test parte d'un état cohérent et prévisible. Cette approche m'a permis de valider concrètement le fonctionnement de nos DAO avec une vraie base PostgreSQL, utilisant exactement la même syntaxe SQL et les mêmes contraintes que l'environnement de production, contribuant ainsi à la fiabilité globale de l'application développée.

Amélioration de la qualité du code avec SonarQube

Diagramme de l'architecture des tests d'intégration avec Testcontainers

Tableau de bord Sonarqube

Les captures d'écran présentent l'évolution de la qualité du code du projet Procol via SonarQube, avec un suivi détaillé des métriques de qualité sur plusieurs mois (octobre 2024 à janvier 2025). Le tableau de bord montre également des métriques positives avec 72,3% de couverture de code sur les nouvelles lignes et 0% de duplication, témoignant d'une démarche d'amélioration continue de la qualité logicielle.

On observe une amélioration significative de la qualité du code : réduction drastique des mauvaises pratiques (de 41 à 6), maintien à zéro des bugs détectés, et passage du statut "Failed" à "Passed" pour la barrière qualité.

Architecture en couches Spring Boot et interface Swagger

Graphique Sonarqube présentant l'évolution de la qualité de code

Savoirs mobilisés

Lorsqu'il m'a été confié la tache de réecrire un projet historique, il m'a fallu m'assurer de respecter les bonnes pratiques d'écriture de code. Cette expérience m'a permis d'approfondir mes connaissances sur les outils d'analyse statique de code et les métriques de qualité logicielle. J'ai consolidé ma compréhension des différents types de problèmes détectés par SonarQube : bugs (défauts fonctionnels), vulnérabilités (failles de sécurité), mauvaises pratiques (code smells), et security hotspots (points sensibles à examiner). J'ai également acquis une meilleure maîtrise des seuils de qualité et de leur rôle dans l'assurance qualité d'un projet, ainsi que de l'importance de la couverture de tests et de la réduction de la duplication de code.

Savoir-faire mis en œuvre

J'ai mis en place un processus d'amélioration continue en analysant systématiquement les rapports SonarQube et en priorisant la résolution des problèmes détectés. J'ai travaillé méthodiquement sur la réduction des mauvaises pratiques, passant de 41 à 6 occurrences, en refactorisant le code pour respecter les bonnes pratiques de développement Java et en améliorant la lisibilité et la maintenabilité du code.

J'ai configuré et utilisé les profils de qualité SonarQube adaptés au projet, notamment le passage du profil 'CoCA-2.3.0' vers 'CoCA-2.3.1', démontrant ma capacité à faire évoluer les standards de qualité en fonction des besoins du projet. Cette migration a permis d'appliquer des règles de qualité plus récentes et plus strictes.

J'ai intégré SonarQube dans le workflow de développement pour assurer un contrôle qualité continu. Le suivi régulier des métriques (visible dans l'historique des analyses) témoigne d'une approche proactive de la qualité, avec des analyses fréquentes permettant de détecter et corriger rapidement les régressions.

J'ai maintenu une couverture de tests élevée (72,3% sur le nouveau code) tout en évitant la duplication de code (0%), démontrant ma capacité à écrire du code de qualité respectant les principes DRY (Don't Repeat Yourself) et accompagné de tests unitaires appropriés.

Note importante : Concernant les vulnérabilités détectées (27 au total), il est important de préciser qu'elles sont principalement liées aux versions des dépendances utilisées en interne dans l'environnement de l'entreprise. Ces versions étant imposées par les contraintes techniques et de sécurité de l'infrastructure existante, je ne peux pas les résoudre aisément sans impact sur la compatibilité système globale.

J'ai développé une approche analytique de la qualité logicielle en utilisant les graphiques d'évolution pour identifier les tendances et ajuster mes pratiques de développement. Cette démarche m'a permis de faire passer le projet du statut "Failed" à "Passed" pour la barrière qualité, validant l'efficacité de mes actions correctives.

C2 : Optimiser des applications

Sélectionner les algorithmes adéquats pour répondre à un problème donné

Sélection et optimisation d'algorithmes : LinkedList bidirectionnelle pour attributions hiérarchiques

Architecture algorithmique de la LinkedList bidirectionnelle

Algorithmes d'insertion spécialisés selon la position cible

Cette trace présente l'analyse comparative d'algorithmes et la sélection de la structure de données optimale pour gérer les attributions hiérarchiques. Face aux contraintes de maintien d'ordre strict, d'insertions en position arbitraire et de navigation bidirectionnelle, j'ai analysé plusieurs approches algorithmiques (arbres, listes simples, LinkedList) pour retenir la LinkedList bidirectionnelle comme solution la plus adaptée aux besoins fonctionnels.

Savoirs mobilisés

Cette réalisation m'a permis d'approfondir mes connaissances sur les structures de données persistantes et leur complexité algorithmique dans un contexte ORM. J'ai consolidé ma compréhension des PersistentSet d'Hibernate qui, bien que basés sur des structures O(1) en mémoire, introduisent des complexités supplémentaires liées à la persistence : lazy loading (O(n) au premier accès), dirty checking, et gestion des proxies.

J'ai également approfondi les techniques d'optimisation algorithmique dans un contexte de persistence, notamment la différence entre la complexité théorique des structures de données Java et leur complexité réelle quand elles sont gérées par un ORM avec ses mécanismes de cache, de lazy loading et de synchronisation avec la base de données.

Savoir-faire mis en œuvre

j'ai conçu une optimisation algorithmique en ne stockant qu'une direction de la relation tout en conservant la navigation bidirectionnelle. cette approche réduit la complexité spatiale (moins de stockage) et élimine les risques d'incohérence algorithmique entre les deux directions, un problème classique des structures bidirectionnelles.

j'ai implémenté trois algorithmes d'insertion spécialisés optimisés selon la position cible :

  • insertion en tête : algorithme avec gestion automatique de l'ancien élément racine
  • insertion en queue : algorithme optimisé détectant automatiquement la fin de chaîne
  • insertion au milieu : algorithme de réorganisation minimisant les opérations de liaison

j'ai optimisé les performances algorithmiques en prévenant les boucles infinies de chargement qui surviendraient avec un chargement automatique : chaque attribution chargerait son attribution supérieure, qui chargerait son attribution inférieure, créant un cycle algorithmique sans fin. cette analyse préventive évite les stackoverflowerror et garantit la stabilité algorithmique.

j'ai analysé l'impact des PersistentSet sur les performances : bien que conservant une complexité o(1) pour les opérations de base en mémoire, ces collections introduisent des coûts cachés liés à la persistence :

  • lazy loading : le premier accès peut déclencher une requête sql complète (o(n))
  • dirty checking : hibernate surveille les modifications, ajoutant un overhead constant
  • proxy management : les éléments peuvent nécessiter un déréférencement supplémentaire
Cependant, hormis le lazy loading qui joue un rôle clé dans les performances de l'application, le reste de mes recherches m'a permis de conclure que les autres coûts sont négligeable dans le cas de notre application.

j'ai optimisé les accès aux PersistentSet en utilisant des stratégies de fetch appropriées : join fetch pour les chargements anticipés nécessaires, et fetchtype.lazy par défaut pour éviter les chargements inutiles. cette approche transforme la complexité algorithmique réelle en fonction des patterns d'accès de l'application.

C3 : Administrer des systèmes informatiques communicants complexes

Déployer des services dans une architecture réseau

Architecture multi-modules Java et déploiement multi-environnements

Architecture du projet Java multi-modules PCA avec diagramme PlantUML

Arborescence du projet et diagramme des relations POM Maven

Cette trace présente l'architecture d'un projet Java multi-modules pca développé pour la DGFiP, composé d'un backend REST (pca-api) et d'un frontend (pca-ui). L'arborescence révèle une structure de déploiement complexe avec des fichiers de configuration spécialisés et des profils d'environnement différenciés (parameters-eclipse.properties, parameters-ice.properties).

Le diagramme PlantUML illustre les relations d'héritage entre les POM Maven et l'utilisation du framework interne DGFiP. Cette architecture permet une séparation claire des responsabilités entre les composants tout en maintenant une cohérence dans la configuration et le déploiement des services distribués.

Configuration des profils Maven et fichiers de propriétés

Gestion des profils et configuration multi-environnements

Savoirs mobilisés

L'architecture multi-modules illustre les principes de déploiement de services distribués dans un environnement d'entreprise sécurisé. La séparation des préoccupations entre backend et frontend permet une scalabilité horizontale et une maintenance indépendante des composants. Les profils Maven constituent un mécanisme standard pour adapter les configurations selon les environnements de déploiement (développement, intégration, production).

La configuration externalisée via les fichiers properties suit les bonnes pratiques du framework Spring Boot pour la gestion des paramètres sensibles en production. Cette approche garantit la sécurité des données et facilite la portabilité de l'application entre différents environnements sans modification du code source.

J'ai approfondi ma compréhension des architectures distribuées et de l'importance de la cohérence des configurations dans un contexte où les services doivent communiquer de manière fiable. La maîtrise de ces concepts est essentielle pour assurer la stabilité et la maintenabilité des systèmes informatiques complexes en environnement professionnel.

Savoir-faire mis en œuvre

J'ai architecturé un système de déploiement multi-environnements en implémentant une hiérarchie de POM Maven avec héritage du framework interne DGFiP. Cette structure permet une gestion centralisée des dépendances tout en conservant la flexibilité nécessaire pour adapter chaque module selon ses besoins spécifiques.

J'ai configuré la surcharge conditionnelle des propriétés (eclipse_conf --> spring_conf: surcharge si profile eclipse) permettant d'adapter automatiquement les paramètres selon l'environnement d'exécution. Cette approche évite les erreurs de configuration et garantit une cohérence des déploiements entre les différents environnements.

J'ai utilisé et adapté une stratégie de logging centralisé avec Log4j2 pour faciliter la supervision et le debugging des services distribués en production. Cette configuration permet un suivi efficace des performances et une résolution rapide des incidents dans l'environnement de production de la DGFiP.

Containerisation Docker PostgreSQL pour l'application PCA

Documentation Docker PostgreSQL - Partie 1 Documentation Docker PostgreSQL - Partie 2

Documentation technique complète pour la containerisation PostgreSQL

Cette trace présente une documentation technique complète que j'ai rédigée pour l'utilisation d'un conteneur Docker dédié à la base de données PostgreSQL de l'application PCA. Le document couvre l'ensemble du cycle de vie du conteneur : installation, configuration, démarrage, connexion, arrêt et suppression. Cette documentation s'inscrit dans le cadre du projet de refonte de l'application PCA et vise à standardiser l'environnement de développement en containerisant la couche de données.

Savoirs mobilisés

Cette expérience m'a permis d'approfondir mes connaissances en containerisation et en gestion d'environnements de développement. J'ai consolidé ma compréhension des technologies Docker et Docker Compose, ainsi que de leur intégration dans les workflows de développement.

J'ai également développé mes compétences en administration de bases de données PostgreSQL et en documentation technique, en apprenant à structurer l'information pour différents profils d'utilisateurs (développeurs débutants et expérimentés).

Savoir-faire mis en œuvre

J'ai conçu une architecture de développement containerisée en mettant en place un environnement Docker pour la base de données PCA. Cette approche permet d'isoler les dépendances, de garantir la reproductibilité des environnements et de simplifier l'inclusion des nouveaux développeurs sur le projet.

J'ai rédigé une documentation technique structurée et accessible en utilisant le format AsciiDoc pour assurer une présentation claire et professionnelle. J'ai organisé le contenu de manière logique, en suivant le parcours utilisateur depuis l'installation jusqu'à la suppression du conteneur, facilitant ainsi l'appropriation par les équipes.

J'ai intégré des bonnes pratiques de sécurité et de gestion en documentant les procédures d'arrêt propre des conteneurs, la gestion des volumes de données persistantes, et en fournissant les informations de connexion sécurisées. Cette approche répond aux exigences de sécurité du contexte administratif.

J'ai mis en place une approche pédagogique en incluant des conseils pratiques (tips), des notes explicatives et des alternatives selon les niveaux d'expérience. Par exemple, j'ai documenté le premier lancement avec et sans mode détaché, permettant aux utilisateurs de choisir l'approche qui leur convient le mieux.

J'ai anticipé les besoins opérationnels en documentant non seulement les procédures de base, mais aussi les cas d'usage avancés comme la configuration d'outils tiers (IDE Eclipse, outils de consultation SGBD) et la gestion des volumes Docker. Cette approche holistique facilite l'intégration du conteneur dans l'écosystème de développement existant.

J'ai standardisé l'environnement de développement en créant une solution reproductible qui élimine les problèmes de configuration locale et assure la cohérence entre les postes de développement. Cette standardisation contribue à réduire les temps de setup et les problèmes liés aux différences d'environnement.

J'ai facilité la maintenance et le dépannage en documentant précisément les commandes de diagnostic (comme docker volume list) et en expliquant les messages système à surveiller. Cette approche préventive réduit les interruptions de développement et améliore l'autonomie des équipes.

C4 : Gérer des données de l'information

Optimiser une base de données, interagir avec une application et mettre en œuvre la sécurité

Optimisation base de données : Mapping objet-relationnel avec JPA/Hibernate

Optimisation du mapping objet-relationnel avec JPA/Hibernate

Architecture de persistence optimisée avec JPA/Hibernate

Cette trace illustre l'optimisation d'une base de données relationnelle à travers une stratégie de mapping objet-relationnel avancée. L'architecture présente une approche optimisée du stockage des relations bidirectionnelles : seule la référence attributionSuperieure est persistée comme clé étrangère, tandis que la relation inverse attributionInferieure est calculée dynamiquement par JPA/Hibernate via l'annotation @OneToOne(mappedBy).

Savoirs mobilisés

Cette réalisation m'a permis d'approfondir mes connaissances sur les patterns de mapping objet-relationnel avec JPA/Hibernate, notamment l'utilisation optimisée des relations bidirectionnelles et les stratégies de chargement des données (lazy vs eager loading).

J'ai consolidé ma compréhension des techniques d'optimisation de base de données : réduction de la redondance, prévention des incohérences, et optimisation des requêtes SQL générées par l'ORM pour éviter les problèmes de performance comme les N+1 queries.

Savoir-faire mis en œuvre

J'ai optimisé la structure de base de données en appliquant le principe de non-redondance : plutôt que de stocker les deux directions de la relation (ce qui doublerait l'espace de stockage et créerait des risques d'incohérence), j'ai conçu une architecture où seule la référence "vers le haut" est persistée, l'ORM recalculant automatiquement la relation inverse.

J'ai mis en œuvre une stratégie de chargement optimisée avec FetchType.LAZY pour prévenir les problèmes de performance critiques. Cette configuration évite le chargement automatique des relations, ce qui est essentiel dans une structure bidirectionnelle car le FetchType.EAGER provoquerait des boucles infinies de requêtes SQL et des StackOverflowError.

J'ai conçu une interaction application-base optimisée à travers les annotations JPA spécialisées :

  • @OneToOne(fetch = FetchType.LAZY) pour la relation stockée avec contrôle du chargement
  • @OneToOne(mappedBy = "attributionSuperieure") pour la relation calculée sans stockage
  • Gestion automatique de la cohérence par l'ORM lors des opérations CRUD

J'ai optimisé les performances de base de données en minimisant le nombre de requêtes SQL nécessaires pour les opérations d'insertion. Les trois cas d'insertion (tête, queue, milieu) sont optimisés pour réduire les accès disque et maintenir automatiquement l'intégrité référentielle.

Cette approche démontre une maîtrise des techniques d'optimisation de base de données : réduction de l'espace de stockage, prévention des incohérences, optimisation des requêtes, et interaction efficace entre l'application et la couche de persistence.

C5 : Conduire un projet

Appliquer une démarche de suivi de projet en fonction des besoins métiers des clients et des utilisateurs

Modélisation UML et suivi d'exécution pour application PCA

Diagramme de classes UML pour l'application PCA avec entités de suivi

Modèle conceptuel avec entités de définition et d'exécution

La trace présente un diagramme de classes UML pour l'application de gestion de Plan de Continuité d'Activité (PCA) . Le modèle conceptuel révèle une architecture orientée métier avec des entités principales (Pca, Phase, Action) et leurs entités de suivi d'exécution (PcaActive, PhaseActive, ActionActive) qui référencent les entités de base tout en maintenant un état d'avancement.

La documentation détaille les exigences fonctionnelles : paramétrage des structures et acteurs, création séquentielle du PCA par phases, déroulement contrôlé par le responsable PCA, et génération de comptes-rendus d'exécution. Cette approche garantit une traçabilité complète du processus métier tout en répondant aux besoins de pilotage temps réel.

Documentation fonctionnelle AsciiDoc du projet PCA

Extrait du cahier des charges contenant les spécifications fonctionnelles et exigences métier

Savoirs mobilisés

La modélisation par composition d'états constitue une approche avancée pour gérer les cycles de vie complexes des processus métier. Le pattern de suivi d'exécution par entités dédiées permet de séparer la définition statique (ce qui doit être fait) de l'exécution dynamique (ce qui est en cours ou terminé). La gestion d'états par attributs conditionnels (valeurs null = en cours, attributs renseignés = terminé) répond aux besoins de pilotage temps réel des processus critiques.

Les relations de référence entre entités actives et entités de définition garantissent la cohérence entre la planification et l'exécution tout en préservant l'historique complet. Cette architecture permet une gouvernance efficace des processus de continuité d'activité et facilite la génération de rapports pour le suivi d'avancement et la prise de décision.

J'ai approfondi ma compréhension des méthodologies de suivi de projet adaptées aux besoins métier spécifiques, particulièrement dans le contexte critique de la continuité d'activité où la traçabilité et le pilotage temps réel sont essentiels pour la réussite du projet.

Savoir-faire mis en œuvre

J'ai analysé les besoins de suivi d'exécution exprimés dans le cahier des charges pour concevoir un système de gestion d'états basé sur des entités de référence (PcaActivePca, PhaseActivePhase, ActionActiveAction). Cette approche permet une séparation claire entre la définition des processus et leur exécution opérationnelle.

J'ai implémenté une logique d'état par attributs conditionnels permettant de déterminer automatiquement le statut d'avancement : "en cours d'exécution" lorsque certains attributs essentiels sont null, "terminée" lorsque les attributs de fin sont renseignés. Cette mécanisme garantit une cohérence automatique des états sans intervention manuelle.

J'ai modélisé la traçabilité complète du processus en conservant les liens vers les entités de définition tout en enrichissant les entités actives avec les données d'exécution (dates, responsables, résultats). Cette architecture facilite l'audit et la capitalisation d'expérience pour les futurs projets.

J'ai répondu aux besoins de reporting et de pilotage en structurant les entités actives pour faciliter les requêtes de suivi d'avancement et la génération des comptes-rendus d'exécution demandés par le métier, répondant ainsi aux exigences de gouvernance des processus de continuité d'activité.

Journal de bord et conduite de projet de refonte - Application Procol

Extrait du journal de bord documentant la migration JPA javax vers jakarta

Documentation des étapes de migration et justifications métier

Cet extrait du journal de bord documente la phase initiale de refonte de l'application Procol, un système historique développé il y a plus de 10 ans. La trace illustre concrètement la première étape du projet : la migration des dépendances JPA de l'ancienne nomenclature javax.persistence vers la nouvelle jakarta.persistence, ainsi que l'intégration de nouvelles dépendances métier (fr.gouv.finances.lombok.util.base.BaseBean). Cette documentation témoigne d'une approche méthodique de conduite de projet, avec un suivi précis des actions techniques entreprises et de leur justification métier. Le journal constitue un outil de communication projet permettant aux parties prenantes de suivre l'avancement et de comprendre les enjeux techniques de la refonte.

Savoirs mobilisés

Cette expérience m'a permis d'approfondir mes connaissances sur la gestion de projets de refonte applicative et les enjeux de migration technologique. J'ai consolidé ma compréhension des cycles de vie des applications et de l'importance de planifier les montées de version pour assurer la pérennité des systèmes. J'ai également acquis une meilleure maîtrise de l'évolution des frameworks de persistance et de l'impact des changements de dépendances sur l'architecture des applications existantes.

La gestion du changement technique dans un contexte de legacy applicatif nécessite une approche structurée pour minimiser les risques et maintenir la continuité de service. La documentation systématique des décisions et des modifications constitue un élément clé pour la réussite de ce type de projet complexe.

J'ai renforcé ma compréhension des enjeux de maintenance des applications historiques et de l'importance d'aligner les décisions techniques sur les contraintes budgétaires et temporelles de l'organisation, particulièrement dans le contexte administratif où la continuité de service est critique.

Savoir-faire mis en œuvre

J'ai mis en place une démarche de suivi de projet structurée en tenant un journal de bord détaillé, documentant chaque étape de la refonte avec ses justifications techniques et métiers. Cette approche m'a permis de tracer les décisions prises et de maintenir une visibilité sur l'avancement du projet pour l'ensemble des parties prenantes.

J'ai conduit une analyse préalable des besoins en identifiant les obsolescences techniques (paquets devenus obsolètes, non-conformité aux nouvelles normes de développement du service) qui justifiaient la décision de refonte globale. Cette analyse a permis de définir les objectifs du projet : faciliter les montées de version futures et améliorer la maintenabilité de l'application.

J'ai planifié la migration par étapes successives, en commençant par la mise à jour des dépendances fondamentales de persistance. Cette approche progressive m'a permis de maîtriser les risques et de valider chaque étape avant de passer à la suivante, répondant ainsi aux besoins de continuité de service exprimés par les utilisateurs métier.

J'ai appliqué une méthodologie de gestion du changement en documentant précisément chaque modification (comme illustré par le diff des imports), permettant un suivi rigoureux des transformations et facilitant les éventuels retours en arrière si nécessaire. Cette traçabilité répond aux exigences de qualité et de sécurité du contexte administratif.

J'ai établi une communication projet efficace en utilisant le journal de bord comme outil de reporting, permettant aux différents acteurs (développeurs, chefs de projet, utilisateurs métier) de suivre l'avancement et de comprendre les enjeux techniques. Cette démarche de transparence contribue à l'adhésion des parties prenantes au projet de refonte.

C6 : Collaborer au sein d'une équipe informatique

Situer son rôle et ses missions au sein d'une équipe informatique

Documentation technique collaborative avec wiki GitLab

Structure du wiki GitLab avec 21 pages organisées thématiquement

Organisation du wiki GitLab en sections thématiques

Cette trace présente la documentation technique que j'ai rédigée sous forme de wiki GitLab pour documenter l'implémentation des tests d'intégration avec Testcontainers dans notre application. Le wiki comprend 21 pages organisées thématiquement (API REST, BDD, Tests, Diagrammes, etc.) et détaille notamment l'anatomie complète d'un TestDaoImpl avec un diagramme UML explicatif.

On y voit la structure des classes de test (TestAgentDaoImpl), l'utilisation du pattern Builder (AgentBuilder), et l'architecture des tests d'intégration avec PostgreSQL conteneurisé. Cette documentation technique vise à faciliter l'adoption de ces nouvelles technologies par l'équipe de développement.

Diagramme UML détaillant l'anatomie d'un TestDaoImpl

Diagramme UML explicatif de l'anatomie d'un TestDaoImpl

Savoirs mobilisés

Cette démarche m'a permis d'approfondir mes connaissances sur la gestion documentaire et l'importance de la documentation technique pour l'adoption de nouvelles technologies. J'ai consolidé ma compréhension des enjeux de transmission des connaissances au sein d'une équipe, particulièrement dans un contexte administratif où l'innovation technologique doit être accompagnée.

J'ai également renforcé mes acquis sur les outils collaboratifs GitLab, la structuration de documentation technique, et les méthodes de vulgarisation de concepts techniques complexes pour différents niveaux d'expertise.

Savoir-faire mis en œuvre

J'ai pris l'initiative de créer cette documentation collaborative en concertation avec mon chef de service, identifiant le besoin de formaliser et partager les connaissances sur les nouvelles technologies introduites dans le projet. Cette démarche proactive témoigne de ma capacité à anticiper les besoins de l'équipe et à proposer des solutions concrètes pour faciliter l'appropriation technologique.

J'ai structuré le wiki de manière pédagogique et progressive, organisant le contenu en sections thématiques claires (Tests, BDD, API REST, Diagrammes) pour faciliter la navigation et l'apprentissage. J'ai apporté un soin particulier à la présentation à l'aide de nombreuses représentations visuelles. Un exemple est présent dans la section "Anatomie Complète D'un TestDaoImpl" et son diagramme UML détaillé qui illustre les relations entre les différentes classes et patterns utilisés.

J'ai rédigé des explications techniques accessibles, en détaillant par exemple le rôle de chaque composant : PersistenceTest pour la configuration partagée, TestAgentDaoImpl pour les tests spécifiques, et AgentBuilder pour simplifier la création d'entités de test. Cette approche pédagogique permet aux développeurs de différents niveaux de comprendre et d'adopter ces pratiques.

J'ai collaboré étroitement avec mon chef de service pour valider l'approche documentaire et m'assurer que le contenu répond aux besoins de l'administration. Cette collaboration hiérarchique démontre ma capacité à travailler en équipe, à communiquer efficacement sur des sujets techniques complexes, et à m'inscrire dans une démarche d'amélioration continue des pratiques de développement au sein de l'organisation.

Cette initiative documentaire contribue directement à la montée en compétences de l'équipe et facilite l'adoption de technologies innovantes comme Testcontainers dans un environnement administratif traditionnellement plus conservateur en matière d'innovation technologique.

Liste complète des réalisations techniques

C1 Architecture API REST Spring Boot avec documentation Swagger

Conception et implémentation d'une architecture en couches Spring Boot avec interface Swagger pour la documentation automatique

C1 Tests d'intégration avec Testcontainers et PostgreSQL

Mise en place d'une stratégie de tests d'intégration robuste utilisant Testcontainers pour valider la couche de persistance

C1 Amélioration de la qualité du code avec SonarQube

Respecter les bonnes pratiques d'écriture de code et adopter une démarche d'amélioration continue de la qualité logicielle

C2 Sélection et optimisation d'algorithmes : LinkedList bidirectionnelle pour attributions hiérarchiques

Implémentation d'une structure de données LinkedList optimisée pour gérer les attributions hiérarchiques en base de données par un service

C3 Architecture multi-modules Java et déploiement multi-environnements

Conception d'un système de déploiement multi-environnements avec hiérarchie de POM Maven et gestion des profils

C3 Containerisation Docker PostgreSQL pour l'application PCA

Mise en place d'un environnement Docker pour la base de donnée utilisée par les développeurs de l'application PCA

C4 Optimisation base de données : Mapping objet-relationnel avec JPA/Hibernate

Optimisation d'une base de données relationnelle à travers une stratégie de mapping objet-relationnel avancée

C5 Modélisation UML et suivi d'exécution pour application PCA

Conception d'un modèle conceptuel avec entités de définition et d'exécution pour le suivi de Plan de Continuité d'Activité

C5 Journal de bord et conduite de projet de refonte - Application Procol

Tenue d'un journal de bord pour documenter les actions techniques entreprises et leur justification métier

C6 Documentation technique collaborative avec wiki GitLab

Création d'une documentation technique structurée sur GitLab pour faciliter l'adoption des nouvelles technologies par l'équipe