2 min read

技術的負債を抱えてまで、その機能をリリースする価値はあるか

技術的負債を抱えてまで、その機能をリリースする価値はあるか

スタートアップのソフトウェア開発において、「スピード」は正義とされることが多い。
多少実装が荒くても、まずは世に出し、ユーザーの反応を見ながら後からリファクタリングすればいい、という考え方。

そういった環境に身を置く中で、僕自身も「不確実性の高い状況では、完璧な設計を求めて手を止めるよりは、動くものを届けることのほうが価値がある」というスタンスで開発に向き合ってきた。

けれど、先日チームの同僚と設計やコードのレビューに関する議論をしている中で、この考え方をアップデートしなければいけないな、と感じる場面があった。

スピード重視のスタンスを、あらゆる機能開発に無条件で適用するのは乱暴だった、と思い直した形。

「とりあえずやってみる」のリスク

議論の中で気づかされたのは、機能の重要度によって、許容すべき「リスク(負債)」の基準は異なるはず、ということ。

例えば、プロダクトの死活問題に関わるような「絶対に必要な機能(Must)」であれば、多少アーキテクチャ的に強引な設計・実装が含まれていても、スピード優先でリリースする価値はある。それは必要な投資だと言える。

一方で、「あったほうがいいかもしれない・必要かどうかはわからない機能(Nice to have)」に関しては話が変わってくる。

これまでの僕は、「まあ、とりあえず入れてみて、様子を見てみようか」と、一律にスピードを優先してしまうことが多かった気がする。けれど、「効果があるかどうかわからない機能」のために、システムに技術的負債になりうる修正を混入させるのは、果たして割に合っているのか。

投資対効果でコードを見る

洗練されていないコードをシステムに組み込むことは、将来の保守コストを前借りすることに近い。

その機能追加によって得られるリターン(提供できるユーザー価値や、チームが得る学習)がどれくらいあるのか。それに対して、コードが複雑化し、将来の保守性が下がるというリスク(コスト)が見合っているのか。

僕のレビュアーとしての視点には、この「投資対効果」の観点が少し不足していたように思う。

「何でもかんでも、とりあえず1回入れてみればいい」というスタンスは、場合によっては思考停止になり得る。不確実な機能を試すのであれば、既存の設計にできるだけ影響しない形で行うべきだし、もし設計を歪める必要があるのなら、それに見合うだけの確信が必要なはず。

レビュアーとしての心構え

設計やPull Requestのレビューをする際、これまではコードの書き方や設計の妥当性、そしてデリバリーの速度にばかり目を向けることが多かった。これからは、その修正の「確信度合い」や「得られるリターン」にもしっかり目を向けていきたい。

  • この修正によって、我々は何を得ようとしているのか
  • そのリターンは、コードを複雑にするコストに見合っているか

そんな問いを、日々のチームでのソフトウェア開発の中で、常に意識していきたい。スピードを落とさずに、でも、システムに無駄や贅肉がつかないように。

自分やチームの中の新しい判断基準として馴染ませていきたいなと思う。