Vous entendrez des personnes se présenter comme développeur Full Stack JS ou des offres d’emploi demandant un développeur Full Stack, ou encore des bootcamps qui vendent des formations Full Stack JavaScript en quelques semaines.
Nous allons voir ce que cela signifie réellement d'être un développeur Full Stack JS en 2024.
Un développeur Full Stack JS est un développeur qui maîtrise tout l’écosystème JavaScript et n’a pas besoin d’autre développeur pour coder une application complexe Web tout seul.
Il doit donc maîtriser la partie Front-End (ce que voit l’utilisateur), la partie Back-End (code exécuté sur les serveurs), la partie base de données (stockage des informations) et la partie DevOps (gestion des serveurs).
Ce n’est pas parce qu’une personne a mis une application client sur un serveur et la distribue qu’il est Full Stack !
Les développeurs Full Stack sont extrêmement rares et très bien rémunérés, et nous allons voir ensemble pourquoi.
On commence avec les outils que tous les développeurs doivent maitriser
Un éditeur de code moderne : il faut maîtriser un éditeur de code moderne qui permet un gain de productivité immense (intégration de très nombreux outils, formatage du code suivant les normes du projet et de très puissantes fonctionnalités). Nous recommandons Visual Studio Code (éditeur de Microsoft, qui est gratuit), l’autre choix populaire est Webstorm (éditeur payant de JetBrains).
Un gestionnaire de formatage : il faut connaitre un outil pour avoir le même format de code dans toute l’équipe, cela peut être un linter qui va aussi analyser le code pour trouver des erreurs (par exemple ESLint) ou juste un formateur (Prettier).
Terminal : tout développeur doit maîtriser, ou au moins avoir des bases, sur un interpréteur de commandes appelé shell. Le plus répandu est de loin bash et nous vous conseillons de ne pas passer de temps sur un autre avant un moment.
Un gestionnaire de dépendances : il faut également connaitre l'un des deux gestionnaires pour les dépendances JavaScript : npm ou yarn.
Un Débugueur : il est impensable de ne pas savoir utiliser un débugueur pour trouver et corriger les erreurs de son code rapidement. Il faut connaitre celui de Chrome ou celui de Firefox. Nous recommandons celui de Chrome.
Système de contrôle de versions (Git) : un système de contrôle de versions permet de collaborer sur un projet de développement sans risquer de perdre du code ou d’écraser le travail de ses collègues. C’est un système extrêmement puissant qui permet d’écrire et de réécrire l’historique de développement d’un projet. Il existe plusieurs systèmes de contrôle de versions mais Git est utilisé dans l’écrasante majorité des cas aujourd’hui.
Ecosystème de répertoire distant : il faut maîtriser un écosystème de répertoire distant, que ce soit Github, Gitlab ou Bitbucket qui sont les trois principaux. Tout projet utilisera l’un de ces écosystèmes.
Vous pourrez faire notre formation Git approfondie ici.
Ensuite, on va parler des concepts généraux qui doivent être maitrisés
Pour toutes les notions suivantes, nous ne voulons pas dire qu'il faut être expert des normes RFC et savoir développer une implémentation. Il faut comprendre comment elles fonctionnent et comment les utiliser à votre échelle de développeur Web. La plupart du temps vous les utiliserez au travers d’une ou plusieurs couches logicielles, mais ne pas les comprendre deviendra rapidement un lourd handicap.
Le protocole HTTP : il est impensable de ne pas maîtriser le protocole de base pour un développeur Web ! C’est le protocole permettant à un serveur d’échanger avec un client. Il faut bien sûr connaitre la version 1.1 mais aussi la version 2 et la version 3 qui permettent des communications plus rapides et plus sécurisées.
Les protocoles transports (TCP / UDP) : il faut avoir quelques notions sur les protocoles de transport utilisés sur le Web. Vous ne devrez les approfondir que dans certains cas d’utilisations avancées.
Les protocoles IP / DNS : ils sont essentiels car ils permettent à deux machines de se retrouver sur un réseau local ou sur Internet (IP) et de résoudre un nom de domaine ou de service en une IP (DNS).
Le protocole TLS : tous les navigateurs imposent maintenant le HTTPS, il est aujourd'hui impossible d’avoir un site Web que Google et Firefox indiquent comme étant non sécurisé et dangereux ! Il faut donc connaitre le protocole TLS, remplaçant de SSL, pour pouvoir implémenter correctement ses certificats X.509 délivrés par une autorité de certification.
Le protocole SSH : Secure Shell est un protocole de communication sécurisée (authentifié et chiffré) qui est utilisé pour se connecter à une machine distante. Tout développeur doit le connaitre pour se connecter à ses serveurs.
Le protocole Websocket : communications web bidirectionnelles entre serveur et clients (par exemple pour mettre en place une messagerie instantanée).
Stockage et système de fichiers : il faut a minima connaitre des notions comme les chemins (relatifs / absolus), créer, modifier et supprimer des fichiers et des dossiers en bash et en JavaScript (avec Node.js). Il faut connaitre la différence entre SSD et HDD. Ensuite, il faut approfondir des notions comme RAID (0 à 5).
Structures de données : il vous faudra comprendre les différences majeures entre les structures de données basiques. Heureusement en JavaScript l’implémentation des structures de données est gérée et ultra-optimisée par le moteur JavaScript et vous n’avez donc pas besoin de savoir les différences entre Array, Dynamic Array, Linked list par exemple. Il vous faudra quand même maîtriser les structures suivantes pour pouvoir comprendre le fonctionnement de JavaScript et développer : Stack, Queue, Array et Hash Table.
Encodage des caractères : il faut maîtriser l’ASCII, et les encodages UTF-8 et UTF-16 pour le traitement et le stockage des caractères en JavaScript.
Stockage et traitement des nombres : si vous ne maitrisez pas le stockage et le traitement des nombres en informatique vous allez au devant de graves bugs et de migraines douloureuses. L’exemple le plus célèbre est 0.1 + 0.2 = 0.30000000000000004. Il faut bien sûr maîtriser les types de nombre : il n’y a que deux types de nombres en JavaScript mais il vous faudra en connaitre d’avantage pour le stockage en base de données qui a souvent au moins 4 types de nombre (par exemple double, 32-bit integer, 64-bit integer et décimal 128 pour MongoDB).
Regex : les expressions régulières sont très efficaces pour les traitements de chaînes de caractères (recherches, remplacements etc).
API REST : il faut connaitre les conventions à respecter (client/serveur, sans état, mise en cache).
On continue avec les langages
HTML : langage pour définir la structure des pages.
CSS : langage pour définir le rendu des pages.
Un préprocesseur CSS : il devient rare dans un projet moderne d’utiliser du CSS pur, on utilisera généralement Sass ou Stylus pour React ou alors un framework CSS comme Bootstrap.
JavaScript : langage pour rendre les pages réactives et dynamiques, et pour pouvoir interagir avec toutes les API : les Web API des navigateurs et les nombreuses autres que vous utiliserez dans vos projets.
Superset JavaScript : On utilise de plus en plus des supersets de JavaScript dans les applications client. TypeScript et Flow sont les plus connus, ils permettent notamment de typer vos variables pour rendre la maintenabilité de votre code plus facile . Ils ajoutent également un certain nombre de fonctionnalités au JavaScript. Ils sont compilés en JavaScript avant la mise en production de votre application puisque les navigateurs ne comprennent que le JavaScript. On vous recommande Typescript.
Vous pouvez lire notre article sur ces pré-requis ici.
Dyma est une plateforme de formation en ligne spécialisée dans les technologies Web. Nos formations sont accessibles aux débutants et conviennent également aux développeurs qui veulent s'améliorer.
Nos formations HTML, CSS et SASS : ici
Notre formation JavaScript : ici
Notre formation TypeScript : ici
On attaque les choses sérieuses avec le Front End
Un framework et son écosystème, avec au choix :
1 - Angular : il faut bien sûr maîtriser le framework mais également tout son écosystème : Typescript (langage compilant en JavaScript), le CLI Angular, Material (librairie Google de composants), Flex-layout (librairie Google de CSS in templates), Observables et RxJS (programmation réactive), Universal (server side rendering), Cypress (tests E2E), Ngrx (gestion d’état de l’application), internationalisation (i18n), services workers et Progressive Web App pour les mobiles (PWA).
2 - Vue : de même il faut maîtriser la librairie de base de Vue.js mais également Pnia (gestion d’état), vue-router, une librairie HTTP, des librairies de gestion de formulaires (Zod, Vee-validate) et une librairie SSR (par exemple Nuxt). Les principales librairies de test seront également nécessaires (Cypress, Vitest principalement).
3 - React : il faut connaitre React et le CLI create-react-app, Recoil (gestion d’état), une librairie de gestion de formulaire (react-hook-form par exemple), une librairie de validation (Yup par exemple) et une librairie de composants (Material UI). Les principales librairies de test seront également nécessaires (Cypress, Jest, React Testing Library principalement).
Vous pouvez lire notre article sur comment choisir un framework Front ici.
Un module loader / bundler : il faut a minima comprendre ce que font Webpack/Vite (tous les frameworks l’utilisent et le pré-configurent pour vous) et Babel.
Des librairies de tests unitaires et end-to-end : a minima un exécuteur (par exemple Karma, Jasmine), une librairie pour écrire des tests (par exemple Chai, Jest, Jasmine, Cypress), une librairie pour vérifier le coverage du code par les tests (Jest, Istanbul) et une librairie de tests E2E (Cypress).
Stockage dans un navigateur : Il faut connaitre le Webstorage (les API et les limites de localStorage et sessionStorage) et les cookies.
Requêtes depuis un navigateur : requêtes Ajax (API fetch / XMLHttpRequest), formats (JSON, FormData principalement), headers, authentification des requêtes et connaissances des requêtes CORS.
Connaissances en sécurité : il faut avoir des notions concernant les vulnérabilités communes et comment y remédier que ce soit en matière de cookies (httpOnly, sameSite, secure), connaitre les vulnérabilités par injections (Cross Site Scripting - attaques XSS) et comment y remédier (sanitization, Content Security Policy), les vulnérabilités HTTP (CSRF) et comment y remédier (sameSite, tokens CSRF).
Si vous souhaitez apprendre a un de ces frameworks vous pouvez suivre :
Notre formation Vue : ici
Notre formation React : ici
Notre formation Angular : ici
On continue avec le Back end
Il faut connaitre Node.js et un framework au choix (par exemple Express, Hapi, Sails, Koa et Loopback). Nous recommandons Express pour débuter car c’est de loin le plus utilisé et il est plus facile de trouver des ressources dessus. Nous déconseillons pour le moment Nest qui n’a qu’un contributeur core et aucun soutien important donc c’est dangereux de l’utiliser sur un projet professionnel.
Des librairies de tests unitaires: a minima un exécuteur (par exemple Karma, Jasmine), une librairie pour écrire des test (par exemple Chai, Jest, Jasmine, Cypress), une librairie pour vérifier le coverage du code par les tests (Jest, Istanbul) et une librairie pour les tests nécessitant des requêtes HTTP (Super-agent).
Base de données : il faut bien connaitre une base de données (fonctionnement, langage de requêtes, index, optimisation des performances). Nous recommandons fortement MongoDB pour débuter qui est moderne et facilement scalable (réplication, sharding, sauvegarde, rolling updates). Pour des besoins spécifiques il faudra peut-être ensuite vous orienter sur un autre type de base de données : relationnel (par exemple PostgreSQL), clé / valeur (par exemple Redis), Wide Column (par exemple ScyllaDB) ou graphes (par exemple Neo4j).
Mapping objet-relationnel (ORM) : interface entre la base de données et Node.js permettant une gestion simplifiée des modèles et de la validation (par exemple Mongoose ou Sequelize).
Gestion d’un Database-as-a-Service (DBaaS) : sauf cas rares les bases de données sont gérées par les providers cloud (par exemple AWS, Azure, Google cloud, OVH) vous n’aurez donc pas besoin de savoir implémenter une base de données vous même (ce qui est très complexe et un métier en soit). Il faut cependant avoir des notions sur les bases de données distribuées (réplication, sharding et sauvegarde).
Sécurisation de la base de données : savoir créer des utilisateurs, leur donner les permissions correctes, créer une white list d’IPs et configurer le chiffrement et l’authentification TLS. (Et éventuellement le chiffrement des données pour des applications spécifiques).
Cryptographie : connaitre les différences entre algorithmes symétriques et asymétriques et leurs principaux cas d’utilisation (authentification clé publique / privée ou secret / chiffrement), connaitre les principaux algorithmes de hachage et leurs cas d’utilisation (a minima les algorithmes bcrypt et SHA-2/3), savoir ce qu’est un salt et ce que sont les sommes de contrôle. Sans ça vous ne pourrez pas gérer les authentifications entre machines, celles de vos utilisateurs, la protection des mots de passe et plein de problématiques Back-End fondamentales.
HTTPS : savoir comment installer un certificat X.509 (par exemple avec letsencrypt et certbot), le mettre à jour automatiquement (cron) et créer un serveur Node.js HTTPS et HTTP/2 (HTTP/3 avec protocole QUIC). Il faut des connaissances sur la dépréciation de SSL et sur comment utiliser la version sécurisée de TLS (1.3). Il faut savoir comment éviter les attaques par downgrade (obligation TLS 1.2 minimum et liste des algorithmes de cryptographie à utiliser lors des échanges). Il faut savoir configurer et utiliser HSTS (HTTP Strict Transport Security).
Authentification : protection des services et des routes dans le cas d’une API REST, hachage des mots de passe, comment gérer l’authentification par session et l'authentification avec les tokens JWT, comment gérer les Cross Site Request Forgery (sameSite cookie et/ou token CSRF).
Connaissances en sécurité : il faut avoir des notions concernant les vulnérabilités communes et comment y remédier que ce soit en matière de cookies (httpOnly, sameSite, secure et token CSRF), de Cross Site Scripting (attaques XSS), d’injection SQL et bien maintenir ses dépendances systèmes (mise à jour avec cron) et des dépendances applicatives (par exemple avec snyk).
Connaissances avancées sur les communications clients / serveurs : dans quels cas utiliser HTTP, les Websockets (natives ou avec par exemple socket.io), les server pushs (HTTP/2) et le protocole Web Push Notifications.
Caching : connaitre les différents niveaux de cache et comment les configurer : caches navigateurs (principalement configuration avec les bons en-têtes, Service Workers et PWA), caches sur le serveur (serveur de cache dédié, cache au niveau du reverse-proxy), caches sur des réseaux (CDN cache, Edge Cache).
Compression : savoir comment correctement compresser les réponses serveurs (gzip, brotli principalement).
Connaissances sur une solution de recherche : il vous faudra souvent implémenter une solution de recherche fondée sur Lucene et des connaissances basiques vous seront indispensables sur Solr ou ElasticSearch.
Connaissances sur un message broker : lorsque votre application doit traiter de grands volumes d’événements vous devrez implémenter un message broker (par exemple RabbitMQ ou Kafka).
Si vous souhaitez vous lancer sur Node.js avec Express, l'authentification, les protocoles et bien d'autres choses vous pouvez suivre notre formation Node.js ici.
Ensuite vous pourrez suivre la formation MongoDB ici.
On n'oublie pas le DevOps
Vous avez dépassé les quelques centaines ou milliers d’utilisateurs et devez maintenant vous occuper des tâches d’un DevOps : la gestion des serveurs.
Linux : plus de 65% des serveurs mondiaux sont sur Linux, il faut donc connaitre des notions de base pour s’y retrouver : il faut a minima connaitre comment depuis un terminal utiliser les principaux gestionnaires de paquets (apt, yum), les tâches cron, ouvrir / fermer des ports, gérer les processus et les services (par exemple comment reboot automatiquement un processus après un reboot) et vérifier la consommation mémoire / CPU et le stockage. Il vous faudra au fur et à mesure connaitre de manière plus approfondie Linux et bash.
Il va également falloir s’intéresser aux grandes différences entre les principales distributions (Ubuntu, CentOS, Debian, RELH, Fedora et Alpine) et en choisir une (nous conseillons Ubuntu pour débuter).
Gestionnaire de tâches répétitives (time-based job scheduler) : il va falloir apprendre à programmer des tâches répétitives en utilisant par exemple cron.
Manager de processus et scaling horizontal : vous devrez apprendre à utiliser un gestionnaire de processus Node.js (par exemple pm2) et à lancer plusieurs instances en mode cluster sur un même serveur (clusterisation).
Continuous Integration (CI) / Continuous Development (CD) : vous devrez apprendre un outil de CI pour gérer les builds, les tests et les mises en staging / production quotidiennes (par exemple Travis, CircleCI ou Jenkins).
Containerisation : maintenir et déployer des services et des applications rapidement et de manière sécurisée sur de nombreux serveurs est fastidieux et complexe, Docker est l’un des outils qui va vous y aider.
Orchestration : vous avez de nombreux serveurs et vous souhaitez pouvoir les gérer plus simplement (scale up/down des services, autorestart, communications entre les services etc) il va vous falloir un orchestrateur (par exemple Swarm ou Kubernetes).
Monitoring : vous n’allez pas vous connecter en SSH sur chacun de vos serveurs pour voir où ils en sont ! Il est temps pour mettre du monitoring et de la visualisation en place (par exemple avec Prometheus / Grafana).
Load Balancers : vous devez répartir la charge des requêtes entre vos multiples serveurs de manière optimale (en fonction de la charge et en respectant des contraintes par exemple sticky sessions ou websockets), il vous faudra obligatoirement un load balancer (vous pourrez utiliser par exemple Nginx, Traefix ou ELB). Savoir comment distribuer vos contenus selon la location de l'utilisateur (Geo steering, réplications géogrpahiques etc).
Server Caching (reverse proxy cache) : vos serveurs reçoivent beaucoup de requêtes et vous voulez les soulager en mettant en oeuvre un cache côté serveur il vous faudra utiliser des solutions comme Varnish ou Memcached.
Content Delivery Network (CDN) : vous servez de nombreux utilisateurs dans plusieurs pays, vous voulez distribuer les contenus statiques depuis des serveurs proches de vos utilisateurs et que ces ressources soient optimisées et mises en cache. Il va vous falloir utiliser un CDN comme Cloudflare ou Fastly.
Commencez par notre formation Linux & Bash ici.
Puis vous pourrez continuer sur Docker ici.
Comme vous pouvez le constater le chemin est long ! Mais c’est normal, pour être un vrai développeur Full Stack JS cela prendra plusieurs années.
Cela étant dit, vous n’avez pas besoin d'être Full Stack pour travailler en tant que développeur Web, vous pouvez commencer par un domaine et apprendre des nouvelles choses au fur et à mesure.
Méfiez vous également des formations de quelques semaines ou quelques mois qui vous promettent d'être Full Stack, c’est malheureusement complètement irréalisable.
Bon courage ! N'arrêtez jamais d’apprendre !