FizzBuzzを入社試験に出したらどこを見るか

宗教戦争の恐れが多分にあるけど僕だったらどのあたりを注目するかというのを書いてみようとおもいます。基本的にはJavaでの実装の話です。
ソースはregtan/fizzbuzz - GitHub

ターゲットとしてる人物像などなど

中途採用や派遣業者からの紹介でJavaの経験があると言われている人を対象にしていて、プロジェクト内での実装を担当してもらえるような人物を求めています。回答の形式としては、その場で出題しエディタあるいはIDEを使って書いてもらう感じです。

FizzBuzzについて

if文とfor文と除算処理さえわかればできる処理なので基本に忠実に書けば問題なく実装できる処理です。処理の仕様としては、1〜100までの数字を順に、3の倍数の時はFizz、5の倍数の時はBuzz、3の倍数かつ5の倍数の時はFizzBuzz、それ以外の場合はその数字を標準出力に表示するという感じです。詳しくはおググりになってください。

ダメな例

まずダメな例はループカウンタ+1を評価したり、出力しているものです。
https://github.com/regtan/fizzbuzz/blob/master/src/org/kirino/normal/BadSample1.java

結果としては正しく表示されます。ループカウンタの開始の数字は別に0でなくてもいいしループ条件もループカウンタ<100でないといけないわけではありません。そこを直さずにループ内で補正しています。ループカウンタの数字を利用するのであればその数字を計算せずにそのままつかうのが良いように考えます。また、if文で評価するたびに+1するくらいであればそのような変数を持てばよいのでは?と考えます。

次に、if文の中での評価順を間違えているものです。
https://github.com/regtan/fizzbuzz/blob/master/src/org/kirino/normal/BadSample2.java

これは仕様を満たしていません。動かしてみるとすべての数字がそのまま出力されてしまいます。if文の評価式に問題があります。

if (i+1 % 3 == 0){
    System.out.println("Fizz");
}

ここの評価式ですが、1%3の部分がまず計算されるので1、次にi+1が計算されてから0と等しいかどうかを判定します。そのため、一番下のelseに入って数字がそのまま表示されるということが発生します。これは上で上げた例を目指して実装しようとして失敗している例です。直したところで上のような状態になるのではもうちょっと頑張りましょうというところです。

最後に細かい点ですがついでに変数名が大文字になってないか確認します。たまに大文字で変数書かれる方がおられます。Javaの経験があればこういう書き方はしないだろうなぁって程度に見るくらいです。あと、while(true)でループしてループカウンタが100の時breakするような処理をしていたらなんで?って突っ込み入れます。*1

ここまでできればOKな例

すなおに実装しているパターンであればOKです。
https://github.com/regtan/fizzbuzz/blob/master/src/org/kirino/normal/BasicSample.java

if(i % 3 == 0 & i % 5 == 0)

上の部分は3と5が互いに素であることから15で割った余りという判定でも良いでしょう。おとなしくループカウンタも1から100まで回るようになっていれば良いかと思います。ここでループ条件がループカウンタ<101であっても別にいいですが、その場で101にした説明を求めるかと思います。

判断が難しい例

golf的に短く書こうとしている場合です。
https://github.com/regtan/fizzbuzz/blob/master/src/org/kirino/normal/Sample.java
そのほか、セミコロンレスJavaとかJava 30byte FizzBuzz - プログラマーの脳みそを回答した場合も同様に判断に困ります。
これらの内容をコピペ的に覚えているだけの場合があるからです。その場合はそのコードに対してなぜそう書いたかを説明できるかどうかというところです。まったくもって説明できないのであれば問題ありと判断せざるを得ません。

もうひとつの出題方法

if文の中での評価順を間違えているものを正しく動くように直してもらうという出題形式もいいかもしれません。
https://github.com/regtan/fizzbuzz/blob/master/src/org/kirino/normal/BadSample2.java

まとめ

これがまったくできないから絶対採らないというわけでもありません。これで手も足も出ずにフリーズされるとちょっと不安になります。派遣さんで実装担当と紹介していただいた場合だと特に。現実としてすべての会社さんがそうではないのですが残念ながら下駄を履かせて紹介されることもあります。新卒やそうでない人たちであれば、これから学んでいこうという姿勢があれば別にできなくてもいいかなとも思ってます。

*1:forの使い方がわからないかもしれないから