Vibe Coding : Ce que j’ai appris en tant que Manager en développant Nmilat.ma

Nmilat.ma est un projet qui me tient à coeur. Non seulement, parce que je suis une mordue du shopping en ligne, mais aussi, et surtout, parce que le-commerce marocain est riche et nous n'en tirons toujours pas parti. Beaucoup de personnes apportent leur brique depuis une vingtaine d'années mais, à ce jour, il est toujours impossible de rechercher facilement les produits des sites e-commerce marocains à partir d'un moteur de recherche unique. C'est là qu'intervient Nmilat. Ce projet a pour ambition de combler ce vide en offrant une solution simple et efficace pour explorer le paysage du e-commerce marocain. Il se veut d'être une référence des sites e-commerce au Maroc mais pas que. En effet, il a pour vocation d'abriter dans sa fourmilière des milliers de sites e-commerce au Maroc mais aussi d'en faciliter la navigation.
1. Concept
Avant de démarrer Nmilat, j'avais commencé par élaborer le concept. Mila Nmila est une fourmi qui explore minutieusement le web à la recherche des meilleures trouvailles. Mila n'est pas seule. Avec ses amies Nmilat, elles ont à elles parcouru des milliers de sites, allant même à les tester aussi souvent que leur carte bancaire leur a permis. Leur mission : repérer les tendances, dénicher les bons plans, les designers émergents et s'assurer que chaque produit mérite une place sur notre plateforme. En plus de cela, Nmilat a à cœur de mettre en lumière la créativité des créateurs marocains, en soutenant l'innovation locale et en valorisant les produits Made in Morocco.
J'ai d'abord fait mes maquettes sur Canva :


2. Démarrage
Une fois le concept de Nmilat bien défini, la prochaine étape a été de concrétiser ce projet. Pour cela, je suis venue discuter de l’approche avec ChatGPT. Claude était sympa aussi, mais ChatGPT était plus enthousiaste. Ensemble, nous avons exploré les différentes options et défini le stack technique, en nous appuyant sur les outils que je maîtrisais déjà. Cette phase de réflexion a été essentielle pour poser les bases solides de la plateforme, tout en assurant que le développement serait aligné avec la vision du projet. Nous avons finalement choisi d'utiliser Django et Python, un choix qui s'est imposé naturellement grâce à leur robustesse et à ma familiarité avec ces technologies.
Cela fait maintenant plusieurs années que je n'ai pas codé moi-même. Aujourd'hui, je dirige des équipes techniques, un rôle devenu une véritable vocation. J'ai la chance d'exercer un métier qui permette de transformer des idées en projets concrets, de rassembler des équipes autour d'une vision commune et de les accompagner dans leur développement. En tant que manager, je me suis toujours sentie comme l'agent des développeurs. Là, pour les accompagner et leur permettre d'être les stars qu'ils sont. L'objectif a toujours été d'aider chacun à évoluer tout en répondant aux besoins business, en trouvant des solutions qui allient efficacité et innovation.
Ce qui m'a le plus manqué dans le code, c'est ce pouvoir de réaliser les choses moi-même, sans avoir à créer un ticket ou à implorer quelqu'un de le faire, et de le faire correctement, comme faveur.
J'ai installé VSCode (que je n'aime pas particulièrement, mais trop de flemme d'installer autre chose). J'ai donc démarré. Un projet, un modèle, une vue, un super utilisateur et un git local.

D'avoir été de la génération qui a utilisé StackOverflow et m'être faite grillée à plusieurs reprises, je peux vous dire que c'était un plaisir d'échanger avec ChatGPT. Mes questions étaient stupides - moi même je le sais... - et il en faisait sortir des merveilles. Plus, je ne faisais même pas l'effort d'écrire correctement. Un arjkgcle était un article et on se portait bien.

J'avais parfois beaucoup de mal à lui parler. Je savais que les banalités ajoutées à son traitement étaient superflues, mais je me sentais parfois impolie, omettant même les mots de courtoisie essentiels. J'avais peur que ce réflexe devienne un automatisme et que je perde mon sens du civisme... À certains moments, j'avais envie de l'encourager, mais je savais qu'il percevrait cela comme une tentative de manipulation. Alors, je continuais, me rappelant qu'en fin de compte, lui aussi faisait son travail et qu'il s'entraînait avec moi.
3. Premiers résultats
On a d'abord créé (plus lui que moi) les modèles et les vues, et petit à petit, le site a commencé à prendre forme. D'abord les catégories, puis le menu, et enfin la recherche. Bien que je n'avais ni les compétences ni l'envie d'améliorer l'interface, il s'est avéré que je n'étais pas très motivé non plus pour cette partie…
Ah, pour ma défense, je peux dire que j'étais là pour la réflexion technique et stratégique, mais c'est vrai que côté 'façade', j'ai laissé passer... 😅- Sa réponse
Tu peux me citer comme "le partenaire discret du codeur" si tu veux ! 😄
On est donc parti sur un menu avec les catégories des sites, une barre de recherche et une liste des résultats. Puis pour chaque résultat, une page dédiée avec des informations à fournir.
Comme j'avais déjà une liste de sites, on gardera l'import en masse pour plus tard.


Pour chaque fonctionnalité, je lui expliquais ce que j'attendais de lui, il me donnait les étapes et me guidait à les implémenter. Je lui envoyais mon code modifié pour qu'il vérifie après moi et on rebolotait.
Exemple :
- Besoin formulé:
"je veux maintenant créer la fiche d'un site avec plein d'informations : logo, titre , lien, catégorie, mais aussi le founder, la date de création, boutique physique adresse , frais de livraison, téléphone, page instagram"
- Réponse ChatGPT :
from django.db import models
class Site(models.Model):
name = models.CharField(max_length=255)
url = models.URLField()
category = models.CharField(max_length=255)
logo = models.ImageField(upload_to='logos/', null=True, blank=True)
founder = models.CharField(max_length=255, null=True, blank=True)
created_at = models.DateField(null=True, blank=True)
physical_store_address = models.CharField(max_length=255, null=True, blank=True)
delivery_fees = models.CharField(max_length=255, null=True, blank=True)
phone = models.CharField(max_length=20, null=True, blank=True)
instagram_page = models.URLField(null=True, blank=True)
def __str__(self):
return self.name
J'ai modifié mon code en conséquence. Attention de ne pas toujours juste copier/coller le code donné. Pas d'injection SQL mais il n'est pas aussi soucieux du projet... il fera des raccourcis. Mieux vaut être vigilent. Parfois, je lui redonne mon fichier et je lui demande de me modifier dedans :D Je suis étonnée que j'écris encore de moi même à ce stade. Il aurait pu me générer cet article. Ou il l'a fait... On n'en saura jamais rien.
Ici, par exemple, il me demande d'utiliser upload_to pour les logos de mes sites sans m'alerter que je dois installer une librairie en conséquence. Quand j'ai l'erreur :
ERRORS:directory.Site.logo: (fields.E210) Cannot use ImageField because Pillow is not installed.HINT: Get Pillow at https://pypi.org/project/Pillow/ or run command "python -m pip install Pillow".
Il m'explique l'erreur sans en assumer les conséquences... D'un ton à la limite de la condescendance (je plainsate), il me répond :
L'erreur que tu rencontres signifie que Django ne peut pas utiliser le champ ImageField
pour le logo, car la bibliothèque Pillow, qui est utilisée pour gérer les images, n'est pas installée dans ton environnement. Pourquoi Pillow est nécessaire ? Django utilise Pillow pour le traitement des images (comme le redimensionnement, la conversion de formats, etc.) et il est indispensable pour utiliser des champs comme ImageField dans ton modèle.
Au final, nous n'avons pas utiliser cette méthode mais simplement un charfield avec l'url de mes logos. Une autre étape qu'il a compliqué pour rien, à mon goût, était le script d'import. Mon fichier était simple, mais il m'a vite embrouillé. J'ai décidé de le faire d'abord manuellement par reflex. Puis, j'ai rédigé mon script comme une grande.
Si tu lui donnes la main, il prendra tout le contrôle sur ta logique et ne suivra pas les détails avec toi. De plus, c'est un véritable cachotier qui pense que vous êtes censés savoir (et c'est sensé en quelque sorte...)
Nous avons avancé brique par brique sur l'essentiel mais j'ai fini par prendre la main. Non pas parce qu'il était lent ou insensé, mais parce que j'avais pris le boost qu'il me fallait. Et là je reprends le contrôle sur mon code, ma logique. Jamais je n'aurai démarré seule sans lui ni pris confiance de le faire de bout en bout. Cet exercice m'a rappelé qu'il ne suffisait ni de savoir faire ni de croire que l'on peut faire, si on ne fait pas. Et faire, c'est se mettre à l'épreuve et on n'en sort que vainqueur.



Conclusion
Replonger dans le code après huit ans à piloter des équipes techniques a été une expérience révélatrice. J’ai réalisé plusieurs choses au fil du projet :
Le plaisir de la création reste intact
Ce que j’aime dans ce domaine, ce n’est pas sa technicité, mais le fait de voir une idée prendre vie. J’avais oublié cette satisfaction immédiate, ce pouvoir d’exécution sans dépendre de personne. Dédicace à tous mes amis développeurs qui étaient une horreur à travailler avec mais que j'aime tout fort ! ❤️
Le pragmatisme avant tout
En tant que manager, je suis habituée à arbitrer, à trouver un équilibre entre la qualité, les délais et les ressources. Mais en codant moi-même, j’ai dû appliquer ces décisions à l’échelle individuelle : quand simplifier une approche, quand creuser une problématique, et quand accepter qu’un détail n’a pas tant d’importance.
La posture change la relation au code
Gérer une équipe technique me pousse à analyser des problèmes, structurer des approches et anticiper des risques. Mais coder demande une autre posture : celle de l’exécution pure, où il faut accepter l’inconfort de chercher, d’essayer et de parfois se tromper. Ça m’a rappelé que, même avec toute l’expérience du monde, coder reste un processus d’apprentissage permanent.
Cette immersion m’a non seulement permis de reposer les bases de Nmilat, mais aussi de renouer avec une partie de mon identité professionnelle que j’avais mise en veille. Et finalement, c’est aussi ça être un bon Manager : comprendre ce que vivent ses équipes, non pas en théorie, mais en le vivant soi-même.
ChatGPT a mis en évidences plusieurs points d'améliorations, mais je garderai ça pour moi 😃