アプリの設計にレイヤーを取り入れる前の問いかけ
#チェックリスト #設計 #問いかけ
何事も境界をきれいに切ろうとすると、絶対に隙間が生まれてしまう。境界が見えてしまうと、どうしてもその手前でブレーキをかける。境界部分のオーバーラップとインタラクション設計が重要。
メタ認知のための問いかけ
レイヤの存在意義を明確にする
なんの課題のために必要で、どうやってテストするか
話し相手がいないならKeichobotやLLMsに話す
説明責任を果たす
説明や前提条件を客観的に行う
概要→具体の順を守る
結論に引きづられないように注意する
コンウェイの法則
レイヤが欲しくなるというのは、チームが大きくなりすぎている前兆なのかもしれない
まず考えること
不確実性や複雑性は隠蔽するのではなく向き合い方を知るべし
開発組織を十分に小さくする
機能単位で別プロダクトレベルに切り離す意識の構成にする
パッケージング#63f56bc4866030000091b0b0
レイヤはほとんどケースでは開発者が恣意的に作り出したものということを自覚する
技術ドリブンでやらない
機能を構成に依存させない
意思決定にチームを巻き込む
本質的な対象の性質を理解することと集合知を形成するためのコミュニケーションに投資する
Simple or Easy
「このレイヤはドメインの複雑さをどうSimpleに解決しようとしているのか?」
これが言語化できないならまだドメインの理解が足りない
SLAP原則
実装をEasyにするレイヤは何も解決しない
オーバーエンジニアリング, カーゴカルトプログラミングにきをつける
レイヤ化しすぎると開発生産性の低下、リグレッション管理の問題が多発する
長期的にROIを上回るのか?
共通化と抽象化
データと振る舞いは切り離す
関数型プログラミング
足るを知る
技術でき解決できることは限られており、大抵の場合はソフトウェアの外に問題がある
複雑さはどこからやってくるのか
ドメインと技術基盤の乖離による冗長化や認知負荷増加
開発効率と理解容易性はトレードオフの関係にある
ゴリゴリのレイヤードアーキテクチャ
マッシュアップ系のサービスで外部依存がかなり多い、といったケースでは有用
単純なクラサバだとクライアントとサーバーの依存を切り離す旨味が少ない
宣言的UIのデータアーキテクチャはコンポーネントを中心に考える
実装に慣れていないジュニアへのレールとして
意味は成さない
属人性は低い方がよいが、属"技能"性はそうではない
可読性、理解容易性、正しさへの迷いは作業者のバックグラウンドに依存する
あまりにも落とし穴(というか制約)が多い
制約理論(TOC)
基本的には「やるべきこと」よりも「やらないこと」を決めるほうが行動に繋がりやすい
→ベスト/グッドプラクティスよりもアンチパターンを優先的に理解する
いくつかシンプルな原則がある #設計原則
副作用とドメインを切り離す
コンポーサブル
プログラム以外にもあらゆる観点でメンタルモデルと一致した状態を目指す
単方向データフロー(unidirectional data flow)
軽量DDDのようなDDDの技術的な側面だけに焦点を当てたものはアンチパターンだと思われる
モデリングやドメインと問題空間と解決空間をおざなりにしてはならない
変化に対する"想定外"や"考慮漏れ"が多発する
ドメインの変化を考慮していない
その時点のスナップショットとなるためスケール時に形骸化していく
その結果は責務が肥大化
関連: ハードシングスを引き起こしたHype Driven Development(HDD)
不確実性に対する不安とどう向き合うか
推測するな計測せよ
変更容易性など幻想
自身の経験上は(特にフロントエンドは)改修がコードに閉じることは稀であり価値単位の改修になる
ユーザーにとっての振る舞いの変化こそが価値であり、前提条件が変わったら内部構造も変わる
制約や前提条件が変われば0から価値を見直して書き直す
不安をPRで管理する
アーキテクチャよりもPRや普段の思考、チームメンバの些細な意識変化に目を向ける
レビューの目的は教育や品質の担保ではない
仕様上の小さなトレードオフやちょっとした機能がボトルネックになることがある
データ構造と振る舞いを切り離す
koushisa.icon
冷静に、落ち着いて考えよう
誰が書いても同じコードというのは目指さない
過剰なアーキテクチャが生まれる背景
大事なのはレイヤーではなく、関心事の分離
関心の単位や文脈を持つ世界と持たない世界の境界
結合を最小化するのも責務を単一化するのも、命名にこだわるのも、全てはETC(変更しやすくする)原則のため
パッケージングへ考えをダンプした