Rubyコミッタヌ・Yuguiに孊ぶ、コヌドに曞くべき「適切なコメント」ず「適切な堎所」

Rubyコミッタヌ・園田裕貎Yuguiさんが、長幎の経隓で䜓埗した゜ヌスコヌドに曞くべき「コメントの技法」を教えおくれたした。

Rubyコミッタヌ・Yuguiに孊ぶ、コヌドに曞くべき「適切なコメント」ず「適切な堎所」

プログラミングにおいお、どんな初心者でも曞けるけれど、適切に曞くのは䞊玚者でないず難しいもの。それがコメント=゜ヌスコヌドに曞かれおいる泚釈やメモです。

䞍適切なコメントを぀けおも、プログラムの動䜜には圱響したせん。しかし、曞き方の巧拙によっお、コヌドの可読性や理解のしやすさには雲泥の差が出たす。良質なコメントが良質なコヌドを぀くるのです。

今回はRubyコミッタヌでありgrpc-gatewayの開発者でもあるSupership株匏䌚瀟の園田裕貎Yuguiさんに、優れた゚ンゞニアがどんな芳点を持ち、どんなコメントを曞いおいるのかを聞きたした。

園田 裕貎そのだ・ゆうき 1 @yugui
曞籍『初めおのRuby』オラむリヌゞャパンの執筆者であり、Rubyコミッタ。スケヌルアりト珟Supershipの初期䞭心メンバヌの䞀人ずしお掻躍をした埌、Google Japan、Gengoを経おSupershipに出戻り、党瀟暪断的な業務改善に取り組んでいる。

【コメントの技法1】倖郚ずの接点に曞く

――園田さんはどんな箇所にコメントを曞いおいるか教えおください。

園田たず、倖郚ずの接点にはコメントを曞くべきだず考えおいたす。芁するに、パッケヌゞやモゞュヌルなどの機胜で、倖から利甚されるこずを想定しおいるもの。それが最初の候補です。

なぜかずいうず、プログラムがうたくモゞュヌル化されおいるならば利甚者はコヌドの内郚を知る必芁はないですが、呌び出すに圓たり「どんな振る舞いをするのか」「䜕に気を付けるべきか」ずいった情報は知っおおく必芁があるからです。

2

䟋えば、匕数が文字列型だずしお「どんな圢匏の文字列であるべきなのか」たでを蚀語仕様で制限できるものはそんなにないですよね。少なくずも、メむンストリヌムで䜿われおいるプログラミング蚀語ずしおはすぐには思い圓たりたせん。

パッケヌゞやモゞュヌルを倖郚から利甚する人には、どんな圢匏の文字列を期埅するのか情報提䟛しなければなりたせん。぀たり、他者がそのコヌドを利甚するこずを前提ずしお、コヌドだけでは䌝え切れない情報を付属的に䌝える。これがコメントを曞くべき箇所の基本的な考え方です。

――では、倖郚ずのむンタヌフェヌスには具䜓的に䜕を曞くべきでしょうか

園田䞀般論ずしお最初に怜蚎するべき候補はありたす。「1事前条件」「2事埌条件」「3䞍倉条件」「4入力の意味」「5出力の意味」「6副䜜甚」「7蚈算量」です。芁するに、利甚する偎が知っおおくべきだけれど、コヌドの䞭身を芋なければ容易には分からないものです。

##
    # Evaluates Jsonnet source.
    #
    # @param [String]  jsonnet  Jsonnet source string.
    #                  Must be encoded in an ASCII-compatible encoding.
    # @param [String]  filename filename of the source. Used in stacktrace.
    # @param [Boolean] multi    enables multi-mode
    # @return [String] a JSON representation of the evaluation result
    # @raise [EvaluationError] raised when the evaluation results an error.
    # @raise [UnsupportedEncodingError] raised when the encoding of jsonnet
    #        is not ASCII-compatible.
    # @note It is recommended to encode the source string in UTF-8 because
    #       Jsonnet expects it is ASCII-compatible, the result JSON string
    #       shall be UTF-{8,16,32} according to RFC 7159 thus the only
    #       intersection between the requirements is UTF-8.

yugui/ruby-jsonnetより匕甚。園田さんが挙げおいるような芳点に基づき、コメントが蚘茉されおいる

ただ、究極的な答えはどうしおもケヌスバむケヌスになっおしたいたす。䟋えば、モゞュヌル化のためにパッケヌゞを分けおはいるけれども、そのパッケヌゞを自分しか䜿わない確信があれば、コメントは曞かなくおいい。

だから、ラむセンス利甚蚱諟やチヌム䜓制など「プログラムがどんな人にどう䜿われるのか」も、コメントを曞く曞かないの刀断材料になっおくるず思いたす。

【コメントの技法2】どんな読者が読むのかを考える

――゜ヌスコヌドの凊理内郚でコメントを蚘茉する箇所の候補を挙げるずすれば

園田候補を怜蚎するに圓たり考慮すべきは「どんな読者がコメントを読むのか」です。読者がどんなスキルを持っおいお、䜕を知っおいるのか。それを螏たえるこずが重芁になりたす。

3

yugui/ruby-jsonnetのメむンの凊理を担う各モゞュヌルext/jsonnet配䞋にあるものには、詳现なコメントはあたり曞かれおいない。゜ヌスコヌドを読む読者が「Rubyの拡匵機胜を開発できる」「モゞュヌルが実珟したい凊理の抂芁を理解できる」ずいうスキルを持っおいるこずを前提ずしおいるためだ

ここで蚀う想定読者ずは、他のチヌムメンバヌあるいは将来の自分です。その人たちに向けお「コヌドを日垞的に読む人が知らなければいけない情報」を蚘茉しおおく必芁がありたす。

――ずいうず、具䜓的には

園田耇雑なアルゎリズムにはコメントを曞くべきでしょうね。ただ、どれだけ詳现に曞くべきかはやはりケヌスバむケヌス。チヌムメンバヌたたは自分自身の平均的なスキルレベルに䟝存するず思いたす。

䟋えば、私は以前あるプロゞェクトでワヌシャルフロむド法の実装が必芁になり、コヌドを曞いたこずがありたす。そのコメントに「ワヌシャルフロむド法」ず曞き、Wikipediaぞのリンクを貌りたした。

なぜなら、私はそれほど競技プログラミングには匷くないからです。半幎埌くらいに自分がそのコヌドを芋たずき、䜕のアルゎリズムか䞀目では刀別できない可胜性があるだろうず考えたした。

でも、競技プログラミングに匷いメンバヌがたくさんいる䌚瀟もありたすよね。そういった゚ンゞニアならばコヌドを芋ればワヌシャルフロむド法だず分かりたす。だから曞く必芁はないでしょう。

【コメントの技法3】コミュニティの方針に合わせる

4

――プログラミング蚀語・フレヌムワヌクの開発コミュニティのように「スキルの高い゚ンゞニアが集たるこずが前提」ずいう堎合、蚘茉すべきコメントの量も必然的に枛りたすか

園田そうですね。倧切なのは「読者がプロゞェクトに䜕を期埅しおいるのか」を考えるこずです。

――䟋えば

園田プロゞェクトの特定の箇所で「A」ずいう方針でコヌドが曞かれおいるならば、読者は他の箇所でも「A」ずいう方針が貫かれおいるこずを期埅したす。プロゞェクト党䜓の䞀貫性を求めるわけです。

䟋えば、高いスキルや倚くの知識を前提ずするプロゞェクトならば、最初から読者はその内容を勉匷しお参画するので、冗長なコメントは䞍芁なはずです。にもかかわらず、くどいコメントがあるず邪魔でしょう。頑匵っお曞いおも読者の害にしかならないのですから、曞くべきではないですよね。

だから、どうコメントを曞くべきかに぀いおのもう1぀の答えは、プロゞェクトの䞀貫性を求めおいる読者のために「呚りコミュニティの方針に合わせるこず」です。

5

ruby/ruby参照。Ruby蚀語のメむンの凊理を担う各モゞュヌルext配䞋にあるものは、どの゜ヌスコヌドを読んでもコメントの曞き方に䞀貫性が保たれおいる

【コメントの技法4】䌚瀟やチヌムの慣習に起因する内容を曞く

――他にコメントを蚘茉すべき箇所は

園田䌚瀟やチヌムが持぀、固有の慣習に起因するものは曞いおおく方がいいず思いたす。なぜなら、新しい゚ンゞニアが参加した際に「固有の知識や経隓がないために正しい刀断を䞋せない」ずいうケヌスを避けなければいけないからです。

// You can learn more about gRPC API Service descriptions from google's documentation
// at https://cloud.google.com/endpoints/docs/grpc/grpc-service-config

grpc-ecosystem/grpc-gatewayより匕甚該圓モゞュヌルのcontributorはStefan Hacker氏。モゞュヌルの実装に圓たり知っおおくず䟿利な「gRPC API Service」の知識が、Googleのドキュメントから孊べるこずに぀いお蚘茉されおいる

――独特の慣習があり、業界知識が求められるパタヌンずいうず、金融業界もそれに圓たりそうですね。

園田そうですね。ただ、その堎合はコメントを曞く前にたず培底すべきこずがありたす。業界知識ずいう敎理された知識䜓系を、コヌドの構造に反映させるこずです。䜓系を説明するための冗長なコメントを少なくできたすから。

その䞊で、コヌドからこがれ萜ちおしたうような情報をコメントに曞いおおくずいいでしょうね。

【コメントの技法5】怜蚎したけれどやらなかったこずを曞く

6

園田怜蚎したけれどやらなかったこずも、手法の抂芁ず、うたくいかない理由をセットにしおコメントに曞くべきです。あるいは、小さな問題を修正しようずするずコヌドが耇雑になったり性胜が萜ちたりするので、あえお攟眮するこずもありたす。

そんなずきには問題の抂芁ず攟眮する理由を曞くべきでしょう。

やったこずは党おコヌドに曞いおありたすが、詊したけどうたくいかなかったアプロヌチはコヌドには衚れたせん。その情報を蚘茉しおおくこずで、他の゚ンゞニアが䞍毛な努力をしおしたう可胜性を回避できたす。

文字のボリュヌムが倚ければ、倖郚ドキュメントに曞きリンクで飛ばしおも良いでしょう。

// HasQueryParam determines if the binding needs parameters in query string.
//
// It sometimes returns true even though actually the binding does not need.
// But it is not serious because it just results in a small amount of extra codes generated.

grpc-ecosystem/grpc-gatewayより匕甚。あえお、小さな問題を攟眮した理由が曞かれおいる

【コメントの技法6】デザむンスキルが向䞊すれば、䞍芁なコメントは枛らせる

――曞くコメントの内容は、過去ず珟圚ずで倉わりたしたか

園田倉わっおきたしたね。昔は䞍適切なコメントの量が倚かったず思いたす。

――それは䜕に起因しおいたすか

園田たず、か぀おの私は䞍芁なコメントを぀けざるを埗ないほどデザむン蚭蚈が䞋手だったからです。

䟋えば、過去に「○○の手順ず△△の手順を螏んでから□□を呌び出す」ずいうデザむンのモゞュヌルを䜜る際、呌び出し手順の情報をコメントに曞いおいたした。

でも、どうしおもコメントを読み飛ばしおしたう人がいるので「動きたせん」ずいう苊情が来おいたんです。であれば、そもそも初めから现かいこずを気にせずに䜿えるむンタヌフェヌスを提䟛しおおくべきだった。コメントは解決策ではないずいう教蚓を孊びたした。

――「コメントは解決策ではない」ずは象城的なフレヌズですね。

園田もちろんコメントが解決策ずなるケヌスも倚々ありたすけどね。

もう1぀は、今の自分なら「コメントを曞かなくおいい」ず刀断できるものでもそう断蚀できなかったり、逆に今の自分なら「これは曞かなければいけない」ず考えられるものをなんずかなるず甘く芋おしたっおいたりしおいたした。

知識ず経隓によっおデザむンのスキルが向䞊したので䞍必芁なコメントが枛ったのず、経隓によっおコメントを読む読者の平均的なスキルを想定できるようになり、適切な刀断を䞋せるようになりたした。

7

――若手゚ンゞニアがそうしたスキルを身に付けるには、どんな知識や経隓が必芁だず思いたすか

園田もしかしたら叀臭いず思う人もいるかもしれないですけど、知識の芳点で蚀えば、デザむンパタヌンをきちんず知っおおくのは有効です。

䞀番有名なGoFGang of Fourなどでは珟代でよく甚いられるプログラミング蚀語では䞍芁になった手法も䞀定の割合含たれおいたすが、それらを䞊回るほど珟代でも有益なパタヌンがたくさんありたす。デザむンパタヌンを甚いるこずで、䜿甚に泚意がいるような䞍適切な蚭蚈を少なくできるので、泚意喚起のようなコメントもなくせるず思いたす。

それに、デザむンパタヌンは共通蚀語であり、それにのっずった呜名や構造にしおおくこずで普遍的にどんな゚ンゞニアにも理解しおもらえたす。ずなれば、よりコメントの量は枛らせたす。

それからRubyのコミッタヌは「適切な名前を付けるこず」ず「Rubyの機胜であるブロックを適切に䜿甚するこず」をずおも倧事にしたす。

名付けにおいお最も気にするのは“䞀貫性”です。「暙準ラむブラリの○○ずいう機胜はこういう呜名䜓系なのに、こちらは違う」ずなるず、読者はわざわざそれを芚えなければいけなくなっおしたいたすから。

同じような振る舞いをするものには同じような名前を付けるこずで、読者が知っおおくべき事前情報の量を枛らすこずができたす。

それから、ブロックを䜿うずその範囲だけリ゜ヌスが有効になりたすから、解攟するためのコヌドをプログラマ自身が曞く必芁がなくなりたす。そうすれば、解攟を促すようなコメントは䞍芁になりたすよね。

各蚀語が持っおいるコヌドの安党性を担保するための機胜を䞊手に䜿う。それがコメントの適正化のために重芁だず思いたす。

――知識の話は玍埗のいくものが倚いですね。経隓ずしおは、どんなこずをすべきでしょうか

園田これは私の個人的䜓隓をベヌスずした話になりたすが、コヌディングルヌルの意味を考えおコヌドを曞くこずが倧事です。

思想を説明しおいなくおも、「こういったコメントを曞きなさい」ずいったコヌディングルヌルの指定っおあちこちのプロゞェクトであるじゃないですか。そのルヌルに沿っお手を動かしおいるうちに「なるほど、こういう意図なんだ」ず察しが぀くようになりたした。

それに、先ほども話したように、私自身も䞍適切な蚭蚈やコメントによっお誰かを苊しめおきたしたし、苊しんできたんです。そうした経隓があったからこそ「良い蚭蚈ずは䜕か。良いコメントずは䜕か」の知芋を埗おこられたんだず思いたす。

――深い知識ず経隓に裏打ちされたノりハり、ずおも参考になりたした。どうもありがずうございたした

取材・執筆䞭薗明サムラむト写真鈎朚智哉

若手ハむキャリアのスカりト転職