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

技術面接でクイズを出されてボコボコにされた。もちろん落ちた。 ボコボコにされたあと、「次に同じ機会があれば答えられるようにしないと!」と思って急いでクイズの内容をメモした。そのメモを見ながら面接の内容を振り返ってみる。 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作ってんの?」と…。 ゲームアプリでフロントエンドとバックエンドを分ける方式にすると必要な情報を漏れなくやり取りする必要がある。 一般的なWebアプリではやり取りするデータの形式がある程度決まっているのに対し、麻雀ゲームでやり取りするデータの形式はてんでバラバラだ。 ツモとかポンとかリーチとかプレイヤーの選択した行動によってデータの性質が全く異なるし、必然的に型定義も面倒になってくる。 しかも麻雀とかいうゲームのルールが複雑すぎるせいで絶対に考慮漏れが発生するのでそのたびに手戻りも発生する。 もちろん型定義もやり直しだ。 誰だよ!麻雀のルールをここまで複雑にしたやつは! 大学生の時に未完成のまま放りだしたのも型定義するのめんどくせーって感じだった気がする。 冷静に考えればUIもゲームの実装の一部としてPythonで書いて、単体のソフトウェアとして完結したほうが絶対楽に決まっている。 ゲーム部分とUI部分でデータのやり取りをする必要がなくなるし、いちいちReactのサーバを起動したりエディタを2つ起動したりする必要もなくなる。 将来的にブラウザ上でAIと対戦できるようなプラットフォームを作りたい場合でも、まずはプロトタイプを作ってバグをある程度取り除いてからの方が良い。 冷静に考えたら当然の帰結だけど、実はこの事実に気付いたのは昨日だ。なんか寝て起きたら気付いた。 自分の方針を疑っていない状態で自分の非効率さに気付くのってマジでむずい。 世間の人はどうやって疑うモードにスイッチを入れているんだろうか? 良いものを効率良く作るなら常に万物に対して疑問を呈さないといけないんだろうけど、それってめちゃくちゃ脳が疲れそうだな。

2025-03-02