Développement Full Stack au Maroc
Depuis Tanger je conçois architecture, APIs, interfaces et production — le chemin le plus court d’un problème métier à un logiciel utilisable.
Le travail typique couvre plateformes SaaS, outils internes, modules ERP et applications orientées client. La pile est Laravel, React, TypeScript et PostgreSQL — choisie parce qu'elle reste maintenable après le lancement.
Chaque mission part du flux de travail, pas d'un modèle. C'est ce qui garde le produit utile six mois plus tard.
Côté backend, cela veut dire une API Laravel avec un modèle de domaine qui reflète le vrai flux plutôt qu'un squelette CRUD générique, appuyée sur PostgreSQL pour les données qui doivent rester cohérentes sous écritures concurrentes, et Redis là où une file ou un cache justifie vraiment sa complexité. Côté frontend, React en TypeScript garde l'interface honnête sur la forme des données qu'elle attend, ce qui compte dès que plus d'un développeur touche le même code.
La production fait partie du livrable, pas un ajout après coup : Docker pour que l'environnement testé soit celui qui part en production, des sauvegardes réellement restaurées et vérifiées plutôt que supposées fonctionner, et assez de logs pour diagnostiquer une panne sans deviner. BROC ServiceOS et MatarTaxi ont été construits ainsi — full stack du modèle de données jusqu'à un déploiement qu'une autre personne peut exploiter après passation.
Tous les projets n'en ont pas besoin. Si le besoin est une simple page d'atterrissage sans comptes, sans modèle de données et sans exploitation derrière, le full stack est de la sur-ingénierie, et je le dirai avant d'écrire la première ligne de code.
Problèmes métier
- Un site qui ne peut pas devenir produit : pas d'API sur laquelle construire, pas de modèle d'authentification, et aucune des bases opérationnelles — sauvegardes, logs, environnements — si bien que la première vraie demande de fonctionnalité veut dire tout reconstruire plutôt qu'étendre l'existant.
- Backend et frontend possédés par des personnes différentes sans modèle de domaine partagé, si bien que le même concept — un client, une commande, un statut — se définit deux fois et diverge dès que l'un des deux côtés change sans prévenir l'autre.
- Un lancement sans responsable de la production : personne ne surveille les taux d'erreur, aucune sauvegarde réellement restaurée et testée, et aucun plan pour la première vraie panne.
- Un produit qui ne marche que dans la tête du fondateur, sans documentation et sans second développeur capable de le reprendre si le premier est indisponible un mois.
- Des environnements qui divergent — un serveur de staging avec une version de PHP ou Node différente de la production — si bien qu'un bug qui n'apparaît que dans un environnement fait perdre une journée avant qu'on comprenne pourquoi.
- Un code où « full stack » veut en fait dire un seul framework qui fait tout mal — un script Node qui génère du HTML à la main, ou une app PHP avec jQuery collé dessus — au lieu d'une frontière claire entre API et interface.
- Aucun environnement de staging du tout, si bien que chaque changement est testé par un vrai utilisateur en production, et chaque rollback est un incident en direct plutôt qu'une étape planifiée.
Processus de développement
- Cartographier d'abord le flux — qui fait quoi, dans quel ordre, avec quelles données — puis les entités qui en découlent, puis une verticale mince déployable, plutôt qu'un lancement big-bang six mois plus tard.
- API Laravel ou Node, interface React et TypeScript, PostgreSQL pour les données qui doivent être exactes, Docker en production pour un environnement reproductible, et Redis quand une file ou un cache est réellement justifié par la charge.
- Livrer tôt sur un petit flux réel, puis étendre module par module à mesure que le prochain pan du métier se modélise, plutôt que de vouloir modéliser toute l'entreprise avant qu'un seul module tourne en production.
- Écrire le modèle de domaine avant la première migration, pour que le schéma de base soit la traduction d'un modèle convenu plutôt que son premier brouillon.
- Ajouter des health checks et des logs structurés dès le premier déploiement, pas après le premier incident, pour qu'un problème en production produise une stack trace plutôt qu'une supposition.
- Garder l'API et l'interface comme des unités déployables séparées reliées par un contrat documenté, même quand une seule personne construit les deux, pour que chaque côté puisse être remplacé plus tard sans réécrire l'autre.
- Faire tourner un environnement de staging assez proche de la production pour qu'un bug attrapé là soit un bug attrapé avant qu'un client ne le voie, pas après.
Ce que vous obtenez
- Une personne responsable de l'architecture, de l'interface et du déploiement, pour qu'un bug ne rebondisse pas entre une équipe frontend et une équipe backend qui se renvoient la faute.
- Un code structuré autour du domaine, pas du tutoriel de framework qui l'a inspiré, que des équipes au Maroc et en Europe peuvent lire et continuer d'étendre après la passation, sans réécriture.
- Les opérations de production — sauvegardes, logs, déploiements — mises en place dès le premier jour plutôt qu'ajoutées après le premier incident.
- Un seul historique git et un seul pipeline de déploiement plutôt que trois dépôts et trois façons de livrer un changement.
- Moins de passations entre des personnes qui ne partagent pas le contexte, ce qui est généralement là que le planning dérape vraiment.
- Une ligne claire entre backend et frontend qui survit même si un second développeur arrive plus tard, parce que le contrat entre eux a été conçu, pas sous-entendu.
- Des problèmes attrapés en staging au lieu d'être trouvés par un client, parce que les environnements sont assez proches pour qu'on puisse leur faire confiance.
Projets choisis
FAQ
What does a full stack developer actually deliver?
A working product: database, API, authenticated interface, deployment and the operational basics (logs, backups, environments).
Do you work with existing codebases?
Yes. I take over Laravel and React systems, stabilize them, then extend them without a rewrite unless the architecture is genuinely blocked.