GoSuda

Cinq caractéristiques de conception du langage Go du point de vue de l'ingénierie des systèmes et du backend

By Rabbit Princess views ...

Introduction

Les langages de programmation sont des outils permettant de créer des produits. Le simple fait d'utiliser un langage particulier ne détermine pas le niveau d'un développeur. Toutefois, le choix d'un langage et la manière dont on l'utilise peuvent avoir une influence directe sur la façon de penser et sur la direction de la progression d'un développeur. En particulier, sortir du langage que l'on utilise actuellement pour le comparer à d'autres langages contribue fortement à élargir sa vision technique et à développer un sens de l'essentiel. Dans cet article, je vais tenter d'expliquer, en cinq aspects, pourquoi j'ai choisi Go et en quoi il favorise la progression du développeur.

1. Go est un langage qui établit un équilibre entre performance et productivité.

Il existe un grand nombre de langages de programmation, et chacun présente des avantages et des inconvénients selon ses caractéristiques.

  • C offre d'excellentes performances et permet un contrôle de bas niveau, mais le développeur doit gérer lui-même la mémoire, et l'absence de fonctionnalités de haut niveau réduit la productivité et rend la maintenance difficile.
  • C++ et Rust prennent en charge diverses fonctionnalités avancées telles que la programmation orientée objet, les templates et la métaprogrammation, mais leur syntaxe est complexe, leur courbe d'apprentissage est abrupte et leur compilation lente les rend peu adaptés aux déploiements fréquents.
  • Java et C# offrent une indépendance vis-à-vis des plateformes et une grande stabilité, ce qui les rend largement utilisés pour les services à grande échelle, mais ils s'exécutent sur une machine virtuelle lourde, ce qui complique le déploiement et l'environnement d'exécution et élève les besoins en ressources.
  • Python et JavaScript conviennent bien au développement rapide grâce à leur syntaxe concise et à leur écosystème riche, mais leurs performances d'exécution sont limitées et la fiabilité de leur écosystème est faible, ce qui révèle des limites structurelles dans les systèmes à grande échelle.

En revanche, Golang présente un excellent équilibre entre performance et productivité. Go est un langage compilé, comme C, ce qui garantit une performance d'exécution élevée, tout en offrant, grâce à une compilation rapide, une souplesse de déploiement comparable à celle d'un interpréteur. Autrement dit, Go est un langage équilibré, utilisable de manière fiable dans la plupart des environnements, sans inconvénient majeur évident.

2. Go empêche la programmation de type culte du cargo (cargo cult programming).

Pendant la Seconde Guerre mondiale, les forces alliées ont construit une base aérienne sur une île du Pacifique afin de soutenir l'effort de guerre. Les vastes quantités de fournitures et d'équipements militaires ont profondément transformé la vie des soldats et des habitants autochtones. Les habitants ont vu pour la première fois des avions transporter des vêtements manufacturés, des conserves alimentaires et d'autres biens. Lorsque la guerre a pris fin, la base a été abandonnée et les cargaisons ont cessé d'arriver. Les habitants de l'île ont alors tenté d'imiter les militaires : ils se sont habillés en contrôleurs aériens, en soldats et en marins, ont aménagé une piste d'atterrissage improvisée et ont utilisé des bâtons pour envoyer des signaux d'atterrissage aux avions. Ils ont continué à défiler dans l'espoir que les avions larguent des cargaisons par parachute. Pourtant, les avions qu'ils attendaient ne sont jamais revenus.

La programmation de type culte du cargo désigne une habitude de développement qui consiste à imiter les apparences d'un code ou d'une technologie sans en comprendre les principes. Aujourd'hui, les développeurs, en particulier dans le domaine du développement web, adoptent fréquemment cette habitude de reproduire sans comprendre. Les frameworks tels que React, Next, Spring et Django ont rendu possible le développement sans connaître leur structure interne, mais de nombreux développeurs ne parviennent pas à réagir correctement, même face à une simple erreur. À cela s'ajoutent les outils de génération de code par IA récents, qui renforcent encore davantage une pratique consistant à copier-coller les résultats plutôt qu'à écrire le code soi-même ou à en comprendre le principe.

Go rejette fondamentalement ce problème au niveau de sa philosophie de conception. Go est un langage conçu autour de la bibliothèque standard plutôt qu'autour des frameworks. Le développeur peut construire un serveur web de niveau production uniquement avec des bibliothèques de base telles que net/http et database/sql, et acquiert ainsi naturellement une intuition et une compréhension des structures de bas niveau, comme le réseau, les bases de données et les entrées-sorties. Une structure qui permet d'acquérir des bases solides sans dépendre de frameworks devient ainsi le fondement sur lequel le développeur peut progresser durablement, sans perdre de vue l'essentiel de la technologie.

3. Go offre un modèle de concurrence puissant.

Les processeurs modernes évoluent davantage en exploitant plusieurs cœurs en parallèle pour améliorer les performances qu'en augmentant la vitesse d'un seul cœur. Dans ce contexte, la concurrence, qui permet à un programme de traiter plusieurs tâches simultanément, est devenue indispensable, et l'importance d'un langage capable de la concevoir et de l'implémenter efficacement ne cesse de croître. Go est un langage optimisé pour cet environnement. Une goroutine est un thread léger fourni par Go, qui peut être créé avec une pile de quelques Ko seulement ; même en exécutant des milliers de goroutines simultanément, elle consomme très peu de ressources système. Le runtime de Go distribue efficacement un grand nombre de goroutines sur les threads du système d'exploitation grâce à son propre ordonnanceur M:N, et ce processus est optimisé automatiquement sans intervention directe du développeur. Ainsi, le développeur peut concevoir une logique de concurrence sûre et cohérente sans logique de synchronisation complexe ni ordonnancement personnalisé.

Go prend également en charge de manière active une conception moderne de la concurrence, à l'aide d'outils de synchronisation tels que mutex et waitGroup, ainsi que de channels et de context. Grâce à cette structure, le développeur peut acquérir naturellement un sens pratique de la concurrence et du parallélisme sans se perdre dans une théorie complexe, et atteindre un niveau élevé d'abstraction et de capacité de conception directement exploitable.

4. Go est un langage conçu par d'excellents développeurs qui en ont assuré la cohérence.

Go est un langage né sous l'impulsion de Google et de légendes du développement telles que Robert Griesemer, Rob Pike et Ken Thompson. En particulier, ces personnes sont les créateurs d'Unix et du langage C, et des maîtres des compilateurs et des logiciels système, ce qui atteste à lui seul de la fiabilité technique de Go. À cela s'ajoute l'expérience pratique de nombreux ingénieurs de Google et leur savoir-faire dans l'exploitation de services à grande échelle, ce qui fait que Go, dès le départ, vise la résolution de problèmes concrets et évolue avec une philosophie et une orientation cohérentes.

D'autres langages provoquent souvent de la confusion au sein de leur communauté et chez leurs utilisateurs en raison de ruptures de compatibilité, de changements de conception, d'une licence instable ou d'un écosystème non standardisé. Par exemple, Python a vu son écosystème scindé pendant des années à cause de la rupture de compatibilité entre les versions 2 et 3, et Java, après le rachat par Oracle, a connu une instabilité de sa politique de licence, qui a incité de plus en plus d'entreprises à hésiter à l'adopter. De plus, Node.js coexiste toujours avec CJS et ESM, et ne parvient pas à offrir un système de modules cohérent.

En revanche, Go fait de la cohérence et de la stabilité ses valeurs prioritaires. L'équipe de Go maintient rigoureusement la compatibilité ascendante et, lors de l'introduction de nouvelles fonctionnalités, adopte une approche d'intégration progressive afin qu'elles n'entrent pas en conflit avec le code existant. Quant à la syntaxe, elle évite les mots-clés superflus et limite les abstractions excessives, ce qui empêche le langage lui-même de devenir inutilement complexe. De plus, une chaîne d'outils officielle et cohérente, comprenant go fmt, go mod, go build et go test, incite tous les projets Go à adopter le même environnement de développement et la même structure. Par ailleurs, une bibliothèque standard solide et pratique couvre de manière fiable, sans framework supplémentaire, la plupart des besoins du développement réel, tels que les serveurs web, le traitement de fichiers et l'intégration de bases de données.

5. Les Gophers sont adorables.

Gopher1

Gopher2

Gopher3