技術的負債を生み出さない方が良い、という劇的かつ情けない議論がしばしば行われます。はい、もちろんない方が良いです。しかし、その影響はまだ取り除くことができます。
私が技術的負債と呼んでいるのは、すべての変更と缓和、インフラストラクチャの変更とプロセスの変更、ギャップを解消することを需求としたチーム構造の変更(製品発売の枠組み内で意識的にまたは無意識に行われた)、および時間の経過とともに大きく干渉する機能です。
そして、このような問題は、生産部門と運用部門の確固たる勇气に満ちたチームプレイがなければ解決できないため、この話は可以直接 DevOps に関するものです。
技術的負債 - 誰のものですか?
しかしまず、問題の本质上から、なぜ私は技術的負債について話しているのでしょうか?なぜなら、企業がそのために時間を割り当ててくれないことに越来越に腹を立てているからです。この赤いスレッドは、すべてのレポート、ミートアップ、開発者と運用間のコミュニケーションを通じて実行されます。
邪悪でひどい企業は、技術的負債に取り組む時間を割り当てません。 「品質はまったく必需ないのではないか?」という其中の疑問さえ生じます。过去を見据えて、私は「誰も品質を必需としていない」と言うでしょう。しかし、この考えは少し後で明らかにします。
この状況を深入分析するために、なぜ企業が私たちにこのようなことをするのかを考えてみましょう。答えを得るには、誰が技術的負債を抱えているかを考える必要性があります。誰がその責任を負うのでしょうか?
何年も関わってきた後、私たちは皆に指輪を展示するフロドのようなものであることに気づきました。 「この重荷を負うのを手伝ってください!」というようなものです。私たちは、企業が私たちに技術的負債への対処を望んでいる(まさにそれを望んでいる)のを待っています。しかし、企業との之间誤解の压根原因は、企業が決してそうしたいと思わないことです。
私たちにとって、それはエンジニアリングの課題であり、製品の桌越性を向左させる方式 であり、さらには製品に対する誇りを高めるメカニズムでもあります。しかし、ビジネスにとって、それは常に蛊惑であり、時間を費やさなければならない用得着悪(または根本)です。
あなたがタクシーに乗ったとき、運転手が「洗車場に停めてもいいですか?」と尋ねたと想像力してください。
この状況におけるビジネスはクライアントであり、開発者はタクシーの運転手です。
- 業者は「どうして?! 私が交通費を払っているのに、あなたは洗車に行くのですか!」と憤慨しています。
- これに対し、タクシーの運転手は「いい匂いがするきれいな車に乗りたくないですか?」と当然のことを言いました。
- 業者はこう答えます。「もちろん、そう思います!でも、私はデフォルトでそれを期待しており、そのために今すぐ洗車場に立ち寄る準備はできていません!」
これが企業が技術的負債を扱う形式です。洗車場に立ち寄ってみないかという建议のようなものです。タクシーを注文するときは、清潔なサロンか高級なサロンを也希望するかに応じて適切なカテゴリーを選択します。注文の段階では投資するつもりですが、洗車場に立ち寄るのはそうではありません。
なぜなら、先ほども言ったように、誰も品質を求めていないからです。しかし、それはデフォルトで美景されています。
それは絶対需要です。企業は洗車場に行かないことを諦めることはできませんし、自分の時間を犠牲にして洗車場に行くこともできません。どうしようか?ビジネスは機関車です。機能、販売、顧客が需要です。私たちの「欲しい」「望む」だけでは、技術的負債を企業に売ることは不可以能です。しかし、別の策略でビジネスを動機付けることは有机会です。
これまでの旅の過程で、私は技術的負債を「買う」ビジネス動機として 3 つのカテゴリーを造成しました。
- 「太った」無関心。裕福な投資家がいる場合、CEO は変なオタクの開発チームを雇う余裕があります。 「まあ、彼らにやってもらいましょう! 重要的なのは製品を结束させることです。チームのスピリットは素晴らしい、すべてがクールです、そして私たちは世界里で高のオフィスになるでしょう。」というようなものです。
私の考えでは、これはクールなフリースタイルですが、技術的負債には現実主義が一定なため、しばしば惨事につながります。現実的に行わないと、误认クールな建築のリヴァイアサンを制作してしまいます。
- 恐れ。これは、技術的負債の最も効果的で、広く普及し、効率的なモデルの 1 つです。怖いとき、ここでどんな「願望」を語ればいいのでしょうか?それは、障害やハッキングによってクライアントが離脱したなど、何かが起こったときのことです。そしてそれはすべて、低品質、ブレーキ、またはその他のせいです。しかし、恐怖をあからさまに売りつけるのも良くありません。恐怖を伴う憶測は信頼に反します。できるだけ誠実に、慎重に販売する必要があります。
- 信頼。それは、企業が技術的負債に取り組むのに必要なだけの時間を与えてくれるときです。信頼が機能し、維持されるのは、あなたが慎重に全体のシェアを小さくし、時間をかけてできるだけ現実的である場合に限られます。そうしないと信頼が崩れてしまいます。しかも溜まらない。一定のプロセスには波があり、信頼が高まったり、消えたりします。
次に、私の経験と、私と私の素晴らしいチームにとって何が機能しているかについて説明します。
技術的負債のウサギの穴はどれくらい深いのか?
3 年之前に新しい会社に入社したとき、この技術的負債がどれほどのものであるかを领悟する一定がありました。企業やパートナーからのリクエストも含めたリクエストの統計からその存在的を知りました。般的に何を扱っているのかを领悟する一定がありました。
これは、技術的負債に対処するための大多数かつ義務的な初始のステップです。初始に見つけたものを急いで実行すべきではありません。状況を全部的に研究する用不着があります。
そのとき見た內容に基づいて、更本的な問題の 1 つは大規模なコードの結合であると推測しました。今ではこのプロセスに全員が関与することは少なくなりましたが、当時は加工制作チーム全队を集めて、アプリケーション スイートでどの層を強調したいかを校正していました。
私たちのアプリケーションには少なくとも 80 の異なるコンポーネント (インストールではなくディストリビューション) がありました。状況を掌握した後は、対処する一定要がありました。
フェーズ 1. 仮想チーム
とても賢い私は、全員に時間があるふりをして、各コンポーネントを中心站に仮想チームを結成するというアイデアを思いつきました。 「皆さん、どのコンポーネントを誰が责任しますか? それを调理する最简单的方法について建议を作为してください。」 というようなものでした。しかし、网络化力を維持するために、私たちは全員で起初のフェーズを最適化するための基準を策定しました。
- 疎結合
- コスト効率の高い拡張性
- 新しい開発者の簡単な接続 (シンプルかつ明確な原則: このコンポーネントで正確に何ができるか、何ができないか、さらに誰もが「触れる」ことができないコードの分離)
- 必要に応じて外部 API を使用する機能
- 提案された技術スタックのアクセシビリティ
- 現在のソリューションにおける QuickWin の最適化
- 監視とトラブルシューティングが容易
- 監査 + ライセンスの純粋性原則
- バージョン管理と陳腐化の原則
もちろん、これは聚焦ではなく、ソフトウェア開発のほぼすべての側面に対する一連の基準でした。リスト全体员工は、「すべてを修复してください」という 1 つのフレーズに置き換えることができます。
この段階は単に何も起こらなかったという预兆で大失敗に終わりました。就有バックログを通じて計画を立てようとしていたため、いくつかのことの実装はほとんど進みませんでした。任務は明白并不能だった。それらは手動で作業に进入されました。私にとってもチームにとっても大変なことであり、対立や議論が絶えず増大していることにすぐに気づきました。
ということで、フェーズ2に進みました。
フェーズ 2. 技術的負債は私のものです
フェーズ 1 では、バックログ クォータを導入することに当社の CEO と征得しました。 70% をビジネス上の問題に、15% を欠陥の消去に、15% を技術的負債に費やします。
次に、前のフェーズで、全員が問題に責任を負う場合、その問題に責任を負う人は誰もいないことに気づきました。これは決して青臭い声明函ではありません。私身体はそれが好きではありません。しかし、その逆には、越来越に高いレベルの熟透度とチームワークが必备です。そこで私は技術リーダー制度管理を創設することにしました。
しかし、私は単にコンポーネントの技術リーダーに名人を任免したわけではありません。私は可能な限り私の期盼を説明し、開発パスを定義し、本番環境の状況については彼らに責任を負わせました。本番環境でコンポーネントが乱七八糟しても、OPS の専門家は目を覚ましていません。状況を解決しようとしているのはあなたです。
そして私たちは出発しました。技術リーダー(責任者)がいて、技術的負債の15%のノルマ(時間はあります)があります。しかし、現実は結局どうなったのでしょうか?
私たちが刚开始的に坦然面对したのは、FinTech、コンプライアンス、職務分掌があるということでした。つまり、私と開発者は生産にアクセスできず、定義上生産にアクセスできないということです。それなのに、私は「皆さん、生産現場の状況の責任はあなたたちにあります!」と言います。
人々にログを与えましょう!
人々に責任を与えるときは、彼らの手にツールを与えてください。そして、それが私たちが OPS 専門家と協力して行った起初のことであり、技術者がコンポーネントのログを確認できるようにログを具备しました。
そして、私たちは本当に協力的な取り組みを行いました。これは、運用と開発が連携する DevOps への一歩です。エクスプロイトではログ転送 (Kibana など) が設定されましたが、開発ではログに機密情報 (個人データなど) が含まれていないことを確認する相应がありました。
5% は幸運だと考えられています...
現実には、15% のノルマがあるにもかかわらず、「パートナーは今すぐ相应としている」という原由で、すべてのスプリントでビジネス クライシスと緊急の释放が発生し、そうでないと退職してしまいます。もちろん、この技術的負債は较早にスプリントから押し出されます。その結果、スプリントは 0% になりました。
15% のスプリントもありましたが、技術的負債は平衡して 5 ~ 8% しかありませんでした。プログラマは実装にどれくらいの時間がかかるかを知ることができないため、これは大きな問題です。
私としては、すべてのチームの空气中にたゆまぬ凧揚げをすることで、この状況を救おうと努めました。各スプリントの詳細なメトリクスを収集する最简单的方法を学び、最後にスプリントを確認しました。
スプリントのハッキングとは、技術的負債の割り当てが組織的に違反されることです。 1 回のスプリントでノルマが達成されなかったとしても、すべてが悪いというわけではありません。確かに、さまざまな状況があるため、柔軟な対応が必要性です。
しかし、それが組織的に繰り返されたとき、私は生産の専門家を集めて議論し、割り当てが合意されたものであるため、それがいかに比较重要であり、容認できないかを説明しました。そのモデルでプロセスを動かすのが私の毎日の仕事でした。
そしてそれは動きましたが、今ではこのアプローチには独自一个人の关键な欠点があると私は考えています。
アプローチの限界
プロダクトオーナーは、バックログはすべて自分たちのものであり、すべてのタスクは自分たちによって調整されるという事実に慣れています。「割り当ては適切ですが、この技術的負債の割り当てでチームが何をするかを決めるのは私たちだけです!」
そして、開発者がリファクタリングや成型文の削除などのタスク (強力な接続性について思い出してください) を思いついたとき、「何?! 成型文って? 何のことを言っているの?!」という論理的な反応がありました。
その結果、タスクは、技術的負債と呼ばれる可能会性はあるものの、经济条件付きでベンダーにとって不利于なタスクに置き換えられました。だからこそ、私は厳しい態度をとってこう言わざるを得ませんでした。「技術的負債は私のものです。そして、それは各スプリントの技術的負債の割り当ての各製品チームの技術的負債に含まれると主張します。」
そうやって私たちは生きてきました。通常に生活中し、仕事もしていましたが、我不信感は強くなっていきました。私たちが何かを行い、それが何であるかを誰にも言わず、ビジネスタスクに時間を費やさなかった場合、私たちがどのような結果をもたらすかは誰にとっても难以判断確です。
技術的負債の割り当て产出率に関する統計が急増していたため、私たちは大規模なプロジェクトを実行できないという事実に坦然面对しました。さらに、大規模なプロジェクトには複数のチームが必要性になることがよくあります。各製品チームは自社の製品に聚集しており、その現実に生きているため、これも切勿能でした。それらを複雑なトピックにドッキングすることは切勿能です。
また、誰もスプリントにオペレーションを含めていませんでした。本番環境のようなスプリントやバックログはありません。彼らは生産に関するタスクに忙殺されていますが、それは群体の計画には含まれていませんでした。そして、本番環境に展開するための小さな技術的負債の範囲内で開発が行われた場合、それはかなり長い間 OPS の规范要求に残る将会性があります。
なぜなら、彼らには本当に時間がなく、追加のタスクが課せられ、仕事ができなくなったからです。
しかし、このアプローチにはマイナス面もありましたが、私たちはかなり多くのことを達成しました。
このアプローチで何が達成できたのでしょうか?
まず、自動テストの筋肉量を構築しました。 CI プロセス全队を急剧に再設計することで、私たちはそれを恥ずかしくない公德的なプロセスにしました。
次に、多くのコンポーネントでスパゲッティ コードとの戦いを実装することに成功的英文しました。
モジュール化を行い塑型文を削減しました。これらのタスクは、恐怖灵异があっても企業に売り込むことはできません。製品の技術ギャップにこれらの問題が含まれており、それらを修复する有需要がある場合 (問題がある場合は、这一に修复する有需要があります)、製品を販売しようとする有需要さえありません。それは「技術的負債 - それは私のもの」モデルを通じてのみ、割り当てを通じてのみ実行できます。
私は多くの試みを見てきましたが、曾经のフェーズでは自分自我で別の技术でやろうとしました。うまくいきませんでした。
実際、このモードでの作業は長時間続けることはできません。それは、CTO およびチームリーダーとしてあなたを信頼して、経営陣があなたに与える限られた白紙の決断です。
フェーズ 3. 正当なプロジェクト
次に、技術的負債に取り組むための「恰当な」プロジェクトであるフェーズ 3 を開始しました。本质生活条件は、クローズドクォータから脱却し、相通の製品バックログを通じて計画を立て(つまり、製品每个者がこれらのプロジェクトを実行する有必要的があることを認めている)、クリーンセールに移行するということでした。これを実現するために、次の 2 つのことを行いました。
- このプロジェクトの枠組みの中で、私たちが着手する仕事の範囲を可能な限り絞り込みました。
- 私は本番環境で何のために戦うのかについて具体的な期待を立てました。私たちのタスクはできる限り実用的で、理解しやすく、ビジネスの観点からサービスに役立つものでなければならないため、これは理想主義の完全な拒否でした。
重要性な点は、私たちは技術的負債のビジネス価値を計算しようとしているような錯覚を抱いているということですが、これはめったに能够ではありません。それでも計算できる場合は、悪夢のような技術的負債が有着することになります。
ビジネスには、負の値よりも正の値の方が効果的です。 「このクライアントは去っていきます。彼は大金をもたらしてくれます」と言ったとしても、彼が去るまでは機能しません。それはビジネス上の価値ではありません。また、リスクを承知で仕事をする人文精神がまだあまり高くないので、「辞めるまで損はしない」というモードです。
ビジネス価値を示す这个必要もありません。どこで見せられるかというと、技術的な価値を見せられるのは計算されたものだけ。
技術的負債の売却方法に関するガイド
技術的負債を販売するこのフェーズのワークフロー全部を次に示します。
重点分野を選択してください (1 つだけ)
これは可怕によって販売されているため、ビジネスに実際に影響を与える分野を選択してください。常用性、やり直しの加速度、A/B テストと実験の健康性、やり直しのコストなど、分野はさまざまです。坐果な数の分野とトピックがあります。
私の場合、アクセシビリティを選択したのは、それがビジネスの注目を集めており、当社のサービスにある数量の影響を与えるためでした。自分の考えを薄く広げたり、トピックを 1 つだけ選択したりしないことが最重要です。
統合分析を行う
私はその年の常用性とインシデントの統計を探讨一下し、年間を通じて発生したすべての状況についてすべての事後探讨一下を詳細に探讨一下しました。その後、私は技術的に能够な限り、しかし再び実質的に取り組む这个必要があるものについて、トップレベルの能够理解を生成しました。
适用性の第二のルールは、常に再生利用有可能なシステムを構築しようとするのではなく、インシデントが発生したときに備えられるようにすることです。それが私たちが保証しなければならないことです。
适用性の 2 番目の問題および差不多ルールは、劣化協定です。いつか何かが必ず起こるので、展示する機能の那部を放棄することを犠牲にしても、サービスを維持する準備ができていなければなりません。この合意はプログラムレベルも含めて維持されなければなりません。
3 番目の問題は、監視と可観測性に関するものです。これは、インシデントの発学生の及时な地址既定と応答の検出時間です。不安定なテストが基本上ある場合は、モニタリングを信頼するのをやめる必要条件性があります。本番環境のテストに、「5 分経っても電源が入らない場合は電話してください」などのサービス デスクの対応に関する指示灯が含まれている場合、本番環境の状況を監視していることにはなりません。テストはできる限り明確にする必要条件性があります。「それは、どこかに問題があることを示しています。それでは、行きましょう!」
コンポーネントごとの分析を行う
この的のために、私たちは社会各界向とコンポーネントに対して重要的に何を行うかを策定しました。これは、サービス メッシュをどこにドラッグするか、監視をどのように変更するか、何を基準にするかを预示します。ここでは約 15% を列挙しましたが、実際にはプログラムの有效改善が数多くあります。
すべてを準備しましたが、まだ市場に出すことはできません。それを当众と公開するために、私たちはこのフェーズの各プロジェクトに対して次のことを行いました。
実質的かつ定量的な指標の策定
私たちは酶联免疫法的な指標を尤其に恐れています。酶联免疫法的な指標で開発者の仕事の質をどのように測定できるのでしょうか?酶联免疫法的指標に対しては多くの議論がありますが、それを真一些正面から受け止めるべきではありません。
価値をビジネス上の価値としてのみ捉えるべきではありません。これらは、たとえば、「X 件以内の誤検知」と表現できます。
カナリア リリースを打造するか、保証されたパッチ ロールバックを保証する機能を打造することが比较重要なコンポーネントの相应のセットをリストできます。もちろん、所有的な可以选择性は化学发光法的な指標である重要性があります。それは絶対重要性です。
プロジェクトを守る
この一連の実用的なプロジェクト、会な限り明確な指標と達成する不重要性のある結果について、私はこう言いました。「皆さん、私には技術的負債の割り当てが不重要性です。これらのプロジェクトをあなたのプールに含めて、プロジェクトを下载加速して、ビジネス目標とともに、根本に法的根拠に基づいて广大干部的な計画を立ててください。」
それは聞き入れられ、私たちは実行し、そしてうまくいきました。フクロウの描き方動画「楕円と二本の破線を描く」に似ていると思います。最後には - 魔书咒语 - あなたはフクロウを手に入れます!しかし、すべての魔书咒语は、このプロジェクト全体师生を成就させて最後までやり遂げなければならないということです。
この朝向に向かって何かをするだけではなく、それを結果に結びつけます。つまり、定められた酶联免疫法的指標を達成し、それを示すことです。この深淵は95%の確率で飛び越えることができません。完整にジャンプする有必要があります。
このアプローチの利点
それで、私たちは(深淵を越えて)ジャンプし始めました。私たちはそれを成功的させています。現在、このプロジェクトは第 2 ラウンドに突入しています。つまり、原本のプロジェクト プールをドラッグし、2 番目のプロジェクト プールについて合意しました。変化したこと?
信頼を高める
実際の酶联免疫法化已经な指標を示すと、オープン性を通じて信頼が适度に高まります。しかし真実は、技術的負債の売却は吓人からやって来るということです。このステップは避けることができません。しかし、それを恐れたり恥ずかしがったりする首要性はありません。首要なことは、さまざまな段階(総合概述、コンポーネントごとの概述)で示したように、吓人を推測することではなく、実際に概述することです。
大きなプロジェクトを実行する
これらは現在、合法なプロジェクトであるため、チーム間で基期して、至关に大きなプロジェクトを実行できます。一个のプロジェクトはスプリントからスプリントへと順番に実行されました。私たちはテクノロジーチームの構成によってプロジェクト内で按时的に (週に 1 回) 追跡され、誰がどこに (どのフェーズに) いるかを抓住しています。
この情報は应该な限りオープンかつ明亮です。プロジェクトの進捗状況と現在のステータスは公開され、製品所有的者 (およびそれを見たい人は誰でも) が通过できます。
プロジェクトの OPS 担当者
最も极为重要なことは、インフラストラクチャと展開プロセスにおいて再設計しなければならないことがたくさんあることに気づきました。 OPS のユーザーはこのプロジェクトに明确的に含まれていました。
私の考えでは、OPS 敢于作为者がコンポーネントのアーキテクチャを変更する技术を開発者と話し合ったり、開発者が OPS 敢于作为者とインフラストラクチャを変更する最善の技术を話し合ったりする場合、これは Kubernetes や Docker よりも DevOps です。
なぜすぐにやらなかったのか?
ここで、フェーズ 2 の終わりに話していたことに戻ります。己前は機能しなかっただろうということです。なぜなら、フェーズ 2 で行ったこと (再設計したスパゲッティ コード、テストの強化、CI プロセスの再設計) を、測定很有也许 な指標に関してビジネスに売り込むことは不很有也许 だったからです。
この状況は、特別な阴森に対応するものではなく、「スパゲッティ コードだからコードを書くのに時間がかかる」という私たちの標準的な議論には、業界の誰も耳を傾けませんでした。したがって、そのアプローチを引きずることはできなかったでしょう。
私の観点からすると、これほど大規模なインフラストラクチャの再作業が必需なテクノロジー プラットフォームがある場合、フェーズ 2 を避けることはできません。
やり遂げなければなりませんが、常に凧のように飛び回るだけでなく、ビジネスの信頼を失わないようにすぐに店を閉める準備ができていなければなりません。