昨日いつものようにPRをマージしようと思ったら、main branchとコンフリクトしたので対応。するとtscがエラーを吐いた。
TS2589: Type instantiation is excessively deep and possibly infinite.
Prismaのモデル拡張を生やすための $extends() を呼び出しすぎた結果、TypeScriptが音を上げたようだった。このことはまたブログに書けたら良いと思うが、保守性が悪化しないコードを目指して数時間格闘しても良い感じにならなかったので、もはや保守性を諦めるか…。と思い、妥協案をPRに出して眠りについた。
翌朝。チームにPRを見てもらうと思っていた通りあまり反応は良くない。XXできないの?といろいろな提案をもらう。うーんですよね。そう思いますよね。いや昨日試したんだけどなんかうまく行かなかったんですよね…。まあとはいえ!結構数時間粘っていたし一晩寝たわけだから、ここはいっちょ試してみよう。そうしよう。ということで新しくブランチを切ってみたのでした。そうそう、そういや最近はgit gtrが手に馴染んできていて、VSCodeのインスタンスが画面に増えまくってまあまあ大変なんですけど、まあ便利ですね。モバイル開発してるとworktreeはちょくちょく使うものだけど、こんなに世界中で使われるようになるとは思わなかった。
それで。いつものようにClaude Codeに頼む前に、どんなコードだったかな、どんなふうに書くと良いかなー、と手元でこねこねしてみる。こんな感じでかけたらよいかなーとUtility Typesを使ってがんばって書いてみると、なんか昨日と違ってうまくいきそうなんですね。睡眠大事だわ。なんだけど、ちょっとうまく行かない。そこでClaude Codeくんに出てきてもらって、ちょっとここがうまくいかんのだけど、君TypeScript得意だよね?ちょっとやってみてくれない?とお願いすると、それっぽいコードを出してくれます。ただやっぱりうまくいかないんですね。チーン。
そこでアプローチを変えよう!もうちょっと素直に書こう!ということで、まずは愚直に書いてもらうことにします。するとなんだか気になるところが出てきて… ここ、もうちょっとこうならないかな?なんでこれはうまくいかないの?あー、なるほどね。それはむりか。こーれはちょっと微妙すぎるコードになっちゃったね、もどそう!などなど話していくとまあ動くコードにはなってきて、まあ最低限のコードくらいになる。ClaudeのContext Windowも限界になってきそうだったところで、リファラジの id:t-wada さんゲスト回を思い出す。「ほんじゃ、ここまでの議論をADRにしてくれる?」とお願いしてADRを書いてもらうことにします。その間にコードを改めてレビューしていると、もうちょいカッコよく書くためのヘルパー関数的なものを用意したらいいんじゃない?ということを思いつく。
ADRも書き終えたところで、こんな感じに書けたら嬉しいじゃないの?というコードを雑に書いて渡してみる。これはTypeScriptの型的にできないんですよー、そうなのかー。じゃあここ妥協したらいけるの?パターン出してみて!とかClaudeとのやりとりをして方針を決めたら、Claudeに実装してもらい、その関数を使って私がコードを書いてみて書き味チェックを繰り返します。あれ?ここは補完出ないのだっけ?嫌だなー、ここは出てほしいよ!とか、そんな感じで。それで何往復かすると、かなり良い書き味のインタフェースに落ち着いた。もちろん最初に描いていたものではないが、まあだいぶ良くなったね!というものに落ち着いたのでした。で、じゃあこれもADRに書いといて、とお願いして、お片付けしてセルフレビューして、リベンジPRを出すところまで行けたのでした。
こんなのが今日のあった出来事なのだけど、AIを使いこなしている人からすればなんてことないことだとは思うが、確実に自分の能力が拡張されているなという気持ちになったのだった。TypeScriptの知識をそこそこ持った、無限に壁打ちできてそれなりに(自分と同じくらいは)コードが書ける相手がいる。プロトタイプもちょうどいいくらいにやっておいてくれる。しかもADRとか過去のやり取りもまとめてくれる。自分1人ではこの短時間で行ける気がしなかった所まで登れたことに驚きがあった。
このスタイルになるまでには、バリバリAIを使って並行開発しまくる同僚や、ちょうど良いところを追い求め続けるチームや、リファラジ*1の#102が欠かせなかったので、接続しておきたい。
で。いま、ここ、の目線から言うと…。いまコードを書く仕事に転職できたのは良かったなと思っている。AIがない時代に転職するのとは、わけがちがう。AIのサポート(とそれを適用しやすいサイズと言語のプロジェクト)によって、しばらくコードを書いていなかったことのブランクも多少マシになっていると思う。これまで多くの時間を使ってやってきた、何をつくるか、どう作りすぎず、しかし積み上げていくか、どうチームをつくっていくか(いまは逆に、逆の視点からどう動いてフォローしていくか)を考えながら、時にはこうしたたのしいひとときを過ごしてお金を頂けるのは、とってもありがたいことだし、きちんとインパクトのある仕事に繋げていきたいと思う。
山下達郎のクリスマス・イブが流れはじめたので、これにて終わり!