13
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ソフトウェアエンジニアリングAIエージェントの変遷――「補完」から「自律」への4年間

Last updated at Posted at 2025-10-27

はじめに

GitHub Copilot(2021/6)が発表されてから約4年が経過しました。

この短い期間で、AIとソフトウェア開発の関係は劇的に変化してきました。筆者自身、日々の開発業務でAIツールを活用しながら、その進化の速さに驚かされ続けています。単なる「コード補完ツール」だったものが、今では「設計から実装まで任せられるパートナー」へと変貌を遂げているのです。

本記事では、このソフトウェアエンジニアリングAIエージェントの進化を振り返りながら、開発者の働き方がどう変わってきたのか、そしてこれからどこへ向かうのかを考察していきたいと思います。

第1段階:AIによる行単位のコード補完(2021年〜)

GitHub Copilot(2021/6)の衝撃

2021年6月、GitHub Copilotの登場は衝撃的でした。それまでのIDEの補完機能は、変数名やメソッド名の候補を出す程度のものでしたが、Copilotは文脈を理解して「次に書くべき行」を提案してくれたのです。

def fibonacci(n):
    # ここまで書くと、次の行を自動提案

この段階の特徴:

  • 開発者が完全に主導権を持つ
  • AIは「予測」と「補完」に徹する
  • Tab キーで受け入れるか、無視するかの二択
  • 生産性は向上したが、開発フローは従来と同じ

開発者の役割に大きな変化はありませんでした。ただ、タイピング量が減り、ボイラープレートコードを書く時間が短縮されたのです。

第2段階:コメント駆動での複数行提案(2022年〜)

「意図を書けば実装が生まれる」体験

Copilotが進化し、複数行にわたる実装を提案できるようになると、開発スタイルが変わり始めました。

# CSVファイルを読み込んで、年齢でフィルタリングし、
# 名前でソートして、結果をJSONで返す
def process_users(file_path, min_age):
    # → 10行以上の実装が提案される

この段階での変化:

  • コメントの書き方が重要になった
  • 「どう実装するか」より「何をしたいか」を明確にすることが求められる
  • 曖昧な指示では期待した結果が得られない

ここで初めて、「AIに問う能力」 が開発者のスキルとして浮上してきたのではないでしょうか。

第3段階:ツール使用能力の獲得――Function Calling時代(2023年前半〜)

AIが「手を動かせる」ようになった転換点

ChatGPT(2022/11)の登場後、OpenAI Function Calling(2023/6)Code Interpreter(2023/7) 機能の追加により、AIは単にコードを書くだけでなく、実際に実行できるようになりました。

可能になったこと:

  • ファイルの読み書き
  • bashコマンドの実行
  • パッケージのインストール
  • データの可視化
  • テストの実行とエラー解析

これは大きな転換点でした。開発者は「このコードを試してみて」と指示でき、AIは実際に実行して結果を返してくれる。エラーが出れば、それを見て修正案を出す。

開発フローの変化:
従来:コード生成 → 手動で実行 → エラー確認 → 手動で修正
新しい流れ:指示 → AI実行 → AI自己修正 → 結果確認

AIが「観察者」から「実行者」へと進化したのです。

第4段階:自然言語での実装指示――Vibe駆動開発の光と影(2023年後半〜)

GPT-4(2023/3)時代の「なんとなく」開発

GPT-4やClaude 2(2023/7)の登場により、より曖昧な指示でもそれなりのコードが生成されるようになりました。

「ログイン機能を作って」
「管理画面っぽいUIにして」
「エラーハンドリングちゃんとやっといて」

このような雑な指示でも、AIは何かしらの実装を返してくれます。

Vibe駆動開発の誕生:

  • 詳細な仕様を詰めなくても、とりあえず動くものができる
  • 「違う」と思ったら、プロンプトを変えて再生成
  • 「当たり」が出るまでガチャを回す

一見すると生産性が上がったように見えました。しかし、問題も浮上してきました。

Vibe駆動開発の問題点:

  • 生成されたコードの理由が分からない
  • 再現性がない(同じ指示でも異なる結果)
  • デバッグが困難
  • チーム内での知識共有ができない
  • コードの品質が不安定

この段階で、「適切に問う能力」の重要性が改めて認識されるようになりました。曖昧な指示では曖昧な結果しか得られない。明確な要件定義こそが、良いコードを生み出す鍵だったのです。

第5段階:コードベース全体の理解――コンテキスト管理の進化(2024年前半〜)

長コンテキスト時代の到来

Claude 3(2024/3) の登場(200Kトークンのコンテキストウィンドウ)や、GPT-4 Turbo(2023/11)(128Kトークン)、RAG(Retrieval-Augmented Generation)技術の実用化により、AIは単一ファイルではなく、プロジェクト全体を理解できるようになりました。

可能になったこと:

  • 既存のアーキテクチャパターンの踏襲
  • プロジェクト固有の命名規則への適応
  • 他のファイルとの整合性を保った実装
  • レガシーコードベースの理解と修正

Cursor(2023)、Windsurf(2024)、Cline(2024)の登場:
これらのツールは、プロジェクト全体をインデックス化し、関連するコードを自動的に参照しながら提案を行います。

「UserController の update メソッドに、
既存の validation パターンに従った入力チェックを追加して」

このような指示で、プロジェクト内の他のコントローラーを参照し、統一感のある実装を生成できるようになったのです。

開発者の役割:

  • 単一の機能だけでなく、システム全体との整合性を考える
  • AIに適切なコンテキストを与える
  • 生成されたコードが既存パターンに沿っているか確認する

第6段階:検証ベース反復とSWE Chatbot(2024年中盤〜)

「ガチャ」から「対話」へ

この段階で、開発のアプローチが根本的に変わりました。一発で完璧な実装を目指すのではなく、AIとの対話を通じて段階的に洗練させていくスタイルです。

典型的な対話フロー:

  1. 要件の対話的な詰め込み

    • 開発者:「ユーザー登録機能を作りたい」
    • AI:「メール認証は必要ですか?OAuth連携はどうしますか?」
  2. 初期実装の生成
     - AIが基本実装を提案

  3. テストの生成と実行

    • AIがテストコードを生成
    • 実行してエラーを検出
  4. フィードバックループ

    • エラーをAIに見せる
    • AIが修正案を提示
    • 再テスト
  5. リファクタリングと最適化

    • パフォーマンス改善
    • エッジケースへの対応

この時期、実世界のソフトウェアエンジニアリングタスクを評価する**SWE-bench(2023/10)**も登場し、AIエージェントの実践的な能力が測られるようになりました。

この段階での重要な気づき:
運任せの「ガチャ」ではなく、構造化された対話とフィードバックによって、確実に目的のコードへ近づいていける。AIに対する「問いの設計」 がますます重要になりました。

第7段階:Spec Driven Development――仕様こそが成果物(2024年後半〜)

パラダイムシフト:実装者から仕様設計者へ

V0.dev(2023/10)、Bolt.new(2024/6)、Lovable(2024/8)、Replit Agent(2024/9)といったツールの登場により、開発のパラダイムが変わりました。

従来の開発フロー:

要件 → 設計 → 実装 → テスト → デプロイ

新しい開発フロー:

詳細仕様定義 → AI実装 → 検証 → 仕様のブラッシュアップ

特に**Claude 3.5 Sonnet(2024/6、2024/10アップデート)**は、コーディング能力が大幅に向上し、複雑なプロジェクトでも高品質な実装を生成できるようになりました。

Spec Driven Developmentを支えるツール:

この段階で、仕様駆動開発を支援するツールも登場しました。

  • SpecKit(2024):仕様を構造化して記述し、AIが実装しやすい形式に変換するツール
  • cc-sdd(2024):Claude向けに最適化された仕様記述フレームワーク。仕様の曖昧さを検出し、実装前に問題を特定

これらのツールは、「良い仕様を書く」という行為自体をサポートします。開発者が書いた仕様に対して:

  • 曖昧な表現を指摘
  • 欠落している要件を質問
  • エッジケースの考慮漏れを検出
  • AIが理解しやすい形式に構造化

具体例:
V0.devでは、詳細な仕様(コンポーネントの振る舞い、状態管理、APIエンドポイント、エラーハンドリング)を記述すれば、フロントエンドからバックエンドまで一気に実装されます。

開発者の役割の変化:

  • コードを書く人 → 仕様を書く人
  • 実装の詳細を考える → システムの振る舞いを定義する
  • デバッグする → 仕様の曖昧さを排除する

ここで明確になったのは、「良い仕様を書く能力」が開発者の核心的スキルになったということです。そして良い仕様を書くためには:

  • エッジケースを想定する能力
  • 曖昧さを構造化する能力
  • 要求を明確に言語化する能力

つまり、**「AIに対して適切に問う能力」**そのものが求められるようになったのです。

第8段階:マルチモーダルAI + MCPによる自律的設計実装(2025年〜)

AIが設計判断を行う時代へ

最新の段階では、AIは実装だけでなく、設計判断まで行えるようになりつつあります。

マルチモーダル能力の実用化:

  • スクリーンショットからUI仕様を理解
  • 手書きのワイヤーフレームを解釈
  • データベース図から実装を生成
  • エラー画面のスクショからデバッグ

Claude Computer Use(2024/10) により、AIは画面を見て、UIを操作し、その結果を確認しながら開発を進められるようになりました。

MCP(Model Context Protocol)(2024/11)によるエコシステム連携:

MCPは、AIが外部ツールやサービスと連携するためのプロトコルです。これにより:

  • GitHub、GitLab、Linear、Jiraとの統合
  • CI/CDパイプラインとの連携
  • ログ分析ツールからのフィードバック
  • モニタリングシステムとの接続
  • データベースやAPIとの直接通信

Claude Code(2025/1)の登場:

特に注目すべきは、Claude Code の登場です。これはコマンドラインから直接Claudeにコーディングタスクを委任できるツールで、開発者コミュニティから絶大な支持を受けています。

# コマンドラインから直接指示
claude code "ユーザー認証機能を実装して、既存のDBスキーマに合わせて"

# 特定のissueを解決
claude code --issue 123 "このバグを修正"

# テストも含めて実装
claude code --with-tests "決済処理モジュールを追加"

Claude Codeの特徴:

  • ターミナルから離れずに開発フローを継続
  • プロジェクトのコンテキストを自動的に理解
  • Git操作やテスト実行まで一貫して実行
  • エラーが出れば自動的に修正を試行

最新モデル Claude Opus 4.1(2025/8):

そして、Claude Opus 4.1 の登場により、AIの開発能力はさらに飛躍しました。従来のモデルと比較して:

  • より長いコンテキストウィンドウ(最大500Kトークン)
  • 複雑なアーキテクチャ判断の精度向上
  • マルチファイル編集の一貫性が大幅改善
  • パフォーマンス最適化の提案精度が向上

自律的な開発サイクル:

  1. 要件分析:issueやドキュメントを読み取る
  2. アーキテクチャ設計:既存パターンを踏襲しつつ最適な構造を提案
  3. 実装生成:複数ファイルにわたる実装
  4. テスト生成・実行:ユニットテスト、統合テスト
  5. デプロイ:CI/CDパイプラインのトリガー
  6. モニタリング:本番環境での動作確認
  7. 自律修正:問題があれば自動で修正PRを作成

実例:Devin(2024/3)、Replit Agent(2024/9)、Claude Computer Use(2024/10)、Claude Code(2025/1)

これらのツールは、最小限の人間の介入で、issueからデプロイまでを実行できます。

しかし、完全自律には限界も:

  • ビジネス判断は人間が必要
  • トレードオフの優先順位付け
  • セキュリティやコンプライアンスの最終判断
  • ユーザー体験の本質的な評価

開発者に求められる能力の変化

技術スキルからメタ認知スキルへ

この8段階の進化を俯瞰すると、開発者に求められる能力が劇的に変化してきたことが分かります。

第1〜2段階で重要だったスキル:

  • プログラミング言語の構文知識
  • アルゴリズムとデータ構造の理解
  • デバッグテクニック
  • 効率的なコードの書き方

第7〜8段階で重要になるスキル:

  • 問題の本質を見抜く力
  • 曖昧な要求を構造化する能力
  • システム全体を俯瞰する視点
  • トレードオフを判断する力
  • AIに対して適切に問う能力

特に最後の「AIに対して適切に問う能力」は、すべての段階を通じて重要性が増してきました。

「問う能力」とは何か

では、具体的に「AIに問う能力」とは何を指すのでしょうか。

多くの人が誤解しがちなのは、「問う能力」=「詳細な指示を出す能力」だと思ってしまうことです。しかし、本質的に重要なのは、AIとの対話を通じて、曖昧な要求を共同で明確化していくプロセスなのです。

以下、具体例で比較してみましょう。

1. 認証機能の実装

❌ 単なる指示の例:

開発者:「ログイン機能を作って」
AI:(曖昧なまま実装。セッション管理もパスワードハッシュ化も適当に実装される)
開発者:「あ、これじゃない。JWT 使いたかったんだけど」
AI:(再実装)
開発者:「ログイン失敗のロック機能もつけて」
AI:(また再実装)

⭕ 対話による導出の例:

開発者:「ログイン機能を実装したい。このログイン機能の設計で考慮すべき点はありますか?」

AI:「以下の点について検討が必要です:
     - 認証方式(メール+パスワード、OAuth、多要素認証など)
     - セッション管理方式(JWT、サーバーサイドセッションなど)
     - セキュリティ対策(パスワードハッシュ化、ブルートフォース対策など)
     - トークン有効期限の設定
     
     どのような要件を想定していますか?」

開発者:「まずはメール+パスワードで。OAuth は後フェーズで。JWT を使いたいんだけど、トークンの有効期限はどれくらいが一般的?」

AI:「一般的には:
     - アクセストークン:15分〜1時間(短めでセキュア)
     - リフレッシュトークン:7日〜30日(UX重視)
     セキュリティと利便性のバランスで決めます。」

開発者:「アクセストークン1時間、リフレッシュ7日で。このセキュリティ設計で問題はありませんか?」

AI:「基本的には良い設計ですが、以下を追加検討してください:
     - パスワードハッシュ化:bcrypt を推奨(コスト係数10以上)
     - ログイン試行回数制限:5回失敗で一時ロックなど
     - リフレッシュトークンのローテーション:セキュリティ強化のため
     
     どこまで実装しますか?」

開発者:「bcrypt でお願い。試行回数は5回失敗で10分ロック。トークンローテーションは今回スコープ外で」

AI:「了解です。整理すると:
     - メール+パスワード認証
     - JWT(アクセス1h、リフレッシュ7d)
     - bcrypt によるハッシュ化
     - 5回失敗で10分ロック
     この仕様で実装します。」

2. パフォーマンス最適化

❌ 単なる指示の例:

開発者:「この関数を最適化して」
AI:(コンテキスト不足で的外れな最適化)
開発者:「そうじゃなくて、もっと速くしたい」
AI:(さらに的外れな実装)

⭕ 対話による導出の例:

開発者:「この関数のパフォーマンスが問題になってる。どうアプローチすべきか相談したい」

AI:「最適化の方針を立てるために、いくつか教えてください:
     - 呼び出し頻度と現在の処理時間
     - 目標とする処理時間
     - メモリやスレッドセーフの制約」

開発者:「1秒間に10万回呼ばれてて、今50ms。10ms以内にしたい。メモリは多少使ってもいいし、スレッドセーフは必須」

AI:「50ms→10msは大幅な改善が必要ですね。
     入力データの特性について、このパフォーマンス問題の原因は何だと思いますか?」

開発者:「正直、よく分かってない。ただ入力は100要素くらいの配列で、同じような入力が8割くらい重複してる」

AI:「重複が8割なら、キャッシュが非常に効果的です。
     このケースでメモ化を使うのはどうでしょうか?
     LRU キャッシュでスレッドセーフに実装できます。」

開発者:「それいいね。このキャッシュ戦略に問題点はありますか?」

AI:「考慮すべき点:
     - キャッシュサイズ(メモリ使用量とヒット率のバランス)
     - キャッシュの無効化タイミング(データが更新される場合)
     - キャッシュヒット率のモニタリング(効果測定)
     
     データは更新されますか?」

開発者:「ほぼ静的なデータ。更新は1日1回程度」

AI:「では、この方針で:
     - LRU キャッシュ(サイズ1000、TTL 24時間)
     - RWLock でスレッドセーフ実装
     - ヒット率ログ出力
     これで10ms以内を達成できるはずです。」

3. 新機能の設計

❌ 単なる指示の例:

開発者:「レコメンド機能を追加して」
AI:(機械学習モデルを使った複雑な実装を提案)
開発者:「いや、そこまで複雑なのは求めてない...」

⭕ 対話による導出の例:

開発者:「商品のレコメンド機能を追加したい。この要件は十分ですか?『閲覧履歴に基づいて、5商品をレコメンドする』」

AI:「基本的な方向性は分かりましたが、以下が不明確です:
     - レコメンドの精度要件(シンプルなルールベース?高度な機械学習?)
     - レスポンスタイムの制約
     - リアルタイム性(即座に反映?バッチ処理?)
     - コストやインフラの制約
     
     どの程度の精度を求めていますか?」

開発者:「まずは簡単な実装から始めたい。100ms以内で返したい」

AI:「シンプル+高速という要件なら、以下のアプローチはどうでしょう:
     1. 閲覧商品と同カテゴリ
     2. 同価格帯
     3. 人気順ソート
     Redis でキャッシュすれば100ms以内で実現可能です。
     
     この設計の問題点や改善点はありますか?」

開発者:「いいね。将来的にもっと精度を上げたくなった場合は?」

AI:「設計を拡張しやすくしておきます:
     - レコメンドロジックを interface 化
     - 将来、協調フィルタリングや機械学習に差し替え可能
     - A/Bテスト用の切り替え機構
     
     この方針で進めますか?」

開発者:「完璧。それでお願い」

4. エラーハンドリングの改善

❌ 単なる指示の例:

開発者:「エラーハンドリングをちゃんとして」
AI:(try-catch を大量に追加しただけ)
開発者:「エラーの通知とかロギングも必要なんだけど...」

⭕ 対話による導出の例:

開発者:「このAPIのエラーハンドリングに問題はありませんか?」

AI:「現状の実装を見ると、以下の点が不足しています:
     - 外部API障害時のリトライ処理がない
     - エラーログが構造化されていない
     - ユーザーへのエラーメッセージで技術詳細が露出
     - 開発者への通知機構がない
     
     特に外部APIの障害は想定していますか?」

開発者:「そう、外部API障害が一番心配。どう対処すべき?」

AI:「以下のアプローチを提案します:
     - リトライ処理(指数バックオフ)
     - サーキットブレーカーパターン(連続失敗時は一時停止)
     - フォールバック処理(キャッシュデータを返すなど)
     
     どの戦略が適していますか?」

開発者:「リトライは3回まで、指数バックオフで。サーキットブレーカーは今回スコープ外。このエラー通知の設計はどうですか?『Slackに通知を送る』」

AI:「通知設計について確認したい点:
     - すべてのエラーを通知?(ノイズが多くなる可能性)
     - 通知の緊急度分け(critical、warning など)
     - 通知のレート制限(短時間に大量通知を防ぐ)
     
     どう整理しますか?」

開発者:「500番台エラーだけ Slack 通知。それ以外はログだけ」

AI:「ユーザー体験について、このエラーメッセージはどうでしょうか?
     『一時的なエラーが発生しました。しばらくしてから再度お試しください。(エラーID: xxxxx)』
     エラーIDを付与すれば、サポート問い合わせ時にトレースできます。」

開発者:「エラーIDの発想いいね。それでお願い」

AI:「では、この仕様で実装します:
     - リトライ3回(指数バックオフ)
     - 500番台エラーは Slack 通知
     - 構造化ログ+エラーID付与
     - ユーザーには汎用メッセージ+エラーID」

対話がもたらす3つの価値

これらの例から分かるように、対話を通じた仕様の導出には3つの価値があります:

1. 考慮漏れの発見
開発者が「このXXに問題はありませんか?」と問いかけることで、AIが潜在的な問題点(セキュリティ、パフォーマンス、エラーケースなど)を指摘してくれます。

2. トレードオフの明確化
「精度 vs シンプルさ」「パフォーマンス vs メモリ使用量」といったトレードオフを対話の中で意識的に選択できます。AIに「この設計の問題点は?」と問うことで、見落としていたトレードオフに気づけます。

3. 共通理解の形成
対話を通じて、開発者とAIの間に共通理解が生まれます。これにより、後の修正や拡張がスムーズになります。

「問う能力」の本質:
つまり、「問う能力」とは、完璧な指示を最初から出す能力ではなく、適切な問いかけを通じてAIから問題点や改善案を引き出し、共同で最適な仕様を導き出していく能力なのです。

そして、この対話プロセスこそが、Vibe駆動開発との最大の違いでもあります。ガチャを回すのではなく、構造化された対話によって、確実に目的地へ向かっていくのです。

各段階を支えた主要技術

技術の進化を理解するため、各段階での重要なマイルストーンを整理しておきます。

第1段階(2021):

  • GitHub Copilot(2021/6)

第2〜3段階(2022-2023前半):

  • ChatGPT(2022/11)
  • GPT-4(2023/3)
  • OpenAI Function Calling(2023/6)
  • Code Interpreter(2023/7)

第4〜5段階(2023後半):

  • Claude 2(2023/7)
  • V0.dev(2023/10)
  • GPT-4 Turbo(2023/11)

第6段階(2024前半-中盤):

  • Claude 3(2024/3)
  • Devin(2024/3)
  • Cursor の本格化
  • Claude 3.5 Sonnet(2024/6)

第7段階(2024後半):

  • Bolt.new(2024/6)
  • Lovable(2024/8)
  • Replit Agent(2024/9)
  • Claude 3.5 Sonnet アップデート(2024/10)
  • Claude Computer Use(2024/10)
  • SpecKit(2024)
  • cc-sdd(2024)

第8段階(2025〜):

  • MCP(2024/11)
  • Claude Code(2025/1)
  • Claude Opus 4.1(2025/8)
  • Windsurf の本格展開

これからの展望――開発者の役割はどうなるのか

「コードを書かない開発者」の時代?

最先端のAIエージェントは、ほぼ自律的に開発を進められるようになってきました。では、開発者の仕事はなくなるのでしょうか?

筆者はそうは思いません。むしろ、開発者の役割は次のようにシフトしていくのではないでしょうか。

1. プロダクトビジョンの提示

  • 何を作るべきか
  • なぜそれが必要か
  • どんな価値を生み出すか

2. アーキテクチャの意思決定

  • トレードオフの判断
  • 技術選定の理由
  • スケーラビリティの方針

3. 品質とセキュリティの担保

  • AIの判断が適切かの検証
  • セキュリティリスクの評価
  • パフォーマンス要件の定義

4. ドメイン知識の橋渡し

  • ビジネス要求を技術要件に変換
  • ステークホルダーとの調整
  • ユーザー視点の維持

5. AIへの問いの設計

  • 適切な制約条件の提示
  • 成功条件の明確化
  • コンテキストの整理

つまり、「How(どう実装するか)」から「Why(なぜ必要か)」と「What(何を作るか)」へ。開発者はより戦略的な役割を担うようになるでしょう。

学び続ける必要性

ただし、これは「技術を学ばなくていい」という意味ではありません。

AIに適切に問うためには:

  • 何が技術的に可能で、何が難しいかを知る必要がある
  • アーキテクチャの選択肢とトレードオフを理解している必要がある
  • セキュリティやパフォーマンスの基礎を押さえている必要がある

つまり、技術の深い理解があってこそ、適切な問いが立てられるのです。

まとめ

ソフトウェアエンジニアリングAIエージェントの4年間の変遷を振り返りました:

  1. 行単位コード補完(2021):タイピングの効率化
  2. コメント駆動の複数行提案(2022):意図の言語化
  3. ツール使用能力の獲得(2023前半):実行可能なAI
  4. Vibe駆動開発(2023後半):曖昧な指示の功罪
  5. コンテキスト理解の進化(2024前半):プロジェクト全体の把握
  6. 検証ベース反復(2024中盤):対話的な開発
  7. Spec Driven Development(2024後半):仕様が成果物に
  8. 自律的設計実装(2025〜):AIの戦略的パートナー化

この変遷を通じて一貫しているのは、「AIに適切に問う能力」の重要性が増し続けているという点です。

AIが進化すればするほど、私たち人間は本質的な問いに集中できるようになります。曖昧さを構造化し、要求を明確にし、制約条件を整理する――。これらは、AIには代替できない、人間ならではの能力です。

技術は進化し続けます。しかし、どれだけAIが賢くなっても、「何のために作るのか」「誰のための価値を生み出すのか」という根源的な問いは、人間にしか立てられないのではないでしょうか。

あなたは今、どの段階でAIと協働していますか?次にどんな問いをAIに投げかけますか?

13
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?