読者です 読者をやめる 読者になる 読者になる

ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

Sinatra frameworkに関する私見

WIP

エクスキューズとか

正直な話をすると、Webフレームワーク自体に関する興味は以前に比べて失われてきているので、最新のSinatraの細かいコミットまでは追っていない。

だが、2年強ほど Sinatra/Padrino 界隈を追いかけてきて得た知見と言うか考えについてまとめるのは一定の価値がある、少なくとも自分に取っての価値は非常に大きいと思うのでここに書いていきたい。

副次的には、ミスコンセプトによってSinatraを利用して、結果必要の無いイメージの悪化を招く事態を一件でも減らせればと思う。

Sinatraはmicroframework、あるいは「フレームワークではない」

公式の説明にある通りである。

具体的にどういうことかと言うと、Sinatra単体ではウェブサービスに必要な要件を満たさないかもしれないと言う話である。Sinatraが持っていないものについては、Sinatra以外の場所から持ってくる必要がある。

ここがRails、そしてそのエコシステムとの大きな考え方の違いで、Railsエコシステムは「8〜9割の場合においては大丈夫な王道を用意する、もしくはポインタを示す」という根底的な習慣がある。Sinatraは、コミュニティの小ささもあって「王道」を用意しきれないと言うのはあろうが、それ以前に「最低限ものもしか用意しない」という設計思想が存在している。

具体的なところはRails3.1以降Webフレームワークの仕事になったAsset Pipelineの扱いで、今に至るまでSinatraはその機能を本体に取り入れていない。選択肢として、

  • sinatra-assetpack
  • Sprockets::Environment を直接利用
  • bower + grunt

などが考えられるであろう。で、それぞれにメリットがあり、また、正解をSinatraとしては用意していない。なので、各開発の要件をかんがみ、それぞれの選択肢自体と向き合って、Sprocketsが有利ならSprockets、bowerが有利そうならbowerを選べばいい。Sinatraのレイヤーにとどまってうだうだ議論をするのは無駄である。

小さな部品を組み合わせる

Sinatraのエコシステムを説明するのに最適な比較対象はPerl全体のエコシステムだと思う。PerlユーザはCPANに小さなモジュールを公開し、あるいは求め、それらを自分の用途に合わせて組み合わせる。

もし、その小さなモジュールが全然イケてなかったり、バグを踏んでいたり、微妙に自分の用途と足りなかった場合はしばしば存在するものと思う(ぼくはガッツリしたPerlユーザではないので想像だ)。その場合、彼らは適宜自分でパッチを送ったり、自分で再発明したりすることになるだろう。小さなモジュールに関することなので、そういうことをしてもコストは小さくなるし、また、「多様性は善」なのでそういうところも認められる。

あるいは、一カ所のバグで多くの部分がダメになる、と言った事態も当然避けやすくなる訳で。

Padrinoとはなんだったのか

Padrinoは最終的に、あくまでもSinatraのコンセプト「小さな部品を組み合わせる」のいち実験的実装だったと思っている。

成果として、一定以上まともに使えるウェブフレームワークが誕生したので、これはこれで貴重なことだと思うが、(何人かの指摘がある通り)たとえばactivesupportと言うRailsエコシステムの一部に依存しているなど、現状ではコンセプトを実現しきれていない面はあるだろう。

その点も含め、Padrinoが今後さらに発展的な実装になることはあり得るかもしれない。

どういう場合に Sinatra なのか

現在の目的と言うより、開発のスタイルに依存していると言うのが私見。APIRailsで作ってもいいし、Sinatraで大人数、工数もでかいWebアプリケーションを作ってもいい。

Sinatraを利用したい場合は、先述した「小さな部品を組み合わせる」スタイルの開発が自分もしくはチームに向いている場合だったり、Railsがかなりモジュラーな設計になったとは言えそれでも多機能すぎる場合はSinatraはいい選択肢になるだろう。

たとえば、PerlPythonの経験者がRackの資産を使いたくてRubyで開発をしたい場合などは、小さな部品を徐々に把握するスタンスを選べるSinatraは有利かもしれないと思う。実際PythonPerl経験者がまずSinatra/Padrinoを使って見ている場面は幾つか見かけた。

とにかく、Railsが育んできた考え方を一旦リセットする(捨てなくてもいいと思うけど...)べきだと思っていて、経験上そこでいろんな人が不幸になっている。

最後に、とにかく強く主張したいのは、Rails vs Sinatraみたいな要らない煽りは害ばかりであるということで、そもそもの設計思想が違うよね、と思う(というかそういう旨を当のDHHが言ってた記憶がある)。かつての自分はそういう煽りに乗っていた部分もあるので強く反省している。

以上について

あくまでも私見で、rkhがそういうことを言ってたと言うソースは無かったりするが、でもSinatraに関してぼくの中でミスコンセプトに使っている人をいちいち見つけて突っ込むのも効率が悪いので、ぼくの立場を明らかにしようとこれを書いた。

出典が示せそうな箇所についてはあとで追記していく予定...