IT技術者を騙る詐欺師の嘘を見破るたった3つの質問

最近読んだ記事で、人材派遣会社が「高給な仕事がありますよ」と人を集め、IT技術者のフリをするノウハウを伝授し、IT技術者募集に応募させていた、というのがありました。

IT技術者の採用というのは、応募者側の技術経歴書をもとにシンプルな形で行われます。雇う側が応募者に試験を受けさせたり、経歴が事実かどうか調査したりはしません。
(* 誤解を招く表現がありましたので訂正しました。@error_401さん、ご指摘ありがとうございました)

応募者は正直に自分のスキルを申告するはずという、お互いの善意に基づいた、金と時間をかけない、とてもシンプルな形で行われるんです。

その善意につけこみ、経歴書をでっち上げて、嘘八百を並べたて、開発現場に潜り込もう、いったん潜り込んでしまえばこっちのものだ。そういう詐欺師のような人材派遣業者が出てきたわけです。

雇う側は、万が一、そういう輩が現場に潜り込んできた時のことを考慮し、最初の契約は1ヶ月、その間に期待した技術を持っていないことが判明すれば、その後の契約の更新はしない、というような防衛策を取らざるを得ないでしょう。

詐欺師はたとえ1ヶ月分でも報酬が手に入ればしめたもの、なのでしょうが、雇う側としては、詐欺師なんかに報酬を持っていかれるのは悔しいですよね。

そんな回りくどいことをせずに、その自称技術者がスキルを偽っていないか、たちどころにわかるような方法はないものでしょうか。

そこで思い出したのが、40年くらい前の「ブレードランナー」という映画で、脱走して人間の中に紛れ込んだレプリカントに、捜査官がいくつか質問をすると、人間かレプリカントか分かるというシーン。レプリカントというのは人間に似せて精巧に作られたロボットですが、ウソの記憶を埋め込まれたニセ人間ですから、質問を工夫すれば、人間なら絶対にしないような答えを引き出すことができるわけです。

というわけで、開発現場のレプリカント野郎を見分けるための質問を考えてみました。

こんな案件があったとします。
ある電機メーカーの、既存の製品用にC言語で作られたプログラムがあります。これを新製品用にC#言語でアップデートするプロジェクトの設計工程から参画していただきます。言語の種類は問いませんが、開発現場で3年以上の経験のある方を希望します。優秀な方は、その後の製造工程、テスト工程、さらに次期製品のプロジェクトへの参画をお願いします。

どうです？　長期の就業が見込める、詐欺師が涎を垂らして喜びそうなおいしい案件ですよね？

詐欺師を間違って採用しないために、応募者には次のような問題を解いてもらいます。

# 問題
先輩プログラマーのAさんと、新人プログラマーのBくんが夜遅くまで残業をしています。リリース時期が迫っているのに、彼らの担当部分のプログラムが応答しなくなってしまったのです。2人とも難しい顔をして画面を見ていましたが、突然Aさんが画面に表示されたコードを指差して笑い出しました。Aさんの説明を聞いて、Bくんも笑い出しました。

以下、2人が見ていたコードです。

```cpp
int loop_counter = 100; // ループ回数の定義
int temp = 0;           // 結果を一時的に格納する変数
bool ret = true;        // 判定結果

while(loop_counter > 0)
{
  temp += global_data_get();
  // 2022.06.18 〇〇〇から受領した関数がうまく動作しないため、
  // 今回のリリースには含めない
  //ret = statistical_judgement(temp);
  //
  // 統計的判断が否なら終了
  //
  if (ret == false)
  {
    break;
  }
  // カウンター更新
  loop_counter = loop_counter + 1;
}
```

# 質問1
2人はなぜ残業していたのでしょうか？

# 質問2
Aさんが指差したのはコードのどの部分だと思いますか？

# 質問3
2人はなぜ笑ったのでしょうか？

# 質問1の答え
「プログラムがうまく動かないから」という答えでは不十分です。「2人はプログラムのこの部分の担当者で、これを正しく動作させる責任があるから」が正しい答えです。開発現場を知らない素人にはこの責任感が理解できません。

# 質問2の答え
開発現場の経験のある技術者なら、もっともらしいコメントに惑わされることなく、たとえC言語が得意でなくても、不具合箇所を指摘できるでしょう。1文字の違いが大変な事態を招くこともある技術の世界を知らない素人には、このことの重大さは理解できません。

# 質問3の答え
夜遅くまで残業をした原因が、単純なミスによるバグだと分かったからです。謎を解いたぞ、という喜びと安心感があったのでしょうね。開発経験のない素人にはこの喜びが理解できません。

以上、開発現場ではありそうな光景ですが、現場の経験のない素人には答えられない質問ばかりだと思います。

上流工程や、テスト工程を担う技術者の中には、プログラミングの経験がない人がたくさんいます。誤解されると困るのですが、コードが書けない技術者はダメ、などと言っているのではありません。コードが書けなくても、価値のある仕事が出来る技術者を何人も知っています。

ただ、技術者の中には、ソースコードのコメント部分を読んで、プログラムを理解しているかのような「ふり」しているような輩がいるのも事実です。コメントがプログラムを表現できていないことは、上の例のようによくあることなんです。

上の人から評価されたい、とか、同列の技術者のマウントを取りたいとか、そういう欲望がそうさせるのでしょう。哀れではありますが、同情の余地はありません。

議論に負けたくないからと、ウソを持ち出して、たとえその場は気分よく相手を負かした気になっていても、ウソをついたということのツケは、必ず自分に戻ってきます。

技術者にとっては「正直」が最善の戦略です。分かっているような「ふり」はいけません。
ひとつのウソが、プロジェクトを大混乱に陥れることがあるからです。そういう人たちの存在が詐欺師に「こいつがプロだというなら、オレにも簡単に出来そう」というモチベーションを与えてしまっているのではないでしょうか。

ソフトウェア作りには、ものを作る楽しさと、作ったものが思った通りに動いた時の喜びがあります。プログラムを使った人に喜んでもらえれば、喜びも増すでしょう。

そういう楽しさと喜びをもっともっと感じたい。
そのために場数を踏んでいった結果、スキルが積み上がっていくのであって、ただ稼ぎ続けるために、スキルを偽り、分かったようなフリをしながら、現場にしがみついていくことに、いったいどんな価値があるのでしょう？

そんな人たちが現場に居座り続けるこの状況を、何かしらの方策を立てて改善していかない限り、日本のIT業界は、世界のレベルから取り残されていく一方なのではないでしょうか。

*余談
「ブレードランナー」は1982年の映画ですが、時代設定が2019年なんですね。空飛ぶ自動車や、人造人間を素晴らしい想像力で作り出した制作者たちも、コンピューターのモニターが、40年後にはとても薄くてフラットになるとは想像できなかったのでしょうか。現実は人間の想像力を超えて進んでいくものなんですね。
追記:
特異な人たちの奇跡的な仕事によって、人類の進化は成し遂げられていくんですよね。ジョブズとアイブがいなかったら、彼らの出会いがなかったら、私たちは手のひらサイズのスマートなコンピューターではなく、ごてごてしたボタンがついたガラケーの進化版みたいなものをいまだに使っているかもしれません。

*余談2
1982年当時、ライジング・サンと呼ばれ、その成長のピークに迫りつつあった日本経済を反映して、この映画には、日本の文化への憧れがあちこちに散りばめられています。世界中が神秘の国の成功を羨んでいた、かつてそんな時代があったんです。アメリカは将来、日本に乗っ取られるんじゃないだろうか。制作者の中に、そんなふうに考える人がいたとしても不思議ではありません。現実はそんなことにはならず、40年後の日本は、かつての成功の上に胡座をかき続けた結果、ジリ貧で息も絶え絶え、というのが現実です。現実は人間の想像力を超えて進んでいくものなんですね。

*余談3
レプリカントが人間の中で暮らしているうちに、愛や信頼、死への恐怖など、人間と変わらぬ感情を身につけていったとすれば、もはや人間と何が違うというのか？　というのが「ブレードランナー」のテーマのひとつだったと思います。それと同じで、業界入りのきっかけが詐欺じみたものだったとしても、その後プログラミングの面白さに目覚め、勉強し、プロジェクトに貢献するなら、あたりまえのことですけど、誰もその人のことを詐欺師などとは呼ばないでしょう。

*余談4
@raidofuwaさん。期待していたブレードランナーネタのコメントやっとです。ありがとうございます。楽しく読ませていただきました。なんかカリカリしたコメントばかりで、映画の冒頭の「砂漠でカメをひっくり返した」云々の質問をしたらレプリカントが怒り出したシーンを思い出していました。

*余談5
なぜウソをついてはいけないか、についての卓越した見解。
https://hakutai.info/2020/12/13/communication-01/
これを開発現場に当てはめて考えると、ウソをつく人が他の技術者を尊重しない理由が分かります。他の技術者もウソをついているに違いない、と思っているからです。

*後日談1
質問の出来事があった翌朝、AさんとBくんが話しているところへマネージャーのCさんがやってきました。
「昨日遅かったんだって？」
「すみません。不具合がみつかりまして」Aさんが申し訳なさそうに謝ります。
「その部分のソースを見せてくれる？」Cマネージャーが言います。Cマネージャーは「昔は俺もゴリゴリのプログラマーだったんだがね」が口癖の人です。Bくんはそれを聞くたびに、うさんくさいな、と思います。昔ゴリゴリにプログラミングしていたのなら、なぜ今はしないんだろう？　自転車の乗り方を覚えたら、一生忘れないよね？　競輪の選手じゃあるまいし、年取ったらそれなりの走りでいいんだからさ、なんで？　っていうか、昔ゴリゴリの選手だったのなら、年取ってもそれなりの走りができるんじゃないの？　 Bくんは不思議に思うのでした。

Aさんがその部分のソースを画面に出して説明します。Aさんの説明を受け、画面を見つめていたCマネージャーが「お！」と大発見をしたかのような大きな声をあげました。画面を指差し「これって放っておいてもひっくりけえっちゃうだろ。直さなくてもよかったのに」と言いました。得意顔です。
「ひっくりけえる？」Bくんは首を傾げました。
「あ！なるほど。オーバーフローして負の数になるから、放っておいてもループから抜けちゃいますね、これ。さすがです、Cマネージャー！　経験に基づいたアドバイス、いつも助かってます！　あざっす。あざーっす！」Aさんが立ち上がって、ほとんど叫ぶようにCマネージャーに感謝します。BくんはそういうAさんを見ながら、いい人だし、技術者としても最高なんだけど、上の人に媚びる時のAさんはちょっと痛いな、と思うのでした。

Cマネージャーが去った後、BくんはAさんに訊ねました。
「ひっくりけえる、ってどういことですか？」
「符号付きの整数ってさ、正の最大値に1足すと、負の最小値になるんだよ」
「げっ、そんなこと知りませんでした」
「このシステムのintは32bitだよね。32bitの符号付き整数の最大値はいくつか、googleさんに訊いてみて」
「2,147,483,647って言ってます」
「global_data_get()の性能試験やったときの結果を憶えてる？」
「ベストケースで１マイクロ秒、ワーストケースで200マイクロ秒くらいでしたね」
「じゃあ、このループの1回にかかる時間が１マイクロ秒から200マイクロ秒と考えよう。まあ、whileとかifの判定ってそれなりの時間を食うんだけどさ、ここでは無視することにして、このループを抜けるのにどれくらい時間がかかるか計算してみよう。ざっくりでいいよ。」
「えーっと、2,147,483,647からループの初期値の100を引いて、その数かけるループ1回分の処理時間ですよね？　えーっと、ベストケースで35、6分です。ワーストだと119時間くらいっすね」
「お客さんにさあ、だいたい35分から119時間で応答しますんで、いいすか？　とか言える？」
「あはははははははは。言えないっす」
「Cマネージャーがプログラマーだった頃って、intが16bitだったんだよな。16bitの符号付き整数の最大値で計算してみようか」
「32,768ですよね。えーっと、ベストケースだと0.03秒です。たしかにこれだと一瞬ですね」
「だよね。Cマネージャーはきっとそういう経験を昔して、『ひっくりけえる』のは大したことじゃない、という思い込みがあったんだろうね。ついでに64bitだとどうなるかやってみる？」
「えーっと、9,223,372,036,854,775,807ですね。読み方を調べたら、922京3372兆368億5477万5千8百7だそうです。あははははははははははは。これだとベストケースで29万年くらい、ワーストだと5900万年くらいかかりますね」
「あはははははははははははははははははは、誰も生きてねーよ」
「あはははははははははははははははははは、そんなに動き続けるPCねーよ」
「あはははははははははははははははははは」
「あはははははははははははははははははは」
Aさんは笑いが収まると、PCをシャットダウンしました。「笑いすぎて気分悪くなったから早退するわ。Bくんも早退しちゃえよ、昨日遅かったし。上には言っとくから」そう言ってさっさと出口に向かいました。
Bくんは立ち上がって背筋を伸ばし、Aさんの後ろ姿に向かって叫びました「俺も早退します。あざっす。あざーっす！」

後日談2
某企業某所の研究棟の一室。2人の男がモニターの前で話し合っている。
「どうかね、先日送られてきたデータは？」年上の方の男が若い方に訊いた。
「実に興味深いです。たとえば、この被験者」そう言って若い男はモニターにアップになっている「被験者」の目の当たりを指差した。「この被験者は『残業』という言葉に異常なほどの嫌悪感を示しています。みてください、この表情に現れた憎しみ。我々のAIは『最大級の嫌悪感』と表現しました」
「ふーむ、よく分からんが、最近この国では長時間労働は悪だというキャンペーンが盛大に行われているらしい。こんど知り合いの日本人に聞いておくよ」
「お願いします。それから別の被験者は、ソースコードを見せた時に、コーディングのスタイルが自分好みではないと言って、その理由を10分に渡ってとうとうと述べ立てました。見てください、この表情には自分への陶酔と、気に入らないものへの嫌悪感が交互に浮かんでいます。我々のAIは『開発現場の厄介者』と表現しました」
「なるほど、研究は順調なようだね。ところでクライアントからデータをもらった『人事課の伝説の面談担当Sさんの面談』のデータ分析は進んでいるかな？」
「ああ、あれですね。えーっと、Sさんが下した、採用・不採用の判定と、面談の内容を結びつけるのがすごく難しい。たとえば『一生懸命』という言葉を面談中に使った被面談者は100％不採用になっています。ところが『一所懸命』という言葉を使った者は採用されています。いや、まったく日本人は理解するのが難しいです」
「こらこら、クライアントの悪口は言わない方が賢明だよ」
「すみません、それが賢明ですよね。以後気をつけます」

後日談3 20xx年の広告
御社の面接をサポートします！
迷惑な応募者を100%の確率で見つけ出し、あなたの大切な現場を守ります！ 
・自分流のルールに執拗にこだわり柔軟な対応ができない我儘な者
・責任を果たすことより定時退社を優先する者
・スキルを偽り嘘と媚びだけで食っていけると思っている愚か者
適切な質問と微細な表情の変化を捉えることにより、好ましくない人材を、わずか10分の面談で確実に見つけ出します。製品に同梱のウェアラブルカメラ(メガネ仕様)とbluetoothイヤフォンを装着し、スマホアプリ「僕は面接官」(Appストアから無料でダウンロード可能)から当社のサーバーにアクセス(Wi-fi環境が必要です)。あらかじめ登録した業務内容により、面接時のアドバイスをAIによる音声でお伝えします(男声/女声選択可能)。月に3面談まで9800円、20面談まで79800円、それ以上は何面談でも198000円でお使いいただけるオトクなサブスクリプションをご用意しました。ぜひこの機会に「伝説の面接官S氏のAI搭載 僕は面接官」をご利用ください！

追記
「人事に関して力を持つような『上の人』には露骨に媚びを売り、自分と同列の者には全く共感しない、それどころかあらゆる機会を利用して貶めようとする、自分は(他の者より)優秀だと大きな声で執拗にアピールする」最近こういう人を現場でよく見かけるようになりました。自分の実力を認めてもらうには、仕事を通じて、誠実に、時間をかけるしかないのに、そんな簡単なことすらわかっていないんです。これもこの国の世知辛さゆえか、と諦めていたのですが、彼らの首尾一貫した、そして徹底した行動を見るにつけ、これは何かしらの病気なのではないか、と思うようになりました。
NPDというパーソナリティ障がいがあるそうです。執拗に部下を苛めて鬱病に追い込むようなパワハラ上司にみられる症状だそうです。上に挙げたような人は(周りの人にとっては幸運なことに)今は上司の立場にはないためにハラスメントとは認識されず、ただ迷惑な人と思われているだけなのかもしれません。
後日談にあげたように、面談時にこういった人を見つけ出し、就業を拒むようなことは近い将来可能になるでしょう。しかし、パーソナリティ障がいを暴くような質問を面談ですることが果たして許されるのか？　パーソナリティ障がいを理由に就業を拒むことは許されるのか？　という疑問は残ります。
そのうちにこういったことに関する取り決めがなされると思いますが、パーソナリティ障がいを持つ人をただ排除することだけが企業にとっての利益につながるのか、ということも、当然、企業の側では考えざるを得ないことになるのでしょう。それと同時に、こういう人たちを採用し、彼らが周囲に与える（よくない）影響を知りながら、これを放置し続けることは、企業としての姿勢を問われることになりかねません。難しい問題ですね。

追記の追記
「人格障害」というのは響きがよくない、患者への差別を助長する恐れがある、という指摘を受けましたので、表記を訂正しました。「パーソナリティ障がい」というのが望ましい表記だそうです。