勉強日記

チラ裏

A Philosophy of Software Design ch1 Introduction

www.goodreads.com


Introduction (It's All About Complexity)

  • コンピュータソフトウェアを作ることは、人類史においてもっとも純粋な創作活動である
    • 物理的な制約がない
    • 仮想的な世界を作り出せる
    • 想像しうるものはたいてい創造できる
  • ソフトウェアを作る上で一番の制約は、自分が作っているシステムを理解する能力
    • 機能がふえるにつれ、システムは複雑に
    • 複雑になるにつれ、変更は大変に
      • 関連する事柄全てに気を配るのが難しくなる
      • 【補】ひどいと「どこを触ったらどこが壊れるかわからない」状態に
      • 開発は遅くなり、不具合につながり、コストがかさむ
  • 複雑性の増加は避けられないこと
    • 要因
      • プログラムが大きくなる
      • 利用者がふえる
    • 開発ツールの助けで御しやすくはなるが完全ではない
    • プログラマ自身が、ソフトウェアをシンプルにする道を模索しなければならない
  • 複雑性との戦い方
    • コードを単純明快に
      • スペシャルケースをなくす
      • 識別子に一貫性をもたせる
    • modular design
  • ソフトウェアの開発手法
    • ウォーターフォール
      • 物理的なシステム開発のアナロジーの最たるもの
        • 建築造船その他
      • ソフトウェア開発でうまくいくことは少ない
        • 物理的なシステムよりも本質的に複雑
        • 実装してみて初めて設計上の問題があらわになること多し
        • ウォーターフォールは再設計を許さない
          • 設計担当がもう他のプロジェクトにアサインされていたりする
        • 結果、ツギハギ実装で乗り切ろうとして複雑性が爆発する
    • インクリメンタルアプローチ
      • ウォーターフォール開発の問題を解決するために生まれた
      • 流れ
        1. 一部機能を設計、実装、評価
        2. 設計の問題の洗い出し、修正
        3. もういくつか機能を追加して繰り返す
      • システムが小さいうちに、設計の問題を修正できる
      • ソフトウェアの「順応性の高さ」ゆえに可能なこと
        • 物理的なシステムではこうもいかない
  • ソフトウェア設計は終わらない
    • システムのライフタイム中、たえず再設計し続ける
  • 本書の目的
    • ソフトウェアの複雑性の性質について述べる
      • 「複雑性」の意味とは
      • なぜそれが重要なのか
      • 不要なな複雑性をどう認識するか
    • 複雑性を最小化するためのテクニックを提示する
      • 抽象的
        • すぐ適用できる、という代物ではない
      • 設計上の選択肢がいくつかあったとき、比較検討に使ってね

How to use this book

  • 「危険信号」のリファレンス
    • コードレビュー
    • 設計スキルの向上
      • 実在のコードの中にある「危険信号」を認識するのが一番
  • 過ぎたるは及ばざるが如し
    • 「やりすぎるとこうなる」も載せている
    • 良い設計とは、相反する考えや方法のバランスの上に成り立つもの
  • JavaC++で書いてるけどなんにでも適用できるよ

英語

  • malleable
    • 順応性のある