技術的負債
Technical Debt
自分たちが書いているプログラムの状態
そのドメインに対する理想的な状態
どういうことか?
ソフトウェアを作るとき、その時点で持っているドメインの理解をコードに反映して出荷する
開発を進めるうちに、ドメインについての理解が深まる
ところが、コードは古い(浅い)理解のままになっている
この「今の理解」と「コードに埋め込まれた古い理解」のズレが負債である
そのズレを放置したまま開発を続けると、古い理解の上に積み重ねることになり、「利子」を払い続ける
生産性が落ちる
リファクタリングとは、深まった理解をコードに反映し直して、この負債を返済することである
つまり、負債は避けられない・意図しないもので、学びの副産物である
金融的な「負債」のメタファー
金融の負債が負債である理由は3つある
① 元本がある
借りた額 = 現在の理解とコードのズレ
② 利子が発生する
返さない限り、毎回よけいに払わされる
③ 返済できる
元本を返せば利子が止まる
重要なのは②である
理解とコードがズレているだけ①なら、放っておいても痛くない場面もある
しかし、そのズレたコードの上に次の機能を積む時に、毎回「本当はこういう構造なんだけど、コードはああなってるから…」と頭の中で変換しながら書く
この変換コストを払い続けるのが利子である
利子を払い続ける(=ズレたまま作り続ける)と、ズレた理解を前提にしたコードがさらに積み上がる
→ 借金が借金を呼ぶ
なので、リファクタで元本を返そう ③
つまり、物理的な汚いコードのことを指しているわけではない
極端な例を考えると、
ある時点で、プログラムとドメインが完全に一致していて、プログラムがきれいだったとしても、
その後、ドメインに対する知識が増えたが、プログラムを更新しない、となった時
プログラムはキレイだが、技術的負債がある、と言える
プログラムが綺麗かどうかではなく、ドメイン知識を正しく反映しているかどうかが肝
参考
誤解が生じてると何が問題か?
病気によって必要な薬が異なり、いろんな病気を一括りにしてしまうと薬の選択が難しくなるように、いろんな問題を「技術的負債」の傘の下に一括りにしてしまうと対応を間違ってしまうので、言葉の厳密な定義を持っておくべきだということ。ref これは誤解の問題ではなく、ある名称が指す範囲の問題ではないのか
誤解がなくても起きうる問題なんじゃないの
Ward が語っている負債のメタファーはどちらかというとポジティブなものです。 ref そうなのか?どの文章からそう読み取れるのか #?? Wardの主張は前提に「ドメインとコードを一致させるのが最も理想的な状態」がある
「負債」と言った時、その状態から離れているのでポジティブじゃなくない?
面白い事例
コード量が膨れ上がってメンテできなくなったので開発終了
技術的負債の発生理由の分類へ言及してる
ボトムアップにコードをキレイにしていく
大きなシステムを寒いステムに分解し、サブシステム単位で置き換えていく
ゼロから書き直す
https://gyazo.com/32aea87356b7d8c86189fd7f01a8a35c https://speakerdeck.com/mtx2s/internal-quality-issues-caused-by-organizational-design?slide=12