プログラミング初心者必見！ChatGPTを使って成長を加速させる質問ガイド

### はじめに
私は初心者エンジニアこそChatGPTを使用するべきだと考えています。そう強く思う理由が大きく2つあります。

**1つ目**に私が2023年1月からエンジニアとしてキャリアをスタートした初心者エンジニアであり、ChatGPTの恩恵を日々感じているからです。はじめは手探りにプロンプト（ChatGPTにお願いする命令文）を書いてはうまく伝わらないを繰り返していましたが、今ではエラー解決や新規でクラスやメソッドを作成することもできるようになりました。

**2つ目**に全てのエンジニアがChatGPTを使用してコードを生成する時代がもうすぐ来ると感じるからです。2023年現在パソコンやスマートフォンを使用しないで仕事をしている方はほとんどいないと思います。技術の革新性や話題性を考えるとPCやスマホのレベルで普及するものが現れたと考えるのが自然だと感じます。

2023年時点でChatGPTを触ることができている私たちはAIの歴史の中でいえばChatGPT第一世代かと思います。第一世代として先行者利益的に開拓するもよし、そこで価値のあるポジションを確立するもよし、開拓した情報を次の世代に繋いでいくもよしですが、何より日々使っていて楽しいということは大きなモチベーションになるのではないでしょうか。

## ChatGPTの恩恵
本記事はエンジニア歴一年未満の方を対象とします。
理由は「次にすべきことの手順が思い描けていない」という状態が初心者エンジニアのほうが圧倒的に多いためです。

以下にあるのは私が7月にChatGPTに投げた質問の一例です。
（この時点では無料のGPT-3.5を使用していました。使っていくうちに便利さに気付きはじめて今では月20ドルの課金をしてGPT-4を使用しています）
![スクリーンショット 2023-11-03 9.30.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227208/8b94e7ae-3fc1-9f17-aa85-55a205181e6a.png)

おそらくこのときTeamsチャットで「Javaの環境設定」をするように指示があったのかと思います。しかし初心者エンジニアの方には共感してもらえるかもしれないですが、**環境構築を一人でやるのはめちゃくちゃ難しいです。** そんなときChatGPTを使用すると手順の細分化ができます。

環境構築以外にも大変なことは続きます。データベースはOracleの「SQLDeveloper」、バージョン管理は「TortoiseSVN」を使用しました。そのどれもが初めてであり「何が分からないかも分からない」という状態でした。しかしタスクのチケットは3日ほどで指定されているため、初日の半日もしくは遅くとも初日中には理解して進捗を出さなければなりません。そんな日常のなかでChatGPTは分からない単語などがあってもそのまま分かりやすく手順を解説してくれるため、私にとってなくてはならないツールになりました。

### 質問の仕方について
まず前提としてプロンプトを「短い文章」ではなく「間違って受け取られる可能性をできるだけ排除した長文」で記載することが大切だと私は考えています。

このあたりnoteのCXOである深津貴之さんが「**可能性空間を限定する**」という表現で説明されているのが分かりやすいです。
引用ですが、例えば「リンゴについて教えて」とだけ質問すると「リンゴは、果物の一種で、世界中で広く栽培されている人気の食べ物です」のような一般的な回答が返ってきます。
知りたいことがそれであればいいのですが、もっと詳細な「リンゴ」という果物について知りたいのか、音楽の話で「椎名林檎」やビートルズの「リンゴスター」について知りたいのか、はたまた宗教における「リンゴ」について知りたいのかは様々です。生成された回答が異なった場合は「リンゴの生産一位の都道府県は」「宗教におけるリンゴの位置付けとは」などこちらで質問の可能性を限定していく必要があります。

また持論ですが、私は一度質問をしたあとは次の質問をするのではなく、その質問プロンプトの強調し足りない箇所を修正して、一度目の質問の回答を再生成させることが有効だと考えています。
ChatGPTが前にした質問の文脈を読み取る能力があることは有名ですが、「次の質問をする」「最初の質問を書き換える」の二択を両方試した結果、後者の「最初の質問を書き換える」の方が求めている回答に近づく速度が早いと現場で実践していて感じています。

### 実際にどのような質問をしているか
一例として先月作成した以下のプロンプトを解説します。
こちらもはじめは20〜30行程度の質問でしたが、「**意図した回答が来なければ書き直す**」を何度か繰り返して最終的に欲しい結果が返ってきた際のプロンプトは250行の長文になっていました。「ソースの一部抜粋」という箇所にコピーペーストで長文のコードを読ませています。

```
以下のプログラムについて質問いたします。

------------------------------
「〇〇Service.java」のソースの一部抜粋
------------------------------


「createRowDTO」でデバックを行い「業者情報設定」の直下の行で「gyoshaDTO」の値を見ると三件のデータが格納されています。
これはクエリの実行上正しい挙動です。以下のようなデータが取得できています。
この取得データは業務名称と業務内容のみが異なる三件のデータであるため理想的であるといえます。
123A	会社名	カイシャメイ	代表者名	山田太郎	○○県	○○市○○町7-14	500-1234	0123-45-6789	1	タナカハナコ	田中花子	○○県	○○市○○町7-22	500-1234	有	大	印刷物製造	○○の印刷
123A	会社名	カイシャメイ	代表者名	山田太郎	○○県	○○市○○町7-14	500-1234	0123-45-6789	1	タナカハナコ	田中花子	○○県	○○市○○町7-22	500-1234	有	大	コピー、青写真等	○○のコピー
123A	会社名	カイシャメイ	代表者名	山田太郎	○○県	○○市○○町7-14	500-1234	0123-45-6789	1	タナカハナコ	田中花子	○○県	○○市○○町7-22	500-1234	有	大	事務用品・機器、OA用品類	○○の事務用品

しかし「gyoshaDTO」の最終的に格納される値としては「gyoshaListDTO」のように一行に集約されていることが重要です。
はじめに記載したプログラムの通り、「gyoshaDTO」を一行に集約するプログラムはまだ実装されていません。
最終的に下記のJSPファイルと通過して「gyomuMeisho1」「gyomuMeisho2」「gyomuMeisho3」
「gyomuNaiyo1」「gyomuNaiyo2」「gyomuNaiyo3」の値が正常に画面に表示される挙動を実現したいです。
この挙動が最重要事項です。

------------------------------
「〇〇.JSP」のソースの一部抜粋
------------------------------


上記の最重要事項を実現するために「gyoshaDTO」を一行に集約し、
業務名称及び業務内容が「gyomuMeisho1」「gyomuMeisho2」「gyomuMeisho3」
「gyomuNaiyo1」「gyomuNaiyo2」「gyomuNaiyo3」に格納されている状況を実現したいです。

はじめに記載したプログラムはServiceクラスの抜粋であり、ここに記述することかと想定しています。
はじめに記載した「検索処理を行う」のコメントの以下に続くプログラムに、
上記の最重要事項を実現するためのコードを記載して提示してください。
またそのコードの記載箇所についてプログラミング初心者にも分かるよう解説してください。
参考までに「〇〇DAO.java」のソースを以下に記載します。

------------------------------
「〇〇DAO.java」のソースの一部抜粋
------------------------------


```

上記の質問はSQLから受け取った値を加工し直すメソッドの作成依頼なのですが、返ってきたコードをほとんどそのまま組み込んでも機能しました。
本気でChatGPTにクラスやメソッドを書かせようとする際には「**機能するまでとことん質問(プロンプト)のクオリティを上げる**」というプロセスが決定的に大事になってくるかと思います。

しかし2023年現在はそう書いていますが、進化の速度が本当に速いので来年にはそんな粘り強い努力をせずとも簡単にプログラムを作成してくれているかもしれません。


## おすすめのプロンプト5選
前置きが長くなりましたが、ChatGPTを使用してプログラミング学習を進めるための、おすすめのプロンプトをいくつか紹介します。

#### 例１）　言い回し
```
   以下の〇〇について
```
または
```
   上記の〇〇について
```
→すごく初歩的なことですが、ソースをそのままコピーペーストして質問することが多いためこの言い回しは非常によく使います。私は「以下の〜」をよく使います。理由として、文頭にソースをペーストして「上記のメソッドについて〜」などと文末で質問をしはじめると、文頭のソースのブロックに日本語が少なすぎて英語の質問だと勘違いされ英語で回答が返ってくることが多いからです。生成を一度ストップして、一行目に「日本語で回答してください」と打ち込めば済む話なのですが、一手間が面倒なので「以下の〜」と打ってからソースのブロックは質問文の下に記載することが多いです。


#### 例２）　エラー解決
```
   以下のエラーについて原因と推測できる箇所が分かりましたら具体的な解決方法を教えてください。
   
   ------------------------------
   エラーメッセージをコピーペースト
   ------------------------------
```
→こちらはエラーメッセージのどの箇所が原因か特定できないレベルの初心者の方向けになります。重要なエラー箇所が特定できることに加えて、エラーメッセージが「意味不明な英語の長文」にしか見えないレベルの方にはChatGPTが翻訳してくれた日本語を読みながら解読することができるので、苦手意識の克服にも役に立つと思います。ただし、最終的にはこれに頼ることなくエラーメッセージそのものを読めるようになるべきかとも思います。自転車乗りはじめの補助輪のようなものですので、最終的には補助無しでも走れるようになることが大事だと思います。


#### 例３）　末尾に一言
```
   プログラミング初心者にも分かるよう解説してください。
```
→使い方としては質問プロンプトを一通り打ったあとで末尾に記載してください。中〜上級者向けのプログラミング用語を分かりやすく噛み砕いて説明してくれるようになります。入れておいて損がないので私はほとんどの質問に入れています。この他にも「小学生にも分かるように」など別の方法も試してみたのですが、データ送信を「お手紙」と例えるなど、むしろ分かりにくくなったので上記のプロンプトに落ち着いています。

#### 例４）　手順説明
```
   〇〇をする際の手順を10つほどのステップで説明してください。
```
→例えば「Githubでコンフリクトを解消する際の手順を10つほどのステップで説明してください。」などと打ち込んで、少し細かすぎるくらい細分化して説明してもらうと手順系は分かりやすいです。このステップ数を指定しない場合もっと粒度が荒くなるので、それでも理解できる方はいいですが、初めての作業で何が分からないかも分からない状態であれば10つほどに細分化するのはおすすめです。

#### 例５）　質問メールを壁打ち
```
   以下のメール内容について回答してください。
   
   ------------------------------
   質問メールのコピーペースト
   ------------------------------
```
→なぜか回答のクオリティが上がった偶然の産物を最後に紹介します。私の現場は「一時間考えて進みが滞っていれば質問してください」とルール化されているのですが、ある日あるエラー解決が難航して質問メールの長文を作成しました。作成し終わったときにふと、これをChatGPTに質問したらどうなのか興味が湧き、実際に試してみました。するとそれまで何度も書き込んだプロンプトとまた違った回答が現れて、結果的にそのメールは送信することなく問題は解決しました。この現象は一度ではなく何度も起きました。理由はまだ分かっていないのですが、人に説明するために前提の状態などをより丁寧に共有した文章を作成したため、ChatGPTに対しても丁寧に意図が伝わりそのような現象が起きたのかと推測しています。


## まとめ
繰り返しになりますが、おすすめプロンプトはあくまで一例であり、ここで返ってきた回答の食い違っている部分について**何度も書き換えて**いって最終的に「間違って受け取られる可能性を排除した長文」を作成することが重要です。
そのためのヒントになりそうなプロンプトをいくつか紹介しましたが、私自身まいにち試行錯誤しているので、来週にはもっと画期的なプロンプトを思い付いているかもしれません。
ChatGPTそのものの進化も早く、より便利になっていっているので2023年11月時点での初心者エンジニアの記録としてご容赦ください。
全てのエンジニアがググるように、全てのエンジニアがChatGPTでコードを生成する時代は来ると思います。環境の変化に取り残されないよう、先乗りして変化を楽しめるよう一緒に成長していきましょう。