2010年11月29日月曜日

Fizz-Buzz問題が解けないプログラマ?

「簡単なプログラムが出来ないプログラマ」が今回の話のテーマです。

どうしてプログラマに・・・プログラムが書けないのか?
私と同様、この著者は、プログラミングの仕事への応募者200人中199人はコードがまったく書けないということで苦労している。繰り返すが、彼らはどんなコードも書けないのだ

リンク先の記事自体は2007年に翻訳投稿されたもので少々古いですが、当時話題になったようですし、興味深い内容が多く含まれていましたので、当ブログでも触れたいと思います。



私も何度かIT企業の新人研修を担当したことがありますが、意外と文系でプログラム経験全く無しでプログラマ・SEとして入社する人はかなり多いです。ですから、「プログラミングの仕事への応募者の大半がコードが書けない」というのはそれ程驚きません。

もっとも、中途採用の即戦力が要求される求人であったら「全くコードが書けない」では話にならないのは言うまでもありません。

かなりの試行錯誤の末に、コードを書こうともがいている人たちというのは、単に大きな問題に対して苦労しているのではないことがわかった。やや小さな問題(連結リストを実装するというような)に対して苦労するということでさえない。彼らはまったくちっぽけな問題に苦労しているのだ

「プログラミングの知識を有する人」という条件付の応募の話ですかね?で、そのプログラミングを勉強しているはずの応募者たちのレベルが全くお話にならない、ということらしいです。実際にFizz-Buzz問題という簡単な問題を解かせてみたようです。

Fizz-Buzz問題の例
1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合に「FizzBuzz」とプリントすること。

プログラミング言語入門本の最初の方のページに出てきそうな問題ですね。C言語でしたら、if文などを使ってprintfで指定の数や文字を表示するだけの簡単な問題です。

ちゃんとしたプログラマであれば、これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。怖い事実を聞きたい?  コンピュータサイエンス学科卒業生の過半数にはそれができないのだ。自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある

これは10分だったら9割が解けるとか、そういうタイムアタック的な話じゃないでしょうね?もしそうなら、これはかなりくだらんエントリーということになってしまうが・・・。10-15分っていうのも、単に洗練された方法を考えてただけとかね。

文脈から判断して、「プログラミングの教養を受けてきたはずの人達が、実は基本的なことも理解できてない」と解釈して話を進めていきます。

応募者の驚くほどの割合の人たちが、コンピュータサイエンスのマスターやPhDの学位を持っている人たちでさえ、面接で基本的なプログラミングのタスクをやらせたときにうまくできないでいる。たとえば 「1から10まで数えるループを書け」とか、「16進数でFの次の数は何か?」といった質問に答えられない大卒者を私は面接したことがある。

そんな馬鹿な・・・と言いたくなる話ですが、類似事例に心当たりがあるため、まるっきりウソとも思えません。私は学生時代に経済学を学んでいましたが、経済概論もまともに理解出来てない状態で卒業しちゃった人を何名か知ってます。IS-LM曲線?何それ?みたいな。

コンピュータサイエンスと一口で言っても範囲は広いですからプログラミングに疎い人がいる可能性もありますが、ここでの問題は「そんくらい知っとけ」というレベルの内容を学ばないで卒業した者が少なからずいる、ということでしょうかね。

採用候補者の面接をしなければならないソフトウェアエンジニアを代表して言わせてもらうと、我々はプログラムが書けない候補者と話をするのにうんざりしている。履歴書に載っている言語のそれぞれで1から10まで数えるループを書けて、電卓なして単純な算術ができ、実際的な問題を解くのに再帰が使えるのであれば、その時点であなたはすでに集団から抜け出していることになるのだ!

そんな馬鹿な!と言いたくなりますが、実はこれも類似する例に心当たりがあります。「Javaできます」と履歴書に書いて実際に雇ったら全然Java使えなくて、結局営業にまわされた・・・という知人に心当たりが。

そんなのはごく一部だけだと信じたいところです。

私はキャリアを始めたばかりのソフトウェア開発者たちを喜んで相手するつもりだ。誰だってどこかで始めなければならないのだ。しかし職に応募してくるプログラマと名乗る人間が最も簡単なプログラムさえ書けないという事実には驚き、困惑している。

プログラマを名乗って書けない・・・というのは話にならないですね。経験的に、「経済学部卒業=経済概論を理解」なんて私は信じませんが、理系の人達どうなんでしょう?情報系の学部卒業しているならプログラムの基礎は理解しているはずと考えてよいのでしょうか?

ちなみに、企業の立場からすると「プログラムの基礎」を理解できているか否かでコストが変わってきます。基礎が理解できていない状態でOJTでは効果が期待できませんので、やはり研修が必要になります。その研修も、不適切な計画で不適切な講師が担当すると無駄になってしまうというリスクをはらんでいます。

そのため企業としてはプログラムの基礎を理解しているものを雇いたいと考えるのは当然です。ただし、Fizz-Buzz問題だと本当に大雑把にしかふるい分けられないので、普通に筆記試験でよいと思います。


日本だと、大学卒業した後に技術身に付けるため専門学校に入るという現象が起きていますが、これも大学が社会のニーズを満たしていない証拠かもしれないですね。専門学校もそれはそれで問題を抱えているんですけども。

現在では新人育成に力を入れる余力のある企業はホント一部でしょうね。過酷なようですけど、新入社員と言えどもある程度の戦力が求められる時代です。

そんな中、専門学校や企業研修の重要さは増すはずなのですが・・・。
この話はまた別の機会に。