新しいRailsアプリを最速で理解する方法 — 迷子にならないための3段階アプローチ
社内で別チームに移ったばかり、あるいは転職した直後。お気に入りのオープンソースアプリでバグを見つけ、初めてプルリクエストを送ろうとしている——。ところがgit cloneしてapp/modelsを開いた瞬間、完全に迷子になってしまった。ディレクトリ構成はいつも使っているRailsと同じなのに、コードの中では方向感覚がまったくつかめません。この見慣れないRailsアプリを、最短ルートで学ぶにはどうすればいいのでしょうか?
まずは「プロジェクトの用語集」を作る
Playerとは何か?Sessionは?AccountとUserとProviderの違いは?
アプリごとに使われる用語やメタファーは異なります。アプリの語彙を理解していないと、新しいクラス名を目にするたびにapp/modelsをさまようことになり、時間を浪費します。さらに悪いことに、機能の仕組みについて誤った思い込みをしてしまうかもしれません。
だから最初にすべきことは、その語彙を身につけることです。このアプリが何でできているのかを学びましょう。手っ取り早いのは、db/schema.rbを読むことから始める方法です。アプリが使っている用語と、データ同士がどう関連しているかがひと目でわかります。特に*_idカラムに注目すれば、モデル同士のつながりが見えてきます。
視覚的に把握したい人には、rails-erd gemがおすすめです。Railsモデルから図を自動生成し、すべてのテーブル・カラムとその相互関係を可視化してくれます。印刷してデスクに置いておけば、その後のコード理解も格段に楽になるはずです。
モデルとプレーンなRubyオブジェクトへ広げる
設計の良いRailsアプリでは、すべてがデータベーステーブルに紐づいているわけではありません。語彙をさらに広げるために、app/modelsの中からdb/schema.rbには現れなかったクラスや属性を探してみましょう。
ただし、ここで深追いしすぎないことが大切です。仕組みを追いかけていると、あっという間に迷子になります。現時点での目的は、あくまで「語彙を埋めること」だけです。
アプリを構成する部品について学ぶにつれ、「なぜこのオブジェクトは存在するのか」「なぜこのように組み合わさっているのか」という疑問が自然と湧いてくるはずです。それこそが、次のステップへの入り口です。
実際にアプリを触って「Why(なぜ)」を見つける
アプリが使うオブジェクトに慣れてきたら、いよいよアプリを起動してみましょう。画面を操作しながら自由に探索します。ドキュメントがあれば道しるべになります。なければ、せっかく覚えた用語が画面の中で動き出す様子を眺めるだけでも十分です。
使い込むうちに、アプリを一段高い視点から見られるようになります。モデルが特定の関連を持っている理由、グループ化されている理由、そのクラス名が選ばれた理由——たとえば同じページに一緒に表示される、同じフォームから生成される、といった背景が見えてくるのです。
アプリを構成する部品と、それらが存在する理由がわかってきたら、「どのように動いているのか」を解き明かす準備は整っています。
「How(どのように)」を解き明かす
ここまで来れば、アプリの詳細を学ぶための土台は十分にできています。未知の用語や予想外のやり取りに気を取られることもなく、学びたいテーマを一つ選んで、突き止めるまで掘り下げられるようになっているはずです。
進め方はいろいろあります。中でも私のお気に入りは次の3つです。
- UIを眺めて推測する: これまでの知識をもとに「この機能はどう実装されているだろう?」と想像してみます。デバッガで推測を検証したり、実際の仕組みを発見したりしましょう。
- テストケースを1つ選んで追いかける: コードを読み進めても、デバッガでステップ実行しても構いません。アプリ全体を貫くデータの流れを体感できます。
- ルートやコントローラアクションを1つ選ぶ: UIからそのアクションへ、どうやってたどり着くか推理できるでしょうか?
このタイミングで、改めてモデルやプレーンなRubyオブジェクトに立ち返るのも良いでしょう。今度はモデルの内部動作の詳細に踏み込んでも大丈夫です。
そして、アプリに対する好奇心を持ってください。自分の知識のギャップを見つけたら、デバッガとコードで一つずつ埋めていく。それが理解を深める一番の近道です。
なぜテストから始めないのか?
「コードベースを理解したければテストから読め! テストは実行可能なドキュメントだ!」という助言を耳にしたことがある人は多いはずです。
しかし、この方法は私にはうまくいきませんでした。テストケースは狭すぎて、細部に寄りすぎているのです。テストから学ぼうとすると、アプリ全体の大きな絵が見えないまま、断片的な細部だけが頭に入ってくる感覚がありました。
Railsアプリのような巨大なコードベース、あるいは多くのgemを理解するには、まず全体像が必要です。どんなコンポーネントで構成され、それぞれがなぜ存在するのかを知らなければなりません。
とはいえ、テストが確実に通る状態にはしておきましょう。通らないのであれば、それは壊れたシステムです。壊れたシステムから得た知見は信用できません。
What → Why → How の順で進める
新しいRailsアプリを理解するには、次の3つのフェーズを、必ずこの順番で踏みましょう。
- What(何): このアプリはどんな部品でできているのか?
- Why(なぜ): その部品はなぜ存在するのか? なぜそのように組み合わされているのか?
- How(どうやって): 各部品はどのように動いているのか?
この順序で進めれば、アプリ全体を俯瞰する視点と、細部を支える具体的な知識の両方が手に入ります。そうして初めて、その新しいアプリは本当にあなたのものになるのです。
P.S. 書籍『Practicing Rails』を近日中に発売予定です。25%の早期アクセス割引をご希望の方は、お早めのご注文をおすすめします!
-
rack-mini-profilerとフレームグラフでRailsアプリのボトルネックを可視化する方法
あなたのRailsアプリは遅くなっていませんか? 本来シンプルに表示されるはずのビューの読み込みに数秒かかるなら、原因を掘り下げて調査すべきサインです。 原因としては、データベースへの呼び出しが多すぎたり、処理の遅いメソッドがあったり、あるいは誰かがコードに仕込んだまま忘れられてしまった無駄なループだったりします。 アプリの遅さの原因を突き止めるためのツールは数多く存在します。以前このブログでもrbtraceについて紹介しましたし、New Relicのrpm gemもアプリの高速化に役立ってくれました。 しかし、私がパフォーマンス問題の調査に最も愛用しているツールは、それ以上のことができるので
-
Skype Liteとは?インド市場向けに開発された超軽量通信アプリの全貌
マイクロソフトは、ムンバイで開催された「Future Decoded」イベントにおいて、CEOのサティア・ナデラ氏が新アプリ「Skype Lite」を発表しました。このアプリはインド国内で設計され、インドのユーザーに限定して提供される、同社史上最も軽量なアプリケーションです。 低速回線でも快適に使える設計 人気のビデオ通話アプリとして、ビジネスパーソンや個人ユーザーから絶大な支持を得てきたSkype。インド市場に的確に対応するため、ローエンド(低価格帯)スマートフォン向けに最適化された新アプリが開発されました。 SkypeプロダクトマネジメントディレクターのEugene Ho氏は、次のように述