![An alt text](/_app/immutable/assets/avatar.9yiIcKg-.png)
Dernière mise à jour : 16 mai 2024
Qui suis-je ?
Stéphane Klein, artisan développeur de plus de 20 ans d'expérience, basé à Montrouge, au sud de Paris.
De 2019 à 2023, j'ai occupé le poste de CTO dans une startup parisienne, que j'ai rejointe juste après son financement initial. Avec mes collègues, nous avons élargi l'équipe tech de 1 à 16 personnes au cours de deux levées de fonds successives d'environ 5 et ensuite 20 millions d'euros.
Depuis septembre 2023, je travaille sur le développement d'une application du type "knowledge management" que j'ai lancée avec trois co-fondateurs.
Contact
Vous pouvez me contacter par mail à contact@stephane-klein.info ou au 06 61 48 76 04, il est préférable de m'envoyer un SMS avant de me téléphoner.
Mes objectifs professionnels
Depuis mai 2024, je suis à la recherche de missions freelance de 4 à 8 jours par mois.
À partir de septembre 2024, il est possible que je sois à la recherche de missions de 16 jours par mois, en freelance ou en tant que salarié.
Vous pouvez consulter la liste de mes prestations en freelance.
Projets susceptibles de m'intéresser
Je suis ouvert aux missions de Contributeur Individuel ou de management, au sein de toutes petites structures ou des ETI.
Types de projets qui ne m'intéressent pas
Actuellement, les secteurs tels que les DeFi, l'AdTech et les jeux vidéo ne m'intéressent pas.
Les projets d'applications mobiles natives ne sont pas non plus dans mes recherches actuelles, bien que ce
soit un domaine qui m'intéresse, je n'ai pas encore développé de compétences spécifiques dans ce secteur.
Je ne souhaite pas manager une équipe non francophone. Le management demande de la finesse et de la subtilité en communication, en raison de mon niveau d'anglais oral, je ne me sens pas en mesure de gérer efficacement une équipe non francophone.
Domaines d'expertise
Frontend Development : JavaScript (front), ReactJS, Svelte, SvelteKit, HTML/CSS avancé, TailwindCSS, Yjs
Backend Development : Go, Python, JavaScript (back), GraphQL, REST, gRPC, Playwright, écriture basique de script Bash, Singer (ETL)
Database : SQL, PostgreSQL avancé, PL/pgSQL, SQLite, Redis, Clickhouse, Neo4j (Cypher), Metabase
DevOps : Docker, Vagrant, Postfix, Nginx, Ansible, Terraform, Grafana, Prometheus, Loki, Kubernetes, Debian/Ubuntu/RedHat, Baremetal, AWS, Scaleway, OVH, Vector (data pipeline)
Software Engineering : Git, Scrum, TDD, Lean, GitOps
Expériences professionnelles
Cofondateur — Value Props Depuis septembre 2024
Je travaille depuis septembre 2023, en mode « solo dev » sur une application du type « knowledge management » que nous avons lancée avec trois co-fondateurs.
L'objectif de cette solution est de permettre aux entreprises de présenter leur produit via tous types de supports — page web, discours, fiches produits… —, toujours à jour, qui ont été créés et mis à jour via une webapp qui organise et présente de manière dynamique toutes les données marketing ou autrement dit, « la proposition de valeur ».
Pour en savoir plus vous pouvez consulter mon article « Liste des choix technologiques du projet Value Props ».
CTO — Spacefill Avril 2019 - Juin 2023
J'ai rejoint Spacefill parmi les tout premiers employés. En tant que CTO, j'étais responsable des choix techniques, du recrutement et du management des développeurs, le tout en étroite collaboration avec le CPO — cofondateur.
J'ai commencé par développer une marketplace de stockage en entrepôt, ensuite une web application de type OMS (Order Management System) et une web API publique.
Cette web API publique permettait de communiquer avec des applications de l'univers logistique, du type WMS, OMS, TMS, ERP.
J'ai travaillé sur l'implémentation et de déploiement de nombreuses intégrations dites "EDI", concrètement des programmes (de type worker) de transfert d'information d'un système à un autre — lecture de données via Web API ou via des fichiers exposés par le protocole FTP, puis transformation de ces données et pour finir, écriture de ces données sur une Web API ou à nouveau dans des fichiers via le protocole FTP.
Quelques-unes de mes activités de manageur :
- Recrutement : rédaction et publication des fiches de postes, définition des critères de rémunérations, sourcing de candidats, tenue d'entretiens de recrutement , suivi d'"onboarding" des nouvelles recrues…
- Discussion 2 fois par mois en tête-à-tête avec chaque membre de l'équipe tech et produit — généralement sous la forme de walking meeting — afin de garder du lien, recevoir du feedback, comprendre le ressenti de chaque personne, partager ma vision, répondre aux questions, partager des conseils.
- Proposer des mises à jour des process de développement ou de management produit… pour répondre aux besoins du produit, aux difficultés et aux idées des développeurs. Mon objectif était de créer une direction commune tout en essayant d'atteindre un certain niveau de consensus.
Voici ce à quoi ressemblaient mes activités de développeur :
- Coder en React et un peu en Node.JS
- Écriture de query et mutation GraphQL
- Faire évoluer la base de données PostgreSQL
- modélisation des données (tables)
- écriture de migration de données
- écritures de triggers en pgSQL
- ...
- Écriture de fonctions PL/pgSQL pour implémenter des Queries ou Mutations GraphQL customs
- Rédiger, améliorer et commenter des issues
- Prendre soin de mes Merge Requests afin de les pousser le plus rapidement possible en production
- Faire de la revue de code
- Écrire des spécifications techniques et parfois participer aux specifications produits
- Guider les nouveaux développeurs
- Améliorer continuellement la documentation du projet
- Écrire des tests UI
- Des interventions ponctuelles DevOps (Terraform / Ansible)
- Écrire, faire évoluer quelques scripts Python
Technologies utilisées :
- Backend :
- PostgreSQL 12, utilisation de :
- du langage PL/pgSQL
- des Trigger Functions
- des extensions :
- PostGraphile (Extensible high-performance automatic GraphQL API for PostgreSQL)
- graphile-worker (Job queue for PostgreSQL running on Node.js)
- PostgreSQL 12, utilisation de :
- Frontend :
- React JS (State Hook)
- react-router
- Apollo GraphQL
- Leaflet
- Un maximum de composants "headless" couplés avec TailwindCSS (avant cela mineral-ui et Emotion)
- React Hook Form (avant cela Formik)
- ...
- Utilisation de Storybook
- React JS (State Hook)
- Testing :
- Infra As Code :
- Terraform
- Ansible
- Hosting on AWS et Scaleway Dedibox
- Ubuntu
- Docker
- Sentry
- GitLab (pour les Git repository et pour les issues et merge requests)
- GitLab Review App pour toutes les Merge Requests
- GitLab-CI
Quelques informations supplémentaires concernant le fonctionnement du backend :
L'API GraphQL était auto générée par Postgraphile qui est un serveur OpenSource écrit en NodeJS qui se connecte "au dessus" de PostgreSQL.
Cela ressemble à Hasura, Supabase ou Firebase.
Les paramétrages, adaptations pouvaient se faire soit via des commentaires sur des ressources PostgreSQL (tables, champs), soit via la création
de Views ou de functions PostgreSQL.
Les tâches qui ne pouvaient pas être effectuées par PostgreSQL, comme par exemple l'envoi de mails, la génération de PDF… sont effectuées par un "service worker", avec du code NodeJS "classique".
Méthode de travail
Nous essayions autant que possible de suivre la méthode Scrum.
Ce qui était mis en place :
- Sprints : 2 semaines
- Daily Scrum : entre 5 et 15 minutes tous les matins
- Sprint Retrospective + Sprint Planning : une après midi en fin de Sprint
- Session de Planning poker
- Scrum Team : entre 3 et 6 personnes organisées en Feature Team
- Definition of Done : un template de Merge Request de GitLab contient la checklist de notre "définition of done"
- Une journée de « Spike and learn »
Nous utilisions GitLab pour :
- la gestion des issues
- le suivi des sprints, via les fonctions milestones et boards
Tout changement dans le code ou la documentation passait par une Merge Request avec un process de review.
Devops Engineer, Product Owner — Scaleway Janvier 2018 - Avril 2019
J'ai été pendant 10 mois leader d'une petite équipe de trois personnes (Alexandre, Albert et moi) dont le but était de développer un nouveau produit IaaS de type baremetal-server as service".
Ce projet était assez technique, plutôt "bas niveau". Mon expérience en administration système du début des années 2000 chez LinBox, mes lectures des Linux Magazine et linuxfr m'ont été très utiles.
Concrètement, une application CLI
permettait de gérer tout le cycle de vie — create, login, restart, debug, destroy… — de serveurs
préalablement provisionnés et configurés en datacenter.
Cette application CLI communiquait avec un serveur central via le protocole gRPC/Protobuf.
Ces deux composants étaient développés en langage Go, avec des librairies du type gRPC, GenProto,
SQLx, Cobra/Viper, Logrus, Migrate… (ce projet date de 2018, ces librairies ne sont peut-être plus pertinentes),
la persistance était assurée par une base de données PostgreSQL et
Minio pour le stockage des images disques.
Les technologies suivantes étaient utilisées pour piloter à distance les serveurs : DHCP server, iPXE, TFTP, IPMI.
Les différentes images des systèmes d'exploitation étaient préparées avec Packer pour fournir une expérience la plus proche de celle de l'utilisation des serveurs virtuels.
Le projet était testé presque entièrement avec Vagrant, Mock IPMI with Virtualbox et quelques conteneurs Docker. Le projet était entiérement déployé en infrastructure as code, avec Ansible et quelques scripts Bash.
L'enseignement majeur que j'ai pu tirer de cette expérience est la méthode de travail en équipe que nous avons
réussie à mettre en place.
Au départ, l'inspiration m'est venu de mes observations du fonctionnement interne de chez GitLab, visible à travers
leur Handbook.
Cette méthode s'est matérialisés par un environnement de développment de qualité, un concept que je nomme "Development
Kit", et par des pratiques telles que le "Readme
Driven Development", toute action de plus de 10 minutes commencent toujours par une issue ou une
merge request, une étape de code review pour chaque Merge Request, effectuée par une personne ou plus quand le changement était impactant.
Cette méthode a eu entre autres les effets suivants : les contributions sur le projet étaient équilibrées — nous n'étions pas dans la situation où un développeur faisait 80% du travail —, très faible bus factor sur le projet, fort sentiment de possession du projet par tous les membres de l'équipe.
Je pense qu'encore maintenant, Albert et Alexandre gardent un agréable souvenir de travail sur ce projet.
Par la suite, j'ai essayé en tant que CTO chez Spacefill de construire une équipe en me basant sur cette expérience positive.
Les 6 mois suivants, j'ai rejoint l'équipe qui travaillait sur le produit "Kubernetes as a Service".
Kubernetes n'était pas nouveau pour moi, parce que j'avais travaillé sur cette technologie presque à plein temps pendant 2 ans, de 2016 à 2018 chez Tech-Angels.
Ce projet avait dépassé la phase de "prototypage", il fonctionnait et à mon arrivée, l'objectif était de finir toutes les tâches nécessaires pour le mettre en les mains des clients finaux.
Le déploiement de ce projet complexe — par nécessité — était entièrement automatisé via les outils Terraform et Ansible.
Ce projet était développé en Go et utilisait PostgreSQL.