共通点はオブジェクト指向プログラミング言語
前回の記事でRuby
製のウォーターソートパズル解答プログラムをGrok4
を使ってKotlin
やC++
に書き換えましたが、極短時間で移行出来たのはRuby
もKotlin
もC++
もオブジェクト指向プログラミング(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マス将棋を解く」の記事に書かれている内容もほぼ当て嵌まります。
コーディング力では生成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七将棋まで対応可能なソースの一本化はとりあえず見送りました。
大事なのはアルゴリズムを生み出す発想力
アルゴリズムを生み出す
と言っても新しい汎用的なソートアルゴリズムを発見するとかいう大袈裟なものではなく、データ構造を含めたアルゴリズムを生み出す作業とは、世のプログラマが普通にやってることです。業務ソフトでもユーザーの要望を聞いてこういう関数を作ってみよう、こういうクラス構成にしてみよう、こういう手順で実行させようとアイデアを出して日々やっている(押し付けられている?)作業です。
コンピュータが要件を満たせるレベルまで細分化して明確にしていく作業
と言えばいいかもしれません。多くのユーザーは、人間がやっていることをコンピュータにやらせるレベルまでには要件を明確に出来ていませんので、プログラマが業務ソフト毎にデータ構造を含めた新しいアルゴリズムを日々生み出してます。
当ブログで紹介してきたプログラミング事例でも、特に苦労せず実現できたものやネット上からのコピペも多いですが、以下のアルゴリズムは実現までに結構悩まされてなんとか生み出した、アイデアを絞り出したという感じです。
- 将棋アプリの打ち歩詰め判定 -> 「打ち歩詰め判定は必要なのか」
- チェスアプリのゲーム終了条件 -> 「将棋の評価関数とチェスの評価関数−1」、「チェスAIとテスト駆動開発」
- チェスアプリのPIN絡みのステイルメイト判定 -> 「チェスのStalemateとPINの話」
その人間が生み出したアルゴリズムもどんどん生成AIの餌になっていくわけですから、いずれはすべてAIがやるようになるのかもしれません。それに人間側が、AIが処理しやすいように業務内容を変えていく動きもありますね。
生成AIはコーディングスキルだけなのか?
今回の記事も、元になるCoffeeScript
のソースコードからC++
に移行しただけで、生成AI
を使って0からアプリを作った経験はないので、生成AI
がアルゴリズムを生み出す
という点でどこまで役に立つのか分からないのですが、そういう部分ではまだまだ人間の方に分があるのではないでしょうか?
機会があれば生成AIを使って0から何か作ってみたいと思ってます。