読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり、所属会社の見解ではありません。 GitHub: takahashikzn

個人のスキルを推測するには?


同業の方々の間で、この記事がちょっと話題になっているみたいです。
プログラマーの力量を見極める--面接官になったら尋ねるべき質問実例集


プログラマーの採用面接で、このような質問をすると技術力を推測することができるだろう、とのこと。

開発者であれば理解しておかなければいけないはずである。
基礎的な知識の有無を判定する質問の例として、以下のようなものを挙げることができる。

  • 「等値」と「等価」の違いを説明してください(この質問はTechRepublicのTony Patton氏に教えてもらったものである)。
  • 「値渡し」と「参照渡し」の違いは何ですか?オブジェクト指向システムや手続き型システムにおいて、これらにはどのような違いが存在するのかを説明してください。
  • ポリモーフィズム」とは何かを説明してください。
  • 「悲観的ロック」と「楽観的ロック」を比較し、違いを明確に述べてください。

ふーん、なるほど。

これらの質問のうち、最初の2つに答えられない応募者は、どう考えても「入門者レベル」ということになる。
また残り2つの質問は、「中級」開発者であれば答えられるはずである。

Σ(゚д゚) エッ!?

はい、回答させて頂きますです…

ふざけないでやってみた

「等値」と「等価」の違いを説明してください。

他の言語だと==をオーバーライドしていたりすることもあるので、誤解されないためにJavaとしておきますが、

a == b

a.equals(b) // (a != b) とする。

の違いのことですかね。

まあ要するに「正確に等しい→等値」ことと「正確には同じではないが、同じであるとみなす→等価」ことの違いということです。


「値渡し」と「参照渡し」の違いは何ですか?オブジェクト指向システムや手続き型システムにおいて、これらにはどのような違いが存在するのかを説明してください。

ここでいう「値渡し」「参照渡し」が関数への引数の渡しかたのことを指すとして、
ざっくりというと

  • 値渡し = スカラー値を渡す。1とかtrueとかそういうの。
  • 参照渡し = 「あるオブジェクトの在処」を指しているモノ。
    まあ要するにポインタ。(厳密には少々違うが)

でいいかな。


あと、ここでいう「システム」が処理系のことを指すとして

オブジェクト指向システムや手続き型システムにおいて、これらにはどのような違いが存在するのかを説明してください。

  • オブジェクト指向システム(Javaとか) = ポインタの直接操作は不可。参照としてのみ使用可。
  • 手続き型システム(Cとか) = ポインタの直接操作可能。

であることが多いと思います…でいいのか?


ポリモーフィズム」とは何かを説明してください。

オブジェクト指向における「継承」の概念を成す機能の一つ。


「親クラス」と「子クラス」があるとき、
「子クラス」は「親クラス」と同じ型の値であり、インタフェースも同一。ただし振る舞いを変えることができる。


したがって、クラスを使う側からすると、両者を特に区別なく使用することができる。


「悲観的ロック」と「楽観的ロック」を比較し、違いを明確に述べてください。

  • 悲観的ロック(Pessimistic Lock):レコードに排他ロックをかけて、他者がそのレコードを操作できないようにする。
    • ○ 確実にレコードを更新することが可能。
    • × システムの並列性は低下する。
    • × デッドロックに注意しなければならない。
  • 楽観的ロック(Optimistic Lock):現在のレコードの状態を記録しておく。そしてレコードの更新時に、
    最初の状態と比較して変更がなければそのまま更新。既に誰かが変更していればエラーとする。
    • ○ 排他ロックしないことから、システムの並列性は向上する。
    • ○ 排他ロックしないことから、デッドロックは起きない。
    • × レコードの更新に失敗する可能性がある。

感想


うーむ。とりあえず

「等値」と「等価」の違いを説明してください。
「値渡し」と「参照渡し」の違いは何ですか?

は本質的に同じ内容の質問ですね。「参照」を理解しているか否かを聞いているだけなので。

ポリモーフィズム」とは何かを説明してください。

これは、その人をOO言語を使わない案件にアサインするのなら、別に知らなくても支障はないかも。


ただ、いまどきOOすら知らないというのは、どんだけ勉強不足なんだ、
ということは置いておくとしても。


「悲観的ロック」と「楽観的ロック」を比較し、違いを明確に述べてください。

これは良い質問。


いまどき、なんだかんだ言ってもDBの知識が無いと、マトモにやっていけないご時世です。
ただ、その中でもDBのロックに敏感であるかどうか。は大事。


いまどきシングルユーザーのシステムなんてあまり無い(デスクトップアプリは除く)ですし、
並列実行されたシステムにおいて、常にデータが一貫した状態をキープするという観点で
物事を見られるかどうかは、とても大事なことだと思います。

僕だったら

僕だったら何を聞くかなぁ…


僕の場合、大抵では単に「人が足りないから開発メンバを入れる」ということになります。
だから、いわゆるスーパーハカーは求めていないので、

  • あなたは、数名のエンジニアチームの開発リーダーに着任しました。
    さて、最初に何をしますか?
  • あなたは、Buggyなシステムの保守担当に着任しました。ポイッと渡された資料にはソースしか入っておらず、その他には何も無いとのこと。
    さて、最初に何をしますか?
  • あなたが担当しているタスクのスケジュールが遅延しそうです。
    さて、どうしますか?

あたりを聞くかも。

これは、プロジェクトマネジメントのスキルについて聞くのが目的ではないです。
あえてこういう質問を投げかけることで、本当のスキルレベルとか経験値とか、
そのあたりが大体透けて見えてくると思うので。


あと、技術的なところでは

  • 一番好きなプログラミング言語は?理由も添えて。
  • 今までで一番スバラシイと思ったソフトウェアプロダクトは?理由も添えて。
  • 今、一番注目しているテクノロジーは?理由も添えて。

あたりを聞いておけば、その方の技術に対する考え方を窺い知ることができるかと思います。