生成AIを使うとコード理解はラクになるか?
生成AIの活用方法として、質問応答や文章生成を思いつく方が多いと思います。しかし、コードを読むときにも生成AIをうまく使えば、効率化につながります。
どういう読み方があるか、どのくらいラクになるかをみんなで考えるイベントを計画しています。イベントは2日に分かれています。初日でこちらで用意するコードを読んでいただきます。その結果を集計して、2日目にみんなで議論します。2日目はタワーズ・クエストの和田卓人氏、GitHub服部佑樹氏をゲストに迎えて、議論に視点を加えていただきます。
初日は以下のいずれかの形式でコードを読んでいただきます。オンラインイベント(2024/4/23 19:00~, 4/25 19:00~のいずれか)か4/26~5/2の間のどこかで読んでいただきます。無料ですが事前申し込みが必要です。2日目の参加方法は初日に参加くださった方にお知らせします
- 4/23: https://software-reviews.connpass.com/event/315340/
- 4/25: https://software-reviews.connpass.com/event/315336/
- 4/26~5/2: https://software-reviews.connpass.com/event/315337/
では、生成AIをコードを理解するときにどういうふうに使えるか以降で例を使って説明します。
以下のようなコードを例に説明します。このコードは0から99までの数字を標準出力に出力します。3の倍数のときには「3の倍数」、数字が3を含むときは「3を含む」と数字の横に表示します。これらの概要がまだわかっていないときに生成AIを使ってどのようにコードを読めるのかを例を示したいと思います。
コード
public class Sample {
public static void main(String[] args) {
String line = new String();
for (int i = 0; i < 100; i++){
line = String.valueOf(i);
if (isAFactor(i, 3)) line += " 3の倍数";
if (includesNumber(i, 3)) line += " 3を含む";
System.out.println(line);
}
}
public static boolean isAFactor(int a, int b){
if ((a % b) == 0) return true;
return false;
}
public static boolean includesNumber(int a, int b){
String stra = String.valueOf(a);
String strb = String.valueOf(b);
return stra.contains(strb);
}
}
これを読むときに、以下のようなプロンプトを使って1行ずつ読む前に概要を把握できます。
生成AIに与えたプロンプト
次のJavaコードXにどのようなメソッドがあるかを列挙して、それぞれのメソッドを説明してください。
JavaコードX「
(上のコード全体を貼り付け)
」
生成AIからの回答例(Geminiの結果)
JavaコードXのメソッド一覧と詳細説明
クラス: Sample
このクラスは、1から100までの整数をループで処理し、それぞれについて以下の条件を判定し、結果を出力するプログラムです。
メソッド:
main(String[] args)
: プログラムのエントリーポイントとなるメソッドです。isAFactor(int a, int b)
: 整数a
が整数b
の約数かどうかを判定するメソッドです。includesNumber(int a, int b)
: 整数a
の文字列表記中に整数b
の文字列表記が含まれているかどうかを判定するメソッドです。
メソッド詳細:
1. main(String[] args)
- 引数:
String[] args
: コマンドライン引数 - 処理内容:
- 空の文字列変数
line
を宣言します。 i
を0から99までループさせます。- 現在のループインデックス
i
を文字列に変換し、line
に代入します。 isAFactor(i, 3)
がtrue
の場合、line
に " 3の倍数" を追記します。includesNumber(i, 3)
がtrue
の場合、line
に " 3を含む" を追記します。line
の内容をコンソールに出力します。
- 現在のループインデックス
- 空の文字列変数
2. isAFactor(int a, int b)
- 引数:
int a
: 判定対象となる整数int b
: 約数候補となる整数
- 処理内容:
a
をb
で割ったときの余りが0であればtrue
を返し、そうでなければfalse
を返します。
3. includesNumber(int a, int b)
- 引数:
int a
: 判定対象となる整数int b
: 文字列として比較する整数
- 処理内容:
a
とb
をそれぞれ文字列に変換します。a
の文字列中にb
の文字列が含まれているかどうかを判定し、含まれていればtrue
を、そうでなければfalse
を返します。
これで、大まかに概要を把握した上で、細かく読んでいくことで読解の時間を短くすることができます。
このやりとりのもとに、次のようにメソッドisAFactorを細かく知るためのプロンプトでより詳しく知ることができます。
生成AIに与えたプロンプト
メソッドisAFactorの前提があれば教えてください
生成AIからの結果(Geminiでの回答)
メソッド isAFactor
の前提条件
メソッド isAFactor
は、整数 a
が整数 b
の約数かどうかを判定するメソッドです。このメソッドは以下の前提条件に基づいています。
1. 引数は整数型であること
a
とb
は、int
型の整数値である必要があります。- その他の型 (例: 文字列、浮動小数点) は受け付けません。
2. b
は0でないこと
b
の値が0であると、プログラムの実行中に例外が発生します。- 0はどのような整数にとっても約数ではないため、
b
は常に0以外の値である必要があります。
3. a
は b
よりも大きいこと
a
の値がb
の値よりも小さい場合、a
はb
の約数になり得ません。- これは、約数の定義上、
a
をb
で割ったときに余りが0になる必要があるためです。
4. オーバーフローが発生しないこと
- 非常に大きな整数値を
a
やb
に渡した場合、計算中にオーバーフローが発生する可能性があります。 - オーバーフローが発生すると、結果が正しく得られない可能性があります。
5. 整数除算に関する規則に従うこと
- メソッド
isAFactor
は、整数除算 (a % b
) を使用してa
がb
の約数かどうかを判定します。 - 整数除算に関する一般的な規則 (例: 負の数の除算、ゼロによる除算) に従う必要があります。
上述5つくらいを挙げてくれて、isAFactorを別の用途で使う場合や今回のコードで使う上での制限がわかります。