共通点はオブジェクト指向プログラミング言語

     前回の記事Ruby製のウォーターソートパズル解答プログラムをGrok4を使ってKotlinC++に書き換えましたが、極短時間で移行出来たのはRubyKotlinC++オブジェクト指向プログラミング(OOP)言語だったということも一つの要因だと思います。
     現在公開している「3三将棋の簡易版」も一応OOP言語であるCoffeeScriptで書いているので、移行しやすいだろうと思いやってみました。もし元のコードが素のJavascript(Vanilla JS)だったら大変だったろうと思います。

    CoffeeScriptはOOP(オブジェクト指向プログラミング)言語

     Javascriptもどんどん変化していて現在はそうでもありませんが、私は昔はJavascriptが嫌いでした。でもCordovaを使って手軽にAndroidアプリを作成するために必要だったので、AltJSであるCoffeeScriptならOOP出来ると喜んでJavascriptの替わりに使ったのですが、OOPを意識しながらCoffeeScriptを使っていた人は少ないと思います。Railsのプロジェクト内でちょっとした関数をCoffeeScriptで作ってみるぐらいが普通の使われ方だったと思います。
     でもCoffeeScriptは一応OOP言語で、static変数・メソッドとインスタンス変数・メソッド、publicな変数・メソッドとprivateな変数・メソッドを区別して記述することが出来ますし、クラスの継承も可能です。AltJSなので結局はJavaScriptの制限に縛られるので、スコープの有効性等がどれだけ厳密に守られてるのかは知らないのですが気分はOOPのままコードが書けます。
     ということで、公開しているCoffeeScript製「3三将棋の簡易版」リポジトリを元にC++に書き換えればいいのですが、このリポジトリは全然更新していないので内部でeval関数を使っていたり古いコードになっているため今回は無視して、3三将棋アプリの最新版のソースを元に書き換えました。なので「3三将棋の簡易版」リポジトリのコードと比較すると少し内容に違いがあることを先にことわっておきます。でも、やってることは同じで出力結果は同じになるはずですし、「CUIで9マス将棋を解く」の記事に書かれている内容もほぼ当て嵌まります。

    3三将棋CUI版のC++バージョンのソースコード

    3三将棋簡易版のC++バージョン

    コーディング力では生成AIにはかなわない

     過去にも将棋関連アプリのCoffeeScriptのソースをC++に移行してみようと思ったことはあったのですが、一つのソースで3三将棋から7七将棋まで遊べるようにしようとしたり、将棋AI部分をC++で作ってもAndroid用GUIが作れない(不可能ではないでしょうが難易度高過ぎ)所為もあって、モチベーションが上がらずやりかけては中断することを繰り返してました。それに、例えば「抽象クラスをインスタンス化したくなったときはどうすべきなんだろう(CoffeeScriptでは出来てしまう)」とかOOPに関するに言語仕様の違いについて迷うことが出てきて手が止まることも多かったです。そういう時にGrok4は複数の選択肢を挙げてくれましたしコード化してくれました。前回の記事でも、Rubyでは==で配列の比較をしている部分を、演算子のオーバーロードが使えないKotlinではequalsメソッドを追加・修正して実現しましたし、何も言わなくてもC++では演算子のオーバーロードで実現してくれました。こうあるべきという綺麗なコードを一瞬で出力してくれました。
     自分の場合、Rubyなら自分が思いついたアイデアをすぐにコードにして試せるので好きなのですが、C++で書くとなると自分の中では要件が明確なのにも関わらずコードにするとなると時間がかかってしまいます。でも、C++を使いながらもアイデアをすぐにコード化出来るというC++の達人もいるでしょうから、プログラミング言語の違いは大きな問題ではないでしょう。どういう書式で書くのか、どういう型を使うのか、どういう関数を使うのか、OOP的にはどう書くべきかというプログラミングのテクニカルな部分、コーディング力とでもいうのでしょうか?に関しては生成AIには敵わないなと感じました。生成AIは世界中のソースコードから学習しているわけですから、少し寂しい気持ちもありますが、そうなるのは仕方がないことでしょう。前向きに捉えて生成AIを使っていくのがいいと思います。
     現に今まで中途半端にしか進められなかったC++への移行が、生成AIを使うことで極短時間で出来たわけですから喜ぶべきでしょう。今回もほとんどデバッグ作業は必要なかったです。
     但し、今回は試しにやってみたという感じなので、3三将棋から7七将棋まで対応可能なソースの一本化はとりあえず見送りました。

    大事なのはアルゴリズムを生み出す発想力

     アルゴリズムを生み出すと言っても新しい汎用的なソートアルゴリズムを発見するとかいう大袈裟なものではなく、データ構造を含めたアルゴリズムを生み出す作業とは、世のプログラマが普通にやってることです。業務ソフトでもユーザーの要望を聞いてこういう関数を作ってみよう、こういうクラス構成にしてみよう、こういう手順で実行させようとアイデアを出して日々やっている(押し付けられている?:sweat_smile:)作業です。コンピュータが要件を満たせるレベルまで細分化して明確にしていく作業と言えばいいかもしれません。多くのユーザーは、人間がやっていることをコンピュータにやらせるレベルまでには要件を明確に出来ていませんので、プログラマが業務ソフト毎にデータ構造を含めた新しいアルゴリズムを日々生み出してます。
     当ブログで紹介してきたプログラミング事例でも、特に苦労せず実現できたものやネット上からのコピペも多いですが、以下のアルゴリズムは実現までに結構悩まされてなんとか生み出した、アイデアを絞り出したという感じです。

     その人間が生み出したアルゴリズムもどんどん生成AIの餌になっていくわけですから、いずれはすべてAIがやるようになるのかもしれません。それに人間側が、AIが処理しやすいように業務内容を変えていく動きもありますね。

    生成AIはコーディングスキルだけなのか?

     今回の記事も、元になるCoffeeScriptのソースコードからC++に移行しただけで、生成AIを使って0からアプリを作った経験はないので、生成AIアルゴリズムを生み出すという点でどこまで役に立つのか分からないのですが、そういう部分ではまだまだ人間の方に分があるのではないでしょうか?
     機会があれば生成AIを使って0から何か作ってみたいと思ってます。