SlideShare a Scribd company logo
プロダクトづくりのための
ソフトウェア設計スタイル
ギルドワークス 増田 亨
DevLove #280 プロダクトをつくるとはどういうことなのか? -正しいものを正しくつくる-
2019/7/1 2
祝 出版2周年
いまでも、毎日だれかは買ってくれている
今日の話は、この本の背景にある考え方と思い
プロダクトづくり
2019/7/1 3
プロダクトづくり
不確実性との戦い
終わりのない進化と成長
あらかじめ、要件/期限/予算を固定するソフトウェア開発とは別の世界
2019/7/1 4
ソフトウェア設計という課題
2019/7/1 5
複雑さとの戦い
構成要素の数
構成要素間の関係
拡張と変更の繰り返し
2019/7/1 6
建築や土木とは異質の挑戦
ソフトウェア設計の品質
2019/7/1 7
構造と秩序
2019/7/1 8
進化を続ける構造と秩序
プロダクトづくりに必要な設計品質
2019/7/1 9
ソフトウェア設計のスキル
構造と秩序を生み出し続ける能力
2019/7/1 10
不確実性と戦うための
ソフトウェア設計スタイル
2019/7/1 11
柔らかなモジュール構造
創発的な設計活動
20%に投資する
2019/7/1 12
創発的な設計活動
2019/7/1 13
創発的な設計活動
観察 仮説 実験 考察
目の前の設計課題
過去の設計例
他者の設計例
仮決め
コードで検証
収まり具合
まわりとの関係性
全体の調和
2019/7/1 14
設計案の列挙
観察と考察の質と量が大きな違いを生む
やわらかなモジュール構造
2019/7/1 15
設計の基本
関心を分離する
モジュールに分割する
2019/7/1 16
モジュール分割の方法論
2019/7/1 17
モジュール分割:方法論の違い
機能で分解 型で分解
入力と出力 計算と判定
画面・通信・データベースの操作 導出ロジック/判定ロジックの記述
2019/7/1 18
A. Hoare
O. Dahl
B. Liskov
B. Meyer
M. Fowler
K. Beck
E. Evans
…
ボトムアップ
インクリメンタル(創発的)
トップダウン
アップフロント
ビジネスルール記録と通知
トランザクションスクリプト ドメインオブジェクトモデル
硬直化、レガシー化 進化と成長、創発性
型
✓ 値の種類の定義(何を計算したいかのアイデアの表現)
➢ 金額、数量、日付、日数、判定区分、対象種別、…
✓ 値の範囲の定義
➢ 上限、下限
➢ 有限要素を列挙して定義(曜日、会員種別、年齢区分、….)
✓ 値を使った有効な操作の定義
➢ 同一性判定、大小判定
➢ 加減乗除
✓ 値の範囲と有効な操作を一つの入れ物にカプセル化 → クラスの定義
2019/7/1 19
プリミティブな型
int, long
boolean
BigDecimal
LocalDate, LocalTime
配列、List,Set,Map,
設計スタイル
2019/7/1 20
型で分解
機能で分解
✓ アジャイルなソフトウェア開発の基本スタイル
➢ 型の定義の柔軟性/創発性
➢ 型の組み合わせ方の柔軟性/創発性
✓ ウォータフォールのソフトウェア開発の基本スタイル
➢ 機能分割によるモジュール構造の固定化
➢ 計算ロジックの断片化と重複 → 力づくの変更 → 限界
関心事と設計の直接的な写像
2019/7/1 21
怪しげな写像
金額
注文番号
消費税
換算レート
納期
誕生日
割引可能
出荷可能
long型
BigDecimal型
LocalDate型
boolean型
一方通行
N対1
値の範囲
可能な操作
ビジネス活動の関心事 設計実装の関心事
2019/7/1 22
直接的な写像
金額
注文番号
消費税
換算レート
納期
誕生日
割引可能
出荷可能
双方向の対応
1対1
適切な値の範囲
適切な操作
ビジネス活動の関心事 設計実装の関心事
金額型
注文番号型
消費税型
換算レート型
納期型
誕生日型
割引判定型
出荷判定型
2019/7/1 23ビジネスの関心事とソフトウェアの構造が直接つながる
画面やテーブルの見え方の変化
2019/7/1 24
データのかたまり
型と計算に焦点を合わせた時の見え方
2019/7/1 25
分解可能性 ✓ 計算の文脈ごとに画面やテーブルが論理ブロックに分かれて見える
価格計算、割引計算、納期設定、リスク判定、…
暗黙の関係性
データのつながり
✓ 計算の文脈から、画面/テーブル間の隠れた関係性に気づく
計算や判断に必要なさまざまなデータの所在/発生タイミング
画面遷移図やER図にはでてこない関連性
重要度の濃淡
✓ 計算結果・判定結果(知りたいこと)に着眼する
✓ 各データ項目が、どこでどんな計算判断に使われるか気になる
計算や判断に使わないデータは注目度をさげる
重要なデータ、重要な関係だけが浮き上がってみえるようになる
20%に投資する
2019/7/1 26
20% → 80%
2019/7/1 27
重要な20%
全体の80%に影響する
設計の焦点
ここで消耗しない
ここで時間を浪費しない
不確実性といっても、中核の要素がぶれまくるわけではない
周辺的な関心事は、ぶれてもよいように設計活動を節約しておく
不確実性と戦うための
ソフトウェア設計スタイル
2019/7/1 28
柔らかなモジュール構造
創発的な設計活動
20%に投資する
2019/7/1 29
観察
仮説
実験
考察
型
計算が主役
直接的な写像
中核要素の見極め
周辺で浪費しない
末端で消耗しない

More Related Content

PDF
ソフトウェアの核心にある複雑さに立ち向かう
PDF
ソフトウェア設計の学び方を考える
PDF
アジャイルなソフトウェア設計を目指して
PDF
ドメイン駆動設計 基本を理解する
PDF
正しいものを正しく作る塾-設計コース
PDF
ドメイン駆動設計 本格入門
PDF
ドメイン駆動設計の正しい歩き方
PDF
ドメイン駆動設計に15年取り組んでわかったこと
ソフトウェアの核心にある複雑さに立ち向かう
ソフトウェア設計の学び方を考える
アジャイルなソフトウェア設計を目指して
ドメイン駆動設計 基本を理解する
正しいものを正しく作る塾-設計コース
ドメイン駆動設計 本格入門
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計に15年取り組んでわかったこと

What's hot (20)

PDF
世界でいちばんわかりやすいドメイン駆動設計
PDF
Cognitive Complexity でコードの複雑さを定量的に計測しよう
PPT
ドメインロジックの実装方法とドメイン駆動設計
PDF
ドメイン駆動で開発する ラフスケッチから実装まで
PDF
ドメインオブジェクトの設計ガイドライン
PDF
DDD sample code explained in Java
PPTX
事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)
PDF
ソーシャルゲームのためのデータベース設計
PDF
Dockerfile を書くためのベストプラクティス解説編
PDF
ドメイン駆動設計 思えば遠くにきたもんだ
PDF
実践に向けたドメイン駆動設計のエッセンス
PDF
リーン開発の本質 公開用
PPTX
ITコミュニティと情報発信に共通する成長と貢献の要素
PDF
ドメインオブジェクトの見つけ方・作り方・育て方
PDF
ドメイン駆動設計 複雑さに立ち向かう
PDF
ウォーターフォールとアジャイルのフェアな比較
PDF
ビジネスパーソンのためのDX入門講座エッセンス版
PDF
TDD のこころ @ OSH2014
PDF
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
PDF
開発速度が速い #とは(LayerX社内資料)
世界でいちばんわかりやすいドメイン駆動設計
Cognitive Complexity でコードの複雑さを定量的に計測しよう
ドメインロジックの実装方法とドメイン駆動設計
ドメイン駆動で開発する ラフスケッチから実装まで
ドメインオブジェクトの設計ガイドライン
DDD sample code explained in Java
事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)
ソーシャルゲームのためのデータベース設計
Dockerfile を書くためのベストプラクティス解説編
ドメイン駆動設計 思えば遠くにきたもんだ
実践に向けたドメイン駆動設計のエッセンス
リーン開発の本質 公開用
ITコミュニティと情報発信に共通する成長と貢献の要素
ドメインオブジェクトの見つけ方・作り方・育て方
ドメイン駆動設計 複雑さに立ち向かう
ウォーターフォールとアジャイルのフェアな比較
ビジネスパーソンのためのDX入門講座エッセンス版
TDD のこころ @ OSH2014
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
開発速度が速い #とは(LayerX社内資料)
Ad

Similar to プロダクトづくりのためのソフトウェア設計スタイル (20)

PDF
Developers Summit 2013【15-B-6】開発者の "資産形成" につながる Action とは?
PDF
20200523 冴えないソフトの育てかた
PDF
20210828_win32_windows11
PDF
Gnus intro web_2021
PDF
ビジネスとデザイン ~ビジネスは悪くない~
PPTX
Do you wanna be a V-ROCK star?
PDF
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
PPTX
最近のQ#について
PDF
基調講演「データのグループウェア化」
PDF
20190706 PO 2019 Summer
PDF
20200429 algyan lt
PDF
Arduino で組み込み開発 - 京都TECH オープンキャンパス2021
PDF
DEMODAY 2019 Spring スポンサーシップ募集要項
PPTX
Web App for Containers のデプロイでつまずいた話
PDF
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
PDF
A04_これがデジタル変革だ!3 か月で B2C の WEB ポータルをスクラッチした Microsoft クラウドネイティブ の開発事例 [Micros...
PPTX
サービス開発における工程
PPTX
デジタル時代の企業変革 2019
PDF
Lt40
PPTX
20190117 teamup
Developers Summit 2013【15-B-6】開発者の "資産形成" につながる Action とは?
20200523 冴えないソフトの育てかた
20210828_win32_windows11
Gnus intro web_2021
ビジネスとデザイン ~ビジネスは悪くない~
Do you wanna be a V-ROCK star?
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
最近のQ#について
基調講演「データのグループウェア化」
20190706 PO 2019 Summer
20200429 algyan lt
Arduino で組み込み開発 - 京都TECH オープンキャンパス2021
DEMODAY 2019 Spring スポンサーシップ募集要項
Web App for Containers のデプロイでつまずいた話
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
A04_これがデジタル変革だ!3 か月で B2C の WEB ポータルをスクラッチした Microsoft クラウドネイティブ の開発事例 [Micros...
サービス開発における工程
デジタル時代の企業変革 2019
Lt40
20190117 teamup
Ad

More from 増田 亨 (18)

PDF
ソフトウェア開発のやり方の改善
PDF
事業活動モデル・システム機能モデル・ビジネスロジックの記述
PDF
オブジェクト指向プログラミングの現在・過去・未来
PDF
ドメイン駆動設計 コアドメインを語り合ってみよう
PDF
ドメイン駆動設計という設計スタイル
PDF
マイクロサービス 4つの分割アプローチ
PDF
ビジネスルールの複雑さに立ち向かう
PDF
ドメイン駆動設計サンプルコードの徹底解説
PDF
ドメイン駆動設計をゲーム開発に活かす
PDF
SoR 2.0 summary
PDF
毎日が越境だ!
PDF
SoR 2.0 基幹システムの再定義と再構築
PDF
ドメイン駆動設計とは何か 【入門編】
PDF
ドメイン駆動設計のための Spring の上手な使い方
PDF
越境する情シス:進化可能なアーキテクチャを手に入れる
PDF
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
PDF
現場で役立つシステム設計の原則
PDF
現場で役立つシステム設計の原則
ソフトウェア開発のやり方の改善
事業活動モデル・システム機能モデル・ビジネスロジックの記述
オブジェクト指向プログラミングの現在・過去・未来
ドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計という設計スタイル
マイクロサービス 4つの分割アプローチ
ビジネスルールの複雑さに立ち向かう
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計をゲーム開発に活かす
SoR 2.0 summary
毎日が越境だ!
SoR 2.0 基幹システムの再定義と再構築
ドメイン駆動設計とは何か 【入門編】
ドメイン駆動設計のための Spring の上手な使い方
越境する情シス:進化可能なアーキテクチャを手に入れる
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
現場で役立つシステム設計の原則
現場で役立つシステム設計の原則

プロダクトづくりのためのソフトウェア設計スタイル