狠狠撸

狠狠撸Share a Scribd company logo
ソフトウェア
アーキテクチャ基礎
第2章 アーキテクチャ思考
2022/05/31 三浦
第2章 アーキテクチャ思考
「アーキテクチャと設計は決定的に違う。その違いがわかるか?
 ?君の思ってる“違い”とは多分全然違う」
「設計のメリットが言えたら開発者、デメリットまで言えたら
 アーキテクト」
「一週間後にもう一度来てください。アーキテクトがやる
 本当のコーディングを見せてあげますよ」
第2章 アーキテクチャ思考
いきなり煽ってしまいましたが、
煽りでなくこの章は神回
第1章の「良いこと言ってるっぽいけど抽象的で結局何を教訓にしてい
いんだか」なところを、一気に具体的にして「わかる」教訓にしてくれる
第2章を読んでから第1章をもう一回読むと「そういうことね!」
2.1 アーキテクチャと設計
従来のウォーターフォール開発でのよくある認識:
「アーキテクトがコンポーネント構造や開発スタイルを決定する
 それを受けて
 設計者(開発チーム)がクラス設計やUI設計をする」
この一方通行があらゆる問題を引き起こしている!
2.1 アーキテクチャと設計
アーキテクチャ特性もコンポーネント構造もクラス設計もUIも、
ぜんぶアーキテクトと開発チームが一緒に作っていくんでないとうまく
いかない。
アーキテクトの役目はその中でのリーダーシップ?メンタリング
とだけ言われても、抽象的すぎますか?
2.2 技術的な幅
リーダーシップとメンタリングと言われても抽象的?
そこで、アーキテクトの物の考え方の決定的な違いをみていく
知識の“深さ”と“幅”という話
この第2章は深さ、幅、それぞれについて論じる章で、
それを通じてアーキテクトってどんな仕事というのを示します
2.2 技術的な幅
知識には2段階ある
● わかっていること
● わかっていないとわかっていること
(その下に、「わかっていないとわかっていないこと」の深い海が続いて
3段階となる)
2.2 技術的な幅
● 「わかっていること」をより深めて維持していくのが
開発者のスキル
● 「わかっていないとわかっていること」を広めていき
その上で何かしらの専門性について深さも維持していくのがアー
キテクトのスキル
2.2 技術的な幅
開発者からアーキテクトにクラスチェンジするときにこの思考の転換に
失敗するとどうなるか
● どっちつかずになって死ぬ
● 古い専門知識とか偏った経験知に引っ張られてチームに理不尽を
押し付けてしまう(“氷漬け原始人アンチパターン”)
では、「広さ」の追求がどうして必要なの? というのが次の節とその次
の節
2.3 トレードオフを分析する
● 第1章でやったあれ
○ ソフトウェアアーキテクチャはトレードオフがすべてだ
○ アーキテクトが、トレードオフではない何かを見出したと考えているなら、まだ
トレードオフを特定していないだけである可能性が高い
どんな方式にもメリットとデメリットがあるはずよねということ
2.3 トレードオフを分析する
例に挙げられているオークション入札システムでは
入札イベントをいろんなサブシステムに食わせる。
そのときキューイングをどう設計するか?
● トピック(pub/sub)に入れて各サブシステムがsubする?
● 各サブシステムがキューを持ってイベントは各キューに入れる?
2.3 トレードオフを分析する
トピック(pub/sub)でやるメリットは
● 利用側サブシステムの追加が容易
● 疎結合性
これなら当然、
トピック方式が良いに決まってますよね!?
2.3 トレードオフを分析する
待って、デメリット、あるんじゃないの?
● 投げっぱなしなので、悪意あるサブスクライバがsubしていてもまっ
たくわからない
● イベントのデータ構造が固定されるので、追加情報がほしいみた
いな要件には対応不可能
● サブスクライバ側の処理遅滞が見えないから、詰まり対応がイベ
ント生成側では原理的に不可能
2.3 トレードオフを分析する
では、トピック方式は避けておくほうが無難?
ちがう、そうじゃない
→あくまで、「場合による」
 場合って何さ? それをちょっとだけ説明してくれるのが次の節
2.4 ビジネスドライバーを理解する
ビジネスドライバー = ビジネス的な開発動機、何が大事か
それを、アーキテクトがシステム開発の言葉に翻訳する。
スケーラビリティ、パフォーマンス、可用性? つまりアーキテクチャ特性
それが「場合」だ!
事業ドメイン知識を持つ必要があるのも政治を理解する必要があるの
も、まさにこの判断をするためである。
第2章のここまでのまとめ
● 幅広い知識によって「イベントを複数システムに分配する方式は
色々ありますが?」とメリデメをすべて挙げた上で
● 業務ドメイン知識から導き出したアーキテクチャ特性の優先順位に
即して「今回のプロジェクトの要求する優先順位にあっているのは
pub/sub方式ですね、pub/sub方式で行きましょう」
と判断できる人が、アーキテクトなんだ、と言っている!
2.5 アーキテクティングとコーディングのバランスを取る
前節までとは打って変わって、深さの方の話
アーキテクトも深い専門性を何かしら持っておけと言っていたわけだ
し、コーディングを続けないとそれを維持するのは不可能
で、アーキテクトらしいコーディング活動への関わり方とは?
2.5 アーキテクティングとコーディングのバランスを取る
プログラムの骨格部分のプログラミングはいきなり開発チームに任せてしまえ
アーキテクトは初期の簡単な機能をクイックに開発してみせる
メリット① 自分がスケジュールのボトルネックになるのを防げる
アーキテクト 開発チーム
メリット② アーキテクトの考えが伝わる
メリット③ 実装上の問題がアーキテクトに伝わる
2.5 アーキテクティングとコーディングのバランスを取る
ほかには、開発者感覚を持ち続ける方法として4つ挙げておくと
● 概念実証(Proof-of-Concepts: PoC)コードを書く。それも書き捨てではなくプロダクト品
質のコードを。(その心は:サンプルコードが結局本番に投入されがち+みんなのお手本
になりがち)
● 技術的負債の解消やアーキテクチャ改善のための裏方のコーディングを担当する。(そ
の心は:終わらなくてもイテレーション失敗に直接つながらない)
● バグ修正を担当する。(その心は:開発上の問題点の把握にもなる)
● 自動化とかの環境整備をやる
● コードレビューをする
5つあるじゃん!!!
第2章のまとめ
アーキテクトは、
● システムを構成する上での各方式のメリット?デメリットを把握して
● ビジネス上の動機から優先順位判断に落とし込めないといけない
● だから、深い専門性は持ちつつも専門外にもできるだけ幅広く「あれやこれがあ
る。詳細は知らんけど」という知識を持っておく必要がある
● 専門性の維持のためにも開発者としての仕事も続けないといけない。でないと氷
漬け原人になる。
● 開発だけに専念できない立場なりのコーディングへの関わり方がある

More Related Content

ソフトウェア アーキテクチャ基礎 輪読会資料 第2章 アーキテクチャ思考