Submit Search
Upload
ブルックスのいう銀の弾丸とは何か?
•
1 like
•
3,079 views
Yoshitaka Kawashima
Follow
アーキ部#15の資料です。
Read less
Read more
Software
Report
Share
Report
Share
1 of 28
Download now
Download to read offline
Recommended
ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?
Yoshitaka Kawashima
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Shuto Suzuki
Tackling Complexity
Tackling Complexity
Yoshitaka Kawashima
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
Ito Takayuki
Redisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法
yoku0825
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるか
Takuto Wada
Recommended
ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?
Yoshitaka Kawashima
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Shuto Suzuki
Tackling Complexity
Tackling Complexity
Yoshitaka Kawashima
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
Ito Takayuki
Redisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法
yoku0825
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるか
Takuto Wada
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
mosa siru
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
WayOfNoTrouble.pptx
WayOfNoTrouble.pptx
Daisuke Yamazaki
アンチフラジャイルの世界
アンチフラジャイルの世界
Yoshitaka Kawashima
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
実践 NestJS
実践 NestJS
Ayumi Goto
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
イベント・ソーシングを知る
イベント・ソーシングを知る
Shuhei Fujita
PostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
例外設計における大罪
例外設計における大罪
Takuto Wada
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
ソフトウェア設計における 意思決定とそのレビューの秘訣
ソフトウェア設計における 意思決定とそのレビューの秘訣
Yoshitaka Kawashima
事業が対峙する現実からエンジニアリングを俯瞰する #devlove
事業が対峙する現実からエンジニアリングを俯瞰する #devlove
Itsuki Kuroda
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
増田 亨
なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?
Yoshitaka Kawashima
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
データモデリング・テクニック
データモデリング・テクニック
Hidekatsu Izuno
Are Design Patterns Dead?
Are Design Patterns Dead?
Yoshitaka Kawashima
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
Yoshitaka Kawashima
More Related Content
What's hot
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
mosa siru
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
WayOfNoTrouble.pptx
WayOfNoTrouble.pptx
Daisuke Yamazaki
アンチフラジャイルの世界
アンチフラジャイルの世界
Yoshitaka Kawashima
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
実践 NestJS
実践 NestJS
Ayumi Goto
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
イベント・ソーシングを知る
イベント・ソーシングを知る
Shuhei Fujita
PostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
例外設計における大罪
例外設計における大罪
Takuto Wada
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
ソフトウェア設計における 意思決定とそのレビューの秘訣
ソフトウェア設計における 意思決定とそのレビューの秘訣
Yoshitaka Kawashima
事業が対峙する現実からエンジニアリングを俯瞰する #devlove
事業が対峙する現実からエンジニアリングを俯瞰する #devlove
Itsuki Kuroda
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
増田 亨
なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?
Yoshitaka Kawashima
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
データモデリング・テクニック
データモデリング・テクニック
Hidekatsu Izuno
What's hot
(20)
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
WayOfNoTrouble.pptx
WayOfNoTrouble.pptx
アンチフラジャイルの世界
アンチフラジャイルの世界
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
実践 NestJS
実践 NestJS
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
イベント・ソーシングを知る
イベント・ソーシングを知る
PostgreSQLアンチパターン
PostgreSQLアンチパターン
例外設計における大罪
例外設計における大罪
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
ソフトウェア設計における 意思決定とそのレビューの秘訣
ソフトウェア設計における 意思決定とそのレビューの秘訣
事業が対峙する現実からエンジニアリングを俯瞰する #devlove
事業が対峙する現実からエンジニアリングを俯瞰する #devlove
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
データモデリング・テクニック
データモデリング・テクニック
More from Yoshitaka Kawashima
Are Design Patterns Dead?
Are Design Patterns Dead?
Yoshitaka Kawashima
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
Yoshitaka Kawashima
ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』
Yoshitaka Kawashima
本番障害に至る病
本番障害に至る病
Yoshitaka Kawashima
システムダウンのひみつ
システムダウンのひみつ
Yoshitaka Kawashima
Mavenの真実とウソ
Mavenの真実とウソ
Yoshitaka Kawashima
Atomic Architecture
Atomic Architecture
Yoshitaka Kawashima
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
Yoshitaka Kawashima
ウォーターフォールとアジャイルのフェアな比較
ウォーターフォールとアジャイルのフェアな比較
Yoshitaka Kawashima
How to find tech books
How to find tech books
Yoshitaka Kawashima
Antifragile Java - Java Day Tokyo 2017 D1-E1
Antifragile Java - Java Day Tokyo 2017 D1-E1
Yoshitaka Kawashima
たとえ日本人同士でも必要な異文化理解力
たとえ日本人同士でも必要な異文化理解力
Yoshitaka Kawashima
SIerにとっての越境 @ DevLOVE 199
SIerにとっての越境 @ DevLOVE 199
Yoshitaka Kawashima
Antifragile Clojure
Antifragile Clojure
Yoshitaka Kawashima
Boilerplate vs Magic
Boilerplate vs Magic
Yoshitaka Kawashima
既婚プログラマの時間捻出術
既婚プログラマの時間捻出術
Yoshitaka Kawashima
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Yoshitaka Kawashima
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
Yoshitaka Kawashima
週刊Webサイトのアーキテクチャ
週刊Webサイトのアーキテクチャ
Yoshitaka Kawashima
キメるClojure
キメるClojure
Yoshitaka Kawashima
More from Yoshitaka Kawashima
(20)
Are Design Patterns Dead?
Are Design Patterns Dead?
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』
本番障害に至る病
本番障害に至る病
システムダウンのひみつ
システムダウンのひみつ
Mavenの真実とウソ
Mavenの真実とウソ
Atomic Architecture
Atomic Architecture
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
ウォーターフォールとアジャイルのフェアな比較
ウォーターフォールとアジャイルのフェアな比較
How to find tech books
How to find tech books
Antifragile Java - Java Day Tokyo 2017 D1-E1
Antifragile Java - Java Day Tokyo 2017 D1-E1
たとえ日本人同士でも必要な異文化理解力
たとえ日本人同士でも必要な異文化理解力
SIerにとっての越境 @ DevLOVE 199
SIerにとっての越境 @ DevLOVE 199
Antifragile Clojure
Antifragile Clojure
Boilerplate vs Magic
Boilerplate vs Magic
既婚プログラマの時間捻出術
既婚プログラマの時間捻出術
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
週刊Webサイトのアーキテクチャ
週刊Webサイトのアーキテクチャ
キメるClojure
キメるClojure
ブルックスのいう銀の弾丸とは何か?
1.
ブルックスのいう 銀の弾丸とは何か? kawasima kawasima アーキ部#15
2.
“生産性、信頼性、簡便性において、10年以内に1桁の向上を 約束するような技術や経営手法の開発は、一つもない” Frederick P. Brooks Mythical
Man-Month, The: Essays on Software Engineering, Anniversary Edition, 2nd Edition Chapter 16 No Silver Bullet—Essence and Accident in Software Engineering
3.
ソフトウェア開発の難しさ 本質的 偶有的 存在するが必須でないもの ソフトウェア開発に本来的に 備わっているもの
4.
「偶有性」はアリストテレスの定義を参考にしている 実体 本質的 量 偶有的 質 関係 場所 時間 位置 所有 能動 受動 「偶然有る」ではなく 「偶々有る」の意
5.
本質的難しさ 複雑さ 適合性 変動性 目に見えない ソフトウェアは自然科学と違い恣意的に決められたルールや 制度に合わせなきゃいけない。 ハードウェアと違い変更がなされる ゆえに設計プロセスもコミュニケーションも難しい 本質的に多くの状態を持つ これらに効く本質的な 銀の弾丸がない、と言っている
6.
過去のブレイクスルーで偶有的難しさは一定乗り越えてきた 高水準言語 タイムシェアリング 統合プログラミング環境 ディスク、メモリなどを意識せずに高い抽象レベルのところで プログラミングできるようになった コンパイルの待ち時間で思考が中断されることがなくなった UNIXのパイプ&フィルタなど、プログラム同士を組み合わせ て使えるようになった
7.
「銀の弾丸はない」と言い切る根拠 本質的 偶有的 偶有的難しさはブレイクスルーできる可能性があるが、本質的難しさは無理 この比率、偶有的難しさが 90%以上含まれているんだったら生産性一桁あげれる可能性が あるが… そんなことはないよね!
という主張
8.
ブルックスを引用するならば… 「要はバランス。絶対的な正解はない。銀の弾丸はないってことよ」 「お金で開発環境を整備した方が良い。パフォーマンスチューニングできる人を雇うより Exadata買った方が安上がり。銀の弾丸より 金の弾丸」 という言い回しは、ブルックスの意図とはズレていると言える。
9.
後続の研究 Out of the
Tar Pit ※「人月の神話」の1章のタイトルがタールピットであることを踏まえている ”複雑さ、適合性、変更可能性、不可視性の4つの特性のうち、私たちは複 雑さが唯一の重要なものであると考えている。他の特性は、複雑さの形態 として分類されるか、またはシステムの複雑さのために問題が発生するた めに問題があると見なされる可能性がある。” https://curtclifton.net/papers/MoseleyMarks06a.pdf
10.
本質的複雑さと偶有的複雑さ 状態 状態から 直接計算 するロ ジック https://tech.uzabase.com/entry/2021/05/20/141950 本質的複雑さ コントロール 導出でき る状態 偶有的複雑さ
11.
偶有的複雑さは究極理想環境では無くなるもの と考えると良い ● どんな検索も一瞬で返すマシンや無限のメモリ空間など ● 判断ミスをしない設計者 現実にはそういうものが存在しないので、トレードオフを考えつつ意思決定
(偶有的複雑さ を抱える)ことを決めていく。
12.
偶有的複雑さの例① 取引を集計しさえすれば、現在の残高は 求まるので、口座エンティティには「残高」 は不要。 …なのだが、実際はその算出にそれなりの 計算量が必要なので、口座に「残高」を持 たせる。 そうした途端に付随して、 ● 残高更新時の排他制御 ● 取引の集計と残高のズレのチェック (リコンサイル) など、発生しさらなる複雑さを生む要因に なる。
13.
偶有的複雑さの例② コントロールフロー 手続き型のプログラミングスタイルだとコード順に 依存するので思わぬ問題に遭遇することがある。 https://twitter.com/t__keshi/status/1635267214008897537
14.
偶有的複雑さの例③ https://www.slideshare.net/kawasima/ss-255489610
15.
偶有的複雑さの対処は変わりゆく
16.
本質的複雑さへのアプローチ 本質的複雑さには対処のしようがないのか…?
17.
シンプルの対義語としての「複雑」 ● 1つの役割 ● 1つのタスク ●
1つの概念 ● 複数の役割 ● 複数のタスク ● 複数の概念 シンプル 複雑 https://github.com/matthiasn/talk-transcripts/blob/master/Hickey_Rich/SimpleMadeEasy.md
18.
要素数が多いのも「複雑」 要素数が多く、それらが相互作用しあう。
19.
2種類の複雑さ ● 単一のコンポーネントに内包される複雑さ ○ 1つのエンティティ、1つのクラス、1つのfunctionに複数の責務・概念が混ざっている。単 一責任原則(SRP)に違反した状態 ○
Unknown Unknowns (理解困難) [A Philosophy of Software Design] ● コンポーネント数が多いことによる複雑さ ○ エンティティやクラス、 functionの数が多く、それぞれの役割や関係性を理解するのが厄 介。 ○ 認知負荷が高い (把握難しい) [A Philosophy of Software Design]
20.
これら相互に変換可能
21.
本質的複雑さ保存の法則 巨大なエンティティや巨大なクラスを、 1つの責務・ 概念に分解しても、本質的複雑さの総量が変わる わけではない。
22.
非対称な理解可能性 ❶の注文には、どういう概念が含まれるか分からない。
23.
まず目指すべきは: 1つのエンティティに含まれる複雑さを最小化すること ● ドメインに含まれる責務・概念を可 視化する ● 理解のためであり、実装はそれか ら考えれば良い。 ●
変更容易性は「理解しやすさ」の結 果であり、設計の第一目的ではな い
24.
コンポーネント数の多さに起因する複雑さ (高い認知負荷)にどう対処するか? 古くより色々提唱されてきた ● 分割統治 ○ Bounded
Context ● 抽象化
25.
抽象化出来ていないと認知負荷が高まる例 属性値の組み合わせた結果だけが残っていて、 組み合わせに関する制約や、属性間の依存関係 などが抜け落ちている。
26.
抽象化出来ていないと認知負荷が高まる例 http://www.slideshare.net/kawasima/ss-26968240 同じく属性値の組み合わせた結果だけが残る
27.
抽象化出来ていないと認知負荷が高まる例 https://www.smbc.co.jp/hojin/eb/computerbanking/resources/pdf/gaikokusoukinirai_zenginformat.pdf 業務の用語とシステム都合の用語が混じり合う と、さらに凶悪になる
28.
抽象化に必要なこと type Suit =
"Club" | "Diamond" | "Spade" | "Heart" type Rank = "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "Jack" | "Queen" | "King" type Card = [ Suit, Rank ] type Hand = Card[] type Deck = Card[] type Player = { name: string; hand: Hand } type Game = { deck: Deck; players: Player[] } type Deal = (deck:Deck) => [ Deck, Card ] type PickupCard = (hand: Hand, card: Card) => Hand 前回のアーキ部 『Domain Modling Made Functional』の手法で本質的な状態とロジック を記述する のがオススメ。日本語訳に期待!
Download now