ひらメソッドメモ

ひらさんのひらメソッドを使ってみて、自分なりに思ったことや
改良してみたことを書いてみます。

初めこの記事のタイトルを「ひらメソッド弐式」にしようかと思ったのですが、
さすがに内容的に大したものでもないので上記の大人しいタイトルにとどめておきます。

内容は全て個人的メモです。

文中で"You"で翻訳できる箇所は全て「未来の自分」に向けて書かれたものです。
読者の皆様ではありません。

大前提:君はスーパーハッカーじゃない

君は Paul Graham でもなければ RMS でもなく、〜〜*1でもない。

ただの凡人、それもコンピュータもろくに知らないようなズブの素人である。

よって彼らと同じやり方でコードを読むことはできない。

いきなりコードから読まない

  • ドキュメントがあるならまずそれを読むこと。特にアーキテクチャや設計に関するドキュメントには目を通す。
  • 動作させることができるコードならとりあえず動かしていじってみる。
  • ていうか勉強目的でコード読むならそのソフトの操作に習熟してる方が断然いい。

作業道具の用意

以下のものを用意する。

  • リーディング対象のソースコード(当たり前)
  • GNU GLOBAL
    • コード読むときは便利。行番号つけてるとコピペは若干面倒。テキストエディタとの併用がいい。
  • pukiwiki
    • ひらメソッドのキモ。これがないと話にならない。
    • pukiwiki plus! の方がいいかもしれないが、別になくてもいい。
  • パワポか Impress
    • 図示用。なくてもいいけど、あった方がいい。
  • テキストエディタ
    • 主に読書記録用。ソースのコピペ用に使ったりしてもいい。

準備

  • 対象プログラムのソースを、解凍したディレクトリの直下から htags で html 化しておく。
    • オプションとかは man に書いてある。
  • Pukiwiki 環境を整える。
  • アフィリエイトで収入アップ 初心者応援ブログ » – アフィリエイトで収入アップ 初心者応援ブログから、ソースファイル、構造体・列挙型、関数・マクロの3ファイルをいただいてくる。
  • いただいたファイルを Pukiwiki 環境に登録する。
    • ファイル名は頭に大文字アルファベットをつけていると、テンプレとして使う際に便利。私は「CodeReading/ソースファイルの雛形」などとしている。
  • ソースファイルには「**実装」というパートを追加する。

リーディング開始

  • 基本はひらメソッドの通りに、ひたすらボトムアップ
  • 新しい関数作成の際に、ソース上にその関数の概要がコメントとして書いてあったら、意味がわからなくてもいいのでとりあえず直訳して概要に記載しておく。
  • ボトムまで来て、その関数(マクロ)を完全に把握したら、概要に処理を追記する。その関数が何もわかってなかった頃のコメントと比べると格段に意味の通る文章が書けるはず。
    • その際に引数や返り値がどのようになるかも簡潔に書いておくと便利。
    • 例えば VSTRING *vstring_aloc(ssize_t len)*2 のコメントだったら、「len バイトのバッファを持つ VSTRING 構造体のメモリを割り当てて、そのポインタを返す」など。
    • この概要は、呼び出し元のこの関数の箇所にも転載する。
  • 構造体を読む際、メンバは必ず表にする。その際「型、メンバ名、説明、値、備考」の列を作成する。値と備考は空欄にしておく。
    • 他の呼び出し元で大幅な変更(例えば初期化処理など)があった場合は構造体の表を今の関数のところにコピーしてきて、変更された値を表に記載する。
  • 定数等はソースファイルの実装の部分に丸ごとコピペしておく。
    • コピペする際、全ての行頭に半角スペースを一ついれておくとよい。
  • グローバル変数はこれだけで1ページ作る。
    • あまり重要でないものは作らなくてもいい(ソースファイルにコピペ扱いでもいい)。ケースバイケース。
  • 仮想メソッドの呼び出しは、「関数f()から呼ばれた場合は関数g()を呼び出す」といった形で記述していく。
  • コメントは全て読むこと。できれば翻訳する方がいい。
  • 読書記録をつけておく。
    • どこまで読んだか、だけでなく、「どの場所の」という記述を書いておくと全体把握が忘れにくくなっていい。
    • 「○月×日 関数f() 内の g() の動きを調査している。」

読むのに詰まったとき

  • 図示する。パワポや Impress を駆使して、普通にプレゼンや勉強会で使える程度に整理されたスライドを作ってみる。
  • その関数周りを取り出して実際に動かしてみる。上下の関数はドライバやスタブを作成して対応する。

*1:最も気に入っているハッカーの名前を入れる

*2:postfix-2.3.3/src/util/vstring.c:340