Rails 設計 最強

自分が目指したいRailsアプリの形とは何か、ということについて考えていた。

常日頃から考えていたRailsアプリでの不満をこの議論に合流させた結果、「Rubyを書くときに当たり前にやるようなことを、Railsアプリを書くときでも当たり前のようにやる」というところが肝で、自分が目指したいRailsアプリの形はその先にあるのではないか、と一旦結論付けてみることにした。

「普通にRubyでコードを書くときはやらないけど、Railsだったらこう書く」という何かが存在していることが、さまざまな失敗の原因をつくっていると思う。 RubyとRailsが地続きに繋がっていないというか、どこかで断絶があり、そこから筋の悪い設計が生まれている ―あるいは持ち込めるはずの良い設計を持ち込めていない― のではないか、という話。


実際にはどの辺りが気になっているのか?という例を挙げると、氷山の一角を指摘するだけなのでこのトピック自体にはあまり強い関心を持たないでほしいのだけど、例えば「定数名の名前空間おかしいやろ」という話がある。具体的には、「なんでトップレベルに定数生やしまくるわけ?config/application.rb で MyApp みたいな良さそうなmodule定義しとるんやから、MyApp::Controllers::ApplicationController みたいにその下に生やしていくようにすべきなんちゃうん」という話。

要は、ユーザに書かせようとしているコントローラとかモデルとか諸々のコードの方向性が若干おかしいのではないかという話。というか基本的に、Railsのライブラリ側のコードはものすごく考え抜かれた設計になっていて、そこは完全に偉大なコードだと思っていて、不満があるのはユーザに書かせるコードの話である。

そういう、「確かにキー入力量を削減しながら多くの機能を実装できるけどスケールはしなそう」というコードを書かせるライブラリで本当に良いのか?それで「開発の生産性が著しく向上することに気付くでしょう」とか言って良いのか?という。

正直、Railsの利用者のプログラミング能力として想定されているレベル感が結構ナメられているというか……少なくとも、それがあまりにも低く見積もられすぎていた時代があって、その感覚のまま今でもそれが提供され続けていたりするのではないかと思っている。知らんけど。

あるいは、それが「右も左も分からないようなRuby初心者にも使ってもらうための戦略である」というのであれば、その戦略単体では結構なことなのだけど、それはRailsが前提としている「何かをなすうえで最善の方法というものが1つだけある」という仮定と両立しないと思う。

この仮定の上だと、タイプ量は少なくてイージーだがスケールはしなそうな実装方法が「これが全てのRailsアプリにおいて見習うべきスタンダードでRails Wayなコードである」と扱われるので、郷に入っては郷に従え的感覚であらゆる状況でそういうコードを書かされることになるが、正直これはあまり良い状況ではないと思う。

そういう状況になっていると、早々に破綻するような勉強用のチュートリアルみたいな規模のアプリケーションをタイプ量を抑えながら高速に量産することしかできないので、「Railsでは規模に耐えきれなくなってきたのでマイクロサービス化を期に○○で書き換えたら上手くいきました」とか言わせてしまうのではないですか。

もちろん、スケールできるように個々人が要所要所で工夫を凝らしていくことは可能で、実際にそういう努力がそこかしこで行われているのだけど、根っこのところでそれが志向されていないせいで、改善より速いスピードで新しいレガシーコードが生まれていったり、巨大な不安を感じなから手探りで拡張していくことになったりといったように、苦し目の状況になっているんじゃないかと思う。


じゃあどうすれば良いのか?という話なんですが、まずRails側がこうなっていたら理想だなという個人的な希望を言うと、「何かをなすうえで最善の方法というものが1つだけある」という仮定、つまり「最善の開発方法というものを1つに定める」というRailsの根底にある判断はそのままにしておきながら、もっと利用者の学習能力・行動力を高く見積もった上での「最善の方法」が模索されてほしい。

現状提供されている方法は、「短い文字数のコードで動く」というところに最善たる評価基準が置かれすぎていると思う。もし「短い文字数のコードで動くアプリをつくることがRailsの存在意義である」とか言われたらもう諦めるしかないんですが、そうではないと思うので、それが堅牢になるかどうかという評価基準をもっと重視するように適宜変えていくと、いずれ「Rubyを初めて触るような入門者には一見難しく見えるかもしれないが、分かってくると確かにそれが正しかったなと信じられるような実装」が提供されるやり方になるのではないか。

とはいえ別にRailsがそうなっていくかとかは全く分からないので、Railsアプリをつくる側は現状どうしていけば良いのかという話を考えると、「現状のRails Wayってやつは哲学はともかく実現方法としてはもっと上手くやる余地があるやり方なので、盲目的に信じてみるのはやめて、一歩引いて "普通にRubyだったらどう書くか?" という考え方を重視する」という方向に考えを変えてみるのが良いのかもしれない。これは思考実験から出てきた一つの案なので、特に確証がある話ではないけれども。

これらの話が、冒頭に述べた「Rubyを書くときに当たり前にやるようなことを、Railsアプリを書くときでも当たり前のようにやる」という話に繋がってくると思い、自分が目指したいRailsアプリの形がこの先にあるのではないかと一旦結論付けることにした。