Slide 1

Slide 1 text

1 Présenté le 3 juillet 2014 à Sophia-Antipolis lors de la soirée « Nouvelles tendances du développement web » de la SophiaConf. CC-BY-NC-SA You can quote, reuse and remix this presentation as long as you cite me, but you may not make money out of it, including from training classes. If you include parts of this work in yours, you must make your own work available to the public for reuse too. Also, it would be nice from you to let me know about it :) If you want to use this material otherwise, please contact me.

Slide 2

Slide 2 text

M AT T I S C H N E I D E R / / @ M AT T I _ S G X Développe des applications web de manière agile, actuellement en tant qu’indépendant. 7 ans de développement JS. 3 ans d’usage quotidien de Node, notamment à travers Watai, un outil de test d’intégration d’application web.

Slide 3

Slide 3 text

X Parler de Node en 2014… pour dire quoi ? Cela fait maintenant cinq ans que cet exécutable permettant d’exécuter du code JavaScript en dehors du navigateur est disponible, Node en tant que tel n'est donc plus une « nouvelle tendance ». Je vais donc essayer d'isoler ce qui l’est.

Slide 4

Slide 4 text

API 2 Avant tout, qu’est-ce que Node ? Le terme recouvre plusieurs composantes de maturité variable.

Slide 5

Slide 5 text

API 3 Maturité Nous allons rapidement les passer en revue et préciser leur niveau respectif de maturité.

Slide 6

Slide 6 text

4 Maturité API Le langage JavaScript existe depuis vingt ans, est aujourd’hui mature et continue à évoluer (ES6), mais avec un organisme responsable de sa compatibilité ascendante et à un rythme très lent.

Slide 7

Slide 7 text

5 Maturité API La machine virtuelle V8, qui interprète le langage, continue à évoluer régulièrement. On observe notamment une augmentation continue des performances, mais également une très bonne stabilité. À la base, c’est l’interprète JavaScript de Google Chrome, qui a été extrait du contexte du navigateur pour permettre l’exécution de JavaScript de manière indépendante.

Slide 8

Slide 8 text

6 Maturité API Extraire l’interprète est nécessaire, mais pas suffisant au découplage d’avec le navigateur. C’est l’API de Node qui permet l’interaction avec le système d’exploitation plutôt qu'avec le navigateur (ouvrir des fichiers, des sockets plutôt que modifier des éléments du DOM).

Slide 9

Slide 9 text

7 Maturité API Quand on parle de Node, on inclut aussi aujourd’hui le gestionnaire de paquets NPM (Node Package Manager). Exécutable indépendant, mais installé par défaut par tout installateur de Node. Relativement stable, mais la compatibilité ascendante n’est pas toujours respectée.

Slide 10

Slide 10 text

8 Maturité API Le registre public des modules NPM et le réseau de distribution associé font aussi partie de l’écosystème Node, puisque ce sont eux qui rendent accessibles les modules… du moins quand ils sont disponibles ! C’est la composante aujourd’hui la moins mature de l’écosystème, avec de nombreux modules de mauvaise qualité, et de régulières indisponibilités. Il faut dire que l’architecture n’avait pas été prévue pour 13 millions de téléchargements par jour…

Slide 11

Slide 11 text

API plateforme 9 Le point principal est que “Node.js is a platform” (source), dont tous les composants ne sont pas au même niveau de maturité. Néanmoins, une tendance claire se dégage.

Slide 12

Slide 12 text

10 M AT U R AT I O N tendance #1 C’est celle d’une maturation de l’écosystème. Aujourd’hui, les utilisateurs de Node ne sont plus dans une phase exploratoire, et attendent de toutes les composantes qu’elles se stabilisent pour pouvoir développer des applications de grande envergure. C’est en effet l’objectif annoncé de la plateforme : faciliter la création de programmes réseaux qui passent à l’échelle.

Slide 13

Slide 13 text

programmes réseaux 11 “Node's goal is to provide an easy way to build scalable network programs.” (source). Mais qu’est-ce qui n’est pas encore un programme réseau ? Tout se connecte (IoT…). Tout programme devient donc un programme réseau.

Slide 14

Slide 14 text

application web 12 Plus précisément, tout programme devient un programme réseau avec, le plus souvent, une application web en bout de chaîne pour présenter les résultats à l’utilisateur final.

Slide 15

Slide 15 text

– J E F F AT W O O D ( @ C O D I N G H O R R O R ) « Toute application sera bientôt une application web. » 13 Vous connaissez forcément Jeff Atwood, même sans le savoir. C’est un des cofondateurs de StackOverflow. Jeff Atwood nous disait déjà en 2009, indépendamment de Node : “Pretty soon, all programming will be web programming.”.

Slide 16

Slide 16 text

14 Que signifie qu’une application devienne une « application web » ? Quelle est la différence aujourd’hui ? Elle semble de plus en plus ténue. La frontière n’est plus dans l’interactivité depuis le « Web 2.0 ».

Slide 17

Slide 17 text

15 Et elle ne semble plus dans les performances ou la complexité non plus. En 2011 déjà, on faisait de la synthèse vocale dans le navigateur grâce à speak.js, port d’eSpeak (C++) via emscripten (compilateur LLVM → JS).

Slide 18

Slide 18 text

16 On peut même aller plus loin en étendant cette analyse à toute la « plateforme web », c’est-à-dire les technologies connexes à JavaScript tels que WebGL, canvas… Mars 2013 : Mozilla aide à porter Unreal Engine 3 (UT3) en 4 jours, 40% des performances natives. Mars 2014 : Unreal Engine 4 (encore peu de jeux avec ce moteur, premier sorti : Daylight, PS4, 29 avril 2014), 67% des performances natives.

Slide 19

Slide 19 text

17 Il est donc clair que la frontière entre une « application » et une « application web » s’efface, ce qui semble donner raison à Atwood. Atwood est d’ailleurs allé plus loin, avec sa fameuse « loi d’Atwood ».

Slide 20

Slide 20 text

– J E F F AT W O O D ( @ C O D I N G H O R R O R ) « Toute application qui peut être écrite en JavaScript sera à terme écrite en JavaScript. » 18 Dans The principle of least power, 2007-07-17 (deux ans avant Node). C’est là que ceux qui ne le connaissaient pas comprennent pourquoi son blog s’appelle CodingHorror… Si cette prophétie s’avère vraie, alors Node, en venant étendre la quantité d’applications qui peuvent être écrites en JavaScript, devrait générer une immense production d’applications écrites en JavaScript.

Slide 21

Slide 21 text

19 Cette prophétie se réalise-t-elle pour les applications écrites en JavaScript en dehors du côté client ?

Slide 22

Slide 22 text

2011/06/26 2011/12/26 2012/06/26 2012/12/26 2013/06/27 2013/12/27 2014/06/28 Clojars (Clojure) CPAN (Perl) GoDoc (Go) Maven Central (Java) Rubygems.org nuget (.NET) Packagist (PHP) PyPI (Python) npm (node.js) 20 Évolution du nombre de paquets publics Il semblerait que oui, si l’on se base sur le nombre de modules publiés sur les registres publics des langages les plus utilisé (source : modulecounts.com). Le 30 juin 2014, Maven, premier dépôt depuis toujours en termes de modules hébergés, a été dépassé par NPM avec 80970 modules publiés contre 80962. Évidemment, il y a des biais : JavaScript et Node aident à créer des micro-bibliothèques, et on publie en partie des bibliothèques frontend, ce qui pousse au grand nombre. Et on a en tant qu’usager les inconvénients de ce grand nombre… Tweet : @_kud, 2014-03-25. Une discussion intéressante s’ensuit.

Slide 23

Slide 23 text

2011/06/26 2011/12/26 2012/06/26 2012/12/26 2013/06/27 2013/12/27 2014/06/28 Clojars (Clojure) CPAN (Perl) GoDoc (Go) Maven Central (Java) Rubygems.org nuget (.NET) Packagist (PHP) PyPI (Python) npm (node.js) 20 Évolution du nombre de paquets publics Il semblerait que oui, si l’on se base sur le nombre de modules publiés sur les registres publics des langages les plus utilisé (source : modulecounts.com). Le 30 juin 2014, Maven, premier dépôt depuis toujours en termes de modules hébergés, a été dépassé par NPM avec 80970 modules publiés contre 80962. Évidemment, il y a des biais : JavaScript et Node aident à créer des micro-bibliothèques, et on publie en partie des bibliothèques frontend, ce qui pousse au grand nombre. Et on a en tant qu’usager les inconvénients de ce grand nombre… Tweet : @_kud, 2014-03-25. Une discussion intéressante s’ensuit.

Slide 24

Slide 24 text

2011/06/26 2011/12/26 2012/06/26 2012/12/26 2013/06/27 2013/12/27 2014/06/28 Clojars (Clojure) CPAN (Perl) GoDoc (Go) Maven Central (Java) Rubygems.org nuget (.NET) Packagist (PHP) PyPI (Python) npm (node.js) 20 Évolution du nombre de paquets publics Il semblerait que oui, si l’on se base sur le nombre de modules publiés sur les registres publics des langages les plus utilisé (source : modulecounts.com). Le 30 juin 2014, Maven, premier dépôt depuis toujours en termes de modules hébergés, a été dépassé par NPM avec 80970 modules publiés contre 80962. Évidemment, il y a des biais : JavaScript et Node aident à créer des micro-bibliothèques, et on publie en partie des bibliothèques frontend, ce qui pousse au grand nombre. Et on a en tant qu’usager les inconvénients de ce grand nombre… Tweet : @_kud, 2014-03-25. Une discussion intéressante s’ensuit.

Slide 25

Slide 25 text

21 Il semble donc empiriquement que oui, toute application qui peut être écrite en JavaScript soit en train de l’être.

Slide 26

Slide 26 text

principe de moindre pouvoir 22 Mais ce constat n’est pas qu’empirique. En réalité, Atwood se base sur l’un des axiomes de l’architecture du web donné par Tim Berners-Lee. The principle of least power has a W3C-documented rationale: “the less powerful the language, the more you can do with the data stored in that language”. Le couple JS/JSON incarne ce principe.

Slide 27

Slide 27 text

23 Mais, tout ce qui peut l’être… Certainement, tout ne peut pas être écrit en JavaScript. Et l’embarqué, alors ?

Slide 28

Slide 28 text

24 Tessel est un microcontrôleur rendu possible par du financement participatif, sur lequel on peut brancher une grande quantité de modules. Un peu comme un Arduino, mais avec du JavaScript. Pour développer : `npm install tessel`. Pour ajouter un module : le brancher, et `npm install sensor` par exemple. Le code est poussé sur le microcontrôleur en WiFi. Ce n’est d’ailleurs pas le seul microcontrôleur capable d’exécuter du JavaScript : Espruino est son alternative principale. Fun : le logo Tessel est généré par un module NPM… JSception !

Slide 29

Slide 29 text

25 Donc, oui : à chaque fois qu’il est possible d’écrire une application en JavaScript, cette application est écrite en JavaScript.

Slide 30

Slide 30 text

26 E X PA N S I O N tendance #2 C’est bien cette tendance que l’on voit : l’expansion de JavaScript dans des domaines de plus en plus éloignés du client web.

Slide 31

Slide 31 text

remplacer tous les devs par des frontend 27 Si JavaScript va tout manger, alors autant s’y mettre, non ? En plus, les ingés front coûtent moins cher !

Slide 32

Slide 32 text

remplacer tous les devs par des frontend 27 Si JavaScript va tout manger, alors autant s’y mettre, non ? En plus, les ingés front coûtent moins cher !

Slide 33

Slide 33 text

28 PayPal intends to switch fully from Java to Node (2013-11-22). Less LoC, less files, more performance (x2 requests, 35% less latency). This does not mean you should expect the same, but it is an interesting data point. It worked so well for them that they open-sourced KrakenJS, the suite they developed over Express to help with Node backends…

Slide 34

Slide 34 text

29 Box is like Dropbox, but for bigger companies. Box notes is a collaborative edition service introduced on 2014-05-08, written in Node.js! Obviously, it has load balancing and is not exposing directly the built-in Node server to end-users. Requests go through an Apache Helix stack, finally hit the Node after layers of indirections, which treat them and redirect to a balanced DB access layer…

Slide 35

Slide 35 text

30 Meteor Et on a bien entendu Meteor, un framework 100% JS avec sérialisation automatique, appel distant à la DB serveur depuis le client… Mais… si à chaque fois on a besoin d’un framework, c’est bien que le JS dont on a déjà l’habitude n’est pas suffisant ?!

Slide 36

Slide 36 text

31 ≠ Le fantasme d’écrire un seul JavaScript est effectivement… un fantasme. Si vous parlez à un développeur habitué au JS côté client de Promesses, de Streams, de remontée (ou pas) des erreurs dans la boucle d’événements principale, des callbacks de l’API fs… il ne saura pas de quoi on parle. Partager le langage n’est pas la même chose que partager l’environnement d’exécution. On ne partage pas les références, pas les prototypes, on doit toujours sérialiser pour passer sur le réseau… Le fantasme d’avoir tout dans un langage est celui qui a mené à GWT (paix à son âme).

Slide 37

Slide 37 text

32 A D O P T I O N R A I S O N N É E E N P R O D U C T I O N tendance #3 L’adoption se fait donc au cas par cas, souvent pour une brique, en full stack sur des projets spécifiques dans des besoins précis. L’interaction avec l’existant est facile car HTTP + architecture micro-services, ou streams + interface POSIX. Également, il est possible d’avoir des ponts avec l’existant avec par exemple Nodyn, API Node dans la JVM pour interagir directement avec Java.

Slide 38

Slide 38 text

remplacer tous les outils par des frontend 33 Ce qu’on observe n’est donc pas un remplacement des développeurs… En revanche, on assiste clairement à un développement d’outils d’aide à la réalisation d’applications web qui part du monde du côté client.

Slide 39

Slide 39 text

34 La création d’une nouvelle applications web est facilitée par Yeoman. Comment l’utiliser ? `npm install yeoman`

Slide 40

Slide 40 text

35 Grunt, un gestionnaire de workflow (penser : Ant sans XML) ? `npm install grunt` Il a été « remplacé » par Gulp comme le gestionnaire génial avant même d’avoir atteint la maturité. Le remplacement de Grunt par Gulp est certes une preuve du manque de maturité d’un écosystème qui se construit, mais est aussi l’affirmation de la spécificité des API Node (Grunt proche de Make, Gulp basé sur les streams). La discussion engendrée a aussi permis de centrer le débat sur la nécessité de changer aussi souvent d’outils. Pour information, j’utilise npm run ou, au besoin, task.js (voire stagedProcess.sh).

Slide 41

Slide 41 text

35 Grunt, un gestionnaire de workflow (penser : Ant sans XML) ? `npm install grunt` Il a été « remplacé » par Gulp comme le gestionnaire génial avant même d’avoir atteint la maturité. Le remplacement de Grunt par Gulp est certes une preuve du manque de maturité d’un écosystème qui se construit, mais est aussi l’affirmation de la spécificité des API Node (Grunt proche de Make, Gulp basé sur les streams). La discussion engendrée a aussi permis de centrer le débat sur la nécessité de changer aussi souvent d’outils. Pour information, j’utilise npm run ou, au besoin, task.js (voire stagedProcess.sh).

Slide 42

Slide 42 text

36 Bower, gestionnaire de paquets côté client lancé par Twitter… et qui lui aussi va disparaître. Mais cette fois-ci, remplacé non pas par un nouvel arrivant mais par NPM lui-même ! Le gestionnaire de paquets de Node devient en réalité le gestionnaire de paquets JavaScript, aidé par des outils comme napa (qui permet d’installer comme dépendance un dépôt n’ayant pas été publié sur NPM).

Slide 43

Slide 43 text

36 Bower, gestionnaire de paquets côté client lancé par Twitter… et qui lui aussi va disparaître. Mais cette fois-ci, remplacé non pas par un nouvel arrivant mais par NPM lui-même ! Le gestionnaire de paquets de Node devient en réalité le gestionnaire de paquets JavaScript, aidé par des outils comme napa (qui permet d’installer comme dépendance un dépôt n’ayant pas été publié sur NPM).

Slide 44

Slide 44 text

37 Les applications Node commencent aujourd’hui à aller plus loin que la ligne de commande, et utilisent toutes les avancées du web. Exemple : ungit, qui fournit une interface graphique sur Git, qui ouvre un serveur de manière transparente. On peut s’y connecter en local mais peut donc également être utilisée sur les services de cloud. On voit donc que Node peut également être une porte d’entrée vers les interfaces web pour les développeurs historiquement backend.

Slide 45

Slide 45 text

38 L’aboutissement est probablement incarné par Atom, l’éditeur de code de GitHub, qui mélange les deux API : interface web avec backend Node, le tout packagé dans une seule application. Du JS appelant dans la même ligne les API du DOM et de Node…

Slide 46

Slide 46 text

39 C R É AT I O N M A S S I V E D ’ O U T I L S tendance #4 Permet aux devs frontend de résoudre leurs problèmes. Et la complexification des interfaces web côté client de ces dernières années a fait qu’ils en avaient beaucoup (cf. création du poste de « frontend operations », sessions précédentes…).

Slide 47

Slide 47 text

40 M AT U R AT I O N tendance #1 À la fois cause et conséquence, puisque les outils permettent de faire mûrir l’écosystème, mais voient également le jour au fur et à mesure de cette maturation.

Slide 48

Slide 48 text

41 A D O P T I O N R A I S O N N É E E N P R O D U C T I O N tendance #3 Cette maturation pousse à l’adoption. Cependant, l’adoption en tant que serveur de production contraste avec celle des outils, et se fait encore au cas par cas. La tendance à la massification apparaîtra certainement dans le temps.

Slide 49

Slide 49 text

42 E X PA N S I O N tendance #2 On peut lier cette adoption à l’élargissement des types de programmes pouvant être écrits avec du JavaScript. Les preuves de fonctionnement en conditions réelles encouragent à viser de nouvelles frontières. Rendez-vous l’an prochain pour voir où on retrouvera JavaScript !

Slide 50

Slide 50 text

Remerciements Anouchka Labonne Thomas De Bona Crédits images Cartographie serveurs NPM © Brandon Cannaday Logo V8 © Alessandro Gatti Marques © leurs propriétaires Logo JS WTFPL Chris Williams Icônes depuis The Noun Project : Server CC-BY Konstantin Velichko Microchip CC-BY Márcio Duarte 43 Q U E S T I O N S ? M E R C I !