Go 面接──実務レベルが問われる「退屈な質問」とデバッグツール¶
ほとんどの Go 面接は構文をテストする。
実務経験は「退屈に見える質問」に現れる。
シニアレベルを測る質問¶
| 質問 | 測っていること |
|---|---|
| ゴルーチンのリークをどうやって止めるか? | context キャンセル・done チャネル・defer による cleanup の理解 |
| チャネルはいつ閉じるか?誰が所有するか? | 所有権の原則(送信側が close する)・close 後 receive の挙動 |
| pprof でスタックした HTTP ハンドラはどう見えるか? | プロファイリングツールの実務経験 |
| タイムアウト・キャンセルを 4 層通過して送信するには? | context.Context の伝搬パターン |
実際のインシデントから来る質問¶
-
無制限バッファのメモリ増加:
make(chan T, N)の N を過大に設定、バッファが詰まって OOM -
コピーしたミューテックスによるデッドロック:
sync.Mutexは値コピーで壊れる(ポインタで渡すべき) -
time.Afterがホットループに:select内のtime.Afterは毎回 Timer をアロケートする。time.NewTimerを使い Reset する -
GOMAXPROCS がコンテナで変わる: デフォルトで CPU コア数を使うが、コンテナの cgroup 制限を無視するため
automaxprocsライブラリを使う
良い回答で言及すべきツール¶
| ツール | 用途 |
|---|---|
pprof |
CPU・メモリ・ゴルーチンのプロファイリング |
go tool trace |
ゴルーチンのスケジューリング・GC の可視化 |
expvar |
実行時のメトリクス公開(HTTP エンドポイント) |
-race フラグ |
データ競合の検出(race detector) |
バックプレッシャーとバジェットの言及¶
-
チャネルのバッファを使ってバックプレッシャーを実装し、処理が詰まったときに upstream に通知する設計
-
タイムアウトバジェット(全体の締め切りから各層のタイムアウトを差し引いていく)の概念
要点¶
-
Go 面接では構文より「実際のインシデントで何を経験したか」が差をつける
-
ゴルーチンリーク・ミューテックスのコピー・time.After のアロケーションは頻出のバグパターン
-
pprof・race detector を日常的に使った経験を語れることが重要