技術面接でクイズを出されてボコボコにされた。もちろん落ちた。
ボコボコにされたあと、「次に同じ機会があれば答えられるようにしないと!」と思って急いでクイズの内容をメモした。そのメモを見ながら面接の内容を振り返ってみる。
1. GETとPOSTの違いを説明してください。
自分: GETはリソースの取得に使い、POSTはリソースの作成に使います。
面接官: 内部的にはどう違いますか?
自分: え…!?メソッド名が違うとかそういうことですか?
面接官: あ、分からないなら分からないでいいですよ。
自分: すみません…。分かりません…。
ググった感じ、「内部的にはどう違いますか?」という質問に関しては、「GETはクエリパラメータにデータが含まれるのに対して、POSTはリクエストボディにデータが含まれる」的なことを答えれば良かったと推測される。
でも、それって内部的な違いって言うかな?内部的な違いと言われると、エンジニアが直接触れることのない部分での違いを問われているように感じる。
クエリパラメータとリクエストボディって割と意識的に操作していない?
「データの渡し方の違いはどうですか?」と深堀りされていたら普通に答えられていたので、ぶっちゃけ面接官の深掘りの仕方も良くなかった気がする。
まあ、このあとにも答えられなかった質問がいくつかあるので、これに答えたところで結果は変わらないと思うけどな!
2. N + 1問題とはなんですか?
自分: あのー、なんかORMとかを使っているときにテーブルを結合したりするとSELECT文が大量に発行される的なやつだと思うんですが…。すみません、詳しいことは分かっていません。
やらかし。完全に忘れていて答えられなかった。
N + 1問題はテーブル結合とは関係なく発生するので的外れ。
なんで自分がN + 1問題を忘れてしまっていたのかを振り返ってみたけど、おそらく自分の脳内ではN + 1問題が
- なんかSELECT文が大量に発行されるやつ(超ざっくりとした概要)
- railsならとりあえずbulletを入れとけば大丈夫(解決策)
の2つに極端に抽象化されてしまっていた。
実務では概要と解決策の2つさえ抑えておけば具体的な内容を理解していなくてもなんとかなることが多いけど、でもこれって本質を理解してないってことでもあるよな。
超反省です。
3. DBで片方のテーブルにしかない情報を取得するときに使うのはINNER JOINですか?OUTER JOINですか?
自分: OUTER JOINです。
これは自信を持って回答できたやつ。
前職で大量に生のSQLを書いていたので、SQLのクイズに関しては大体のことに答えられる自信がある。
その分ORMの知識がおざなりになってしまったんですが…。
4. Fizz Buzzを書いてください。
これも自信を持って回答できたやつ。Pythonで書いた。AtCoderのおかげです。
5. セッションとクッキーの違いはなんですか?
自分: セッションはサーバ側にデータを保存するのに対して、クッキーはクライアント側にデータを保存します。クッキーはサーバへのリクエスト時に自動で送信されるようになっているので、サーバ側のセッションと突き合わせることで認証などを行うことができます。
前半は良いんだけど、後半はセッションとクッキーの違いじゃなくて認証の話してるよな。
回答した直後に「あれなんか途中からズレたな?」って気づいた。
結局セッションとクッキーの違いを明確に理解してないから、なるべく自分の知っている知識に持っていこうとして回答がおかしくなってしまうんだろうな。
これも反省だな。
6. SQLインジェクションとはなんですか?
7. XSSとはなんですか?
この2つは正しく回答できたと思うけど、なんかグダグダ説明しすぎた。もっと短文でパッと答えるべきだった。
8. CSRFとはなんですか?
自分: 罠サイトの中に攻撃対象のサイトをめっちゃ小さいiframeで埋め込んでクッキーとかを盗むやつです。
みなさんお分かりかと思いますが、これはXSS + クリックジャッキングの説明です。だめですね。
CSRFは何度か勉強したこともあるんだけど、いつも覚えられないんだよな。勉強の仕方が良くないんだろうな。反省だ。
CSRFもN + 1問題と同じで「railsならprotect_from_forgeryを使えば良い」みたいな対策だけを覚えてしまっている。
もっと本質と向き合わないとだな。