Conference Langage Go : quels usages ? Blablacar GDG Paris

 

langage go

 

 Soirée dédiée au langage de programmation Go. Ce langage, créé en 2009 par Google, a rapidement rencontré le succès grâce à ses fonctionnalités modernes et à ses excellentes performances.

 

 

Merci aux sponsors, l’association GDG Google Developer Group.

Blablacar avec le blablatalk : « share more, learn more ».

 

Henri Lepic: “Introduction au langage Go et à ses éléments différenciants”

 

Limite des CPUs ces dernières années : les caches et les fréquences entre 2012 et 2015 il y a beaucoup plus de cœurs. Les vieux langages des années 80-90 ne prenaient pas en compte les multi-cœurs : il fallait trouver une nouvelle techno, un langage qui puisse prendre en charge ces nouvelles tehnos.

Go = langage optimisé pour la compilation multi-cœurs.

En 2016, la loi de Moore, c’est terminé

Dans d’autres langages, il y a des points de difficultés, comme le temps de compilation qui reste long.

Exemple avec le C, x11, la recompilation des packages devait être revue.

 

Publications : la génèse de GO

 

Quelques livres

C.A.R.Hoare : « Communicating Sequential Processes »

Brian W K : « The practise of programming »

William Kenedy : « Go in action »

Comparaison entre Java, Python, C++ , temps de compilation trop long ! Une solution ? Oui…

 

La solution : GO

 

La mascotte, le goopher, peluche avec se gros yeux.

Go comme Google : chez Google, il y un nombre considérable de serveurs. Les données qui transitent sont de plus en plus nombreuses.

La GO team : Kent Thomson (Unix), Robert Hsimer (moteur NodeJS & Chrome), Ropek (langage B)

Un bémol : comparé à Java qui avec Maven télécharge les codes compilés en .JAR , il n’y a pas de support de librairies dynamiques en GO, on ne peut pas faire de plugins par exemple.

 

Benchmark de tous les langages

 

Le nombre de mots dans la syntaxe GO : 25 mots clés

Comparé à C++ :72, Java : 50 Javascript : 26

 

Une question? Posez-la ici

 

Les 25 mots clés qui constituent la base du langage GO

 

Mot clé numéro 1 : "package"

 

Le nom d package

 

Mot clé numéro 2 : "import"

 

Importer d’autres pacages

« Const » : astuce, avec iota, on peut incrémenter des nombres, cela permettra de mapper ces valeurs avec d’autres tableaux, car des interfaces permettent de surcharger cetaines fonctionnalités

 

« var »

 

pour déclarer une variable

 

« func »

 

pour les fonctions

 

« return »

 

pour renvoyer une valeur, d’une string dans le cas du Hello World là

func Hello (n string) (res string, e error) {

if len(n)==0{

}

Return « hello world » + n

}

 

Fonctions : signature

 

On peut retourner plusieurs choses à la fois, dont des erreurs

« map » pour avoir des clés pour attribuer des clés,valeurs à cette map comme du json, c’est fait pour stocker de gros volumes de données. On a un temps de récupération des valeurs qui est déterministe.

Exemple : je crée une map, je fais un création littérale, enfin, je récupère la valeur de la variable par la clé, avec le « ok ».

 

« for »

 

pour faire des boucles

Boucle classique, boucle infinie, boucle par clé simple.

« range », c’est à peu près comme le « for », mais je récupère soit la valeur, soit la clé.

« if », « else »

conditions

« continue » 

« switch »

« case »

chose sympa, on n’a pas besoin d’utiliser le break par defaut.

« fallthrough »

faire une cascade pour arriver sur le cas suivant

« break »

« defer » : quand on récupère par exemple le body d’une requêtes REST, pour bien récupérer l’ensemble de la requête, on close avec un « defer » pour avoir un code propre : on ouvre un fichier, on le ferme après

 

« type »

 

pour créer une structure

Type User struct {

Id int

FirstName, LastNAme string

Human

}

 

Ce n’est pas de l’héritage, c’est de la composition

 

« interface »

 

Comme Go est un langage fortement typé, on a une sorte de boite dans laquelle on peut mettre tous les types qu’on veut. « Interface de valeurs » ou « interfaces de contrats »

« select » c’est le switch des chanels, pour bien exploiter le parallélisme ou la concurrence.

« chan » 2 types de channels, non bufférisé, ou bufférisé.

 

« default »

 

« goto » : ca s’utilise avec des labels, c’est quand on a imbriqué une loop avec un select, pour sortir de cette boucle, au préalable il faut avoir déclarer un label pour pouvoir sortir de la boucle.

 

Le 25eme mot clé : « go »

 

Exemple :

Go func(){

Msg <-« non buffered »

}()

 

Beaucoup de recherches sur le mot « Goland » #goland pour ne pas le confondre avec le jeu de GO.

 

Les benchmarks, performances

 

Benchs sur des algos, avec charge CPU, etc, on remarque que dans certains cas, GO dépasse C++

Rappel, le C++ c’est 1200 specs avec STL

GO vs C …

1 release de GO tous les 6 mois

Avant la version 1.4.3, Go n’avait pas de compilateur : le compilateur arrive en 1.5.

 

 

Le garbage collector

 

Reprise des concepts des années 70 pour avoir un garbage collector extremement efficace, comme Java et javascript.

Les temps d’arrêts du garbage collector sont optimisés pour être très courts. Amélioration entre les versions 1.3 , 1.4 et 1.5

 

Quel avenir pour le GO ?

 

Plein de cas d’usages possibles, multiplateformes : ll tourne sur ARM, Windows, Linux, Mac.

Concours French-IOT organisé par La Poste : une partie du projet est développé en GO : tapis connecté.

 

Une question? Posez-la ici

 

Jean-François Bustarret: “Retour d’expérience : Utilisation du langage Go pour développer la plateforme IoT d’un opérateur”

 

Objenious, filiale IOT de Bouygues Telecom. Technologie LoRa. www.objenious.com

LoRa ce sont des objets connectés, capteurs indusctriels, géolocaliation d’animaux, compteurs d’eau, de gaz, parking intelligent, maintenance prédictive, capteurs de vibration…

Tous ces objets sont connectés en radio.

LoRa, cocurrent de Sigfox

Avant, on utilisait un capteur GSM, mais le signal ne passait pas en souterrain. Avec LoRa, le signal passe en soutterain, même sous les bouches d’égouts.

Le avantages de LoRa : piles qui durent plus longtemps

100 millions de capteurs, 150000 messages par seconde, 2Po de stockage : contraintes de dérivabilité.

Pourquoi adopter les technologies en micro-services plutôt que Spark et Storm ?

Pour garantir la livraison des messages, même en cas de panne catastrophique, si le cluster Spark ou Storm tombe par exemple.

Pourquoi Cassandra plutôt que BigTable, Datastore ou BigQuery ?

Pour limiter la dépendance avec Google.

Pubsub, facile à remplacer par Kafka

Google Cloud ? Amazon Web Service ? A etudier pour savoir si on peut héberger en France.

Pourquoi pas une plateforme sur étagère ?

Car souvent il existe de grosses plateformes IOT en JAVA en SaaS :

àPas intéréssant pour le cout d’exploitation, lock-in, coplexité d’adaptation à des besoins très spécifiques.

àSouvent conçues pour une application unique, pour gérer de petites volumétries.

 

Une question? Posez-la ici

 

Pourquoi GO ?

 

Parce qu’on embauche chez Objenious et que Go va avec le package.

 

Benchmark des différents langages, quel langage choisir pour notre IOT?

 

C, C++ ?

Pas assez productifs, gestion de la mémoire, concurrence complexe.

 

Java ?

Pas assez productif, pas assezefficace niveau mémoire, concurrence complexe.

 

Python ?

Pas assez performant, concurrence complexe.

 

JS/Node ?

Pas assez deterministe, difficile à maintenir, pas adapté aux tâches CPU intensives.

 

Rust ? D ? Scala ? Erlang ?

Trop exotique, manque de communauté/support, difficile de trouver des devs

 

PHP ? Ruby ?

Pas gérables en IOT pour de gros volumes.

 

Go c’est facile

 

70 pages de specs contre 700 pages pour Java.

Facile à apprendre : la syntaxe ressemble à du C ou du python

à coder, librairies standard

à maintenir, style imposé, langage stable

à exploiter, binaires statiques, compilation rapide, cross-compilation, instrumentation facile.

Outils : GOfmt qui a comme seul objectif de formater les données, godoc, gometalinter…

Un code GO 1.0 fonctionen en 1.8, en 1.9

Multi plateformes .

Facile à instrumenter contrairement à Node.

 

Go vs Java

 

Gestion de la mémoire plus efficace pour GO

Benchmark pour une plateforme type pour 2 millions de capteurs :

Java/Python : 20 serveurs (avec entreprise service Bus…)

Objenious : 8 serveurs (économie de mémoire)

Côté coûts ?

-80% de coût d’exploitation/capteur connecté.

Point d’équilibre : 67 développeurs.

Donc on a choisi GO : les financiers s’en fichent de GO ou de JAVA, ce qu’ils veulent c’est que le coût soit moins cher.

 

Une question? Posez-la ici

 

Comparaison avec les autres langages, chercher « Go sucks »

 

Un langage qui n’apporte rien de nouveau

La gestion des erreurs est verbeuse, il faut les gérer et ça prend la moitié du code !

Le typage fort est contraignant

Ca évite de faire du test unitaire pour vérifier que le bon type est utilisé partout.

Pour ceux qui viennent du C++, il n’y a pas de génériques, types abstraits, templating

Vendoring pas totalement standardisé.

Machine learning : pas assez évolué comparé à Python et Java

Peu de développeurs sur le marché

Facile à apprendre, en quelques semaines on est très productif.

Les avantages :

La lbrairie standard permet de faire des serveurs http, http2, compression, tls… décodate json/xml/CSV…

Frameworks de micro services : go-kit et go-micro qui fonctionnent en RPC

Quel sont les IDEs utilisés : Atom ou intelliji (qui a un très bon support de GO) ou Sublime pour ceux qui sont sur Mac, ou PhpStorm, Netbeans, Eclipse, Emacs, Vim

Packages utilisés

Logs structurés, Kibana, isntrumentation, Grafana, erreurs contextuelles, Rollbar, tests, goconvey + wercker

  

Besoin d'une revue de code en Go? Remplissez ce formulaire: