どのようにしてプログラマはAIに仕事を奪われていくかの妄想Yuhei Nakasaka's Blog

どのようにしてプログラマはAIに仕事を奪われていくかの妄想

  • 先日 OpenAI からChatGPTが Beta 公開された
  • ChatGPT ではどんな質問に対しても何かしらの回答を生成してくれるのだが、ソースコードに関しても中々の筋が良さそうな雰囲気のコード片を生成してくれるということで少し話題になっていた
  • こうしたプログラムを生成してくれる AI が発展していく中でどういう具合にプログラマの仕事が奪われていくのか興味がある
  • 特に以下ではweb アプリやモバイルアプリなどのアプリケーションの開発においてという文脈で考えることにする
  • まず AI がプログラマの仕事を奪うまでにはいくつかの段階があると思う

コード支援レベル

  • 現状はGitHub Copilotのようなコーディング支援を行うレベルの AI はある程度実用レベルになっている
    • 自分は Copilot が生成したコード片をプロダクションコードに含めるのは権利関係の問題もあり様子見している
    • しかし Copilot を使っていないわけではなく、変数名や定型作業のサジェストや変数名の補完、コードの書き出しの補助などで利用している
      • 例えば API のレスポンスで受け取る予定の JSON をペタッと貼るとそれにあった構造体とか型が丸ッと生成されたりする。スニペットとか静的なコードジェネレータでやってたような作業が良い感じにできるなど。
    • 正直このようなコーディングの支援 AI だけではプログラマの仕事は AI に奪われないだろう。全然奪うというよりプログラマの手助けをするだけなので、これではまだまだプログラマがいないとアプリケーションは完成しない。

ChatGPT レベル

  • では ChatGPT のようにある程度まとまったサイズのコード片を生成してくれる AI が普及するとどうなるか
    • Twitter ではさまざまなプログラマがコード片の生成を試みているがその内容を見るとそのまま使えるコードが半分、修正が必要なコードが 1〜2 割、完全に間違っているコードが 3〜4 割という感じだ
    • 今のクオリティだと人が書いた方がまだ早い、もしくはプログラマによる手修正が結構必要そう。なのでプログラマがいないとまだアプリケーションは完成させられないだろう
    • ただし修正すること前提で簡単なタスク用のまとまったコード片を生成してコーディングの時間短縮、といった使い方はできるかもしれない
    • ある意味これもコーディング支援というレベルではある
      • というか GitHub Copilot が GPT-3 を使ってるから実質同じといえば同じ

かなり高精度にコード生成できるレベル

  • ではそのまま使えるコード片を ほぼ 100%のクオリティで生成できる AI が登場するようになるとどうか
    • ここまでくると AI に生成してほしいコードの内容を伝えてコード片を大量に生成してもらい、それをプログラマが組み合わせてアプリケーションという形にする流れでも現実的になってきそう
      • 例えば「メールアドレス認証するコード書いて」「CRUD なフォームのモデルとコントローラとビューを書いて」等々でいくつかの動くコード片が生成される
      • 人間はこれらをつなぎ合わせるだけでアプリケーションが完成するイメージ
        • こうしたコード片をつなぎ合わせる仕事はアセンブリエンジニアとでも呼ばれるようになりそう
    • AI には体力が無いかつマシンさえあれば並列で大量に実行できるという人間には成し得ない強力な生産性がある
      • 金とマシンさえあれば 24 時間並列で一気にコード生成してもらえるはず
    • よって例えば今までだと新規でアプリケーションを完成させるのに必要なプログラマが 1 人月必要だった案件でも AI にコーディング部分を大幅に代替してもらえるなら一部コード修正やレビューが必要にしても、数人日で完成させられるようなことはあるかもしれない
    • この辺りから一部のプログラマの仕事は AI に奪われたと言われるようになるだろう
  • とはいえこれらは新規開発の場合のみの話
  • 仕事におけるプロダクションで稼働するシステム開発の難易度の高い部分は既存システムへ追加・修正などの改修を入れるところである
  • どんなに正確なコード片を生成できたり、あるいはアプリケーション全体のコードを生成できたとしてもそれは新規開発時のコーディングの代替であり、一度本番に乗ってしまったコードを運用していく際にはちょっとやそっとのコード片の生成レベルでは代替は難しそうだ

既存コードのコンテキストも読み取ってコード生成できるレベル

  • では改修要望を書くと既存コードのコンテキストを加味した状態の追加修正が入ったコードが丸っと生成されるようになるとどうか
    • これが出来るならアプリケーションのコーディング部分を担当するプログラマはほぼ不要になるかもしれない
      • 生成されたコードを既存コードに適用するくらいで済むレベルを想定
    • 残りの仕事に必要なのは下記くらいか
      • 生成されたコードが安定して実行し続けられるように周辺環境を作るインフラエンジニア
      • 生成されたコードに問題はないか確認するコードレビューエンジニア
      • 生成されたコードが想定通りに動くか確認する QA エンジニア
      • AI のコード生成や生成したコードを管理するプロンプトエンジニア/アセンブリエンジニア?
        • AI の癖を知り既存コードとの相性の良いプロンプトを管理するご機嫌伺い役
  • ここまでくると新規開発だけでなく既存システムの改修に関するコーディングはある程度代替できるのでさらに従来のプログラマの仕事は減らせるかもしれない

さらに先の話

  • さらに AI がプログラマの仕事を奪うにはどんなことが必要か
    • 生成されたアプリケーションを実行管理し安定運用してくれるインフラをなんとかしてもらう必要がありそう
      • 生成されたアプリケーションと想定するサービス品質などを指定すると自動でインフラを展開して運用までやってくれるような仕組みはできるか?
      • サーバー・ネットワーク・DB などの知識を隠蔽できるか?
      • トラブルシューティングは可能か?
        • この辺りができないとインフラ系のエンジニアの仕事はなくせなそう
    • アプリケーションが正しく動いているか保証できる必要がありそう
      • 想定外の挙動はないかコードレビューする
      • 生成されたコードが想定通りの動作をしているかテストを書く
      • 生成されたコードが想定通りの動作をしているか動作確認を行う
      • 誤作動した時にストップできる
        • この辺りを担保できないと品質保証系のエンジニアの仕事はなくせなそう
  • その他仕事に関してはどうか?
    • 他の役職に関しては詳しくないので何もいえない
      • というか自分の理解が浅いかもしれない職に関して簡単に奪われる職として挙げるのは憚られる

雑多な話

生成されるコード

  • AI が生成するコードは既存のプログラミング言語で書かれたコードである必要はあるのか
    • コード片を人間が読まなくても良いレベルのクオリティなら既存の言語で吐き出す意味はないのでは
      • トラブルシューティングしづらそう
      • 過去の資産(GitHub 上のコードとか)を利用するなら既存のプログラミング言語の方が吐き出しやすそうではある
  • AI が吐き出しやすいようなコードを書くという価値観が新たにコーディング規約に追加されたりするかも
  • そもそも実行バイナリを吐き出すだけではダメか?
    • 実行バイナリをブラックボックステストであとは QA エンジニアが検証するだけのお仕事で良いのでは
      • とはいえトラブルシューティングしづらそうなのはキツいか

開発体験

  • 開発体験(DX)の向上は必要か?
    • AI が大方のコード生成をしてくれるなら開発体験の向上にコストをかける必要はあるのか
    • プログラマがコードに手を入れなくても良いなら lint とか formatter とか型とかもいらないのでは
  • プログラミング言語やフレームワークの選定はどう変わるか?
    • AI が一番精度良く吐き出せる言語が人気になるか
    • ただまぁこれは今と変わらず要件次第になりそうではあるな

プログラマの仕事

  • プログラマの仕事はどう変わるか
    • コードを書く比重が減り、コード片を生成する作業とシステムを組み上げる作業に比重が移りそう
    • 要件を分解しシステムを構成するコード片を生成するためのプロンプト作成作業が大量に発生しそう
    • より必要になる能力
      • 業務知識への明るさ
      • 調整能力(コミュニケーション力含め)
      • 要件の分解とそのそれぞれへの解決策を文章化する能力
      • システム全体の設計力
    • 今も似たようなことをやってるはずだし必要な能力は変わらなそう
    • コード化する部分がめちゃくちゃ爆速になるだけか?
  • フロントエンドエンジニアとかバックエンドエンジニアみたいな職域の境はなくなり、システム全体を設計して形にできる全部できる強いフルスタックな人が 1 人いればアプリケーション開発には十分というチーム構成になる可能性はあるかも
  • システムの安定性を向上させたり保証する仕事の重要性が増しそう
    • 要はAI の尻拭い
      • テストや QA を手厚くやって AI の生成したコードの穴を塞ぐ仕事
      • コードレビューの仕事
    • QA 用 AI が出てくる可能性もあるが、その AI の QA を誰がやるのか?とかその AI は業務依存の実装になりそうなので維持管理は内製になりそう
      • AI より安いマンパワーを使った方がコスパ良いとかありそう
  • インフラ周りは構築はまだしも運用を完全に AI に代替させることで仕事を奪わせるのは難しそうに感じる、というか想像できない
    • ただ自社で DC 持ってるとかよっぽど特殊な要件のアプリケーションでなければクラウドベンダが良い感じのソリューションを出してきそうではある。昔に比べたら今でも十分インフラは深い知識なくてもある程度構築運用できるし。
  • 責任を取ること
    • AI のミスの尻拭いは人間がやる

完全に未知の概念に対応できるか

  • 「イスカルテンダ王国のスルマオン暦のランフォイを求めるコード」みたいな未知の概念は AI に正しく対応できない(はず)
  • AI が知らないものは人間が頑張るしかない

AI の学習ソースはどうなるのか

  • 現状は GitHub やインターネット上のコードを学習してモデルを作ってると思うが、近い将来学習ソースが枯渇するという話がある
  • 将棋 AI は将棋 AI の生成した棋譜をさらに学習したりしているが、AI が生成したプログラミングのコードをさらに学習したりすれば解決するか?
    • 将棋におけるfloodgateみたいな AI が作ったソースコードが実行されたり共有されたりするものが生まれるか?

信頼性

  • AI が生成したコードをどこまで信頼できるか
    • 例えばある手術に使われる機器のソフトウェアが一切人間の手が入っていない AI による自動生成コードで作られているとして、自分の娘がその機器で手術を受けると知ったら、今の AI のレベルなら 100%手術をやめさせると思う
    • その信頼性を担保するための仕事(コードを人間が書くべきといっているわけではない)はしばらくは人間の仕事になりそう
    • 特に人の営みと高度に接続する必要がある場面では避けられないように思う
      • AI にはパーソナリティや家族のような守るべきものが(現時点では)ないという点がある種の弱点(利点)な気がする
  • AI は人との営みの中で何か重要なことを行うためには責任感が足りなすぎる
    • 失敗しましたごめんな!で済まない場面への対応を整備する必要がありそう
    • そうなると責任は開発(会社|者)が取るしかない。AI の尻拭いは人間がやる。
  • ある程度無責任でも良い場面には使えるが強く責任が伴う場面では、失敗した場合のケアや予防策を構築する必要がある

シンギュラリティ

  • AI が考え、AI が解決案を生み出し、また AI が問題を見つけ、AI が解決を試みるみたいなシンギュラリティ的な世界は一部の分野ではもうすぐあり得そう
  • 社会の中でも広く適用されるためには失敗の責任を自分で取れる、自分で尻拭いできる能力が AI に生まれたら世界は変わりそう。まだまだ SF っぽいだいぶ先の話な気もする。
  • プログラマはAIの失敗の尻拭いをするために謝罪の練習をしておくと良さそう(?)

[追記] コード生成ではなくシステム生成できるレベル

  • 昨夜もう少しちゃんと考えてみたが、そもそもコード生成というのをやめてシステム全体を生成して展開するところまで一気通貫でやってしまえるならどうか
    • 例えば仕様書とシステム構成をアップロードしたらアプリケーションコードが生成されインフラが構築され一気にAWSか何かに展開される感じ
      • 生成されたシステムをブラックボックスでテストして振る舞いなど問題なければOKみたいな。
      • これで十分な案件はかなりあるのでは。
    • これなら新規開発に関してはもうコーディングが完全にいらないしインフラ周りの仕事も消える
    • 昨日書いた時はどのみち既存システムの改修とかは既存データをどうするかとか既存インフラとのつなぎ合わせとか調整の関係で大変じゃないかと思っていたが、そもそも全て改修時にスクラップ&ビルドすれば良いなと思った
      • アプリケーションコードもインフラ側も全部都度作り直す
      • そうなると既存データとどう整合性を保つかだけが問題になる
        • であればここだけ人間が頑張れば良いのでは...
        • というかここまでできるならデータに関してもAI側でやってくれそう
    • もうこの段階まで来ると変更容易性だとか保守性に関する概念すら全て過去の遺物
    • あとは品質管理だけどうするかだけど、これもテストと品質水準をまとめてAIに提出し検証してもらう感じで良いのかも。
      • ブコメなどでも書かれていたが確かにここまでくるともう人間が把握できる規模ではないかもだし、どのみち機械に頼らないといけない部分も出てきそう。
      • このへんも時間の問題なのかもしれないな...

[追記] システム開発がなくなる世界線

  • ここまで簡単にシステム開発を適用できるようになると、そもそも世の中的に必要なソフトウェアが全ての業界に行き渡りあらかた開発され切ってしまったという世界線もあるか
  • ある意味今でいうところの白物家電みたいな。
  • そうなるとシステム開発という業種自体かなり下火になりそう
tweet
tweet

おすすめ

  1. 楽しそうなおじさんを見るのが好き
  2. パソコンを最低限使える人かチェックする試験
  3. あらゆるものを資本と資産と収益の関係でみる