「バグ検出ドリル」の第3回で出題するのは、前回に引き続き数学に関係する問題。理系とはいえ必ずしも数学が得意ではないプログラマーですが、やはり数学を知るメリットは絶大。これまでと比べてかなり歯ごたえ十分な問題を用意したので、じっくり取り組んで数学に対する免疫力をつけてみよう!
本シリーズはバグ検出力向上を目的とし、筆者がバグ入りの問題を出題し読者の皆さんに解いてもらいます。本コラムが、より高いレベルのプログラマーを目指すきっかけになれば幸いです。
前回は、数学に関連するバグ入りの問題を作成しました。今回は、その続きで、少し歯ごたえがあります。
前回にも書いた通り、プログラマーは純粋な理系ですが、数学嫌いがたくさんいます。数式は苦手だけれど、論理的に考えることや※1)、ヒラメキを具体的な形にすることが大好きな人がプログラマーを目指します。それ故、パズル好きの文系人間もソフトウェア開発に吸い寄せられます。論理的に考えることができ、しかも数学に強いソフトウェア技術者は、「翼を得たライオン」。プロジェクトの中核的存在になります。
プログラマーが数学を知るメリットとして、以下の2つがあります。
航空機の制御、ロボットの制御、機械学習のアルゴリズムでは、行列演算式が非常に多く出てきます。演算式の意味を理解することなく、淡々と数式通りにプログラミングすればソフトウェアは開発できますが、数学を理解していると、演算式の意味が分かるため、仕様に記述したアルゴリズムが理解できます。また、細かいバグも指摘できるでしょう。数学を知るメリットは絶大です。
将来、地下鉄の速度制御を担当するかもしれません。その時のために、少しだけ歯を食いしばって、数学に対する免疫力をつけましょう。このコラムの問題をパズルと思って、気軽に挑戦してみてください。
※1)筆者だけかもしれませんが、論理的思考が必要な「数独」や「ナンプレ」に興味がありません。なぜか? 解くだけなら、PCを使い、各マスに全ての数字を入れる「全件チェック」で力任せに解けるし、人力で解くなら、その解の他に答えがないか、あるなら全てを見つけないとダメと考えるからです。全件チェックはエレガントではないし、他の答えを見つけるのは超面倒。かくして、数独やナンプレに近寄らず、「食わず嫌い」になりました。私が好きなパズルは、例えば、「2階に電球が1つある。電球が見えない地下室にスイッチが3つあり、どれか1つで電球を点滅できる。電球を見に行けるのは1回だけとしたら、どのようにすれば電球のスイッチが分かるか?」です。「鏡で何回か反射させて見る」「夜まで待つ」とか、ひっかけではなく、「なるほどねぇ」と思う解法を求めます。
今回は、少し長いプログラムを1問出題します。どこにバグが潜んでいるか探してください。プログラムは「Visual Studio 2010」のコンソールアプリケーションで作成していますので、実際に動かして、デバッグをしながら解いても構いません。
前回同様、プログラムの実行結果が正しくありません。問題文の情報から、何が原因でうまくいかないか推察してください。なお、コードの可読性や実行速度は考えないこととします。
今回の問題文のプログラムはコメントを含み130行で、平均的な1モジュールの大きさです。このソースコードを見た瞬間、即死する人もいるでしょうが、この程度で死んでいては命が10M個あっても足りません。他人の作ったプログラムをじっくり読む練習をしましょう。持久力を鍛えましょう。少なくとも7分はめげずに取り組んでもらえればと思います※2)。
※2)皆さんは、新聞や雑誌をどのくらいの速度で読みますか。筆者の場合をざっくり計算すると、執筆時間の2%でしょうか。本コラムを書くのに6時間かかっており、その2%の時間で読むと7分強になります。日々発信される大量の情報の中から、7分間も記事に目を通すことはまれで、大半は数秒で読み飛ばすでしょう。よって、本コラムを7分かけて取り組んでもらえれば、筆者や編集者のモチベーションが大いに上がります。
Copyright © ITmedia, Inc. All Rights Reserved.