SlideShare ist ein Scribd-Unternehmen logo
1 von 41
Downloaden Sie, um offline zu lesen
それはYAGNIか?
それとも思考停止か?
kawasima
ビジネス目標に応じてプロセスを適切に使い分けることがされる土壌が
整いつつあるといっても過言ではない状況といえるようになってきた
Agile or die
SoE SoR
市場に速く出して、
改善を繰り返す
十分よく計画して、
安定したシステム運用を
実現する
ここ10年での変化
「市場に速く出して、改善を繰り返す」方の
システム設計
タイム・トゥ・マーケット
正解なんて誰にも
分からないんだから
速く出して速く失敗しよう
「とにかく動かせ」
「お便利フレームワーク使って早く作れ」
「YAGNIだYAGNIっ」
YAGNI
You ain’t gonna need it.
(どうせ必要ないって!)
覚えたら、つい使いたくなる甘美な響き
もともとはFeatureについての要/不要の話が
転じてDesignについても議論されるようになった
ビジネスの成長と共にゴールは切り替わっていく
とにかくスピード 品質・生産性
時間がかかる
工数がかかる
リリースするたび本番障害発生
ますますYAGNIの判定は重要に
「YAGNI = 設計をサボって良い」では断じてない
「あとでクリーンにすればいいよ。先に市場にだ
さなければ!」
開発者たちはそうやっていつもごまかす。だが、
あとでクリーンにすることはない。市場からのプ
レッシャーはとまらないからだ。
クリーンアーキテクチャ
設計のサボりとYAGNI
ログ・例外設計
インタフェース設計
管理画面
リカバリの自動化
バリデーション
基本はリスクマネジメント
(発生確率×流出コスト)
データが貯まら
ないと意味をな
さない機能
データのパージ
SEO対策 メッセージの
変更リロード機能
2種類の非YAGNI
①それ、そもそも後回しにできないよ。
②今やっとかないと後でやるにはコストがかかり
すぎる。
後者を対象に今日は話をします
アーキテクチャ設計にどれくらい時間をかけるか
には統計に基づいた研究がある
プロジェクトの時間
= 開発時間
+ アーキテクチャとリスク削減時間
+ やり直しの時間
Making Software, How Much Architecting Is Enough?
コード規模によって
パーセンテージは変わる
技術的負債をおさえるための
非YAGNI
①インタフェースを使いDetailを分離する
②必要になるまで状態をもたない/持つ箇所を限
定する
③(誰のためにのデザインかを明らかにして、分類しまとめる)
最速インタフェース設計
~じっくりドメイン設計する時間がなくともここだけはやっておけポイント~
①区分値,ステータスを属性にもつデータの塊
②開発体制の境界
• 開発体制が分かれるところにインタフェースを定義して並
行開発する
③レイヤの境界
• 大抵はフレームワークの仕事
• 引数をインタフェースにしてテスタビリティをあげる。
④ホットスポット
• 不具合が集中的に発生する箇所を抜き出してテストしたり、作り
直して実装置換するためにインタフェースを作る。
区分値,ステータスを属性にもつ
データの塊
テーブルの中に「〜区分」や「〜ステー
タス」を見つけたら、それ扱うクラスで
は、必ずインタフェース作っておく
【例題】会員の種別によって料金や
サービスメニューが異なる
区分はまず増減しがちなので
たとえ数が少なくてもインタフェースを用意する
実装が1つしかなくても
インタフェースが必要か?
https://softwareengineering.stackexchange.com/questions/159813/do-i-need-to-use-an-interface-when-only-one-class-will-ever-implement-it/
実装の数が問題なのではない
ステータスも同様
ステータスもつデータの設計は
こちらをどうぞ
https://speakerdeck.com/kawasima/lu-li-wochi-tudetafalseshe-ji
業務ルール
ETC割引の計算ロジックを実装します。
●
平日朝夕割引
– 平日「朝:6時〜9時」、「夕:17時〜20時」
– 地方部
– 当月の利用回数が5回〜9回 30%割引、10回以上 50%割引
●
休日割引
– 普通車、軽自動車等(二輪車)限定
– 土曜・日曜・祝日
– 地方部
– 30%割引
●
深夜割引
– すべての車種
– 毎日0〜4時
– 30%割引 https://github.com/kawasima/kata
【例題】ETC割引のルール実装
上記の業務ルールにしたがい、割引率を計算するインタフェー
スDiscountServiceを実装して下さい。
public interface DisountService {
public long calc(HighwayDrive drive);
}
走行記録はHighwayDriveクラスで表現さ
れ、DiscountService#calcに渡されるものとします。 ま
た、割引率はパーセンテージの正の整数で表現されます。
割引ルールのインタフェースを以下のように定義し
各ルールをインタフェースに沿って実装する。
業務ルールは、「適用判定」と
「適用計算」のメソッドを分ける
のがポイント
そうすることで、割引の計算はルールが増減、変更になっても変わる
ことはなくなる。
※この形は業務システムにおいて頻出なので、KATAトレーニングして
身につけましょう。
開発体制の境界インタフェース
目指すところが「リソース効率」か「フロー効率」かで、
実際に並行で開発するかを決める
依存関係
開発順序
レイヤ境界のインタフェース
ログイン機能
<<Interface>>
認証
AuthRequest
+authenticate(AuthRequest)
LDAP認証
+authenticate(AuthRequest)
実際にはインタフェースと実装の
パッケージングを分ける
ログイン機能
<<Interface>>
認証
AuthRequest
+authenticate(AuthRequest)
LDAP認証
+authenticate(AuthRequest)
レイヤ間の通信がHTTPになっても
考えは変わらない
ログイン機能
<<Interface>>
認証
AuthRequest
+authenticate(AuthRequest)
LDAP認証
+authenticate(AuthRequest)
OpenAPIによる
API仕様
<<Interface>>
認証
AuthRequest
+authenticate(AuthRequest)
仕様からインタフェースを生成
ホットスポットのインタフェース
●
変更が多い箇所には、不具合の発生確率も高まる。
●
変更が多い箇所には、技術的負債も溜まっていく。
(これは最初の段階では読めないことが多いので、
考えすぎるのはYAGNIです)
とある有名な句
「不具合に/テストを書いて/立ち向かう」
1.手元で不具合を再現させる
2.コードを注意深く調べ、不具合を発生させている最小の部分を絞り込む
3.最小レベルで不具合を再現させ、不具合が修正されたら通るような自動テストコー
ドを書く
4.書いたテストコードを実行し、落ちることを確認する
5.不具合を修正する
6.書いたテストコードが通ることを確認する
7.全てのテストを実行し、不具合修正が他の部分を壊していないことを確認する
8.不具合箇所をリファクタリングしてTestabilityとDisposabilityをあげておく
https://t-wada.hatenablog.jp/entry/debugging-tests
ホットスポットの見つけ方
同時に変更されるものが、あちこちに分散しているのはSRPに反する
状態(ステート)
●
更新は最小限に。
●
状態の更新の向きは一方向に。
●
状態をもつ箇所を切り出す。
●
途中の計算結果は必要になるまでもたない。
分解して考えてみよう
状態をもつ箇所を切り出す
https://github.com/kawasima/bouncr
例)認証状態をリバースプロキシレイヤで管理して、後ろのアプリケー
ションをステートレスにするBouncr
途中の計算結果を保存すると…
●
性能限界が早くきやすい
●
性能でないときの対策が取りづらい
●
最初からオーバーエンジニアリングになりがち
【例題】価値観マッチングシステムの設計
いろんな人に価値観のアンケートを取ります。
例えば以下のような設問です。それぞれ、1 (そうは思わない) 〜 5 (とてもそう思う)を付けても
らいます。
Q1. お年寄りは運転免許を返上すべき
Q2. ラッシュ時のベビーカーはたたんだほうが良い
Q3. コンビニは深夜の営業やめた方が良い
Q4. 洗濯は晴れた日にまとめてやりたい
Q5. 電車が目の前で行ってしまったらかなりカチンとくる
この回答の値の距離で、各人の相性を測ることとします。
たとえば、
Aさんの回答 (Q1, Q2, Q3, Q4, Q5) = (1,2,3,4,5)
Bさんの回答 (Q1, Q2, Q3, Q4, Q5) = (3,3,3,3,3)
のとき、二人の相性は 1 - (abs(1-3) + abs(2-3) + abs(3-3) + abs(4-3) +
abs(5-3)) / 20 = 70% です。
(20で割っているのは5問あって距離の最大値が1問あたり4だからです)
こういうモデル
【例題】階層をもつメッセージ
親子それぞれで取得件数の
Limit定めたい
SQL1発で処理するようにしておいて、遅くなってきた
ら、パーティショニング/シャーディングで対処するの
が開発ボリューム抑えながらスケールさせていく近道
さいごに
ここでお話した設計は技法(テクニック)を
知っているかどうかであって、やると
工数が爆増するものではないのがミソです。
YAGNIの顔をした思考停止を
やっつけましょう

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
Tackling Complexity
Tackling ComplexityTackling Complexity
Tackling Complexity
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること
 
ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』
 
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
 
事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)
事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)
事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLiveDXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
 
心理的安全性を 0から80ぐらいに上げた話
心理的安全性を 0から80ぐらいに上げた話心理的安全性を 0から80ぐらいに上げた話
心理的安全性を 0から80ぐらいに上げた話
 
Oss貢献超入門
Oss貢献超入門Oss貢献超入門
Oss貢献超入門
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計
 
なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?
 
ChatGPTは思ったほど賢くない
ChatGPTは思ったほど賢くないChatGPTは思ったほど賢くない
ChatGPTは思ったほど賢くない
 
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
 

Ähnlich wie それはYAGNIか? それとも思考停止か?

今日から始めるアジャイル開発
今日から始めるアジャイル開発今日から始めるアジャイル開発
今日から始めるアジャイル開発
Takashi Takebayashi
 
アート・オブ・アジャイル デベロップメント ~組織を成功に導くエクストリームプログラミングの道~
アート・オブ・アジャイル デベロップメント ~組織を成功に導くエクストリームプログラミングの道~アート・オブ・アジャイル デベロップメント ~組織を成功に導くエクストリームプログラミングの道~
アート・オブ・アジャイル デベロップメント ~組織を成功に導くエクストリームプログラミングの道~
Fumihiko Kinoshita
 
第7回SIA研究会(例会)プレゼン資料 油野様
第7回SIA研究会(例会)プレゼン資料 油野様第7回SIA研究会(例会)プレゼン資料 油野様
第7回SIA研究会(例会)プレゼン資料 油野様
Tae Yoshida
 
第11回SIA例会プレゼン資料
第11回SIA例会プレゼン資料第11回SIA例会プレゼン資料
第11回SIA例会プレゼン資料
Tae Yoshida
 

Ähnlich wie それはYAGNIか? それとも思考停止か? (19)

Digital Business and Agile
Digital Business and AgileDigital Business and Agile
Digital Business and Agile
 
アジャイル開発の現在・過去・未来~今を知り、源流を訪ね、先を見据える~
アジャイル開発の現在・過去・未来~今を知り、源流を訪ね、先を見据える~アジャイル開発の現在・過去・未来~今を知り、源流を訪ね、先を見据える~
アジャイル開発の現在・過去・未来~今を知り、源流を訪ね、先を見据える~
 
Dev love関西「エンジニア×営業」営業マン8年目の本音
Dev love関西「エンジニア×営業」営業マン8年目の本音Dev love関西「エンジニア×営業」営業マン8年目の本音
Dev love関西「エンジニア×営業」営業マン8年目の本音
 
ふつうの受託開発チームのつくりかた
ふつうの受託開発チームのつくりかたふつうの受託開発チームのつくりかた
ふつうの受託開発チームのつくりかた
 
どうすれば小さなチームでも大きな成果を出せるのか
どうすれば小さなチームでも大きな成果を出せるのかどうすれば小さなチームでも大きな成果を出せるのか
どうすれば小さなチームでも大きな成果を出せるのか
 
AgileShimane始動!! in OSC2011Shimane
AgileShimane始動!! in OSC2011ShimaneAgileShimane始動!! in OSC2011Shimane
AgileShimane始動!! in OSC2011Shimane
 
SQiP2016 SIG8
SQiP2016 SIG8SQiP2016 SIG8
SQiP2016 SIG8
 
OutSystems Workflow Builder
OutSystems Workflow BuilderOutSystems Workflow Builder
OutSystems Workflow Builder
 
今日から始めるアジャイル開発
今日から始めるアジャイル開発今日から始めるアジャイル開発
今日から始めるアジャイル開発
 
re:日暮里アジャイル
re:日暮里アジャイルre:日暮里アジャイル
re:日暮里アジャイル
 
Agile Scrum at Knowledge Forum 2020
Agile Scrum at Knowledge Forum 2020Agile Scrum at Knowledge Forum 2020
Agile Scrum at Knowledge Forum 2020
 
Agile Overview In Ono
Agile Overview In OnoAgile Overview In Ono
Agile Overview In Ono
 
アート・オブ・アジャイル デベロップメント ~組織を成功に導くエクストリームプログラミングの道~
アート・オブ・アジャイル デベロップメント ~組織を成功に導くエクストリームプログラミングの道~アート・オブ・アジャイル デベロップメント ~組織を成功に導くエクストリームプログラミングの道~
アート・オブ・アジャイル デベロップメント ~組織を成功に導くエクストリームプログラミングの道~
 
Agile2010とは何だったのか
Agile2010とは何だったのかAgile2010とは何だったのか
Agile2010とは何だったのか
 
130216gis商談における営業プロセスの解説
130216gis商談における営業プロセスの解説130216gis商談における営業プロセスの解説
130216gis商談における営業プロセスの解説
 
第7回SIA研究会(例会)プレゼン資料 油野様
第7回SIA研究会(例会)プレゼン資料 油野様第7回SIA研究会(例会)プレゼン資料 油野様
第7回SIA研究会(例会)プレゼン資料 油野様
 
Introduction to Agile - how business and engineer team up
Introduction to Agile - how business and engineer team upIntroduction to Agile - how business and engineer team up
Introduction to Agile - how business and engineer team up
 
第11回SIA例会プレゼン資料
第11回SIA例会プレゼン資料第11回SIA例会プレゼン資料
第11回SIA例会プレゼン資料
 
アジャイル入門
アジャイル入門アジャイル入門
アジャイル入門
 

Mehr von Yoshitaka Kawashima

Mehr von Yoshitaka Kawashima (20)

ブルックスのいう銀の弾丸とは何か?
ブルックスのいう銀の弾丸とは何か?ブルックスのいう銀の弾丸とは何か?
ブルックスのいう銀の弾丸とは何か?
 
Are Design Patterns Dead?
Are Design Patterns Dead?Are Design Patterns Dead?
Are Design Patterns Dead?
 
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
 
ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?
 
ソフトウェア設計における 意思決定とそのレビューの秘訣
ソフトウェア設計における 意思決定とそのレビューの秘訣ソフトウェア設計における 意思決定とそのレビューの秘訣
ソフトウェア設計における 意思決定とそのレビューの秘訣
 
本番障害に至る病
本番障害に至る病本番障害に至る病
本番障害に至る病
 
システムダウンのひみつ
システムダウンのひみつシステムダウンのひみつ
システムダウンのひみつ
 
Mavenの真実とウソ
Mavenの真実とウソMavenの真実とウソ
Mavenの真実とウソ
 
アンチフラジャイルの世界
アンチフラジャイルの世界アンチフラジャイルの世界
アンチフラジャイルの世界
 
Atomic Architecture
Atomic ArchitectureAtomic Architecture
Atomic Architecture
 
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
 
ウォーターフォールとアジャイルのフェアな比較
ウォーターフォールとアジャイルのフェアな比較ウォーターフォールとアジャイルのフェアな比較
ウォーターフォールとアジャイルのフェアな比較
 
How to find tech books
How to find tech booksHow to find tech books
How to find tech books
 
Antifragile Java - Java Day Tokyo 2017 D1-E1
Antifragile Java - Java Day Tokyo 2017 D1-E1Antifragile Java - Java Day Tokyo 2017 D1-E1
Antifragile Java - Java Day Tokyo 2017 D1-E1
 
たとえ日本人同士でも必要な異文化理解力
たとえ日本人同士でも必要な異文化理解力たとえ日本人同士でも必要な異文化理解力
たとえ日本人同士でも必要な異文化理解力
 
SIerにとっての越境 @ DevLOVE 199
SIerにとっての越境 @ DevLOVE 199SIerにとっての越境 @ DevLOVE 199
SIerにとっての越境 @ DevLOVE 199
 
Antifragile Clojure
Antifragile ClojureAntifragile Clojure
Antifragile Clojure
 
Boilerplate vs Magic
Boilerplate vs MagicBoilerplate vs Magic
Boilerplate vs Magic
 
既婚プログラマの時間捻出術
既婚プログラマの時間捻出術既婚プログラマの時間捻出術
既婚プログラマの時間捻出術
 
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのかJavaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
 

それはYAGNIか? それとも思考停止か?