AI時代のソフトウェア開発

## この記事について

本記事は、これからのAI時代にソフトウェア開発がどう変化していくのかについて私見と妄想をまとめたものです。私たちの業界ではポエムと呼ばれているものです。

## AIリーダブルなテキストを作るスキルが重要になってくる

ChatGPTのような、自然言語から推論を行い成果物を出力するAIが台頭してくると、AIリーダブルの重要性が増してきます。AIリーダブルとは、ヒューマンリーダブルとマシンリーダブルの中間に位置するものです。AIが如何に賢く進化が早いと言っても、しばらくの間は人間とAIの推論能力には開きがある状況が続くでしょう。そこで、AIが解釈して良い成果物を生み出しやすいテキスト、つまり、AIリーダブルなテキストという考え方が出てきます。ヒューマンリーダブルなテキストを書くスキルが重要なように、AI時代にはAIリーダブルなテキストを書くスキルも同時に重要になってきます。
特にソフトウェア開発においては、ドキュメントがAIリーダブルであることは生産性に直結するため重視されるのではないでしょうか。

なお、プロンプトエンジニアリングというものがありますが、これは大規模言語モデルの能力を引き出すための学問であり、AIリーダブルなテキストを作るスキルとは重なる部分はありつつも微妙に異なるものだと個人的には考えています。

※ AIリーダブル: 僕が勝手に使っている言葉です。どこかでもっと良い言葉が存在するかも。

## ソフトウェア開発サイクルすべてがAI支援を受けるようになる

大規模言語モデルは汎用性が高く、要件定義からリリース、そして運用や継続的な開発まで、つまりソフトウェア開発のほぼ全てのフェーズやタスクに適用することができます。各フェーズやタスクにおいて、どのようなAI支援が可能か業界的に知見を貯めてフレームワーク化していくことになるのではないでしょうか。スクラム開発などのように名の通った汎用的なフレームワークが生まれることで業界への浸透が促されるはずです。

現在のところはコーディングに近いタスクでしかAI支援についてあまり情報がありませんが、それ以外の使われ方もどんどん生まれてくるでしょう。
マイクロソフトはOfficeへのAI機能組み込みを進めていますが、おそらくGoogleもその動きに続きGoogle ドキュメントにもAI機能が付くでしょう。
そうすれば、自然と会議の中でのアイディア出しなどに活用されてくるはずです。他にも、振り返り活動などで洗い出した問題点の解決策の提示や、もしかしたら会議進行などにも活用されるかもしれません。
こういった中で、タスクや会議の種類ごとの具体的なAI支援のプラクティスがまとまってくるはずです。この中から原則や型が見出され、フレームワークとなっていくのではないでしょうか。

## AIをフル活用したコーディングの拡大

既に多くの方が使っていると思いますが、GitHub Copilotのようなコーディング支援AIがより当たり前のものになっていきます。コーディングの生産性が上がることに加え、最新のGitHub Copilotでは脆弱性の発見も行えるようになりました。AIは更に進化していきますし、AI支援を受ける企業と受けない企業の生産性の差はますます広がっていきます。

ChatGPTやBing Chatのように、直接コーディング支援を行う目的ではないAIもコーディングに非常に役立ちます。さまざまな言語やライブラリのコードサンプルをすぐに示してくれますし、これまでStackOverflowやGitHub Issueを探し回ってやって見つけていたエラーの解決策もエラー文字列を貼り付けるだけで見つけてくれます。これは生産を大きく向上させます。コーディング支援AIとチャットAIの両方をフル活用したコーディングスタイルが徐々に主流となっていくでしょう。

## ドキュメンテーションやコメントを書くことの重要性が増していく

### ドキュメンテーション

プログラマの立場としては正直なところ、これまではドキュメントを書くよりもコードを書いた方が早い時代でした。しかし、それが変わりうるのではないかと考えています。AIの自然言語からマシンリーダブルなアウトプットを生み出す能力を前提とすれば、ドキュメントをしっかり書き、そこから生成されたコードからスタートした方が開発効率が良くなる可能性があります。例えば、「OpenAIのcompletions APIに〜を渡して当機能を実現する」といった一文がドキュメントに書かれていたとします。実装時にはこの文を大規模言語モデルに投げ込めば、REST APIを使った一連のサンプルを作り出してくれます。実際にはそれをリファクタしたりするのでそのままコードが使えるわけではありませんが、これまではそんな１文があったところでAPIの仕様を調べたりと時間がかかっていました。ドキュメント作成者(設計者)と実装者が別だったとしても実装者はAIの恩恵を受けられますし、予め実装方法について設計者と実装者で明確な合意を得た上で開発を進めることができます。

表やデータ構造の取り扱いも格段に楽になります。表にデータ構造が示されたドキュメントがあったとして、これをソースコードに直すのは少し面倒な作業でした。AIは表からプログラミング言語の構造に直すことが得意です。AIは、こういった細かいところでも、ドキュメンテーションを書くことによるオーバーヘッドを緩和することができます。

### ソースコードコメント

ソースコード上のコメントについても、２種類のコメントが重要になっていきます。１つは、コーディング支援AIに直接期待する振る舞いやアルゴリズムを指示するコメントです。これは単純に目的としているコードを生成させるために書くコメントです。コーディング支援AIはコメントがなくとも前後のコードから推論してコードを生成してくれますが、コメントで指示することで意図を汲んだコードを生成してくれます。この種類のコメントは場合によってはコード生成後には消すこともあるでしょう。
２つ目は、AIにコンテキストを与えるコメントです。例えば、関数パラメータの意味や使うライブラリやコードの規則などをAIに伝えることで、より正確なコード生成を実現します。

## 更に型付けやタイプヒントが重要になってくる

最近では型付けのメリットが再評価されて多くの現場で型付けの強い言語を選んだり、動的型付け言語であってもタイプヒントを活用するようになっています。
AI支援の文脈において、この流れは更に強化されるでしょう。AIは推論に必要な情報が多いほど的確なコード生成が期待できます。
型が明記されている方がAIリーダブルであり推論しやすいことは明白ですし、最近GitHub Copilotを使ってGoとPythonのコーディングをした経験からも、型付け言語の方が頻繁にコード支援をしてくれる実感があります。

## AIによる解析サービス

Lintや静的解析では捉えることができないコード上の問題にAIが役立ちます。既にGitHub Copilot(Business)には脆弱性を見つける機能などがありますが、脆弱性だけでなくさまざまな利用ができるようになっていくはずです。
今後は、SaaSの静的解析サービスなどはAI機能を強化していくでしょう。例えば、自動的にリファクタリングや不具合修正のPRを提出したり、Lintでは扱えないようなコーディング規則について指摘できるようになってきます。

# 最後に

AIは急速に進化するでしょうし、それを踏まえるとAIにできることは多すぎて二年後くらいにはソフトウェア開発は一変しているのではと書いていて改めて思いました。
きっと頭のいい人たちがAIを使ったいい感じのプラクティスを作り上げてくれていて、業界はその恩恵を受けて生産性を向上させているはずです。
記事内には書いてませんが、テストや監視、脆弱性診断など本当にありとあらゆる部分が、AIの恩恵が受けられます。
最後まで残るものはなんなのか。むしろ何か残るのか。そんなドキドキを抱えながら今後のプログラマ人生を送れるなんてとても幸せなことだと思います。
義務労働なんて無くなってみんな遊んで暮らせる世界になるといいですね。