昔のデータを整理する機会があり、10年以上前の自分のプログラムを目にしました。
当時としてもあまり出来の良いものではないと思っていましたが、今になって見ると想像以上に酷かったです。
ただ、それだけでなく色々思ったことがあったので、特に役立つ記事ではないと思いますが、ブログとして認めることにしました。
12年前、高校時代のプログラムが発掘された
高校時代、私は C++ でゲームを作っていました。
自己紹介記事にも書いたのですが、弾幕シューティングゲームなどを作っていました。
当時は「インターネット=オタク」のような価値観が一般的で、プログラミングも一部の物好きしか見向きもしないような概念でした。
そんな中、自分ひとりで色々とゲームを作っては友人たちに遊んでもらっていました。
もちろん、周りにプログラミングについて質問できる人はいなかったので、全て独学で習得していました。
そのせいで体系的な知識を持っておらず、独自の世界観でプログラミングを行っていました。
まず、C++ を使っているにも関わらず、クラスや名前空間といった概念を知りませんでした。
と言うよりも、知っていたかもしれないですが有用性を理解していませんでした。
関数・構造体・グローバル変数のみでそこそこ複雑なゲームを完成させていたのです。
以下、実際のコードの抜粋です。

はい、ガッチガチにハードコーディングされていました。
今の自分だったら難易度(SAVE.Level)によって実装は分けますし、SEs_Make というよく分からない関数を何度も呼ぶのではなく、きちんとしたレベルエディタを用意して外部にデータを作るでしょう。マジックナンバーの多さも酷いですね…。
そして、行数を見るととんでもないことになっていますが、当時の私は「ファイル分け」をあまり理解しておらず、ほぼ1ファイルにすべての実装を行っていました。
なんと、このファイルは約25,000行あります。
今見ると、「よくこれでゲーム完成させられたな…」というレベルで可読性の欠片も無いような代物でした。
黒歴史を直視して気付いたこと
10年前のプログラムは、言わば10年前に書いた日記と同じです。
完全に黒歴史なのですが、これも自分の歩んできた道だと思い、あえてじっくり読んでみました。
すると、当時の自分の考えていたことが少し見えてきました。
まず、変数・関数名に謎の prefix が多用されているのですが、これは当時の自分がクラス・名前空間をロクに知らなかったが故の、名前の衝突を避けるための工夫であることが分かってきました。
そして、ガッチガチにハードコーディングされているものの、一貫性のあるフレームワークが自分の中で構築されていたことが分かりました。

これも酷いコードですが、else if(c<90){} のような一見無意味なコードが含まれていますが、これはすべての c のパターンに対応する処理を書くことで複雑性を減らす工夫であることが見えました。
つまり、何もしないからと言ってこの処理を書かないと、他の else if などで意図しない制御が発生する可能性があります。
それを防ぐため、あえてパターン化したコードを書いていたのでしょう。
今になって考えると、このようなコードと同等のものを生み出すエディタを作れば、現代でも立派にゲームのレベルエディタとして機能するでしょう。
すなわち、ゲームフレームワークは脳内で構築されていて、その表現力が乏しかったというわけでした。
今の自分を振り返って
若かりし頃の自分のコードを見た感想はもちろん「ひどい」なのですが、当時の自分なりにすごく考えてコーディングしていたんだな、ということが分かりました。
現在、私は某大企業でプログラマとして働いており、そこそこ周りにも頼ってもらえるレベルにいるようですが、10年前はこれだけヤバいコードを書いていたのです。
しかし、当時の自分があったから今の自分がいるわけで、10年間プログラミングを続けられれば、立派に成長できるのだということが分かりました。
当時の自分で褒めてやりたい部分は、人に頼りっきりにならず自分でしっかり考えていたという点です。
そもそも相談相手などいなかったのですが、放り投げずに考えながらゲームを作っていき、そのおかげでクラスがあれば何が嬉しいのか、名前空間ってどういう経緯で生まれたのか、と一段深いレベルで言語機能を認識することができたのでしょう。
おわりに
長くプログラムを書いていると忘れがちですが、誰だってはじめは初心者で、人から笑われるようなコードを書いてしまいます。
でも、それって必要な失敗であり、我々先人がやるべきはそれまでの努力を認めて次へ繋げてあげることなんじゃないかな?と思いました。
自戒の意味でも、時々このコードを見直していきたいなぁ、と思いました。
コメント