システム開発の世界において「技術的負債(Technical Debt)」は繰り返し話題になり、しばしば炎上しています。
技術的負債という概念の生みの親は Ward Cunningham (ウォード・カニンガム)です。彼は 1992 年にオブジェクト指向プログラミングの国際カンファレンス OOPSLA '92 の Experience Report でコードの初回リリースを負債に例えました("Shipping first time code is like going into debt")。
Ward Cunningham はソフトウェアの世界に多くの貢献を果たしてきました。Wiki の発明者であり、XP と TDD の父 Kent Beck の師匠のような存在であり、建築の世界の「パタン・ランゲージ」を Kent Beck と共にソフトウェアに輸入した人であり、「アジャイルソフトウェア開発宣言」の著者の1人でもあります(詳しくは書籍『パターン、Wiki、XP ~時を超えた創造の原則』や 君はWard Cunninghamを知っているか? 前篇、後篇 を読んでみてください)。
では Ward が技術的負債という概念を発明した背景には何があったのでしょうか。彼はどう考え、なぜこの概念を生み出したのでしょうか。実は Ward は技術的負債の背景を説明した5分弱の動画を 2009 年に YouTube に投稿しています。
そしてこの動画の文字起こしが wiki.c2.com(つまり Ward 自身が開発した世界最初の Wiki) に上がっていましたので、この文字起こしをベースに翻訳を行いました。
【翻訳】負債のメタファー
メタファー
メタファー(比喩)が思考にどのような影響を与えるかについて興味を持つようになったのは、 George Lakoff と Mark Johnson による『Metaphors We Live By』(訳注: 邦訳は『レトリックと人生』)がきっかけです。その本から学んだのは、人間は自分の言語で使われているメタファーから類推して思考しているということです。
負債
負債(Debt)のメタファーを発明したのは、当時の自社プロダクト WyCash (訳注: 債権ポートフォリオ管理システム)で進めているリファクタリングについて上司に説明するためでした。 WyCash は Digitalk Smalltalk で開発して市場に投入したばかりのプロダクトで、そのとき私が重視していたのは、アプリケーションを開発していく過程で得られた学びを蓄積するためにプログラムに手を入れることでした。私たちはあたかも最初から何をすべきか知っていたかのように、そして Smalltalk ではそれがいとも簡単にできたかのようにプログラムに手を入れ続けていたのです。
上司に説明するとき、(WyCash が)金融系ソフトウェアだったので金融の例え話を使い、それを「負債のメタファー」と名付けました。どういうことかというと、「もしも自分たちが書いているプログラム(WyCash)を、金融の世界に関する正しい捉え方だと自分たちが理解した姿と一致させることができなくなれば、自分たちは絶えずその不一致につまずき続けることになり、開発スピードは遅くなっていくでしょう。それはまるで借金の利子を払い続けるかのようです」と説明したのです。
スピード
借入をすれば物事をより早く前に進めることができるようになりますが、そのかわり返済し終えるまでは利子を払い続けることにもなります。私はお金を借りるのは良いアイデアだと、つまりソフトウェアを急いで世に出し、それによって学びを得るのは良いアイデアだと考えていました。次第に日常に戻ってきたら、もちろん借金を返済していくことになるでしょう。すなわち、そのソフトウェアについての学びを深めるにつれてリファクタリングを行うことで、得られた経験をプログラムに反映していくのです。
負担
私は、ソフトウェアを急いで世に出して学びを得たにもかかわらず、その学びをプログラムに反映しない、つまり借金で言えば全く返済をしないケースが多々あると考えています。
当然ながら、借金を返済せずにいれば、クレジットカードに例えるなら次第にすべての収入が利子の返済に回されるようになり、購買力はゼロに近づいていきます。
同様に、長い間プログラムにただ機能を追加するのみで、それら機能に関して学んだ知識を反映する整理整頓を怠っていたならば、次第にプログラムからは知識が失われ、作業にかかる時間はひたすら長くなっていきます。言い換えるなら、すべて利子で食い潰され、進捗はゼロに近づいていくでしょう。
アジリティ
多くのブロガーが負債のメタファーのことを、後できれいに書き直すつもりなら雑なコードを書いてもいいという考え方と混同し、かつその考え方こそが負債の原因であると説明しています。
私は雑なコードを書くことには全く賛成しませんが、たとえ理解が不完全だとしても、目の前の問題に対する現時点での理解を反映するコードを書くことには賛成です。
理解が不完全な段階でもソフトウェアを開発して借入をできるようになりたいならば、そのソフトウェアに現時点での理解を可能な限り反映させることが重要です。そうしておけば、いざリファクタリングをするときが来たなら、コードには当時何を考えていたかが明快に残っているので、現在の理解に合わせてリファクタリングするのも容易になります。
言い換えるなら、負債のメタファーで大事なのは返済してメタファーを味方につける力であり、それは問題を理解するに従ってリファクタリングしていけるような、十分にきれいなコードを書いているかどうかで決まるのです。
筋の良い方法論であり、XP(エクストリームプログラミング)の核心であるとも思います。数ある説明の中でも負債のメタファーは、XPがなぜ機能するのかをうまく説明しています。
(翻訳おわり)
翻訳してみて
訳してみて驚くのは、 Ward Cunningham が言っていることが一般的にイメージされている「技術的負債」とは結構違うことです。
「技術的負債」という言葉から想像されるものは「リリース優先で雑なコードを書いたものの、結局はきれいに書き直されていないコード」や「古くなってしまった技術基盤(言語やインフラやフレームワーク)」ではないでしょうか。 Wikipedia には「行き当たりばったりなソフトウェアアーキテクチャと、余裕のないソフトウェア開発が引き起こす結果」ともあります。しかしこれらは誤解から生じていると Ward は言います。
Ward の言う負債の悪影響とは、開発と共に得られていく知識や理解と目の前のシステムとの乖離が引き起こす生産性低下のことであり、自分たちが書いているコードの保守性(あるいは、雑さ)のことではありません。むしろコードを書くときには常にそのときのベストを尽くせと言っています。
Ward にとって負債の返済手段はリファクタリングであり、リファクタリングの目的は自分たちのドメイン理解と現時点のプログラムの乖離の解消です。つまりこのリファクタリングとはドメイン駆動設計(DDD)における「より深い洞察へ向かうリファクタリング(Refactoring toward deeper insight)」のようなものと言えるかもしれません。ドメイン駆動設計のテーマは「ソフトウェアの核心にある複雑さに立ち向かう」でしたね。もちろん乖離の解消のスコープはリファクタリングにとどまらず、リアーキテクティングも含まれるのではないかと思います。
「負債」という言葉は、経営に近い人ほどポジティブな印象を持ち(資本のイメージ)、純粋な技術面に近い人ほどネガティブな印象を抱く(借金のイメージ)傾向があるように思われます。Ward が語っている負債のメタファーはどちらかというとポジティブなものです。ソフトウェアを素早く何度もリリースし、経験や仮説検証から学びを得る開発手法は、現代では一般的なものになりつつあります。しかも Ward が負債の比喩を使ったのは、たまたま彼と彼の説明相手が同じ金融系ソフトウェアを開発していたからなのでした。しかしその後「負債」という強い言葉が独り歩きして、現在の技術的負債のイメージを作り上げたのではないでしょうか。
ちなみに Ward が負債のメタファーを生み出すきっかけとなった WyCash のリファクタリングは Kent Beck に強いインスピレーションを与え、後の著作『テスト駆動開発』に登場することになります(『テスト駆動開発』の「はじめに」のメインエピソードとして WyCash のリファクタリングをとりあげ、第1部のテーマ「多国通貨」は WyCash のドメインオブジェクトが題材となっています)。
また、 Ward は終始一貫して Debt としか言っておらず、 "Technical" がついていません。では "Technical" をつけたのは誰で、それは何故なのかも興味が出てきましたが、まずは翻訳を世に出すことを急ぎたいと思います。
追記: 公開から90分で有力情報が得られる
C2wikiのTechnicalDebtを見るとDave Smithという人が書いたみたい。 @johannarothman も "Technical debt, as defined by my colleague Dave Smith, is the debt ... " と言ってる。https://t.co/tMOsCUfaWQ
— 角 征典/Masanori Kado (@kdmsnr) 2020年6月23日
FYI: @t_wada
@kdmsnr さんありがとうございます!
参考文献
パターン、Wiki、XP ~時を超えた創造の原則 (WEB+DB PRESS plusシリーズ)
- 作者:江渡 浩一郎
- 発売日: 2009/07/10
- メディア: 単行本(ソフトカバー)
- 作者:ベック,ケント,アンドレス,シンシア
- 発売日: 2015/06/26
- メディア: 単行本
エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)
- 作者:エリック・エヴァンス
- 発売日: 2011/04/09
- メディア: 大型本
レガシーソフトウェア改善ガイド (Object Oriented Selection)
- 作者:クリス・バーチャル
- 発売日: 2016/11/11
- メディア: 単行本(ソフトカバー)
Ward Cunningham による説明動画とその文字起こしはライセンス Creative Commons — Attribution 3.0 Unported — CC BY 3.0 の下に公開されており、このブログエントリもそれに準ずるものとします。