WebKit ソースコードのコメント議論(1)

WebKit 開発者のメーリングリスト webkit-dev を見ていたら、興味深い話題で盛り上がっていた。WebKit のソースコードや ChangeLog のコメントに関する議論だ。

WebKit に限らず、ハッカーというのはソースコードにコメントを書きたがらない。
コメントが古くなってしまい、実情と合わなくなってしまうから、というのが理由としてはよく聞かれる。すぐ古くなってしまうコメントを書くより、元々コメントを書かなくて済むような綺麗なコードを書けよ、とハッカー達はよく言う。

個人的には、コードでは処理の内容は記述できるけれど、意図を記述できないので、意図を補足するコメントぐらいは必要なんじゃないか、と思っているけれども、それすらダメと言う人も時々見かける。

ともかく、今回の議論は自分にとっては興味深かった。
そこでその内容を紹介してみようと思う。

議論はいくつかのトピックに分かれていて、それぞれ別のスレッドが立っている。

事の発端は、皆さん change log に関数レベルのコメントを書きましょう、というもの。
http://www.mail-archive.com/webkit-dev@lists.webkit.org/msg19771.html
http://www.mail-archive.com/webkit-dev@lists.webkit.org/msg19775.html

WebKit では修正をコミットするときに ChangeLog というファイルに追記する決まりになっていて、その内容についての話。
WebKit の場合、この ChangeLog の内容はレビューをしてもらう時にも参照され、レビュアーに修正の意図や設計を伝える役目も担っている。

  • 最近 change log に修正の概要しか書かない人が多いけど、みんな関数単位のコメントを書いてよ。レビューの時も、後でコードを調べる時にも役に立つからさ。

だがここから話は別の方向に飛んでしまう。ソースコードにクラス単位のコメントを書くべきかどうか。
http://www.mail-archive.com/webkit-dev@lists.webkit.org/msg19778.html

  • WebKit のような巨大で複雑なコードベースで、「コメントを書かないで済むように綺麗に書けばいい」とか幻想だろ。クラス単位のコメントがないせいで、どのクラスが何やってるのかわからないし、クラス間の関連もわからない。
  • 以前の議論では、クラス単位コメントには大半の人が賛成していたよ。コード中のコメントも、意図を説明する内容であればOK。
    • 一連の手順を説明したコメントは、適切な名前の関数で置き換えられるよね
    • 事前条件、事後条件についてのコメントは ASSERT にしたほうがいいよね
    • クラスの ownership や lifetime relationship についてドキュメント化するのはいいね。図を描いてそれへの参照をコメントに書いておければいいけどねー。
  • クラス名はなるべく自己説明的なものにすべきで、コメントは最後の手段だよ。
  • 自己説明的でかつ簡潔な名前を付けるのは難しいときがあるから、コメントが必要なときもあるでしょう。例えば、JSGlobalData がなぜ必要かを説明する良い名前は難しいから、コメントあったほうがいい。AffineTransform はいらない。
  • 「コメントは書くべきでない」という文化があることで、それがプレッシャーになって、クラス名について一生懸命考える。それによって、良くない設計に気付いて見直したりすることもある。
  • インセンティブ重要。コメントは書くべきでないというプレッシャーがないと、気が緩んだり、時間がないとかの理由で安易な名前にしがち。
  • 本当にインセンティブ重要だよね。コメントが間違っていてもコンパイラはチェックしないから、誰も直そうというモチベーションにならない。だからコメントは書かないほうがよくて、別の手段を考えるべき。
  • コードのコメントを最新に保つのは確かに大変だ。change log にコメントを書くやり方はよいと思う。change log は特定のリビジョンについての記述だから。
  • 少なくとも JavaScriptCore については、打つ手はない。他も同様じゃないだろうか。JavaScriptCore の中枢部分はよく変更されるので、
    • コメントを書けば、古くなる
    • change log を書けば、(大量の変更履歴に)途方に暮れる

    結局、コードの難しい部分については、読むしかないんだと思うよ。

まとめるのに時間がかかってしまったので、他のトピックは明日取り上げよう。

かなり意訳してるけど、大幅に間違っていたら指摘ください > 読者の方。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です