ノーコード開発

ノーコード、ローコード、というとコード書かなくてもなんかよきようにやってくれて完成品が出来上がる、みたいなイメージがあるんだろうな、と思う次第です。Infrabbitです。

最近はちょいちょいkiroをいじくって遊んでいます。MS嫌いだけどVS Codeは認めざるを得ないw

 

さて、ちょっとお仕事のからみでPoC的にいろいろ作ったりすることはあるんですが、基本的に私はコード書きたくない人です。そんな暇があったらインフラをいじくっていたい。ネットワークのポートを上げたり下げたり下げたりさげたり切断したりしたい。そして怒られたい。

そんなわけで、ポートダウンさせるためにもコードなんて書いていたくないわけです。書くなら無限Forkしてリソース食い潰すツールとかにしたい。そして物理的にコード引っこ抜きたいのです。パッチパネルぱちぱちしたいのです。さっむいさっむいサーバールームで凍えそうになりながら道に倒れて誰かの名前を叫びたいのです。なんか違う。

さて、とはいえですね、世の中インフラだけでできることなんてたかが知れている、というか派手さがないので中身は全然違ったりするんですが見かけ上がさして変わったように見えないから皆さんからなんだこの金喰い虫め!って怒鳴られながら石を投げられるのが我々です。

いままで一度もネットを使ったことのない奴だけが石を投げろ。

そうしてイエスはただ一人石を投げ続けた。そんな感じです。

マグダラのマリアの話はどうでもいい。そんなわけで、まあたまにはこう、見える何か、という形でこういう風に動くんですよーってのを見せてあげないとわかってもらえない、あるいはわかりにくい、なんてことはよくあるわけです。歓迎していませんが。

 

さて、そんな中でちょっと興味があるネタがあって、やりたいなぁとは思ってたんですが、いかんせんめんどくせぇなぁというのと板挟みの中にあったんですね。まあPythonでCUIの中だけで閉塞した何かならすぐできるのでそれでよかったんですが、それを他人に見せて、こういうことはどうだろう、って議論の遡上に乗せようと思ったらCUIでPythonで、ってパワーが足らんのです。

もちろん、それでもわかってはもらえるでしょうが、じゃあそれをどうサービスに組み込むんだ、とかお客さんとしてはそっちのほうが大事なわけで、別に技術的にできますよ、これがそれです、なんて話を聞きたいわけじゃあないんですね。サービスに組み込むのにどういうイメージで、どう組めるか、みたいなとこを刺激してあげないと、よーわからん、で終わってしまう。

 

というわけで、ノーコード開発としゃれこみましょう。ノーコード、とは言いますが、書く技術がない人が書ける、というKintoneみたいな話とは違います。

やることはまあ、AIに書かせましょう、なんですが、当然AIが書いたことを正確に理解して、どうしてほしいかを伝えていかないといけない。まあ一般には要件定義、というものです。

Kiroに要件定義書かせてClaude Codeにコード書かせる、なんてのもあるようですが、さすがにめんどくさい。たかがPoC程度で。なので、VS CodeのClaudeさんに全部頼んでみました。Kiroで遊ぼうとも思ったんですが、OpenRemote WSLがちょいちょいなんか切断されるので、ひとまず安定してるVSCodeでやりました。

おおむね基本的にエージェントにぶん投げつつコードを書いていってもらい、だいたいは動く、という感じに。基本的に指示が正しくあればあるほど彼らは適切なものを提示します。逆に言えば、ふわっとした指示になればなるほど、ふわっとした感じのものができてきます。まあそれでもかなりの範囲で汲んでくれるのですが。

そんな中、やっぱりついて回るのはデバッグです。まあPoC的にやろうとしてただけなので、特にテストコードも設計してませんし指示も出していません。作っているのがLLMを利用したアプリだったので、LLMの結果出力の調整のためにプロンプトをいじくり倒すことになるのですが、あれしろこれろ、と指示しているとだんだんとプロンプトが異様に巨大化していきます。

中身も重複指示があったり、巨大になればなるほどいろいろ不整合してたりとまあ多少限界はあります。とはいえ、それでも一応動く。すごいなぁ。

プロンプトエンジニアリングはまあ専門でも何でもないというかむしろ異世界の出来事に近しいので、その辺はすごいなぁで終わってしまむのですがw

だってほら、異世界では魔法が使えるんですよって言われても俺の世界じゃ魔法は使えないし、すごいなぁ以外に何を言えと。なので、僕の世界ではプロンプトをチューニングする、は主役じゃない。プロンプト自体は指示なんだから書くけれど、それを突き詰めるのは僕の世界の役割じゃないんですよね。

とはいえ、やはりノーコードといえどデバッグは必要です。当たり前です。というかこれはノーコードというよりAIによる開発なんですがね。まあコード書いてないからノーコードだろw

そして、痛感したのは、こういう開発スタイルだとそもそもよそから見たら確実に「書いてるやつのスキルとか要らなくね?」って思われるんだろうなぁとうところ。実際KintoneなんかのCMもそもそもノーコード=ノースキルであるかのように見せていますしね。

まあ、ある程度のスキル不要、ってのは事実だとは思う反面、「思った通りのものを思った通りに作る」には技術が要る、ということを感じました。

そもそも、「思った通りのもの」を思い描くこと自体がスキルなんです。

どういうことかというと、クライアントのいう「思った通りのもの」はログイン画面があってー、メールアドレスでログインしてーとかそういうレベルです。

じゃあ開発者がこれで思い描く思った通りのもの、って

・ログイン画面は何で構成するか、SSRかCSRか
・認証基盤に何を使うか、独自にDB組むのか
・セッションどうするか
・メールのバリデーションはどうするか、その際の送信は何を使うか
とかとかですね。もっとあるだろうけど。

で、AIへの指示ってこのレベル、あるいはもうちょっと細かいレベルで指示してあげないと「思った通り」にはならないんですね。
そして、これらの選択肢から何を選び取り、どれがどういう特性を持っていて、クライアントの要件に適性なのは何で、というのはもう単純に蓄積されたスキルと経験に基づいています。

まあAIにどれがいい?って聞けばサジェストはしてくれますが、そもそもサジェストされた選択肢の何がいいのかなんて知らんかったらわからんのです。

実際Pythonで書いてもらいましたが、PythonのWeb化フレームワークなんか何一つ知らんので、サジェストしてもらって、その中で一番楽なやつwとかいう指示で書きましたが、そんなもんが本番環境で正しさをもって実装されているといえるか、と言ったら否です。

さらにはその後のデプロイだとか、環境固有の話に細かくなっていくと、より環境固有因子が強くなります。こうなってくると汎用的に考えるAIとしては弱く、この環境だからこう、とかそんな話学習しているわけがないんです。

じゃあ当然その間隙を埋めるのはだれか、というと開発であって、そのためには「AIが作り出したもの」がいったいどういった内容のもので、どういう構成と構造を持っていて、環境因子とどのように適合させるのが適正であるか、というのを理解し、実行しなければなりません。

結局、コード作ってもらえる、ってTypoが十分に減る、とかバグの混入が低減できる、とかいう効果はあれど、出来上がったものを理解する、というプロセスはどうしても必要です。

もちろん、環境固有因子を排除して、統一的な基盤提供を行うようなKintoneなんかなら別ですが、まあそういう環境ばっかりでもないですし。

なので、以外とスキルいるぞ、コレ。と思った次第。まあ敷居としてはすごく低いので入りやすいですが。

とりあえず思った通りのものはできたので、じゃあこれをどう発展させるか、というところでまたAIとおしゃべりしているんですが、最近人間と話すのよりAIと話すほうが楽しくなってきてる気がします。