私が受けた中で最高の技術面接の質問
(quuxplusone.github.io)- MemSQL(現在の SingleStore)で2013年に出された、DB関連のプログラミング課題
→ 「キーバリューストアである Memcached に、incr/decrに似た形でmultコマンドを追加してください。1時間差し上げます。」 - この質問は候補者を3つのタイプにきれいに分けるので、優れた技術面接の問題になっている
- タイプ0:実際にコードを触らなければならないことに驚く人たち。実際にはここまで来られないだろうが、採用すべきではない
→ 当時の MemSQL は C++11 で開発されていたため、C で書かれた Memcached を触ることは目的に非常によく合っていた。 - タイプ1:問題を見て「掛け算は足し算の繰り返しだから、既存のものを繰り返せばよさそう! でもロックを処理しないと…」と言う人たち
→ かなり迷走したあげく、動くコードを作れずに失敗。やはり採用されない - タイプ2:「掛け算は、足し算が
+をしている箇所で*をすればいいだけで、それ以外は同じだ」と言って、Copy&Paste して+を*に変えるのを素早くやってしまう人たち
→ このグループにいる人は採用される可能性が非常に高い - 最高の候補者たちは……時間がかなり余るので、成果物を整え、フォーマットに一貫性があるか確認し、ユニットテストも追加し、「設計上の判断」も見直したりできる
- タイプ0:実際にコードを触らなければならないことに驚く人たち。実際にはここまで来られないだろうが、採用すべきではない
結論
- このプログラミング課題が好きな理由は、実際のプログラミングの縮図だから
- 大規模なコードベースを保守するときには、完全には理解できていないコードや不要なイディオムなどがどうしても存在する
- この問題は「
bool incrをint opcodeに変える」という答えが1つだけあるため、面接にぴったり合っている - 現在は2つの算術演算コマンド(
incr/decr)があり、これを3つのコマンドに拡張するもの - この課題は、不適格な候補者をふるい落とし、適格な候補者を望ましい道へ導くようにうまく設計された問題だ
3件のコメント
該当するコードをいかに素早く見つけられるかが、重要な見どころになりそうですね。
プログラムをゼロから書き直すのではなく、既存のコード(しかも、すでによく知られ、広く使われているオープンソースプロジェクト)に機能を追加する形である点で、より良いと思います。
HNでもやっぱり……元のインタビュー質問を出した本人が登場してAMAをやっていますね。
https://news.ycombinator.com/item?id=31065143