Conclusion
Dès la première leçon, j’avais notifié que NodeJS n’était pas un serveur web. Nous avons néanmoins pu constater jusque-là qu’il savait parfaitement remplir ce rôle. Bien sur tout n'a pas été traité ici et pour cause. NodeJs c'est plus de 60000 package npm public et rien ne vous empêche de faire les vôtres. Base de données, io de toutes sortes, tout protocole réseaux et j'en passe, tout est possible.
Si on prend 99% des cas de programmation qui suscitent de la réflexion sur les forums PI, on peut vite en déduire ceci :
Langage de programmation = python et GUI = TK.
Forcément, si devoir se coltiner 100 lignes de code pour dessiner une pauvre fenêtre et interfacer les évents d’un bouton avec une fonction cela peut faire rigoler un développeur expérimenté, on se rend vite compte que ça ne fait pas marrer le débutant. Résultat, l’équation change et devient :
Langage de programmation = python et GUI = HTML
Et si on décompose l’équation, en général on a :
python + Apache + PHP + Javascript
Cette solution est très bien ‘vendue’. Faite l’essai de rechercher les mots suivant sur ce site :
Apache : 196 résultats, Nginx : 53, Lighttpd 52
NodeJs : 10 résultats et si on enlève ceux que j’ai écrit, on passe à seulement 4
On pourrait donc penser qu’un serveur php/cgi qui exécute des scripts python est la bonne solution alors qu’en fait, c’est juste la pire qui n’a même pas le mérite d’être simple à implémenter. Juste pour vous en convaincre, essayez de faire la même chose que ce que font les ridicules exemples de ce tuto avec une solution pareille (bonne chance ...). La simple équation ‘
NodeJS + JavaScript’ peut à elle seule balayer tout ça d’un revers de main et en faire beaucoup plus avec une simplicité déconcertante. Faut-il encore le savoir.
Sans plus parler de web, restons dans la simple hypothèse d’un petit script console pour comparer cette fois ci python et JavaScript. Pas d’invention, je vais prendre un
exemple simple auquel j’ai répondu cette semaine.
2RJ voulait juste un exemple python et comme ça commençait à partir dans tous les sens avec des questions de batch et de sysfs, je lui ai écrit les 3 lignes de code qu’il voulait et basta. Ce qui m’a interpellé, c’est que
2RJ qui ni connaissait rien en programmation (suffit de voir comment une simple faute de frappe dans mon code l’a bloqué) savait quand même une chose : Il voulait faire en python. On lui a dit que c’était le langage le plus simple et le plus adapté au PI, donc forcément il fonce tout droit dedans. Voilà donc le code python que je lui ai donné et en dessous, pour l'exemple équivalent en que j'aurais écrit pour NodeJS :
- cncl1.png (28.81 Kio) Vu 9226 fois
Finalement, a bien y regarder l’un n’est pas plus compliqué que l’autre et que l’on lance l’un ou l’autre, le résultat sera le même. Et pourtant ces 2 exemples sont fondamentalement différents. L’idée était juste d’afficher l’état de la sonde dans la console toute les 10 minutes, ok, ça c’est fait. Mais
2RJ il va revenir. Supposons que sa prochaine étape soit d’avoir une alarme genre lampe qui clignote depuis une sortie pour l’avertir quand il ni a plus d’eau. Puis pour dire que l’on va encore plus loin, il veut pouvoir depuis sa console ouvrir et fermer une électrovanne pour remplir. C'est pas le projet du siècle et avec NodeJS, ça pourrait se résumer à ce simple code :
- cncl2.png (48.54 Kio) Vu 9197 fois
Si vous en êtes capable, essayez maintenant de faire la même chose en python et regardez ou ça vous mène. Quand vous en serez là, on pourrait imaginer d'autres options, comme par exemple contrôler automatiquement l’électrovanne pour le remplissage et pourquoi pas ajouter l’écriture d’un fichier qui loguerais la quantité d’eau ajouté par jour, et de façon complètement indépendante gérer de la même façon une autre cuve, mais d’ici la …
On met ici le doigt sur la plus singulière particularité de NodeJS. Il est asynchrone et mono-thread. Il ne sait faire qu’une seule chose à la fois, mais il le fait très vite et tout son fonctionnements repose sur des évènements (callback). Il lance des fonctions puis passe faire autre chose pendant qu’elles laisses du temps de libre. Quand une fonction à terminée son job, il traite au besoin le résultat.
Quel que soit le langage utilisé il y a toujours moyens de créer des threads asynchrones qui vont générer des évènements mais cela devient très vite très complexe et c’est même souvent hors de portée pour la plupart des débutants ou développeurs ‘hobbyistes’. Hormis la simplicité offerte pour créer des applications web avec le même langage coté client et serveur, NodeJs permet de réaliser très simplement tout un tas des choses qu’il serait extrêmement compliqué à faire avec d’autres langage. En fait, on ne peut même pas dire que JavaScript est mieux ou moins bien que d’autres solutions comme python, c, c++, java ect … Il est simplement fondamentalement différent.
Comme je l’ai écrit au départ, il ne s’agissait pas ici pas de faire un cours de programmation ni d’expliquer le fonctionnement si particulier NodeJS. Il existe pour ça des milliers de sites traitants du langage javascript et de NodeJS. Le but c’était juste de présenter la solution pour la faire un peu plus connaître et croyez-moi, ça en vaut vraiment la peine. Si vous prenez le temps de vous y intéresser, vous verrez que vous pouvez aussi facilement créer de vraie application desktop multi-plateforme distribuable avec des outils comme Node-WebKit ou des applications mobiles tout aussi portable avec entre autre Apache-Cordova. On parle même dans les ‘milieux autorisés’ d’une interface graphique multi-os …
Pour finir, n'allez pas croire que je suis un fan de NodeJS qui pense que c’est mieux ou moins bien qu'autre chose. A vrai dire je n’utilise que rarement cette solution. Mon job me porte plus sur des développements de grosses solutions pro. dans d’autres langages. Comme beaucoup de développeurs pro, j’ai longtemps regardé le javascript comme un langage minable tout juste bon faire clignoter des images dans des pages web. Pendant ce temps JavaScript a continué son petit bonhomme de chemin et a grandi et il faut bien admettre désormais qu’il est devenu une véritable alternative que l’on ne peut plus ignorer.