なんでこの記事を書こうと思ったのか
フロントエンド、バックエンドエンジニアをしています、ku6ryo です。ここ半年、社内で主にバックエンドの技術負債解消に取り組んできました。技術負債を解消しなければその先の継続的な機能追加、既存機能のメンテナンスが難しい(時間がかかる)と感じました。そのときに実際に製品のコードに触れていない人に説明する機会があり、わかりやすいと言われた例をシェアしたいと思います。
家の建築に例える - 技術負債自体の説明
技術負債とはどのようなものか、放置するとどのようになるかを説明する場合。サービス開発、メンテナンスを家の建築に例えて説明します。住んでいる人がユーザー、建物自体が機能とします。(実際の家の増築とは厳密には違うことをご容赦ください)
1軒の家があります。夫婦二人で建てた立派ではないですが二人で住むには十分な平屋の家で、快適なマイホームぐらしに幸せを感じていました。
5年経ち、子供が二人増えたので増えたので将来子供が大きくなったときに備えて二階を増築を計画しました。もともとあった屋根に穴を開けて階段を作り、屋根の上に簡単なフローリングシートを敷いて床とし、二部屋の子供部屋を増築しました。もともと重量に耐えられるような設計をしていない屋根だったため、多少のきしみがあり、2階の歩く音が1階に聞こえましたが我慢できる範囲だったので気になり始めたあとも補強はしませんでした。(このとき家自体が傾いていたのですが、その事には誰もきづいていませんでした。)
それから10年経ちました。子供が大きくなり、子供の友達が遊びに来ることがしばしばできました。ある日、子供とその友達が子供部屋で飛び跳ねて遊んでいました。すると突然床が抜け、友達がおっこちてしまったのです。幸いその友達には怪我はありませんでしたが、二階の床にぽっかり穴が空いてしまいました。使えなくなってしまった子供部屋を修理するのにお金もなかったのでとりあえず穴をダンボールで塞いでその周りをガムテープで固めました。大人が上から乗っても問題なく修理できたので、とりあえず良しとしました。子供には今後絶対2階で騒がないようにと注意しました。
さらに5年後、父親の両親の老後に備えて3階に移り住める部屋を増築することになりました。二世帯住宅のように個別のトイレ、ベッドルーム、キッチン、バスルームを作る予定です。お金もたっぷり準備し、建設が始まりました。一ヶ月後トイレ、ベッドルームができました。
さて、キッチンに取り掛かろうとしたところ、作業中に大きな音がしました (´゚д゚`)。なんと二階の床全体が大きく凹んでいたのです。二階を増築したときに十分な補強をしなかったために3階の重量に耐えられなかったのでした。お金は十分用意していたので、工期は伸びますが2階の床を補強してから3階を作る計画に変更しました。無事キッチンが完成しました。残すはバスルームだけです😃バスルームの建築に取り掛かりました。そうするとまた大きな音がしました (´゚д゚`)。今度は家がぐらつきました。慌ててみんなが外に出ると、家が少し傾いていました。原因を調査してみると、土地の地盤が弱く沈んでしまったようでした。
家に住むのもままならず、建築中の3階は一旦建築中断せざる負えない状況に陥りました。家族全員はホテルに退避し、3階を撤去しました。その後の作業で家の傾きは直ったものの、二階の床の補強と、傾きの修繕でお金を使ってしまい、3階の再建築は断念することとなりました。
技術負債とは、後の作業をするまで見えずらい、または、うすうす気づいているが放置してしまった設計の不良点であると言えます。負債が溜まっていると、新たな機能を追加しようとしたときに、その解消に時間をとられて本当に実装したい機能が追加できないという自体に陥ります
どうすればよかったのか?
結末からみると、地盤が一番大きな問題なので、家を建てる前に解消しておくべきでした。ただし家を建てる時点(サービスを始める)でお金(リソース)が潤沢にない場合が多いです。では、どの時点で解消ができたのでしょうか?
この話の中では、二階を増築するフェーズがあります。このとき増築するお金があるということは地盤補強に回す手もあったということではないでしょうか?例えば二部屋増やすところを一部屋にして、地盤を直す費用に当てるなどです。また、3階の増築のタイミングでも同じことが言えると思います。3階の機能を減らして、やり残した地盤の補強や2階の床の補強などにお金を回すことで、建てかけの3階を失うという自体はさけられたのではないでしょうか?
#最後に
システム構築をしていく中で、ご自身の環境でこの話がしっくり来ると思う部分があればその説明につかっていただければ幸いです。