Conference Langage Go : quels usages ? Blablacar GDG Paris
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: