20151018 study-設計を学ぶための最初の一冊はなにがいいのだろうか
TRANSCRIPT
設計を学ぶための最初の一冊は
なにがいいのだろうか黒澤慎太郎10/18/2015
設計とは
• 設計(せっけい、design)は、必要とする機能を具現化し検討した結果を建築物や工業製品、情報システム等を造るために仕様(設計図書)や設計図・設計書等を作る作業である。(Wikipediaより引用)
ソフトウェア設計とは
• ソフトウェアアーキテクチャ(Software
Architecture)は、ソフトウェアコンポーネント、それらの外部特性、またそれらの相互関係から構成される。(Wikipediaより引用)
私が議論したい"設計"とは
• ソフトウェアに秩序をもたらすもの
• 原則に順ずる。つまり、目的を持ってコード、クラスなどを配置する
• 正解がない。完成がない。常に変更され続ける
• ここでは、オブジェクト指向の設計に限定する
設計について議論したいと思ったのはなぜか
• 私の職場では設計があまりにも軽視されている
• 「ソフトウェアは目的を達成するために、正しく動けばいい」ではなく、「正しく動くのは当然で、ソフトウェアをいかに長生きさせるかが大事」だと思っているから。
• 振る舞いが変更されること前提だから"ソフト"ウェアなのであって、その対策をするのは当然のこと
設計が軽視されている例
• バグが発生し、提供したソフトウェアに問題がおきた。
• バグが発生した原因の報告を弊社では次のようにする。
• 「ある一つの仕様変更の際、資産をすべてgrepして修正
しなかったことがバグ発生の原因」(仕様変更とは、数値が変わる、条件式の変更など)
• 「ある一つの仕様変更」のために、「いくつかの資産を修正しなければならない」ことが原因なのではなかろうか。なんだ修正漏れって。
設計が軽視されている例
• コピーアンドペースト文化
• 似たようなロジックを躊躇なく量産
• そもそも重複したロジックを量産
• 設計を評価する文化がない
• etc...
設計によりソフトウェアが秩序を保っていればの例
• 一つの仕様変更による修正箇所は一つのモジュールに限られる(オープン・クローズドの原則)
• 単体テストが可能(依存性逆転の原則等)
• 定時に帰れる
• etc...
設計を学ぶための最初の一冊目はなにが適切だろうか
• まずはパターンを学ぶのが良いと思う
• 「設計」という単語の意味する範囲が広すぎる
• 設計対象が広い範囲を扱う設計は、どうしても抽象化という概念が必須となる。
• そのため、最初はより具体的な設計を学ぶのが良い
設計のレベル
• 小さい範囲
• クラス設計
• クラスの関係についての設計
• 範囲がほどほど
• コンポーネント設計
• コンポーネントの関係についての設計
• 全体に及ぶ
• ソフトウェアアーキテクチャ設計
クラス設計
• クラスに、どのようなデータと振る舞いを持たせるか
• 具体的には、フィールド変数、メソッドをどう作っていくか設計する
クラス設計を学ぶための最初の一冊
• 「実装パターン」by Kent Beck
クラス設計を学ぶ上での障害
• 実際の開発では、そもそも「クラスとして扱うためのオブジェクト」へたどり着けないかもしれない
• つまり、小さい範囲の設計を活かすためには、広い範囲の設計が必須となってしまう
設計を学ぶ上での障害
• モデリングの技術が必要になる
• 抽象的な存在を対象とするため、敷居が高い
結論
• 設計は、規模に関わらず大事な技術
• まずは、小さいクラスの設計から学ぶのが良い
• 大きい範囲の設計も、あとで学ぶ必要がある
• Kent Beckは神
完
• ご静聴ありがとうございました