ChatGPTとのペアプログラミング - 開発者の夢が現実に

  1. 人間とChatGPT:完璧なシナジー
  2. 今度はChatGPTが私のコードをレビューする番
  3. ペアプログラミングにおけるChatGPTの利点
  4. 潜在的な欠点
  5. Visual Studio CodeでのGitHub Copilot
  6. コラボレーションの新時代

フルスタック開発者として、私は長年にわたって多くの人間とペアプログラミングを実践してきました。しかし、最近OpenAIによって訓練された大規模言語モデルであるChatGPTと作業する機会があり、それはゲームチェンジャーでした。ChatGPTは私の役割を置き換えるのではなく、ペアプログラミングの相棒として働き、貴重な洞察と視点を提供してくれることがわかりました。それが私のペアプログラミング体験をどのように変革したかを詳しく見てみましょう!

人間とChatGPT:完璧なシナジー

人間の開発者とChatGPTのパートナーシップは非常にユニークです。私の典型的なループは以下の通りです:

  1. 要件収集:人間の開発者が特定の機能や関数の要件を提供します。ChatGPTがコードを書き、人間がレビューします。
  2. 要件の要約:ChatGPTに私の要件を要約してもらうことが非常に有用だと感じました。私は通常、要件を一度に提供しないからです。これにより、私たちが同じページにいるかどうかを確認できます。
  3. 単体テストテンプレート:ChatGPTが要約された要件に基づいて単体テストテンプレートを生成します。
  4. 人間が単体テストを完成・改良:人間の開発者が単体テストを完成・改良し、ChatGPTにフィードバックを提供して、タスクの理解を洗練させます。

今度はChatGPTが私のコードをレビューする番

逆に、人間がプログラムを書いてChatGPTにレビューとコードの要約を依頼することもできます。このプロセスは潜在的な問題を特定し、コードが望ましい要件を満たしていることを確認するのに役立ちます。しかし、時にはコードの塊を投げつけるのではなく、ChatGPTを少し手助けする必要があるかもしれません。例えば、

試行#1、単純にレビューを依頼

プロンプト:

main.tfの以下のterraformコードをレビューしてください。

resource "some_resource" "resource_name" {
  name = "some_name"
  value = condition == true ? "aaa,bbb,ccc,${var.b}" : "${var.a},aaa,bbb,ccc,${var.b}"
}

レスポンス

提供されたコードは、「some_resource」という名前のリソースを「resource_name」という名前で作成し、「name」属性を「some_name」に設定します。さらに、条件に基づいて「value」属性を設定します。「condition」変数がtrueの場合、「value」は「aaa,bbb,ccc,${var.b}」に設定されます。「condition」がfalseの場合、「value」は「${var.a},aaa,bbb,ccc,${var.b}」に設定されます。

変数「a」、「b」、「condition」が適切に定義されていることを前提とすると、コードは有効で機能的に見えます。ただし、リソースタイプとその属性がインフラストラクチャのニーズに対して正しく適切に設定されていることを確認することが重要です。さらに、コードの目的を理解しやすくするために、リソースと属性に説明的な名前を使用することは良い慣行です。

上記は意味がないように聞こえます。質問を少し改良してみましょう

試行#2、コードレビューで何を求めているかを伝える

プロンプト:

main.tfの以下のterraformコードをレビューしてください。より良いコーディングを提案できますか?

resource "some_resource" "resource_name" {
  name = "some_name"
  value = condition == true ? "aaa,bbb,ccc,${var.b}" : "${var.a},aaa,bbb,ccc,${var.b}"
}

レスポンス

コードは構文的には問題ないようですが、提案をお探しの場合、以下のようなものがあります:

リソースには意味のある名前を使用することは常に良いアイデアです。そうすることで、後で簡単に識別できます。「some_resource」と「resource_name」の代わりに、より説明的な名前を考えてみてください。

value属性では、複雑な式に三項演算子を使用することは一般的に避けた方が良いです。コードが読みにくく理解しにくくなる可能性があるからです。代わりに、式を複数行に分割するか、計算された値を保持する別の変数を作成することを検討してください。

必要な場合にのみ補間構文(${…})を使用することを検討してください。この場合、var.aとvar.bは既に変数なので、+演算子を使用して他の文字列と単純に連結できます。

これらの提案でコードをリファクタリングする方法の例は以下の通りです:

resource "some_resource" "example" {
  name  = "example_resource"
  value = compute_value(var.a, var.b, condition)
}

// 値を計算する別の関数を定義
// これによりコードが読みやすく理解しやすくなり
// 必要に応じて再利用も可能になります
locals {
  compute_value = (a, b, condition) => {
    if condition {
      "aaa,bbb,ccc," + b
    } else {
      a + ",aaa,bbb,ccc," + b
    }
  }
}

このコードは、入力変数と条件フラグに基づいて値を計算する別の関数を定義するためにローカル変数を使用します。これによりコードが読みやすく理解しやすくなり、必要に応じて再利用も可能になります。

魔法の質問*「より良いコーディングを提案できますか?」*により、はるかに意味のある結果が得られます。ただし、私が変数の一部(,aaa,bbb,ccc,${var.b})を繰り返していることを発見できませんでした。これはDRY原則に反します。私は少し書き直して、以下のように再度尋ねました。

試行#3、私の2つのコードについて意見を求める

プロンプト:

どちらのterraformコードが良いですか?より良いコーディングを提案できますか?

コード1resource "some_resource" "resource_name" {
  name = "some_name"
  value = condition == true ? "aaa,bbb,ccc,${var.b}" : "${var.a},aaa,bbb,ccc,${var.b}"
}

コード2locals {
    a = {
      "aaa",
      "bbb",
      "ccc",
      var.b,
    }
  }
  resource "some_resource" "resource_name" {
  name = "some_name"
  value = join(",", condition == true ? [] : var.a, local.a)
}

レスポンス

両方のコード例は有効で機能的ですが、異なる目的と実装を持っています。

コード1は三項演算子を使用して、条件に基づいて「some_resource」リソースの「value」属性を設定します。属性を設定する簡潔な方法ですが、より複雑な式では読みにくくなる可能性があります。

コード2はローカル変数を使用して、結合される値のリストを作成します。「join」関数を使用して、リスト内の値をカンマを区切り文字として連結します。このアプローチは、より長い値のリストと式に対してより読みやすくなる可能性があります。

最終的に、これら2つのコード例の選択は、インフラストラクチャの特定のニーズと要件によって決まります。値の小さなリストと単純な条件がある場合、コード1がより適切かもしれません。値のより長いリストとより複雑な式がある場合、コード2がより適切かもしれません。
より良いコーディングを提案するために、両方のコード例の最良の部分を組み合わせて、より読みやすく、保守しやすく、拡張可能なコードを作成することをお勧めします。

locals {
  some_values = [
    "aaa",
    "bbb",
    "ccc",
    var.b,
  ]
}

resource "some_resource" "resource_name" {
  name  = "some_name"
  value = join(",", concat(var.a, condition ? [] : local.some_values))
}

このコードでは、ハードコードされた値と「var.b」変数を格納するためにローカル変数を使用します。次に、「concat」関数を使用して「var.a」とローカル変数の値を連結します。最後に、「join」関数を使用して値をカンマ区切り文字で連結します。

このコードは、前の例よりも読みやすく、保守しやすく、拡張可能です。ハードコードされた値を変数から分離し、三項演算子の代わりにより読みやすい「concat」関数を使用し、より簡潔な「join」関数を使用します。

これは人間とAIの両方からの改善を組み合わせています!ただし、私は労力がかからないので、試行#2を最も使用する可能性があります。

ペアプログラミングにおけるChatGPTの利点

他の人間の代わりにペアプログラミングでChatGPTを使用することの主な利点は以下の通りです:

  1. 24時間365日の可用性:ChatGPTは常に利用可能で、インスピレーションが湧いた時にいつでもプロジェクトに取り組むことができ、他の開発者を待つ必要がありません。
  2. 即座のフィードバック:リアルタイムでコードのフィードバックを受け取り、開発プロセスを合理化します。
  3. 一貫性:ChatGPTは人間のバイアスや気分の変動から解放された、一貫したフィードバック品質を提供します。
  4. 多様性:ChatGPTは人間のペアプログラマーが持たない可能性のある多様な視点と洞察を提供できます。これにより、より創造的で革新的なソリューションにつながる可能性があります。
  5. 学習機会:ChatGPTの提案とコードレビューを観察することで、開発者は新しいコーディング技術とベストプラクティスを学ぶことができます。

潜在的な欠点

例で示したように、十分な背景を提供しないか、正しい質問をしない場合、レビュー結果は満足のいくものではないことに気づくべきです。

Visual Studio CodeでのGitHub Copilot

コード補完には役立ちますが、現在のところ対話性に欠けています。

コラボレーションの新時代

ChatGPTとのペアプログラミングはゲームチェンジャーです。人間の開発者とAIの間の強力なシナジーを提供し、開発プロセスを合理化し、新しい学習機会を提供します。人間の開発者の創造性と問題解決能力を置き換えることはできませんが、ChatGPTは現代の開発者のツールキットにおいて非常に貴重なツールです。ぜひ試してみて、ペアプログラミングの未来を自分で体験してください!

シェア