SlideShare a Scribd company logo
1 of 32
Download to read offline
地層化の力学
地層化とは
地層化とは
ある厚さと広がりをもった層状の岩体。主として堆積(たいせ
き)岩からなり、層理が見られる。
引用: weblio辞書
地層化とは
第一世代
第二世代
第三世代
第四世代
Framework A時代
No framework時代
Framework Aのv2時代
Framework Bの時代
コードにおける地層化とは
複数の時代に書かれたコードが積層化した状態を指す
地層化とは
第一世代
第二世代
第三世代
第四世代
深い層になるほど下記の傾向がでる
・テストのないレガシーコード
・誰も知識を持たないブラックボックス
・システムのコアになる機能を持つ
地層化とは
第一世代
第二世代
第三世代
第四世代
地層同士の依存方向は一方向ではなく複雑に絡み合っている
こともある
地層化とは
地層化とはシステム開発における技術的負債の一種になる
しかし、この地層化は一般的な技術的負債とは違い、技術的
な負債を返却しようとして生まれしまう負債になる。
地層化における問題点
地層化における問題点
前提として、私たちは売上を上げるために相関する重要指標
を持っている。
その重要指標を上げるための施作として機能開発を行ってい
る。
売上
指標1
指標2
機能開発
地層化における問題点
特定の機能を開発すれば必ず指標を向上できればいいが現実
はそうではない。いくつもの施作を行い指標が向上するもの
を探索的に行わなければいけない。
そのため指標を定常的に上げ続けるためには施作をどれだけ
打てるのか、アジリティを高めることが重要になる。
売上
指標1
指標2
機能開発 アジリティ
地層化における問題点
アジリティの構成要素としてFour Keysがわかりやすい。
詳細はGoogleの「エリート DevOps チームであることを
Four Keys プロジェクトで確認する」を参照すること
アジリティ
デプロイの頻
度
変更の
リードタイム
変更の障害率
サービスの復
元時間
地層化はこのFour Keysを落とし
アジリティを低下させる要因になる
地層化における問題点
地層化することで下記のようなことが発生する
・機能開発時に深層を読み解くのに時間がかかりデプロイ頻
度が低下する
・深層にある機能を知らないがためにレビュー時に変更漏れ
を指摘され変更のリードタイムが伸びる
・深層の変更漏れに気づかずデプロイし変更失敗率が上がる
・深層を誰も知らないため変更に時間がかかり、サービスの
復元時間が伸びる
- もしくは変更できずにインシデントを解決できない
地層化における問題点
地層化すると人員をスケールさせることも難しくなる
・レガシーコードを触れるメンタリティと技術力を持った人
員を採用する必要がある
- 市場では取り合いになるため難しい
・仮に採用できてもオンボーディングに時間がかかる
- その世代はどう実装されているのか
- その世代はどういう状態なのか
- 他の世代とどう関係しているのか
- 世代の数だけ全体の把握が難しくなる
・オンボーディングに時間がかかるとチームが受け入れられ
る人数が上限に達し、新しいメンバーをジョインできなくな
る
地層化における問題点
地層化することで加速度的に負債がたまり、アジリティの低
下から開発できない状態へと進んでいく
・技術的負債を返済したいが複雑すぎて返済できない
・または返済する難易度が高すぎて施作を長期に渡り止める
必要が出てくる必要があり負債の返済ができない
・深層を触らないように浅層でハック的な開発を行い負債化
・さらに負債を返却できないことから別システムも変更でき
なくなり連鎖的に負債化が進む
・負債が負債を呼ぶ状態
地層化する要因
地層化する要因
地層化は技術的負債の返却によって生まれる
このとき何らかの理由によって最後まで返却できない状態が
積層化することで地層となる
第一世代
第二世代
第三世代
第一世代 第一世代
第二世代
地層化する要因
積層化したあとに旧世代を知っている人間がチームから抜け
ることによって誰も触ることのできないブラックボックスが
生まれて地層化する
つまりチーム内にいる旧世代を知っている人員数が地層化す
るまでのカウントダウンになる
第一世代
第二世代
地層化する要因
技術的負債の返却が途中で止まる要因は下記のようなものに
なる
・古い層の解消を行わず、新しい層だけ追加する
・簡単なところからはじめて、難しいところで止まる
・空き時間に始めて空き時間がなくなる
・優先度の高い機能開発を差し込まれて後回しになる
・チームの解散、移動、退職により返却を行っていた人間が
いなくなる
地層化する要因
地層化は技術的負債を返却しようとする良い行いから生まれ
ている
時間経過によってシステムは負債化するため負債の返却を行
わないという選択肢はない
間違っているのは負債を返す手法になる
地層化を生まない技術
地層化を生まない技術
ここからは仮説になる
地層化を生まないために必要な要素は3つになる
・現世代のシステムをモダンに保つ
・新世代を作るさいに旧世代を解消できるように計画する
・組織として合意して人員を確保する
地層化を生まない技術
まず1つ目はシステムをモダンに保ち新世代を作ったときにマ
イグレーションしやすい状態にすることだ
・テストを書いて怖くて変更できないをなくす
・依存方向を一定に保ち置き換えやすくする
・疎結合を保ち依存を最小化する
・仕様を明確にし暗黙的な仕様をなくす
・コードの規模をリプレイスできる範囲の規模で維持する
・ライブラリなど継続的にバージョンアップできる状態にす
る
・などなど
変化できるシステムであることは大切になる
地層化を生まない技術
2つ目は必ず旧世代をなくすように計画することだ
そもそも世代が分かれるときは旧世代を触ることが難しく、
とりあえず新世代を作って開発生産性を維持しようとする行
為が多く見える
この行為は直近の生産性を高めるのには役立つが、長期的に
は地層の解消を難しくし、生産性を下げる行為になる
これは明確なバッドプラクティスであり、やってはいけない
行為になる
地層化を生まない技術
3つ目は旧世代の解消まで人員を確保し、計画することだ
エンジニアとしてはフットワーク軽く始めたいが、そうなる
と終わるのも軽くなってしまう。
技術的負債が貯まることはビジネスの継続性、成長率に影響
を与える重要事項として認識して組織的に取り組まなければ
ならない
地層化を生まない技術
と、言いつつ正直に言えばこんなことみんな分かってるし、
それでもできないのが現状だと思う
地層化を防ぐなんて人類には無理なんだ・・・
地層化を解消する技術
地層化を解消する技術
そんなものはない
地層化を解消する技術
基本的にはリプレイスで一気に置き換えるか、リファクタリ
ングで部分的に置き換えていくかの2択になる。
が、だいたい3世代ぐらいの地層化したところで、誰も仕様を
知らず、少し変更すると壊れ、触ることを拒絶する不可侵領
域の深層が生まれる。
こうなると既に負け戦に入っており、愚直に気合いと根性で
置き換えるしかない。
地層化を解消する技術
不可侵領域が生まれるときには各層は複雑に絡み合っている
ことが多く、一度のリファクタで解消できない
ケバブのようにいろんな方向から少しずつ削ぎ落とし、不可
侵領域を小さくしていく手法しかない
この戦略をケバブ戦略と呼びたい
(要は気合いと根性)
地層化を解消する技術
有効そうな方法のメモ
・unused コードの削除
・静的型付け、静的解析の導入
・テストの導入
・依存関係の分析
・ASTを使った一括変更
・仕様の再定義
これをやれば良いみたいな方法はない
少しだけ安全に、やりやすくするぐらい
まとめ
まとめ
からい

More Related Content

地層化の力学 書きかけ版