読者です 読者をやめる 読者になる 読者になる

ひだまりソケットは壊れない

ソフトウェア開発に関する話を書きます。 最近は主に Android アプリ、Windows アプリ (UWP アプリ)、Java 関係です。

まじめなことを書くつもりでやっています。 適当なことは 「一角獣は夜に啼く」 に書いています。

読んだ: CODE COMPLETE 第 2 版 上 — 完全なプログラミングを目指して

書籍 レビュー 書評

『CODE COMPLETE 第 2 版 上』 を読み終えました。

CODE COMPLETE 第2版 上

CODE COMPLETE 第2版 上

ソフトウェア開発の中の、詳細設計やコーディングとデバッグ単体テストなどの部分 (本書では 「コンストラクション」 と呼んでいる) に焦点を当てた書籍です。 プログラミングを行う際に気を付けるべきことがまとまった良い書籍です。 気を付けて当然のプラクティスばかり紹介されているという意味では常識集という感じでもあります。 プログラミングを初めて 1 年目や 2 年目の人が読むといろいろ学びがあるでしょう。

(追記) 下巻も読みました。 感想は下記記事。

内容紹介

上巻は 4 部構成です。

第 1 部 基礎を固める

第 1 部は、コンストラクションの中身に入るまでの準備などの話です。

まず第 1 章で、「ソフトウェアコンストラクション」 が表す範囲が、コーディングやデバッグ、詳細設計、統合といった 「実際にソフトウェアを作る部分」 であるという話や、それらについて論じることの重要性が述べられたりします。 上流工程が大事なのはそうですが、コンストラクションの過程も同様に大事ってことです。

2 章では、ソフトウェア開発においてメタファ (たとえ) を使用することが理解の促進につながることもあれば、悪いメタファを使用することで無用な混乱を招くこともある、という話がされます。 また、ソフトウェアコンストラクションのメタファとして、入念な準備が必要であることや、小規模なものと大規模なものの違いを理解しやすいということなどから、「建物の建築」 が適しているだろうと書かれています。 メタファに関しては、下手なメタファを用いることで混乱の要因になっている例が多々ありますので、良いメタファを用いることができるように気を付けたいですね。

3 章では、コンストラクションに入る前の準備 (上流工程) について論じられます。 アジャイル開発などの反復型の開発手法もありますが、どのような開発手法を採ろうともコンストラクションの前の準備は必要であり、課題定義や要求の策定といったことを適切に行わないと、コンストラクションの際に解決する課題を誤ったり、コンストラクション時の要求変更 (それはコンストラクション前に起こるよりもコストが大きい) が発生しやすくなったりします。 また、コンストラクションの準備として、アーキテクチャの設計も十分に行う必要があるとも書かれています。

4 章は 『コンストラクションの重要な決断』 ということで、プログラミングに使用する言語の選定や、プログラミング規約を定める、といった話が書かれています。 また、興味深い話としては、「プログラミング言語中で」 のプログラミングをするのではなく、「プログラミング言語中へ」 のプログラミングをせよ、というものがありました。

  • 「言語の中で」 のプログラミングというのは、使用している言語やツールがサポートしている構造に縛られて考えるということ。
  • 「言語の中へ」 のプログラミングというのは、(言語やツールに縛られない) 自分の考えを表現するために、使用している言語やツールでどのように実現するか決める、ということ。

わかりやすい例としては、「プライベートメソッドをサポートしていない言語を使っているときには、プライベートメソッドという概念を使用しない」 というのが 「中で」 のプログラミングで、「プライベートメソッドをサポートしていない言語では、メソッド名の命名規則でプライベートかどうかを表すことにする」 というのが 「中へ」 のプログラミングです。

第 2 部 高品質なコードの作成

第 2 部は、設計からクラス、ルーチンといった粒度での議論がなされます。 ここら辺の話を論じている本は他にもいろいろありますので、プログラミングのプラクティスがまとまっている本を読んだことがある人なら大体知ってる内容だと思います。

5 章はコンストラクションにおける設計の話です。 鉄則として、複雑さに対処するということが述べられ、単純さにこだわることが重要視されています。 モジュール間の依存関係を整理することは重要ですし、結合を疎にすることと凝縮度を大きくすることも重要です。 当然ですね。 設計はヒューリスティックな作業で、繰り返し行うことで設計が洗練されていく、ということが書かれていて、確かにそうだなー、という思いました。 (時間をかけたら設計ってよくなると思ってる。 もともとの能力次第だけど。) 特に価値の高い概念として、情報隠ぺいが紹介されていました。

6 章はクラスの作成についてで、クラスインターフェイスは一貫性のある抽象化を実現せよとか、「is a」 関係のモデリングを除き、通常は継承よりも包含の方が望ましいとか、そういう感じの話です。

7 章はルーチン (関数とかプロシージャ) の話です。 ルーチンの凝縮度を適切にせよ (1 つのルーチンで複数の機能を実現するのは多くの場合適切でない)、とか、名前を適切につけよ、とかですね。

8 章 『防御的プログラミング』 では、「無効な値が入力されたときに (通常の処理を行って) 無効な値を出力する」 というようなことをしないように入力値のチェックをするとか、例外処理を適切にするとか、そういう話がされます。 開発時には無効な値が検出されたらそれとわかるように大げさなエラーになるようにしておいてデバッグしやすくし、製品版では無効な入力に対してユーザーに適切なメッセージを出すように変更する、とか。

9 章では、擬似コードを書いてから実際のコードを書く、という手法 (擬似コードプログラミングプロセス; PPP) が紹介されました。 コードに落とし込む前に処理の流れを自然言語で記述することで、自分でも理解しやすく、他者にもレビューしてもらいやすい処理の流れを記述することができるなどの利点があります。 確かに複雑な処理だとこういう手法を採るのも良さそうですね。

第 3 部 変数

第 3 部では、変数について論じられます。 例えば以下のような感じです。

  • 変数のスコープをできるだけ狭くする。
  • 1 つの変数を複数の目的で使いまわさない。
  • 良い名前を付ける。 解読しやすく、目的がわかりやすいように。 8 から 20 文字程度の長さが良さそう。
  • 命名規則を上手に使う。 (全部大文字だと定数、とか。)
  • マジックナンバーを使わない。 (代わりに名前付き定数を使う。)
  • 必要がない限りグローバル変数を使わない。

ここら辺は、当たり前のこととしてやってくれって感じですよね。 他には、構造体やポインタのはまりどころを避けるためのプラクティスなどが書かれています。

第 4 部 ステートメント

第 4 部では、文について論じられます。 例えば以下のような感じです。

  • if 文などの条件が複雑になるようなら、ブール関数でカプセル化する。
  • 必要であればループの途中にループの出口を作る。 (A → B → A → B → A という感じの処理が必要な場合は、while (true) { A; if (...) break; B; } みたいなコードにする。)
  • goto 文はむやみに使うべきではないが、場合によっては良いものである。
  • 深いネストはルーチンの理解を妨げるので、ネストは浅くすべき。
  • 論理式を単純で読みやすいものにすること。

上には一部しか書いてませんが、第 3 部と同じで基本的には当たり前のこととしてコーディング時に気を付けてくれって感じのことがほとんどですね。

あと興味深いこととしては、18 章で述べられている 「テーブル駆動方式」 があります。 テーブル駆動方式というのは、論理文を使ってデータを取得したり処理の内容を決めたりする代わりに、テーブル (配列やマップ) を使って情報を参照するというものです。 具体的には、変数 month に何月かを表す数値 (1 月が 0 とする) が入っている場合に、その月の日数を得るために

int numDaysInMonth;
if (month == 0) {
    numDaysInMonth = 31;
} else if (month == 1) {
    ...

とするのではなく、

// 予め用意されているテーブル
int[] numDaysInMonthTable = { 31, 28, 31, ... };

int numDaysInMonth = numDaysInMonthTable[month];

みたいな感じでデータを取得する、というものです。 必要に応じて使う手ではありますが、こういう本で紹介されてるのが面白いなーと思いました。

感想

プログラマが経験的に得るであろう知見が良くまとまってるなーと思いました。 まともな環境で育った数年目のプログラマ (あるいはソフトウェアエンジニア) にとっては当たり前のことばかりなので読んでも面白くないと思いますが、1 年目から 2 年目にかけての新人が読むと得るものは多いと思います。 是非読みましょう。

数年目の人間でもここら辺の基礎がなってないプログラマも結構居ますので、そういう人間にも是非読んで欲しいですね。 (読ませたいですね。)

CODE COMPLETE 第2版 上

CODE COMPLETE 第2版 上

値段が高くて個人ではなかなか手が出しづらいですし、「そのうち買おう」 と思っているうちに経験を積んで本書の内容では物足りなくなってしまうような気がするので、チームに 1 冊とか会社に 1 冊とか置いてあると嬉しい気がします。

内容プレビュー

本書の内容の一部が web 上で公開されていますので、どういう内容なのか興味がある方は見てみると良いでしょう。