SlideShare a Scribd company logo
ソフトウェア設計の
学び方を考える
2019年6月23日
ギルドワークス 増田 亨
DevLOVE X(10周年記念イベント)
アジェンダ
1. 設計という課題
2. ソフトウェア設計の品質
3. 学習と成長
4. 設計の初歩を学ぶ
5. 設計の中級者への道
6. 設計の上級者への挑戦
2019/6/23 2
ソフトウェア設計という課題
2019/6/23 3
複雑さとの戦い
構成要素の数
構成要素間の関係
拡張と変更の繰り返し
2019/6/23 4
人間の知的能力の限界
構成要素の数
構成要素間の関係
拡張と変更の繰り返し
2019/6/23 5
ソフトウェア設計の品質
2019/6/23 6
構造と秩序
2019/6/23 7
時間とともに劣化する構造と秩序
2019/6/23 8
時間とともに進化する構造と秩序
2019/6/23 9
ソフトウェア設計のスキル
構造と秩序を生み出す能力
2019/6/23 10
学習と成長
2019/6/23 11
学習と成長
実験による設計スキルの習得
設計スキルの学習曲線
2019/6/23 12
実験による設計スキルの習得
最初からよい設計はみつからない
そのまま使える既存の設計はない
2019/6/23 13
実験による設計スキルの習得
観察 仮説 実験 考察
目の前の設計課題
過去の設計例
他者の設計例
今回設計案の列挙
仮決め
コードで検証
収まり具合
まわりとの関係性
全体の調和
2019/6/23 14
設計スキルの向上
設計知識の広さと深さ
設計経験の広さと深さ
着眼点とこだわりポイントの変化
2019/6/23 15
設計スキルの学習曲線
設計の初歩
を学ぶ
中級者への道
上級者の挑戦
知識と経験が広く深くなるにつれ
着眼点とこだわりポイントが変化していく
2019/6/23 16
設計の初歩を学ぶ
2019/6/23 17
設計の基本
関心を分離する
モジュールに分割する
2019/6/23 18
分割とモジュール化の方法論
2019/6/23 19
2つの分割アプローチ
機能で分解する 型で分解する
入出力 計算
画面・通信・データベースの操作
トランザクションスクリプト
導出ロジック/判定ロジックの記述
ドメインモデル
2019/6/23 20
B. Liskov
B. Meyer
M. Fowler
K. Beck
E. Evans
ボトムアップ
インクリメンタル
トップダウン
アップフロント
構造と秩序をもたらす設計の初歩
型(値の種類)で分解する
計算を主役に、入出力をわき役に
問題領域と設計の直接的な写像
2019/6/23 21
型による分解
2019/6/23 22
型(値の種類)による分解
動機は計算ロジックや判定ロジックの複雑さを扱う工夫
計算の結果や計算に使う値を分類する(型の発見)
型ごとに、値の有効な範囲を定義する
型ごとに、その値を使う有効な操作を定義する
値の範囲と操作の定義をカプセル化する(クラス)
2019/6/23 23
計算を設計の主役に
2019/6/23 24
計算が主役、入出力がわき役
Javaの言語、標準ライブラリ、フレームワークを例に
計算ロジックの記述 入出力の記述
かつては、java.io, java.net, java.sql …
今はフレームワークに隠蔽されている
さまざまな実証済の設計パターンの登場
かつては、int, boolean, BigDecimal, Calendar, collection
今でも、int, boolean, BigDecimal, java.time, collection, …
かつては、if文, switch文, enum, …
今でも、if文, switch文, enum, …
構造と秩序を生み出すための
設計の主たる関心事ではなくなりつつある
複雑さと戦い、構造と秩序を生み出すための
設計活動の主戦場
2019/6/23 25
問題領域と設計の直接的な写像
2019/6/23 26
怪しげな写像
金額
注文番号
消費税
換算レート
納期
誕生日
割引可能
出荷可能
long型
BigDecimal型
LocalDate型
boolean型
一方通行
N対1
値の範囲
可能な操作
問題領域の関心事 設計実装の関心事
2019/6/23 27
直接的な写像
金額
注文番号
消費税
換算レート
納期
誕生日
割引可能
出荷可能
双方向の対応
1対1
適切な値の範囲
適切な操作
問題領域の関心事 設計実装の関心事
金額型
注文番号型
消費税型
換算レート型
納期型
誕生日型
割引判定型
出荷判定型
2019/6/23 28
構造と秩序をもたらす設計の初歩
型(値の種類)で分解する
計算を主役に、入出力をわき役に
問題領域と設計の直接的な写像
2019/6/23 29
設計の中級者への道
2019/6/23 30
設計の初級者と中級者の違い
初級者にとっては時間のムダに思える活動
中級者は費用対効果が高いと考える活動
2019/6/23 31
設計に関する活動 初級者 中級者
リファクタリング 動けばOK/やらない 動いた後の改善こそ重要
名前の変更 どっちでも同じ 名前たいせつ
パッケージ構造の変更 時間のムダ/危険 見通し改善の効果大
設計の選択肢 選択肢はひとつ いろいろあって迷う
業務知識 わからない、興味ない 知っていると強い
設計スキルが高い 複雑なコードが書ける コードを単純にできる
2019/6/23 32
設計の中級者への道
➢多くに目を向け、複数の選択肢を持つようにする
➢時間の節約と投資を覚える
✓構造と秩序の「核になる20%」に注目する
✓核心の設計課題に、重点的に時間とエネルギーを投資する
✓周辺的な課題の設計は、できるだけ時間とエネルギーを節約する
➢仕様の補完力の必要性と効果を知る
✓詳細仕様はだれも知らない/決められない現実を理解する
✓業務知識の理解と直接的な写像の効果に気がつく
➢パッケージ名とパッケージ構造の威力を知る
2019/6/23 33
「中心」と「周辺」の関係に気づく
影響の大きい要素の発見
設計の上級者への挑戦
2019/6/23 34
設計の上級者
もっともっと広く、もっともっと深く
4%への挑戦
2019/6/23 35
設計の上級者
➢もっともっと広く、もっともっと深く
✓型による分解
✓計算を主役に
✓問題領域と設計実装の直接的な写像
➢4%への挑戦
✓20%×20%
✓関心の範囲を広げるほど、時間が足りなくなる
✓中核のなかの中核、要点のなかの要点を発見することに焦点をあわせる
✓4%の中心的な関心事に、重点的に投資する
✓周辺の関心事への節約を、さらに徹底する
2019/6/23 36
深く理解し、4%に挑戦する
➢多くに目を向け、複数の視点を持ち、視座をあちこち移動する
➢根底にある構造の発見へのこだわり
➢暗黙の概念の言語化へのこだわり
➢ビジネス活動とソフトウェア構造の直接的な関係性の気づき
✓どちらも構造と秩序が時間とともに変化する
✓両者の直接的な連動性への気づきと設計への反映
2019/6/23 37
本日のまとめ
2019/6/23 38
設計という課題
複雑さへの挑戦
構造と秩序をもたらす能力
設計の品質
変更が楽で安全であること、
進化を続ける秩序
学習と成長
実験による学習
着眼点とこだわりポイントの変化
設計の初歩を学ぶ
型による分解、計算が主役
直接的な写像
中級者への道
設計の費用対効果への気づき
中心と周辺の気づき、節約と投資
上級者への挑戦
4%への挑戦
隠れた概念/関係性の発見と言語化
2019/6/23 39

More Related Content

ソフトウェア設計の学び方を考える