🤖

【検証】Devinはレガシーコードから実用的な仕様書を生成できるか?

に公開

はじめに

AI ソフトウェアエンジニア「Devin」が注目を集める中、その実力が気になる方も多いのではないでしょうか。本記事では、筆者が過去に開発した i アプリ(ジャンルは戦略シミュレーション、1500 行程度)のゲームソースコードを Devin に読み込ませ、どの程度実用的な外部仕様書を生成できるか検証した結果をレポートします。

対象のゲームは仕様が筆者の頭の中にはあるものの、いざ言語化するとなると骨の折れる作業です。また、将来的な他プラットフォームへの移植を考えた際、ドキュメント化された仕様書は不可欠となります。そこで、このタスクに Devin がどこまで貢献できるのか、実験してみました。

初期プロンプト

外部仕様書を書かせるにあたって、最初に打ち込んだプロンプトがこちらです。日本語で書いたものを Devin で自動で改善を施したものになります。

Please document the external specifications of the iappli source code within the game-archives repository to aid in the porting of these games to TypeScript. This documentation should be placed in the docs directory, with a separate markdown file for each game. The documentation should be written in Japanese.

Read and understand the iappli source code in the game-archives repository.
Create a markdown file in the docs directory for each game, documenting its external specifications. Each game should have its own markdown file and must write in Japanese only.
Refer to the README.md file for information on the contents of the repository.
Create a pull request.

結果(その 1)

初期プロンプトで Pull Request で投稿された仕様書がこちらになります。内容的に的外れではないものの、間違いがあったり移植にあたって必要な情報がなかったり、ニーズに答えうるものには程遠い内容でした。

戦国 - 外部仕様書

ゲーム概要

「戦国」は、J2ME(i アプリ)向けに開発された戦国時代を舞台とする戦略シミュレーションゲームです。プレイヤーは大名となり、領地の管理、軍事行動、外交などを通じて全国統一を目指します。

メインクラス

Sengoku クラス
  • IApplication を継承したメインアプリケーションクラス
  • アプリケーションの起動と初期化を担当
  • SengokuCanvas を生成して表示
SengokuCanvas クラス
  • Canvas を継承し、ゲームの描画と操作を担当
  • ゲームの状態管理、ユーザー入力処理、画面描画を実装
  • スレッドを使用したゲームループを実装

ゲーム状態

ゲームは以下の状態を持ちます:

  1. タイトル画面 - ゲーム開始前の初期画面
  2. メインメニュー - 各種操作を選択する画面
  3. 戦争モード - 他の大名と戦闘を行うモード
  4. 内政モード - 領地の管理や開発を行うモード
  5. 外交モード - 他の大名との交渉を行うモード
  6. 情報モード - ゲーム内の情報を確認するモード

UI 要素

  1. メインキャンバス - ゲーム画面全体を表示
  2. コマンドメニュー - 画面下部に表示される操作メニュー
  3. ステータス表示 - 兵力、資金、米などのリソース情報
  4. マップ表示 - 日本地図と領地状況
  5. メッセージ表示 - ゲーム進行に関する情報

操作方法

  • 方向キー - メニュー選択、カーソル移動
  • 決定ボタン - コマンド実行、選択確定
  • ソフトキー - 状況に応じた操作(戻る、決定など)

データ構造

大名データ
public void init(int kunshu, long kin, long hei, long kome, long jinko, long kokudaka, long machi, long tyu)
  • kunshu - 君主 ID
  • kin - 金(資金)
  • hei - 兵(兵力)
  • kome - 米(食料)
  • jinko - 人口
  • kokudaka - 石高(領地の価値)
  • machi - 町(都市数)
  • tyu - 忠誠度
領地データ
  • 領地 ID
  • 所有者 ID
  • 石高
  • 兵力
  • 防御力

ストレージ

ゲームデータは以下の方法で保存されます:

  1. スクラッチパッド - scratchpad:/// を使用した永続データ保存
  2. 一時データ - ゲームプレイ中のメモリ内データ
// データ保存の例
DataOutputStream out = Connector.openDataOutputStream("scratchpad:///0;pos=0");

ネットワーク機能

このゲームには特定のネットワーク機能は実装されていません。すべてのゲームプレイはローカルで行われます。

結果(改善後)

出てきた仕様書を読んで、事実と異なるもの、足りないものなどを指摘して 60 点くらいの出来まで仕上げたものがこちらになります。まだ間違いがあったり、冗長な箇所があるものの、仕様書としてはまずまず成立しているかと思います。

戦国 - 外部仕様書

ゲーム概要

「戦国」は、J2ME(i アプリ)向けに開発された戦国時代を舞台とする戦略シミュレーションゲームです。プレイヤーは大名となり、領地の管理、軍事行動、外交などを通じて全国統一を目指します。

メインクラス

Sengoku クラス
  • IApplication を継承したメインアプリケーションクラス
  • アプリケーションの起動と初期化を担当
  • SengokuCanvas を生成して表示
SengokuCanvas クラス
  • Canvas を継承し、ゲームの描画と操作を担当
  • ゲームの状態管理、ユーザー入力処理、画面描画を実装
  • スレッドを使用したゲームループを実装

ゲーム状態

ゲームは主に以下の 2 つの状態(モード)を持ちます:

  1. 戦争モード - 他の大名と戦闘を行うモード

    • プレイヤーは兵力、資金、食料を消費して他国を攻撃
    • 戦闘では「通常攻撃」「奇襲」「謀略」「撤退」などの戦術を選択可能
    • 勝利すると領土を獲得
  2. 内政モード - 領地の管理や開発を行うモード

    • 米売り、米買い、開墾などのコマンドで国力を強化
    • 資源(金、米、兵)のバランス管理が重要
モード遷移
  • ゲーム開始時は内政モードから始まる
  • 内政モード中に「戦争」コマンドを選択すると戦争モードに移行
  • 戦争の結果表示後、自動的に内政モードに戻る
  • 各大名は順番に行動し、全大名の行動が終わると季節(ターン)が進む

UI 要素

内政モード UI
  1. ステータス表示 - 画面上部に表示される以下の情報
    • 金(資金)
    • 兵(兵力)
    • 米(食料)
    • 人口
    • 石高(領地の価値)
    • 町(都市数)
    • 忠誠度
  2. コマンドメニュー - 画面下部に表示される以下のコマンド
    • 戦争 - 戦争モードに移行し、隣接する敵国を選択して攻撃
    • 米売り - 米を消費して金を得る
    • 米買い - 金を消費して米を得る
    • 開墾 - 金を消費して石高(領地価値)を上げる
    • 町造り - 金を消費して町(都市)を増やす
    • 雇用 - 金を消費して兵を増やす(人口が減少)
    • 解雇 - 兵を減らして忠誠度と人口を増やす
    • 施し - 米を消費して忠誠度を上げる
    • 輸送 - 他の自国領地へ資源を送る
    • 委任 - 他の自国領地を CPU に委任する
    • 解任 - 委任した領地の委任を解除する
    • セーブ - ゲームデータを保存する
    • 終了 - ゲームを終了する
  3. メッセージ表示 - 画面中央に表示される国の状況や季節情報
戦争モード UI
  1. 軍勢情報表示 - 両軍の以下の情報
    • 兵力
    • 食料
    • 士気
  2. 戦術コマンド - 戦闘時に選択できる以下の戦術
    • 通常 - 標準的な攻撃(防御時は「堅守」)
    • 奇襲 - 敵の士気を下げる攻撃
    • 火計 - 敵の食料を減らす作戦
    • 鼓舞 - 士気を上げる戦術
  3. 戦況表示 - 戦闘の進行状況を表示

操作方法と各コマンドの振る舞い

基本操作
  • 方向キー - メニュー選択、カーソル移動
  • 決定ボタン - コマンド実行、選択確定
  • ソフトキー - 状況に応じた操作(戻る、決定など)
  • 数字キー - 数値入力(資源量や攻撃対象の選択)
内政モードのコマンド振る舞い
  • 戦争 - 隣接する敵国を数字で選択し、投入する兵力・資金・食料を順に指定
  • 米売り - 消費する米の量を指定すると、ランダムな倍率で金を獲得
  • 米買い - 消費する金の量を指定すると、米を獲得
  • 開墾 - 消費する金の量を指定すると、石高(領地価値)が上昇
  • 町造り - 消費する金の量を指定すると、町(都市数)が増加
  • 雇用 - 消費する金と人口を使って兵を増加させる(忠誠度が減少)
  • 解雇 - 減らす兵の量を指定すると、忠誠度と人口が増加
  • 施し - 消費する米の量を指定すると、忠誠度が上昇
  • 輸送 - 他の自国領地を選択し、送る資源(兵・金・米)の量を指定
  • 委任 - 委任する自国領地を選択すると、その領地は CPU が管理
  • 解任 - 解任する委任領地を選択すると、プレイヤーの管理に戻る
  • セーブ - ゲームの現在の状態をスクラッチパッドに保存
  • 終了 - ゲームを終了してタイトル画面に戻る
戦争モードのコマンド振る舞い
  • 通常 - 標準的な攻撃/防御を行う(相手の戦術により効果が変動)
  • 奇襲 - 敵の士気を下げる攻撃(通常防御に対して効果的)
  • 火計 - 敵の食料を減らす作戦(火計防御以外に効果的)
  • 鼓舞 - 自軍の士気を上げる防御戦術
戦術の組み合わせ効果

各戦術の組み合わせによる詳細な効果:

攻撃側:通常
  • vs 通常防御:通常ダメージ(倍率 180、ハードモード時 100)
  • vs その他防御:低ダメージ(倍率 60、ハードモード時 40)
攻撃側:奇襲
  • vs 通常防御:高効果(倍率 40、ハードモード時 20)+ 敵士気低下、自軍士気上昇
  • vs 奇襲防御:低効果(倍率 300、ハードモード時 180)+ 自軍士気低下
  • vs その他防御:高効果(倍率 30、ハードモード時 20)+ 敵士気低下、自軍士気上昇
攻撃側:火計
  • vs 火計防御:自軍兵力減少(20-40%、ハードモード時 20-40%)+ 自軍士気低下
  • vs その他防御:敵食料大幅減少(30-80%、ハードモード時 40-80%)+ 敵士気低下、自軍士気上昇
防御側:鼓舞
  • 自軍士気上昇(5-20 ポイント)

データ構造

大名データ
public void init(int kunshu, long kin, long hei, long kome, long jinko, long kokudaka, long machi, long tyu)
  • kunshu - 君主 ID
  • kin - 金(資金)
  • hei - 兵(兵力)
  • kome - 米(食料)
  • jinko - 人口
  • kokudaka - 石高(領地の価値)
  • machi - 町(都市数)
  • tyu - 忠誠度
領地データ(Kuni クラス)
public void init(int kunshu, long kin, long hei, long kome, long jinko, long kokudaka, long machi, long tyu)
  • kunshu - 君主 ID
  • kin - 金(資金)
  • hei - 兵(兵力)
  • kome - 米(食料)
  • jinko - 人口
  • kokudaka - 石高(領地の価値)
  • machi - 町(都市数)
  • tyu - 忠誠度
  • inin - 委任フラグ
戦争モードデータ
int b_offence;     // 自軍の攻撃戦術
int b_defence;     // 自軍の防御戦術
int e_offence;     // 敵軍の攻撃戦術
int e_defence;     // 敵軍の防御戦術
boolean b_off;     // 戦術選択フラグ
int b_player;      // プレイヤー側識別
int b_enemy;       // 敵側識別
int b_turn;        // 戦闘ターン

ストレージ

ゲームデータは以下の方法で保存されます:

  1. スクラッチパッド - scratchpad:/// を使用した永続データ保存
  2. 一時データ - ゲームプレイ中のメモリ内データ
// データ保存の例
DataOutputStream out = Connector.openDataOutputStream("scratchpad:///0;pos=0");

ゲーム進行

ターン制システム
  • ゲームは各大名が順番に行動するターン制で進行します
  • 各ターンの開始時に、大名の行動順序がランダムに決定されます
  • すべての大名が行動を終えると、1 ターン(季節)が経過します
  • ターンカウンター(turn変数)が増加し、次のターンが始まります
プレイヤーと CPU の行動
  • プレイヤーが操作する大名の番になると、コマンドメニューから行動を選択できます
  • CPU 大名の番になると、自動的に以下のような行動を取ります:
    • 資金が十分にある場合:米売り、米買い、雇用などのコマンドを実行
    • 兵力が十分にある場合:隣接する敵国に攻撃を仕掛ける
    • 資源が不足している場合:資源を回復するコマンドを優先的に実行
  • CPU 大名の行動は、その大名の資源状況や周囲の状況に応じて決定されます
  • CPU 大名の行動は画面上に表示され、プレイヤーはその結果を確認できます
季節イベント

ゲーム内では 4 ターンごとに以下の季節イベントが発生します:

  1. 人口増加turn%4==0の時)

    • 各国の人口が 10〜12%増加します
    • 計算式:jinko += jinko * (random(3)+10) / 100
  2. 資源生成turn%4==2の時)

    • 各国の金と米が自動的に増加します
    • 金の増加:忠誠度、人口、町の数に比例
    • 米の増加:忠誠度、人口、石高に比例
    • 計算式:
      • kin += tyu*(random(2)+3)/100 + jinko*(random(5)+10)/100 + machi*(random(15)+25)/100
      • kome += tyu*(random(2)+3)/100 + jinko*(random(5)+10)/100 + kokudaka*(random(15)+25)/100
  3. 緊急事態(ターン開始時にランダムで発生)

    • 疫病turn%4==1の時):影響を受けた国の人口が 5〜9%減少
      • 計算式:人口 -= 人口 * (random(5) + 5) / 100
      • 他の被害:食料 10〜29%減少、忠誠度 20〜29%減少、町 20〜39%減少、石高 20〜39%減少
    • 飢饉(その他の季節):影響を受けた国の人口が 5〜19%減少
      • 計算式:人口 -= 人口 * (random(15) + 5) / 100
      • 他の被害:兵力 15〜34%減少、忠誠度 15〜24%減少、町 5〜14%減少、石高 5〜14%減少
    • 発生確率:各国ごとに 1/40 の確率で発生
    • 複数の国が同時に被害を受ける可能性があります

これらの季節イベントは国力のバランスに大きく影響するため、プレイヤーは長期的な戦略を立てる必要があります。

資源計算式

各コマンドの詳細な計算式:

米売り
  • 消費:米 -= 投入量 * BIAS
  • 獲得:金 += 投入量 * (random(BIAS) + BIAS) (1.0〜2.0 倍のランダム倍率)
米買い
  • 消費:金 -= 投入量 * (random(BIAS) + BIAS) (1.0〜2.0 倍のランダム価格)
  • 獲得:米 += 投入量 * BIAS
開墾
  • 消費:金 -= 投入量 * BIAS
  • 獲得:石高 += 投入量 * (45 + random(10)) (45〜54 倍)
町造り
  • 消費:金 -= 投入量 * BIAS
  • 獲得:町 += 投入量 * (45 + random(10)) (45〜54 倍)
雇用
  • 消費:金 -= 投入量 * BIAS/2, 人口 -= 投入量 * BIAS, 忠誠度 -= 投入量 * BIAS/2
  • 獲得:兵 += 投入量 * BIAS
解雇
  • 消費:兵 -= 投入量 * BIAS
  • 獲得:忠誠度 += 投入量 * BIAS/2, 人口 += 投入量 * BIAS
施し
  • 消費:米 -= 投入量 * BIAS
  • 獲得:忠誠度 += 投入量 * (BIAS/2 + random(BIAS/2)) (0.5〜1.0 倍のランダム倍率)
戦闘勝利条件

戦闘は以下の条件で決着が付きます:

  • 敗北条件:兵力、食料、士気のいずれかが 0 以下になった時
  • 勝利時:敵国の領土を獲得し、残存兵力と食料を統合
  • 敗北時:投入した兵力と食料を失い、残存分のみ回収
  • 毎ターン消費:兵力の 30%の食料を消費、士気が自然減少
  • 食料不足時:士気が大幅に低下(30-50 ポイント減少)

ネットワーク機能

このゲームには特定のネットワーク機能は実装されていません。すべてのゲームプレイはローカルで行われます。

使ったお金と時間

今回の Devin を使った仕様書生成タスクについて、かかったコストと時間をご報告します。

この検証作業全体で消費した ACU(Agent Compute Unit)は、およそ 10 でした。作業プロセスとしては、筆者の就業後に Devin に処理を実行させ、生成されたドキュメントに対してフィードバックを行う、というサイクルを繰り返しました。このサイクルを 2 日間、実働にして約 3 時間かけて、最終的な仕様書(結果改善後)の品質まで到達しました。

2025 年 5 月現在のレートで 1ACU あたり$2.25 ですので、総コストは約$22.5 となります。幸いにも、初期提供のクレジットやプロモーションコードの範囲内で検証を終えることができました。

対象となったソースコードは、筆者が昔に書いたものであり、率直に言って可読性は高くありません。もしこの作業を人間が手作業で行うとすれば、おそらく 1 ~ 2 日を要する、根気のいる仕事になったでしょう。それと比較すると、Devin は約 1/10 程度のコストと時間で、一定水準の成果物を生成できたと言えるのではないでしょうか。特に、レガシーコードのドキュメント化という、エンジニアがあまりやりたがらないタスクにおいては、有望な選択肢となり得るかもしれません。

できなかったこと

今回の検証では、一定の成果が得られた一方で、Devin の限界も見えてきました。

具体的には、同じ i アプリゲームの続編(ソースコード規模:約 4000 行)に対しても同様に仕様書の生成を依頼してみましたが、残念ながら実用レベルの品質には至りませんでした。生成された内容に対してコメントで具体的なフィードバックを繰り返しても、期待する改善は見られませんでした。

この経験から、現在の LLM(大規模言語モデル)の能力では、ある程度以上の規模のソースコード(今回のケースでは数千行クラス)を全体として俯瞰し、その複雑な仕様を正確に把握するには、まだ能力的な限界があるのではないかと感じています。コンテキストウィンドウの制約や、コード間の関連性を深く理解する能力などが、今後の課題となるのかもしれません。

まとめ

今回の検証を通じて、AI ソフトウェアエンジニア Devin が、GitHub 上のソースコードを解析し、外部仕様書を生成するタスクにおいて一定の能力を持つことが確認できました。

しかし、その一方で、初期プロンプトを投じるだけで完璧な品質のドキュメントが手に入るわけではない、という現実も明らかになりました。生成物の品質を実用レベルに引き上げるためには、ソースコードの仕様を熟知した人間(今回のケースでは元開発者である筆者)による、的確かつ根気強いフィードバックが不可欠です。

また、現在の LLM の能力を考慮すると、Devin が一度に扱えるソースコードの規模には限界があるようです。今回の感触では、およそ 1500 行程度のコードであれば、ある程度仕様を把握できる可能性があるものの、それを超えると精度が著しく低下する可能性が示唆されました。

今後の展望として、Devin のような AI ツールの進化に期待しつつ、約 20 年前に i アプリで開発したレガシーなゲームコードを、現代の Web アプリケーションとして移植するプロジェクトを構想しています。将来的には、移植したアプリケーション上で、LLM 同士が互いに競い合うような、新しい試みをしたいと考えています。最新の LLM がどこまで進化し、ソフトウェア開発の未来をどう変えていくのか、引き続き注目し、検証を続けていきたいと思います。ご期待ください。

Discussion