« いまさら「f」とか「ヒ」のアイコンと格闘してみる | トップページ | 四捨五入関数がない環境下での対応 »

2014.02.16

Fizz Buzz問題で見るべきポイント

Fizz Buzz問題というのはネット界隈では非常に有名であり、今さら取り上げるのもどうかと思える。思えるのだが、社内の飲み会で話題を振ってみたところ、驚くぐらい知らない人が多くちょっと取り上げてみることにした。
ただし、単純にFizz Buzzの解説や俺様FizzBuzz回答をドヤ顔で書くのも気が引けるので、Fizz Buzz問題を回答させた場合の着目点・注意点について考え付くところを書いてみたい。
どちらかというと部下の能力を確認する、実際に採用を行うマネジャー側の視点でのFizzBuzzということで。

●そもそもFizzBuzzとは?
 「超有名」と書いてみたものの、中にはFizzBuzz自体ご存じない方もいるかと思うので簡単にどういうものかを書き出してみる。
『数人での遊びであり、1から順番に数字を告げ、3の倍数の時には"Fizz"、5の倍数の時には"Buzz"、3でも5でも割り切れるときには"Fizz Buzz"と言う。言いよどんだり間違えたらその人の負け』
というルールの遊びである。昔はやった世界のナベアツネタの元ネタといったところだ。

この遊びがIT界隈で有名になったのは、あまりにもコーディングができない自称プログラマが多すぎるので、面接時に簡単にアルゴリズム能力やコーディング能力を測ろう、ということから実際にアメリカの企業で使われたことが最初らしい。Wikipediaに書いてあるのはJeff Atwood氏が提起した、ということになっている。
Jeffさんの翻訳記事を見つけたので、それはこちらへ。Jeffさんの指摘はごもっともだけど、2分間とかちょっと厳しいかなあ、という印象はある。
また実際にFizzBuzz Questionsを提起したのはImran氏のようである[Using FizzBuzz to Find Developers who Grok Coding]。

●Fizz Buzzを解くことで見えてくること
 ではここからが本題。私が面接官だとして、設問は下記のように設定する。

1.先ほどのFizz Buzzゲームのルール説明
2.引数を与えて、その数字に達するまで標準出力にFizz Buzzの答えを出力する
3.使用する言語は自由
4.A4の白紙の紙を2枚配布。1枚を提出用とすること
5.制限時間は10分
6.インターネットへの接続は禁じる

その上でこの問題を解いてもらう際には次の点について注意してみる。


  1. 命題から適切なアルゴリズムを導き出せるか?
  2. プログラミング作業そのものの作業効率がどのくらいか?
  3. 限られた時間内であっても致命的な例外処理に対する配慮ができるか?
  4. 得意な言語は何か?
  5. 衆人環視の元で作業することへの耐性がどのくらいか?
上から順番に評価ポイントである。

1番は要件の理解能力そのものを問うている。これだけ明確な命題から、実装すべきロジックを導き出せることはプログラマとしては大変重要な資質であると考えている。
2番は思いついたアルゴリズムを形にする能力。結局手が速いというのはプログラムをする上では重要な美点だ。
3番については、そうはいってもメインロジックを書くことにしか頭が行かず、異常処理・例外処理というものが必要であることを、どのくらい意識しているかのチェックをする項目。実際に異常処理の作りこみに時間がかかりすぎてはいけないが、コメントなり異常処理のための分岐なりだけを書いているだけで安心感が持てる。ここがすっぽ抜けていると、1,2が優れていても仕事を任せるのは少し不安になる。
4番はおまけ。その人物がどういった技術バックボーンをもっているかを知ることは、どういった教育や実務をしてきたかを見ることができるので、今後の仕事をアサインする上で参考にしておきたい。ただあんまりにもマイナー言語をもってこられると、こちらが正当に評価できるのかが不安になってくるが・・・ その意味では言語については募集段階で当社が何を使うのかは打ち出しているはずなので、その中から選択してもらうほうがよいだろう。
PHP経験者を募集しているはずなのに、PASCALとかAdaでここを回答されると、ちょっと空気読めてない感のある子だなあ、とか思うだろう。
5番は不要な職場も多いと思うが、私の職場では客先でのインシデント対応をする機会が少なく無いので、そういったプレッシャーの下でも作業ができるのか、というのは仕事を続けていってもらう上で実は重要だったりする。

使い慣れたエディターなどを使ってもらわずに紙で書いてもらうのは、その人の論理的な思考の流れを見てみたいからの選択である。
フローチャートから書く人もいるだろうし、いきなりコーディングをする人もいるだろう。さくっと良いコードを一発で書く人はそれだけで評価できるが、フローなどをまとめてからコーディングをする人の方が、上流工程も任せられるかどうかという将来への参考になるかもしれない。
また、紙に書いてもらう以上机上デバッグしかできないので、ちゃんと動かないソースになってしまってもご愛嬌(;を忘れた、とか)。
ただし、変数の初期化とか関数化した場合のスコープのとり方とか、お作法は厳しく見ておきたい。
Jeffさんは2分で書けるはず、と言っているが、多少ちゃんとした処理を書いてもらうためにはもう少し時間があったほうがいいだろうと思って10分に設定した。
私自身はperlで挑戦してみたが、メインロジック記述には確かに2分でなんとかいけたが、異常処理とかちゃんと書いていくと10分でも危うかった(^^;

問題はFizzBuzzは有名な命題なので、知っているか知らないかで差が出てしまう可能性がある。そのためできればFizzBuzzクラスの難易度のオリジナル問題を持つことができると良いのだが……

|

« いまさら「f」とか「ヒ」のアイコンと格闘してみる | トップページ | 四捨五入関数がない環境下での対応 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2022/59104383

この記事へのトラックバック一覧です: Fizz Buzz問題で見るべきポイント:

« いまさら「f」とか「ヒ」のアイコンと格闘してみる | トップページ | 四捨五入関数がない環境下での対応 »