2026年4月3日公開
はじめに
AIコーディングツール「Claude Code」を使用して、20万行規模のC++/MFCアプリケーションを、ウェブアプリケーションへ移植する試みに取り組みました。AIに指示するだけで全機能を変換することはできませんでしたが、人間がAIと協調して作業することで、機能を単純化したウェブアプリケーションを完成させることができました。
本稿では、その実践的なプロセスと得られた知見を詳しく紹介します。
この移植作業は2026年2月から3月にかけて実施しました。
なお、よろしければ、完成した SLP Webについての説明 もあわせてご覧ください。
全体のワークフロー
まず、全体のワークフローを図で示します。AIに任せられることと、人間がすべきことの区別が明瞭になると思います。

早く知りたい方へ
20万行規模のC++/MFCアプリケーションをウェブアプリケーションに移植するにあたり、全機能を変換することができなかったのは、Claude CodeがC++アプリケーションのデータ構造は反映したものの、動作をあまり反映しなかったためです。詳細は後述します。
この移植作業の所要時間は18営業日です。内訳は後述します。
移植対象のソフトウェア
移植対象の「SLP」は以下の特徴を持つWindows向けデスクトップアプリケーションです。
- プラットフォーム: Windows
- 言語: C++
- ミドルウェア: MFC (Microsoft Foundation Class)
- 規模: 約20万行
SLPの機能についての詳細な説明は省略します。以下にSLPのスクリーンショットを示します。

フェーズ1: Claude Codeによる最初の移植
AIへの最初の指示
まず、「このソフトウェアをウェブアプリケーションにしてください」とシンプルな指示を出すことから始めました。するとAIから設計上の確認事項として、いくつかの質問が返ってきました。
- ファイルを読み書きするか、データベースを使うか?
- クライアントサイドでReactを使うか、素のJavaScriptを使うか?
AIが思考中でも割り込んで追加指示を出すことができます。筆者はここで以下の方針を追加で指示しました。
- ウェブアプリらしくユーザー登録とログイン機能をつける。
- プラットフォームはUbuntu Linux。
- サーバーサイドはC++で実装する。
デプロイ手順書の誤りと修正
ソースコードだけでなく、デプロイ手順書もAIに作成してもらいました。しかし、この手順書には誤りが含まれていました。具体的には、データベースの権限付与の記述が不正確で、接続の動作確認が通らない問題が発生しました。
AIと5回ほど対話を重ねて原因を特定し、手順書を修正することで解決できました。
初期移植の状態
デプロイはできたものの、画面に何も表示されないという問題が発生しました。これも5回程度の指示で修正できましたが、動作している状態でも、ほとんどの機能が不足している状態でした。
SLP Windows版のデータ構造はおおむね反映されているものの、動作はあまり再現されていないという傾向がありました。この理由については、考えてはみたもののよくわからず、Claude Codeの癖としか言いようがないのではないかと思います。

ここまでの所要時間は2営業日です。
フェーズ2: 要求をAIに指示する
機能を単純化する
SLP全機能の移植は断念し、機能を単純化したウェブ版を作ることにしました。これは、AIによる最初の移植では、データ構造はおおむね反映されているものの、動作はあまり再現されなかったためです。
要求を明文化する
そこで、人間が要求を明文化してAIに読ませる方針としました。
SLP Windows版の機能 (「インデント目次のエクスポート」) を使用して、要求をテキストファイル (requirements.txt) に書き出しました。この作業に要した時間は5営業日です。
その後、requirements.txt をワーキングディレクトリに配置し、Claude Codeに次のように指示しました。
requirements.txt に書かれている要求を実装してください。
要求の記述の詳細
要求はSLP Windows版の「水平目次」を使用し、階層構造で記述しました。

テキストに書き出すと以下のようになります (冒頭部分を抜粋)。
0 SLPウェブ版の要求
1 この文書の方針
1.1 SLPのすべての機能を網羅することを目標としない
1.2 基本的な要求のみを記述することを目標とする
2 ユーザー登録
2.1 メールアドレスとパスワードとユーザー名を入力できる
2.2 メールアドレスがすでに使われているとき、ユーザー登録できない
2.3 パスワードが短すぎるとき、ユーザー登録できない
2.4 ユーザー登録画面において、チェックボックスにより、パスワードを表示するかどうかを切り替えられる
2.5 ブラウザのパスワードマネージャーにメールアドレスとパスワードを記録する
2.6 ユーザー登録画面から「このウェブサイトについて」ページを開くことができる
3 ログイン
3.1 メールアドレスとパスワードを入力できる
3.2 ログイン画面において、チェックボックスにより、パスワードを表示するかどうかを切り替えられる
3.3 ブラウザのパスワードマネージャーにより、メールアドレスとパスワードが自動的に入力される
3.4 ログイン画面で、メールアドレスによるパスワードリセットができる
3.5 ログイン画面から「このウェブサイトについて」ページを開くことができる
フェーズ3: 人間によるフィードバックループ
繰り返す修正サイクル
要求を実装した後も、ローカル環境でアプリを動かしながら修正点を洗い出し、AIに修正を指示するサイクルを繰り返しました。この工程に要した時間は7営業日です。
指示の出し方のコツ
AIへの指示では、前提条件を明示することが重要でした。
悪い例 (前提条件が明確でない):
「起点単位機能を追加」メニューを追加してください。
良い例 (前提条件が明確である):
sync_fn_to_tocがfalseのとき、メイン画面の目次タブの「目次項目の操作」ドロップダウンボックスに、「起点単位機能を追加」メニューを追加してください。
画面・モード・条件を明示することで、AIの誤解を減らすことができます。
Gitの利用
AIが誤った実装をしてしまう場面もありました。その対策として、Gitでこまめにコミットする習慣が重要でした。AIが思い違いをしても以前の状態に戻れます。誤りが発生した際は、より詳細かつ具体的な指示を与えて、再修正を依頼しました。
完成したSLPウェブ版のコード規模
最終的に生成されたコードの規模は以下の通りです。
| 区分 | 言語 | 行数 |
|---|---|---|
| バックエンド | C++ | 4,106行 |
| フロントエンド | JavaScript | 8,033行 |
| データベース | SQL | 121行 |
| 合計 | 12,260行 |
20万行のWindows版 (C++) に対し、機能を絞り込んだウェブ版は約12,000行となりました。
コードの抽象度が異なるため、単純に行数で比較できない部分もあるかと思います。C++とJavaScriptは抽象度はおおよそ同じで、SQLは抽象度が高いと考えてよいでしょう。
フェーズ4: コードレビューとデプロイ
人間によるコードレビュー
AIが生成したコードを人間がレビューしました (所用時間: 1営業日)。発見した主な問題点は以下の通りです。
- 不要なフィールドの多さ: データ構造がWindows版に由来しているため、ウェブ版では不要なフィールドが多数存在しました。 → 不要なフィールドを削除しました。
- セキュリティ上の問題:
Access-Control-Allow-Origin: *を送信していました。 → 送信しないようにしました。 - SQLの字数制限の誤り: データベース作成スクリプトで、字数制限が正しく設定されていない列が多数ありました。 → 字数制限を正しく反映するようSQLを修正しました。
コードレビューで不具合を見つけた際は、AIにソースコードを変更してもらった場合と人間が直接修正した場合の両方がありました。人間が直接修正した場合は、誤りがないかAIに確認してもらいました。
テスト環境へのデプロイ
VPSを契約し、AIが作成したデプロイ手順書をもとにSLPウェブ版をデプロイしました (所用時間: 1営業日)。ローカル環境での動作確認の際に手順書の多くの誤りを訂正していたため、テスト環境では問題なくデプロイが完了しました。メールの送信機能の実現のため、DNSの設定も実施しました。
フェーズ5: テスト
テスト仕様書の自動生成
テスト仕様書もAIに生成してもらいました。指示は以下の通りです。
requirements.txt とこれまでの実装をもとに、テスト仕様書を作成し、tests.xlsx として保存してください。
生成されたテスト仕様書を人間がレビューおよび修正し、最終的なテスト項目数は134件となりました (所用時間: 1営業日)。
テストと不具合修正
人間がUIを手動で操作してテストを実施しました。すぐに修正が必要な不具合が1件あり、Claude Codeに指示して修正しました (所用時間: 1営業日)。
作業工程のまとめ
| フェーズ | 内容 | 所用時間 [日] |
|---|---|---|
| 1 | AIによる初期移植・デプロイ手順書作成と修正 | 2 (11%) |
| 2 | 要求定義書の作成 | 5 (28%) |
| 3 | AIへの修正指示・フィードバックループ | 7 (39%) |
| 4 | コードレビュー | 1 (6%) |
| 4 | テスト環境へのデプロイ | 1 (6%) |
| 5 | テスト仕様書作成 | 1 (6%) |
| 5 | テストと不具合修正 | 1 (6%) |
Claude Codeの料金
参考として、Claude Codeの料金プランを紹介します (2026年3月時点)。
| プラン | 月払い | 年払い (月換算) |
|---|---|---|
| Team Standard seat | $25/月 | $20/月 |
| Team Premium seat | $125/月 | $100/月 |
Premium seatはStandardの5倍のデータ使用量を持ちます。今回の作業規模ではStandard最低額プランではデータ量をほぼ使い果たす状況でした。
結論
C++/MFCを使用したWindowsアプリケーションをウェブアプリケーションへ移植するプロジェクトを通じて、以下のことがわかりました。
できたこと
- AIと人間が協調することで、機能を単純化したウェブアプリケーションを実際に作ることができました。
- ソースコード・デプロイ手順書・テスト仕様書など、多様な成果物をAIに生成させることができました。
- Gitによるバージョン管理と組み合わせることで、AIの誤りを安全にリカバリーできました。
できなかったこと
- AIに指示するだけで全機能を変換することはできませんでした。
- 機能の取捨選択や要求の記述など、人間の判断が不可欠な工程が多数存在しました。
学んだこと
- 前提条件を明示する: AIへの指示では、モード・画面・条件を具体的に伝えることで誤解を防げます。
- Gitを使う: AIが誤った変更をした場合に備えて、こまめなコミットは欠かせません。
- 要求定義は人間の仕事: AIは書かれた要求を実装しますが、何を作るかの判断は人間が行います。
- コードレビューは省略できない: AIが生成したコードにはセキュリティ上の問題や設計上の誤りが含まれることがあります。
Claude Codeは強力なツールですが、人間とAIが役割分担しながら協調することが重要だと実感しました。
付録
やらなかったこと
Claude Codeを使うにあたっては、自然言語で思ったままに指示を出し、使い方に特別な工夫はあまりしませんでした。特に、プラグインとスキルを使用していないことは、ここに記録しておきます。プラグインとスキルを使用すれば、作業効率や品質がさらに向上した可能性があります。
ウェブ版のシステム構成
ウェブ版のシステム構成は以下の通りです。
動作環境
- Ubuntu Linux (22.04 LTS 以降)
バックエンド
- C++17
- cpp-httplib, nlohmann/json, jwt-cpp, libpq, OpenSSLを使用
- CMakeで依存するライブラリを自動的にダウンロード
フロントエンド
- React 18
- モジュールビルダーなしでライブラリを直接インポート
- 言語はJSXとJavaScript
データベース
- PostgreSQL 14以上