架空伝統ゲーム「机戦」のオンライン対戦プラットフォームである cerke_online のコード負債 (part 0.5)

この記事は筆兵無傾 Advent Calendar 2022 およびボードゲーム・パズルプログラミング Advent Calendar 2022 の 14 日目の記事です。日本時間だと遅刻ですが、カリフォルニア時間だと現在 12 月 14 日の 25 時 12 分………

えっと、ハワイ時間ってことにしておきましょう(ハワイ行ったことないけど)。それならあと 47 分の猶予がありますね。

 

 



 

前回のあらすじ

hsjoihs.hatenablog.com

  • 異世界ファイクレオネで遊ばれている(という設定の)架空伝統ゲーム「机戦」の製作を手伝っています
  • オンライン対戦プラットフォーム「cerke online」を事実上全て一人で実装しています
  • 一人で突っ走っているので端的に言ってコードがカスであり、私一人でしか書いていないので気兼ねなく強い言葉でコードを罵ることができます

過去編

現状のコードにも様々な問題があるのですが、過去のコードが抱えていた(そして今では部分的に直っている)問題の方が見た目が面白いので、今回はそれをネタにしていこうと思います。

 

(過去の負債を強い語気でネタにするのに敬体はなじまないので、以下常体で書く)

 

一年前、具体的には 2021 年 11 月 6 日に、「いよいよソースコードがマズくなってきた!そろそろ先延ばしにするのをやめ、問題に直面しなくては」という思いのもとで、ファイル間の依存関係をグラフにしてみたときの様子がこちら。

 

おしまいである。スクショ中の「うわぁ。」「どうしてこんなになるまで放っておいたんだ。」が当時の私の気持ちを如実に表している。なんなら、1 年以上経った今でも、当時これを整理してまとめを書いたときの寮のベッドの配置が脳裏にはっきりと浮かび上がる*1

どうしてこうなってしまったのか

前回の記事でも書いたように、「今となって考えれば MVC パターンを採用しておけば遥かに見通しの良い実装となった」が、「当時は Elm も React もやったことがなく」組みやすいところから行きあたりばったりに組んで雑な増改築を積み重ねていった結果であるのはもちろんなのだが、もう一つ、そもそもこの机戦というゲームにそれなりに状態遷移が多く、必然的に API が複雑にならざるを得なかった(し、初めて組んでいる際には全体像が見えず、その複雑なものをきれいに構造に落とし込むという設計をサボってとりあえず書き始めてしまった)という事情がある。

 

ちなみに、上の図で現在 GroundState や ExcitedState と名前がついている型は、2021 年 10 月当時は「A」「C」とかいうカスな命名がされていた。

 

2021 年 12 月時点でこれらを GroundState や ExcitedState へと改称することも考えたのだが、当時の私は「物理学知らないとわかんない命名とか微妙でしょ」と考え、これを一旦却下

github.com

 

この判断を改め、『そういう命名は(属人化を上げるので)「闇鍋」になると言ったが、「物理学の素養があれば分かる命名」は、「誰にも絶対に分からない命名」よりも優れている。』として GroundState / ExcitedState を採用したのは、実に翌年の 2022 年 9 月を待つことになるのであった。

 

また、上の図で青矢印の横に書いてある POST 先が全て /decision/ の形になって一貫しているのは 2021 年 12 月 4 日にリファクタリングして API を整理したからであって、それ以前の命名惨憺たるものであった。

 

github.com

 

教訓

  • 一人で開発していると、得てしてコードは闇鍋化する
  • 他人が覗いてきたり他人に見せようとしたりしない限り、闇鍋はいくらでも拡大する
  • 年に 1 回ぐらいはコードのカスさを如実に示す文書を書いて反省に資するなどする必要がある

 

よし、現在ぴったりハワイ時間の 23:59!

*1:スタンフォードは住む寮が毎年変わる