世界を動かす技術を、日本語で。

コードを書くために使用されるAIコーディングエージェントは、メンテナンスコストを削減する必要があります

概要

  • AIコーディングエージェント による生産性向上は、 保守コスト削減 とセットでなければ意味がない
  • コード量が増えれば増えるほど、維持管理負担も増大
  • 生産性向上分だけ 保守コストが減らなければ、長期的には逆効果
  • AI導入後の保守コスト は恒久的に残るリスク
  • 本質的な改善策 は、保守性向上とバランスしたAI活用

AIコーディングエージェントと保守コストの現実

  • AIコーディングエージェント の導入目的は、 開発スピード向上
  • しかし、 書いたコード は全て 保守作業 が必要
    • バグ修正
    • リファクタリング
    • 依存関係のアップグレード
  • 新機能追加 や拡張ではなく、既存コードの維持にかかる時間
  • 1ヶ月 コードを書くごとに、その後の 1年で10日、以降毎年 5日 の保守作業発生という推計
  • 保守コストの累積 により、数年後には 開発時間の半分以上 を保守に費やす現実
  • 保守コストを半減 できれば、50%超過までの猶予が 3年延びる が、逆に倍増すれば 1年未満 で到達

生産性と保守コストのトレードオフ

  • 生産性が2倍 になっても、 保守コストも2倍 になれば、長期的には逆効果
  • AIが生み出すコード人間同等の保守性 でも、最終的な維持負担は増加
  • 生産性向上と同じ割合で保守コスト削減 が必要
    • 2倍のコード量 ⇒ 保守コストは半分
    • 3倍のコード量 ⇒ 保守コストは1/3
  • 保守コスト削減なし でのAI活用は「一時的なスピード向上」と「恒久的な負債」の交換

保守コスト増加の現場感

  • スタートアップの後期 でよく見られる現象
    • 年数が経つごとに チームの生産性低下
    • バグ修正や依存関係更新 を後回しにして問題を先送り
    • 人員追加リライト で一時的に対応
  • 根本的な保守コスト削減 がなければ、負のスパイラル

AI導入後のリスクと不可逆性

  • AI生成コード の保守コスト上昇は 恒久的
  • AI利用をやめても、既存コードの維持負担は残る
  • 一度AIに依存 すると、元の生産性には戻れない

成功の鍵:保守性向上とAI活用の両立

  • AI活用の効果 は、 保守コスト削減 が伴って初めて本物
  • 生産性向上分の逆数 だけ保守コストを減らす必要
  • 保守性に優れたコード生成保守作業自体の自動化 が今後の課題
  • スプレッドシート等で自社の実態を可視化 し、前提条件を見直すことが重要

まとめと提言

  • AIによる開発スピード向上 だけに目を向けず、 保守コスト削減策 を同時に追求すべき
  • 保守性が担保されないAI活用 は、長期的な生産性低下と負債増大を招く
  • 現実的なモデル検証継続的な改善 が、持続可能な開発体制構築の鍵

Hackerたちの意見

私にとって、みんなが大好きな素晴らしいテストシステムを作れれば、実際にそれを使って機能を作るようになって、後回しにならないから、メンテナンスがずっと楽になるんだよね。よく「テスト駆動開発」って言われるけど、開発者体験が良くてちゃんと機能する形でやられてるのはあまり見たことがない。でも、もしそれができたら、素晴らしいプロファイリングができる。そうなれば、正確性やパフォーマンスを測れるようになるから、実装がそれほど重要じゃなくなる。そうすると、AIにコーディングを任せるのがずっと楽になるよ。

これが未来のやり方になるんじゃないかな。開発者は機能を指定するようになって、それがテストで検証される。AIはその間に入って、テストが通るまで繰り返す。レイヤー1: 仕様(人間) レイヤー2: コード(主にAI) レイヤー3: テスト(AI + 人間のチェック)。

コードレビューも同じだね。AIがコードレビューをもっと見栄えよくできるか気になる。例えば、人間のコードレビューだと、開発者はコードの見た目を変えないようにすぐに学ぶんだ。コードのリフローやコメントの変更、インデントの変更(ツールが抑えられないところ)、関数の移動や行の削除、その他の無駄な変更はしないようにね。それに、無駄にリファクタリングもしないし、レビューを機能変更と見た目変更の2つに分けることもできるかも。

https://github.com/ReviewStage/stage-cli これはそのテーマに関して面白いスタートだね。

リファクタリングは別のレビューで行って、「REFACTOR_ONLY:」みたいなことを言って、コードの動作が変わらないルールを設けるといいよ。それでレビューがずっと楽になる。レビューは「何も変わらないはず」から始まって、レビュアーはそれにパターンマッチできる。そうじゃないと、レビュアーはコードのすべての行を再評価して、何も変わっていないか確認しなきゃいけなくて、それは本当に難しい。私が使ってきたバージョン管理システムでは、変更のキューを許可していて、それぞれ独立してレビューされる。開発中にリファクタリングが必要な場合は、1つ前のコミットに戻ってリファクタリングして、レビューに出して、進行中の作業をリベースして続ける。常に「CLEANUP:」「REFACTOR_ONLY:」などの変更を出して、最終的な変更は大きな変更のモンスターよりもずっと小さくなる。レビュアーはその努力を評価してくれるよ。もしその手の組織で働いているなら、悪いことをせずにメトリックゲームをプレイできる。

私の経験では、AIはメンテナンスコストを下げる。とはいえ、ここでは文脈が重要かもしれない。私は数十年にわたるプロジェクトに取り組んでいて、新しい機能開発がたくさんある一方で、古いコードやプロジェクトが急に扱いやすくなったり、近代化が進んだり、場合によっては完全に排除されたりしてる。古いライブラリやビルドツールへの依存も、更新されたり、排除されたりして、ビルドが速くなって、開発者にとっても楽になった。エンドツーエンドのテストも設定や自動化がずっと楽になった。DevOpsも大幅に改善されて、プロダクションの問題診断が劇的に向上した。たくさんのログや情報があって、重要なことをキャッチするためのダッシュボードやモニタリングもいろいろあるけど、今はデプロイしたシステムの分析がもっとできるようになったよ(約50プロジェクトくらい)。

これも私には当てはまるけど、メンテナンスを助けるためにAIを使っているだけなら、それはカウントされないと思う。この記事の基本的な主張は、「価値を加える」機能開発の1時間に対して、どれだけのメンテナンス時間が必要かってことだから。だからA. あなたはメンテナンスコストだけを測っていて、比率を測っていないし、B. 「古いコード」はそもそもAIで書かれていなかったんだよね。

なるほど、これは納得できる意見だね。残念ながら、メンテナンス性は「非機能的」な要件として単純に分類されてしまう。メンテナンス性(や似たような非機能的要件)は、実際には将来の機能要件を保ち、実現するために必要なものとして考えるべきだと思う。非機能的要件を「ソフトウェアがどうやってやるか」として捉えるのに対して、「何をするか」/機能要件が「本当に重要なこと」として位置づけるのとは対照的にね。その観点から見ると、プロジェクトにとって機能や改善の安定した流れが重要なら、メンテナンス性は実際には非機能的要件ではなく、機能要件に等しいんじゃないかな。

実際には、最も短い時間枠を除いて、機能要件に相当する。 そうそう!残念なことに、多くのソフトウェア会社は、実際には四半期先のことしか考えていないみたい。確かに、1年や2年先までのプロダクトロードマップはあるかもしれないけど、正直なところ、あれはほとんど営業目的のためだよね。営業が落ち込むと、プロダクトやエンジニアリングも方向転換するし。会社の寿命が短いほど、これが頻繁に起こる可能性が高い。でも、もし会社がスタートアップモードから抜け出せれば、安定し始めるはずなんだけど…多くの会社はそうならない。短期的な計画を続けているから、プロダクトの安定性は低優先度のまま。結局、多くの会社は良いソフトウェアを作るリソースがないか、そもそも気にしていないんじゃないかな。

NFRや「技術的負債」、その他の呼び方についての懸念をなくすための最初で最も重要なステップは、それに名前を付けるのをやめることだと思う。本気で言ってるよ。何か特定の名前を付けることで、それが誰かによって囲い込まれたり、優先度が下げられたりするライセンスを与えてしまう。質は重要だよ。維持しないと、すぐにP&Lに大きな影響が出るから、他の要素と同じくらい重要なんだ。

これは私にとっても正しい方向性に感じる。ここ6ヶ月間、私が開発の仕事で苦しんでいる問題の80%は、メンテナンスやレガシーコードが新しい機能開発を妨げていることだ。一部の開発者はAIを使うことに過剰に積極的で、私もその流れに乗り始めている。なぜなら、追いつく必要があるし、実際にIDEでAIと一緒に作業するのが楽しいから。自分のコードベースの部分を理解しやすく、一貫性を持たせるために多くの努力をしているけど、チームの他のメンバーからはそれが見られない。完璧ではないけど、私は一貫性がないものや、一目で理解できないものに非常に敏感なんだ。とにかく、この記事の新しい(私にとっては少なくとも)視点が好きだよ!

AIを使えば、最初に考えていなかった問題の原因をモデル化できるかもしれないと思うんだ(例えば、「すべてのバグを直さない、すべての依存関係をアップグレードしないことにした」とか)。AIツールを使うことで、「fooに関連することにどれくらいの時間を使っているか」を掘り下げて聞けるようになるのもいいよね。AIツールは、持続可能なソフトウェアの実践をどう見えるかを構築する場にもなり得るから、同じような後ろ向きな努力をする決断をしないようにできる。メンテナンスのアップデートを扱うツールを作ることもその一環だと思う。AIツールの本質は、やっぱり人間の注意管理を強化する活動に向けてトレーニング(または誘導)される必要があるってことだね。

AIツールは、持続可能なソフトウェアの実践をどう見えるかを構築する場にもなり得るから、同じような後ろ向きな努力をする決断をしないようにできる。 メンテナンスのアップデートを扱うツールを作ることもその一環だと思う。 これまでも可能だったけど、私の視点から見ると、実際にやった人はいないように見える?確かに、AIが登場する前からこのケースに対応したOSSはたくさん存在しているけど、結局はインセンティブに戻ってくる気がする。個人的には、持続可能なソフトウェアを書くインセンティブはないと思う(このペースでは、今後もそうなる気がしない)。ビジネスは、自分たちが定義したSLA内でタスクを達成するために必要なソフトウェアを書くことにしかインセンティブがないし、それ以上は求めていないみたい。でも、Githubを例に取ると、それすらも今はブロッカーにはなっていないように見える。良いソフトウェアは、問題を解決することに真剣に取り組む人から生まれる。もし従業員が自社のプロダクトに興味を持っていなければ、すでに間違ったスタートを切っている。AIは、悪い開発者に良いソフトウェアを書くインセンティブを与えたり、優秀な開発者が無知なマネージャーに対して強く反発することを助けたりはしない。彼らが決断を下すとき、AIは助けになるかもしれない(もっと大きな混乱を引き起こさない限り)けど、プロダクトマネージャーの視点が変わらない限り、技術的負債を意味のある形で減らすことはできないと思う。今のところ、理論的にも実践的にもそうなっているのは見えない。間違っていることを証明してほしい!

記事のメンテナンスと機能の比率についての枠組みが、自分のワークフローで感じていることと重なるんだ。あまり注目されていない点は、AIセッションのアーティファクトの表面積がコードの表面積よりもずっと早く増えること。Claude Codeの出力が1時間あると、コードの変更だけじゃなくて、スクリーンショット、生成された画像、エクスポートされたトランスクリプト、仕様ドラフト、ダウンロードしたモデルの重みなどが出てきて、Finderがどこに落としたかも分からなくなる。メンテナンスコストの議論もここに当てはまる。適切なアーティファクトにすぐにアクセスできないと、既に持っているものを再生成したり、最悪の場合、セッション間でのコンテキストを失ったりする。作業環境の「メンテナンス」は、記事が説明している比率に対する実際の負担になる。特にファイルの問題に取り組もうとしているけど、広い意味では、AIコーディングエージェントは周囲のツール(ファイル管理、コンテキストの切り替え、アーティファクトの整理)が追いつかない限り、ネットのメンテナンスコストを減らすことはないと思う。

追加したいことが2つある。1. ソフトウェアには技術的なメンテナンスだけじゃなくて、ユーザーサポートもあって、ソフトウェアが成長するにつれて増えていく。2. メンテナンスコストが線形にスケールするとは思えない。たとえ線形にスケールしたとしても、最終的にはメンテナンスがすべての時間を占めるようになる。

彼が見逃している賭けは、多くの会社が今始めようとしているか、少なくとも考えていることだけど、AIがコーディングが上手くなるということ。だから、次のモデルやハーネスがメンテナンスの負担を引き受けるっていうのが理論なんだ。

一方で、多くのLLMユーザーは、生成されたコードの質が価格とサービスがコストに見合うように調整されるにつれて低下しているのを見ているよ。大学院生レベルの仕事が学生アルバイトの何倍もするなら、やる意味あるの?

もし著者が自信過剰にならず、主張を裏付ける本当の証拠を示していれば、これは良い文章になったかもしれないね。HNのフロントページをソースとして挙げるのは軽薄で、すぐに結論に疑いを持たせたよ。著者がこのテーマについてどれだけリサーチしたのか興味があったけど、どうやら全然やってないみたい。LLMが根拠なしに自信満々な文章を提供してきたら、どうする?

LLMが根拠なしに自信満々な文章を提供してきたら、どうする? そりゃ、作り話の線を引いて、作り話のプロットを描いて、それを証拠だと言うんだろうね。