バグ検出ドリル(4)プログラミングの素質を試すのに最適!? FizzBuzz問題に挑戦山浦恒央の“くみこみ”な話(104)(1/3 ページ)

「バグ検出ドリル」の第4回で出題するのは、プログラミングの素質を試すのに最適といわれる伝説の「FizzBuzz問題」。問題文から、どこにバグがありそうか見つけ出してみよう!

» 2018年03月15日 10時00分 公開

1.はじめに

 ソフトウェアのバグの大半は、単純なミスです。バグに正面からぶつかった時は不可解な現象に当惑しますが、原因が分かれば「何でもっと早く気付かなかったのだろう」とガッカリします。

 そうならないため、日頃から「バグを嗅ぎ出す感覚」を鍛錬しましょう。本シリーズでは、ソフトウェア技術者の品質意識とバグへの反射神経の向上を目的に、バグをあらかじめ埋め込んだ問題を出題し読者の方に見つけてもらいます。今回も、問題文を読んで、どこにバグがありそうか推察してください。

 本コラムをきっかけに、より高いレベルのソフトウェアエンジニアとして活躍していただければと思います。

2.都市伝説、FizzBuzz問題

 今から10年前、お笑い芸人の「世界のナベアツ(現在は、落語家の桂三度として活動中)」が大ブレークしました。「世界のナベアツ」の大ヒットネタが「3の倍数と3が付く数字のときだけアホになります」で、記憶している読者も多いでしょう。当時、小学生の間で爆発的な人気になり、小学校の先生が、「算数の九九の時間に、みんながこのマネをして授業になりません」と困っていたのを覚えています。

子どもの遊び ※写真はイメージです

 この「3でアホになる」ネタの元と思われるのが「FizzBuzz」で、英国の子どもの遊びです。子どもが輪になって座り、1から順番に数字を声に出すのですが、3の倍数の時は数字ではなく「Fizz(擬音で、シャンパンの泡の音のようなシュワシュワ)」、5の倍数の時は「Buzz(これも擬音で、蜂の羽音のようなブンブン)」、3と5の両方の倍数の時は「FizzBuzz」と叫びます。つまり、1、2、シュワシュワ、4、ブンブン、シュワシュワ、7、8、シュワシュワ、ブンブン、11、シュワシュワ、13、14、シュワシュワブンブン、16……と続きます。

 この「FizzBuzz」は、英国の子どもだけでなく、世界のソフトウェア業界でも有名です。「世界のナベアツ」がブレークする前から、「これを出題してコーディングさせれば、プログラミングの素質がないプログラマーを99.5%の確率でフィルタリングできる」とのふれこみで「伝説的な問題」になっています。

 「99.5%」が、どこから計算した「自信」なのか根拠は不明ですが、そんなことは誰も気にしません(個人的には、「少しは気にしろよ」と思います。プログラミングに必要な思考回路と、科学的に一歩ずつ進める論理回路は違うのかもしれません)。また、「FizzBuzz問題」を論じる人が、枕ことばのように、「私は出題された経験はないが……」と断ってから自説を展開しているのも「都市伝説」じみています。

 この問題には信者が多く、「情報処理工学専攻の大学院生でも簡単にはコーディングできない」「FizzBuzzを難しく感じる背景には、二次方程式の解のような決まった解法がなく、自分でアルゴリズムを考えねばならないため」「プログラミングの素養があるエンジニアなら5分以内でコーディングできるはず」「これをプログラミングする時、if文で5の倍数かどうかを2回チェックしなければならないのが混乱の源」など、肯定的なコメントが花盛りです。また、これを最少行数でコーディングしたり、剰余演算子である「%」を使わないで実装したりなど、より制限の強い世界で技を競うエンジニアもいて、なかなかの人気問題です。

 ちなみに、筆者は、「直感では簡単に理解できるが、実装は面倒であることが人気の秘密」「有能なプログラマーとして、FizzBuzz問題を解くことは必要条件だが、十分条件ではない」と思うのですが、皆さまはどうお考えでしょうか?

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.