.NET面接ではどのような質問が出ますか?
文責 Aaron Cao · 更新

ランタイムに関する質問(CLR、ガベージコレクション、値型と参照型の違い)、言語に関する質問(asyncとawait、LINQ、ジェネリクス、レコード)、フレームワークに関する質問(ASP.NET Coreのミドルウェアと依存性注入、EF Core)、さらに長時間稼働するサービスのメモリリークや遅いAPIエンドポイントなどのシナリオを想定してください。面接官は推論の過程を評価します。
.NET面接の冒頭では、ランタイムと言語について何を聞かれますか?
面接官は、フレームワークの出発点であるランタイムから始めます。Common Language Runtimeの役割(アセンブリの読み込み、中間言語のJust-In-Timeコンパイル、メモリ管理)を説明し、続いてガベージコレクションを一段深く掘り下げることを想定してください。その後の質問の流れは予測できます。コレクターが世代別である理由、オブジェクトが後の世代まで生き残る条件、ラージオブジェクトヒープの用途、そしてメモリが管理されているのに、そもそもなぜIDisposableとusingが必要なのか、という内容です。最後の質問には、コレクターが速やかに解放する方法を知らないファイルハンドルや接続などのアンマネージドリソースを挙げて答えます。
- 値型と参照型。それぞれがどこに存在するか、コピーがそれぞれにとって何を意味するか、ボックス化にどのようなコストがかかるか。
- asyncとawait。awaitされたタスクは呼び出し元のスレッドをブロックせずに解放すること、
async voidがイベントハンドラーに限定される理由、.Resultへの警告で言われるデッドロックが何を意味するかを説明します。 - LINQ。落とし穴は遅延実行です。
IEnumerableクエリは記述時ではなく列挙時に実行され、データベースプロバイダーに対するクエリは、そのプロバイダーが理解できる式だけがSQLに変換されます。 - ジェネリクス、インターフェース、レコード。制約、テスト容易性のために基底クラスよりインターフェースを選ぶ理由、レコードの値等価性によって得られる利点。
各項目では、仕組みとその結果を1つ答えてください。第0世代のコレクションが低コストなのは、ほとんどのオブジェクトが早期に不要になるからだと説明できれば、面接官が求める水準です。理由を示さず世代名だけを挙げるのでは不十分です。
ASP.NET CoreとEF Coreでは、どのような質問が出ますか?
コントローラーの実装には自信があっても、普段ほとんど触れない内部構造について聞かれるのではないかと不安かもしれません。その懸念はもっともです。フレームワークに関する質問はまさにこの領域から出るため、ここでは通常の質問順に、それぞれの追加質問とともに内部構造を説明します。
- リクエストパイプライン。ミドルウェアは登録順に実行され、各コンポーネントが次を呼び出すかどうかを選びます。追加質問:認証は認可に対してどの位置に置かれ、逆順に登録すると何が起きるでしょうか?
- 依存性注入の有効期間。Singletonはアプリケーションの存続中、scopedは1回のリクエスト中、transientは解決されるたびに存在します。典型的な落とし穴は、データベースコンテキストなどのscopedサービスをsingletonに注入することです。なぜそれがバグなのかを説明できるようにしてください。
- 構成とオプション。階層化されたソース、環境による上書き、型付き設定のためのオプションパターン。
- EF Core。変更追跡と読み取り専用クエリで無効にする場面、N+1問題と先行読み込みまたはプロジェクションによる回避方法、マイグレーション、そして手書きのクエリがLINQより優れると率直に判断すべき場面。
- テスト。インターフェースとDIコンテナーがサービスをテスト可能にする仕組み、そしてインメモリプロバイダーによって実データベースについて何を検証でき、何を検証できないか。
優れた候補者は、これらを関連付けて説明します。singletonのバックグラウンドサービス内で解決されたscopedコンテキストは単なる知識問題ではなく、面接官自身が実際にリリースしてしまったことのあるメモリと正確性のバグです。明示的にスコープを作成すると答えることが期待されています。
シナリオ形式の質問はどのように進みますか?
シニア職の面接では症状が提示され、問題への取り組み方が観察されます。代表例として、物流会社のシニア職を受けるバックエンドエンジニアが、ASP.NET Core APIのメモリ使用量が数日間増え続け、最終的にコンテナーが再起動すると告げられるケースがあります。優れた回答は推測から始めません。何が変わったかを尋ね、静的キャッシュや長期間存続するイベント購読に捕捉されたオブジェクトを確認し、singletonに保持されたscopedサービスを探し、ラージオブジェクトヒープの増加を調べ、修正案を出す前にメモリスナップショットを取得します。面接官は調査の順序を評価しています。
ほかにも頻出するシナリオがあります。高負荷時だけ遅くなるエンドポイントでは、同期データベース呼び出しからasync、接続プールの枯渇、キャッシュへと検討を進めます。共有コレクションの競合状態では、並行コレクションやロックという選択肢のコストを説明します。3つの下流サービスを呼び出す必要があるリクエストでは、タイムアウト、再試行、部分的な障害への対処を考えます。また、停止時間なしで列を追加しなければならないマイグレーションもあります。どの場合も、制約を明示し、仕組みを選択して、トレードオフを声に出して説明してください。
こうした質問は、追加質問を交えて声に出して練習しておくと、はるかに答えやすくなります。そのために模擬面接モードが用意されています。ほかの言語や職種の問題集は、職種・トピック別の面接質問にまとめられています。
AI面接アシスタントは.NETの質問に役立ちますか?
明記された制限の範囲内であれば、対話形式の面接で役立ちます。SubcueAIのネイティブmacOSおよびWindowsデスクトップアプリは、システム音声とマイク音声を取り込み、ローカルオーバーレイに短い回答候補を表示します。そのため、singleton内のscopedコンテキストがなぜバグなのかと面接官に聞かれたとき、画面上で仕組みを確認しながら自分の言葉で説明できます。ブラウザー拡張機能は、会議タブの音声だけを取り込むことで、ChromeとEdge上のブラウザータブ通話に対応します。ボットが通話に参加することはなく、会議ページに何かが挿入されることもありません。設定方法はチュートリアルページにあります。
制限事項として、監督付き評価、画面録画、会社管理のノートPC、または監視下でC#を入力するライブコーディング演習は対象外です。また、コードの記述を求められる面接では、アシスタントの支援効果が最も低くなります。最も効果を発揮するのは、前述したランタイム、フレームワーク、トレードオフに関する質問です。まず履歴書を読み込ませ、実際に構築したシステムを回答候補に反映させてください。そのプロフィールは履歴書ビルダーで管理します。