Go, un outil ergonomique

Salut à tous, je voudrais parler de Go et pourquoi je trouve que c’est une technologie que j’apprécie beaucoup.

Je vais parler de Go et de son environnement tel qu’il est aujourd’hui (version 1.21)

La simplicité

Quelque chose que j’aime beaucoup est la simplicité de cet outil. Quand on install de quoi développer avec ce langage nous n’avons pas uniquement le langage.

Le formatage

Nous avons à disposition un outil pour formatter le code. De la sorte nous n’avons aucune question à nous poser sur comment formatter notre code. Contrairement à d’autres technologies qui proposent un style et des outils externents qui permettent ce formatage. (Ici je pense à python avec Black ou encore ce qu’on peut voir dans les environnements javascript)
Ce que j’apprécie est le fait de ne pas se poser la question «Quel outils je dois choisir ?», «Comment je le fais fonctionner dans mon projet ?». Ici rien de tout ça ! On a l’outil avec le langage. En plus cela permet de garantir que tous les IDE, éditeurs de code, … pourront implémenter, dans l’environnement, le formatage.
En plus d’avoir un outil venant avec le langage, rien ne nous empèche d’utiliser un outil externe pour le formatage que nous pourrions configurer en fonction de nos préférences.

La gestion des dépendances

Comme tous les langages de programmation, Go permet aux développeurs de crée leur propre librairie et de se les partager entre eux. Pour cela on utilise un outil qui permet de faire de manière automatisée toutes les étapes dont notre technologie à besoins.
Ici aussi l’outil qui permet de faire ça est inclu lors de l’installation. Contrairement à d’autre environnement de certains langages il y en a un par défaut qui vient des mêmes personnes qui créent le langage.
Ici je pense à l’univers java qui peut venir avec des gestionnaires de projets/dépendances différents, ou bien à l’univers javascript.
Ici, pas de question sur quels outils utilisés, pas de question sur quel outils fonctionne le mieux pour mon projet, pas de documentation externe (à celle du langage) à lire en plus. Tout est centralisé avec le même outil et la documentation.

Le langage

Le langage Go est volontairement simpliste dans les mots qu’il utilise. Sa simplicité permet, je trouve, de se concentrer sur le problème à résoudre plutôt que de comment le résoudre avec notre outil.
Il permet aussi de rendre accessible à tous le monde la lecture du code, même pour quelqu’un qui n’en a jamais vu.
Cela permet aux développeurs de lire du code source facilement. Le code, qui peut-être très complexe, doit être résolu de manière simple (dû au langage simpliste). On peut être assuré que que tout le code que l’on verra sera simple. Ça permet aux développeurs novice de facilement mettre le nez sous le capot.

Cette simplicité permet à tous le monde de facilement aborder ce langage et son environement.

Tous le monde peut faire du Go

Le langage étant tellement simple que tous les développeurs venant d’autres technologies (C, C++, C#, Java, Python, …) peuvent l’aborder rapidement et très vite s’amuser avec.
Ici je pense par exemple à Rust pour lequel il faut je pense plusieurs mois à certains développeurs pour être à l’aise avec cet outil. Avec Go, si vous avez déjà utilisé un autre langage de programmation, il suffit de passer entre 15 et 30 minutes pour faire le Tour of Go et vous êtes prêt à vous amuser à faire un petit projet pour la mise en pratique.

Un outil ergonomique

À mon sens Go est un outil ergonomique. Ce que j’entends par cette idée c’est que la priorité mise est l’expérience utilisateur. Donc l’expérience des développeurs a utilisé cet outil. Je pense à l’intégration des génériques au langage. Celle-ci a pris plusieurs années et plusieurs propositions avant d’être intégré au langage. Le but n’était pas de se presser à intégrer la fonctionnalité mais de comment la rendre facile à comprendre, lire et écrire.
C’est ça qui me donne l’impression que l’outil (le langage) est conçu en pensant à son utilisation et non aux fonctionnalités.



13 commentaires

Je suis globalement d’accord avec l’esprit général du billet, notamment sur l’expérience développeur en partie grâce au tooling bien unifié (comme d’autres langages de sa génération).

J’ajouterais aussi l’expérience "Ops" que Go apporte. La compilation statique et multi-plateforme out-of-the-box fait que les CI sont plutôt simples à mettre en place et que le déploiement sur un parc hétérogène (instances AMD64 et AArch64) est facilitée. La conteneurisation aussi est pas mal simplifiée, si je compare avec les images que je devais faire avec mes projets Python, et avec un startup time qui est généralement très bon, ce qui est utile pour certains workloads où des conteneurs doivent "roller" le plus rapidement possible (sur k8s ou ECS par exemple). Dans un contexte d’infrastructure dans le Cloud, Go est donc pour moi très ergonomique. Aujourd’hui, pour le type de projets sur lesquels je travaille, c’est limite l’aspect le plus important.

Il permet aussi de rendre accessible à tous le monde la lecture du code, même pour quelqu’un qui n’en a jamais vu. Cela permet aux développeurs de lire du code source facilement. Le code, qui peut-être très complexe, doit être résolu de manière simple (dû au langage simpliste). On peut être assuré que que tout le code que l’on verra sera simple. Ça permet aux développeurs novice de facilement mettre le nez sous le capot.

La lecture aisée du code écrit en Go est un point qui est souvent mis en avant. Je ne peux pas dire que je suis en désaccord fondamentalement, je vais moi-même souvent lire la stdlib pour savoir comment un élément fonctionne dans le détail et je suis souvent surpris de la fluidité de l’expérience.

Mais je me suis toujours demandé s’il n’y avait pas un biais : la population affirmant cela est sûrement déjà assez expérimentée, habituée à lire et relire du code écrit par d’autres.

Le langage étant tellement simple que tous les développeurs venant d’autres technologies (C, C++, C#, Java, Python, …) peuvent l’aborder rapidement et très vite s’amuser avec.

Avant le Go, Python a été mon langage principal en perso et en entreprise pendant des années. (Je ne peux pas me prononcer pour les gens ayant un background C, C++, C# ou Java.) Passer à Go m’a quand même un peu secoué. C’était pas difficile, mais il y avait quand même certaines notions à bien (re)voir pour ne pas écrire du Go n’importe comment. Pensons aux notions de passage par valeur et par référence (un problème qui ne se posait pas vraiment quand je faisais du Python) et le code concurrent qui n’était pas tout à fait similaire à ce que je faisais avec les coroutines asynchrones, même si les patterns de concurrence généraux se retrouvent parfois. Il y a aussi quelques gotchas bas-niveau qu’il vaut mieux connaître et comprendre !

J’ajouterais aussi l’expérience "Ops" que Go apporte. La compilation statique et multi-plateforme out-of-the-box fait que les CI sont plutôt simples à mettre en place et que le déploiement sur un parc hétérogène (instances AMD64 et AArch64) est facilitée.

sgble

Mais est-ce qu’à l’inverse ce n’est pas un frein pour des applications desktop de ne pas bénéficier des bibliothèques partagées sur le système et d’avoir à la place des gros programmes qui embarquent toutes leurs libs ?

Mais je me suis toujours demandé s’il n’y avait pas un biais : la population affirmant cela est sûrement déjà assez expérimentée, habituée à lire et relire du code écrit par d’autres.

sgble

Ne connaissant pas du tout le Go je suis allé jeter un œil à plusieurs fichiers source de la stdlib, et je pense que ça confirme l’idée du biais. J’arrive à comprendre le code parce que ça ressemble tout de même beaucoup au C (mêmes opérateurs, mêmes structures dans le code) mais je ne dirais pas que c’est facile à lire.

J’ajouterais aussi l’expérience "Ops" que Go apporte. La compilation statique et multi-plateforme out-of-the-box fait que les CI sont plutôt simples à mettre en place et que le déploiement sur un parc hétérogène (instances AMD64 et AArch64) est facilitée.

sgble

Mais est-ce qu’à l’inverse ce n’est pas un frein pour des applications desktop de ne pas bénéficier des bibliothèques partagées sur le système et d’avoir à la place des gros programmes qui embarquent toutes leurs libs ?

C’est bien possible, oui. Mais je t’avoue que je n’ai jamais travaillé sur des projets de ce type.

D’ailleurs, puisque tu abordes le sujet, Go c’est quand même un peu une île isolée du grand continent ; dès que tu as besoin de le lier à des lib qui viennent d’ailleurs avec cgo, tu perds quand même une petite partie de la convénience dont j’ai parlée, il faut bien l’admettre.

La lecture aisée du code écrit en Go est un point qui est souvent mis en avant. Je ne peux pas dire que je suis en désaccord fondamentalement, je vais moi-même souvent lire la stdlib pour savoir comment un élément fonctionne dans le détail et je suis souvent surpris de la fluidité de l’expérience.

Mais je me suis toujours demandé s’il n’y avait pas un biais : la population affirmant cela est sûrement déjà assez expérimentée, habituée à lire et relire du code écrit par d’autres.

À mes yeux, utiliser la stdlib pour jauger de la lisibilité du langage tombe un peu dans le même biais que les bancs de microbenchmarks pour comparer les perfs des langages : ça donne une information parcellaire qu’on ne peut pas vraiment généraliser.

Je pense que la facilité de lecture ne se mesure pas forcément en lisant la stdlib mais plutôt quand on rentre dans un gros projet dans la vraie vie. Et encore je pense que l’adjectif le plus adapté n’est pas "facile" mais "boring", "sans surprise".

Go est un de ces rares langages qui ne permettent pas de "golfer", contrairement à Python, par exemple, dont la facilité de lecture est légendaire au sens littéral, c’est-à-dire mythique, c’est-à-dire célèbre mais inventée de toute pièce et très largement exagérée.

Dès lors que l’on restreint l’expressivité du langage à un ensemble réduit de structures syntaxiques simples et bien connues de tout le monde, on ne peut plus surprendre, perdre, ni induire les lecteurs en erreur à grands coups de listes ou de générateurs en intension, de "async truc" ou "yield machin", de "clause finally dans une boucle for", de décorateurs magiques… ou encore d’itérateurs placés en chaîne comme en Rust.

Go est "boring", donc verbeux et explicite, ce qui, entre de bonnes mains, pousse les devs à adopter les bonnes pratiques (factoriser, isoler les éléments de code dans des fonctions que l’on se fait un devoir de nommer de façon claire, ce qui se ressent, par conséquent, sur la testabilité du code). Ce que cela encourage, c’est notamment à exprimer les règles métier d’un programme d’une façon qui n’a pas vraiment la possibilité d’être mal comprise ou mal maîtrisée.

Et ça, en effet, c’est hyper reposant.

Ça l’est aussi dans la mesure où il est très courant de générer du code Go : de tout temps le code généré a été notoirement célèbre pour être chiant à lire. En Go, ce n’est pas le cas : il est généré parce que quelqu’un, un jour, l’a trouvé chiant à écrire, mais d’expérience et sauf exceptions rares (genre abus de goto), il reste aussi lisible que le code produit par un humain, et donc "reviewable".

Après c’est comme partout, on peut aussi trouver du code mal foutu, mal découpé, mal pensé, ou difficile à suivre en Go. Le langage et ses qualités intrinsèques ne sauraient remplacer la compétence de la personne qui l’utilise.

+1 -0

À mes yeux, utiliser la stdlib pour jauger de la lisibilité du langage tombe un peu dans le même biais que les bancs de microbenchmarks pour comparer les perfs des langages : ça donne une information parcellaire qu’on ne peut pas vraiment généraliser.

Je me suis mal exprimé, ce n’est pas tout à fait ce que j’ai voulu dire et je ne veux pas généraliser l’ensemble des codes en Go à partir de la stdlib. Je m’attendrais toutefois à un certain caractère prescriptif, mais c’est un autre sujet.

Ce que cela encourage, c’est notamment à exprimer les règles métier d’un programme d’une façon qui n’a pas vraiment la possibilité d’être mal comprise ou mal maîtrisée.

C’est vrai, au point que j’ai déjà eu à lire le code directement pour me rendre plus explicites les règles métier d’un programme. Mon exemple le plus récent, c’est d’avoir lu le code de image/jpeg pour comprendre certains aspects de JPEG/JFIF que je ne saisissais pas totalement en lisant sa norme ITU-T. En l’occurrence c’est dans la stdlib, mais c’est ici contingent (j’ai aussi eu à le faire en dehors). C’était plutôt ça l’esprit de ma remarque avec la stdlib, d’ailleurs (je pensais à cet exemple précis) ;)

+1 -0

Merci pour ce billet qui donne envie de tester le Go. Pour mettre un peu de contexte, je développe principalement en C#, j’aime beaucoup ce langage mais je trouve qu’il a tendance à se "complexifier" avec le temps (de plus en plus de feature et de syntaxe). Étant dans une phase ou j’ai envie de découvrir de nouvelles choses, je me dis pourquoi pas le go. Pour ceux qui l’utilise en entreprise, vous l’utilisez dans quel contexte / sorte de projet ? J’ai l’impression qu’en France, il n’est pas très répandu, c’est juste une impression ou une réalité ?

Merci pour ce billet qui donne envie de tester le Go. Pour mettre un peu de contexte, je développe principalement en C#, j’aime beaucoup ce langage mais je trouve qu’il a tendance à se "complexifier" avec le temps (de plus en plus de feature et de syntaxe). Étant dans une phase ou j’ai envie de découvrir de nouvelles choses, je me dis pourquoi pas le go. Pour ceux qui l’utilise en entreprise, vous l’utilisez dans quel contexte / sorte de projet ? J’ai l’impression qu’en France, il n’est pas très répandu, c’est juste une impression ou une réalité ?

anonyme

Il y a deux domaines d’application où il est vraiment bien installé :

  • les serveurs (de backend ou d’infrastructure),
  • les clients en ligne de commande (docker, kubectl, etc.).

D’autres sont évidemment possibles mais dans le monde "pro" c’est essentiellement là qu’on le trouve et qu’il brille.

+1 -0

Pour ceux qui l’utilise en entreprise, vous l’utilisez dans quel contexte / sorte de projet ? J’ai l’impression qu’en France, il n’est pas très répandu, c’est juste une impression ou une réalité ?

Je ne manque pas de recruteurs (en France) qui me proposent des postes en rapport avec Go spécifiquement. Autant qu’en Python, je dirais, pour ce que mon anecdote vaut.

De ce que je vois pour le moment, le profil des entreprises (en France) qui utilisent Go vont plutôt être sur des produits qui ont un aspect très infra et systèmes (par exemple produit d’automatisation, produits d’audit système, produit PaaS dans le Cloud). Tandis que les offres en Python que j’obtiens, ça sera plutôt pour des entreprises éditant un SaaS (typiquement avec Django).

Je suis tombé sur un lien très à propos de notre conversation de la semaine dernière, je partage ça avec vous : https://github.com/SuperPaintman/the-evolution-of-a-go-programmer

J’ajouterais aussi l’expérience "Ops" que Go apporte. La compilation statique et multi-plateforme out-of-the-box fait que les CI sont plutôt simples à mettre en place et que le déploiement sur un parc hétérogène (instances AMD64 et AArch64) est facilitée.

sgble

Mais est-ce qu’à l’inverse ce n’est pas un frein pour des applications desktop de ne pas bénéficier des bibliothèques partagées sur le système et d’avoir à la place des gros programmes qui embarquent toutes leurs libs ?

entwanne

La pratique est pourtant déjà courante, en tout cas de ce que je perçois (donc biais possible), sans que ce soit problématique de prime abord.
J’entends qu’il y a de plus en plus d’usage de « snap » et similaires sous GNU/Linux, et avant cela il existait déjà des « optware » même si c’était plus réservé (et moins pour des applis bureautique mais plus pour des trucs propriétaires qui fonctionnent en console et/ou démon.) Je vois aussi de plus en plus d’applications Electron où cela semble être le cas : on embarque son instance de navigateur et on n’utilise quasiment pas de bibliothèque système (bon, je crois en vrai qu’on fait appel au minimum indirectement.) De ce que je vois, sous Android et iOS, les applications mobiles partagent peu de bibliothèques (mais utilisent le minimum disponible selon ce que le manifeste autorise ?)

Si ce n’est pas un frein, je ne dis pas que c’est génial d’une part pour l’espace disque consommé et parce-que d’autre part certaines failles sont dupliquées et patchées individuellement.

+0 -0

Étant un vulgaire débutant en golang je peux affirmer qu’il est assez facile de le prendre en main, pourtant je ne connais pas d’autre langue , il y a juste la syntaxe strict trop strict parfois qui est relou mais c’est un mal pour un bien , ca évite de débuguer 2000 ligne de code par la suite . +1 pour le sujet .

il y a juste la syntaxe strict trop strict parfois qui est relou mais c’est un mal pour un bien , ca évite de débuguer 2000 ligne de code par la suite .

wesleyxv12

Quand tu parles que le langage est trop stricte je pense que tu fais allusion au faut que ce soit un langage avec un typage statique et fort.

Le typage statique signifie qu’une variable ne peut pas changer de type. Par exemple si une variable contien une chaine de caractère (string) on ne peut pas par la suite y mettre un nombre entier (int).
Le typage fort signifie que le langage ne pas essayer de convertir les types à notre place lors de certaines opérations. Par exemple on ne peut pas additionner des nombres entiers (int) et des nombres à virgules (float).

Si tu veux voir ces différences en pratiques tu peux essayer de faire du Python qui est un langage avec un typage dynamique (l’inverse du typage statique) et un typage fort.
À l’opposé, tu peux aussi essayer le JavaScript qui est un langage avec un typage dynamique et faible (on peut par exemple multiplier des chaines de caractères et des nombres).

+0 -0

Je vais terminer le go et j’essaierai ce que tu m’as décrit. Alors oui, il est vrai qu’il faut typer ce que l’on code pour que le code fonctionne en golang, (en vérité ça ne me dérange pas ça car ça me force à apprendre et à retenir tout ce que je fais), j’évite même le plus possible d’assigner avec := mais plutôt décrire la variable dans le but de L’apprentissage, mais il suffit d’oublier un . Dans une fonction , de zapper la fermeture de l’accolade , ou de mal positionner une parenthèse pour fausser le code " c’est du basic " mais c’est frustrant parfois . en sois l’apprentissage est plutôt facile , il faut juste "" apprendre à coder ""

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte