Développement Software

En tant qu’experts d’internet nous réalisons nous même vos travaux de programmation sur les technologies Front End, Serveur, Mobile ou Desktop ainsi que l’architecture et l'administration réseaux et serveur.

  • Développement JavaScript / HTML5

    Développement frontend JavaScript

    Outils de développement

    Développement serveur JavaScript / NodeJS

    Développement serveur / Bases de données

    Administration / Déploiement serveur Linux



Un oeil sur : NodeJS dans votre entreprise

Comment NodeJs résout les challenges communs à toutes les équipes d’ingénieurs?

Comment cette technologie peut-elle être déployée en entreprise pour réaliser des produits d’une meilleure qualité, plus rapidement et moins chers?

  1. Les problématiques communes
  2. NodeJS au coeur de votre infrastructure
  3. Mettre en place un environnement NodeJS

1. Les problématiques communes

L’informatique est généralement en contante évolution. Il est parfois difficile pour les entreprises de rester à la pointe de toutes les technologies entrantes sur le marché. Un nouveau lot de technologies émerge chaque jour et il est parfois difficile de prédire lesquelles seront maintenues à long terme. Un bon choix initial pourrait permettre à votre application d’éviter de devenir obsolète dans les futures années.

En général, dans le développement logiciel, on commence à résoudre un problème, puis un autre et encore un autre et votre application à tendance à grossir sans que vous vous en rendiez vraiment compte et que personne dans votre entreprise puisse lutter contre cela.

Dans ce cas, vous êtes entrain de construire un logiciel dit “monolithique”. Toutes les nouvelles fonctionnalités sont rajoutées à l’application initiale et elle deviendra de plus en plus complexe.

Après un certains degré de complexité, l’application deviendra de plus en plus difficile à maintenir, même si cela concerne des petites modifications.

Le cas d’une application monolithique

Une application dite “monolithique” est un système qui contient en lui-même toutes les fonctionnalités encapsulées ensemble. Un changement mineur peut impliquer des modifications sur l’ensemble de l’application.

Cela est assez problématique et nous allons voir pourquoi.

La scalabilité

Nous pouvons très bien imaginer une application bancaire qui doit réaliser des transactions, envoyer des emails et générer des rapports. Cette application semble séparée en 3 parties à peu près équivalentes mais en réalité, chacune d’entre elle à un poids différent. Il est possible qu’en réalité on s’aperçoive que la plupart des utilisateurs veulent seulement réaliser des transactions et rien d’autre.

Ainsi, si la base d’utilisateurs augmente rapidement, vous aurez besoin de beaucoup plus de ressources CPU et vous devriez augmenter le nombre de serveurs disponibles.

Cela entraine un problème de scalabilité pour votre application.

Avec une application monolithique, la totalité de votre application (ici, les transactions, les emails, et les rapports) devra être redimensionnée même si seulement une partie de votre application demande plus de ressources. On devra multiplier des ressources inutiles.

Avec une application architecturée en micro-services, ce n’est plus un problème. Toutes les parties peuvent être redimensionnées indépendamment les unes des autres et ainsi nous focaliserons la puissance de la machine sur les taches les plus gourmandes en ressources.

Vous économiserez en coût d’infrastructure et vous pourrez choisir d’investir dans la formation vos équipes et les rendre plus efficace à réalisation même de votre produit.

Le déploiement

Pour une application monolithique, la mise en production peut parfois être fastidieuse. Si vous séparez votre app en plusieurs sous parties bien distinctes, vous serez amené à déployer des petites portions une par une.

Cela augmentera la rapidité et la facilité des déploiements.

L’organisation de votre entreprise autour des micro-services

Le management de grosses équipes demande beaucoup d’efforts. Avec de plus petites équipes et des plus petits codes sources, c’est plus facile à gérer. Ainsi choisir une architecture logiciel en micro-services permet de séparer les équipes en petits groupes avec des tâches bien spécifiques.

Chaque équipe aura pour but de maintenir le service qu’ils auront en charge tout au long de la vie du projet, de la phase de développement en passant par la gestion de la base de données, l’hébergement, le monitoring ou encore le déploiement.

Ainsi, on construit des équipes cross-fonctionnelles et on gomme en partie la fréquente barrière de communication inter-équipe.

Pour aller plus loin

Lorsque vous commencez à mettre en place une architecture basée sur des micro-services, chaque service est construit séparément des autres. Votre logiciel deviendra un assemblage de petites pièces indépendantes pour former votre produit final.

Un développeur pourra ainsi toujours choisir la bonne technologie pour la bonne tâche. Si vous définissez correctement le moyen de communication entre vos services, le langage utilisé n’a plus beaucoup d’importance. Vous pouvez construire une partie avec JAVA, une autre avec NodeJS ou Python par exemple. Il n’y pas plus de contrainte de technologie, vos développeurs pourront expérimenter en toute sécurité des nouvelles solutions et par la suite continuer à séparer l’application en d’autres petites parties maintenables.

Le but de cela est de réduire au maximum le temps de réécriture d’un service par une petite équipe (l’idéalement moins de 2 semaines). Si, par exemple, le développement n’est pas satisfaisant (à cause de problème de qualité, de performances, etc.), il sera très facilement possible de le modifier en réduisant le risque de développement.

De plus, vous ne réduirez pas seulement le risque dû au développement mais aussi le prix associé aux opérations concernant l’infrastructure. Vous aurez de meilleurs performances à un meilleur coût.

En quoi NodeJS est la meilleure solution pour construire des micro-services ?

2. NodeJS au coeur de votre infrastructure.

NodeJS est devenu depuis quelques années, une technologie à la mode pour les startups et les entreprises. Que s’est-il passé ? Pourquoi un tel engouement pour NodeJS ?

Certains disent que Node augmente la productivité de leurs équipes, d’autres disent que leur application est plus rapide ou encore que Node rend plus heureux leurs développeurs.

Mais une des forces qui fait que NodeJS est prêt pour votre entreprise, c’est qu’il fait maintenant partie de la Linux Fondation et fourni un maintient à long terme.

Ses atouts en détails

Depuis que Paypal a commencé à utiliser NodeJS, ils ont fait le bilan. Ils ont réussi à augmenter de 100% leur productivité comparé à leur ancien stack JAVA.

Comment est-ce possible ?

Dans un premier temps, NPM fournit un quantité incroyable de modules que l’on peut utiliser immédiatement. Il est inutile de recoder tout de zéro et ainsi on diminue fortement les efforts des équipes.

Dans un second temps, les applications NodeJS sont dans la plupart du temps écrites en JavaScript. Ainsi les développeurs front-end peuvent tout aussi bien comprendre le fonctionnement et faire des modifications si nécessaire. C’est encore un gagne temps considérable lorsque vos développeurs utilisent le même langage tout au long de la chaine de production.

De plus grâce à des technologies comme Browserify ou Webpack, vous pouvez utiliser les mêmes modules à la fois en front-end qu’en back-end.

Les performances

En 2014, pendant le Black Friday, 1,5 millards de dollar ont était dépensé aux US en un seul jour. Il est crucial que les applications tiennent le choc lorsqu’il y a autant de trafic. Walmart, l’un des principaux revendeurs à tout de même réussi à servir plus de 500 millions de pages sans aucun dysfonctionnement.

Paypal peut également témoigner du même résultat avec selon eux un baisse de 35% du temps de réponse pour une même page qui se traduirait concrètement par un temps de chargement plus rapide de 200ms.

Attirer les développeurs

Utiliser des technologies récentes dans la vie de tous les jours est un argument crucial pour recruter ou conserver un développeur talentueux. A l’heure où les bon profils se font de plus en plus rares, c’est une donnée importante à prendre en compte dans une entreprise.

Le support à long terme

Après la fusion de NodeJS et IoJS, il s’est produit une petite révolution. Un groupe de travail autour d’un version LTS (Long Time Support) s’est formé.

Que cela signifie-t-il ?

La Version LTS sera mise à jour une fois par an. Chaque version sera maintenue pour une période de 18mois et ensuite conservée en mode maintenance les 12 mois suivant.

Une fois qu’une version est en LTS, cela signifie que les fonctionnalités sont figées. Seulement les mises à jour de sécurité ou les améliorations concernant les performances sont rajoutées. Une fois en mode maintenance, seulement les bugs critiques sont corrigés.

Les succès story en entreprise

Le cas LinkedIn

A l’origine, LinkedIn était fondé sur RubyOnRails mais à l’heure d’aujourd’hui l’une des plus grosse partie de l’application se repose sur NodeJS en production. Il y avait plusieurs appels pour une seule page gérée par plusieurs threads. NodeJS offrit la possibilité à leurs équipes de modifier leur modèle pour passer à une seule requête par page. Cela à entrainé une simplification du code et la diminution du nombre de serveurs. Ils ont divisé par 10 le nombre de machine pour héberger leurs services.

Le cas Netflix

Netflix n’a pas migré immédiatement sur un environnement entièrement basé sur NodeJS. Le passage entre l’UI et le backend était souvent difficile à cause de l’environnement back-end en JAVA. L’équipe en charge de l’UI voulait travailler avec un langage qui leur était familier.

Dès lors, le passage à NodeJS a donné la possibilité de faire des itérations plus rapides, de booster leurs ingénieurs et d’améliorer l’expérience de leurs utilisateurs.

Le cas Dow Jones

Au départ, il y avait une petite équipe à Dow Jones appelé “Engineering productivity” qui s’est lancé dans l’implémentation de NodeJS dans la société. L’équipe s’était mis au défi de transformer 100 développeurs C# en développeurs NodeJS.

Comme ils maitrisaient déjà les bonnes pratiques et les frameworks, cette petite équipe de développeurs expérimentés mis en place une série de cours pour apprendre NodeJS aux équipes C#. Ils aidaient également à débugguer et à controller le code.

Par la suite, ils sont passés à une prédominance de JavaScript sur tout leur stack. Maintenant ils sont capables d’améliorer leurs services 2 à 4 fois plus rapidement avec 10% de code en moins.

Le cas New York Time

L’équipe vidéo du New York Time utilise NodeJS pour fournir une API vidéo et les gérer. Il n’y avait pas d’API interne destinée aux vidéos ou aux playlists lorsque que Time Vidéo a été créé. Ce qui impliquait qu’ils avaient besoin de mettre à jour leur application à chaque fois qu’un éditeur créait ou modifiait une vidéo ou une playlist utilisant des fichiers JSON.

L’équipe décida de tester NodeJS pour son caractère non-bloquant et leur expérience démontra un gain de performance par rapport à leur ancienne application PHP.

Le pouvoir de la programmation asynchrone

En programmation informatique, les événements asynchrones se produisent indépendamment du déroulement principal de l’application. Les actions asynchrones sont exécutées de manière non bloquantes pour que la partie principale de l’application continue toujours à fonctionner pendant leurs exécutions.

A quel prix ?

Les opérations d’entrée/sortie peuvent être extrêmement lente comparées aux opérations de traitement de données. Un instrument d’entrée/sortie peut être composé de parties mécaniques qui évoluent physiquement. Ce qui est beaucoup plus lent que le traitement d’une modification du courant électrique. Par exemple, pour une opération d’écriture sur un disque qui prend environ 10ms, le processeur qui tourne à 1GHz pourra réaliser environ 10 millions de cycles.

Il est ainsi possible de commencer une opération et d’en réaliser d’autres en parallèle si elles ne s’influencent pas les unes les autres. C’est ce que l’on appelle la programmation asynchrone.

Ainsi 100% des ressources des machines peuvent être utilisées. Beaucoup de fonctionnalités dans les OS utilisent l’asynchrone à différents niveaux, par exemple le CP/M.

L’asynchrone améliore le débit, la latence ou encore la réactivité des applications.

L’asynchrone en JavaScript

L’asynchrone fait partie intégrante du JavaScript. Cela signifie qu’aucune opération (ajout de librairie ou création brute de la fonctionnalité) n’est nécessaire pour coder en asynchrone. Le principal avantage, comparé aux autres langages, c’est que cette fonctionnalité est intrinsèque au langage.

Les objets JavaScript peuvent être passés de fonction en fonction et être utilisés quand il y en a besoin. Si vous passez une fonction en argument d’une autre fonction, vous pouvez l’exécuter quand le bon moment est venu (une écriture sur un disque terminée par exemple). Aucune valeur n’est retournée par la fonction, seulement la fonction est appelé avec les paramètres voulus. On appelle cela des fonctions de callback.

Les callbacks sont très souvent utilisés dans le monde du JavaScript pour spécifier une fin de tâche.

Pour les programmeurs venant du monde du C#, du JAVA ou du PHP, il est souvent difficile d’appréhender les fonctions de callback au premier abord.

Depuis les début de JavaScript, le callback pattern est le plus utilisé pour exécuter du code de manière asynchrone mais il y a des nouvelles possibilités qui arrivent avec les spécifications ES6 (et ES7).

Remplacer les callbacks

Avec NodeJS, la plupart des librairies utilisent les callbacks. Mais la dernière version du moteur V8 (via ES6) de Google apporte son lot d’outils qui nous ouvre d’autres possibilités et ainsi d’éliminer ce que l’on appelle “l’enfer des callbacks” (l’imbrication multiple de callbacks qui peut, en fonction du nombre, nuire à la lisibilité du code).

Il y a, tout d’abord, les promesses. C’est un peu similaire à l’implémentation de “Futures” en JAVA ou des “Tasks” en C#. Une promesse représente une valeure future qui peut être retournée à n’importe quelle instant. Les promesses peuvent remplacer les callbacks et amène de la clarté au code.

Une autre fonctionnalité ajouté se nomme les générateurs. Les générateurs autorisent à mettre en pause l’exécution d’une fonction à un certain moment. On peut ainsi prévoir des fonctions séquencées et exécuter chaque étape successivement, à la demande.

Une dernière possibilité (plus expérimentale) à été proposé avec ES7. Ce sont les fonctions asynchrones (async function). Il serait possible alors d’écrire de manière synchrone une fonction asynchrone. Cela résout aussi les problèmes de callbacks et cache les détails d’implémentation pour permettre aux développeurs de se focaliser sur les fonctionnalités. Ce concept arrive du monde du .NET 4.5 avec la même syntaxe, la même sémantique et le même nom.

Retour à la philosophie UNIX

La philosophie UNIX peut se décrire en un petit nombre de principes qui peuvent être appliqués à beaucoup de secteur de l’informatique. C’est une approche pour pouvoir développer des petites applications efficaces.

Les principes avaient été conseillés par Ken Thompson basés sur son expérience lors de la construction de UNIX. Selon Doug McIlroy, inventeur du pipe UNIX, la philosophie est la suivante :

  1. Écrire des programmes qui font une seule chose et qui la font bien.
  2. Écrire des programmes qui peuvent discuter ensemble.
  3. Écrire des programmes qui gèrent des flux "texte" car c’est une interface universelle.
Faire une seule chose et la faire bien

Pour la communauté NodeJS, c’est le principe le plus important. Ce que à quoi tend tout développeur NodeJS est d’écrire des petits modules pour ensuite les assembler si nécessaire. Le nombre de modules partagés sur NPM en est une preuve flagrante. (voir les statistiques : https://www.npmjs.com/)

Npm fournit des centaines de milliers de modules et en rajoute toujours plus chaque jour. La communauté NodeJS est très active. De plus, on voit l’émergence de l’utilisation de Npm pour la partie front-end. Nous avons donc un gestionnaire de paquet à la fois pour le front-end et le back-end. La plupart des modules sont hébergés dans des répertoires publics sous Github. Tout le monde peut y avoir accès au sources et faire proposer des améliorations. Cela facilite le travail du développeur et accélère le développement de nouvelles fonctionnalités. On peut ainsi plus se focaliser sur la partie fonctionnelle de l’application plutôt que sur des détails d’ordre technique.

NPM supporte également les répertoires privées pour les entreprises depuis peu de temps.

Le monde l’open-sources

NodeJS, et tout son écosystème, s’est construit autour de l’open-sources. Des petites librairies, jusqu’au gros frameworks, en général, tout est public. La communauté encourage les entreprises à y prendre part et à proposer des améliorations.

3. Mettre en place un environnement NodeJS

Pour expliquer le potentiel de développer avec NodeJS, il faut considérer des points cruciaux autour de l’organisation de votre entreprise. Cela inclut l’intégration d’outils modernes dans le workflow, supprimer les barrières de communication en construisant des équipes cross-fonctionnelles et finalement accepter une nouvelle voie pour le design de nouvelles applications : les micro-services.

Les outils modernes

Ces dernières années ont vu apparaitre des outils de développement de plus en plus évolués. Le code lui même est au coeur des applications. Il sera compilé ou interprété pour finalement être utilisé par vos utilisateurs. En tant que développeur, écrire du code maintenable et lisible est toujours le but que nous gardons en tête. Bien structurer son code revient à bien le documenter.

Plus besoin de documentation supplémentaire. On gagne en ainsi en plaisir de travail. Il existe de nombreuses applications qui vont permettre de gérer vos codes sources.

GIT !

GIT fut celui utilisé pour gérer le code source de Linux. Il fut créé par Linus Toward lui-même. C’est un des meilleurs exemples de programme de gestion des sources. Il permet aux développeurs de coder en équipe et faire des modifications du code source sans se soucier de ce que fait son collègue jusqu’à la fusion des versions.

Il peut également être utilisé pour trouver les modifications à l’origine de bug et de revenir à un instant donné dans une application. Ce qui en fait un outil performant dans la résolution de bug.

Avec GIT, vous pourrez utiliser différents répertoires pour chaque service et donner des droits seulement aux personnes qui sont en capacitées de travailler sur telle ou telle partie de l’application.

On peut également prendre en considération les applications Github ou GitBucket. Elles rajoutes la possibilité de faire des pull-request sur des projets ouverts. Les modifications seront alors validées (ou pas) lors d’un code review avant d’être rajoutées au code source.

Le déploiement continu

Les clients ne veulent généralement pas attendre des années avant de voir les modifications apportées à leur application. Ainsi on considère une bonne pratique à adopter appelée l’intégration continue. Cela permet un déploiement rapide en ligne (prod ou preprod) des modifications apportées. Les étapes de tests, build et de lancement sont alors pré-programmées et si toutes les étapes se sont bien déroulées, le résultat est visible immédiatement. C’est clairement appréciable pour une société car cela amène des feedbacks et des corrections très rapides.

Il y a pas mal d’applications sur le marché qui rendent le déploiement continu rapide et facile. Comme par exemple, Codeship ou Jenkins. Pour ceux qui aiment construire leur propres outils vous pouvez également utiliser directement les hooks GIT pour automatiser certaines tâches mais il faudra y passer plus de temps.

Un exemple concret viendrait à vérifier les différents commits (test unitaires) et notifier un problème lors du build à toute l’équipe par email.

La communication

La communication est la clé pour faire fonctionner des équipes polyvalentes et cross-fonctionnelles. Sans des moyens de communication performants, il sera difficile de savoir, entre les équipes, quand des fonctionnalités sont terminées par exemple. Quand les équipes sont séparées au 4 coins du monde, il est difficile d’aller physiquement au bureau d’une autre équipe pour savoir si on peut aller utiliser une nouvelle fonctionnalité. C’est ce qui rend bien-sûr les services de tchat intéressants. IRC est une bonne option lorsque l’on parle de tchat d’équipe mais ce n’est pas encore très populaire. Actuellement des projets comme HipChat ou Slack, sont rentrée sur le marché. Ces applications Saas peuvent être des solutions facile et rapide à mettre en place.

XMPP et IRC sont seulement des protocoles d’échanges qui peuvent vous servir à créer vos propres outils si nécessaire.

Les conteneurs

On a vu apparaitre récemment ce que l’on appelle les conteneurs. Ce sont des alternatives aux machines complètes de virtualisation. Ils peuvent encapsuler une applications avec leur propre système d’exploitation et dépendances. Ainsi sur une seule machine vous pouvez lancer plusieurs processus bien séparé contenant votre propre programme.

Cette technologie permet de déployer des environnements pré-configurés sans avoir à réinstaller chaque environnement à chaque fois. Cela est pratique pour redimensionner votre système pratiquement en une seule ligne de commande.

Docker est un bon exemple de solutions sur le marché.

Construire des équipes cross-fonctionnelles

Qu‘est que cela signifie-t-il vraiment ? Si vous voulez mettre en place des équipes cross-fonctionnelles, la première chose à savoir c’est si votre organisation peut s’adapter car il est clair que l’application que vous créez orientera la culture de votre entreprise.

Dans une équipe cross-fonctionnelle, les personnes travaillent ensemble pour délivrer la même valeur ajoutée comme une nouvelle fonctionnalité, un nouveau projet ou même un nouveau produit. Par conséquent, les équipes ont besoin d’être solides et stables. pour que le travail attendu soit correctement exécuté. En échange elles pourront faire évoluer le service qu’elles développent plus rapidement et plus efficacement que des équipes fonctionnelles. Les échanges ne se feront plus pour des problèmes de communication ou de management mais sur la base des tests fonctionnels. Ce qui fait que cette approche est beaucoup plus efficace et pragmatique.

Les atouts des équipes cross-fonctionnelles

Les départements fonctionnels créent souvent un climat de bataille “nous contre eux” entre les équipes. Cela est contre productif et mène à des rivalités. Travailler avec des personnes venant de backgrounds différents permet d’avoir des points de vue multiples. Cela aide également à comprendre plus efficacement les causes de certains problèmes pour les résoudre ou les prévenir.

Être capable de prendre leurs propres décisions et travailler indépendamment de toute organisation supérieure permet aux équipes cross-fonctionnelles de coder plus rapidement que les équipes fonctionnelles. Les équipes peuvent ainsi se focaliser à réduire le temps des cycles et mettre en place des méthodes de déploiement continu de manière à se confronter aux bugs, modifier l'application et la deployer instantanement.

Le cas Netflix

Netflix a décidé d’aller dans le sens des équipes cross-fonctionnelles. La société a déterminé clairement et spécifiquement les buts et les objectifs pour chaque équipe. L’interaction entre les équipes se focalise plus sur le stratégie et le but que sur la tactique. Bien que cela demande de l’investissement afin d’être vraiment transparent, ils estiment que cela en vaut vraiment la peine. Leurs équipes essaient de faire le minimum de réunion possible. Ceci parce qu’ils ont confiance les uns en les autres. Le dirigeant essai de tendre la main pour aider à chaque fois qu’ils estiment que c’est approprié et ne se concentre pas sur la supervision de chaque tâche des membres de l’équipe.