悪態のプログラマ -24ページ目

悪態のプログラマ

とある職業プログラマの悪態を綴る。
入門書が書かないプログラミングのための知識、会社の研修が教えないシステム開発業界の裏話は、新人プログラマや、これからプログラマを目指す人たちへのメッセージでもある。

ソースファイルの先頭や、関数やクラスの「上」に、どういったコメントを書くか、ということは、組織や開発プロジェクトによってルール化されることも多い。

しかし、関数内部の処理の途中に書くようなコメントは、プログラマまかせになりがちだ。かといって、その書き方について、熱心な教育が行われているわけでもない。プログラマは、自らコメントの書き方を学ぶ必要がある。

コメント論 」に書いたように、私が書いて欲しいと思うのは「見出しとしてのコメント」と「注釈としてのコメント」である。今回は、前者について、もう少し詳しく書いてみようと思う。

コードにも段落がある


通常、ソースコードには、いくつもの空行(改行だけの行)がある。プログラマは、コードの中に「区切り」のようなものが欲しくなって、そこに空行を入れるのだろう。

コードを区切りたいと思うのは、コード内の処理がいくつかの意味的な「まとまり」に分かれるからだ。

ある程度大きな「まとまり」は、関数などに分けるべきである。しかし、小さな「まとまり」は関数の中に残る。そういう「まとまり」と「まとまり」の間に、人は空行を入れるのだ(※1)。

コードのまとまりは、普通の文章で言えば「段落」のようなものである。場合によっては、複数の段落をまとめた「節」のようなものも出来ることがある。更に、節をまとめて、「章」ができることもあるだろう。

そうした階層的なまとまりを明確に区切って見せるために、例えばこんなコメントを使うこともある。

  // ----------------------------------------

「線」を使うことで、空行よりも大きな単位での「区切り」を表現しようというわけだ。


段落に名前をつける


さて、コードに段落のような「まとまり」があるのであれば、そのまとまりに対して、名前をつけることが出来る。それが「見出しとしてのコメント」である。

「見出し」というからには、その処理の「まとまり」が、何をするものなのか簡潔に表さなければならない。長い文章ではなく、「ナントカ処理」とか、「○○を××する」というように、短く書くのがよい。

もちろん、ただ短かければよいというものでもない。一般的な書き方というものを規定することは難しいのだが、見出しというものが何のためにあるのか、ということを考えれば、自ずと分かってくるのではないかと思う。

見出しの効能


ソースを読む立場として、「見出しとしてのコメント」をなぜ書いて欲しいかといえば、それがない場合よりも、コードの全体像を把握しやすいからである。全体像を把握しやすいということは、読者が読みたい場所にたどり着くまでの時間が短くて済むということだ。

新聞を読むとき、見出しをざっと眺めて、興味のある記事が見つかったら本文を読む、という方法をとると思う。もし、新聞に見出しがなく、本文がびっしり書いてあったら、それがどんなに美しい文章であったとしても、「読みにくい」といわざるを得ないだろう。

ソースコードにおける「見出しとしてのコメント」にも、新聞の見出しと同じ効能がある。だからこそ、私は、どんなに美しいコードにも、「見出しとしてのコメント」を付加するよう求めるのだ。

プログラマには、初めて読むようなソースを緊急にデバッグ(不具合修正)しなければならないようなこともある。こんなとき、見出しとなるコメントがあるのとないのとでは、バグ(不具合の原因となる場所)にたどり着くまでの早さが圧倒的に違う。

あるいは、ソースレビュー(他の人の書いたソースコードのチェック)をしていて、仕様面で気になるような所だけを確認したいような場合もそうだ。読む側としては、見出しだけを拾い読みしながら、ソースをどんどん「スクロール」して、関係ないところは読み飛ばしたいのである。

「時間」のことを言うなら、コメントを書く時間がもったいないという人がいるかもしれない。しかし、1人のプログラマが書いたソースコードも、将来的には、何人もの人が、色々なシチュエーションで、何度も読むことになる。コメントを書くために要する僅かな時間は、読者がコードを読解するための時間を短縮して余りあるだろう。

どう書くか


要するに、「見出しとしてのコメント」は、読者がコードの全体像を把握するのを助けるように書け、ということだ。

そのためには、とにかく書き過ぎてはいけない。まず、「まとまり」に対する見出しなのだから、コードの毎行に書く必要はない。また、内容はあくまでも「見出し」、せいぜい「要約」だ。コードに書いてある処理をそのまま文章にしたような、細かいコメントも必要ない。

コメントの量が多すぎたり、内容が細かすぎたりすると視認性が悪くなり、その効果が薄れるからである。

上手い「見出し」を作るには、ある程度のセンスが必要だ。短く書くためには、苦労して言葉を選ばなけばならないこともあるだろう。それは、一般の文書で見出しを書くのと同じことである(※2)。文書作成が上手い人は、コメントが上手いというのは、そういうわけである。


応援のクリックお願いします →



※1
空行に限らず、インデント(字下げ)やブロック(C言語等では { ... } )も、「まとまり」を作る区切りとしての意味を持つ。コメントを書く際に想定する「まとまり」は、あくまでも処理の「意味的なまとまり」であるべきだが、このような「コード上のまとまり」とも大いに関係する。例えば、条件分岐(if 文)や、ループ(for, while)の前にコメントを書けと言われることがあるのは、そういうわけだろう。

※2
書かずに伝える 」も参照。もっとも、ソースコードを書く場合は、設計書の見出しを借用することもできるので、比較的楽かもしれない。もちろん、設計書の見出しが適切である前提だが。



■関連記事
もっとコメント論 ~その1~ コメントとは何か
もっとコメント論 ~その3~ 注釈としてのコメント
もっとコメント論 ~その4~ システムの開発や保守のために
もっとコメント論 ~その5~ コードが求めるコメント



「伝わる!」説明術 ちくま新書(551)
梅津 信幸
筑摩書房 (2005/08/08)
売り上げランキング: 4,674
おすすめ度の平均: 4
3 総論はすばらしいが・・・
3 「わかる」とはどういうことか
5 解決v(^o^)


なぜTIMEが読めないのか―TIME見出し速読術
松本 道弘
小学館 (2002/10)
売り上げランキング: 189,024
おすすめ度の平均: 2.8
2 見出しだけ速く読んでも...
2 TIMEを軽く感じられる「かもしれない」本
4 見出しが一番難しい

メディアとしてのソースコード


誰のためのコード? 」にも書いたように、ソースコードはその読者のために書くものだ。したがって、コンピュータへの命令(プログラム=狭義の「コード」)を書くだけではなく、読者が求める情報を盛り込んだり、読みやすくするための工夫をすべきである。

「コメント」は、そのための手段のひとつである。「インデント 」や「改行」もそうだ。例えば、「そこに空行(改行だけの行)があるかないか」という違いだけで、そのソースコードが「読者に伝える力」が違ってくる。

ソースコードは、読者に何かを伝えるという意味において、「メディア」である。つまり、ソースコードは文書(ドキュメント)なのである。そして、一般の文書と同じように、本文の文章だけでなく、見出しや注釈(コメント)、レイアウト(インデントや改行)といった構成要素の全てが調和しなければ、十分な「伝達力」を発揮することは出来ない。

つまり、プログラマの仕事は、単にプログラムを作るというだけだけでなく、ソースコードという文書を作ることによって、プログラムの仕様や構造等を「伝える」ことなのである。

実際、普通の文書(ビジネス文書)を書くのが上手い人は、コメントを書くのも上手い。そして、悲しいかな、普通の文書がまともに書けないプログラマは多い(※)。


書くべきか、書かざるべきか


コメントというと、「書くほうがよいか、書かないほうがよいか」という議論になりがちである。「もっとコメントを書け」と言われることもあれば、「余計なコメントを書くな」と言われることもある。結局、どうしたらいいのかわからなくなってしまったプログラマもいるのではないだろうか。

特に、書かないほうがよいという理由については、ある側面から見ると説得力があるため、極端な無用論に走ってしまう場合がある。

例えば、余計なコメントがあるとソースが読みにくくなる、という主張だ。しかし、コメントが下手な人が多いからといって、コメントを廃止べきというのは暴論だろう。自動車事故が多いからといって、自動車を無くせというのと同じである。

コメント無用論について、もっと説得力がある主張は、「コメントを書かないと読めないようなコードは、そもそも書き方がよくない」というものである。読みやすいプログラミングを心がけている人ほど、共鳴しやすい意見だろう。しかし、コードを読みやすく書くべきだというのは、コメントを書くべきかどうかに関わらず、当り前のことである。確かに、下手糞なコードを誤魔化すためにコメントを悪用するようなことは言語道断だ。しかし、彼らがコメントを書くのを止めれば、コードが上手く書けるようになるかといえば、全くそんなことはない。



世の中には、下手なコードや下手なコメントが蔓延しており、コメントの誤用、悪用ばかりが目につく。逆に、上手いコメントは目立たないものだ。邪魔にならないからこそ「適切なコメント」なのだから。このことが、コメントの存在価値を見誤らせてしまっているのではないだろうか。

本当は、適切なコードがそれだけで存在しているよりも、適切なコードに適切なコメントがついている方が、読みやすいものだ。また、コード(プログラミング言語)だけでは表現しきれない情報を、コメント(自然言語)で補足するということも、「文書」としての価値を高める上で必要なことである。

結局のところ、「コメントを書くべきか、書かざるべきか」といえば、「下手なコメントは書くな。上手なコメントを書け」ということである。

コメントとは何か


繰り返しになるが、コメントとは、コードを読みやすくし、コードだけでは表現できない情報を付加するための手段である。

しかし、使い方を間違えると、むしろ読みにくくなったり、冗長になったりしてしまう。言わば諸刃の剣だ。プログラムの動作に関係ないなどと侮ることなく、心して記すべし、ということだろう。


応援のクリックお願いします →



※文書以前に、文章が書けない人も多い。「てにをは」がおかしいとか、句読点が打てないとか。「修飾」が多すぎて、意味が読み取れないことも。新人研修で、いちいちそんなレベルのことを指導している有様。大学まで出ていながら、まともに日本語が書けないとは。日本の教育はいったいどうなっているのか!?



■関連記事
もっとコメント論 ~その2~ 見出しとしてのコメント
もっとコメント論 ~その3~ 注釈としてのコメント
もっとコメント論 ~その4~ システムの開発や保守のために
もっとコメント論 ~その5~ コードが求めるコメント



「分かりやすい表現」の技術―意図を正しく伝えるための16のルール
藤沢 晃治
講談社 (1999/03)
売り上げランキング: 4,922
おすすめ度の平均: 4.09
5 自分の表現を考え直す「きっかけ」としても
5 チェックポイント付きで実用的
4 読みやすい


ソースコードの反逆―Linux開発の軌跡とオープンソース革命
グリン ムーディ Glyn Moody 小山 裕司
アスキー (2002/06)
売り上げランキング: 99,535
おすすめ度の平均: 3.38
4 来しかた、行くすえを考えさせる本
4 オープンソースという概念への前提
1 訳が最悪


システム開発者にとって最も怖いのは、「気がつかないこと」ではないだろうか。例えば、設計のときの考慮不足、テストの観点漏れなどである。

どんなに注意して仕事をしているつもりでも、人間のやることに完璧ということはない。開発中に見つからなかった不具合(潜在バグ)が、リリース後に顕在化して、大問題になるようなこともよくある。

システムが大きくなり、複雑になるほど、そういった危険性は高くなる。仕様の全てを人間が把握しきれなくなり、「盲点」、「死角」が増えてくるからだ。

特に、何度も改訂を繰り返したようなシステムは、不自然な建て増し建築のように、見通しが悪くなることが多い。どこかに手を加えれば、とんでもないところに不具合が出てくる、といった状況になりやすい。


人間が「気がつかないことに気がつくこと」は非常に難しい(というか、言葉の上では矛盾しているのだが・・・)。「バグのないプログラムはない」と言われる所以だろう。システムの品質の確保は、最終的にはこの問題をどうするか、ということになるのではないだろうか。

ひとつには、開発者の視点とは違う角度でチェックを行うことである。例えば、設計書などを第三者にレビューしてもらったり、モンキーテスト(厳密に計画しないテスト。出鱈目な操作をするなど)を行ったり、といったことだ。いわゆる「β版」を配って、多くのユーザーに試用してもらうのも、同様の意味があるだろう。

もっと本質的な解決方法は、なるべくシンプルな設計をすることで、死角が生じないようにすることだ。そのためには、顧客の業務・運用をシステムに合わせて変更してもらった方がよい場合もあるかもしれない。また、システムが改訂によって複雑化しそうなら、全面的に作り直すことも提案すべきだろう。

そのあたりは、開発を依頼する側にも、理解してもらいたいところでもある。実際、目先の費用をケチったために、会社の信頼に関わるような致命的な不具合が生まれたり、以後の改訂費用が増大したりするケースも少なくないのだから。

システム開発には、面倒な作業がつきものだ。大量のテストデータ作成したり、同じようなテストを何百回も行ったり。

中には、単純作業が得意な人というのがいて、黙々とやっている。

しかし、その作業の内容をよく見てみると、「マクロでやればもっと簡単に出来るのに」とか、「スクリプトを書けば早いし、ミスもなくなるのに」となどと思うこともある。


手間のかかる仕事でも面倒と思わずにやる、という精神は必要である。面倒だからといって、テストしないわけにはいかないのだから。

しかし、手間の掛かる仕事を効率よく行う方法はないかどうか、考えたり、調べたりすることも大切である。

面倒な仕事を人間の代わりにプログラムにやらせる。これが「IT化」の基本ではないだろうか。プログラムを作る人が、それを実践しなくてどうするのだろう。

職業プログラマの中には、研修などで、「ソースコードにはきちんとコメントを書くように」と指導された人も多いのではないだろうか。あるいは、コメントが全く付いていない他人のソースコードを目にして、悪態をついた経験がある人も少なくないだろう。

ここでいう「コメント」とは、プログラムのソースファイルの中に、日本語(や英語など)で書く説明のことである。コメントはプログラムの動作には関係ない。しかし、全く書かれていないソースコードは、読みにくいものだ。

というと、コメントはとにかく沢山書けばよいように思われるかもしれない。しかし、そういうものでもない。書くことによる弊害もあるからだ。

例えば、コメントに書いていることが「嘘」になる危険性だ。ソースを編集しているうちに、コードとコメントの内容が不一致になってしまうことはよくある。これは言うまでもなく、誤読の原因となる。

結局のところ、コメントは多過ぎても少なすぎてもよくない。そのあたりのバランス感覚を身に着けることが大事だろう。


関数の引数や戻り値などを説明するためのコメントの書き方は、プロジェクトなどでルール化されることも多い(※)。

しかし、関数の「本文」の処理の中にどのようなコメントをどの程度書くか、ということは、プログラマまかせになりがちである。このため、人によって、必要なコメントが無かったり、読みにくかったりすることになる。

処理内のコメントの付け方がルール化しにくいのは確かである。しかし、上手く書くコツのようなものはあるだろう。

ひとつには、処理のまとまりに対する「見出し」となるように書くことである。ちょうど、新聞や雑誌の見出しがそうであるように、それだけを読めば、そこにどんな処理が書いてあるのか、瞬時に把握できるようにするのだ。

もうひとつは文字通りの「注釈」である。処理の仕様が複雑な場合や、プログラムの書き方が止むを得ず不自然になってしまった場合など、そのままではコードが誤読される恐れがある場合には、コメントを書くようにしたい。

こうした、「見出し」や「注釈」を書くということは、プログラミングだけでなく、一般的な文書作成にも必要なことだろう。特に、プログラムの設計書を書くような場合には、このような能力は非常に重要となってくるのではないだろうか。

他にも、細かく言えば、変数の説明だとか、条件式の説明だとか、コメントを書くべきポイントはいくらかある。もし、コメントの書き方について意識したことのないというプログラマがいたら、これを期に、どのようなコメントが読みやすいのか、一度考えて欲しいのである。




※javadoc のようなツールでコメントを機械的に処理する場合には、ルールは厳密である。



■関連記事
もっとコメント論 ~その1~ コメントとは何か
もっとコメント論 ~その2~ 見出しとしてのコメント
もっとコメント論 ~その3~ 注釈としてのコメント
もっとコメント論 ~その4~ システムの開発や保守のために
もっとコメント論 ~その5~ コードが求めるコメント






Write Great Code〈Vol.1〉ハードウェアを知り、ソフトウェアを書く
Randall Hyde 鵜飼 文敏 まつもと ゆきひろ 後藤 正徳 トップスタジオ
毎日コミュニケーションズ (2005/12)