2022年11月にChatGPTが登場し、AI技術がプログラミングの領域にも大きな影響を与えています。
プログラマやこれからプログラミングを学んでいる(学ぼうとしている)人の中には以下のようなことを悩んでいる方もいるのではないでしょうか。
- ChatGPT等のAI技術をプログラミングにどう活用できるか?
- 今後のソフトウェア開発で求められるスキルはどう変わるのか?
- そもそも、これからプログラミングを学ぶ意味はあるのか?
プログラミングというのはプログラムのコードを書くこと(コーディング)を指します。
コーディングは以下のようにソフトウェア開発の一部です。
ChatGPTのインパクトやその活用を考えるにあたっては、コーディングだけでなく広くソフトウェア開発プロセス全体でみていくことが大事です。
この記事では、ChatGPTがソフトウェア開発にどのように活かせるかを、実際に私が行っている事例も交えて紹介します。
紹介した事例も踏まえながら現状のChatGPTの限界についても考察します。
これらを踏まえ、これからのソフトウェア開発とそこで求められるスキルは何か、そして今何をすべきかについて私なりの考えを述べます。
結論は以下になります。
- ChatGPTはコーディングだけに限らず、要件定義、設計、テストなど広くソフトウェア開発全般で活用できる。
- ChatGPTの回答が正しいとは限らず、作りたいもの全体を一度に作ることもできないなど限界がある。なので、現状は人の補助にとどまる。
- プログラミングのスキルはまだ有用といえるが、AI技術を活用するかどうかで生産性に大きな差が出る。
私は大手IT企業でソフトウェア開発を効率化するための技術開発や、開発現場への技術導入支援を長年行ってきました。
本記事では、このような私の経験も少し踏まえつつ解説していきたいと思います。
YouTubeの動画でも解説しているので、ぜひ御覧ください。
ChatGPTの衝撃
ChatGPTの概要
ChatGPTについて簡単に説明します。
CahtGPTはOpenAI社が開発した大規模言語モデルです。
大規模言語モデルとは、大量のテキストデータを学習して構築された自然言語処理のモデルのことです。
一度作った大規模言語モデルで追加学習を行い微調整(ファインチューニングと言います)することで、文書分類、質疑応答など様々なタスクを行うモデルを作ることができます。
以下のようなイメージです。
OpenAIは大量の計算機リソースを使って学習を行い、超巨大な大規模言語モデルであるGPT-3.5やGPT-4を構築しました。
大規模言語モデルであるGPT-3.5やGPT-4を対話タスクへ特化させてファインチューニングしたものがChatGPTとなります。
大規模言語モデルは人間の脳の構造を参考にしています。
なので、大規模言語モデルやファインチューニングは人間の学習に例えるとわかりやすいかもしれませんね。
人間の英語学習であればまず単語や文法など基礎を学び、その後に基礎を土台として追加でビジネス英会話を学ぶなどするかと思います。
上の図では人間が「大規模言語モデル」でビジネス英会話の追加学習が「ファインチューニング」相当です。
このように考えると、ちょっとわかりやすいのではないでしょうか。
ソフトウェア開発へのインパクト
ChatGPTの登場は、ソフトウェア開発へどのようなインパクトを与えるのでしょうか。
ソフトウェア開発の分野では、これまで様々な技術革新がありました。
- 1950年代~:低級言語(アセンブラ)から高級言語(FORTRAN)への進化
=>より高い抽象度でプログラムが書けるように - 1970年代~:オブジェクト指向言語の登場
=>コードの再利用性が高まり開発速度が向上した - 2000年代~:仮想化技術・クラウドサービス(AWS、GPC、Azureなど)の登場
=>自社物理サーバが不要で、計算機リソースを柔軟に確保可能に - 2010年代~:機械学習・深層学習の急速な発展
=>機械翻訳・自動運転などが一部ドメインで実用レベルに - 2020年代~:ノーコード・ローコードプラットフォーム登場
=>非開発者でもコードを書かずにアプリケーションを開発可能に
技術革新によって、ソフトウェア開発の生産性は上がり、より大規模で複雑なソフトウェアはより早くリリース可能となりました。
ChatGPTのベースとなっている大規模言語モデルは深層学習を発展させたものになります。
ChatGPTがソフトウェア開発へ与える影響は、上述したようなこれまでの技術革新を超えるようなインパクトをもつと個人的に思っています。
ChatGPTは自然言語というユーザインターフェースを持ち、一定の専門性を持った人間のように応答が可能です。
そのため、既存技術にはなかった以下の特徴があります。
- (1)汎用性が高い:ソフトウェア開発のあらゆるプロセスに幅広く活用できる。
- (2)学習コストが低い:対話形式で利用できるため学習コストが極めて低く即効性が高い。
(1)汎用性が高い
既存の技術やツールはソフトウェア開発におけるコーディングやテスト(下流工程とも言います)の支援が中心でした。
また、基本的に特定のドメイン(例えば、Webアプリケーション向けなど)に特化したものが多いです。
ただ、これも機械翻訳という特定のドメインに絞ったものでした。
これに対し、ChatGPTはドメインを限定せず活用できます。
ツールによる支援が難しかった要件定義、設計(上流工程とも言います)などを含めたソフトウェア開発全般の支援が可能となります。
そのため汎用性がとても高く、あらゆる場面で活躍してくれます。
(2)学習コストが低い
既存の技術やツールには良いものもたくさんあります。
しかし、いざ使おうとなると学習を含め初期導入のコストが発生します。
例えば、とても生産性の高いプログラミング言語やフレームワークが新しく登場したとしましょう。
これを使いたいと思ったとしても、最初に学習のコストがかかります。
便利な技術は次々に登場するのですが、その技術の効果を実感できるまでの期間が長い場合も多いのです。
これに対し、ChatGPTは自然言語で対話型という特別な知識がなくても誰でも使えるユーザインターフェイスを持ちます。
(1)で述べたように汎用性が高いという特長もあるため、設計、コーディング等のプロセスにおいて、ChatGPTを導入するとすぐに効果を実感できる作業があるかと思います。
そして、使いながらだんだんと活用範囲を広げていくことができるでしょう。
今すぐできるソフトウェア開発におけるChatGPT・AI技術活用
ソフトウェア開発とは?
ソフトウェア開発と一言にいっても、個人レベルの趣味の開発・企業で行う大規模な開発・オープンソースソフトウェア(OSS)開発など様々な形態がありますね。
開発の方法論としてもウォーターフォール開発・アジャイル開発など様々なものがあります。
どのような形態・方法論でソフトウェア開発を行う場合でも、ざっくりとソフトウェア開発というのは以下のようなプロセスに分けられます。(図を再掲します)
- 要件定義:開発するソフトウェアが何をするか、どのような機能を持つかを明確にすること。
- 設計:要件定義に基づいて、ソフトウェアのアーキテクチャや構造を設計すること。
- コーディング:設計したアーキテクチャや構造に基づいて、コーディングをしてソフトウェアを作ること。
- テスト:開発したソフトウェアが要件定義に沿って正しく動作するかどうかを検証すること。
ウォータフォール開発ならば、この順番できっちり設計書などのドキュメントを作成しながら開発を行います。
アジャイル開発ならば、要件定義からテストまでを短いサイクルで繰り返します。
個人の趣味的な開発やOSS開発ではコーディングやテストだけを行っているようにも思えるかもしれませんね。
でも、開発者の頭の中では要件定義や設計に相当することを必ず行っているはずです。
それでは、ソフトウェア開発の各プロセスにおいてChatGPTやAI技術がどのように活用できるかの事例を紹介します。
要件定義における活用事例
プログラミング初心者向けの学習サイトをWebアプリケーションとして開発することを考えてみましょう。
開発にあたっては ChatGPTなどを積極的に使いどれだけ開発が効率化するかいろいろと試しています。
例えば、ChatGPTへおおざっぱにプログラミング初心者向けの学習サイトの要件案を作ってほしいと頼むだけで、以下のようにたたき台として使えそうな案を回答してくれます。
例えば以下のようにChatGPTへ追加の指示を出して要件をブラッシュアップしていくことが可能です。
- 指示を追加して作り直してもらう
(例:「学習の進捗度を仲間と競い合うことを特徴とするような学習サイトにしてください」) - 詳細化してもらう
(例:「コース管理」の機能についてもう少し詳細化してください」) - 自分で要件を修正しそれをレビューしてもらう
(例:「この要件定義について漏れがあれば教えてください」)
さらに、(要件定義というよりは企画フェーズかもしれませんが、)以下のようにChatGPTにアイディア出しを手伝ってもらうこともできます。
なるほど、ChatGPT提案の「AIによる自動フィードバック」はなかなかよさそうですね。
ChatGPTのAPIを活用すれば実現できそうですし、もしかするとサイトの目玉機能になるかもしれません。
このように、ChatGPTを活用することで要件定義を効率よく行うことができます。
注意点として、ChatGPTの回答が正しいとは限りません。平気でそれらしい嘘を堂々とつくことがあります。
そのため、ChatGPTの回答が正しいかどうかを確認し、最終的にそれを採用するか判断するのはあくまで人間です。
自分で考えて作れるものであっても、ゼロから作るのと叩き台がありそれを修正して作るのでは、後者の方が圧倒的に楽です。
要件定義だけではなく、ChatGPTの活用全般に言えることですね。
設計における活用事例
ChatGPTは設計でも活用できます。
例えば、前節でChatGPTが提示してくれた学習サイトの要件定義から、データベースのテーブル設計を行ってみてもらいましょう。
ユーザ・コース・レッスンなどのテーブル設計を行ってくれていますね。
こちらも要件定義のときと同じように、追加の指示を出してブラッシュアップしていくことが可能です。
設計したテーブルについて、特定の言語やフレームワーク(例えばC#EntityFramework)にあわせてプログラムコードを生成してもらうことも可能です。
テーブル設計の他にも、画面設計なども行うことができます。
コーディングにおける活用事例
コーディングにおいてもChatGPTは大活躍してくれます。
今までGoogle検索で調べながら行っていたことのうち、かなりの部分がChatGPTに置き換わっている感じです。
例えば、ChatGPTは以下のようにコードを書いてくれます。
C#でテキストファイルを1行ずつ読み込み、リストへ格納するコードを書いてもらっています。
プログラムを書くときには、プログラミング言語の知識だけではなく、目的に応じて様々なライブラリ・フレームワークを使うための知識が必要になります。
上述したテキストファイルの読み込みも、簡単ではありますがその一例です。
私はこのようなライブラリの利用例を作ってもらうときによくChatGPTを使っています。
使い方をすぐに思い出せないときや、使い方をそもそも知らないとき、どちらの場合にも便利です。
私はこれまでWeb検索で調べていたのですが、最近ではChatGPTにコードを作ってもらい、それをひな形としてコードを書くことが多いです。
ChatGPTの学習モデルは2021年9月までのWeb上のデータで学習を行って作られています。(参考)
なので、2021年時点でWeb上に存在するような情報を組み合わせて答えられる内容であれば、正確に答えてくれる可能性が高まるでしょう。
ただ、やはりChatGPTに作成してもらったコードについては理解できる必要があります。
例えば、私は学習サイトをC#のWebアプリケーション開発フレームワークBlazorで作ろうとしており、ChatGPTの書いたコードを参考にしています。
ChatGPTが書いたBlazorのコードをある程度理解できるのは、私に以下の知識や経験があるからだと思います。
- C#の知識
- TypeScript+Vue.jsやPython+DjangoでWebアプリ開発をした経験
- 書籍等で学んだBlazorの基本的知識
作成してもらったコードが理解できなかったり、不正確と思われる箇所があったりすれば、公式サイトやWeb記事などを調べて確認を行います。
ChatGPTは今回紹介したこと以外にも、以下のように様々な用途で活用できます。
- コードレビューやリファクタリングしてもらう
- デバッグを手伝ってもらう
- ライブラリ選定の助言をもらう
今回は紹介していませんが、ChatGPTだけではなく、GitHub Copilotも使ってみるとよいかと思います(こちらは有料となります)。
GitHub Copilotを使うとコーディング時に高度な自動補完を行ったり、自然言語のコメントからメソッドを自動生成できます。
VisualStudioなどの統合開発環境と連携させて使うことも可能です。
テストにおける活用事例
テストにおいてもChatGPTは役立つかと思います。
私はテストプロセスにおいてまだChatGPTを使ったことはありません。
でも、例えば要件や設計などの情報をもとにテスト設計をしてもらうことが可能ではないかと思っています。
以下はChatGPTが提案してくれた学習サイトの要件の1つ(ユーザ登録・ログイン機能)について、テスト設計をしてもらった例です。
おおざっぱな指示でも、一応テストを作成してくれていますね。
テスト項目の叩き台作成や、作成したテスト項目一覧で漏れている項目がないかどうかの確認などに利用できそうです。
ChatGPT活用のまとめ
要件定義からテストまでの活用事例をみてきました。
まとめると、ソフトウェア開発においてChatGPTを活用する嬉しさは以下の点です。
- 叩き台を作成してもらえるので、ゼロから作成する労力を減らす
- アイディア出しや漏れの指摘をしてもらい気づきを得る
- Web検索の代わりに使い、調査を効率よく行う
こうしてみると、ChatGPTというのは職場の同僚・部下・上司のような存在といえますね。
加えて、何度も述べた通りChatGPTの回答をきちんと理解できることが大事でしょう。
ChatGPTの仕組みと限界
ChatGPTをうまく使うとソフトウェア開発の各プロセスで生産性をかなり上げることができますが、限界もあります。
ChatGPTの仕組みについて簡単に説明した後に、限界について考察します。
ChatGPTの仕組み
ChatGPTの内部で使われている大規模言語モデルは、実は以下のような仕組みがベースになっています。
入力トークン列に対して、学習した知識を元にそのトークン列に後続する確率が高そうなトークンを1つだけ推論して出力します。
トークンとは、文書を分割して扱うための最小単位です。
これを見ると、「あれ?1トークンの出力しかできないのに、どうやって質問に回答しているんだろう?」と思われたかもしれませんね。
ChatGPTは以下のように、出力されたトークンを元の入力トークン列(質問文)へくっつけて、再度推論を行います。
このように、推論を繰り返し行うことで、質問に対する回答文を作成するわけです。
ChatGPTが行っていることは「質問文に対して高確率で続きそうな回答文を生成していく」という感じなのです。
ところで、ChatGPTは過去の会話の内容を覚えていてくれますよね。
これはおそらく以下のような仕組みで実現されていると思われます。
以前の会話部分についても入力トークン列に含めて推論させることで、会話のコンテキストも考慮した回答が行えるわけですね。
この入力トークン列の長さには制限があります。GPT3.5では4,096トークン、GPT4では最大32,768トークンです。(参考)
そのため、「以前の会話部分+質問部分+回答部分」についてはこのサイズに収まっている必要があります。
ChatGPTの限界を考察
ChatGPTの仕組みを踏まえると、以下の点がソフトウェア開発で活用する上で制約事項になってきそうです。
- (1)2021年までのWeb上の知識しか持っていない
- (2)入力サイズに制限がある
- (3)回答が正しいとは限らない
(1)2021年までのWeb上の知識しか持っていない
ChatGPTは2021年までのWeb上の知識しか持たないため、最新の情報に対応していません。
例えば、最新のライブラリやフレームワークに関することを聞いても正確な情報が得られません。
C#の最新バージョンを聞いてみたところ「2021年9月時点でC#10」という回答でした。記事執筆時点(2023年4月)では、C#11が最新ですね。
(2)入力サイズに制限がある
前節で述べた通り入力トークン列の長さには制限があります。
例えば、以下のようなことが起こってしまいます。
- 以前の会話部分が長くなり制限を超えると、ChatGPTは以前の会話を忘れてしまう
- 回答部分が長い場合に最後まで回答文を作成することができず途中できれる
このような制限があるため、以下のようなことをChatTGPTで行うことは現状難しいです。
- ソフトウェアの設計書を丸ごと入力して全てのソースコードを書いてもらう
- 全ソースコードを入力してアーキテクチャ等含めた全体のレビューをしてもらう
ChatGPTに一度に作ってもらえるのは、設計やコードの一部分に限られるということですね。
(3)回答が正しいとは限らない
活用事例でも述べてきた通りです。
ChatGPTは仕組みで述べたように、あくまで質問文に対し確率的に高そうな回答文を生成しているだけなので、正しいとは限りません。
そもそも持っている知識が2021年までのものなので、その意味でも正しい回答を得ることが難しいことも多いです。
ソフトウェア開発のどの工程で使うにしても、ChatGPTの回答をレビューして自分で正しさを判断できる必要があります。
これからのソフトウェア開発で求められるスキル
前節で説明したように、現状のChatGPTの回答が正しいとは限らず人の確認が必要であり、作りたいもの全体を一度に作ることもできません。
実用的なある程度の規模のソフトウェアを作ろうと思った場合、現状のChatGPTは人の補助にとどまるかと思います。
そのため、プログラマやソフトウェア開発に携わる人の仕事がすぐAIに取って代わられるということはないでしょう。
ただ、ソフトウェア開発にChatGPTなどのAI技術をうまく活用する人とそうでない人では、生産性に大きな差が出てくるかと思います。
正直、使ってすぐにこれだけ生産性の向上を実感したサービスや技術はこれまでにないです。
これからのソフトウェア開発で求められるのは、ChatGPTなどのAI技術をうまく活用できるスキルでしょう。
プログラミングはこれからも学ぶ価値があるかと思いますが、AI技術を使って高い生産性でコードを書けることが大事になってくるかと思います。
プログラミング学習についても、わからない点はChatGPTへ聞くなどの活用が考えられます。
ただ、広く普及していて昔からWeb上のドキュメントが多いプログラミング言語の基礎的な事項については、比較的正確な回答が多いかなという印象です。
OpenAIのCEOからは、単純に大規模言語モデルのサイズを大きくすることでGPTの性能を上げていくことに限界があることを示唆する発言もありました。
一方で、以下のように前述した制約事項を解消してくれる可能性がある技術も次々に登場しています。
- LlamaIndex (GPT Index):入力トークン列の長さを超えるような外部データも扱えるようにする
- AutoGPT:自律的に指示を自分でいくつかのタスクに分解し、Web検索で最新の情報を得たりデータを保存したりするなどしながら目的を達成する
ChatGPTへの質問の仕方を工夫してより良い回答を得ることを目指すプロンプトエンジニアリングの研究も盛んに行われていますね。
ファインチューニングを用いて特定ドメインのソフトウェア開発を得意とする大規模言語モデルを作るといったことも考えられます。
AI技術の最近のスピードはとても早く、状況が刻々と変わっています。
実務で使う場合は、法規制・セキュリティ・著作権などの観点でも注意が必要になるでしょう。
このようなChatGPTやAI技術の最新動向を追っていくことも大事ですね。
まとめ
今回の記事の内容をまとめます。
ChatGPTはその汎用性の高さ・学習コストの低さが優れているため、ソフトウェア開発においてこれまでの技術革新以上のインパクトがあるものと思います。
ChatGPTの仕組みを簡単に説明し、限界についても考察しました。
ChatGPTの回答が正しいとは限らず人の確認が必要であり、作りたいもの全体を一度に作ることもできません。なので、現状は人の補助にとどまるでしょう。
プログラミングやソフトウェア開発に関するスキルはまだ有用であり、勉強する価値はあると思います。
ただ、ChatGPTをはじめとしたAI技術を活用する人とそうでない人の生産性の差は大きくなります。
プログラミングにAI技術をうまく活用していくことが大事でしょう。
AI技術の進化スピードは早く状況は刻々と変わるため、最新動向を追っていく必要もありますね。
引き続き、プログラミングやChatGPT・AI技術について楽しく学んでいきましょう!