世界を動かす技術を、日本語で。

Kagi Searchの持ち帰り課題に失敗しました

2025年5月14日原文(bloggeroo.dev)

概要

  • Kagi Search のソフトウェア開発者ポジション応募体験を紹介
  • 「Take-home assignment」 の課題内容とやり取りの詳細を解説
  • 応募者の労力 と企業側の対応の問題点を指摘
  • 選考プロセスの不透明さ や課題の無償労働化を批判
  • 今後の採用活動への提案 と個人的な反省を述べる

ソフトウェア開発者採用における「Take-home assignment」の現実

応募と課題依頼

  • Kagi Search のバックエンド開発者職に応募することを決定
  • 求人要件は Go言語経験、バックエンド構築・スケーリング知識、Docker等コンテナ技術、チーム連携力 を重視する内容
  • 書類選考通過後、 「Take-home assignment」 (自宅課題)への招待メールを受信すること

課題内容と要件

  • 最小限のメールクライアント を構築する課題を提示されること
    • ターミナルUIまたはWebアプリで実装すること
    • メール閲覧・送信機能を実装すること
    • バックエンドは擬似でも実バックエンドでも可
    • プレーンテキストのみ対応でOK
    • 完成物をGitHubリポジトリ&デプロイ済みで提出 すること
  • 要件が非常に広範かつ抽象的 で、実質的に大規模な開発作業を無償で求められること

採用担当者とのやり取り

  • 要件の曖昧さ から、メールで追加質問・提案を送信すること
    • どんな追加機能を評価するか→「自分で考えよ」と返答されること
  • 実装計画(Proposal) を詳細に作成し、事前合意を試みること
    • Webアプリ(Go+AWS+Postmark+認証+DB)を提案
    • インフラ自動化(Pulumi)、デプロイ、UI設計、運用性も説明
    • 納期延長の相談と、事前の評価可否を確認 すること
  • 採用担当者からの返答は 「楽しみです」とだけで、質問に一切答えない こと

実装と結果

  • フルタイムで1週間かけて 要件通りのアプリケーションを構築・提出すること
    • デモ動画(YouTube)、ソースコード(GitHub)、詳細ドキュメントを用意すること
  • 結果は 自動送信の不合格通知 のみ、フィードバックを求めても「他候補者の方がシンプルかつ強かった」と一言だけ
  • 事前提案時点で不合格や方向性の指摘がなかった 点に強い疑問を持つこと
  • 課題提出後に要件が「デプロイ必須」に変更される など、運用の不透明さを実感すること

採用プロセスと課題方式への批判

  • 複数ポジション募集のため求人が消えない状態 で、応募者の労力が無駄になる危険性
  • 無償労働の強要、特に失業中の候補者にとって過酷な現実
  • 選考プロセスの改善提案 として、より明確な要件提示・事前合意・課題の有償化を提案すること
  • LeetCode型面接 (コーディングパズル)も含め、現状の採用手法に疑問を呈すること

結論と今後の考え

  • Take-home assignment は応募者の時間や労力を軽視しがちで、無償労働を助長する傾向があること
  • 採用側の誠実なコミュニケーションと、応募者の権利尊重 が必要であること
  • 今後は同様の課題依頼に対し、 本記事を共有し問題提起すること も検討すること
  • より良い選考プロセスの実現 を業界全体に求めること

この体験談は、 ソフトウェア開発者の採用現場における「Take-home assignment」課題の問題点 を具体的に示し、今後の改善に向けた議論の一助となることを目指す提案。

Hackerたちの意見

テイクホームアセスメントは面接プロセスの貴重な一部になり得るけど、絶対に時間制限が必要だと思う。2~3時間あれば必要な情報はすべて得られるはずだよ。新卒で扶養家族や趣味、責任がない人を選ぶ場合を除いてね。もしこれが3時間に制限されていたら、最悪でも候補者は3時間を失うだけで済んだと思うけど、もっと可能性が高いのは、全く違う提案や解決策を考え出して、そのタイムラインに合ったものを出してくれたかもしれないってこと。その追加情報があれば、会社が何を求めているのかがもっと明確になったはずだよ。もう一つ、応募者には確認してほしいのは、「どんな答えでもいいのか、それとも良い答えを求めているのか」ということ。テイクホームテストの中には、単にテストスイートを通過することが目的で、どう管理するかは関係ないものもあれば、80%の要件を満たしつつ、より良いコードを書くことを望むものもある。両方の側で間違ったことをする応募者を見たことがあるよ。

私も候補者に持ち帰り課題を出す立場として言わせてもらうと、Kagiの課題は大きすぎて、候補者の時間を無駄にしていると思う。おそらく意図せずに、こういうプロジェクトに時間をかけられる候補者をフィルタリングしているんじゃないかな。忙しい人(あなたが求めているタイプの人)は通過しちゃうし。候補者のスキルを把握する方法は他にもあるはずだよ。私たちの場合、データエンジニアリングのスキルを持つ人を採用するために、シンプルなETLチャレンジ(zipファイルからデータを引っ張ってきて、変換して、任意のデータベースに挿入する)をお願いしている。そこにはあえて曖昧さを残していて、データセットにはいくつかのイースターエッグ(例えば、予想外のnull値や、フォーマットが間違っているCSVなど)があって、それを使って候補者のパフォーマンスを評価している。時間は4時間に制限しているけど、時間が足りなくなった場合のガイダンスは与えないのが良い提案だね。フォローアップの電話では、一緒にコードをレビューして、コードを改善する方法について質問する(「もしデータセットがメモリに収まらなかったらどうする?」など)というのが、実際の技術評価になる。ここまで来ると、候補者は問題領域に少しは慣れているはずで、彼らの本当のスキルを評価できる。

面接を受ける人たちがもっと時間をかけていないってどうやってわかるの?全ての候補者が同じ時間をかけている保証はないから、ゲーム理論の問題になっちゃう。候補者は通常、何らかの形で負けることになる。多くの場合、正しい答えは、ほんとに洗練された(でもあまり洗練されすぎない!)解決策を作るために余分な時間を使って、時間制限内に収まったフリをすることだよ。そして、すべての候補者は、a) そうしているか、少なくとも b) 競争相手がそうしているのを心配している。あのダイナミクスを無視しても、3時間は候補者が過ごすには長すぎる時間だよ。1時間の面接なら、プログラミングの演習を通して、余分な時間をかけていないことが保証できる。そして、もし彼らが持ち帰りの評価を好むなら、後で更新した回答を送ってもらうこともできる。(でも、候補者がそれを聞いてくる頃には、すでに彼らのスキルについて好意的な見方を持っていて、「やりたいならどうぞ、でももう私のテストは通過してるよ」と言える。)候補者と面接官の時間投資を同じにすることで、候補者の時間を自分の時間と同じように尊重していることを保証できる(だって、彼らと一緒にいるわけだから)。興味のない部分はスキップさせる手助けもできるし(例えば、検索で見つけられる情報を教えたり、特定の詳細について心配しないように伝えたり)。もし採用マネージャーが候補者の時間を尊重しないなら、彼らが従業員の時間を尊重する可能性はどれくらいあるんだろう?

著者に同意するけど、ライブコーディングよりもライブコードレビューの方がずっと良いと思う。でも、もし企業がライブコーディング演習にこだわるなら、私のノートパソコンとマウスを持って行かせて、45分間部屋を出て、作ったものについて話せるときに戻ってくるっていうのはどう?

ほんと、テイクホームは嫌いだ。指示に「このプロジェクトはコーディングだけでなく、あいまいさやオープンエンドに対処する能力をテストします」と書かれているのを見ると、実際には a) この演習があまりにもひどく考えられていて、ルーブリックを用意する気がなかったか、b) 作業環境があまりにも混沌としていて、何の仕様や要件も明確に定義されていないってことを意味してる。さらに、「スキルを見せつけつつ、実用的な機能的解決策を提供する」という指示は完全に矛盾してる。良いシンプルな解決策は派手じゃないからね。

UIやAPI統合があるテイクホームはちょっと赤信号だと思う。なぜなら、UIコード(ほとんどの役割において)は比較的退屈だし、API統合は手間がかかる割にあまり情報を提供しないから。HTTPリクエストを作れるのはすごいし、基本的なCRUD編集のセットアップができるのもすごい。でも、それはたくさんのコードで、時間もかかるし、あなたのコーディングスタイルについてほとんど何も教えてくれない。AIツールはそんなものをすぐに生成できるし、かなりの品質でね。私が見たいのは、エンジニアがちょっとしたビジネスロジックを実装するところ。ネストされたif文が百万個できて、「ここにドラゴンがいます」ってコメントが上にあるのか、それとも正しいパターンを見つけて、コードを読んでいても理解できるものを作るのか。これは仕事においてはるかに価値があるし、面接でももっと信号が強いし、AIが正しくやるのはずっと難しい。しかも、時間もかからない。

いろんなプロジェクトがあるスタートアップだよ。作業環境が混沌としているのは予想されること。驚きのない仕事を求める人は、こういう職場には応募しない方がいいかもね。> 良いシンプルな解決策は派手じゃない。スキルを見せつけるって、良くてシンプルな解決策を作ることかも?

何の仕様や要件も明確に定義されていない。もし採用される役割の一部が、人々が仕様や要件を明確に定義する手助けをすることだとしたらどうなる?それはシニアソフトウェアエンジニアであることの大きな部分だと思う。もしかしたらこの形式がそれをテストするのに最適ではないかもしれないけど、「誰かがあいまいさに対処できるかどうかを見たい」というのは、すべての作業があいまいであることを意味するわけではないと思う。すべての作業が「あいまいな要件」から「明確に定義された仕様」に移行するプロセスを経る必要があるということかもしれない。

最近面接を受けたんだけど、その経験が私のものと非常に似てる(いくつかの場所で)。問題に対して素晴らしい解決策を出したのに、プロジェクトについての話し合いもなく拒否された。テイクホームの採用側に何度も立ったことがあって、テイクホーム課題を頼むなら、コードについてのチャットを必ずフォローアップすべきだと固く信じてる。どうやらほとんどの場所ではそうじゃないみたい。テイクホームを頼まれたら、評価に関係なくフォローアップがあるか確認することを強くお勧めする。もしそれに同意しないなら、「宿題」をやらない方がいい。正直なところ、採用しているチームのほとんどはかなり質が低いから、良い解決策を実装することはマイナスになる。なぜなら、採用しているチームがあなたのレベルに達していないから(それが拒否されるフラストレーションの理由)。私はKagiの初期ユーザーで、これを理由にアカウントをキャンセルするつもり。全く受け入れられない。候補者の仕事について話す時間がないなら、最初からその仕事を頼まないでほしい。

本当に「卓越した解決策」を提供したの?彼らの解決策は「最小限の、ターミナルにインスパイアされたメールクライアント」とは全く異なるように見えるし、OPは「インスピレーションを得るべき」と言われたツールへの言及を完全に無視している。要件の理解がこんなに悪い場合、私もその議論に時間を無駄にしないだろう。

私は何度もテイクホーム課題を出す側にいたことがあり、テイクホーム課題をお願いするなら、必ずコードについて話し合うべきだと固く信じています。それは本当に妥当な意見ですね。テイクホーム課題は、出す側だけでなく、面接官(あるいは採用チーム)にもかなりの労力を必要とします。プロジェクトをレビューするために時間と労力を投資した後、フィードバックや返事を期待するのは合理的です。しかし、現実も認めなければなりません。1つのポジションに対して20人の優秀な候補者がいる場合、多くの有能な人が落とされてしまいます。これは彼らが不十分だったり「失敗」したということではありません。ただの現実です。採用マネージャーがAを選んでBを選ばなかった理由を正当化するよう求められるのは、法的には「素晴らしい候補者の中から1人を選ばなければならなかったから選んだ」というのは通用しません。法的に正しい回答(残念ながら)は、細かいところを突いて、実際には存在しない欠点を見つけることです。少なくとも、私が見てきたアメリカの企業がこういう風に運営されるのが好きなようです。そして、最後に確認したとき、Kagiはパロアルトに拠点を置いています。

同意する。会社はプロジェクトがどのように評価されるかについて明確なガイドラインを公開するか、何がもっと良くできたかについてフィードバックを提供すべきだった。課題で失敗するのは構わないけど、何も返さずに誰かの時間を無駄にするのは受け入れられない。ポップスタートアップを含め、これをうまく処理している会社はたくさんある。

Hacker Newsで議論の続きを見る