Pourquoi écrire son Backend en Java

Java n’a pas forcément une bonne réputation dans le monde des startups et du web en particulier. Le langage est souvent associé à Java EE, au monde « entreprise » notamment aux grandes banques. Pourtant, selon le TIOBE index de 2016, il est le plus plus populaire des langages de programmation, deux fois plus populaire que C, en seconde place.

Pourtant, dans la Silicon Valley, il est utilisé par de nombreuses entreprises de la tech, Google, Twitter, Linkedin, Square, Netflix pour ne citer qu’eux. De même, mon entreprise, Revinate Inc. utilise massivement Java en backend.

Java, un langage robuste…

Java est un langage statiquement typé, compilé qui tourne sur une machine virtuelle (la JVM). La mauvaise réputation du langage vient en partie du fait qu’il est particulièrement verbeux. C’est justement en alternative à Java et grâce à une syntaxe plus légère que des langages de type Python et Ruby ont gagné en popularité. De plus, le fait que Java 8 soit backward-compatible avec les anciennes versions ajoute un bagage particulier, notamment face à d’autres langages de la JVM. Pourtant, Java a trois énormes avantages par rapport à d’autres langages tels que Ruby, Python ou JavaScript:

  • Le fait que le langage soit statiquement typé et compilé permet une grande robustesse du code. Si le code compile, il devrait normalement marcher (en théorie). Java est donc un langage de choix pour les gros projets. Essayez de maintenir un projet de 1 million de lignes de codes en Ruby et en Java, vous verrez la différence!
  • La JVM et le fait que Java soit compilé en Bytecode Java donne un autre avantage de poids face à un langage interprété de type Ruby: la performance! Certes, vous n’aurez souvent pas la performance d’un C. Les benchmarks sont souvent dangereux et dépendent de beaucoup de paramètres. Neanmois, tous les développeurs vous diront qu’il n’est par rare d’avoir un gain x10-20 en vitesse de Java par rapport à Ruby (exemple). De plus, Oracle travaille beaucoup sur la JVM, en particulier sur la compilation Just in Time pour améliorer la performance à la volée.
  • Enfin, Java est un langage très robuste qui dispose de nombreuses librairies standards et tierces qui ont fait leurs preuves. Par exemple, pour la programmation multi-threading, java.util.concurrent propose d’excellents outils tels que le framework Executor ou les data-structures concurrentes comme le ConcurrentHashMap. De plus, parmi les meilleurs librairies tierces sont en Java, comme google.guava, Jackson, Lucene ou Netty, le cache Caffeine ou les Observables de RxJava.

…EN RENOUVEAU…

Java 8 a introduit la programmation fonctionnelle à Java. Fortement inspirée de Scala, Java 8 a introduit de nouvelles primitives telles que les « Function » qui donnent aux fonctions la place de premier plan qu’elle méritent ou les Stream qui permettent de traiter les opérations sur les collections de manière fonctionnelles (et lazy).

La ‘concurrency’ est une fonctionnalité des plus importantes dans un environnement multi-core pour scaler une application. C’est l’un des facteurs de succès d’un langage tel que Go. La librairie java.util.concurrent propose des structures de données qui permettent d’aller très loin dans la programmation multi-threading, notamment grâce au puissant Framework Executor ou à des structures de données concurrentes telles que les BlockingQueue ou les ConcurrentHashMap. Lire par exemple l’excellent livre de B. Goetz Java Concurrency in Practice.

Enfin, la programmation asynchrone non bloquante, notamment avec Node.js s’est fortement développée ces dernières années. Dans la galaxie des langages JVM, l’on trouve aussi la programmation réactive (le Reactive Manifesto), popularisée par Scala. D’excellentes initiatives ont vu le jour ces trois dernières années telles que Reactive-Streams dont RxJava est l’une des implémentations les plus robustes. Par exemple, des bases de données telles que Cassandra et Couchbase (mais pas uniquement) offrent des API réactives dans leurs librairies clientes en Java.

 

…QUI DISPOSE D’UN TOOLING COMPLET

Avec l’expérience, le développeur se rend compte que le tooling est clef. Le tooling dans la galaxie Java est excellent. Tout d’abord les principaux IDE tels qu’Eclipse et IntelliJ Idea permettent de gagner en efficacité pour écrire votre code, notamment grâce aux outils de refactoring ou à l’auto-complétion.

Le build est aussi très robuste, notamment avec Gradle qui fournit une DSL (Domain Specific Language) sur Groovy plus concise que la configuration XML d’un Maven.

Pour le web, il existe de nombreux web-serveurs très robustes tels que Tomcat ou Jetty. Jetty ou Untertow permettent par exemple d’accepter des requêtes en HTTP2 très facilement.

Les librairies de tests que sont JUnit et Mockito et la DSL AssertJ permettent d’écrire des tests unitaires efficaces.

Des frameworks du type Spring Boot permettent d’avoir un application qui tourne sans écrire une ligne de configuration, un peu à la manière de Ruby on Rails.

Les grandes boîtes de la tech que sont Google, Netflix et Twitter ont souvent open-sourcé  des libraires de premier plan souvent uniquement en Java.

Enfin, de nombreux livres vous permettront d’écrire un Java performant et facile à maintenir. Citons par exemple la ‘bible’ de Joshua Bloch, Effective Java.

Voyons maintenant comment mettre en place de manière concrète une architecture micro-service avec Java et Spring Boot.

Pourquoi écrire son Backend en Java

2 réflexions au sujet de « Pourquoi écrire son Backend en Java »

  1. Java et Ruby ne jouent pas dans la même cours. Cette l’application faite en Java sera plus robuste mais en Ruby / RoR il est possible de sortir une application avec authentification avec quelques lignes de commandes (Je doute que la même chose soit possible en Java).

    Bref, les deux ne sont pas comparable .

    1. admin dit :

      Merci pour cette remarque. Une framework de type Spring MVC associé à Spring Security permet d’avoir une authentification en quelques lignes également. Certes, il y aura plus de lignes qu’en Ruby et même un peu de XML (!). RoR est en effet excellent en ce qu’il permet d’avoir une bonne productivité et Ruby est un langage très expressif qui peut faire beaucoup en quelques lignes. Cependant, maintenant que la View layer a tendance à être migrée dans un stack JavaScript (React.js ou Angular.js par exemple), le backend web se limite le plus souvent à une API REST. Java, associé à un bon Framwork n’est alors pas beaucoup plus complexe que RoR…

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *