paint-brush
賢いプログラマー@themachine94
新しい歴史

賢いプログラマー

theMachine9410m2024/10/26
Read on Terminal Reader

長すぎる; 読むには

高い資格を持つ最終学年の学生が私たちの小さなチームに加わった経緯についての物語です。
featured image - 賢いプログラマー
theMachine94 HackerNoon profile picture

COVIDパンデミックが発生する前、私はドイツ北西部の小さな都市に住み、働いていました。小さなスタートアップ企業で働いていました。私はその会社で7人のエンジニアのうちの1人でした。私たちは非常に小さなチームでしたが、同僚は私がこれまで一緒に働いた中で最も優秀な人たちでした。私たちは、機械エンジニアが部品を設計するために使用するネイティブデスクトップアプリケーションを構築しました。これらの部品は、自動車や飛行機などに組み込まれる種類のものです。それは3Dモデリング(CAD)プログラムだったので、当然のことながら、新しいエンジニアを雇ったり、インターンを雇ったりするときはいつでも、数学、幾何学、低レベルの高性能コードの作成などに長けた人を優先しました。候補者を面接する際、私は技術面接を行う責任を負いました。私は、候補者に求めるスキルを反映したプログラミングタスクをいくつか用意していました。候補者に問題を解決し、思考プロセスを話すように依頼しました。たとえ45分で解決策を終えなかったとしても、それは彼らが何を知っていて、どのように考えているかを学ぶ有用な方法でした。私のチームの他のメンバーは、性格など他の基準で候補者を面接しました。これは非常にうまくいき、私たちは非常に才能があり、やる気のあるエンジニアを何人か採用しました。私たちは全員、自分の仕事がとても上手で、お互いを尊敬し合っていました。


2020 年の初めに、地元の大学の最終学年の学生がインターンシップを求めて連絡してきました。私は必要な休暇を取り、数週間ベルリンに行っていました。そのため、技術面接を行うことができませんでした。私のマネージャーとチームの他のメンバーは、面接中にその学生に非常に感銘を受け、彼の履歴書は並外れたものでした。私たちはこれまでインターンを雇ったことがありませんでした。私のマネージャーは、インターンに技術面接は不要かもしれないと考えました。そのため、彼は技術面接なしで彼を私たちと一緒に働かせることにしました。私は休暇から戻って、翌週に開始する新しいインターンについて知らされました。私はこのインターンの仕事を監督しなければなりませんでした。基本的に、彼が何をしなければならないかを理解していることを確認し、質問に答え、可能な限り彼の邪魔にならないようにしました。私たちはすでに、インターンに取り組んでほしい一連の問題を提示していました。これからは、インターンのことをステファンと呼ぶことにします。この頃、ドイツでコロナウイルスが蔓延しているという話がたくさんありました。ニュースのいたるところで取り上げられていました。私たちは小さなチームで、密集して仕事をしたり、お互いに質問したり、ホワイトボードでブレインストーミングしたりすることに慣れていました。しかし残念なことに、ステファンが参加するちょうど 1 日前に、ドイツは完全なロックダウンに入りました。私たちは全員、自宅からリモートで働き始めました。最初の数週間はリモート ワークに苦労しました。私はステファンのプロジェクトの監督者として、彼に、作業を進めるために必要なことがあれば何でも私に連絡していいと伝えました。私が不在だったり忙しかったりする場合でも、他のチーム メンバーが喜んで飛び込んできてステファンを助けてくれました。


私たちのコード ベースは C# と C++ の混合でした。すべてのユーザーは Windows を使っていたので、フロント エンドとパフォーマンスが重要でないその他のものはすべて C# で記述しました。数値アルゴリズム、3D レンダリング、パフォーマンスが重要なものはすべて C++ で記述しました。チーム メンバーのほとんどは両方の言語に精通しており、どちらか一方を専門とする人もいました。Stefan は C# と C++ の両方に非常に堪能であると主張しました。彼の初日、私は数時間 Stefan の呼び出しに付き添い、コード ベースについて説明し、彼が作業を開始できるように彼のローカル マシンですべてをセットアップしました。Stefan は少し緊張していて、C++ を記述したり Windows を使用したりするのは久しぶりだと言いました。Stefan は毎日 Linux マシンを操作していました。彼は C++ を記述するのに苦労しているようでした。私は、彼が新しい環境、新しいコード ベースで作業しなければならないことに少し戸惑っているだろうと思い、彼が作業を開始するまで手伝うことにしました。そこで、私たちは次の数時間ペア プログラミングを行いました。彼は、一度に 1 行ずつコードを書くのを手伝ってもらう必要がありました。彼はコードで馬鹿げた間違いを繰り返していたので、私がそれを修正し、正しいやり方を教えて欲しいと思っていました。私はこれはちょっと変だと思いましたが、とにかく彼にチャンスを与えることにしました。電話が終わる頃には、ステファンが自分で作業を続けられるくらいの知識を身に付けていることを期待していました。


嬉しいことに、翌日、Stefan から連絡がありませんでした。彼にメッセージを送ると、彼は進捗中なので私に何も頼む必要はないと言っていました。それを聞いてうれしかったです。自分の仕事に集中できました。しかし、その翌日、Stefan は再び私に連絡してきて、助けを求めてきました。私たちのアプリケーションに貢献するために、Stefan は C# と C++ の両方を書かなければなりませんでした。アルゴリズムの数値部分を C++ で書き、それをフロントエンドと接続し、C# で他のいくつかの作業を行う必要がありました。Stefan が 3 日目に私に連絡してきたとき、彼の C++ コードは進んでいませんでした。ほとんど 1 日目の終わりに中断したところからでした。しかし、彼は C# のコードでかなり進んでいました。彼は同時に両方の側面からタスクに取り組んでいました。Stefan は 2 日目に私の助けを借りずに C# で書いたものを誇らしげに見せてくれました。私はそのコードを読み、それに圧倒されました。コードは本当に高品質でした。簡潔でエレガントで効果的でした。ステファンは実に才能があると思いました。C++ の構文や言語の詳細には少し慣れていないかもしれませんが、彼の C# のコードを見ると、彼が全般的に優れたプログラマーであることが分かりました。これは良い兆候で、彼は C++ のコードをすぐに改善するだろうと思いました。これがきっかけで、彼の C++ を手伝うことにしました。3 日目も数時間かけてステファンとペアを組み、彼の C++ のコードを手伝いました。このサイクルがもう 1 回繰り返されました。ステファンは 4 日目に独り立ちして C# のコードを書き、5 日目に C++ の手伝いを求めて戻ってきました。この時点で、私は疑い始めていました。彼が C++ のコードで手伝いを必要としていたレベルは、彼が書いた高品質の C# コードと一致していませんでした。C++ では、彼は基本的な概念、コンピューターの仕組み、メモリの仕組みなどに苦労しているようでした。明らかに C# はガベージ コレクション言語であり、メモリ管理の知識は必要ありませんが、何かがおかしいと感じ、それが何なのかよくわかりませんでした。


丸々 1 週間が経ちました。オフィスで働くことに慣れているチームとして、私たちは全員リモートワークを嫌っていました。ロックダウン中のこの時期、私たちは 7 人以下のグループで集まることが許されていました。同僚の David が、週末に私と他の同僚数人を自宅にバーベキューに招待してくれました。彼は私からそれほど遠くないところに住んでいて、私たちは以前にもこのようなことをしたことがありました。天気は良く、私たちは David の裏庭で彼の妻と 3 歳の娘と一緒に過ごしました。私たちはグリルで肉や野菜を焼き、ビールを何杯か飲み、とても穏やかな気分でした。David の 3 歳の娘は、アイスクリームのふりをして小さなプラスチックのカップに土を入れて私たちに出してくれました。言うまでもなく、私はそれに騙されませんでした。David が Stefan の話題を持ち出し、会話は次のような感じでした。


デビッド: ステファンはどうですか? 彼は先週、何度か私に連絡して助けを求めてきました。


私: ああ、そうだね、私も彼をかなり手伝ったよ。彼はまだ始めたばかりだから、手伝っても構わないと思ってたんだ。彼についてどう思う?


David: ええ。彼の仕事には非常に感銘を受けました。彼は本当に質の高いコードを書いていて、C++ で何をしているのかわかっているようですが、良い C# コードを書くのに苦労しています。私は彼が C# コードを書くのを手伝ってきました。


私はデイビッドに尋ねました。「待ってください、それは逆のことですか?私は彼の C# はとても上手だと思うけど、彼は C++ が下手だと思うから。」私がその文を言い終えるとすぐに、私たちは 2 人とも何が起こっているのか理解しました。私はステファンに C++ のコードを少しずつ教え、彼はそれを自分のコードとしてデイビッドに見せました。そして 1 日おきに、デイビッドはステファンに C# のコードを少しずつ教え、それを自分のコードとして私に見せました。私はデイビッドの C# コードの品質に感銘を受け、デイビッドは私の C++ コードに感銘を受けました。一方で、デイビッドと私は、お互いのコードを賞賛するという素晴らしい仲間の瞬間を過ごしました。しかし、その瞬間は、私たちが 2 人ともステファンに騙されたという事実によって影を潜めました。これは物語からそのまま出てきた話ですが、現実に起こっていました。チェスの遊び方を知らない男が、2 人のグランド マスターを対戦させて引き分けに持ち込んだ話のようでした。ステファンは現実にこれをやってのけました。ステファンは何も知りませんでした。それに気づくのに1週間もかかったことを悔やみました。公平に言えば、オフィスにいたらこのトリックは機能しなかったでしょう。在宅勤務中のコミュニケーションが下手だったために、私たちはこれに騙されてしまったのです。


次の月曜日に仕事に戻ったとき、私はステファンにデイビッドに迷惑をかけないように、そして私に助けを求めるように言いました。ステファンがプログラミング、数学、幾何学についてそれほど詳しくないことがすぐに明らかになりました。彼の履歴書は嘘だらけであることは明らかでした。彼はたまたま口が達者で、多くのことを知っているように見せる才能があるのです。そのスキルのおかげで彼は仕事を得て、丸一週間私たちを騙し続けました。ステファンと仕事をすればするほど、彼のコードをレビューすればするほど、彼が無能であることがわかりました。私はついにステファンの本当の姿、彼の本当のプログラミングスキルがわかりました。無能という言葉が正しいかどうかはわかりません。ステファンは悪いコードを書いていましたが、それは奇妙な方法で悪かったのです。私がそれについて彼に尋ねると、彼は奇妙な答えを返しました。実際に起こった例を挙げましょう。私はかつてステファンに次のように言いました。「…つまり、この整数値を取得したいのですが、その値が下限と上限の間にある場合は、この別の関数を呼び出す必要があります…わかりましたか?」。ステファンは、何をしなければならないかを理解していると私に保証しました。翌日、彼のPRを見たところ、次のような内容が書かれていました。


 int value; // Assigned from somewhere. for (int i = lower_bound; i <= upper_bound; ++i) { if (value == i) { do_stuff(...); } }


私はびっくりしました。これは単に悪いコードではなく、別のものでした。私は若くてコーディングが下手だったことを覚えていますが、私の下手なコードはこのようなものではありませんでした。これは奇妙さの別の側面でした。初心者のプログラマーだったとしても、このようなコードを書くことは思いつきませんでした。境界内のすべての整数をループするという選択は十分に奇妙でしたが、本当に驚いたのは、一致を見つけて関数を呼び出しても、ループから抜け出さないという事実です。残りの値をチェックし続けます。どうやって?私はステファンに、なぜ単純に次のようにしなかったのか尋ねました。


 if (value <= upper_bound && value >= lower_bound) { do_stuff(...); }


数十万、あるいは数十万にも及ぶ可能性のある範囲のすべての整数と比較するのではなく、単純な不等式を使用するという私の提案を受けて、Stefan は、そのような良いアイデアを思いついたことを称賛し、新しい変更を PR にプッシュしました。Stefan が何かに苦労するたびに、私たちはより簡単な作業を与えました。驚いたことに、彼はそれにも失敗しました。インターンシップは短期間だったので、私たちは Stefan にあまり煩わされませんでした。しばらくすると、彼はプログラミング以外のタスク、スプレッドシートでの管理、その他の必要なアドホック タスクを行うようになりました。彼が取り組もうとした当初のプロジェクトは、彼のスキルをはるかに超えていることが判明しました。どういうわけか、Stefan は 3 か月間のパートタイムの有給インターンシップを終えました。彼は夏の間も私たちのために働き続けたいと考えていました。彼は、私たちの会社に役立つ新しい研究プロジェクトを提案していました。私のマネージャーが、あと 3 か月間 Stefan と一緒に働き続けたいかどうか尋ねたとき、私は「いいえ」と答えました。私はマネージャーに、この 3 か月間の仕事がいかにひどかったかを思い出させました。しかし、私のマネージャーは楽観主義者でした。彼は人を信頼していました。彼は私に、ステファンと同じ年齢で、大学に通い、初めて物事を学んでいたときの自分を思い出すように言いました。


マネージャーは私によく考えて、ステファンにもう一度チャンスを与えることを検討するよう言いました。正直に言うと、私がステファンと同じ年齢だったとき、当時は新しい HTML5 キャンバスを使用して JavaScript で 2D ゲームを書いていました。ステファンは、年齢や経験を考慮しても本当に無能でした。しかし、無能さよりもずっと悪かったのは、彼の不誠実さでした。いずれにせよ、私はこの決定を軽々しく下したくありませんでした。一方では、ステファンは学習能力があるかもしれませんが、他方では不誠実です。私は、彼が新しい研究プロジェクトのために書いた提案書を読みました。そのアイデアは非常に斬新で、うまくいけば、私たちの会社にとって非常に役立つでしょう。本当に感銘を受けました。しかし、そのとき、マネージャーが私に植え付けようとした楽観主義が、私の冷笑主義に取って代わられた瞬間がありました。私は、ステファンの研究提案書の 1 つの単語、「2 次元多様体」に執着しました。


彼と一緒に働いていたから、私はステファンが本当に無能なことを知っていたし、2次元多様体が何を意味するのか彼が知っているはずがない。私はステファンの研究提案をオンラインの剽窃チェッカーにコピー&ペーストした。何年も前のことで、どれだったかは忘れた。私はグーグルで検索し、上位の結果の1つを使った。剽窃チェッカーは研究論文と97%一致するものを見つけ、オリジナルへのリンクを提供した。ステファンはそれを丸々コピーしていた。翌朝、私はステファンと彼の研究提案について話した。彼が話し始めるとすぐに、自分が何を話しているのか理解していないことは明らかで、すべて単なる言葉の羅列だった。彼はまたもやペテン師になっていた。私はマネージャーに知らせ、これがついに彼のステファンに対する信頼を失わせた。ステファンは二度と私たちのために働いてくれなかった。


ステファンが得意としていたのは、自分を売り込むことと、自分が何を話しているかを知っているように見せることだけでした。営業など、こうしたスキルがあればかなり成功できる職業があることは理解しています。しかし、ソフトウェア開発などの技術的なキャリアで、でたらめを言ってやり通そうとするのは奇妙だと思いました。