【寄稿】プログラミング初心者がGo書いてみた

本記事は寄稿記事となり、 id:whywaita は筆者ではありません。


本記事はwhywaita Advent Calendar 2023 17日目の記事です。 昨日はhogextendさんによるワイワイ椅子2023 - hogashi.*の記事でした。

さて、皆さんこんにちは。初めましての方は初めまして。 whywaita Advent Calendar 2023に2回目の登場になります、Jと申します。 お時間がある方は、よろしければ前回の記事もご覧ください。

whywaitaさんといえばポーカーということで前回記事は執筆させていただいたわけですが、 whywaitaさんといえばGoの権威でもあるということで、 今回はポーカー×Goについて書かせていただければと思います。

ポーカー×Goという書き方をするとGoの最新技術を用いて何かすごい機能を持ったポーカーのアプリを作ったかのようにも見えますが、 筆者はプログラミングど素人、大学の講義でint main(void)ってなんだよ!!!とブチギレていた側の人間でして、 もちろん仕事でコードを書くなんてこともありません。 ですので、本記事は プログラミング初心者がGoでポーカーに関する簡単なプログラムを作ったよ というだけの話でございます。

コードを書いていく中で感じた学びを書いていきますので、 本ブログの聡明な読者の皆様につきましては温かい目で見守っていただけますと幸いです。

何を作ったの?

簡単なトレーニング用のプログラムを作りました。 ポーカーはそのイメージに反して(?)暗記が重要なゲームでして、 例えば最初に配られる2枚を見てそのゲームに参加すべきかどうかというのは、 すでに世の中に計算された戦略がありまして、それを覚えるのが基本です。

preflopレンジ表

※ちなみに戦略の計算は、CFRなどのアルゴリズムを使ってPCをぶん回して出すものなので、 手計算ではとても出せるものではありません。 さらに補足すると、計算方法がなかった時代には先人たちの経験と勘による参加ハンド表なるものがありましたが、 これが実によく計算結果と一致していたというちょっとした怖い話(?)があります。 先人達の変態性に拍手。

もちろん実戦では計算結果通りにプレイすることはなく、 相手に合わせて戦略を変化させることが重要なわけですが、 これはそもそも基本となる戦略を覚えていないと難しい芸当です。

そんなわけで、実戦形式で戦略を覚えられるアプリを作ろう!となったわけです。 実装に関しては、戦略を計算するような実装ができるわけもなく、 計算済のファイルを用意してそれを読み込む形にしました。 一問一答のクイズのQAを大量に用意しておいて、 設定に合わせて問題を出して正誤判定をするといった感じですね。

学び

ここからは何を作ったかという話よりも、実装を進める中で得た学びを書いていこうと思います。

①設計が大事 これはプログラミングに限らずなんでもそうですが、特に初心者のうちは、 ある程度でもいいので方針を決めてから手を動かした方がいい気がしました。 最初はとりあえず書いてみるか!でやってみたのですが、 それぞれの関数の連携だったりがごちゃごちゃになって、結果クソみたいなコードが出来上がってしまいました。 そんな感じなのでもちろん関数名なども分かりにくく、 レビュー時に「命名にセンスがない」と一蹴されました(悲しいね) ※「もう書き始めてるのに関数名が決まってない時点でおかしい」  という厳しいフィードバックもいただきました(これは流派によるとも聞きましたが) この辺りはwhywaita先生に講義をしていただいて、今ではだいぶ改善しました(と思っています)

②型は大事 現時点で僕がVSCodeに赤線を引かれる理由の大部分はこれです。だって動く気がするじゃん、、、 なぜ型が大事かみたいな話をwhywaita先生に伺ったような気もしますが、忘れちゃったのでもう一回だけ教えてください!

③公式ドキュメントを読め 困ったときにはいつもChatGPTに聞いてたのですが、結局正しいことを言っているとも限らないし、 検索能力を上げるためにも公式ドキュメントを読む癖をつけようと思いました。 というか、作った側が一番仕様に詳しいんだから、 一番詳しいところが出してるドキュメントに頼るべきなのは当たり前なんだよな、、、

④用語は正しく覚える ポーカーも一緒なのですが、用語の定義がぶれていると会話が成立しなくなります。 誤った理解のまま突き進むと危険なので、わかったふりせずに分からないものは調べる、 分からないと言うといった基本的な姿勢はここでも大事だなと思いました。 覚えたての単語って使いたくなるんですけどね。

⑤動くと嬉しい やはりこれにつきます。いろんなエラーが出てその度に調べ物をして直し、また別のエラーが出て、、、 という作業は苦しかったですが、最後に自分の書いたコードがちゃんと動いた時はとても嬉しかったです。

コードが動いたときの私

余談

実はこのAdvent Calendarの日までにフロントも書いて、自分が書いたGoのアプリをWASMとしてビルドして、ブラウザ上で動く状態にしよう!という計画を立てていたのですが間に合わずでした。 本業が忙しくて(言い訳)、ここ2~3週間くらい1行もコードを書けていない気がします。 いやーほんとにあともう少しなんですけど(言い訳)

whywaita先生には完成までもう少しお付き合いをしていただけると伺っておりますので、 お言葉に甘えつつ実装を進めていこうと思っています

いかにも動きそうだけど、実際はハードコーディングされているだけのブラウザ画面

まとめ

いかがでしたでしょうか?つよつよエンジニアの皆さんにとっては今更な話だったかもしれませんが、 昔を思い出して懐かしい気持ちになっていただけたなら幸いです。 whywaita Advent Calendar 2023、明日はIzacchi16さんです!