Ruby on Rails inconvénients et mises en garde [fermé]

25

Ce n'est pas un pari d'ouverture pour dénigrer RoR - honnête!

J'apprends Ruby et le framework Rails. À première vue, il semble être assez cool et une expérience merveilleuse par rapport à PHP. (En fait, cela me rappelle des jours plus heureux avec C # et .NET.)

Cependant, dans ce domaine, je n'ai aucune expérience de ce cadre ou de ce langage, et je suis curieux - quels sont les inconvénients actuels ou les choses que vous souhaiteriez savoir au début?

(Peut-être que cela devrait être un wiki communautaire?)

Matty
la source
J'ai essayé les rails une fois et je me suis arrêté quand j'ai réalisé que la conception d'une entité basée sur une base de données n'était pas facilement possible.
Falcon
5
avdi.org/devblog/2011/08/22/your-code-is-my-hell mérite d'être lu. J'ajouterais qu'avec n'importe quelle langue typée dynamiquement, il est extrêmement important d'avoir une couverture de test de 80% ou plus, ou la refactorisation sera presque impossible.
Eric Wilson
Rendre votre question plus précise et plus équilibrée (c'est-à-dire "Passer de PHP à Ruby on Rails - Avantages et inconvénients) éliminerait le besoin de vous désavouer de dénigrer et le désir de wiki communautaire.
Thomas Langston
2
@Thomas Mais ce n'est pas ma question! Les avantages et les inconvénients de PHP sont vraiment bien connus. Les avantages de RoR sont assez faciles à trouver. Cependant, les inconvénients de RoR ne sont pas faciles à découvrir en tant que nouveau venu et je soupçonne qu'ils ne seraient découverts qu'avec de nombreuses années d'expérience. Apprendre de l'expérience bien méritée des autres en est l'objectif. Beaucoup de CW que j'ai lus sont assez spécifiques dans leur nature.
Matty

Réponses:

32

Cela vient de l'expérience d'apprentissage, de la poursuite de l'apprentissage et de l'écriture d'une application relativement simple dans Rails.

1) Courbe d'apprentissage

Rails est d'une simplicité trompeuse. Les tutoriels, vidéos et livres montrent tous à quelle vitesse vous pouvez obtenir une application fonctionnelle (si moche), mais ceux-ci ne font qu'effleurer la surface. Ils ont tendance à dépendre fortement de la génération de code et de «l'échafaudage», qui est certes un bon outil lors de l'apprentissage mais qui survit rapidement à son utilité.

Ne vous y trompez pas, Rails est difficile à maîtriser. Une fois que vous aurez dépassé les bases (plus à ce sujet plus tard), vous courrez tête baissée dans un mur si vous devez faire plus que la fonctionnalité "d'application de démonstration" extrêmement simpliste que vous voyez vanté. Vous pouvez vous débrouiller avec une connaissance de base de Ruby tout en apprenant, mais vous devez rapidement prendre Ruby ou vous serez laissé haut et sec (et pas le bon type de DRY) si vous devez aller en dehors des contraintes de Rails.

Rails est, comme j'aime l'appeler d'une manière aimante, la peinture par programmation numérique . Si vous respectez à 100% les conventions (c'est-à-dire que vous respectez les lignes et utilisez les couleurs qu'on vous dit d'utiliser), vous pouvez faire des applications décentes rapidement et facilement. Si et quand vous devez vous écarter, Rails peut passer de votre meilleur ami à votre pire ennemi.

2) Quand tout ce que vous avez est un marteau ...

Rails fait très bien les applications CRUD simplistes. Le problème survient lorsque votre application doit faire plus que lire / écrire à partir d'une base de données. Maintenant, pour mémoire, la dernière version de Rails que j'ai utilisée était la 2.3.4, donc les choses ont peut-être changé depuis, mais j'ai rencontré des problèmes majeurs lorsque les besoins de l'entreprise ont changé, de sorte que l'application devait avoir un petit système de workflow intégré et s'intégrer avec une ancienne application PHP. La convention Rails de "un formulaire, un modèle" fonctionne bien pour les applications triviales et les applications de saisie de données, mais pas tant lorsque vous devez faire une logique de traitement, ou avoir des flux de travail, ou tout ce qui n'est pas typique "L'utilisateur entre des données dans quelques champs de texte, frappe Soumettre "type de chose. Cela peut être fait, mais ce n'est en aucun cas «facile», ou plutôt ce n'était pas

De plus, Rails n'aime pas bien jouer avec d'autres applications qui n'utilisent pas ses méthodes préférées d'accès aux données; si vous devez vous interfacer avec une application qui n'a pas d'API de style "Web 2.0", vous devez contourner Rails au lieu de l'utiliser; encore une fois, je parle d'expérience ici car c'est ce qui m'est arrivé.

3) C'est nouveau

Enfin, Rails est toujours le "petit nouveau sur le bloc" dans de nombreux domaines. Cela n'a pas d'importance pour un usage personnel ou des scénarios de type "Je pense que c'est cool et je veux l'apprendre", mais parler comme quelqu'un qui préférerait utiliser Rails à mon travail de jour, si vous n'êtes pas dans un endroit où Rails est répandu, il peut être très difficile de trouver du travail à temps plein en tant que développeur Rails. C'est encore largement le domaine des «hip, nouvelles startups» et pas un acteur majeur dans la plupart des zones métropolitaines. Votre kilométrage peut varier à cet égard, mais je sais que ma région (Tampa) Rails est essentiellement inexistante.

4) Feu et mouvement

Rails est en constante évolution. C'est à la fois une bonne et une mauvaise chose; c'est bien parce que la communauté évolue et embrasse de nouveaux concepts. C'est mauvais parce que la communauté évolue et embrasse de nouveaux concepts. Cela peut être très accablant pour un débutant Rails parce que généralement lorsque vous rencontrez un problème et regardez autour de vous, vous verrez soit des gens recommander tel ou tel bijou pour le résoudre, soit dire que cette façon est mauvaise de toute façon et vous ne devriez pas '' t l'utiliser, voici une meilleure façon ... et vous vous retrouvez avec une liste de blanchisserie d'outils supplémentaires à apprendre avec Rails pour suivre les cognoscenti Rails. Des choses comme Git, BDD/RSpec, Cucumber,Haml/Sass, et une corne d'abondance d'autres choses flottent et sont considérées comme la "bonne façon de faire les choses" dans Rails-land, et en parlant d'expérience, vous pourriez finir par être submergé en essayant d'apprendre une douzaine de technologies ou plus en plus de Rails, car l'utilisation de la boîte à outils Rails standard semble "incorrecte".

Cela est maintenant encore plus compliqué par Rails 3.1, qui fait de Sass et CoffeeScript de toutes choses la valeur par défaut, donc un débutant total de Rails doit non seulement apprendre Ruby and Rails mais Sass (sans doute simple si vous connaissez CSS) et CoffeeScript (pas très difficile mais certainement suffisamment différent de JavaScript brut) au minimum pour commencer, et on peut supposer Git. Même sans prendre en compte RSpec et ses amis, et la douzaine de gemmes ou plus que vous finirez généralement, c'est 4 choses différentes que vous devez apprendre avant de pouvoir sérieusement commencer à écrire des applications Rails. Comparez cela à un langage comme C #, ou Java, ou même PHP où votre connaissance HTML / CSS / JavaScript / SQL ne va pas changer et vous n'avez qu'à apprendre le langage lui-même et peut-être les nuances du framework.

Wayne Molina
la source
3
WRT Rails 3.1 Sass & CoffeeScript sont des paramètres par défaut qui peuvent facilement être désactivés. En fait, le CSS "normal" ne fonctionnera que puisque Rails 3.1 utilise la syntaxe SCSS de SASS. Vous pouvez les utiliser mais vous n'êtes soumis à aucune contrainte. WRT Git Je pense que Linus explique mieux pourquoi vous devriez vraiment utiliser un DVCS comme Git, quel que soit le framework que vous utilisez. youtube.com/watch?v=4XpnKHJAok8
Shreyas Satish
Oh, je suis d'accord, je dis juste que la valeur par défaut de Rails est généralement très médiatisée, donc un débutant se sentira obligé de l'utiliser (je sais que je le ressentais)
Wayne Molina
3
+1 pour # 4 ... si vous quittez Rails pendant un an, quand vous reviendrez, tout le monde volera dans des vaisseaux spatiaux et vous serez dans votre chaloupe à penser wtf? La syntaxe de Rails 2 était ancienne avant la sortie de Rails 3.
jimworm
-1 Bon poteau de dénudage des rails mais vous ne suggérez même pas d'alternative. Les "formes imbriquées" sont un problème difficile et Rails le résout probablement mieux que quiconque.
scottschulthess
13

Documentation.

Bien que les guides Rails soient d'excellentes ressources d'apprentissage, la référence de bibliothèque Rails (et Ruby, en général) n'est pas facile à parcourir. Dites, vous voulez en savoir plus sur la belongs_tométhode. Bien qu'il soit utilisé sur des ActiveRecord::Basesous-classes (ses modèles), il n'est pas documenté dans les ActiveRecord::Basedocuments, mais dans un mixin que la classe importe. Essentiellement, vous ne pouvez pas voir une liste complète de toutes les méthodes que vous pouvez utiliser sur un objet en un seul endroit (sauf lorsque vous lancez irbet vérifiez l'objet lui-même).

Avec un langage très dynamique comme Ruby, il n'est pas simple de dire d'où vient une méthode que vous utilisez. Cela peut être un problème, en particulier pour les programmeurs en apprentissage qui tentent de saisir une nouvelle pile technologique.

Mladen Jablanović
la source
C'est un tueur pour moi; chaque fois que j'ai besoin de déboguer une partie de notre code Ruby / Rails, j'ai toujours passé beaucoup trop de temps à essayer de comprendre où une méthode donnée était définie; et même alors, je dois toujours garder l'idée derrière la tête que juste parce que je peux voir la définition de la méthode, elle peut avoir été redéfinie ailleurs.
joev
9

Ruby on Rails a une courbe d'apprentissage importante. Vous devez d'abord apprendre les bizarreries de la langue, puis apprendre le cadre, puis apprendre la façon de faire des Rails, puis en apprendre davantage sur les nombreuses gemmes couramment utilisées.

Cependant, lorsque vous avez appris ces choses, cela vient incroyablement naturellement. En fait, d'autres cadres commencent à ressembler à un fardeau.

Rails est très orienté TDD / BDD, donc si vous ne l'êtes pas, c'est deux autres choses que vous devrez apprendre avant de devenir un programmeur Rails compétent. Vous n'avez pas de compilateur et d'IDE pour vous soutenir, donc la couverture des tests est vraiment votre solution de rechange.

De nombreux partisans du TDD, dont moi-même, considéreraient cette force du RoR ainsi que sa malédiction. Une fois que vous commencez à écrire TDD, vous constatez que la sécurité offerte par la couverture de test est meilleure que la sécurité offerte par un compilateur. Ensuite, avoir à écrire du code JUST pour plaire à un compilateur devient un fardeau.

TDD ne se sent pas comme une tâche supplémentaire dans RoR, c'est comme la seule façon de travailler.

Rails a un sérieux problème de performances: chaque requête est mise en file d'attente derrière la requête actuellement active, au lieu de les enfiler comme le font la plupart des frameworks ou de permettre aux événements de blocage de libérer d'autres requêtes comme le font Node.js et Twister. Cela signifie que vous devez coder pour accélérer les temps de réponse, mais c'est assez facile à faire dans la plupart des cas.

Rails est également très bien conçu pour gérer très bien les systèmes de contenu, ce qui, en toute justice, concerne beaucoup d'Internet. Faire quelque chose d'un peu plus compliqué, comme un jeu Web ou un système de commerce électronique, signifie apprendre de nouvelles gemmes. Vous apprenez rapidement que toutes les gemmes sont là, mais plus la chose que vous voulez faire est obscure, plus il sera difficile de trouver une bonne documentation.

pdr
la source
Concernant les problèmes de performances - je semble me souvenir d'avoir lu que beaucoup d'entre eux avaient été largement résolus avec la version 1.9 de l'interpréteur, mais je peux me tromper complètement. Existe-t-il des moyens de surmonter cette limitation de performances?
Matty
1
@Matty: Comme je l'ai ajouté, codez pour rendre les temps de réponse aussi rapides que possible. Tout ce qui peut être laissé à un processus backend, faites-le. Mais alors vous devriez le faire avec n'importe quel framework - c'est facile de ne pas le faire. De plus, jRuby est enfilé différemment, mais il vient avec ses propres problèmes et ma réponse était déjà assez longue.
pdr
7

Dans mon expérience personnelle, le principal mal de tête concerne la compatibilité .

Quand:

  • il y a des xprojets de rails déployés,
  • chaque projet utilise des ygemmes.
  • alors qu'il existe des nversions de rails,
  • plus m versions de gemmes installées,
  • avec several versions de rubis,
  • sur une seule boîte Linux comme machine de production.
  • le programmeur travaille sur un autre ordinateur portable de développement OS X.

En tant que travailleur indépendant, qui n'a pas le luxe de mise à jour / mise à niveau la plupart des choses, fera face à beaucoup de problèmes de compatibilité de variables ci - dessus ... tout rails, gemset rubycontinuer à changer / évolution.

ohho
la source
7
Tout ce que vous avez mentionné est corrigé en utilisant RVM (ou rbenv ) et Bundler . Vous pouvez alors avoir des versions spécifiques de Ruby et des ensembles de gemmes isolés pour chaque projet.
Ashley Williams
Cette réponse est (maintenant) totalement hors de propos. RVM pour gérer la gestion des versions Ruby, Bundler pour gérer la gestion des versions gem; Capistrano pour gérer les déploiements sur le serveur de production et Figaro s'occupe des secrets d'application / variables d'environnement. Je développe mon application sur [Cloud9] (c9.io) (un IDE Web), et mon processus de déploiement se fait littéralement bundle exec cap production deploy. Capistrano s'occupe de versionner l'application sur le serveur. Comme tout autre framework qui sort (par exemple Node.js), des outils sont écrits pour résoudre vos problèmes .
Chris Cirefice
5

La vitesse est définitivement un problème. L'extrême flexibilité de Ruby s'accompagne d'un impact significatif sur les performances.

La mise à l'échelle horizontale n'est pas une tâche évidente, à l'exception des technologies spécialement conçues pour cette tâche, qui compromis généralement la simplicité pour bien évoluer.
Si vous pouvez traiter 100 fois plus de demandes par machine avec la technologie A qu'avec la technologie B, l'utilisation de la technologie A vaut la peine d'être considérée si vous avez des raisons de croire que vous pouvez servir vos données à partir d'un seul serveur pendant un laps de temps qui vous permet d'ajouter parallélisation par la suite.
En 2009, stackoverflow était toujours servi à partir d' un serveur Web . Bien sûr, ce n'est plus une option. Mais je suppose que c'était bien qu'ils aient commencé avec une technologie, qui pouvait s'étendre à beaucoup d'utilisateurs sur une seule instance, avant d'avoir à se soucier de la mise à l'échelle.

Par rapport à cela, RoR est vraiment lent. Le temps de traitement des requêtes simples est important et c'est donc un problème pour gérer de nombreux clients (tout cela doit être vu par rapport à des alternatives plus rapides).

Dans un souci d'orientation vague, voici quelques chiffres, comparant divers autres langages adaptés au développement web à Ruby:

Notez que cela ne signifie pas que si vous utilisez le framework X pour Java, il sera exactement 200 fois plus rapide que RoR. Mais la différence de vitesse mesurée dans ces benchmarks a un impact important sur les performances globales de votre application.

back2dos
la source
4
Cette réponse ne parle que de «vitesse» lors de l'exécution. Ruby (et Rails) est optimisé pour la vitesse de développement.
Nicolai Reuschling
5
Ce n'est pas une bonne comparaison. La majorité du temps passé dans une demande Web fait des E / S à partir de la base de données. Lier à des benchmarks intensifs en CPU est trompeur.
ryeguy
3
@pdr: Beaucoup de problème de Twitter était qu'ils utilisaient rubis pour tout , même leurs processus de back - end qui étaient cpu intensive. Des domaines comme celui-ci ont brillé de façon statique. Ils utilisent Scala pour cela maintenant. Honnêtement, je crois sincèrement que l'utilisation de RoR est beaucoup plus rapide en termes de temps de développement que C # ou Java. Je l'utiliserais pour la plupart de l'application Web, puis utiliserais C # ou Scala pour tous les travaux d'arrière-plan intensifs en CPU.
ryeguy
3
+1, pour les points valides. Cela étant dit, vous pouvez faire beaucoup pour optimiser les applications Rails. Rack se prête à être un système plutôt extensible qui permet une grande flexibilité dans la façon dont tout est appelé. Sans oublier, Ruby 1.9 est plus rapide, JRuby est plus rapide. Personnellement, je suis un grand fan de JRuby, pouvoir mélanger la puissance de la JVM est une merveilleuse victoire (
faites
2
@Nicolai Reuschling: Quelle valeur réside dans Ruby ou RoR étant "optimisé pour la vitesse de développement"? Pouvez - vous fournir vérifiables , quantitatives données comment Ruby fournit effectivement la vitesse de développement plus élevé que les alternatives (Lift par exemple)? Tout le reste n'est qu'une réclamation nulle. En outre, cette question concernait les inconvénients du RoR . Une vitesse de développement élevée est un avantage et sort donc du cadre de cette question. De mauvaises performances d'exécution entrent dans le cadre de cette question, car c'est un inconvénient.
back2dos
3

Rails a un sérieux problème de performances: chaque requête est mise en file d'attente derrière la requête actuellement active, au lieu de les enfiler comme le font la plupart des frameworks ou de permettre aux événements de blocage de libérer d'autres requêtes comme le font Node.js et Twister. Cela signifie que vous devez coder pour accélérer les temps de réponse, mais c'est assez facile à faire dans la plupart des cas.

Je pense que c'est très erroné. Vous pouvez exécuter Rails en mode multithread. Lorsque vous exécutez en mode multithread, vous ne devez utiliser que des bibliothèques d'E / S qui libèrent le GIL (par exemple, la gemme 'mysql2'), sinon cela devient en quelque sorte inutile.

Si vous utilisez jRuby, vous pouvez simplement exécuter un processus à rails uniques en mode multithread et utiliser pleinement toute la puissance CPU disponible. Cependant, si vous êtes en IRM (Ruby 1.8.x ou 1.9.x), vous devez exécuter plusieurs processus afin d'utiliser pleinement les CPU, ce qui est également le cas avec node.js.

Pratik Naik
la source
Une question de clarification ici - existe-t-il un moyen facile de trouver quelles bibliothèques d'E / S publient le GIL?
Matty
Je pense que la meilleure façon de comprendre cela est de le comparer gist.github.com/35d4769d8c8c0dfafc56
Pratik Naik
Bon d'entendre l'un des principaux développeurs! Ces informations ne figurent dans aucune documentation, n'est-ce pas? C'est un peu fastidieux (bien qu'une activité intéressante) de commencer à tester les bibliothèques pour le découvrir.
Matty
3
  • Rails a beaucoup de subtilités qui vous cachent la complexité. (Associations ActiveRecord, l'ensemble du cycle de vie de validation / sauvegarde, l'interprétation des données de demande sur la base des en-têtes fournis) Lorsque vous débutez, c'est génial. Au fur et à mesure que vous grandissez, vous constaterez que vous commencez à adapter votre application à la "manière Rails" de gérer les choses - parfois c'est bon, parfois cela est inoffensif, et parfois c'est en fait contre-intuitif à la chose que vous essayez de faire. Toutes les tables de base de données ne doivent pas être modélisées en tant qu'objets, une étape de validation peut devoir se produire ailleurs, etc. Beaucoup de programmeurs Rails évitent de ne pas lutter contre le framework (ce qui est généralement sage), mais l'effet à long terme de ceci est ... vous emportera les habitudes de Rails avec vous dans des endroits où elles ne sont pas nécessairement nécessaires.

  • La communauté a l'habitude d'écrire des logiciels qui sont présentés comme «magiques» - des bibliothèques de mise en cache qui fonctionnent comme par magie! E / S événementielles qui vous rendent magiquement plus rapide! Magie magique! Ce qui est généralement le cas ici, c'est qu'une API très attrayante est fournie pour une solution technique qui fait défaut, et vous êtes dupé par les très jolis exemples que la chose fait ce que vous avez l'intention, et que vous découvrirez plus tard qu'elle couvre une solution incomplète. Le cycle de ceci est assez constant, et vous apprenez à rouler avec, mais vous devriez certainement vous familiariser avec l'idée de lire beaucoup et beaucoup de code dont vous dépendez (une bonne chose!). Les solutions de magie communautaire Rails ne sont pas aussi magiques que le README peut le suggérer, dis-je.

  • Corollaire ci-dessus: plus vous utilisez Rails, plus vous devriez lire sa source. Mieux vous comprenez le cadre interne, plus vous serez heureux à long terme. Pas vraiment Rails spécifique dans ce domaine, mais je vous dis simplement par expérience ici. Les noms de méthode promettent parfois quelque chose que vous n'obtenez pas réellement.

  • Le culte du fret est un problème avec Rails, mais c'est probablement vrai avec toutes les communautés framework / lang. Il semble plus prononcé (pour moi) dans Rails, et en tant que tel tend à donner un aspect générationnel étrange au code Rails - lorsque vous travaillez sur différents projets Rails, vous remarquerez certaines tendances qui tendent à trahir la période de temps pendant laquelle ils ont été créés . Comme vous pouvez le deviner à partir de cette déclaration, la communauté a tendance à adopter assez rapidement de nouvelles solutions et à déconseiller les anciennes. Vous devriez vraiment être au courant de votre actualité Ruby, juste pour comprendre une partie du code que vous expérimenterez quotidiennement.

  • De manière générale, je pense que le problème de la simultanéité des données n'est généralement pas bien traité par la communauté - lorsque vous développez une application, lorsque vous atteignez le point où vous devez partager des données, annuler des modifications physiquement à distance et verrouiller l'accès aux données, les solutions deviennent un peu plus réglé à la main, ce qui rend certaines des belles choses Rails que vous obtenez tout brouillées avec les nécessités techniques de la précision. Rails ne résout pas tous les problèmes que vous rencontrez avec une application Web, je suppose que je le dis, et bien que les créateurs ne prêchent certainement pas ce message, il est facile d'être dupe de penser qu'il est implicite.

netshade
la source
2

Selon la façon dont vous le regardez, la vitesse à laquelle Rails change peut ou non être une mise en garde pour vous. Les choses changent quelque peu radicalement d'année en année, car de plus en plus de ce qui craint et a besoin de solutions.

Si vous êtes en développement actif, vous aurez cependant le doigt sur le pouls.

Xorlev
la source