なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

Javaプログラマーが3ヶ月Railsを使って思ったこと

わたしは元SIerで、JavaによるWEBアプリを作っていた経験がほとんどだったのですが、
ついに最近Rubyでのお仕事をはじめました。これはその感想です。

わりとJavaディスり気味になるかもしれません

1.これまでの経験とか

フレームワーク的には
・単なるJSP/Servlet
Struts/Struts2
とか使ってた感じです

最近はScalaでScalatraとかも見たり修正したりしてました。

2.WEBアプリにおけるJavaRubyの比較

ここでの比較は言語ではなく、フレームワークの戦いになると思います。
つまり、Struts/Struts2などなど vs Rails

実装のしやすさ、間違いを犯さないかどうか

これは完全にRailsに軍配が上がると思います。
Javaは書いたコードの出来上がりはPythonのように一定の粒度で書けますが、構造に欠陥ができやすいというのが私の今の所感です。

自由度

言語の自由さはRubyが上ですが、やりたいことを実現できるかどうかで言えばJavaのほうが強そうです
伊達に30億のデバイスで動いてません。
マイナーなプラットフォームではJavaを採用したほうがむしろ動いたりするのでは。

ライブラリの多さ

これはJavamavenがあり、Rubyにgemがあるので、実際同じ程度だと思います。

3.Javaの辛いところ/Rubyで楽になったところ

(A)ビルドが遅い

→ mavenビルドに20分かかるプロジェクトとかもありましたが、Rubyはビルド必要ないです*1

(B)JSP(View)のデバッグがたいてい大変になる*2

不誠実なエラー
 ・JSPはエラーを出した時、画面が真っ白になるので原因がわかりません。
 ・ControllerからViewにデータを飛ばす部分がブラックボックスになるので、エラーの原因をさらにわかりにくくする。*3
 ・というかJavaJSP以外にテンプレートエンジンないのか?(ただし、Velocityテメーは駄目だ)*4

→ RailsにはBetter Errorsというものがあり、特に混雑しがちなViewのデバッグが楽にできます
  Railsのデバックが捗るエラー画面 Better Errors 使ってみた! - 酒と泪とRubyとRailsと

戦場の如きView
 ・また、JSPJSTLJSFのタグフレームワークごとの独自タグ、プロジェクト独自タグなど、
  謎のタグ地獄によく遭難しました。更に悪いことに、そこにヘタクソに書かれたJavascriptのコードが襲いかかってきます。Viewは地獄です。

→ Javaがなぜこのようにタグを乱立させるのか私にはわからないのですが、
  とりあえずRailsならerb/slim/hamlのどれかを使えばいいのでそこはいいです。少なくともタグが混ざることはない。
  Slim - A Fast, Lightweight Template Engine for Ruby

→ また、そのように複雑な構文を書かなければいけない原因は、
  最初の設計段階で複雑なモデルを考えているからです(もしくは考えていないから破れかぶれ)。*5
  とりあえずRailsならrails generateでmodelを自動生成できるので、最初からある程度
  疎結合なモデルを作っておけば、複雑なViewを書く可能性は減ります。
  Scaffoldによって作成されるファイル - Ruby on Rails入門
  モデルの作成とRailsで指定可能なデータ型 - Ruby on Rails入門

→ 最近だとScalaのSkinnyがそういうrails g scaffoldみたいな機能持ってるらしくて注目してます
  Skinny Frameworkで始めるScalaのWebアプリ開発 - argius note

(C)普通のデバッグがそもそも大変

苦痛をともなうデバッグ
 ・Javaで有る箇所のデバッグを行いたい場合、ユニットテストがあればそこからバグをたどるし、
  なければIDEで問題箇所にブレークポイント張るような気がします。

→ 上記でも問題は無い気はしますが、Railsの場合rails consoleが使えます。
  rails consoleのすごいところは、言語で用意されてるクラスだけではなく、プロジェクト内で
  作ったクラスのインスタンス化・実行が試せる点です。ネットワークアクセスを伴うような
  処理でも実行できます。かるーくデバッグできます。
  rails console の tips - Qiita

→ また、byebugもいい感じです。疲れていたとしても、頭が死んでいたとしても使えるぐらい楽です。
  pry-byebug を使ってRailsアプリをステップ実行する - Hack Your Design!


→ もちろんJVM言語でも、ScalaとかGroovyなどはそういうものを用意してます。

(D)データベース連携処理に定石がない

 ・Javaは使うフレームワークによってどの程度データベースアクセスを隠蔽化するかがまちまちです
  Railsactiverecordの機能はなんだか便利っぽいORMと要約できるので、それと同等のことをしたければ
  Hibernate/JPAなどのオブジェクト関係マッピングライブラリを使用すればよいでしょう。
  そうでない場合のチーム開発では、SQLやそれ周りでコードの書き方に差が出るので嫌な感じ。*6

4.使ってみてわかったRubyへの偏見と実際

環境構築が大変なのではないか

・rbenvが無い頃、これは多分大変だったと思うのですが、rbenvを使えば環境構築自体簡単にできるので、困ったことはないです。

重いのではないか

・重くない、Twitterレベルのサービスになると流石に駄目なのかもしれんけど

5.使ってみてわかったRubyの良いところ/悪いところ

良いところ

CSRFトークンなど、細かいところに手が届く
→ 要はCSRF対策用の仕組みを自動で組み込んでくれる。Javaはそういうのないよね。
→ Railsのセキュリティ対策については右のページを参考にしてください(英語):Ruby on Rails Security Guide — Ruby on Rails Guides
→ 「CSRFって何?」というクソエンジニア、マネージャの方は以下を参照。わかりやすいよ
Security&Trust ウォッチ(33):「ぼくはまちちゃん」 ――知られざるCSRF攻撃 - @IT

JSON/XMLなどの変換が死ぬほど簡単

6.懸念点

Rails自体のアップデートを追いかけないとダメそう、大変そう
・運用段階での障害対応とかどんな感じなのか知らず

7.JSPの後継は?

こんな比較があった
stackoverflow.com

*1:assetのコンパイルは毎回しなくていいよね?

*2:ストレスがたまるので精神にも良くないことは私が体験済み

*3:バグのアタリのつけ方が難しい

*4:探したらいろいろあるみたいだけど、今考えてるようなJSPの問題を解決してくれるようなモノはあるのか?
Javaのテンプレートエンジン、Pebble、Rythm、Jtwig、HTTLをちょっと試してみる - CLOVER

*5:例え一つ一つのモデルが一見簡単そうでも、それをHTMLとして表示させる場合、要望と組み合わせにより複雑度がどんどん増します。

*6:まあ要はそこで書き直しが生じたりするので嫌