昔、MoneyForwardにあった「よそQ」という資産推移のシミュレータツールみたいなやつがちょっと便利だったのだが、リニューアルかなんかで今はもうなくなってしまった。というわけで、同じような機能を持つもうちょいリッチなやつが欲しいというモチベーションをベースに Claude (opus-4-20250514) + Cline で作り始めた。
ざっくりしたアプリの仕様は:
- 任意のサイクルおよび期間指定で、金融資産や収入、支出を登録できる
- 登録されたデータを元にバーチャートで任意の期間の支出シミュレーションができる
- バックエンドやデータベースはなし(全てオンメモリ)
など
以下、作ってみた感想。
設計指示の必要性
作り始めた最初の頃はActのままでずっと作業をさせていたのもあるだろうが、「こういう機能追加して」みたいな言い方だけして作業開始すると、いわゆるDDDでいうところのSmartUI的な実装をどんどん積み上げようとする。
やはり設計の知識を引き出すための指示が必要で、自分の場合には「XXXという機能を作りたいけど、この機能に関わるデータ構造をOOP的に考えるとどういうモデリングがいいと思う?」という質問でPlanして、データ構造や操作のインターフェイスを先に考えさせるといい感じになった。データ構造のことを考える過程で、ちょっと抽象化っぽいことをし始めるのもイイ。
たとえば、当初のアプリのシミュレーション計算部分の設計は非常にナイーブで、その時点で存在していた現金預金・収入・支出の設定をforループの中でそれぞれ参照して、そのままバーチャート用のArrayデータを作るという素人の実装だった。それに対して「今後の新しい収支ソースの追加をしやすいように、OOPの観点で設計を考えて」と指示すると、資産の増減を計算するインターフェイスに対して収入・支出・金融資産の実装を作り、チャート用データの生成ではインターフェイスのみに依存して計算結果をreduceするような、ストラテジーパターンを意識した設計を提案してきた。
「知識はあるが、その使い方が上手くない」みたいなやつがよく分かる。
Planの工夫
Clineを使っているとすぐActモードにしてもらおうとするが、たしかにオーケストレーション的なステップをいくつか踏むほうがいい。
自分のアプリの場合には、データ構造で見ると良さそうでも、それをバーチャートで表示させようとすると情報が落ちたり既存の挙動を破壊するような実装に何度か遭遇したので、"設計考えて"→"設計の懸念点教えて"→"UIレベルで整合性がとれているかコードを確認して" のように順序立てて設計の整合性を確認させるフローをとったら、精度が上がったような気がした。
教科書的には、既存挙動の破壊(デグレ)はテストレベルで検出するべきだと思うが、適当にAIに任せて書かせていたユニットテストの品質がよくなかったというか、そもそもアプリケーションがUIと状態操作を分離した設計になっていなかったせいで既存のテストのカバレッジではデグレを検出できていなかった。ClineはBrowser toolが使えるので、色々試して上手くいかないと最終的にはブラウザ経由で動作確認をしようとするのだが、これがノロくて待っていられないし、この積み重ねが開発速度の低下につながるのであまりやらせたくない。
フロントエンド開発をある程度やっていれば、UIと状態操作を分離して後者のみテストを書くだけでいいような設計にするのが望ましいということは経験上分かっているものだが、やはりAIは知っていても指示しないとやらないので、clinerulesで設計を意識させるよう指示したうえで、テストのカバレッジを上げるのが望ましいと感じた。
ディレクトリ構造やコーディング規約など表面的なもの以前の、データフローや状態設計、UIと状態操作の分離など、根本的にそれが雑に作られていることによって結果的に無駄な作業が毎回発生している、みたいなやつをこちらから指摘せずともAIに最初から意識して改善させる術があまり分かっていない。AIにも作業のたびにKPTとかさせればいいんだろうか?
その他感想
SmartUI的な実装で突っ走ろうとするところや、指示しないと雑なデータ構造やインターフェイスのままで先に進もうとするのを見ていると、大半の人間もこういう仕事の仕方だよなーという気持ちになった。開発に入る前に自分で設計を考えて壁打ちするような人材はソフトウェア・エンジニア全体でも上位数%くらいのレベルだと思うし。
その点、AIだとあれこれ指摘したり無限にやり直しさせても"人間の感情"という最も面倒な状態管理がないぶんかなり気楽。特に、人間相手にやり直しや「なぜその設計にしたのか?」を追及するのは、やる側も疲弊する。こちらも人間なので、作業者の単価を知ってると「その単価でこのレベルのアウトプット?」みたいな気持ちになったりするし... そういうアレコレと比較すれば、従量課金でも超安い。
こき使っても文句言わない、ある程度は正直に仕事をしてくれる、というのはやはり最強。