コンテンツにスキップ

ワークショップ概要

Zava の Temperature API を Python から C# へ移行する

Zava は最近、Python でアプリ開発をしている企業を買収しました。買収した企業のアプリケーションには、気温・季節・地域に関する処理を行う API エンドポイントが多数含まれており、Zava のプロダクトラインとの親和性が高いものでした。Zava のメインバックエンドと運用ツールは C# で構築されているため、技術部門のリーダーたちは、買収した Python サービスを C#/.NET エコシステムへ段階的に移行する方針を打ち出しました。

この移行プロジェクトの目的は、Zava プラットフォーム全体の技術スタックを統一し、運用保守を簡素化し、買収したサービスと既存の .NET ベースバックエンドとの統合を円滑にすることです。Python ベースの Temperature API を C# に移行することで、コンパイル時の型チェックによる安全性の向上、実行時パフォーマンスの改善、Azure 上での Zava エンタープライズ標準との整合性確保を実現します。この API は複数の国・都市・月日にまたがる気象履歴データを提供しており、Zava のスマートファイバー製品が環境条件に適応するために不可欠なデータです。

このワークショップでは、GitHub Copilot を活用し本格的な移行シナリオを体験します。買収した企業の Python ベースの API を、段階的に C# で再実装し、動作の互換性を保ちながら、コードの保守性を高め、Zava のメインバックエンドへの統合をスムーズに進めていきます。

🎯 このワークショップが重要な理由:実際の開発現場の文脈で

本番環境における言語間マイグレーションの意義

Zava が C# を選んだ理由

  • 買収後の既存 C# バックエンドや社内ツールとの統合が容易になり、統合コストと市場投入までの時間を短縮できる
  • Azure エコシステムとの深い統合 (Application Insights・Azure AD・IaC ツール群) によりエンタープライズデプロイが確実になる
  • Visual Studio・JetBrains Rider・.NET アナライザーなどの豊富なツール群により、開発生産性とリファクタリング・デバッグ効率が大規模でも維持される

本番環境で段階的な検証が重要な理由

  • リスク管理: エンドポイントごとに検証することでエラーの影響範囲を最小化できる
  • 継続的な検証: Python テストを維持し続けることで、新実装が元の動作と一致することを常に確認できる
  • 自信の構築: ステップバイステップの検証がチェックポイントとロールバック地点を明確にする
  • AI との賢い付き合い方: 小さな変更を検証することで、AI の提案をいつ信頼しいつ疑うべきかの感覚が養われる

ここからは、GitHub Copilot に対していくつかの難しいリクエストを出しながら、実際に直面する課題に一緒に対処していきます。

Note

このリポジトリは、GitHub Copilot のさまざまな機能(Copilot ChatインラインチャットAgent モード)を Visual Studio Code 内で体験することを目的としています。そのため、以下のステップバイステップガイドでは「何をすべきか」という概要を示し、具体的なコマンド生成は Copilot に任せます。

各ステップ(該当する場合)には Cheatsheet / Tip が用意されており、Copilot の提案を正しいコマンドと照合して確認できます。

💡 さまざまなプロンプトを試して、GitHub Copilot の提案精度への影響を確かめましょう。たとえばインラインチャットでは、プロンプト全体を書き直すことなく追加のプロンプトで回答を洗練させることができます。

ワークショップの構成

Python プロジェクト(買収したサービスを想定)を使って作業します。このプロジェクトは HTTP API を公開しており、C# の .NET Minimal APIs を使って再実装・統合することが主なタスクです。

Zava エンタープライズ標準 — この移行がもたらす価値

Zava は本番環境で稼働するサービスに対して、一連のエンタープライズ標準を定めています。以下の主要な標準と、C#/.NET への移行がそれぞれの標準をより効果的に満たす理由を示します。

  • セキュリティとアイデンティティ: .NET には安全な認証・認可のための成熟したライブラリ (Azure AD 統合・トークン検証・強力な暗号化ライブラリ) と堅牢なセキュリティスキャン・ポリシー適用ツールのエコシステムがある
  • オブザーバビリティと診断: Application Insights との深い統合・構造化ログ (ILogger)・分散トレーシング・ファーストクラスのテレメトリ SDK により、Zava のオブザーバビリティ SLA を満たしやすい
  • 信頼性とパフォーマンス: 強力な並行処理プリミティブ・.NET ランタイムの最適化・オプションの AOT コンパイルにより、エンタープライズ負荷パターンでのレイテンシ削減とスループット向上を実現する
  • 保守性とガバナンス: 静的型付け・Roslyn アナライザー・標準化された NuGet パッケージ管理・コード品質チェックの自動適用により、チーム全体で一貫した監査可能なコードベースを維持できる
  • CI/CD とデプロイ自動化: Azure DevOps / GitHub Actions・コンテナツール・環境設定パターンのすぐに使えるサポートにより、セキュアなブルーグリーン・カナリアデプロイの自動化が容易になる
  • コンプライアンスと監査対応: 静的解析・コードスキャン・バイナリ署名のツール群と集中管理された依存関係ポリシーにより、規制要件や社内監査要件を満たせる
  • 開発者の生産性とオンボーディング: 充実した IDE サポート・再現性の高いビルド・高度なリファクタリングツールにより、Zava チームへの新メンバーのオンボーディング期間を短縮できる

Python は多くの領域で優れた言語ですが、この組織においては C#/.NET エコシステムの中での方が、Zava のエンタープライズ標準への準拠をより容易かつ一貫して達成できます。このワークショップの移行戦略では、段階的な検証を通じて、動作を保ちながらこれらのエンタープライズメリットを獲得する手法を示します。

ワークショップの主な内容は以下のとおりです。

  1. Web アプリを起動してブラウザで確認する
  2. 実行中のアプリの /docs エンドポイントで API 仕様を確認する
  3. Python の全依存パッケージはあらかじめインストール済み
  4. Python テストを使って Python・C# 双方の実装の正しさを検証する

GitHub Copilot のモード

GitHub Copilot には AskPlanAgent という 3 つのモードがあり、コーディングワークフローをそれぞれ異なる形で支援します。各モードは、質問への回答から複雑なタスクの自律実行まで、異なるレベルのサポートに対応しています。

Ask モード

Ask モード はコードの理解・問題解決・概念学習を支援する Q&A アシスタントです。自然言語で質問すると、Copilot が説明・コードサンプル・提案を返します。コードを直接変更することはありません。

Tip

Ask モードは、素早い確認・解決策のブレインストーミング・サンプル実装の提示に最適です。

Agent モード

Agent モード は 3 つのモードの中で最も自律性が高く強力です。プロジェクト全体を分析し、タスクを計画し、編集を実行し、コマンドを走らせ、ゴールが達成されるまで繰り返し作業します。機能の構築・バグ修正・新しいコンポーネントの雛形作成など、複数ステップにまたがるタスクに最適です。Agent モードは多くの工程を自動化しますが、リスクを伴うアクションは事前に確認を求めるため、安全性と正確性を確保できます。

Tip

Agent モードは、コードの編集だけでなく、ファイルの作成やコマンド実行なども行います。知識を引き出したり単一行を編集したりするだけでなく、より広範なタスクに最適です。

Plan モード

Plan モード は GitHub Copilot の新機能で、コーディングタスクや目標をより体系的に整理するためのモードです。複雑なタスクを管理しやすいステップに分解する構造化されたプランの作成を支援します。ボイラープレートコードの生成・プロジェクト構造の提案・コーディング開始前の潜在的な課題の特定なども行えます。

Tip

Plan モードを使って明確な目標を設定し、プロジェクトに合わせた提案を受け取ることでワークフローを効率化しましょう。

プロンプトでのファイル参照の使い方

このワークショップ全体を通じて、#file:ファイル名 という構文を使ったプロンプトが登場します。この重要なパターンをしっかり理解しておきましょう。

#file: 参照の使い方 — クイックガイド

何をするのか: #file:ファイル名 という構文を使うことで、GitHub Copilot に特定のファイルのコンテキストを提供し、どのファイルを対象に作業しているかを正確に伝えられます。

使い方:

  1. Copilot チャットウィンドウで # を入力する
  2. ファイルピッカーが自動的に表示される
  3. 参照したいファイルを選択する(例: main.pyProgram.cs
  4. 続けてプロンプトの残りを入力またはペーストする

なぜ重要か: ファイルのコンテキストを提供することで、Copilot がプロジェクト構造や対象コードを理解し、より正確で適切な提案を生成できます。

例: 「エンドポイントを追加して」と聞く代わりに「#file:Program.cs にルートエンドポイントだけを追加して」と聞くほうが精度が上がります。

Note

#file:ファイル名 が使われているプロンプトでは、Copilot にコードを生成させたいファイルを指定しています。 # を手動で入力してファイルを選択し、残りのプロンプトをコピー&ペーストしてください。 プロジェクトに複数のファイルがある場合、このやり方で Copilot に特定のファイルの情報を的確に提供することができます。

使用可能なモデル

このワークショップは特定のモデルに依存しておらず、学習中に特定のモデルを選択する必要はありません。ただし、GitHub Copilot が GPT・Claude・Gemini などさまざまなモデルをサポートしており、それぞれ能力が異なる点は頭に入れておきましょう。GitHub Copilot の各プランについて詳しくは、リソース セクションを参照するか、こちらのリンク(GitHub Copilot Plans)をご覧ください。