TypeScript, TypeDoc, GitHub Copilotを使ったメタプログラミング
更新日:4月9日
*ほぼ頭の中の妄想なのでメモレベルです。悪しからず。

GitHub Copilotがないと生きられなくなってきた劣化エンジニアとして帰り道に思った、なんかプログラミング手法として使えるんじゃないか?というアイデアです。
事前情報の整理
限界SE界隈のエクセル仕様書
自分は幸い体験したことがないのですが、多重受けのSE界隈ではエクセルでの仕様書や設計書を納品することがあると、昔に聞いたことがありその時はなんじゃそりゃと思っていました。
インターフェースや依存関係などをエクセルに書いて下請けに納品して実装してもらうそう。
メタプログラミング
メタプログラミングは、構造や実装自体を抽象化し、DSLと呼ばれるミニ言語やマクロやジェネリックなども使う「コードを書くコード」を作るテクニックです。
TypeDoc
JSDocという多分オリジナルはJavaDocかな?というものがあり、コードに書いたコメントからドキュメントを作ってくれるやつのTypeScript版
TypeScriptは型があるのでJSDocに比べて型推論を利用して書く部分が少なくなって便利だねっていう代物です。
GitHub Copilot
OpenAIのCodexを使ってコードをサジェストしてくれるツールです。
自分はコードを書く時は基本お世話になっており、非常に便利。
AIを使ったメタプログラミング
GitHub Copilotは基本的にプログラミング言語に特化したモデルが「なんか可能性高そうなもの」を予測してサジェストしてくれるのですが、これはGPT同様「可能性空間を限定することが重要」
話が若干ずれますが、可能性空間の限定やChatGPTの使い方関しては下記のツイートから参照できる「深津式プロンプト・システム」を調べてみると理解できるかと思います。
https://twitter.com/Yamkaz/status/1623677081099059201
GitHub Copilotがそれなりにというか、恥ずかしいんですが自分が書くよりもいいもの作ってくれたりするんですよ。
もちろんCopilotを上手に使うコツみたいなのがあって、さっき述べた「可能性空間を限定することが重要」という話です。
下記のツイートですでに「AI でコード生成/提案しやすい文法のプログラミング言語が出てきてなんか流行ると思う。」という話がされていますが、AIに精度よくコードを書いてもらうにはどうすればいいんだろう?と思ってきました。
https://twitter.com/mizchi/status/1529273034506309633
AIプログラミングの精度を上げる
いかに可能性空間を限定するかということに焦点が当たってくるんですが、大事なのは「型」と「コメント」になります。
限界SE界隈のエクセル仕様書というのはインターフェースを納品して、実装を下請けにやらせるという話が上でしましたが、めちゃくちゃ強引に言うとExcelをInputに下請けが頑張ってプログラムをOutputしてくれるという言語モデルとして捉えることができるのでは?と思ったんですね。
で、私には下請けなんかいませんからCopilotに書いてもらいますが、コメントでいかに補正するかというのがすごく大事になってきます。
関数は何を引数に取って、どのように処理して、何を返すのか。
ということをコメントで補足してあげます。
で、VSCODEは /** と打った後にエンターするとjsファイルやtsファイルであればいい感じにJSDoc的なコメントを書いてくれるんです。便利ですね〜。

なので、まず関数のインターフェースを定義して、その関数で何をするかをJSDocで補足してあげます。
そうすれば可能性空間は割と削ることができ、Copilotはなにを書くべきなのか明確になる。
これで割と精度が上がります。
実装よりもまず「インターフェース」と「関数がやることの言語化」をと行うことで、あとはAIが書いてくれます。
追加でポイントなのが、ドメインの型など依存も伝えよう。です。
実際のプロジェクトだと難しいかもですが、Copilot(中のCodex)に全て情報の伝えてあげるべきなのです。これをするとさらに精度が上がります。
メタ情報を、変に憶測させるとよくわからない回答をしてくるので、可能性空間の限定をしっかり行なって行きます。依存関係の方だけでも同じファイルに一時的移動させるなどしてもいいかもしれません。
AIプログラミングの効率的に行うには?
ドメインや関係の情報を伝えて、型とコメントを作るとそれなりに実装をしてくれるということがわかったので、いかにそれらを効率的に作るかという話になりました。
そこで限界SE界隈のエクセル仕様書形式でばーっとそれらを書いておき、スクリプトか何かでファイル化してもいいし、Angular CLIで利用されているSchematics を利用して表形式のデータをディレクトリ、ファイルとしスキャッフォルディングするなどを思いつきました。
気がついたら自分が限界SE界隈のエクセル仕様書形式を作ろうとしていたのはなんとも言えない気持ちですが、実際インターフェースとコメントを作るマシンと化すにはこの方法悪くないぞ?と。
冒頭にも述べましたが、妄想ですので、どの程度実用性があるかわかりませんが、時間を見つけて試していけたらなと思っています。そもそもそんなに早く実装する必要があるわけじゃないですが、あくまでもアイデアとしてね。
また進捗あれば書きます。どうも。