VBマイグレーションの処方箋――過去の「バイブス頼り」から未来の「AI対話」へ

目次
はじめに
多くの企業で心臓部として稼働し続ける、Visual Basic 6.0 (VB6)製のレガシーシステム。ビジネスの根幹を支える一方で、その存在はサポート終了によるセキュリティリスクや、現代的なビジネス環境への対応の遅れといった深刻な「技術的負債」となっています。この負債を解消し、未来へ繋ぐためのプロジェクトが「VBマイグレーション」です。
しかし、多くのプロジェクトがその道半ばで、「過去の亡霊」とも言うべき壁に直面します。それが、開発者の感覚や勘だけを頼りに書かれた、属人的な『バイブコーディング』の存在です。
本記事では、この過去の『バイブコーディング』がもたらす課題を直視し、それを解決する強力な武器となりうる、もう一つの『バイブコーディング』──AIとの対話による開発手法──を具体的な活用法と共に解説します。
第1章:我々を苦しめる過去の亡霊──属人性の『バイブコーディング』
VBマイグレーションに着手し、古いソースコードの扉を開けたとき、多くのエンジニアが絶望のため息をつきます。そこに広がっているのは、以下のような光景です。
- 設計書もコメントも存在しない、コードだけが唯一の手がかり。
tmp
data1
Hoge
といった、意図が全く不明な変数名のオンパレード。- 数千行におよぶ巨大なプロシージャに、あらゆる処理が詰め込まれている。
これこそが、過去の『バイブコーディング』です。明確な仕様や設計思想ではなく、当時の開発者の「バイブス(感覚・ノリ)」や「とりあえず動く」という思想で書かれたコード群です。
この「負の遺産」は、マイグレーションにおいて以下の深刻な問題を引き起こします。
- テストの悪夢: 「正しい状態」が不明なため、移行後のシステムの品質を保証できない。
- 仕様解読のブラックホール: 正しい仕様が誰にもわからず、コードの解読だけで数ヶ月を要する。
- 変換ツールの限界: 機械的なコード変換ツールでは、隠されたビジネスロジックを正しく移行できない。
第2章:未来からの救世主──AIとの対話による『バイブコーディング』
奇しくも同じ響きを持つ、もう一つの『バイブコーディング』。それは、人間とAIが自然言語で「対話(Vibe)」しながら開発を進める、新しいコーディングスタイルです。GitHub CopilotやGoogleのGeminiといった生成AIが、今や私たちの強力なパートナーとなります。
この手法は、単にコードを自動生成するだけではありません。人間の「こんな感じのものを作りたい」という曖昧な思考や感覚(Vibe)を、対話を通じて具体的なコードへと昇華させてくれるのです。
第3章:実践!AIはVBマイグレーションをどう救うか?
では、具体的にAIをVBマイグレーションの現場でどう活用できるのでしょうか。例として、以下のような典型的な「バイブコーディング」されたVB6のコードを題材に見ていきましょう。これは顧客情報を検索するボタンがクリックされたときの処理です。
Private Sub btnSearch_Click()
’検索ボタン
On Error GoTo ErrorHandler Dim rs As ADODB.Recordset
Dim sql As String
Dim tmpData As Variant
'入力チェック
If txtCustCode.Text = "" Then
MsgBox "コードを入力してください"
Exit Sub
End If
'SQLを組み立てる
sql = "SELECT * FROM M_CUSTOMER WHERE CUST_CODE = '" & txtCustCode.Text & "'"
Set rs = New ADODB.Recordset
rs.Open sql, cn, adOpenKeyset, adLockOptimistic
If rs.EOF Then
MsgBox "該当するデータがありません"
rs.Close
Set rs = Nothing
Call ClearForm 'データがなければクリア
Exit Sub
End If
'フォームにデータをセット
txtCustName.Text = rs!CUST_NAME
tmpData = rs!ADDRESS '一旦Variantに入れる
txtAddress.Text = tmpData
'ランクを設定
Select Case rs!RANK
Case "01": cmbRank.ListIndex = 0 'A
Case "02": cmbRank.ListIndex = 1 'B
Case "03": cmbRank.ListIndex = 2 'C
Case Else: cmbRank.ListIndex = -1
End Select
'謎の区分
If Not IsNull(rs!KUBUN) Then
If rs!KUBUN = 1 Then
chkKBN.Value = 1 'vbChecked
Else
chkKBN.Value = 0 'vbUnchecked
End If
Else
chkKBN.Value = 0
End If
rs.Close
Set rs = Nothing
Flg = 1 'データ読み込み済みの意味?
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description
End Sub
1. コード解読:AIという名の最強の考古学者
この一見して何をしているか分かりにくい、典型的なレガシーコードをAIに提示し、こう尋ねます。
【プロンプト例】
上記のVB6コードは、全体として何を行っていますか?
各行の処理内容を、初心者にもわかるようにステップバイステップで解説してください。
特に、変数 'Flg' が '1' になる条件のビジネス的な意味を推測してください。
AIは、人間では見落としがちなロジックのパターンを読み解き、そのコードが何をしようとしているのかを自然言語で解説してくれます。これにより、仕様解読の時間を劇的に短縮できます。
2. 仕様の再定義:AIは優秀なドキュメント作成アシスタント
現行システムの利用者にヒアリングした内容と、AIが解読したコードの分析結果を組み合わせ、AIにこう指示します。
【プロンプト例】
以下の情報を基に、受注管理機能の仕様書をマークダウン形式で作成してください。
# ユーザーからのヒアリング内容
- 「特急」チェックボックスを入れると、送料が自動で500円追加される。
- 顧客ランクが「ゴールド」の場合、送料は無料になる。
# ソースコードの分析結果
- 変数 'TokkyuFlg' が '1' の場合、変数 'Soryo' に 500 を加算。
- 変数 'CustRank' が 'G' の場合、変数 'Soryo' を 0 に設定。
AIは、断片的な情報を整理し、構造化された仕様書のドラフトを瞬時に作成します。
3. コード変換とリファクタリング:AIは腕利きの翻訳家兼指導教官
自動変換ツールはVB6からC#への第一歩として便利ですが、それだけでは不十分です。ツールが生成したコードは、多くの場合、VB6の古い設計思想を引きずったままです。ここからがAIの真骨頂。AIを指導教官として、コードを現代的なC#にリファクタリング(再設計)させます。
例として、顧客情報を更新する`btnUpdate_Click`の処理を見ていきましょう。
比較元:オリジナルのVB6コード
SQLインジェクション脆弱性を抱え、エラー処理も大雑把なコード。
Private Sub btnUpdate_Click()
On Error GoTo ErrUp
Dim RankCode As String
Dim intKBN As Integer
If Flg <> 1 Then Exit Sub
' (ロジック...)
cn.Execute "UPDATE M_CUSTOMER SET " & _
"CUST_NAME = '" & txtCustName.Text & "', " & _
"ADDRESS = '" & txtAddress.Text & "', " & _
"RANK = '" & RankCode & "', " & _
"KUBUN = " & intKBN & " " & _
"WHERE CUST_CODE = '" & txtCustCode.Text & "'"
MsgBox "更新しました"
Exit Sub
ErrUp:
MsgBox "更新中にエラーが発生しました"
End Sub
ステップ1:自動変換ツールが生成しがちなC#コード
動作はするかもしれませんが、多くの問題点を抱えています。
private void btnUpdate_Click(object sender, EventArgs e)
{
try
{
// ... (ロジックはそのまま移植) ...
// SQLインジェクション脆弱性がそのまま残っている!
command.CommandText = "UPDATE M_CUSTOMER SET " +
"CUST_NAME = '" + txtCustName.Text + "', " +
"ADDRESS = '" + txtAddress.Text + "', " +
"RANK = '" + RankCode + "', " +
"KUBUN = " + intKBN + " " +
"WHERE CUST_CODE = '" + txtCustCode.Text + "'";
command.ExecuteNonQuery();
Microsoft.VisualBasic.Interaction.MsgBox("更新しました");
}
catch (Exception ex)
{
Microsoft.VisualBasic.Interaction.MsgBox("更新中にエラーが発生しました");
}
}
【このコードの問題点】
- SQLインジェクション脆弱性が解消されていません。
- `Microsoft.VisualBasic`互換ライブラリに依存しており、C#らしいコードとは言えません。
- 変数名が分かりにくいままで、エラーハンドリングも大雑把です。
ステップ2:AIによるリファクタリング後のモダンなC#コード
上記のコードをAIに提示し、「C#のベストプラクティスに従って、安全で読みやすいコードにリファクタリングして」と依頼した結果です。
private async void btnUpdate_Click(object sender, EventArgs e)
{
if (!isDataLoaded)
{
MessageBox.Show("データが読み込まれていません。", "通知", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
try
{
string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\path\\to\\data.mdb;";
using (var connection = new OleDbConnection(connectionString))
{
await connection.OpenAsync();
string sql = "UPDATE M_CUSTOMER SET " +
"CUST_NAME = @CustName, ADDRESS = @Address, RANK = @Rank, KUBUN = @Kubun " +
"WHERE CUST_CODE = @CustCode";
using (var command = new OleDbCommand(sql, connection))
{
// パラメータ化クエリでSQLインジェクションを防止
command.Parameters.AddWithValue("@CustName", txtCustName.Text);
command.Parameters.AddWithValue("@Address", txtAddress.Text);
command.Parameters.AddWithValue("@Rank", GetRankCodeFromUI());
command.Parameters.AddWithValue("@Kubun", chkKBN.Checked ? 1 : 0);
command.Parameters.AddWithValue("@CustCode", txtCustCode.Text);
int affectedRows = await command.ExecuteNonQueryAsync();
if (affectedRows > 0)
{
MessageBox.Show("更新しました。", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("更新対象のデータが見つかりませんでした。", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("予期せぬエラーが発生しました: " + ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
// ランクコード取得ロジックを別メソッドに切り出し
private string GetRankCodeFromUI()
{
switch (cmbRank.SelectedIndex)
{
case 0: return "01";
case 1: return "02";
case 2: return "03";
default: return string.Empty;
}
}
【このコードの改善点】
- パラメータ化クエリにより、SQLインジェクションの脆弱性を完全に防いでいます。
- `async/await`を使った非同期処理により、UIが固まるのを防ぎます。
- `using`ステートメントでDB接続などのリソースが確実に解放され、安定性が向上します。
- ロジックが意味のあるメソッドに分割され、コードが読みやすくなっています。
このように、AIを対話的に活用することで、単なるコードの「移植」ではなく、システムの品質と安全性を飛躍的に高める「刷新」を実現できるのです。
4. テストケース生成:AIは抜け漏れを見つけるテスト設計者
リファクタリング後の安全なコードが完成したら、次はその品質を保証するためのテスト工程です。ここでもAIは強力なパートナーとなります。第2章でAIの助けを借りて再定義した「仕様書」をインプットとして、テストケースの作成を依頼します。
AIは、人間では思いつきにくいエッジケースや異常系のテストパターンを網羅的に洗い出すことで、移行後のシステムの品質を大幅に向上させてくれます。
【プロンプト例】
以下の機能仕様書に基づき、この「顧客情報メンテナンス機能」をテストするためのテストケースを網羅的にリストアップしてください。
特に、境界値分析や異常系のパターンを重点的に考慮し、テストの観点、テスト手順、期待結果が明確にわかる形式で出力してください
(ここに以下の仕様書を貼り付け)
## 機能仕様書:顧客情報メンテナンス画面
### 1. 概要
本機能は、顧客マスタ(M_CUSTOMER)に登録されている顧客情報を、顧客コードをキーに検索・表示・更新するための画面である。
### 2. 画面項目一覧
| 項目名 | コントロールID | 型 | 制約/ルール |
| :— | :— | :— | :— |
| 顧客コード | txtCustCode | テキストボックス | 半角英数。最大10文字。 |
| 顧客名 | txtCustName | テキストボックス | 全角/半角。最大50文字。 |
| 住所 | txtAddress | テキストボックス | 全角/半角。最大100文字。 |
| 顧客ランク | cmbRank | コンボボックス | 選択肢:「A」「B」「C」 |
| 重要区分 | chkKBN | チェックボックス | チェックON/OFF |
| 検索ボタン | btnSearch | ボタン | |
| 更新ボタン | btnUpdate | ボタン | |
### 3. 機能要件
#### 3.1 検索機能 (btnSearch)
– **正常系**
1. `txtCustCode`に入力された顧客コードで、`M_CUSTOMER`テーブルを検索する。
2. 該当レコードが存在する場合、DBの各フィールド値を対応する画面項目に表示する。
3. **データ変換:** DBの`RANK`フィールド(”01″, “02”, “03”)は、`cmbRank`の表示(”A”, “B”, “C”)に変換して選択状態にすること。
4. **データ変換:** DBの`KUBUN`フィールドが`1`の場合、`chkKBN`をチェックONにする。`0`または`NULL`の場合はOFFにする。
– **異常系**
1. `txtCustCode`が未入力の状態で検索ボタンを押した場合、「コードを入力してください」というエラーメッセージを表示する。
2. 入力された`txtCustCode`がDBに存在しない場合、「該当するデータがありません」というメッセージを表示し、顧客名以下の項目をすべてクリアする。
#### 3.2 更新機能 (btnUpdate)
– **正常系**
1. 更新ボタンが押された時点で画面に表示されている情報で、`M_CUSTOMER`テーブルの該当レコードを更新する。
2. **データ変換:** `cmbRank`の表示(”A”, “B”, “C”)は、DBの`RANK`フィールドにコード値(”01”, “02”, “03”)として保存すること。
3. **データ変換:** `chkKBN`がチェックONの場合、`KUBUN`フィールドに`1`を保存する。OFFの場合は`0`を保存する。
4. 更新処理が正常に完了した場合、「更新しました」というメッセージを表示する。
– **異常系**
1. データが一度も検索・表示されていない状態で更新ボタンを押した場合、何も処理を行わずに終了する。
2. 更新対象のレコードが、検索後から更新ボタンを押すまでの間に他のユーザーによって削除されていた場合、「更新対象のデータが見つかりませんでした。」という警告メッセージを表示する。
3. DB更新中に何らかのエラーが発生した場合、「データベースエラーが発生しました: (エラー内容)」というエラーメッセージを表示する。
AIが人間では思いつきにくいエッジケースを洗い出すことで、移行後のシステムの品質を大幅に向上させます。
結論:過去の負債を未来の資産へ──私たちが描く、次世代のVBマイグレーション
VBマイグレーションは、もはや単なる技術的な延命措置ではありません。それは、過去の『バイブコーディング』という属人性の高い技術的負債と正面から向き合い、未来の生産性を生み出すための開発文化を築く、極めて重要な経営判断です。
私たち、株式会社システムズは、長年にわたり、この困難なマイグレーション事業を基幹業務として、多くのお客様と共に歩んでまいりました。だからこそ、ドキュメントのないコードを解読する現場の苦労、そしてその先に新しいシステムが稼働した時の喜びを、私たちは身をもって知っています。
そして今、その困難なプロセスを乗り越えるためのゲームチェンジャーとして、本稿で解説した「AIとの対話による開発」が登場しました。AIをパートナーとすることで、これまで以上に「安全」で「高品質」、そして「スピーディ」なマイグレーションが実現できると、私たちは確信しています。
正直に申し上げて、これらの先進技術を弊社のプロセスに完全に組み込むには、まだ研究と検証を重ねる必要があります。しかし、私たちはこの技術革新の最前線に立ち続けることをお約束します。株式会社システムズは、従来の豊富な経験とノウハウを揺るぎない基盤としながら、AIという新しい力を積極的に研究・導入します。そして、お客様の大切なシステムという『技術的負債』を、競争力を創出する『未来への資産』へと転換する、最高のパートナーであり続けます。
VBマイグレーションに関するお悩みや、AIを活用した新しいアプローチにご興味がございましたら、ぜひ一度、私たち株式会社システムズにご相談ください。