私のRails経験年数はX年です、そう言っていたわけですが、本当にきちんとしたRailsのコードを読んで打ちのめされてしまってですね。
今まで私が書いていたRailsはRails wayではなくただの荒野を走るぼた山の列だったと。勇気でデプロイする開発スタイルは、哀・戦士としてはそれで良かったのですが、今はA.D. 2025なので結論ダメです。
さて、打ちのめされっぱなしではIT職人の名がすたるので、必死にこのフレームワークの特性、書き方、メンタルモデルを理解しようとしていたわけです。
誤解を恐れずにいいます。Railsとはマインクラフトであり、Railsのコードを書くことはマインクラフトのmodを書いているということです。
私の今までの理解は、Railsというのはいわゆる「GUIフレームワーク」と同列のイメージでした。つまり、Railsを使い、派生させたRubyのコードを記述して、それでサーバサイドサービスを作る、というメンタルモデルで書こうとしていました。
しかし、それではうまくいかなかった。とはいえ理解するまで学ぶとかそんなわけにはいかない。今までの書き方を改め、プライベートの時間でドキュメントをひたすら読み込んで学び、現場の先達に教えを請いました。
そしてようやく「こなれてきたな、周りの良さげなRailsのコードより僅かに見劣りするけどパッと見では区別つかないな」ぐらいになりました。
それでもなお、書けるようになっても「自分がサーバサイドのコードを書いている」という感覚にはならなかったのです。
Rubyは実は型付けがしっかりした言語です。to_iやto_sを呼び出さない限り暗黙の型変換は行われません。classの概念もあります。moduleという使い勝手の良いinterfaceのような機能もあります。
一方でRailsはどうでしょう。なんとこいつはそもそも関数を実装する、という形でサーバサイドのコードを実装していきません。
そう、Rubyには強力なドメイン固有言語を定義できる機能、そして強力なメタプログラミング機構が備わっているからです。
つまり言い換えるとこうなるでしょう。Railsはただ存在するだけでサーバーサイドとしての抽象的な箱としての役目をすでに「実装し終えて」いるのです。
私が実装していたのは、Railsのフレームワークを利用・拡張したプログラムというより、Railsというサーバーサイドプログラムを特殊用途にカスタマイズするための変更指示プログラムだったのです。
もちろん誤解のないようにいうと、実際にはそういうわけではありません。ただそういう考え方でコードを書いたとするなら、考えやすく説明しやすいということです。
そう、この「すでに実装し終えているものを独特かつ柔軟な言語で変更する」という行為、これはゲーム業界にいた私ならすぐに思いつきました。Luaです。
詳しく話せば、LuaとはC++などで書かれたゲームの大枠に固有のステージやアクションなどのレベルデザインをするのによく使われるスクリプティング言語です。柔軟な拡張性を持ちますが、実行を終えるまで変数があるかどうかすら保証されません。
確かにRailsを書いているときの「これでいいのかな、実装して動かしてみるか」「コンソールでこのメソッドは呼び出せるのかな」という感覚。
Rspecを書いているときの「この条件であればメソッドにまでたどり着くことを証明する」テストコードを書いているときの感覚。
これは完全に、既存の半完成された状態のゲームエンジンに対して実際のレベルデザインをしていくときの、あの「これがあるかないかは実行するまでわからない」の感覚でした。
そう、つまりRailsはそれそのものがすでに環境であり半完成品で、これに設定ファイルを記述していく……RailsはRubyでできていますが、それは半完成品の実装言語と設定ファイルの実装言語が「あくまで単に同じなだけ」という理解をする……。
pumaというより簡素なサーバの上にrailsがあること……大量のDSL記法……型がある言語で型を柔軟に補い、それをさらにテストで補う開発スタイル……これらはすべて「半完成したRailsに設定を記述している」んだ……!!
やっと理解しました。そういうことだったのです。これでやっと思い出しました。Apacheに設定ファイルを記述するSSIという機能。nginxはサーバそのもので、かつ半完成品。そこに設定ファイルを記載していくことで「サーバ」になる。
私は、はじめて自宅でサーバを立てたときのことをすっかり忘れてしまっていました。
あのとき忘れた気持ち、それが、Railsを書くといういとなみ、そのものだったのです。
yay!I am now on rails……!!!
書いた日:
このページの完成度: 100 / 100