ボトルネック #01:技術的負債

技術的負債の蓄積;実験と近道が核となる要素

2022年3月9日


Photo of Tim Cochran

ティム・コクランは、Thoughtworksの米国東部市場担当テクニカルディレクターです。ティムは、小売、金融サービス、政府など、さまざまな分野でスタートアップや大企業での業務を19年以上率いてきた経験があります。彼は、組織に対して、デジタル変革の目標を達成するための技術戦略と適切な技術投資についてアドバイスしています。彼は、開発者エクスペリエンスの熱心な提唱者であり、それを改善するためにデータ駆動型のアプローチを用いることに情熱を注いでいます。

Photo of Carl Nygard

カール・ニーガードは、Thoughtworksのテクニカルプリンシパルです。カールは、GIS/リモートセンシング、サプライチェーン、リアルタイム制御、オンライン教育、小売、政府向けのソリューションを構築するスタートアップから大企業まで、20年以上のチームを率いた経験があります。彼は、最適化されたソフトウェアデリバリープラクティスを通じてビジネス成果を達成するための技術戦略を策定するために、組織と協力しています。


創業初期において、スタートアップは優れたプロダクトマーケットフィットを探します。それを見つけると、急速な成長を目指しますが、これはスケールアップとして知られる段階です。この時期には、収益、顧客、従業員数など、多くの側面で急速に成長します。Thoughtworksでは、このような多くのスケールアップ企業と協力しており、私たちの仕事は、この成長を妨げるさまざまなボトルネックをどのように克服するのを支援するかに焦点を当てています。

この作業を行う中で、私たちは一般的なボトルネックに気づき、それらに対処するためのアプローチを学びました。この記事は、これらのボトルネックを検証するシリーズの最初の記事です。各記事では、スタートアップがボトルネックに陥る原因、通常はスタートアップの初期段階で必要な適切なことを行うことで、成長によって働き方が変化すると、もはや適切でなくなることを調べます。スタートアップがボトルネックに近づいているか、またはボトルネックに詰まっていることを示す重要な兆候を強調します。その後、スケールアップが適切な潜在能力を発揮できるようにする変化について説明し、ボトルネックを打破する方法について説明します。

このシリーズでは、まず技術的負債について見ていきます。製品/市場適合の迅速な実験を促進するツールやプラクティスは、成長が始まると変化する必要があることを示しています。

どのようにしてボトルネックに陥ったのですか?

私たちが遭遇する最も一般的なスケーリングのボトルネックは、技術的負債です。スタートアップは、技術的負債が成長の主な妨げであると定期的に述べています。「技術的負債」という用語は、一般的に、技術プラットフォームとスタックの改善が必要であることを示す、包括的な用語として使用される傾向があります。彼らは、機能開発の遅延、品質の問題、またはエンジニアリングの不満を経験しています。スタートアップチームは、成長段階での技術投資の不足が原因で発生した技術的負債に起因すると考えています。技術的負債の種類と規模を把握するには、分析が必要です。コードの品質が悪い、古い言語やフレームワークが使用されている、または製品のデプロイと運用が完全に自動化されていない可能性があります。解決策としては、チームのプロセスに若干の変更を加えるか、アプリケーションの一部を再構築するイニシアチブを開始することが考えられます。

慎重な技術的負債は、特にスタートアップの初期段階では、健全で望ましいものであるということを言っておくことが重要です。スタートアップは、製品の配信速度のために、品質や堅牢性などの技術的な側面をトレードオフする必要があります。これにより、スタートアップは最初の目標である、実行可能なビジネスモデル、実績のある製品、および製品を愛する顧客を達成することができます。しかし、会社がスケールアップを目指すとき、私たちはとった近道に対処する必要があります。さもなければ、ビジネスに非常に迅速に影響を与えるでしょう。

私たちが遭遇したいくつかの例を見てみましょう。

会社A – スタートアップは、投資家にとって十分な証拠(ユーザートラフィック、ユーザー感情、収益)を示し、次の資金調達ラウンドを確保したMVPを構築しました。ほとんどのMVPと同様に、高品質の技術アーキテクチャではなく、ユーザーフィードバックを生成するために構築されました。資金調達後、そのパイロットを再構築するのではなく、機能に焦点を当てることで牽引力を維持し、その上に構築します。スタートアップには、鋭いエッジを理解し、会社を存続させるために絆創膏ソリューションを適用できる小規模な上級チームがいるため、これはすぐには問題にならない可能性があります。

チームが機能開発に焦点を当て続け、負債が返済されない場合に、問題が発生し始めます。時間の経過とともに、低品質のMVPはコアコンポーネントになり、改善または交換するための明確な道筋がありません。コードを学習、作業、サポートすることに摩擦があります。チームまたは機能セットを効果的に拡張することがますます困難になります。エンジニアリングリーダーは、元のエンジニアの離職と彼らが持っている知識の損失について非常に神経質になっています。

最終的に、技術投資の欠如が表面化します。チームは麻痺し、速度の低下とチームの不満で測定されます。スタートアップは大幅に再構築する必要があり、それは機能開発を遅らせ、競合他社が追いつくことを意味します。

会社B – この会社は元エンジニアによって設立され、すべてを「正しく」行いたいと考えていました。最初からスケールアウトできるように構築されました。最新のライブラリとプログラミング言語を使用しました。きめ細かいアーキテクチャを備えており、アプリケーションの各部分を異なるテクノロジーで実装でき、それぞれが完全にスケールするように最適化されています。その結果、会社が到達すると、ハイパーグロースに簡単に対応できるようになります。

この例の問題は、作成に時間がかかり、機能開発が遅く、多くのエンジニアが製品ではなくプラットフォームの開発に時間を費やしていたことです。また、実験も困難でした。きめ細かいアーキテクチャは、既存のサービスアーキテクチャに適合しないアイデアを実行することが困難であることを意味していました。同社は、顧客ベースの規模に到達するためのプロダクトマーケットフィットを見つけることができなかったため、高度にスケーラブルなアーキテクチャの価値を認識していませんでした。

これらは、Thoughtworksのスタートアップチームが協力してきたさまざまなクライアントの複合体に基づいた2つの極端な例です。会社Aは、会社を麻痺させた技術的負債のボトルネックに陥りました。会社Bは、開発を遅らせ、学習につれて迅速にピボットする能力を損なうソリューションを過度に設計しました。

どちらのテーマも、技術投資と製品デリバリーの適切なバランスを見つけることができないことです。理想的には、慎重な技術的負債を利用して、迅速な機能開発と実験を推進したいと考えています。アイデアが価値があると判明したら、その技術的負債を返済する必要があります。これは非常に簡単に述べられていますが、実際に行うのは難しい場合があります。

適切なバランスを作成する方法を探るために、さまざまな種類の技術的負債を調べていきます。

典型的な負債の種類

技術的負債はあいまいな用語であり、純粋にコード関連として見なされることがよくあります。この議論では、技術的負債を、短期間の機能開発のために技術プラットフォームへの長期的な投資をトレードオフしている技術的なショートカットを意味するために使用します。

コード品質
脆弱で、テストが難しく、理解が難しく、ドキュメントが不十分なコードは、すべての開発および保守タスクを遅くし、エンジニアのやる気を低下させながら、コードを書く「楽しみ」を低下させます。別の例は、現在のビジネスモデルに適合しないドメインモデルと関連するデータモデルであり、回避策が必要になります。
テスト
ユニットテスト、統合テスト、E2Eテストの不足、または誤った配布(テストピラミッドを参照)。開発者は、コードが既存の機能と依存関係を破壊しないという確信をすぐに得ることができません。これにより、開発者が変更をバッチ処理し、デプロイ頻度が低下します。大きなインクリメントはテストが難しく、バグが増えることがよくあります。
結合
モジュール間(モノリスでよく発生します)、チームは互いにブロックする可能性があり、デプロイ頻度が低下し、変更のリードタイムが増加します。1つの解決策は、サービスをマイクロサービスに引き出すことですが、独自の複雑さが伴います。モノリス内で明確な境界を設定するより簡単な方法があるかもしれません。
未使用または価値の低い機能
通常、技術的負債とは考えられていませんが、技術的負債の症状の1つは、扱いにくいコードです。機能が増えると、開発者が設計する必要がある条件、エッジケースが増えます。これにより、配信速度が低下します。スタートアップは実験しています。実験(機能)が機能しているかどうかを常に確認し、機能していない場合は削除する必要があります。感情的には、チームが判断を下すことは非常に難しい場合がありますが、機能の価値を定量化する客観的なデータがあれば、はるかに簡単になります。
古いライブラリまたはフレームワーク
チームは、新しい改善を利用できなくなり、セキュリティ上の問題に対して脆弱なままになります。スキルの問題が発生し、新入社員のオンボーディングが遅くなり、古いバージョンでの作業を強制される現在の開発者が不満を感じるようになります。さらに、これらのレガシーフレームワークは、さらなるアップグレードとイノベーションを制限する傾向があります。
ツール
多くのメンテナンスを必要とする、最適ではないサードパーティ製品またはツール。状況は常に変化しており、より効率的なツールが市場に参入している可能性があります。開発者は、自然に最も効率的なツールで作業したいと考えています。購入と構築のバランスは複雑であり、残りの負債を考慮して再評価する必要があります。
信頼性とパフォーマンスエンジニアリングの問題
これは、顧客体験と拡張能力に影響を与える可能性があります。私たちは、将来の仮説的な状況に合わせてスケールアップするとき、時期尚早な最適化に無駄な労力があったため、注意する必要があります。スケールできる未証明の製品よりも、ユーザーにとって価値があることが証明された製品を持つ方が良いでしょう。これについては、「スケーリングのボトルネック:信頼性と監視を念頭に置いて構築されていない」の記事で詳しく説明します。
手動プロセス
製品配信ワークフローの一部が自動化されていません。これは、開発者ワークフローのステップや、本番システムの管理に関連するものである可能性があります。注意:投資に見合うほど使用されていないものを自動化するために多くの時間を費やすと、この逆になる可能性があります。
自動デプロイ
初期段階のスタートアップはシンプルな構成で済ませられますが、これは早急に対処すべきです。小さなインクリメンタルなデプロイが実験的なソフトウェアデリバリーを促進します。4つの主要な指標をガイドポストとして活用してください。少なくとも1日に1回、通常は必要に応じてデプロイできる能力を持つべきです。
知識の共有
有用な情報が不足していることは、技術的負債の一種です。新しい従業員や依存チームがすぐに業務を開始することを困難にします。標準的な慣行として、開発チームは簡潔に記述された技術ドキュメント、API仕様、およびアーキテクチャに関する意思決定記録を作成する必要があります。また、開発者ポータルや検索エンジンから発見可能である必要があります。アンチパターンとしては、品質を確保するためのモデレーションや非推奨化プロセスがないことが挙げられます。

それは本当に技術的負債ですか、それとも機能ですか?

スタートアップは技術的負債に圧倒されているとよく言いますが、詳しく調べてみると、実際には技術プラットフォームの機能の制限を指しており、これには計画、要件収集、および専任のリソースによる適切な対応が必要です。

例えば、Thoughtworksのスタートアップチームは、顧客のオンボーディングを自動化するプロジェクトでクライアントと協力することがよくあります。彼らは、自動化がほとんどないシングルテナントのソリューションを持っているかもしれません。これは最初はうまく機能します。開発者は手動でアカウントを設定し、インストール間の違いを追跡できます。しかし、クライアントが増えるにつれて、開発者にとって時間がかかりすぎるようになります。そこで、スタートアップは顧客アカウントを設定するために専任の運用スタッフを雇うかもしれません。ユーザーベースと機能が成長するにつれて、異なるインストールを管理することがますます難しくなります。顧客のオンボーディング時間が長くなり、品質問題が増加します。この時点で、デプロイと構成を自動化するか、マルチテナントのセットアップに移行すると、KPIに直接影響します。これは機能です。

他の形式の技術的負債は、特定が難しく、直接的な影響を示すのが難しい場合があります。例えば、扱いにくいコードや、繰り返しの手動プロセスなどです。それらを特定する最善の方法は、日々の業務でそれを経験しているチームからのフィードバックを得ることです。チームの継続的改善プロセスで対応でき、修正するために専用の取り組みは必要ありません。

スケーリングのボトルネックに近づいている兆候

価値リードタイム

ユーザーに価値を提供するためのエンドツーエンドのプロセスと、その時間の経過に伴う傾向を観察することで、技術的負債と他の問題との間の摩擦が浮き彫りになります。

エンドユーザーへの影響

システムにおけるレイテンシー、顧客のオンボーディング時間、および品質問題は顧客に影響を与えます。技術的なショートカットが根本原因である可能性があります。

エンジニアリングの満足度

システムには複数の製品があります。1つはユーザーが体験するもので、もう1つは従業員や開発者が体験するものです。開発者の不満に耳を傾けることで、技術プラットフォームにおける根本的な問題が浮上し、最も影響を与えるものを優先順位付けすることができます。

新規開発者のオンボーディング能力

オンボーディングプロセスと新しい開発者の満足度を見ることで、長期的な従業員が避ける習慣を身につけている問題を表面化させることができます。

非機能的指標の低下

ランタイムインフラストラクチャのコスト、パフォーマンス、および可用性は、過剰な技術的負債がビジネス成果に影響を与えていることを間接的に示す可能性があります。

すでにこれらの兆候が見られる場合は、製品ロードマップで改善への投資対象を特定できます。技術的負債の最大の悪影響は、将来の製品に必要なプラットフォームの箇所によって引き起こされるでしょう。

どのようにしてボトルネックから抜け出すのですか?

技術的負債に対するチームのアプローチは、リーダーが設定した技術戦略に基づくべきです。それは意図的で明確であるべきであり、時間の経過とともに再評価されるべきです。残念ながら、チームが過去の指示に基づいて作業し、気づかずに将来の問題を引き起こしている状況をよく目にします。このような状況の企業にとって、現在の戦略を再評価するタイミングは、いくつかの機会によって一般的にトリガーされます。

  • 新たな資金調達は、より多くの機能とより多くのリソースを意味します。これにより、現在の問題がさらに悪化します。現在の技術的負債への対処は、資金調達計画の一部である必要があります。
  • 新しい製品の方向性により、以前の仮定が無効になり、システムの新しい部分にストレスがかかる可能性があります。
  • 優れたガバナンスプロセスには、テクノロジーの状態を定期的に再評価することが含まれます。
  • 新しい意見は、「茹でガエル」問題を回避するのに役立ちます。外部からの支援、チームのローテーション、新しい従業員は、新鮮な視点をもたらします。

滑りやすい坂道

なぜ多くの技術的負債を抱えることになったのでしょうか?原因を特定するのは非常に難しい場合があります。通常、それは1つの出来事や決定によるものではなく、むしろプレッシャーの下で行われた一連の決定とトレードオフによるものです。

皮肉なことに、後から考えると、それぞれの決定が当時知られていたことに基づいて、その時点で下されたものだと考えると、間違いだとは考えにくいでしょう。しかし、1つの譲歩が別の譲歩につながり、品質に深刻な問題が生じるまでそれが続きます。技術的負債を解決するのにかかる時間が、インクリメンタルな価値を開発するのにかかる時間よりも長くなる転換点が一般的に存在します。

回復は困難であり、状況は雪だるま式に悪化する傾向があります。開発者が現状を許容できるものとして使用するのは自然なことです。このような状況では、新しい機能を開発すると、さらに負債が増えます。これは滑りやすい坂道であり、残念ながら、次の機能を実装するための労力が非線形的に増加するにつれて、崖につながる悪循環です。

品質基準を設定する

多くの組織は、企業が技術進化を導くためにコミットしている一連の標準と慣行を持つことが有益だと考えています。いくつかの技術的慣行、例えば継続的デリバリーは非常に達成が難しいことに留意してください。ユーザーに影響を与えることなく定期的にデプロイすることは、技術的に困難です。チームは初期段階で問題を抱えることが多く、それに対応してリーダーシップは慣行の優先順位を下げるかもしれません。代わりに、私たちは逆を推奨します。より頻繁に実行することで、チームは慣行を習得し、強い習慣を形成するでしょう。困難な時が来た場合、慣行を中止するのではなく、フィードバックを使用して、チームの能力に対する将来の投資を導いてください。

影響範囲

ビジネスを拡大するためにショートカットを取ることが必要であることを私たちは受け入れます。これらのショートカットが解決されるか、完全に再構築される必要があることを知っているとして、どのようにして影響範囲を限定するのでしょうか?明らかに、ビジネスへの影響を制限する戦略が必要です。1つの方法は、チームとシステムを分離することです。これにより、チームは隔離された技術的負債を導入でき、上記のように必ずしも雪だるま式に悪化することはありません。

分離に関する質の高い文献は豊富にあるため、ここでは説明を試みません。マイクロサービスとドメイン駆動設計手法に注意を集中することをお勧めします。ただし、あまり早くやりすぎないように注意してください。分離はシステムにレイテンシーと複雑さを追加し、チーム間の不適切なドメイン境界を選択すると、コミュニケーションの摩擦が生じる可能性があります。今後の記事では、複雑すぎる分散アーキテクチャに関連するアンチパターンについて書きます。

プロダクトとエンジニアリングの連携

ビジネス戦略、製品、エンジニアリングの間でトレードオフの会話がバランスよく行われない場合、技術的な品質が最も早く低下し、その結果、最終的に製品の品質も損なわれます。このボトルネックの根本原因を調べると、ほとんどの場合、企業内のビジネス、製品、エンジニアリングの目標間のバランスに行き着きます。コラボレーションの欠如は、通常、真空状態で行われた近視眼的な意思決定につながります。これはどちらにも当てはまる可能性があります。重要な分野で手抜きをしたり、価値のないものに過剰な装飾を施したりする可能性は等しくあります。

  • あらゆる時点におけるビジネス戦略は、明確かつ透明である必要があります。
  • 私たちは、ビジネスに利益をもたらす意思決定を行うために、チームリーダーをエンパワーメントします。
  • 製品とエンジニアリングは対等な立場で互いに信頼し、ビジネスへの長期的および短期的影響に基づいてトレードオフの意思決定を進んで行う必要があります。
  • 意思決定はデータに基づいて行われます。例えば、技術プラットフォームの現状、見積もり、期待される価値とKPI改善の分析、ユーザー調査、A/Bテストの結果などです。
  • データが改良されたり、新しい発見があったりすると、意思決定は見直されます。

技術的負債の影響を制限するための技術戦略

スタートアップの戦略と、それがどのようにスケールアップするかを考えるとき、私たちは、スタートアップの発展のさまざまな段階を理解するために、4段階モデルを使用することをお勧めします。

フェーズ1

実験

プロトタイプ - 製品を実証するための準機能的なソフトウェア、関心の高まりに伴い機能的なものに移行

フェーズ2

牽引力の獲得

エコシステムの決定 - クラウドベンダー、言語の選択、サービス統合スタイル

コアシステム用のプロトタイプソフトウェアを置き換え

初期基盤の構築 - 実験、CI/CD、API、可観測性、分析

幅広いドメインを確立し、初期のソフト境界(コード内)を設定

フェーズ3

(ハイパー)グロース

独自のサービスを管理する分離された製品チームを作成

製品の顧客体験に関するシグナルにリンクされた、SLAと品質基準を確立

製品チームの有効性に焦点を当てたプラットフォームチームを確立

フェーズ4

最適化

長期的な生産性とメンテナンスに焦点を当てたSLAと品質基準を再評価

技術プラットフォームの状態を監査し、製品チームでのイニシアチブを後援し、最大の技術的負債を修正するために一時的なタイガーチームを作成

効率向上のための機能を再構築または購入

優れた技術品質の実践についてチームをトレーニング

技術的負債にどのように対処しますか

それは、ビジネスの現状、現在の製品の方向性、現在のスケーリング能力に関する指標、顧客が製品について言っていること、顧客サポートと運用が見ていることなど、透明性の高い情報の共有から始まります。この情報により、技術者は情報に基づいた意思決定を行うことができます。現在の課題のデータを共有することで、技術者は問題に対処する理由を知り、成功を測定することができます。

すべての製品とその関連システムに対して明確なエンドツーエンドの所有権が必要です。チームが成長し、それぞれの分野に対する責任を負うにつれて、エンドツーエンドのジャーニーに対する明確な所有権がないことがよくあります。これにより、多くの場合技術的負債で埋められる技術的なギャップが残ります。チームが成長し、新しい任務を負うにつれて、古いコードの所有者を見つけることがますます難しくなります。さらに、所有権がないと、チームは問題の解決に意欲を失います。

私たちは、問題を解決するためにチームをエンパワーメントする必要があります。技術的負債の解決は、製品開発の自然な流れの一部である必要があります。エンジニアとプロダクトマネージャーは、技術的負債と機能の間で健全なバランスを適切な実用的なメンタリティで交渉する必要があります。技術的に健全な製品を維持し、持続可能にすることは、製品チームの仕事の一部であり、後回しにするものではありません。技術的負債に継続的に取り組み、監視するための合意されたプロセスが必要です。これには、安定したバランスを維持するために、エンジニアリングリーダーとプロダクトリーダーの間で難しいトレードオフが必要です。

チームトポロジーを適切に設計することも要因となりえます。たとえば、特定の領域で技術的負債が継続的に発生しているとします。その場合、チーム設計が間違っている可能性があり、強力な所有権と注意が必要なプラットフォームまたはビジネス機能が存在する可能性があります。

いくつかの指標は強力です。たとえば、一般的な間違いをスキャンしたり、ビルドおよびデプロイ時間を測定したりすることです。エンジニアリング組織は、チームがシステムを迅速に統合できるセルフサービスツールを提供する必要があります。指標は、管理者が監視またはインセンティブを与えるためではなく、技術的負債について意思決定を行うためのチームのガイドとして使用する必要があります。経験豊富な開発者は、利用可能なデータを解釈し、事実に基づいた定性的な情報で直感を裏付けることで価値を提供します。

私たちは自律的なチームを信じていますが、過度の自律性は問題になる可能性があり、技術的な状況が混乱する可能性があります。自動チェックやアーキテクチャのピアレビューなど、軽量なチェックとバランスがあり、ポリシーの適用と開発者の支援に役立ちます。

組織が技術的負債に対処する方法は、状況によって異なります。多くの組織で共通して見られるテーマの1つは、「何かをしなければ」という願望であり、多くの場合、その場しのぎの処置になり、すぐに独自の摩擦が生じます。代わりに、反復的なアプローチを取り、技術的負債の解決への投資を導く現在の開発活動と組み合わせた指標を使用することで、より良い結果が得られることがわかりました。

概要

  • 初期段階のスタートアップにとって、賢明な技術的負債を負うことは必要であり、健全なことです。
  • あなたの技術的負債がビジネスを制約する兆候(価値リードタイムやエンジニアリングの満足度など)を探してください。
  • 明確な技術品質基準を持ち、チームがそれを守れるようにしましょう。
  • 技術的負債のプロセスを作成し、明確なオーナーシップと、情報に基づいた意思決定を行うための透明な情報にアクセスできる権限を与えられたチームを作りましょう。
  • 特にKPIに直接結び付けることができる場合は、必要な技術プラットフォームの改善が技術的負債として偽装されている可能性があります。
  • スタートアップの成長過程における重要な局面(新規資金調達、新製品の方向性、新規従業員)では、特に技術的負債戦略を継続的に再評価しましょう。

謝辞

この記事は、多くの同僚からのコメントや提案によって大幅に改善されました。Martin Fowler、Tom Marsh、Andrew Buchanan、Ryan Puskas、Ahmet Sakar、Ryan Sawson、Kennedy Collins、Shea Clark-Tieche、Thomas Donahue、Christopher Hastings、Yue Liangに感謝します。


大幅な修正

2022年3月9日: 記事の残りの部分を公開

2022年3月8日: 「ボトルネックにどのように陥ったのか?」「スケーリングのボトルネックに近づいている兆候」を公開