🔧

まつもとゆきひろさんに学ぶ、ソースコードの読み方

2022/03/14に公開

はじめに

エンジニアとして知識・技術を伸ばしていく手法のひとつとして「他人のソースコードを読む」はとても有効だと思います。個人的には先日Flutterでアプリケーションを構築する際にアーキテクチャ選定に悩み(具体的な記事があまり多くなくて困りました)、色んなGitリポジトリを眺めたところ、いろいろな発見があって感動しました。正直いままでは業務で他の人が書いたコードを読むくらいであまり積極的に読むことがなかったのですが、世界中のエンジニアの知識と技術の結晶(ソースコード)が読み放題な世の中って素晴らしいなと思うようになりました。

そんなコードリーディングですが、複雑なコードになると何がなんだか分からなくなって途中で諦めてしまうことがあり、いまだに自分のなかでテクニックとして確立できていないなと感じています(もちろんコードを読むスキルとは別に言語に対する理解が不足している場合も多々ある)。そんななかで、Rubyの作者であるまつもとゆきひろさんによる「コードリーディングの手ほどき」的な記事があったので、個人的に学びになった点を簡単にまとめてみます。

引用元はITmediaエンタープライズ まつもとゆきひろのハッカーズライフです。

コードリーディングのコツ

まず1つは、「全体を読もうとしない」ことです。ソースコードには「物語」はないので、全体を通して読む必要はありません。面白そうなところをつまみ食いして、先人の知恵を学べばそれで十分です。

もう1つは、「目的を持って読む」ことです。何かを学ぼうと思ってソースコードを読めば、効果的に読解して知識を得ることができます。例えば*、「再帰下降構文解析の実装法を学ぶ」とか、「この処理系がどのようにガーベジコレクションを実装しているか」とか、「なぜこの処理系はこんなに高速に動作するのか」とかです。

個人的には上記2点は実は同じことを言っていると思っていて、要は「そのコードを読むことで何が知りたいのかを明確にして、そこに関連する部分を読むのがよい」ということだと理解しました。目的が曖昧だと結果として読むべきコードが分からず、全体を通し読みするという無謀なチャレンジになってしまいます。

気をつけたいのが、「このメソッドの実装読んでみようかな」というモチベーションそれ自体は素晴らしいのですが、そのモチベーションがコードリーディングにおいてはうまく回らない可能性がある(目的が不明確)、ということです。個人的にはこういったモチベーションで手を動かし始めてしまうことがあるので、メモをとるなどして「何を知りたいのか」を言語化してから着手しようと思いました。

ソースコードを読み解くときは、まずプログラム全体の枠組みを理解することが有効でしょう。プログラム全体を読む必要はないのですが、自分の欲しい情報がどこにあるのかを見つけ出すには、プログラム全体の構造のイメージをつかんでおくと便利なのです。ここで最も役に立つのはソースファイル名です。

それで見つからない場合には、プログラムのスタートであるmain関数(Cの場合)からたどっていくことになります。ここでもプログラム全体を読む必要はないので、個別の関数の働きは関数名から推測して、必要そうなところを探すのに集中します。

この点は個人的にはできてるかなと思いました。また逆に言えば読む側にとっては命名が大きな手がかりになる、とも言えます。コードを書く際にはファイルやメソッドの命名で悩むことが多いですが、できる限り分かりやすい命名をするという点はこれからも意識していきたいなと思いました。

また命名に悩むのは英語のボキャブラリーが不足しているのも一因だと思うので、海外のエンジニアのソースコードを読むときにはどんな処理でどんな命名をしているのか意識してみると学びが得られそうだなと感じました。

まだまだスラスラとコードを読み解くにはほど遠いですが、積極的にコードを読んでエンジニアとして力をつけていきたいです。

Discussion