

2020 → 2022 · Aix-en-Provence, avec des passages à Paris, France (télétravail 75 %)
SeLoger / MeilleursAgents
Tech Lead .NET
N° 1 des portails immobiliers en France · AVIV Group (Axel Springer)
LignesBackend .NETLeadershipCloud
Faits marquants
- A repensé de zéro le référentiel géographique du groupe AVIV : données OpenStreetMap et couches maison ingérées en continu, puis servies par des read models mis à jour par événements.
- A poussé la recherche Elasticsearch de l’autocomplétion au plus haut niveau de performance, avec une pertinence fondée sur les niveaux administratifs, la phonétique et un système d’alias qu’il a introduit.
- A créé une application de démonstration en Angular qui a rendu visible le travail de l’équipe auprès des stakeholders, lors de chaque démo de sprint.
- Après le rachat de MeilleursAgents par AVIV, a fusionné son équipe Geo avec celle de MeilleursAgents et harmonisé les couches des deux mondes pour huit sites du groupe.
J’étais rattaché au site d’Aix-en-Provence, avec des passages réguliers à Paris, au sein de l’équipe Geo. Notre rôle : fournir à tous les sites du groupe la brique qui transforme ce que tape un utilisateur (« Paris 9 », « Aix », « rue de la République ») en un lieu précis sur lequel lancer une recherche d’annonces.
Un autocomplete rapide, mais figé
Historiquement, l’autocomplétion reposait sur un moteur maison développé en C# par d’anciens membres de l’équipe. Il était abouti et très rapide, avec un algorithme complexe fondé notamment sur la distance de Levenshtein. Son point faible tenait à sa conception même : il chargeait toutes les données en mémoire, ce qui le rendait très gourmand, et une fois ce cache construit, mettre à jour le référentiel devenait extrêmement difficile.
En pratique, l’équipe n’arrivait plus à le maintenir ni à le faire évoluer. Il fallait tout repenser, avec une double contrainte : garder des temps de réponse aussi bons que ceux du legacy, et pouvoir enfin mettre à jour les données sans douleur.
Repartir de zéro
Nous avons choisi de nous appuyer sur OpenStreetMap. Des scripts Python et des hooks ingéraient régulièrement les dumps OSM dans une base PostgreSQL. À ces données publiques s’ajoutaient les couches propres à SeLoger, avec des informations absentes des dumps grand public, comme le découpage des quartiers.
Tout était d’abord stocké tel quel, sous forme de données brutes. Une architecture événementielle sur AWS, avec SNS et SQS, propageait ensuite chaque changement vers des read models adaptés à chaque usage :
- PostgreSQL et sa recherche plein texte, pour certains cas
- Elasticsearch, pour l’autocomplétion
- des read models en mémoire dans des services .NET, pour les appels les plus critiques, qui répondaient en 10 ms environ.
Côté exposition, une API Gateway AWS routait chaque endpoint vers le bon service, et une partie de la logique métier vivait dans des fonctions Lambda. Le tout tournait en microservices, conteneurisés avec Docker et déployés sur Kubernetes.
Pousser Elasticsearch dans ses retranchements
L’endpoint d’autocomplétion nous a demandé le plus de recherche. Il fallait sans cesse arbitrer entre la taille des index, la pertinence des résultats et le temps de réponse. Nous avons travaillé sur plusieurs axes :
- une priorité selon le niveau administratif de chaque couche (pays, région, département, ville, quartier) pour faire remonter le bon lieu en premier
- une pertinence phonétique, pour tolérer les fautes de frappe grâce à Levenshtein
- les alias, un concept que j’ai introduit : « 9e arrondissement », « 9 arr » ou « 9ième » renvoient au même résultat.
Des tests de charge sous JMeter validaient chaque étape et nous permettaient d’ajuster la configuration avant qu’un problème n’arrive en production.
Des démos enfin parlantes
Nous travaillions en Scrum. Historiquement, l’équipe ne montrait en démo que des API et des éléments purement techniques. Les stakeholders avaient du mal à mesurer ce qui avait vraiment été fait, alors qu’une énorme quantité de travail avançait à chaque sprint.
J’ai proposé de créer une application de démonstration en Angular, branchée sur nos services, et je l’ai mise en place. Du jour au lendemain, les démos sont devenues concrètes : on tapait une adresse, on voyait les résultats apparaître et on comprenait ce qui avait changé. Les retours ont suivi, avec des félicitations régulières sur nos avancées.
La fusion avec MeilleursAgents
Après le rachat de MeilleursAgents par AVIV, mon équipe Geo a fusionné avec celle de MeilleursAgents. Nous venions de deux mondes différents. Le nôtre reposait sur l’ingestion de gros volumes de données, la mise à jour en temps réel et la rapidité de réponse. Celui de MeilleursAgents était centré sur l’enrichissement de la donnée par la data science, lui aussi largement fondé sur de l’ingestion en Python. À partir de là, j’ai travaillé autant en Python qu’en C#.
Nous avons fusionné les couches apportées par MeilleursAgents avec les nôtres, en cherchant des compromis, car chaque site du groupe avait ses propres règles. Certains ne permettaient de chercher que des quartiers, d’autres autorisaient tout, d’autres encore tout sauf les rues. Au final, le référentiel servait huit sites du groupe AVIV, dont SeLoger, Logic-Immo, Belles Demeures, MySeLogerPro, MeilleursAgents et Immowelt.
Environnement technique
- .NET Core
- C#
- Python
- PostgreSQL
- Elasticsearch
- Redis
- OpenStreetMap
- AWS Lambda
- API Gateway
- SNS / SQS
- MassTransit
- Docker
- Kubernetes
- Angular
- JMeter