第08章 プログラムにバグはつきもの
壱人はゲームの流れを作っていた。タイトル画面からメニュー画面へ、そしてメニュー画面からストーリーモード、一人プレイモードや対戦モードなど、場面から場面へと移動する仕組みだ。
場面はテキストを表示するだけの簡易なものだったので、それだけならさほど難しい作業ではなかったが、流れが枝分かれしたり元に戻ったしたりで訳が分からなくなってきたため、一度紙に書いてみる事にした。
タイトル画面
↓
メニュー画面
↓
⇔ストーリーモード:会話⇔バトル→(全てクリア)エンディング
⇔一人プレイモード:キャラクター選択→バトル
⇔対戦モード:使用キャラクター選択→バトル
⇔オプション
処理を書いて矢印を引いていく。するとバトル部分が何度も出てくることがが分かった。
それならバトル部分を独立させて、様々(さまざま)なモードで使えるようにすれば、書くコードも少なくなって便利だと思ったので、壱人は処理を分離する事にした。
流れを作り終わった後に、前に作ったバトル部分を埋め込む作業を始める。しかし、すぐにできると思った作業は、考えていたほど簡単ではなかった。
実際の作業をしてみると、どこでも使えるようにするためには、今まで一体化していた処理やデータを切り離さなければならず、そして分けた処理やデータを使用するために、新たな処理も作る必要があったのだ。
ところが新しく作った処理は上手く機能せず、今まで正常に動いていたところまでエラーが起こるようになってしまった。何度やってもエラーちゃんが見飽きたエラーメッセージを出してきて前に進まない。
※エラーちゃんについては「第03章 エラーは ともだち こわくないよ」を参照してください。
「面倒くさい」
数時間粘って、遂に口から文句が飛び出した。壱人に言わせれば、便利にするつもりが返って処理が複雑になっただけだからだ。
「今までできていた事が、なんで分離したらできなくなるんだよ!このチェック何回やればいいんだ!」
そう言いながら頭を掻き毟る。実の所、複雑でも落ち着いて考えれば分かる事なのだが、渦中の壱人にはその原因が分らず、勘違いした修正を繰り返していた。
「多分、ポインタの使い方が間違ってるんじゃないか?」
見かねたイッQが口を挟む。
「なら正しい使い方を教えてくれよ」
「無理だな。ポインタは”習うより慣れろ”だ。口で説明しても意味が無い。だから自分で何度も試して理解するしかないんだよ」
「プログラムってそんなんばっかりだな」
イッQの返答に肩を落とし、壱人はまたパソコンの画面を見つめた。
せっかく前に進んだというのに逆戻りした気分だった。クリアしたステージを、難易度を変えてもう一度プレイしているようなものである。しかもこの前クリアしたばかりなので新鮮味もないし、クリア後の結果も分かっているのでモチベーションも上がらない。そうしてズルズルと時間だけが過ぎていった。
「この作業は本当に必要なのだろうか?意味はあるのだろうか?」
そんな疑問が何度も頭に浮かび、ついに耐えきれなくなってイッQに相談した。
「これならプログラムは長くなるけど、分離しないで一つの大きな処理にした方が良くないか?」
しかしイッQは、それは止めた方が良いと言った。
「処理の一つ一つが工場みたいなものだから、必要がないのに動かしていたら、余計な労力を使うだろ?」
それなら、と壱人は言い返す。
「ちゃんと動くやつを作ってから、それぞれの場面にコピーして使えば良いんじゃないか?」
意図は分かるが、イッQはやはり待ったをかけた。同じ処理が三ヵ所にあれば、修正する手間は三倍になる。それに管理をしっかり行わなければ、修正・未修正の区別がつかなくなり混乱するというのが理由だった。
「確かに内部の処理やデータの受け渡しは、前より複雑になるけど、今のうちに分離しておいた方が良いんだ、絶対」
「なんでだよ?」
「同じ処理は一つにまとめる。その方がデバッグがやり易いからだ」
デバッグとは、プログラムのバグ=不具合を発見および修正し、動作を仕様通りのものとするための作業である。
「問題が起きて原因を突き止める時に、調べる箇所が多いとデバッグが大変なんだよ」
そう言われ、壱人は気軽にこう返した。
「だったらバグのないプログラムを書けば良いだろ?」
ミッQラリアットーーー!!!
突然、壱人の体は宙に舞った。何が起こったのかというと、壱人の言葉を聞いた瞬間、イッQが「ミッQラリアット」を喰らわせたのだ。
ミッQラリアットとは、腕の代わりにミッQの束ねたサイドヘアーを叩きつけるラリアットである。髪の毛なら大した事はなさそうに思えるが、それなりの硬度があるため、油断しているとかなりのダメージがあるのだ!
※お忘れの方もいると思いますが、イッQはミッQフィギュアに憑依しています。
イッQは泣きながら叫んだ。
「バグのないプログラムなんであるか!何、夢みたいな事を言ってるんだ!全世界のプログラマーに謝れ!」
衝撃を受けた首を押さえて、ゲホゲホしながら壱人が慌てて言った。
「何もラリアットする事ないだろう?それになんで泣いてるんだよ?」
「バグを出したくて出すプログラマーなんていないんだよ!大体、テストしている時はちゃんと動いてるんだ。だけど実際に動かしてみるとなぜか不具合が起こるんだよ!」
確かにそうだが、そこまで怒る事はないのではないか、と壱人は思った。
「大体、枯れた技術でもない限り、自分が間違えなくてもトラブルは起こるんだ!」
枯れた技術とは、既にトラブルが出尽くして、そのトラブルも解決され尽くしている技術の事である。ソフトウェアやハードウェアが発売・公開されてから長期間が経過し、多くの人の手によって不具合などが検証・修正され、利用に当たっての注意点などの情報が大量に蓄積されている状態の事。
※IT単語帳(サービス終了してます)、他より。
「宇宙開発には枯れた技術が使われる。宇宙では高性能よりも信頼性の方が重要だからだ。だが、例え枯れた技術でも月に行く事はできる!ここで重要なのは、どんなに性能が限られていても、その能力を最大限に駆使すれば不可能と思えるものでも実現できるという事なんだ!」
なんだか壮大な話になり、胸が躍ってきた壱人は喰い気味に尋ねた。
「じゃあ、俺はその枯れた技術を使えば良いのか?」
しかしイッQの返答は思っていたものと違っていた。
「え?お前の技術力じゃ枯れた技術なんて使いこなせないぞ。お前はトラブルが起きても便利な新しい技術を使ってろ」
唖然として壱人はその場で固まってしまった。では先ほどの話はなんだったのだろう、と思っていると、膝の上のピヤ號を腕置き代わりにして格闘ゲームでコンボを決めながら、画面から目線を外さずに会話を聞いていたマイナマイナが呟いた。
「単に、枯れた技術について話したかっただけデスデスね」
困惑する壱人を余所にイッQは話し続ける。
「プログラムにバグはつきものだ。だが、バグとは共存できない。見つけ次第、潰していけ。ストーリーの序盤で、慢心したボスキャラがひ弱な主人公を見逃すみたいに、これくらいならいいだろう、と放っておいたら、後で強大な敵になって襲いかかってくるぞ!」
「バグって襲いかかってくるものなのか?」
「襲いかかってくるんだよ!」
イッQは言い切った。
「だからできるだけバグを特定しやすく、修正しやすいプログラムを書く事が大切なんだ」
それでもまだ躊躇している壱人を、イッQは何とか心変わりさせようと言葉を続ける。
「それに今この作業をしなかったら、この後、分離するか一体化するか、何度も何度も葛藤する事になるぞ!その度にコードを分けたり、くっ付けたりする作業を繰り返して、もっと訳が分からなくなって作業が進まなくなるからな!」
このダメ押しの説得でも壱人は納得できず、結論は保留になった。しかしその夜、壱人は夢を見た。
小さなバグが足元を通り過ぎようとしている。その小さなバグは、想定していた値と違う値が入っているというものだったが、誤差の範囲内だったので見逃した。しかし気付くと、見る見る増殖してプログラムの隅々に侵食し、最後は巨大なバグになって襲いかかってきたのだ。
汗びっしょりで壱人は目を覚ました。昨日、イッQの言葉を聞いた時は、突拍子もない絵空事だと思ったが、バグはやはり襲いかかってくるものらしいと考えを改めるくらいの夢だった。