---
title: Mon premier marché public
tags: post, reboot, learn
robots: noindex, nofollow
author: Julien Noyer
---
# Mon premier marché public
*Toute ressemblance avec des personnes existantes ou ayant existées serait purement fortuite*

> Blog post From [dwsapp.io](https://dwsapp.io) - © 2021/2022 [Julien Noyer](https://www.linkedin.com/in/julien-n-21219b28/) all rights reserved
---
## Dis moi pour qui tu travailles, je te dirais qui tu es
Le statut d’auto-entrepreneur du Web induit de devoir répondre à des demandes plus ou moins complexes, plus ou moins souvent, pour des entreprises d’ampleur différente. L’indépendance pousse à l’humilité, il arrive souvent de se sentir capable de répondre à une offre, mais le poisson nous semble bien trop gros. Nous travaillons pour des petites structures, nous nous y sentons plus libres d’exprimer nos idées, et nous regardons ce que demandent les plus grandes en espérant un jour pouvoir y répondre. Tenter de remporter un appel d’offre de marché public dans le domaine de l’innovation par les technologies du Web est un exercice des plus intéressants d’un point de vue technique, car ces projets demandent souvent d’être capable d'associer des empilements technologiques particuliers dans des environnements complexes.
Ce travail permet également d’avoir accès à des services techniques spécialisés ces nouveaux principes technologiques, souvent appelés “Pôle Innovation” ou “Services dédié aux Usages Numériques”. Les individus qui gravitent autour de ces secteurs d’activités sont souvent des acteurs majeurs du Web, les côtoyer est une chance pour toutes personnes investies dans ce merveilleux secteur d’activité. Du moins, c’est ce que j’imagine, car pour moi, la première fois que j’ai remporté un appel d’offre de marché public, j’ai tardivement compris que nous ne parlions pas du tout le même langage.
### Définition du projet qui ne se refuse pas
Ce projet commence simplement, comme un coup de fil : “Salut Julien, c’est Rémi. Ça te dit une application cool à développer avec un pote à moi ?”. De base il est difficile de répondre non à une phrase pareille, si c’est Rémi qui le propose alors c’est autre chose, dire non est bête car Rémi est l’une des meilleures personnes que je connaisse dans le milieu du Web. Nous nous sommes rencontrés dans le cadre de cours que nous donnions dans une école parisienne, nous avions déjà échangé des bonnes idées autour de boissons gazeuses, assis aux terrasses des cafés, mais nous n’avions pas encore réellement travaillé ensemble sur un projet. L’occasion était parfaite, nous avons continué la conversation, échangé plusieurs idées pour finalement écrire une proposition que nous avons envoyée à la région qui avait émis l’appel d’offre.
Assez fière de ce que nous avions proposé et plutôt confiant quant au résultat. Non que les dés étaient pipés, mais compte tenu du cahier des charges et du tarif maximal défini dedans, il était peu probable que des propositions puissent être mieux placées que la nôtre. Techniquement comme financièrement, développer un système d’aide à la médiation culturelle comprenant un back-office, un front-office et une API RESTfull pour moins de 20 000€, comme on dit par chez nous : “Frère, tu peux pas test !”.
### Il y a des moteurs bien plus puissants que l'appât du gain
Décider de réduire le tarif d’une prestation n’a pas pour but de remporter un budget, mais de gagner la possibilité de travailler sur un projet. Qui reste rentable malgré tout, en financement ou en enseignement. Pour développer ce projet je devais mettre en place une structure très rapidement, nous ne devions pas traîner. L’idée était de faire un prototype fonctionnel le plus rapidement possible qui puisse constituer un socle pour le développement des fonctionnalités de l'application. Bien souvent dans les projets qui me sont confiés je constate que certains points du cahier des charges ne sont pas suffisamment définis, ce projet ne faisait pas exception. La méthodologie de travail que je mets en place depuis plusieurs années me permet de pouvoir développer rapidement des socles techniques pour les projets que j’ai à développer, j’ai mis en place différents blocs de fonctionnalités que j’utilise pour construire des applications. Ma boîte de Légo personnelle.
Pour développer un système complet, Backend et Frontend, plusieurs étapes de bases sont à mettre en place, j’ai donc commencé par construire toute la structure technique pour pouvoir m'intéresser à ce pourquoi j’ai offert le Back Office : le système de reconnaissance d’œuvre d’art. Je dis souvent aux personnes que je forme que le plus important dans le travail c’est de trouver des moyens de s’amuser, et avec ce projet j’allai pouvoir jouer avec des réseaux de neurones, la reconnaissance d’image, la géolocalisation,…
## Prototyper un système de reconnaissance d’image

> Le développement Full Stack Javascript à la sauce IA
### Par quoi commencer ?
Posons le décors en définissant la fonctionnalité principale de l’application au travers cette User Story simple : “Je me trouve dans le parc d’une chartreuse aux pieds des montagnes, et je joue à un jeu de piste grâce à une application Web qui me permet de prendre de photos pour répondre à des énigmes”. Considérons que le système qui permet de créer des énigmes, de créer les étapes du jeu de piste, de gérer tous les contenus de l’application en 3 langues est fait.
Ma boîte de Légo me permet d’aller vite pour créer ces étapes, et quand ça n’est pas trop compliqué, pourquoi ne pas l'offrir pour faire preuve d’un peu d’élégance ? Faisons un point technique à présent pour identifier les technologies utilisées :
- Node.js et Express.js pour organiser la structure de l’API
- PostgresQL pour la gestion des informations
- Vue.js pour les application Back Office et Front Office
J’ai fait beaucoup d’Angular, un peu de React, mais je dois dire que mon intérêt grandit pour Vue.js. J’ai à présent beaucoup travaillé avec ce cadriciel également, sur des projets plus ou moins gros et j’ai constaté sa robustesse et sa souplesse. Un tel système est une aubaine pour développer efficacement des projets qui peuvent être très complets tout en étant accessibles.
Je me suis donc concentré sur la meilleure méthode à mettre en place pour pouvoir développer un système de reconnaissance d’image en Vue.js, et je me suis naturellement tourné vers Teachable Machine. Il n’était pas envisageable de développer un réseau de neurone complet, ni le budget ni la structure n’étaient adaptés, j’ai donc choisi d’utiliser le système proposé par Google.
### Quand une bibliothèque est bonne, pourquoi s'en priver ?
Teachable Machine propose de créer des modèles prédictifs qui sont ensuite utilisables en Javascript via une fonction et un fichier JSON, ou via un CDN. J’ai décidé d'utiliser la version embarquée dans l’application car elle devait pouvoir fonctionner hors-ligne, et je ne me suis pas trop inquiétée des droits à l’image cédé à Google car nous étions à l’origine des photos pour les entraîner, et aucune photos utilisateurs ne devaient être utilisées. Entraîner un réseau de neurones n’est pas si compliqué avec les API’s disponibles en ligne, mais entraîner un réseau à reconnaître beaucoup de sujets différents peut générer des modèles à utiliser à cause de leur poids. L’application à développer devait fonctionner sur des smartphones de génération différentes, des récents comme des anciens, la gestion du temps de chargement était donc primordiale.

> Testez [Teachable Machine](https://teachablemachine.withgoogle.com), c'est bien plus simple que vous ne le croyez
Pour optimiser le poids des réseaux j’ai associé à Teachable Machine une autre API, bien plus couramment utilisée : la Geolocation Navigator API. L’époque d’Internet Explorer 95 n’est plus, vive celle des navigateurs modernes qui offrent des outils de développement qui donnent au Web ses lettres de noblesse. T’en qu’à faire, autant en choisir un Open Source, à bonne entendeur. L’application sera donc capable de choisir un réseau de neurones spécifiques selon l'endroit ou le smartphone se trouve, de cette manière j’entraine des réseaux à reconnaître des groupe de sujets plutôt que la totalité des sujets.
Quand cette idée m’est venue, mon premier réflexe a été de la contredire, j’ai donc pris le temps d’approfondir chacun des points. Et quand j’ai été sur de moi, j’ai appelé Damien, Anthony, Jonathan, Giuseppe, la liste ultime des cerveaux qui réfléchissent bien. Ils ont émis quelques doutes, heureusement, sinon comment s’améliorer ?
### Passer de la théorie à la pratique
J’avais néanmoins suffisamment d’outils, de recherches, et finalement l’approbation de mes amis développeurs qui m’ont tous dit : “Il est cool ton projet, j’aimerai bien le faire !”. Alors je me suis lancé, j’ai ouvert mon IDE et j’ai commencé à travailler, du code, du code, encore du code, le trait commun de toutes les passions est que nous y consacrons beaucoup de notre temps. N’ayant pas accès au lieu dans lequel l’application devait vivre, j’ai utilisé ma nouvelle ville et ses monuments pour la teste. Aix-en-Provence, la statue en souvenir de la guerre d’Algérie ou du génocide amrénien seront les sujets géolocalisé que mon application devra reconnaitre.
Je me balade dans la ville, je prends des photos au Fairphone et à l’iPhone pour être dans les conditions réelles d’utilisation de l’application et j’utilise ensuite toutes ces photos pour entraîner mes modèles. J’ai dû ressortir, refaire des photos, réentraîner des modèles jusqu’à pouvoir enfin tester l’application complète.

> La stèle représentant le martyr arménien, [en savoir plus](https://www.laprovence.com/article/edition-aix-pays-daix/3377924/memoire-et-espoir-dans-la-communaute-armenienne.html).
Quand le lendemain, pendant mon test, je me rend compte que la géolocalisation déclenche bien les notifications dans l’application, que les photos que je prends sont reconnues ou non par le bon réseau, et que les différentes étapes du jeu de piste s’enchaînent correctement, je pense que je devais être la personne la plus souriante d’Aix-en-Provence ! Les idées que j’ai imaginées des mois avant fonctionnent, l’application tourne dans le navigateur, même sans être connectée à Internet. Je suis content comme tout, fière d’avoir réussi ce tour de force et ravie de pouvoir fournir à mon client un travail de cette qualité.
J’ai fini cette journée en terrasse, j’ai appelé Rémi pour lui parler de mon test, on à but une boisson gazeuse mais à distance. Pour finaliser le projet il me reste à terminer la documentation pour fournir mes répertoires GitLab à mon client afin qu’il puisse faire la mise en ligne sur son serveur. Étape basique quand on développe un projet pour un client qui s’occupe de l’hébergement du projet. Mon client, cette fameuse région de montagnes, m’a mis en relation avec son “Pôle innovation” pour que je puisse passer le relais car des professionnels plus compétents que moi doivent prendre en charge sa mise en ligne.
## Ca veut dire quoi configurer un serveur ?

> Mettre en place un outil, un lieu, un support, une technique,...
### Ca depend surtout de se dont on a besoin
Tout dépend de ce que l’on entend par serveur car il peut servir à déposer des fichiers, gérer des flux d'e-mails, héberger des projets Web, et bien d’autres choses. Ce que l’on appelle un serveur est une machine, virtuelle ou non, sur laquelle est installé un système d’exploitation plus ou moins simple. Historiquement nous avons pour habitude de travailler sur ces machines en ligne de commande, et Linux est le système d’exploitation le plus largement utilisé. Une fois cette machine configurée, ce serveur n’est alors rien d’autre qu’un ordinateur sans OS qui est prêt à recevoir sa configuration comme n’importe quel ordinateur. Avant d’installer un IDE sur mon ordinateur je ne peux pas considérer que c’est une machine prête pour développer des applications, c’est la même chose lorsqu’il s’agit du Web.
Notre profession souffre d’un trop grand nombre de termes en anglais, langue que j’aime beaucoup mais qui n’est pas toujours facile à traduire. Surtout lorsqu’il s’agit de termes techniques. Car bien que l’on puisse considérer qu’installé Debian sur une machine Linux est une configuration serveur de base, cela ne constitue pas la configuration d’un serveur Web. L’adjectif qualificatif a toute son importance dans la problématique que j’ai rencontré avec les techniciens de mon client. Ce qu’a configuré mon client se nomme en anglais un “Virtual Host”, que l’on appelle “Server” en français, ce dont j’avais besoin était un “Web Server”, que l’on appelle “Server” en français également.
J’apprends au moment de ma livraison que l’engagement qu’a pris mon client par contrat de me fournir un serveur LAMP PHP 7.3 avec une base de données MariaDB n’est pas tenu et qu’il faut trouver une solution. Je prends donc le temps de rentrer en contact avec la personne en charge de la partie technique du “Pôle Innovation” de mon client, et je ne suis pas déçu du résultat. J'apprends qu’en fait il y à bien eu tentative de configuration d’un serveur Web, mais il semble que Apache soit trop compliquée à mettre en place pour la personne que j’ai en ligne.
Je suis un peu embêté moi aussi parce que ça fait pas mal de temps que je trouve cette technologie datée et que je suis aujourd'hui plus à l’aise avec un Reverse Proxy. Je lui propose donc de réaliser la même configuration que celle de mon serveur de développement, configuration que j'avais défini dans ma proposition pour répondre à l’appel d’offre. Elle me confirme que du coup, la configuration du serveur Web est à ma charge, je me lance donc dans l'installation de NGINX sur le serveur de mon client.
### Rendre disponible en ligne un prototype fonctionnel

> Dwsapp est un Atelier de création Open Source, apprenez à [configurer NGINX](https://dwsapp.io/tuto/BJswWiONu)
L’utilisation que j’ai de NGINX me permet depuis plusieurs années de mettre en production rapidement des prototypes d’applications. J’ai mis en place une méthode qui optimise le déploiement des applications sur lesquelles je travaille, que je vais même jusqu’à enseigner dans différentes écoles et universités. Je ne considère pas pour autant que c’est la méthode la plus professionnelle qui soit, elle est en revanche adaptée à mes projets, et donc adaptée à celui que j’ai développé pour mon client.
Il me faut plus ou moins une heure pour finir la configuration et déployer le projet, je passe ensuite aux tests que nous faisons à deux avec Rémi. Le lendemain nous envoyons un email pour prévenir le client que le projet est en ligne, nous sommes en mi-août. Une quinzaine de jours plus tard le client valide la réception du projet, félicitation des responsables en charge de l’aspect scientifique et patrimonial du projet, à présent patience avant de recevoir le paiement de la facture.
### Vous prendrez bien une petite audit de sécurité ?
Avant de m’engager dans ce projet j’ai eu à prendre en compte toute une série de contraintes imposées par mon client, c’est tout à fait normal et l’audit de sécurité en faisait partie. C’est pourquoi j’ai pris à abonnement dédié sur Digital Ocean pour héberger mon projet en développement car une audit devait être faite sur mon serveur de développement. J’ai proposé au service technique de mon client de me fournir un clés SSH public pour que je puisse créer un profil spécifique, j’ai été fort surpris d’apprendre qu’il avait simplement besoin de l’URL. Je me suis dit que leurs exigences en sécurité n’étaient pas très élevées, ça m’a rassuré pour la suite, m’imaginant que l’audit pour la mise en production ne devrait pas non plus poser de problème.
C’était sans compter le fait que, malgré l'engagement de mon client de me fournir une structure adaptée à la diffusion de l’application, j’ai dû mettre en place moi-même le serveur Web, avec NGINX au lieu d’Apache. L’audit de sécurité à donc indiqué que la version de NGINX que j’avais installée n’était pas la dernière version qui venait de sortir 1 mois et demi plus tôt. La livraison du projet a donc été refusée, ce qui à engendrer des mois de pourparlers, nous sommes en décembre et ma facture n’est toujours pas réglée.
<br>
<iframe src="https://www.youtube.com/embed/EzRI2BuCfjU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen style=" width: 100%; height: 400px; border: none"></iframe>
> [Karim Duval](https://www.linkedin.com/in/karim-duval-humoriste/) est une chance pour nous tous
<br>
Je suis une personne obstinée, qu’en je pense avoir raison et que mes propositions sont validées par mes pairs, je m’engage à 100% dans mon travail. C’est pourquoi je me suis reconnecté sur le serveur de mon client pour faire ma propre audit, bien que je ne sois pas du tout un spécialiste. Ce que j’ai découvert c’est qu’effectivement, la version de NGINX n’était pas la dernière, je me suis alors demandé comment un “apt-get install nginx” pouvait installer une mauvaise version ? La réponse est simple, la version qui est téléchargée est celle qui correspond à la machine qui doit l’installer.
Quand j’ai dit à mon client que la version de NGINX est la bonne car elle correspond à la version de Debian qui a été installée par le “Pôle Innovation”, on me réponde que peu importe, je n’ai qu'à : “mettre un patch pour forcer la dernière version de NGINX sur une ancienne version de Debian, c’est facile.”. Que ce soit facile ou non n’est pas la question, mais quand cette proposition vient d’un responsable d’audit de sécurité, ça laisse songeur sur la légitimité de la demande.
## A quel moment sommes-nous devenus tous flous ?

> Le manque de clareté et de bienveillance dans nos echanges et la cause de tous nos maux
### Dire qu'on ne sait pas faire est la plus belle forme d'intelligence
J’ai beaucoup pensé à la manière dont je peux exprimer les sentiments que j’ai ressenti pendant toute la période ou j’ai travaillé sur ce projet. Il représente pour moi le projet que j’ai le plus abouti, dans lequel j’ai mis le plus de mes compétences au service d’un noble projet, dans lequel j’ai élaboré des approches techniques innovantes et efficaces. Mais l’épilogue de cette histoire me laisse un goût âpre, un sentiment de manque complet de considération pour mon travail de la part de personnes qui n’ont de technique que le titre de leur emploi sur leur carte de visite. Mon travail m’a amené à vivre de très grandes joies, des larmes même lorsque j’entends Chraline me rendre hommage à sa remise de diplôme, et quelques difficultés que mon optimisme à toujours réussi à faire passer au second plan.
C’est pourquoi je ne vais pas finir ce texte en envoyant une salve de critiques pour des personnes qui n’en valent absolument pas la peine. En revanche, l’adage “soit je gagne, soit j’apprends” est inscrit en moi bien avant qu’il devienne un hashtag, et je pense que mon expérience peut servir aux personnes qui ont eu le courage d’aller jusqu’ici. Alors un petit conseil, si vous vous retrouvez du cotés d’Annecy, méfiez-vous de la cheffe de projet informatique quand elle galère avec son serveur Apache.
### "If You Think Education Is Expensive, Try Ignorance" [Robert Orben](https://www.dicocitations.com/citations/citation-58292.php#:~:text=%27ignorance.».-,«%20Si%20vous%20trouvez%20que%20l%27éducation%20coûte%20cher%2C%20essayez,P.%20B.%20de%20La%20Bruère%20-%20Rev.)
> [Julien Noyer](https://www.linkedin.com/in/julien-n-21219b28/), le développeur qui vous veut du bien.