Ruby
Par Jean-Baptiste le jeudi 18 juin 2009, 15:12 - Code - Lien permanent
Voilà quelques temps que je m'intéresse à la nouvelle star montante des langages de programmation : Ruby.
Etant donné que je ne suis pas du tout encore un expert sur le sujet, je ne vais pas m'éterniser, mais laissez moi partager quelques remarques avec vous. La communauté Ruby se vante, souvent à juste titre, d'utiliser un langage très expressif, piloté par les bonnes pratiques de développement. Cependant, je n'ai pu m'empêcher de noter quelques éléments qui, je trouve, contredisent cette affirmation.
Le premier constat vient tout simplement des méthodes de conversion, les classiques toString, toInt etc etc que nous pourrions trouver dans d'autres langages. Plutôt que d'utiliser des noms complets, en ruby nous allons trouver des to_s, to_a, to_i. Pour un langage qui se veut expressif, je trouve ça excessivement choquant d'utiliser des acronymes pas nécessairement évident.
Deuxième constat, saviez vous qu'il existe une différence entre les méthodes eql? et equal? L'un compare sur le type et valeur, et l'autre sur la référence. Différencier ces deux comportements juste par une convention de nommage très bancale me semble juste aberrant. Un débutant ne peut juste pas faire la différence, et même les plus expérimentés peuvent facilement se laisser tromper. Ruby se vante également d'être entièrement orienté objet, contrairement par exemple à Java ou C# qui font tout deux la différence entre des types primitifs et les types références. Cependant, les libs globalement fournies avec Ruby sont tout simplement noyautées de méthodes statiques. Pourquoi se venter d'être Full OO si c'est pour s'appuyer aussi lourdement sur une approche procédurale?
Enfin, dernière remarque, Ruby ne supporte pas la surcharge de méthode: le nom d'une méthode doit être unique dans une classe. Du coup, si on veut utiliser la surcharge, qui est tout de même très pratique, on doit accepter en fait un nombre variant de paramètres, et à nous de tester tous les cas d'appels que l'on veut gérer. La complexité cyclomatique générée par cette approche est juste énorme. La liste pourrait s'allonger encore, tant finalement le langage est l'interpréteur sont bourrés de "petits trucs" qui sont juste impossible à deviner et peuvent briser votre programme si vous ne les connaissez pas. Par exemple, j'utilisez un "gets" pour lire une entrée en mode console, et quand je me suis à passer un paramètre à la commande, ça ne fonctionnait plus. Le côté souvent "magique" de certaines parties de ruby brisent à mon sens le principe de moindre surprise, et le gets en est un bon exemple.
J'essaye de faire la part des choses bien entendu, et je n'ai essayé ici de citer ici que ce qui me semble être de vrais soucis, et non pas des habitudes provenant d'autres langages. Un langage qui vaut la peine d'être appris doit changer note manière de penser, et Ruby m'a effectivement apporté beaucoup, et je l'apprécie. Ceci dit, après un tel buzz, je ne peux pas m'empêcher d'être déçu par ces détails qui sont mines de rien, pas si insignifiants que ça.



Commentaires
Pour moi le problème de Ruby c'est avant tout un fouilli d'implémentations, entre JRuby, IronRuby, Rubinius, Ruby.Net etc.
Ensuite la norme du langage s'appuie sur un modèle de développement super centralisé limite dictatorial, fondé sur une personne, c'est pas une façon de faire que je soutiens.
Pour avoir un peu joué avec le langage, j'ai remarqué des petites choses qui sont assez dérangeantes, comme toi. Pour résumer, la norme du langage me laisse une impression de joyeux bordel, c'est un mix entre un peu de fonctionnel, un peu d'impératif si on en a envie, de l'objet pourquoi pas etc. C'est à mon avis le résultat du modèle unipersonnel de management. Essayer de développer proprement là dessus nécessite trop d'efforts au regard du résultat.
Après y a la question de scalabilité. Twitter utilisait ruby avec plus de 150 mongrels en cluster, m'a t on dit, et bon, chais pas si tu utilises twitter, mais niveau perfs c'est pas la joie.
Au final : mon aventure avec ruby c'est finie comme chez twitter (sauf que j'ai pas attendu des mois pour laisser tomber), à savoir migrer vers Java. Les langages modernes pour java, genre scala mais surtout groovy, apportent tout autant de fonctionnalités de ruby (mix d'impératif, interprété, fonctionnel etc.), avec un design du langage mieux foutu, la possibilité d'utiliser les libs java de facon transparente, en ayant la puissance de la JVM en dessous.
My 2 cents.