ソフトウェア開発者を採用する面接の場においては、応募者の専門家としての力量を見極めることが最も困難な作業の1つである。彼らの考え方については、面接時に少しやり取りを行えばそれなりに見当が付くだろう。しかし、実際のプログラミング経験を推し量るのは至難の業だ。一部の企業では、さまざまなテストを実施することでこれを行おうとするものの、筆者の経験から言えば、こういったテストは近代的な開発環境では必要性が薄い知識(IDEのオートコンプリート機能や、F1キーの押下で表示されるヘルプ、インターネットといったものがあるため、ライブラリの知識は以前ほど重要ではなくなっている)の丸暗記能力を試すだけに終わることも多い。そこで本記事では、開発者を評価するうえでの優れた質問を紹介するとともに、なぜそれらが優れているのかを説明している。あなたが技術的な質問に対する返答を判定する自信がないというのであれば、上級開発者にも同席してもらえばよい。本記事で紹介している質問は汎用性のあるものとなっているため、あなたのプロジェクトに関する特定の質問を行うに先立って候補者を絞り込むために使用できるはずだ。
コンピュータ科学に関する基礎的な質問
筆者は長い間、「プログラマー」を名乗る人であれば誰でも、コンピュータ科学に関する一定レベルの基礎知識を有しているものだと思っていた。しかし、そんなことはまったくない(!)ということが分かった。開発者であれば必ずコンピュータ科学の学位を持っているわけではないものの、開発者は皆、一定レベルの基礎的な知識を有していて然るべきである。こういった知識は日々のプログラミングで必ず必要となるわけではないものの、開発者であれば理解しておかなければいけないはずである。基礎的な知識の有無を判定する質問の例として、以下のようなものを挙げることができる。
- 「等値」と「等価」の違いを説明してください(この質問はTechRepublicのTony Patton氏に教えてもらったものである)。
- 「値渡し」と「参照渡し」の違いは何ですか?オブジェクト指向システムや手続き型システムにおいて、これらにはどのような違いが存在するのかを説明してください。
- 「ポリモーフィズム」とは何かを説明してください。
- 「悲観的ロック」と「楽観的ロック」を比較し、違いを明確に述べてください。
これらの質問のうち、最初の2つに答えられない応募者は、どう考えても「入門者レベル」ということになる。また残り2つの質問は、「中級」開発者であれば答えられるはずである。
思考問題
MicrosoftやGoogleといった企業が採用面接において応募者の問題解決能力を推し量るために行っている難しいテストがよく話題に上る。こういったテストはよく考えられており、有用であるものの、ほとんどのマネージャーや企業にとって、応募者にパズルを解かせる丸1日がかりのテストに時間を割く余裕などないというのが実情だろう。しかし、応募者がいかにうまく問題に立ち向かい、解決策を相手に伝えることができるのかを知っておくことは重要だ。筆者の経験から言うと、この種の質問の中で最も優れているのは「鶏の問題」である。筆者は約3年前の採用面接でこの質問を耳にした際、素晴らしい質問だと感心したものだ。具体的には、応募者に対して「自分の好きなようにできるとすれば、どのような鶏をデザインしますか?そしてその理由は何ですか?」と質問するわけである。この質問には「正しい答え」も「間違った答え」も存在しないものの、問題へのアプローチ方法を心得ている応募者であれば、詳しく回答できるはずである。また、応募者の中には「哲学者ぶって」(あるいはさらに悪い場合には非協力的な態度を示して)、「そもそも、鶏をデザインする必要が本当にあるのですか?」といった質問を返してくる者もいるだろう。こういった回答によって、仕事に対する彼らの姿勢をうかがい知ることもできるはずである。この質問は、上級開発者やソフトウェアアーキテクトの職を求めている人々に特に適している。もちろん、質問は鶏である必要はない。どのような動物でもよいし、何らかの機械であっても構わない。