September 25, 2011

プログラミング作法

プログラミング作法
プログラミング作法

キーワード:
 Brian Kernighan / Rob Pike、C言語、プログラミング、型、レッスン
プログラムに対する効果的な取り組み方を提示し、質の高いコードを作成/維持するという目標を支援する目的で書かれた本。以下のような目次となっている。
  1. 第1章 スタイル
  2. 第2章 アルゴリズムとデータ構造
  3. 第3章 設計と実装
  4. 第4章 インターフェイス
  5. 第5章 デバッグ
  6. 第6章 テスト
  7. 第7章 性能
  8. 第8章 移植性
  9. 第9章 記法
(目次から抜粋)
著者の一人は、C言語の生みの親のBrian Kernighanである。プログラミング界の神みたいな人で、この人のあらゆる開発経験が元になっているのが本書である。もう一人のRob Pikeは、ベル研究所でUNIXの開発に携わっており、現在Googleに勤務しているようだ。プログラミング時に間違ったアルゴリズムでコーディングしてしまってやたらと時間を無駄にしてしまったとか、使用するデータ構造が死ぬほど複雑になったとか、5分あれば見つかるはずのバグを一日がかりで探し回ってしまったという経験は、プログラミングを始めてから仕事で使うまで誰もが経験する道かもしれない。本書ではそうならないためにかつプログラマの生産を高めるために、簡潔性、明瞭性、一般の基本原則にそって、その具体的な方法がC言語、C++、Javaなどのサンプルコードとともに示されている。

ちょっと長いけど「はじめに」からの部分を引用しておいたほうが、本書の意図がよりよくわかるので、そこを示しておこう。
 本書のアプローチはこうした基本的で互いに関連し合う原則に基づいており、これらの原則はあらゆるレベルのコンピュータ使用形態に通用する。まず簡潔性(simplicity)。これはプログラムを短く扱いやすい状態にしておくということだ。明瞭性(clarity)はプログラムを人間にもマシンにもわかりやすく書くことを表す。一般性(generality)は幅広い状況できちんと機能し、新たな状況にもうまく対応できるという意味で、自動化(automation)は自分の代わりにマシンに仕事をさせて、つまらない佐合から自分を解放することだ。本書では、アルゴリズムやデータ構造から設計、デバッグ、テスト、性能改善の話題にいたるまで、さまざまな言語を使ってコンピュータプログラミングについて解説する。これによって、個別の言語やオペレーティングシステムやプログラミングパラダイムにとらわれない、ソフトウェア工学の普遍概念を明らかにできるはずだ。

 本書は我々の経験から生まれたものだ。我々は長年にわたって数多くのソフトウェアの開発とメンテナンスに従事し、プログラミング講座で講師を務め、さまざまなタイプのプログラマと共同作業をしてきた。本書を通して、現実の問題から学んだ教訓や我々の経験から得た考えを伝えたいと思うし、技術レベルの如何を問わず、すべてプログラマが自らの能力と生産性を向上させるのに役立つ手段を提示できればと思う。
(pp.11-12)
そして、読者に唯一必要な条件として、できればCかC++かJavaでの多少のプログラミング経験とある。まぁ、一応C言語を作った人が書いているからね。サンプルプログラムはC言語がメインで、たまに正規表現の例としてPerl、AWKまで出てくる。C言語ではポインタ表記が多いので、できればポインタのポインタまで理解しているとわかりやすいかもしれない。

どの言語もやったことのない人は、本書を読む前に一度バイブル本としての『プログラミング言語C 第2版 ANSI規格準拠』を読んでおくとよいかもしれない。まったくプログラミングやったことない人は他の言語でもいいからそれなりに習得してからがよいかもしれない。

さて、肝心の内容についてであるが、これはとても勉強になった。特に一番すぐに使えるのは、第1章の「スタイル」でしょう。変数の名前の付け方、インデントはちゃんとしましょうといった基礎的なことが示されている。プログラミングを始めたころは、どうしても自分独自の癖が出てきたりして、その癖があまりよろしくない場合は、チームで開発するときにボトルネックになる。つまり、コードの保守性が低かったり、意味不明な記述になっていたり、移植性が悪かったり、典型的なのはバグだらけだったりする。

第1章を読むだけでそういうよろしくない部分を改善し、定番的な型を身に着けられる。ゴルフで言ったら、変なフォームを身に着けてしまってなかなかボールがちゃんと飛ばないけど、ちゃんとレッスンプロに教わったら変な癖が改善され、よく飛ぶというような感覚に似ている。かといって、プログラミング初心者がいきなり全てを読みこなせるような内容ではないけど。

本書の巻末に「Appendix:ルール集」として各章のルールが示されている。自分自身の勉強のためにも、1章の「スタイル」のルールを全て以下に列挙しておこう。
  • グローバルにはわかりやすい名前を、ローカルには短い名前を
  • 統一しよう
  • 関数には能動的な名前を
  • 名前は的確に
  • 構造がわかるようにインデントしよう
  • 自然な形の式を使おう
  • かっこを使ってあいまいさを解消しよう
  • 複雑な式は分割しよう
  • 明快に書こう
  • 副作用に注意
  • インデントとブレースのスタイルを統一しよう
  • 慣用句によって一貫性を確保しよう
  • 多分岐の判定にはelse-ifを使おう
  • 関数マクロはなるべく使うな
  • マクロの本体と引数はかっこに入れよう
  • マジックナンバーには名前をつけよう
  • 数値はマクロではなく定数として定義しよう
  • 整数ではなく文字定数を使おう
  • オブジェクトサイズは言語に計算させよう
  • 当たり前のことはいちいち書くな
  • 関数とグローバルデータにコメントを
  • 悪いコードにコメントをつけるな、書き直せ
  • コードと矛盾させるな
  • あくまでも明快に、混乱を招くな
(pp.335-336)

これらのルールは文脈の中で示されており、これだけを読んでも微妙なので、ぜひ本書で内容を確認してほしい。また、マクロとかC言語特有の記述もあり、すべてのプログラミング言語に該当するルールではないので、そこは読み替える必要がある。

特に自分がよくやりがちなのはコメントを多く書きすぎるということかな。学生の時からの癖で、ついつい明らかにコードを読めばわかるような部分にもコメントを書いてしまう。まぁ、基本的に今はExcel VBAで自分しかツールのメンテナンスをしていないからよいのだけど、そうはいってもどこで自分の作ったプログラムが移植されたりするかわからないので、やはり書きすぎはよろしくないので気を付けたい。

今は新人君のプログラミングレッスンをやっているので、特にこのスタイルの部分が改めて勉強になった。マジックナンバーはなるべく定数化しましょうねとか、基本中の基本であるインデントをそろえるとか最近指摘した。そういうのは、プログラミングをやり始めた時にはあまり気づかない部分かもしれないし、なまじプログラミング経験があまりないときにそういう基礎的な部分をきっちり身に着けておいたほうがよいかもしれないし。

なので、プログラミング経験にまだ乏しい人は1章だけはなんとか習得しておいたほうがよいと思う。初級レベルを脱却するなら第2章の「アルゴリズムとデータ構造」まで理解しておきたいところ。ここはソートや二分探索木などの典型的なアルゴリズムが示されている。応用情報技術者試験にもよく出てきたね。

3章以降からちょっと難易度が上がって、チームや仕事でのプログラミング経験がないとちょっと理解するのに苦労するかもしれない。実体験がないと感覚的に理解できずにふーんって感じで終わってしまうかもしれないし。自分は5,6,7章のデバッグ、テスト、性能の部分が特に勉強になった。

本書はC言語で連結リストなどを学習していた大学2年生のとき、正確な日時は2003年の6月28日(土)に大学の図書館で読んだことがあった(なんでそんなに正確にわかるかというと、ノートに読書記録をつけていたから)。その記録によると読了時間が20分となっており、当時速読訓練も兼ねていたからその読書時間となる。もちろん20分で読める程度の理解で、さっぱり記憶に残っておらず、たぶんこんなことが書いてあったとしか言えなかったと思う。

そして3年前の2008年の夏にアマぞった本書をようやく最近になって読了した。3章まで読んで積読状態になっていたのを続きからなんとか読み始めた。大体1章30〜40ページあたり平均90分ほど時間がかかった。全350ページ読了まで大体10時間ほどかな。もちろん完全に理解しているわけでもないし、ところどころ問題としてなんとかせよっていう部分はあまり考えずに飛ばしていたけど、大分理解できたと思う。昔に比べて各段に理解度が上がっている。

なんだか本書をある程度読みこなせて、まだまだプログラマとしてなんとかやっていけるのではないかという自信みたいなのがついた。最近いろいろともっとページ数が多くて辞書みたいなのをたくさん買ったので、どんどん読みこなせていけそうだなと。でもさすがに週1冊ペースで読みこなしていくのは無理かも・・・。

本書はプロプログラマとして生きていきたい人はぜひ読んだほうがよい。どんなプログラミング言語を使用していたとしても。



プログラミング作法
プログラミング作法
著者:ブライアン カーニハン
販売元:アスキー
(2000-11)
販売元:Amazon.co.jp

読むべき人:
  • プロプログラマになりたい人
  • プログラミングの書き方がいまいち微妙な人
  • プログラミング教育担当者の人
Amazon.co.jpで『プログラミング』に関する他の本を見る

bana1 プロプログラミングクリック☆  にほんブログ村 本ブログへ



トラックバックURL

コメントする

名前:
URL:
  情報を記憶: 評価:  顔   星