FizzとBuzzと色々な「知識」
私よりずっと成績のいい学生がたくさんいましたのに何で私が選ばれましたか。
と僕が委託されている会社の新入りインターンが不安たっぷりの声で歓迎会の参加している方皆に聞いた。
僕の立場では答える権利はなかったけど答えがわかった。所員さんのマネージャが口を開けた瞬間に何を言うか想像ができた。
「選ぶときに成績より大事なポイントがいっぱいあるから。」
というより、学生時代が終わったら僕は成績のことほとんど気にしなかった、自分のも、他人のも。学歴全体見ても、それだけで相手は「できる」か「できない」か判断するのは無理ほど難しい。
それだったら、どうやってどうやって人の知識や才能を測れるのか。僕は今回のブログ担当のベーカーで今回の記事にこの問題と最近はやっている解決について書かせていただきたいと思う。
「紙知識」
僕はなぜ委託先のマネージャーさんが言うことが分かったかというと、それは僕のお父さんが言いそうなセリフだから。
お父さんは大学に行けなかった。16歳で義務教育が終わったらすぐお金を稼ぐために就職しないといけなくて、徒弟制度システムに入った。それにしても、お父さんがエンジニアになって、最後は自分の担当範囲で世界中一番詳しくてできる人で結構有名になったのは息子の僕の少し自慢だった。
お父さんはいつも「Paper-knowledge」という単語を使った。「試験の合格証明書は試験を合格できるしか何も証明しない」みたいなセリフが多かった。どれだけ上手く説明してもらっても、それは「聞いた話」みたいなことだけだ。実際にやってみて、失敗の苦しみと成功の喜びを重ねて得た知識はいつも本で読んで覚えた知識に勝つとお父さんは信じていた。
大学卒業できた人に羨ましいじゃないかと当時僕は思った。きっとそれも少しそうだったが、時間が立つと今いないお父さんが何を言おうとしていたかがわっかってきた。日本に来て、初めてTOEIC900点以上取ったのにほとんど英語話せない方と出会ったら納得できた。
完璧な試験はあり得ない、いつも何かの裏技かずる技がある。なくても、試験当日まで内容を丸暗記しとけば、5分後に全部忘れちゃっても合格証は残る。もしプロが時間をかけて作ったちゃんとした試験は必ずいつも人の知識と才能を評価できたら交通事項がこんなに多くないはずじゃないか。
これはテストがダメで使わないでとは言ってない。僕は依然教育コースを実施したときに筆記テストなどを使っていた。合格は「できる」の証拠にならなくても、不合格はどう見ても「できる」と自信をもって言えなかった。筆記テストで色々情報を得ることができる(例えば何回も同じミスする受けた人は間違った思い込みがあるかもしれないとか落ちている人数が多すぎたらコース実態の方に問題があると思える)。テスト結果も見た方がいいだけど、そればかりに注目するべきじゃないとは言いたい。
プログラミングの場合
さらにプログラミング・IT系の仕事はこれともう一つの問題もある。
大学の情報学部は論理的な教育に得意が実際に世の中に使える技や知識にたまに足りないところがある、教えている方が結構卒業したらすぐに教員になって、「外の世界」の経験が限られている。(工学部も似ていると聞いたことがあるけど、僕は情報学部だからこちらの方が詳しい。)
コンピューターについての深い論理的な話ができるのはいいことだが、卒業後の職場に生かせるスキルの代わりにならない。逆にその論理と現実がぶつかるとき。
この前、今回のインターンに合う前、僕はある大学の大学院性と話していた。かれは教えてもらった断言は「プログラムとは終了するアルゴリズムである」。だから終わらない可能性なるプログラムはよくないに決まっている。だから教授に教わったことはwhileループは無限ループがあり得るから使ってはいけない(その代わりにforにでっかい数字を使うfor(i=1; i<2^32; i++)みたいに)。僕が心から叫びたかったが、こう答えた:「着陸完了して、止まっても、エンジンが遮断されない飛行機か飛んでいる最中に時間切れでエンジンが遮断される飛行機、どっちの方が乗りたい?」。
ゲームで解決
10年以上前にイムランというイギリスのソフトウェア開発者が入社希望の新卒者を面接することでこれが分かった:「少し試行錯誤したら私が気づいたのは、コーディングに苦戦する人は大きな問題だけじゃなくて、小さめの問題もごくちっぽけな問題も苦しむ。」彼がこのためにいいチャレンジを考えた、「FizzBuzz questions」。(Using FizzBuzz to Find Developers who Grok Coding | Imran On Tech 【英語】)
「フィズ・バズ」はイギリスの小学校での有名なゲーム、皆が一人一人数字を順番に大声で言う。但し、それは3で割る数字だったら代わりに「Fizz」をいう、5で割る数字は「Buzz」で両方の場合は「FizzBuzz」。一瞬でもたまらうとアウト!
フィズ・バズは頭で掛け算する練習ゲームだったが、イムラン氏はコーディングの練習にも使えると気づいた。これが「ごくちっぽけな問題」になる:「Fizz」と「Buzz」と「FizzBuzz」を入れながら1~100の数字をアウトプットするプログラムを書く。
テストしたいのはできるかどうかだけじゃない(しかし、それも確かに重要)、解け方がたくさんあるから(例を見た方はイムランのブログのコメントかこのサイトを見るといい:FizzBuzz - Rosetta Code 【英語】)相手がどうやってやるかによっても色々が分かる。「取り敢えずやっちゃう」Vs「ゆっくり計画を立ててからやる」。「コンパクトに書く」Vs「修正しやすく書く」。「コメントこまめ」Vs「記述的な変数名」。皆さんはどうやって書くか?
ちなみに、僕の場合はこのよう(VBAマクロで書いている人がネットで見つからなかったからそれで書いてみた):
Const listLength As Integer = 4 Public Function Fizzbuzz(inNumber As Long) As String Dim nameList(1 To listLength) As String 'Typeを使ったらより Dim numberList(1 To listLength) As Integer '読みやすいがこの一ヶ所 'しか使わないから勿体ない numberList(1) = 3: nameList(1) = "Fizz" '後で変えたり増やしたり numberList(2) = 5: nameList(2) = "Buzz" '簡単にできる Fizzbuzz = "" 'VBAにいらないかもけど、僕の癖で For i = 1 To listLength 'FizzやBuzz以外にも対応 If Len(nameList(i)) > 0 Or numberList(i) > 0 Then If inNumber Mod numberList(i) = 0 Then Fizzbuzz = Fizzbuzz + nameList(i) '「+=」は使いたいのに… 'nameListの順番変えたら「BuzzFizz」もできる End If Else Exit For '簡単なエラーチェック(未設定なら) End If Next If Fizzbuzz = "" Then Fizzbuzz = Str(inNumber) '最後にFizzでもBuzzでもない End If '場合は数字のままで返す End Function
ちょっと長いけど、子供でゲームをやったころを思い出すと「Fizz」と「Buzz」以外にも様々な単語やバリエーションがあって、それも入れたくなった。