技術面接でボコボコにされた備忘録

技術面接でクイズを出されてボコボコにされた。もちろん落ちた。 ボコボコにされたあと、「次に同じ機会があれば答えられるようにしないと!」と思って急いでクイズの内容をメモした。そのメモを見ながら面接の内容を振り返ってみる。 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で埋め込んでクッキーとかを盗むやつです。 ...

2025-03-05

冷静に考えれば気づけるはずのことに気づけないことがある

昔から麻雀AIに興味があって、ちまちまと麻雀AIを開発してきた。 大学生の時には強化学習をしたくてAI同士を戦わせるための環境を作っていた。 ゲーム系の環境を作るときは、実際にそのゲームをプレイできるUIがあったほうがバグに気づきやすい。そこでReactを使ってUIを作った。 それがこれである。大学生のときに作って未完成のままなので、かなりのバグがある。 最近、また麻雀AIを作る気力が湧いてきたので、このときのコードをリファクタしようと思ったのだが、そこでふと気づいた。 いや、なんでReactでUI作ってんの? と…。 フロントエンドとバックエンドを分ける方式にすると、データのやり取りをする必要がある。ゲームだとやりとりするデータのパターンが複雑で型定義が面倒だった。 ただでさえ型定義が面倒なのに、麻雀とかいうゲームのルールが複雑すぎるせいで絶対に考慮漏れが発生するので、そのたびに莫大な型定義の修正が発生するのも面倒だった。 もうとにかく面倒くさい。誰だよ、麻雀のルールをここまで複雑にしたやつは! 大学生の時に未完成のまま放りだしたのも、型定義するのめんどくせーって感じだった気がする。 AI部分がPythonならUI部分もPythonで書いたほうが絶対楽に決まっている。データのやり取りをする必要がなくなるし、いちいちReactのサーバを起動する必要もなくなる。将来的にAIと対戦できるようなプラットフォームを作りたい場合でも、まずプロトタイプを作って安定的に動作することを確認してからの方が良い。 冷静に考えたらそうなんだけど、実はこの事実に気付いたのは昨日だ。なんか寝て起きたら気付いた。 自分の方針を疑っていない状態で自分の非効率さに気付くのってマジでむずい。世間の人はどうやってモードを切り替えているんだろう。 良いものを効率良く作るなら常に万物に対して疑問を呈さないといけないんだろうけど、それってめちゃくちゃ脳が疲れそうだな。

2025-03-02