avaice's portfolio

avaice's portfolio

に公開

ChatGPTが登場してしばらく経ちました。コーディングのお供として使えないかと試行錯誤しているうちに良い使い方がわかってきたので、まとめてみようと思います。

※今回は、個人開発での話です。業務で書くコードのように機密性の高いものは、ChatGPTには読みこませない方が良いでしょう。

ChatGPTを使って最低限の可読性を保証する

以下のプロンプトでは、JavaScriptで書いたFizzBuzz問題のプログラムをChatGPTに作成したコードを解説させようとしています。

このプログラムの解説を300文字程度でしてください。

function fizzBuzz(number) {
    let result = ""

    if (number % 3 === 0) {
        result = result + "fizz"
    }
    if (number % 5 === 0) {
        result = result + "buzz"
    }

    return result
}

const checkValue = 30
const fizzBuzzResult = fizzBuzz(checkValue)
console.log(fizzBuzzResult)

Chat GPTの解答

このプログラムは、与えられた数値に対してFizzBuzz問題を解く関数です。 与えられた数値が3で割り切れる場合、文字列"fizz"を結果に追加します。 また、数値が5で割り切れる場合、文字列"buzz"を結果に追加します。 最終的な結果の文字列を返し、与えられた数値が30の場合には、"fizzbuzz"がコンソールに出力されます。 このプログラムは、3と5の倍数に対して適切な文字列を生成するシンプルなFizzBuzz実装です。

このようにChatGPTの返す解説内容が適切であった場合は、自分以外にも理解できるコードが書けているということなので、このコードは最低限の可読性は保証されていると言えるでしょう。

ピンポイントに解説させる

また、続けて以下のように質問をすることで、変数の命名など気になる点をピンポイントで確認することができます。

fizzBuzzResultはどのような役割を持つ変数と考えられますか?
また、これは適切な変数名だと思いますか?

Chat GPTの解答

fizzBuzzResultは、fizzBuzz関数を使用して計算されたFizzBuzzの結果を格納する変数です。プログラムの最後で、与えられた数値 checkValue(この場合は30)に対してFizzBuzz関数を呼び出し、その結果をfizzBuzzResultに代入しています。そして、最終的な結果をコンソールに出力しています。  変数名としては、fizzBuzzResultは一般的に理解しやすく適切な名前です。

コードを書く時によく変数の命名に頭を悩ませることがありますが、このように聞いてみることで最低限の品質を保った変数名にすることができます。

逆に、このコードのfizzBazzResultがjikkoukekkaIchijiHozonだったらどうでしょうか。一番最初に提示したコードを書き換えて、続けて再度質問してみます。

jikkoukekkaIchijiHozon はどのような役割を持つ変数と考えられますか? 
また、これは適切な変数名だと思いますか?

Chat GPTの解答

変数 jikkoukekkaIchijiHozon は、関数 fizzBuzz を実行した結果を保持するための変数です。この変数名は、日本語で「実行結果を一時保存」といった意味ですが、一般的なプログラミングコードでは少し冗長で理解しにくい名前と言えます。

より適切な変数名の例は以下のようなものです:

result : 関数の結果を保持する変数

output : 出力結果を保持する変数

fizzBuzzResult : fizzBuzz関数の実行結果を保持する変数

このように、変数名はコードの読みやすさと理解しやすさを向上させるために適切で簡潔なものにすることが重要です。

(流石に極端な例ではありますが、)このような一般的に理解しづらい変数は指摘してくれます。

より良いロジックの模索

次に、以下のデータで"age"がすべて18歳以上であるか確認する処理を行いたいとします。

[
    { "id": 1, "name": "Alice", "age": 28, "sex": "female" },
    { "id": 2, "name": "Bob", "age": 35, "sex": "male" },
    { "id": 3, "name": "Charlie", "age": 22, "sex": "male" },
    { "id": 4, "name": "David", "age": 40, "sex": "male" },
    { "id": 5, "name": "Eva", "age": 31, "sex": "female" },
    { "id": 6, "name": "Frank", "age": 19, "sex": "male" },
    { "id": 7, "name": "Grace", "age": 27, "sex": "female" },
    { "id": 8, "name": "Henry", "age": 45, "sex": "male" },
    { "id": 9, "name": "Ivy", "age": 29, "sex": "female" },
    { "id": 10, "name": "Jack", "age": 33, "sex": "male" }
]

JavaScriptで愚直に実装すると、こうなります。

function verifyAllMembersAreAdult(members){
    for(let i = 0; i < members.length; i++){
        if(members[i].age < 18){
            return false
        }
    }
    return true
}

「でも、ちょっと長いな...。確かArrayオブジェクトのメソッドでもっとシンプルにできる方法なかったかな?でもちょっと覚えてないな...。」←こんな時ありませんか?

こういう時、ChatGPTの出番です。

これは、メンバー全員が18歳以上であるか確認するロジックです。もっと簡略化する方法はありませんか?

function verifyAllMembersAreAdult(members){
    for(let i = 0; i < members.length; i++){
        if(members[i].age < 18){
            return false
        }
    }
    return true
}

Chat GPTの解答

もちろんです!与えられたコードを簡略化する方法があります。以下は、短くても同じ機能を果たすコード例です。

function verifyAllMembersAreAdult(members) { 
    return members.every(member => member.age >= 18);
}

このコードでは、every メソッドを使用して、配列の全ての要素が条件を満たすかどうかを確認しています。各メンバーの年齢が18歳以上であるかをチェックし、全てが条件を満たす場合に true を返し、一つでも条件を満たさない場合に false を返します。コードが短く、よりシンプルになっています。

このように、より最適な手段を提案してくれます。同じ内容をGoogleで調べるよりも、圧倒的に早いのではないでしょうか。

ChatGPTの解答を100%信じてはいけない

このようにChatGPTはコーディングの効率を大幅に向上してくれる一方で、解答の精度はあまり高くないという欠点があります。

特に、数字が絡んでくると解答の精度が大きく下がる気がします。

ですので、最終的な確認は自身で行うようにして、ChatGPTのことは「物知りだけど知識が雑な友人」くらいに思っておくのが良いと思います。

おわりに

実際に数ヶ月コーディングのお供に使ってみて、ChatGPTは上手に活用すればコーディング効率を何倍にも上げられるのではないかと感じました。特に、Google検索だと解決策をうまく見つけられず、質問サイトなどで誰か人の手を借りないと分からないような場面においては、とても有用だと思います。

しかし、先に述べたように、現状解答の精度は半信半疑で使った方が良いくらいのレベルなので、頼りきりになってしまうのは少し危険かもしれません。