Apprendre un nouveau langage en réalisant des projets
Aujourd'hui, je vais discuter de mon approche pour apprendre un nouveau langage de programmation. Comme vous pouvez l'imaginer d'après le titre, j'aime faire des choses pour m'améliorer. Une approche par projet est le meilleur moyen de développer une nouvelle compétence, surtout si vous disposez d’une formation théorique stable déjà établie.
Dans un domaine en constante évolution, et avec l’IA qui vient ajouter une pression de plus en plus grande sur les développeurs, il est plus qu’important aujourd’hui de maîtriser des compétences pratiques plutôt que théoriques.
Je sais que ce n'est peut-être pas la meilleure option pour quelqu'un qui commence à apprendre la programmation, car il doit d'abord se familiariser avec les concepts de base. Peut-être qu'un simple tutoriel expliquant la syntaxe du langage est plus adapté à ce cas.
Pour le reste d'entre nous, créer des programmes de plus en plus complexes qui utilisent les fonctionnalités fournies par la bibliothèque standard du langage et découvrir les manières idiomatiques d'exprimer différents concepts est le moyen le plus rapide de s'améliorer.
Sur quels projets travailler ?
Ce sont les choses sur lesquelles j’aime travailler lorsque j’apprends une nouvelle langue. Ne vous méprenez pas, cette liste n'est en aucun cas exhaustive et ne doit pas être traitée comme le Saint Graal de l'apprentissage des langues (non pas que je pense que quiconque le traiterait comme ça, mais mieux vaut prévenir que guérir). Alors, en gardant cela à l’esprit, commençons.
Application d'entrée/sortie de base
Application Socket (chat, FTP, etc.)
Serveur HTTP/API
Analyseur
Je me considère comme un développeur backend, j'ai donc tendance à me concentrer sur des projets qui traitent les demandes des utilisateurs et renvoient des résultats, comme un serveur typique. Lors de la mise en œuvre de ces projets, j'insiste sur une chose : utiliser autant que possible la bibliothèque standard.
Apprendre à utiliser le langage tel qu'il est censé être utilisé par les créateurs et à faire les choses sans ajouter une couche d'abstraction, ce que fera la plupart du temps une bibliothèque tierce, vous aide à comprendre en profondeur non seulement la structure du langage, mais également la façon dont fonctionnent les systèmes que nous tenons pour acquis (comme un serveur HTTP par exemple).
Application d'entrée/sortie de base
Le premier programme que je vais implémenter lors de l'apprentissage d'une nouvelle langue est une application d'entrée/sortie (input/output) de base. Le but est d'apprendre à obtenir les entrées de l'utilisateur (soit à partir de la console, des arguments ou d'un fichier) et, après un traitement simple, à sortir les données vers la console ou un fichier. C'est aussi simple que cela, mais la simplicité de cette application vous apprendra beaucoup de choses. Vous apprendrez à lire à partir de la console et des arguments (probablement en utilisant ces bibliothèques standard fournies par le langage). Vous vous familiariserez également avec la gestion des fichiers, comme l'ouverture, la lecture, l'écriture et la fermeture d'un fichier JSON.
Tous les concepts ci-dessus constituent les concepts fondamentaux que vous devez maîtriser pour progresser davantage et construire des systèmes plus complexes. Vous aurez également une expérience de premier ordre sur la façon dont un programme simple est structuré et comment il est censé être exécuté.
Application de socket
La prochaine chose sur laquelle je vais me concentrer est la création d'une sorte d' application socket . Dans la plupart des cas, je me concentre sur la mise en œuvre d'une application de chat multi-client. Les éléments clés de l'application sont :
Les utilisateurs peuvent se connecter à un serveur
Les utilisateurs fournissent leur pseudo
Les utilisateurs peuvent envoyer des messages de groupe et privés
Le serveur accepte et propage les messages aux utilisateurs
Toutes ces choses que j'ai mentionnées ci-dessus sont considérées comme des fonctionnalités de base selon les normes actuelles. Se salir les mains, comprendre son fonctionnement et enfin le mettre en œuvre vous apprendra de nombreuses leçons précieuses qui vous distingueront des autres.
En complétant le projet ci-dessus, vous comprendrez mieux comment les sockets sont implémentées dans le langage. De plus, vous découvrirez comment le langage gère les processus simultanés, car vous devrez envoyer et recevoir des messages simultanément.
Serveur HTTP/API
Après avoir créé l'application socket, l'étape suivante consiste à créer notre propre serveur HTTP qui accepte plusieurs utilisateurs et serveurs sur des pages HTML statiques. Pour ce projet, les possibilités sont infinies. Ajoutez toutes les fonctionnalités de votre choix et concentrez-vous sur les différents domaines que vous souhaitez explorer. Pour moi, une implémentation typique d'un serveur HTTP contient les éléments suivants :
Acceptez plusieurs requêtes via HTTP
Fichiers statiques du serveur
Consigner les demandes des utilisateurs (log)
Implémenter une API simple permettant aux utilisateurs d'interagir avec une base de données SQLite
Demandes de limite de débit (Rate limit) afin que les utilisateurs surchargent le serveur
Comme mentionné précédemment, dans le monde moderne de la programmation, nous tenons souvent ces points pour acquis. En mettant en œuvre ce projet, vous obtiendrez un aperçu de toutes les pièces mobiles qui composent une application Web. Vous utiliserez la bibliothèque HTTP pour gérer les requêtes basées sur différents verbes, renvoyer du contenu statique (ou dynamique) à l'utilisateur et apprendre à interagir avec une base de données simple pour stocker des informations sur l'activité des utilisateurs.
Créer un Parser
C’est peut-être le projet que j’aime le plus en apprenant une nouvelle langue. Le concept est simple. Créez un programme qui analyse un document (généralement un fichier JSON ) et extrait des informations utiles (comme les clés, les valeurs, les types de données des valeurs, etc.).
La plupart du temps, cela implique une analyse de bas niveau du document (généralement octet par octet) et la mise en œuvre d'une machine à états (que j'adore d'ailleurs). Vous devez parcourir le document et décider si un caractère appartient à une clé ou à une valeur du fichier JSON, et lorsque vous avez terminé, renvoyer la sortie à l'utilisateur afin qu'il puisse facilement comprendre le contenu du fichier. Cela peut sembler fastidieux, mais c'est un très bon exercice pour comprendre comment fonctionnent les compilateurs et les interprèteurs lors de l'exécution de votre code.
Bien plus qu'apprendre une langue
Vous l'avez peut-être déjà compris, mais les projets que j'aime mettre en œuvre ne se concentrent pas seulement sur l'apprentissage du langage mais, en même temps, sur une meilleure compréhension des technologies sous-jacentes qui soutiennent les applications modernes (comme les serveurs, les analyseurs, etc. ). Savoir comment ces choses fonctionnent et être capable de les créer par vous-même est bien plus précieux que d'apprendre le dernier framework Web javascript qui sera la norme de l'industrie pendant une semaine. Connaître les détails de bas niveau qui permettent à ces éléments de fonctionner est une compétence bien plus précieuse qui peut facilement être traduite dans d'autres langages.
Ce que j'aime faire, c'est garder autant que possible mes mains à l'écart des bibliothèques tierces et concentrer toute mon attention sur les fonctionnalités standard qu'offrent les langages. La plupart du temps, les bibliothèques externes ajoutent une couche d’abstraction aux détails vraiment importants d’un système. Par exemple, lorsque vous utilisez une bibliothèque pour créer des API REST (comme Fiber pour Go et FastAPI pour Python), vous prenez pour acquis que les requêtes seront traitées par le framework en fonction du verbe HTTP (GET, POST, …) dont elles disposent. Si vous implémentez le serveur vous-même, vous devez prendre en compte ces éléments et gérer les cas en conséquence. Ne vous méprenez pas, vous utiliserez ces frameworks lors de la création d'une application de production. Ils offrent un moyen fiable d'aborder certaines tâches et offrent une meilleure expérience de développement, mais dans le but d'apprendre, je m'en tiendrai à des éléments très basiques et j'essaierai de tout créer à partir de zéro.
Un autre domaine clé que je trouve vraiment utile est la lecture de l’implémentation des fonctions intégrées. Lorsque vous rencontrez une nouvelle fonction, prenez quelques minutes pour voir comment elle est écrite. Vous pouvez apprendre beaucoup de choses sur le langage en lisant l’implémentation. Recherchez les modèles courants qu'ils utilisent pour effectuer certaines tâches, comme la manière dont ils allouent la mémoire, et essayez d'imiter ce style dans vos programmes.
En créant des projets au lieu de passer du temps sur des tutoriels, vous allez mieux comprendre les mécanismes du langage. Choisissez des projets que vous trouvez intéressants (pas nécessairement ceux que j’ai mentionnés plus haut) et que vous souhaitez approfondir. Utilisez autant que possible la bibliothèque standard et essayez d’éviter toute bibliothèque tierce qui ajouterait des abstractions à votre code. N'oubliez pas que si votre objectif est d'apprendre quelque chose de nouveau, vous ferez mieux de comprendre vraiment comment cela fonctionne. Au fur et à mesure que vous vous améliorerez ou que vous créerez une application avec une base d'utilisateurs réelle, vous utiliserez la puissance d'autres bibliothèques et frameworks.
Merci de m’avoir lu!