aoitaku Advent Calendar 2016 : 4日目 - Ruby

この記事は aoitaku Advent Calendar 2016 の 4 日目の記事です。

PHP の次です。
今の会社に入って最初のプロジェクトが Ruby でした。Ruby で Web の仕事ということで Ruby on Rails です。Rails やるのはこれがはじめてで、めちゃくちゃ苦労したし誘ってくれた人にもめちゃくちゃ迷惑をかけました。忸怩たる思いでいっぱいなんですが、いちおう先月無事に保守期間を終えてクローズできて、完全にぼくの手を離れています。
大変なプロジェクトだった。でも大変だったのは「はじめての Rails」だったからということではないんですよね。

PHPRuby

これはぼくの経歴ではなく、プロジェクトがそういうプロジェクトでした。CakePHP で作られたシステムを Rails でリプレースする。それがぼくの最初の Ruby の仕事でした。
いまから思えば、まっさらな状態で Rails を触っておくべきだった。Mac もあったし、なんでそうしなかったんだろうか、と思ったりもするんだけど、でもチュートリアルやったところでたいして変わらなかったような気もしています。やらないよりはよかったろうとは思うんだけど。一個自分で何か作って動かすところまでやっておきたかった。

PHP は読めるし、CakePHP のことも全く知らないわけではなかったんだけど、とにかく元のシステムの品質が悪かった。これはいいわけではなくて本当に品質のよくないシステムで、プロダクションのプログラムに未使用のコードが普通に混入しているし、プロダクションのデータベースに未使用のテーブルが普通に混入しているし、という状況の中で、仕様書や設計書みたいな資料はなし、動いているプログラムが仕様、という状態でスタート。
何が正しくて何が間違っているのか分からないのでとりあえず愚直に CakePHP のコードを Rails に移植しようとすると当たり前だけどぜんぜん Rails にならない。かといって Rails らしく書くと元の仕様からは大きく手を入れないといけない、ということもたくさんあって、ベターな実装に置き換えたものがあとでクレームがついたり、悪い実装の陰に潜在していたバグが表に出てきたり、いろいろなことがありました。

CakePHP はそんなに筋の悪いフレームワークではないと思っています。もちろん Symfony 2 のほうがよい設計思想だと感じていますし、FuelPHP のほうが小回りきくだろうという感じですし、最近だと Laravel がベターなんじゃないかなと思っていますが、それはそれとして、Cake の上に乗っているコードがあまりよくなかった。

結局ほとんど一から書き直したんだけど、これだったら本当に Rails で一から作ったほうが Rails のこともっとちゃんとわかったろうなあ、と思います。

Rails のこと

Rails のことは話には聞いていたんですが、実際に触るとこれは Rails であって Ruby ではないという実感がありました。
それは Rails の、というか Active なんとかとか Action なんとかのパワフルさがそうしてるんだと思いますが、Rails way で書く、というのが一貫していて、コードは書きやすいように思います。
言うほどちゃんと Rails way が身についたわけではないので、ちゃんと一からプロダクト作ってみたい気持ちがあります。

Rails じゃないこと(あるいは Ruby そのもののこと)

それはそれとして、ぼくが Ruby と出会ったのは最初に入った会社をやめるより少し前のことでした。RPG ツクール VX のエンジンであるところの RGSS2 が Ruby 1.8系 をスクリプトエンジンとして積んでいて、最初触るまでは「ゲームを Ruby で拡張できるのかなー」くらいのことを思っていたんですが、実際触って「なんじゃこれほとんど Ruby で書いてあるやんけ!」って驚く。
当時 C++ を書いてたぼくは、Ruby のほとんどぜんぶオブジェクトであることのうつくしさとか、Class と Module というクラスシステム、いわゆる mix-in というやつですが、これにめちゃくちゃ感動します。
PHP を仕事で使うようになってからも傍らでずっと Ruby を書いてきました。 演算子式が単なるメソッド呼び出しのシンタックスシュガーだとか、method_missing 使った任意のメッセージ転送とか、動的なメソッド定義とか、演算子オーバーロード 、ブロックのオブジェクト化、lambda、カリー化と部分適用……どんどん Ruby にどっぷりハマっていきました。
このへん あおたくノート をご覧の方にとってはもういまさらですね。Ruby のどこが好きかと聞かれるといろんなところが好きなので一言でいうのはむずかしいですが、内部 DSL が作るのに適したつくりになっているところはたぶんいちばん好きだと思います。

これからの Ruby のこと(あるいは Ruby の先でぼくに起こった変化)

3.0 で型が入る予定ということですが、Matz の「型を書きたくない」に同意しつつも、型がないと困る場面は割と経験していて、型があったらいいのにな、と思うことはままあります。それはそれとして、型を書かずにいきなり書けることは Ruby の魅力だとも思っていて、できるだけ型なんか書かなくても、うまいこと推論してくれるのがいちばんよいとも思っています。
完全に推論してくれなくても、とりあえず実行前、つまりコンパイル時にエラーで弾いてくれたらそれはありがたいわけです。
もっというと、型というか制約がほしくて、同じ型でもたとえば数値だったら正の数だけほしいとかゼロはほしくないとか一定の範囲内の値がほしいとかそういう制約をかけたいことあるわけです。あるいは実行前にパターンマッチのチェックとかできたらいいなとかもあるわけです。
実はそのへんの思想の変化についてはわりと最近起こってきたことで、それが次の記事のテーマになってくるわけですが、そういうわけでまた次回。お楽しみに。