【ChatGPT】エンジニアが開発業務にChatGPTを使ってみた感想
今ごろになってChatGPT?
最近ふと、IT業界に身を置きながらAIのような先端技術とは程遠い仕事をしているなぁと思いました。
主に業務システムを開発していて、AI開発はもちろんAIを利用した経験もゼロ。。。
どんどん進化するAIやそれを駆使したクリエイティブな取り組みをネットで見ると、変化していく時代の中で取り残されている感じがします。
このままではマズイと思ったので、まずはAIに慣れるため開発業務でChatGPTを使ってみました。
ChatGPTを使ってコードを生成
プログラミングをする人にとっては王道の使い方ではないでしょうか。
今回はPHPでAjaxリクエストを処理するクラスを吐いてもらいましょう!
まずはお手並み拝見
PHPでAjaxリクエストに対する関数を登録してリクエストごとに関数を適宜実行するクラスを作成してください。
PHPでAjaxリクエストに対する関数を登録し、リクエストごとに関数を実行するクラスを作成することができます。以下は、簡単な例です:
1class AjaxHandler {
2 private $registeredFunctions = [];
3
4 public function __construct() {
5 // リクエストの処理
6 $this->handleAjaxRequest();
7 }
8
9 public function registerFunction($name, $callback) {
10 $this->registeredFunctions[$name] = $callback;
11 }
12
13 private function handleAjaxRequest() {
14 if (isset($_POST['action']) && isset($this->registeredFunctions[$_POST['action']])) {
15 $action = $_POST['action'];
16 $callback = $this->registeredFunctions[$action];
17 $result = call_user_func($callback);
18 echo json_encode($result);
19 }
20 }
21}
22
23// インスタンスを作成
24$ajaxHandler = new AjaxHandler();
25
26// 関数を登録
27$ajaxHandler->registerFunction('myFunction', function() {
28 // ここにAjaxリクエストに対する処理を記述
29 return "Hello from myFunction!";
30});
31
このクラス AjaxHandler
は、Ajaxリクエストに対する関数を登録し、リクエストを処理するための簡単なフレームワークを提供します。registerFunction
メソッドを使用して関数を登録し、Ajaxリクエストに ‘action’ パラメータが含まれている場合、該当する関数を実行します。
Ajaxリクエストを送信する際、リクエストの ‘action’ パラメータに関数名を指定し、サーバー側でその関数を呼び出すことができます。このクラスは、Ajax関数の処理を中心に構築されており、リクエストごとに関数を適切に実行します。
セキュリティ上の注意事項:このコードはセキュリティに配慮していません。実際のアプリケーションで使用する際には、十分なセキュリティ対策を施すことが不可欠です。データ検証、エスケープ、アクセス制御などのセキュリティ対策を適用することをお勧めします。
んんん?
なんかおかしくね?
生成されたAjaxHandlerクラスは
- registerFunctionメソッドで関数を登録
- handleAjaxRequestメソッドでAjaxリクエストに対応する関数を実行
の手順で使うはず。
でも4行目のコンストラクタで関数の登録もせずいきなりAjaxリクエストをさばこうとしている。
やり直しを要求する!
ちょっと私の日本語が悪かったのかもしれませんね。
生成されたコードのバグを指摘して修正してもらいます。
コンストラクタ内でリクエストを処理していますが、これだとインスタンス生成時に何の関数も登録されていないので、リクエストを処理できないのでは?
申し訳ありません、ご指摘いただいた通りです。コンストラクタ内でリクエストを処理するのは、関数の登録よりも前に実行されてしまうため、問題が生じます。正しい動作を得るために、リクエスト処理と関数登録を分離する必要があります。
以下に修正したコードを示します:
1class AjaxHandler {
2 private $registeredFunctions = [];
3
4 public function __construct() {
5 // コンストラクタでは何もしません
6 }
7
8 public function registerFunction($name, $callback) {
9 $this->registeredFunctions[$name] = $callback;
10 }
11
12 public function handleAjaxRequest() {
13 if (isset($_POST['action']) && isset($this->registeredFunctions[$_POST['action'])) {
14 $action = $_POST['action'];
15 $callback = $this->registeredFunctions[$action];
16 $result = call_user_func($callback);
17 echo json_encode($result);
18 }
19 }
20}
21
22// インスタンスを作成
23$ajaxHandler = new AjaxHandler();
24
25// 関数を登録
26$ajaxHandler->registerFunction('myFunction', function() {
27 // ここにAjaxリクエストに対する処理を記述
28 return "Hello from myFunction!";
29});
30
31// リクエストを処理
32$ajaxHandler->handleAjaxRequest();
33
修正後のコードでは、Ajaxリクエストの処理を担当する handleAjaxRequest
メソッドは、関数の登録後に明示的に呼び出すことになります。これにより、関数が登録された後にリクエストを処理できるようになります。
これでバグが直りました。インスタンス化→リクエスト処理までのフローもこちらの想定通りです。あとは必要に応じてカスタムします。
指摘されたコンストラクタの中に「コンストラクタでは何もしません」とコメントしているところが面白いですね。
感想
かなり使えるけど、完璧ではない
この後も配列操作の関数をいくつか生成してもらいました。
おおよそのコードの型はできているんですが、細かい所にバグがあったり、こちらの意図を正確に反映していなかったりします。
結局生成されたコードをレビューすることになりましたが、人力でコーディングするより短時間で作業を終えられました。
なお、ChatGPTが回答の生成に使用する情報は最新でないことに注意が必要です。
これはChatGPTがインターネットに直接接続されておらず、ある時点での情報を元に回答するためです。
言語、ライブラリ、フレームワークなどは更新され続けるため、古い情報を元に生成されたコードには非推奨または廃止された機能、メソッド等が含まれている可能性があります。
生成されるコードがコンパクトになるよう心掛ける
いくつかのコードを生成してみた結果、意外とミスがあることが分かりました。
複雑で長いコードを生成しようとするとバグが増えてしまい、レビューと修正の負担増加の公算が大きいです。
数十行程度の小さな関数やクラスならともかく、数百行にもなりそうな処理の場合は要求を細かく分解してリクエストした方がいいかもしれません。
コードを生成したチャットはしばらく残すといいかも
どんな経緯で生成されたコードか履歴を追いたくなるかもしれないので、欲しいコードを生成し終えた後もチャットはしばらく残しておくといいかもしれません。
ChatGPTの会話をテキストや画像として保存するツールもあるようなので、そちらを使ってもいいかもしれませんね。
これからはChatGPTの会話ログがSEにとって大事な資産になりそうです。