A Philosophy of Software Design ch1 Introduction

APoSDソフトウェア設計勉強メモ

出典: 


Introduction (It’s All About Complexity)

  • コンピュータソフトウェアを作ることは、人類史においてもっとも純粋な創作活動である

    • 物理的な制約がない
    • 仮想的な世界を作り出せる
    • 想像しうるものはたいてい創造できる
  • ソフトウェアを作る上で一番の制約は、自分が作っているシステムを理解する能力

    • 機能がふえるにつれ、システムは複雑に
    • 複雑になるにつれ、変更は大変に

      • 関連する事柄全てに気を配るのが難しくなる
      • 【補】ひどいと「どこを触ったらどこが壊れるかわからない」状態に
      • 開発は遅くなり、不具合につながり、コストがかさむ
  • 複雑性の増加は避けられないこと

    • 要因

      • プログラムが大きくなる
      • 利用者がふえる
    • 開発ツールの助けで御しやすくはなるが完全ではない
    • プログラマ自身が、ソフトウェアをシンプルにする道を模索しなければならない
  • 複雑性との戦い方

    • コードを単純明快に

      • スペシャルケースをなくす
      • 識別子に一貫性をもたせる
    • modular design

      • カプセル化

        • 一度に直面する複雑性を絞る
  • ソフトウェアの開発手法

    • ウォーターフォール

      • 物理的なシステム開発のアナロジーの最たるもの

        • 建築造船その他
      • ソフトウェア開発でうまくいくことは少ない

        • 物理的なシステムよりも本質的に複雑
        • 実装してみて初めて設計上の問題があらわになること多し
        • ウォーターフォールは再設計を許さない

          • 設計担当がもう他のプロジェクトにアサインされていたりする
        • 結果、ツギハギ実装で乗り切ろうとして複雑性が爆発する
    • インクリメンタルアプローチ

      • ウォーターフォール開発の問題を解決するために生まれた
      • 流れ

        1. 一部機能を設計、実装、評価
        2. 設計の問題の洗い出し、修正
        3. もういくつか機能を追加して繰り返す
      • システムが小さいうちに、設計の問題を修正できる
      • ソフトウェアの「順応性の高さ」ゆえに可能なこと

        • 物理的なシステムではこうもいかない
  • ソフトウェア設計は終わらない

    • システムのライフタイム中、たえず再設計し続ける
  • 本書の目的

    • ソフトウェアの複雑性の性質について述べる

      • 「複雑性」の意味とは
      • なぜそれが重要なのか
      • 不要なな複雑性をどう認識するか
    • 複雑性を最小化するためのテクニックを提示する

      • 抽象的

        • すぐ適用できる、という代物ではない
      • 設計上の選択肢がいくつかあったとき、比較検討に使ってね

How to use this book

  • 「危険信号」のリファレンス

    • コードレビュー
    • 設計スキルの向上

      • 実在のコードの中にある「危険信号」を認識するのが一番
  • 過ぎたるは及ばざるが如し

    • 「やりすぎるとこうなる」も載せている
    • 良い設計とは、相反する考えや方法のバランスの上に成り立つもの
  • JavaとC++で書いてるけどなんにでも適用できるよ

英語

  • malleable

    • 順応性のある