Code Complete
基礎
ソフトウェアコンストラクションとは
- コンストラクションとはプログラミングのこと
- コーディング+デバッグ+ α(詳細設計やユニットテストなど)からなる
- 「コーディング」という言葉単体は、単なる機械的な作業を連想させるため、コンストラクションの説明としては適 切ではない
- コンストラクション以外の作業は?
- プロジェクトマネジメント
- 要求開発(要件定義)
- 概要設計(アーキテクチャ)
- UI 設計
- システムテスト
- 保守
なぜコンストラクションが重要か
- 開発時間の大部分を占めるため
- 開発の中心であるため
- コンストラクションの改善は驚くべき効果をもたらすため
- コードが唯一のドキュメントになってしまうことがよくあるため
- どれだけ急いでいても絶対に省略できない工程であるため
メタファにより開発への理解を深める
メタファの重要性
- メタファを使った理解を「モデリング」という
- よく理解できないものを、既に理解しているものと照らし合わせることで、理解が深まること
- 概念全体を把握しやすくなる
メタファの使用方法
メタファはヒューリスティクスの意味合いが強い。どうすれば物事がうまくいくか、考えるために使うものである。
- アルゴリズム
- 厳密に定義された一連の命令
- ヒューリスティクス(発見的)
- 答えを見つけるために役立つテクニック
システム構築のメタファ
- BAD) コードを書く
- 手紙を書くイメージ
- 書いて終わりじゃねーのよ
- BAD) システムを育てる
- 作物を育てるイメージ
- コードはすくすく育たないし収穫もできないのよ
- SOSO) システムをインクリメンタルに開発する
- 真珠養殖のイメージ
- GOOD) システムを構築する
- 建築のイメージ
- 現代のシステム開発における用語の多くは建築由来。e.g. アーキテクチャ、ビルド、etc
話は逸れるけど、知識を常に収集してストックしておく「知的道具箱」というメタファもいいね
上流工程
準備の重要性
- 品質向上したいタイミングが
- プロジェクトの終わりの場合
- システムテストを強化する
- ただし、どれだけテストをしたところで、もとがクソなら意味がない
- プロジェクトの途中の場合
- コンストラクションのプラクティスを強化する
- プロジェクトの最初の場合
- 高品質な計画、要求、設計を行う
- 安い車として設計したものは、どれだけ後段で努力してもロールスロイスにはならないからね
- プロジェクトの終わりの場合
準備の最大の目標
リスクを減らすこと。
準備不足の原因
- 上流担当開発者が仕事をこなすだけの知識を持っていないから
- すぐにコードを書きたい衝動を押さえられない開発者がいるから
- 準備にかける時間を上司がよく思わないから。対処法:
- はっきり断る
- コーディングしているふりをする
- 準備を怠る危険を上司に叩き込む
- 転職する
準備に文句を言わせないためには
- 論理で訴える
- ユーザが求めていないものを作ると目も当てられないよ
- 変な構築をすると必要のないものに膨大な時間と資金が消えていくよ
- 例えで訴える
- プランクトンがぴょう期ならいずれクジラも死ぬ、みたいな食物連鎖の例とか
- データで訴える
- 問題の修正時期があとになるほど、コストは指数的に増えるよ
- これはウォーターフォール・アジャイルを問わない
ソフトウェアの種類
- ゆるいシステム
- アジャイル開発
- 反復型 の開発手法が適している(以下を交互に繰返し行う)
- 計画、要件定義、アーキテクチャの策定
- コンストラクション、システムテスト、品質保証
- ざっくりとした要求仕様の策定
- 設計とコーディングを同時にやってしまう
- 別チームでのテストや QA はなし