LLaravel Bootcamp

面接想定問答集

「なぜ差がつくのか」まで理解する

同じ質問でも、答え方で評価は大きく変わります。NG回答と加点回答を見比べ、 「どこで差がつくのか」を掴んでください。自分の言葉で書いた回答は自動で保存されます。

設計思想

MVCとは何ですか。なぜMVCで分けるのですか。

✗ NG回答例

MVCはModel・View・Controllerの略で、Modelがデータ、Viewが見た目、Controllerが制御を担当する仕組みです。Laravelがこの形になっているので、それに従って開発します。

✓ 加点される回答例

MVCは関心事を「データとルール」「表示」「入力の受け取りと交通整理」の三つに分ける設計です。ポイントは略語の暗記ではなく、変更の理由ごとに置き場所を分けることだと考えています。たとえば画面のデザインが変わってもビジネスルールは触らずに済むし、逆に料金計算のルールが変わってもHTMLは触らない。こう分けておくと、変更が一箇所に閉じて影響範囲が読みやすくなり、複数人で作業を分担してもぶつかりにくくなります。私はMVCを「型」ではなく「変更に強くするための分割の指針」として理解しています。

🧭 なぜ差がつくのか

採点者は「MVCの各要素が何か」は誰でも言えると見ています。差がつくのは、なぜ分けるのかを「変更理由の分離」まで結びつけられるかです。略語の説明で止まる人は暗記でしかない一方、変更のしやすさ・影響範囲の限定・作業分担のしやすさといった実務上の効果まで自分の言葉で語れる人は、設計をちゃんと理解していると判断されます。実装よりも説明力が問われるこのポジションでは、ここが最初のふるいになります。

関連用語:
設計思想

フレームワークを使わず素のPHPで書いてもいいのに、なぜLaravelのようなフレームワークを使うのですか。

✗ NG回答例

フレームワークを使うと開発が速くなって便利だからです。ルーティングやDBアクセスの機能が最初から揃っているので、自分で一から書かなくて済みます。素のPHPだと大変なことが多いですが、Laravelなら用意された機能を呼ぶだけで動くので、初心者でも効率よく開発を進められると思います。

✓ 加点される回答例

一番の理由は「毎回同じ判断をしなくて済むこと」だと考えています。素のPHPだと、ルーティングの作り方もDBアクセスの書き方もフォルダ構成も全部自分で決めることになり、その判断がプロジェクトごと・人ごとにバラバラになります。フレームワークは、そこに共通の型と作法を与えてくれるので、初めて入ったコードでも置き場所の見当がつく。つまり速さそのものより、チームの認識を揃えて保守しやすくすることが本質だと思います。加えてセキュリティ対策や入力検証といった「間違えると危険な部分」が枠組みとして用意されているので、車輪の再発明でミスを埋め込むリスクを減らせます。

🧭 なぜ差がつくのか

「速くて便利」は事実ですが、それだけだと個人の生産性の話で止まります。採点者は、共通の作法によってチーム全体の保守性が上がる点、危険な処理を自前実装せず安全側に倒せる点まで語れるかを見ています。便利さの理由を「判断の統一」と「安全性」という二軸に分解できるかが分かれ目で、ここを分解できる人は、フレームワークを道具ではなくチームの約束事として捉えていると評価されます。

関連用語:
設計思想

「設定より規約(Convention over Configuration)」という考え方を説明してください。

✗ NG回答例

決まりに従っておけば設定ファイルを細かく書かなくて済む、という考え方です。Laravelでは命名規則を守っておくと、テーブルとモデルの対応などをよしなに動かしてくれるので楽です。いちいち設定を書く手間が省けるので、規約通りに書くのがおすすめだと教材にも書いてありました。

✓ 加点される回答例

規約に従っていれば設定を書かなくても標準的な挙動が得られる、という考え方です。たとえばテーブル名やキーの命名を約束どおりにしておけば、フレームワークが自動で紐付けてくれる。ここで大事なのは「楽」よりも「チームの合意コストを下げる」ことだと捉えています。規約があると、コードを読む側は明示的な設定を探さなくても、名前から関係性を推測できる。逆に規約を外れて独自設定を増やすほど、読み手が確認すべき箇所が増えます。だから私は、特別な理由がない限り規約に乗り、外すときは「なぜ外したか」をコメントやレビューで共有する、という運用が正しいと考えています。

🧭 なぜ差がつくのか

「設定を書かなくて済む」は入口の理解にすぎません。差がつくのは、規約が読み手の推測コストを下げてチームの合意形成を効率化する、という効果まで説明できるかどうかです。さらに「規約から外れるときは理由を共有する責任がある」と付け加えられると、ルールを鵜呑みにするのではなく、規約の効用と限界を理解したうえで判断できる人だと評価されます。

関連用語:
設計思想

数あるPHPフレームワークの中で、なぜLaravelを選ぶのですか。

✗ NG回答例

Laravelは日本で一番人気があって情報も多いからです。求人も多いし、学習教材も豊富で、分からないことがあっても検索すればすぐ答えが見つかります。みんなが使っているフレームワークなので、これを覚えておけば仕事に困らないと思って選びました。

✓ 加点される回答例

人気や情報量は学習のしやすさとして正直ありがたい点ですが、技術選定の理由としてはもう少し中身を見ています。Laravelは、DBアクセス・認証・入力検証・非同期処理といった業務アプリで必ず要る部品が一通り公式に揃っていて、しかもそれらが同じ思想で統一されている。だから「この機能はどう書くのが標準か」で迷いにくく、チームで書き方が揃いやすいのが強みだと考えています。もちろん実務では、既存システムが別の言語なら無理にLaravelを選ぶべきではないし、要件が極端に軽量なら過剰にもなり得ます。だから「万能だから選ぶ」ではなく、業務アプリを一貫した作法で素早く安全に作れる点が要件に合うなら選ぶ、という立場です。

🧭 なぜ差がつくのか

「人気だから」は技術選定の理由になっていません。採点者は、Laravelの何が業務要件に合うのかを具体的な機能と設計の一貫性の観点で語れるか、そして「常にLaravelが正解ではない」と選定に条件を付けられるかを見ています。既存システムや要件の軽さによっては別の選択もあり得る、と留保できる人ほど、技術を無条件に礼賛せず要件次第で判断できる姿勢があると評価されます。

関連用語:
設計思想

LaravelのファサードやDIコンテナは、結局どんな設計上の狙いがあるのですか。

✗ NG回答例

ファサードは短く書ける便利な記法で、DIコンテナは必要なものを自動で用意してくれる仕組みです。細かい中身まではよく分かっていませんが、決まった書き方をすれば動くので、正直おまじないみたいなものだと思って使っています。便利なので、特に困ったことはありません。

✓ 加点される回答例

どちらも「使う側が、中身の作り方を知らなくて済むようにする」ための仕組みだと理解しています。DIコンテナは、あるクラスが必要とする部品を外から差し込む役割で、狙いは「依存を自分で組み立てないこと」。こうしておくと、たとえば本番ではメール送信、テストではダミー、と差し替えが効くのでテストしやすくなります。ファサードは、そのコンテナ経由の機能を短い記法で呼べるようにした窓口です。便利記法である一方、乱用すると依存関係がコードに現れにくくなるという弱点もあるので、私は「入口の手軽さ」と「依存の見えやすさ」のトレードオフだと捉えています。おまじないで済ませず、裏で何が差し込まれているかを意識するのが大事だと思います。

🧭 なぜ差がつくのか

「便利」「おまじない」で止まると、なぜその仕組みがあるのかを理解していないと見られてしまいます。差がつくのは、DIの狙いを「差し替え可能性=テスト容易性」に結びつけられるか、そしてファサードの手軽さと依存関係が見えにくくなるというトレードオフに触れられるかです。便利さだけでなく弱点まで両面から語れる人は、仕組みを鵜呑みにせず使いこなせると評価されます。

関連用語:
設計思想

実装はAIでもできる時代に、あえて設計思想を学ぶ意味はどこにありますか。

✗ NG回答例

AIに任せると危ないので、自分でも書けるようにしておくためです。基礎を知らないと応用が効かないと思いますし、いざというときに自分で直せないと困るからです。やっぱりエンジニアなら自分でコードを書けることが大事だと思うので、設計思想も一通り勉強しておくようにしています。

✓ 加点される回答例

AIはコードを書くのは速いですが、「このプロジェクトで何を優先すべきか」までは決めてくれないと考えています。たとえば同じ機能でも、速度を優先するのか読みやすさを優先するのか、どこまで作り込むかは要件とチーム事情で変わる。その判断の土台になるのが設計思想です。私は、AIに指示を出す側・出力をレビューする側に回るために設計を学んでいます。生成されたコードが「なぜこの構造なのか」を評価できないと、良し悪しを判断できず、そのまま採用してしまう。逆に設計の意図を言語化できれば、AIへの指示も的確になり、出てきたコードの妥当性も検証できる。つまり実装力の代替ではなく、判断力とレビュー力のために学んでいます。

🧭 なぜ差がつくのか

「基礎が大事」で終わると抽象論に聞こえてしまいます。採点者が見るのは、AI時代における人間の役割を「判断とレビュー」と具体的に位置づけ、設計理解がそこに直結する、と説明できるかどうかです。実装を自分でやることの正当化に逃げるのではなく、AIを使いこなす前提で「指示の質」と「出力の評価」に設計知識が効く、と語れる人が高く評価されます。ここで役割を再定義できるかが分かれ目です。

関連用語:
責務分離

「Fat Controller」とは何が問題なのですか。

✗ NG回答例

コントローラーのコードが長くなって読みにくくなる状態のことです。処理をたくさん書きすぎると一つのファイルが膨れ上がってしまうので、良くないと言われています。長いと見づらくてバグも探しにくいので、なるべく短くした方がいいと思います。

✓ 加点される回答例

コントローラーに、入力の受け取りだけでなく業務ロジックまで詰め込んで肥大化した状態を指します。問題は「長い」こと自体ではなく、責務が混ざることだと考えています。コントローラーは本来リクエストを受けて交通整理するのが役割なのに、そこに料金計算や在庫の判定といった業務ルールが入り込むと、同じロジックを別の入口から呼びたくても再利用できず、コピペが増える。テストもHTTPを通さないと書けなくなって面倒になります。だから私は、業務ロジックはサービス層など別の場所に切り出し、コントローラーは薄く保つべきだと考えます。分ける目的は見た目の短さではなく、再利用とテスト容易性です。

🧭 なぜ差がつくのか

「長いから読みにくい」は表面的で、問題を行数の話にしてしまっています。採点者は、Fat Controllerの本質を「責務の混在による再利用不能とテスト困難」まで掘り下げられるかを見ています。切り出す目的を、見た目の短さではなく再利用性とテスト容易性で語れるかが分かれ目で、ここを言語化できる人は、なぜ層を分けるのかという設計の根っこを理解していると評価されます。

関連用語:
責務分離

サービス層(Service層)はなぜ必要なのですか。なくても動くのでは。

✗ NG回答例

処理をまとめておく層です。コントローラーが太らないように、ロジックをサービスに書いておくと整理されて綺麗になります。コントローラーはできるだけ薄くするのが良いとされているので、中身の処理はサービスに移すようにしています。そうするとコードがすっきりして見やすくなると思います。

✓ 加点される回答例

確かになくても動きますが、業務ロジックの「置き場所」を決めておくために必要だと考えています。たとえば「注文を確定する」処理には、在庫を減らす・支払いを記録する・通知を送る、といった複数ステップが絡む。これをコントローラーに書くと、Web画面からも管理バッチからも同じ処理を呼びたいときに再利用できません。サービス層に「注文確定」という業務単位でまとめておけば、どの入口からも同じロジックを一箇所で呼べて、修正も一箇所で済む。加えて、業務ルールがHTTPから切り離されるのでテストも書きやすい。ただし小さなCRUDまで全部サービス化すると層が無駄に増えるので、複数ステップや再利用が絡む処理に絞って導入するのが実務的だと思っています。

🧭 なぜ差がつくのか

「整理されて綺麗」は主観的な感想で止まっています。差がつくのは、サービス層の価値を「業務単位での再利用」「修正箇所の一元管理」「テスト容易性」といった具体的な効果で説明できるかどうかです。さらに「小さなCRUDまで何でもサービス化はしない」と過剰設計を避ける線引きに触れられると、ルールを盲信せず状況に応じて導入を判断できる実務感覚があると評価されます。

関連用語:
責務分離

入力のバリデーションをFormRequestに寄せるのはなぜですか。コントローラーで書いても動きますよね。

✗ NG回答例

FormRequestに書くとコントローラーがすっきりするからです。バリデーションのルールを一箇所にまとめて書けるので便利ですし、コントローラーの中がごちゃごちゃしなくて済みます。Laravelではそういう仕組みが用意されているので、それに従って書くのが普通だと思います。

✓ 加点される回答例

コントローラーの本題は「検証済みの入力を使って処理を進めること」で、検証そのものは前段の別の関心事だと考えているからです。FormRequestに寄せると、コントローラーに入ってきた時点で入力は正しいと保証されるので、本体のコードが分岐だらけにならず読みやすくなる。しかも同じ入力仕様を複数の画面で使い回すときも、ルールが一箇所にまとまっているので二重管理を避けられます。さらに、検証ルールとエラーメッセージがセットで一つのクラスに集約されるので、「この入力は何が正解か」を仕様として見つけやすい。私は、これは単なる見た目の整理ではなく「検証」と「処理」という責務を分けた結果だと理解しています。

🧭 なぜ差がつくのか

「すっきりする」だけだと見た目の話に留まり、責務分離の観点が抜けています。採点者は、検証と本処理を別の関心事として切り分けられているか、入力仕様の一元化や複数画面での再利用まで語れるかを見ています。特に「コントローラーに入った時点で入力は正しいと保証される」という契約の視点を出せると、責務の境界を意識して設計できる人だと判断され、大きく加点されます。

関連用語:
責務分離

モデルにはどこまで書くべきですか。モデルの責務をどう考えますか。

✗ NG回答例

モデルはデータベースのテーブルに対応するもので、データを取ってきたり保存したりするために使います。基本的にはDB操作を書く場所だと思っています。テーブルごとにモデルがあるので、そのテーブルに関する処理はモデルに書けばいいと理解しています。あまり深く考えたことはありませんでした。

✓ 加点される回答例

モデルは「テーブルとの対応」に加えて、そのデータ自身に関する小さなルールを持つ場所だと考えています。たとえば会員の「有効期限が切れているか」といった、そのレコード単体で完結する判定はモデルに置くのが自然です。一方で、複数のモデルをまたぐ業務手続き、たとえば注文確定のような処理までモデルに詰め込むと、モデルが肥大化して「太ったモデル」になり、Fat Controllerと同じ問題が別の場所で起きます。なので私は、単一レコードで閉じるルールはモデル、複数をまたぐ手続きはサービス層、という切り分けを基準にしています。境界は状況で揺れますが、「このロジックは誰の関心事か」を毎回問うのが大事だと思っています。

🧭 なぜ差がつくのか

「DB操作の場所」で止まると、モデルを単なるデータの入れ物としか見ていないと判断されます。差がつくのは、単一レコードで閉じるルールと複数をまたぐ手続きを切り分けられるか、そして「太ったモデル」という肥大化のリスクまで意識できるかです。責務の境界を「このロジックは誰の関心事か」という自分の判断基準として言語化できる人は、Fat Controllerと同じ問題がモデルでも起きると見抜けており、設計を横断的に理解していると評価されます。

関連用語:
責務分離

同じような処理があちこちに散らばっているコードを見つけたら、あなたはどう考えて手を入れますか。

✗ NG回答例

重複しているコードは一箇所にまとめます。DRY原則というものがあって、同じことを繰り返し書かない方がいいとされているからです。同じコードがあちこちにあると、直すときに全部直さないといけなくて大変なので、共通化してまとめてしまうのが良いと思います。

✓ 加点される回答例

まず「本当に同じ責務の重複か」を確認します。見た目が似ていても、たまたま今だけ同じで将来別々に育つ処理を無理にまとめると、かえって密結合になって変更しづらくなるからです。本当に同じ関心事だと判断できたら、その処理の性質に応じて置き場所を選びます。入力検証ならFormRequest、業務手続きならサービス層、単一レコードのルールならモデル、という具合です。共通化の目的は行数削減ではなく「変更したいときに一箇所を直せば済む状態」を作ることなので、まとめた結果として修正点が一つに集約されるかを基準に判断します。そして一人で勝手に大きく直さず、影響範囲をレビューで共有してから進めます。

🧭 なぜ差がつくのか

「DRYだから共通化」と反射的に答えると、原則を盲信していると見られます。採点者は、重複を「見た目が同じか」ではなく「同じ責務かどうか」で見極められるか、共通化の目的を行数削減ではなく「変更の一元化」に置けるか、そして将来別々に育つ処理を早まってまとめる弊害まで意識できるかを見ています。原則を状況に応じて使い分け、勝手に大きく直さずレビューに乗せる判断力まで示せる人が評価されます。

関連用語:
DB設計

マイグレーションでDBの構造を管理するのはなぜですか。直接テーブルを作ってもいいのでは。

✗ NG回答例

マイグレーションを使うとコマンドでテーブルを作れて便利だからです。手でSQLを書いたり、管理ツールでポチポチ操作したりしなくても、コマンド一つで一気にテーブルが作れるので楽です。Laravelの標準の機能として用意されているので、これを使うのが普通だと思って使っています。

✓ 加点される回答例

DBの構造の変更履歴を、コードとして誰でも再現できる形で残すためです。手で直接テーブルをいじると、その変更が本番・開発・他メンバーの環境に同じように適用された保証がなく、環境ごとに構造がずれていきます。マイグレーションなら、変更がファイルとして残ってGitで共有されるので、新しく参加した人も同じコマンドで同一の構造を再現できるし、いつ・誰が・なぜ変えたかを追える。要はアプリのコードと同じようにDB構造もバージョン管理する、という発想です。加えて、問題があったときに一つ前の状態へ戻す手順も用意されているので、チームで安全にスキーマを進化させられます。ここが「手作業で楽」との決定的な違いだと考えています。

🧭 なぜ差がつくのか

「コマンドで楽」は個人の作業効率の話に留まります。採点者は、マイグレーションの本質を「スキーマのバージョン管理」と「環境間の再現性・共有」に置けるかを見ています。環境ごとの構造のずれを防げること、いつ誰がなぜ変えたかを履歴で追えること、新メンバーが同じ構造を再現できること、といったチーム視点まで語れるかが分かれ目で、DB構造もコードと同じくバージョン管理する対象だと捉えられる人が評価されます。

関連用語:
DB設計

正規化とは何ですか。なぜ正規化するのですか。

✗ NG回答例

データの重複をなくすことです。テーブルを分けて、同じデータを何度も持たないようにする作業だと理解しています。第一正規形とか第二正規形とか段階があって、ルールに従ってテーブルを分割していきます。重複がなくなるとデータがすっきりするので、正規化はやっておいた方がいいと思います。

✓ 加点される回答例

同じ事実を一箇所だけに持つようにテーブルを設計することです。重複をなくすのが手段で、狙いは「更新の矛盾を防ぐこと」だと考えています。たとえば顧客の住所を注文ごとにコピーして持っていると、引っ越しがあったとき全部を直さないと、片方は新住所・片方は旧住所という食い違いが起きる。顧客テーブルに一箇所だけ持てば、一度直せば済んで矛盾しません。ただし実務では、正規化を突き詰めると結合が増えて読み取りが重くなる場面もあるので、性能要件によってはあえて一部を重複させる(非正規化する)判断もあります。だから私は正規化を絶対のルールではなく、「まず整合性優先で正規化し、性能上の必要が明確なときだけ崩す」という順序で考えています。

🧭 なぜ差がつくのか

「重複をなくす」だけだと手段の説明で止まり、暗記した正規形の名前を並べても本質は伝わりません。差がつくのは、正規化の目的を「更新時の矛盾防止=整合性の確保」まで結びつけられるか、そして正規化を突き詰めると結合が増えて読み取りが重くなるという性能とのトレードオフを理解し、非正規化の判断にも触れられるかです。ルールの暗記ではなく、整合性優先で正規化し必要なときだけ崩すという設計判断として語れる人が評価されます。

関連用語:
DB設計

トランザクションが必要なのはどんな場面ですか。具体例を挙げてください。

✗ NG回答例

データベースの処理をまとめて実行する仕組みです。途中で失敗したら元に戻せるので、複数の更新をするときは念のため使っておくと安全だと思います。エラーが起きても中途半端にならないようにできるので、DBを更新する処理では基本的に使っておけば安心だと考えています。

✓ 加点される回答例

「複数の更新が、全部成功するか全部失敗するかのどちらかでないと困る」場面で必要になります。典型例は送金や在庫の引き当てです。たとえばAさんの残高を減らしてBさんの残高を増やす処理で、片方だけ成功して途中で落ちると、お金が消えたり増えたりして整合性が壊れる。トランザクションで囲めば、途中で失敗したときに全部なかったことにできるので、中途半端な状態が残りません。ポイントは「途中の状態が外から見えると業務的に破綻する一連の更新」を一つのまとまりとして扱うことです。逆に、単発の更新や、失敗しても後からやり直せば済むものにまで無闇に使う必要はない。私は「途中経過が許されない更新のまとまりか」を基準に使い分けています。

🧭 なぜ差がつくのか

「念のため使う」は理由になっておらず、なぜ必要かを理解していないと見られます。採点者は、トランザクションを「全部成功か全部失敗かのどちらかでなければ整合性が壊れる複数更新」という条件で説明でき、送金や在庫引き当てのような、途中経過が外から見えると業務的に破綻する具体例を出せるかを見ています。さらに、単発の更新や後からやり直せる処理には不要だと、使うべき場面と不要な場面を切り分けられると加点されます。

関連用語:
DB設計

悲観ロックと楽観ロックの違いと、使い分けを説明してください。

✗ NG回答例

悲観ロックは先にロックをかける方法で、楽観ロックは後でチェックする方法です。どちらも複数人が同時に更新したときに競合が起きないようにするために使います。名前は聞いたことがありますが、実際にどう使い分けるかまでは、正直あまり考えたことがありませんでした。

✓ 加点される回答例

どちらも同じデータを複数人が同時に更新して壊れるのを防ぐ手段ですが、前提が逆です。悲観ロックは「衝突は起きるものだ」と考えて、更新の間そのデータを他から触れないよう先にロックする。確実ですが、待ちが発生するので混雑すると性能に響きます。楽観ロックは「衝突はめったに起きない」と考えて、ロックはかけず、更新時にバージョン番号などで「読んだときから変わっていないか」を確認し、変わっていたら弾いてやり直させる。待たないので性能に優しい一方、衝突時はやり直しの処理を用意する必要があります。だから、在庫の奪い合いのように衝突が頻繁で確実性が要る場面は悲観ロック、衝突がまれで同時実行数を優先したい場面は楽観ロック、と競合の起きやすさで使い分けます。

🧭 なぜ差がつくのか

「先にロック/後でチェック」だけだと機構の言い換えに留まり、どちらを選ぶかの基準が抜けています。差がつくのは、両者の前提の違い(衝突が起きる前提か、めったに起きない前提か)を押さえたうえで、待ちが発生する悲観ロックとやり直しが要る楽観ロックという性能面のトレードオフから、「競合の起きやすさ」で使い分ける判断軸を示せるかです。在庫の奪い合いなど具体シーンに落として説明できる人が評価されます。

関連用語:
DB設計

外部キー制約は何のためにありますか。アプリ側でチェックすれば要らないのでは。

✗ NG回答例

テーブル同士を関連付けるためのものです。設定しておくとテーブルの関係が分かりやすくなるので付けています。ただ、実際のところはアプリ側でもデータが正しいかチェックしているので、外部キー制約がなくてもプログラムはちゃんと動きます。あってもなくても大きくは変わらないと思います。

✓ 加点される回答例

存在しない相手を参照する「宙に浮いたデータ」がDBに入るのを、データベース自身に防いでもらうためです。たとえば注文が、もう存在しない顧客を指している状態はデータとして矛盾しています。アプリ側のチェックだけに頼ると、バグや別経路からの書き込み、複数アプリが同じDBを触る場合などに、抜け道からおかしなデータが入り得る。外部キー制約はDBが最後の砦として整合性を保証してくれるので、アプリのどこか一箇所がミスしても不整合が入り込みません。あわせて、参照先が消えたときに関連データをどう扱うか(連鎖削除するか、削除を禁止するか)もルールとして宣言できます。だから私は、アプリのチェックと二重でも、DB側の保証は残す価値があると考えています。

🧭 なぜ差がつくのか

「関連付け」「分かりやすい」で止まると、制約を単なる飾りとしか見ていないと判断されます。採点者は、外部キー制約を「DBが最後の砦として整合性を守る仕組み」と理解し、アプリのチェックだけではバグや別経路からの書き込みという抜け道があること、複数アプリが同じDBを触るリスクまで語れるかを見ています。アプリとDBの二重で守る多層防御の発想や、参照先が消えたときの扱いを宣言できる点まで出せると強いです。

関連用語:
性能

N+1問題とは何ですか。どういうときに起きますか。

✗ NG回答例

ループの中でクエリがたくさん発行されて遅くなる問題です。データベースへのアクセス回数が多くなると処理が重くなるので、よくないと言われています。名前は聞いたことがあって、たくさんクエリが出ると遅い、という程度には気をつけているつもりです。

✓ 加点される回答例

一覧を取得したあとに、各行の関連データを一件ずつ取りに行ってしまい、クエリ回数が件数に比例して膨らむ問題です。たとえばブログ記事を10件取ってから、記事ごとに著者を別々に問い合わせると、最初の1回に加えて10回、合わせて11回クエリが飛ぶ。件数が増えるほど線形に悪化するのが怖い点で、開発中は少数データなので気づきにくく、本番でデータが増えて初めて顕在化しがちです。原因は、関連データを「使うと分かっているのに、まとめて取る指示を出していないこと」。つまり書き方の問題であって、DBが遅いわけではないケースが多い、と理解しています。

🧭 なぜ差がつくのか

「クエリが多くて遅い」だけだと現象の説明で、なぜそうなるかが抜けています。採点者は、N+1を「1回+件数分」という構造で説明でき、件数に比例して悪化する・少数データでは気づきにくいという性質まで押さえているかを見ます。原因を「まとめて取る指示を出していない書き方の問題」と言えると理解が深いと判断されます。

関連用語:
性能

N+1問題には、気づき方と直し方の両面でどう対処しますか。

✗ NG回答例

Eager Loadingを使えば直ります。関連を先に読み込むメソッドを付ければいいと教材にあったので、N+1が起きていそうなところにはとりあえずそれを付けるようにしています。付ければクエリがまとまって速くなるらしいので、深く考えずに使っています。

✓ 加点される回答例

まず気づき方ですが、感覚ではなく「発行されたクエリを可視化して測る」ことを基本にしています。開発時にクエリログやデバッグツールで発行回数を見れば、一覧表示で件数分クエリが出ていればすぐ分かります。直し方は、関連データを最初にまとめて取るEager Loadingを使い、記事一覧と著者を二回程度のクエリで取得するようにします。ポイントは、闇雲に全部の関連を先読みするのではなく、その画面で実際に使う関連だけを対象にすること。使わない関連まで読むと、今度は無駄な取得で逆に重くなるからです。つまり「使う関連を、まとめて、必要な分だけ先に取る」。直したあとも、クエリ回数が想定どおり減ったかを再度計測して確認します。

🧭 なぜ差がつくのか

「Eager Loadingを付ける」だけだと暗記的で、気づく手段と過不足の判断が抜けています。差がつくのは、クエリを計測して発見する姿勢、使う関連だけを先読みする(読みすぎも避ける)バランス感覚、直したあとに再計測して確かめる検証の一連を語れるか。手段の名前ではなく運用として説明できる人が評価されます。

関連用語:
性能

インデックスは何のために張りますか。とりあえず全カラムに張ればいいのでは。

✗ NG回答例

検索を速くするためです。インデックスを張ると目的のデータをすぐ見つけられるようになるので、速くなるなら、とりあえず色々な列にたくさん張っておいた方がいいと思います。張って困ることは特にないと思うので、多めに設定しておけば安心だと考えています。

✓ 加点される回答例

よく検索や絞り込みに使う列を、DBが素早く探せるようにするためです。ただ「全部に張る」は逆効果になり得ます。インデックスは検索を速くする代わりに、追加・更新のたびに索引も更新する必要があるので、書き込みが増えるほど遅くなり、保存領域も食う。だから狙いは「どの列で頻繁に絞り込むか」を見極めて、そこに絞って張ることです。たとえば会員をメールアドレスで探すことが多いならその列に張る、といった具合です。実務では、遅いクエリを実測してから、その検索を助けるインデックスを足す、という順序を取ります。速くしたい読み取りと、犠牲になる書き込みのトレードオフを意識して選ぶのが本質で、闇雲に張るのは性能を落とす判断だと考えています。

🧭 なぜ差がつくのか

「速くなるから全部張る」は典型的な誤解で、副作用を理解していないことが露呈します。採点者は、インデックスによる読み取りの高速化と、その代償である書き込みの遅延・容量増加というトレードオフを押さえたうえで、「よく絞り込む列に絞って張る」「遅いクエリを実測してから足す」という判断ができるかを見ています。速くなる面だけでなく犠牲になる面まで語り、闇雲に張るのはむしろ性能を落とすと言い切れる人が評価されます。

関連用語:
性能

キャッシュやキュー(非同期処理)は、それぞれどんな課題を解くために使いますか。

✗ NG回答例

キャッシュは速くするため、キューは重い処理を後回しにするためです。どちらも処理を軽くするのに便利な機能なので、使えそうなところがあれば使うようにしています。速くなったり負荷が減ったりするので、パフォーマンスが気になるところに入れておけばいいと思っています。

✓ 加点される回答例

解いている課題が違うので分けて考えています。キャッシュは「同じ計算や取得を毎回やり直すのが無駄」なときに、結果を一時的に保存して再利用する仕組みです。頻繁に読まれるがあまり変わらないデータに向きますが、元データが変わったときに古い内容を返し続ける危険があるので、いつ破棄するかの設計とセットで初めて意味を持ちます。キューは「その場で終わらせなくていい重い処理」を切り離して後ろで実行する仕組みで、たとえばメール送信や画像変換をリクエスト処理から外せば、ユーザーを待たせずレスポンスを返せます。つまりキャッシュは無駄な再計算を減らす、キューは重い処理を体感速度から切り離す、という別々の目的です。どちらも「速くなる」で括らず、何を犠牲に何を得るかを意識して使い分けます。

🧭 なぜ差がつくのか

「速くする/後回し」だけだと表面的で、両者を同じ「便利」で括ってしまっています。差がつくのは、キャッシュが解く課題(無駄な再計算の削減)とキューが解く課題(重い処理を体感速度から切り離す)を区別できるか、特にキャッシュについては「元データが変わっても古い内容を返し続けるリスク」と、いつ破棄するかの設計まで触れられるかです。単に速くなると括らず、何を犠牲に何を得るかという適用条件まで語れる人が評価されます。

関連用語:
チーム開発

PSR-12のようなコーディング規約は、なぜ必要なのですか。動けばいいのでは。

✗ NG回答例

コードの見た目を揃えるためです。インデントや波括弧の位置などの書き方が統一されていると綺麗で読みやすいからです。バラバラだと見づらいので、決められた規約があるならそれに従うのが当然だと思っています。みんなが同じルールで書けば統一感が出て良いと思います。

✓ 加点される回答例

見た目を揃えること自体が目的ではなく、「書き方の違いに注意を奪われないようにする」ためだと考えています。人によって波括弧の位置やインデントがバラバラだと、レビューのときに本質と関係ないスタイルの指摘が増えて、肝心のロジックの議論が薄まる。規約で見た目を機械的に決めておけば、誰が書いても似た形になり、読み手は中身に集中できるし、差分も余計な変更で膨らみません。しかもフォーマッタで自動整形できるので、人間が気にする必要すらなくなる。つまりPSR-12は「好みの論争をなくして、レビューを本質だけにするための共通ルール」だと理解しています。個人の美意識ではなくチームの生産性の問題です。

🧭 なぜ差がつくのか

「綺麗だから」は個人の美意識で止まっており、なぜチームで必要かが説明できていません。採点者は、規約の目的を「スタイルの好みの論争をなくしてレビューを本質の議論に集中させる」「余計な差分でコードレビューを膨らませない」といったチームの生産性に結びつけられるかを見ています。さらに、見た目はフォーマッタで自動整形して人間が気にせず済むという運用まで触れられると、規約を実務で回した理解があると評価されます。

関連用語:
チーム開発

コードレビューでは、どんな観点を見ますか。あなたがレビュアーなら何を指摘しますか。

✗ NG回答例

バグがないか、ちゃんと動くかどうかを見ます。あとはインデントが揃っているか、変数名がおかしくないか、といった書き方の部分をチェックします。基本的には、動かない箇所や明らかにおかしいところを見つけて指摘するのがレビューだと思っています。

✓ 加点される回答例

動くかは前提として、私は「半年後の自分やチームが読んで理解できるか」を一番見ます。具体的には、責務が適切な場所に置かれているか(コントローラーに業務ロジックが漏れていないかなど)、命名から意図が読み取れるか、そして「なぜこの実装にしたか」が伝わるか、です。細かいスタイルはフォーマッタや規約に任せて、レビューでは設計判断や境界の切り方といった、人間が判断する部分に時間を使いたい。指摘するときも、断定でダメ出しするのではなく「ここはこうした方が影響範囲が狭くなると思うがどうか」と理由を添えて提案します。レビューは粗探しではなく、コードの品質とチームの理解を一緒に上げる場だと考えているからです。

🧭 なぜ差がつくのか

「動くか」「インデント」だけだと、フォーマッタや機械でも指摘できる範囲に留まってしまいます。採点者は、責務が適切な場所に置かれているか・命名から意図が読めるか・なぜその実装にしたかが伝わるか、といった人間にしか見られない設計面をレビューできるか、そしてスタイルは自動化に任せて人間は判断部分に集中する、という優先順位を持てるかを見ています。理由を添えて提案する伝え方への配慮まで語れると、チームで機能する人だと評価されます。

関連用語:
チーム開発

ブランチ運用(Gitフロー)について、なぜルールを決めて運用するのですか。

✗ NG回答例

みんなが好きにコミットすると混乱するからです。全員が同じ場所に自由に変更を入れると、誰が何をしたか分からなくなってしまいます。本番用のmainブランチを分けておくと、そこは触らないようにできるので管理しやすくなると思います。ルールがあった方が安心です。

✓ 加点される回答例

複数人が同時に開発しても、本番に出すコードの状態を安全に保つためです。全員が本番ブランチに直接コミットすると、未完成のコードが混ざったり、誰の変更で壊れたか分からなくなる。そこで、作業ごとにブランチを切って、レビューを通してからまとめる、という流れをルール化します。こうすると、本番ブランチは常にリリースできる状態を保てるし、変更が機能単位でまとまるので履歴も追いやすく、問題があったときに切り分けやすい。私はGitフローそのものより、「本番を守る」「変更を小さくレビュー可能な単位に保つ」「履歴で意図を追えるようにする」という目的が大事だと考えていて、チームの規模や事情に合わせて運用の重さは調整すべきだと思っています。

🧭 なぜ差がつくのか

「混乱するから」だけだと感覚的で、運用によって何を守っているのかが曖昧なままです。差がつくのは、ブランチ運用の目的を「本番を常にリリース可能に保つ」「レビュー可能な小さな変更単位に保つ」「履歴で変更の意図を追える」と具体化でき、かつ特定の流儀を絶対視せずチームの規模や事情に合わせて運用の重さを調整する、という柔軟さを示せるかです。決まった手順の暗記ではなく目的で語れる人が評価されます。

関連用語:
チーム開発

テストを書く意味は何ですか。手で動作確認すれば十分では。

✗ NG回答例

バグを見つけるためです。テストがあると安心できますし、書いた方がいいと一般的に言われているので書くようにしています。手で毎回確認するより、テストを流した方が確実にチェックできると思います。品質を上げるためにテストは大事だと理解しています。

✓ 加点される回答例

一番の意味は「一度直したものが、あとで壊れていないことを保証し続けること」だと考えています。手動確認は、新機能を作った瞬間は有効ですが、別の修正が既存機能を壊す退行(リグレッション)を、毎回全画面手で確かめるのは現実的でない。自動テストがあれば、変更のたびに繰り返し流して「前に動いていたものが今も動く」ことを機械に確認させられます。これは特にチーム開発で効いて、他人のコードに手を入れるとき、テストが通っていれば壊していない安心材料になり、変更に踏み込みやすくなる。もちろん全部を網羅する必要はなく、壊れると業務影響が大きい中核ロジックから優先して書くのが実務的です。テストは品質保証であると同時に、安心して変更するための土台だと捉えています。

🧭 なぜ差がつくのか

「バグを見つける」「安心」だけだと、手で確認するのとの本質的な差が説明できていません。採点者は、テストの核心を「一度直したものが後で壊れる退行の検出」と「安心して変更に踏み込むための保証」に置けるか、そしてチーム開発で他人のコードに手を入れる際、テストが通っていれば壊していない裏付けになる、という効用まで語れるかを見ています。全部は網羅せず業務影響の大きい中核から優先する、という現実感覚も加点対象です。

関連用語:
チーム開発

.env のような設定・秘匿情報は、なぜソースコードと分けて管理するのですか。

✗ NG回答例

パスワードなどをコードに直接書くと危ないからです。ソースコードにパスワードやAPIキーをそのまま書いてしまうと漏れる心配があるので、.envという別のファイルに書いておくようにしています。そうしておけば安全だと聞いたので、秘密の情報は.envにまとめる、という認識でいます。

✓ 加点される回答例

理由は二つあると考えています。一つは秘匿情報の保護で、DBのパスワードやAPIキーをコードに直書きしてGitに上げると、リポジトリを見られる全員に漏れ、履歴にも残って消しにくい。だから鍵の類はコードから切り離し、環境変数として外に置き、.envはGit管理から除外します。もう一つは環境ごとの差の吸収で、開発・検証・本番でDBの接続先などは違うのが普通なので、同じコードのまま設定だけ差し替えられるようにしておく必要がある。設定を外出しすれば、コードを変えずに環境を移せます。チーム運用としては、実際の値は共有しつつ、「どんな設定項目が必要か」の見本ファイルだけをリポジトリに置いて、新メンバーが何を用意すべきか分かるようにするのが定石だと理解しています。

🧭 なぜ差がつくのか

「危ないから.env」だけだと、なぜ分けるのかの半分しか見えていません。差がつくのは、秘匿情報の保護(一度Git履歴に載ると消しにくい怖さを含む)と、開発・検証・本番で接続先が違うという環境ごとの設定差の吸収、という二つの目的を挙げられるかです。さらに、実際の値は別途共有しつつ「どんな項目が必要か」の見本ファイルをリポジトリに置く運用まで語れると、チームで実際に回した実感があると評価されます。

関連用語:
チーム開発

マイグレーションをチームで共有するとき、どんな点に気をつけますか。

✗ NG回答例

みんながマイグレーションを実行すれば同じDBになるので、特に気にすることはないと思います。ファイルさえGitで共有できていれば、あとは各自が実行するだけなので大丈夫です。順番通りに流れるようになっているはずなので、あまり深く考えたことはありませんでした。

✓ 加点される回答例

気をつける点はいくつかあります。まず、DBの構造変更は必ずマイグレーションを通して、手作業でテーブルをいじらないこと。誰かが手で直すと、その差分が共有されず環境がずれるからです。次に、複数人が同時期に別々の変更を追加すると適用順で食い違いが起きやすいので、変更を取り込んだら早めに反映して差分を溜めない。そして本番に適用するマイグレーションは、失敗したときに戻せるか、既存データを壊さないかを事前に確認することが重要です。特に本番はやり直しが効きにくいので、大きな変更は影響範囲をレビューで共有し、必要なら段階的に適用します。要は「構造変更もコードと同じくレビューと共有の対象」という姿勢で扱うのが大事だと考えています。

🧭 なぜ差がつくのか

「共有すれば大丈夫」だと、適用順の衝突や本番適用のリスクを想像できていないと見られます。採点者は、手作業でテーブルを直さない規律、変更を早めに反映して差分を溜めない運用、そして本番適用時に「失敗しても戻せるか」「既存データを壊さないか」を事前確認する慎重さを持てるかを見ています。構造変更もアプリのコードと同じくレビューと共有の対象だとみなし、大きな変更は段階的に進める姿勢まで示せると加点されます。

関連用語:
自己経験

PHPやLaravelは未経験とのことですが、どのように学んできましたか。

✗ NG回答例

教材を一通り読んで、書いてある通りにコードを写しました。ひととおり手を動かして写経したので、基本的なことは身についていると思います。分からないところは教材を見返しながら進めたので、同じような課題であれば教材を参考にすれば対応できると思っています。

✓ 加点される回答例

正直、実務経験はまだ浅いので、限られた時間で何を身につけるべきかを絞って学びました。具体的には、細かい文法を丸暗記するより、「なぜその設計なのか」を説明できることを最優先にしました。たとえばコントローラーとサービス層を分ける理由、N+1がなぜ起きてどう直すか、といった要点を、自分の言葉で人に説明できるかを基準に反復しています。写経は仕組みを掴む入口として使いますが、そこで止めず「これは何の課題を解いているのか」を毎回問い直すようにしました。実装そのものは調べれば書けるので、私は判断と説明の土台を作ることに時間を投資してきた、というのが正直なところです。

🧭 なぜ差がつくのか

「写経した」だけだと受け身の学習に聞こえ、未経験を埋めるための戦略が見えません。採点者は、限られた時間の中で「文法の暗記」ではなく「設計の理解と自分の言葉での説明」に的を絞った学び方を選べているか、写経を目的化せず「これは何の課題を解いているのか」という理解に変換できているかを見ています。未経験であることを正直に認めたうえで、何に時間を投資したかを具体的に言語化できる人が評価されます。

関連用語:
自己経験

実装はAIに任せられる時代です。その前提で、あなた(人間)の価値はどこにありますか。

✗ NG回答例

AIは間違えることもあるので、最終的には人間がチェックする必要があります。だから、AIに任せきりにするのではなく、人間も自分でコードを書けることが大事だと思います。間違いに気づけるように、結局は自分自身の実装力を高めておくことが人間の価値になると考えています。

✓ 加点される回答例

正直に言うと、コードを書く速さではもうAIに勝てないと思っています。だから私の価値は、書く前と書いた後にあると考えています。書く前は、要件を整理して「何を作るべきか、どこまで作るべきか、何を優先するか」を決める判断。AIは指示された通りに作りますが、その指示の質は人間が決めます。書いた後は、出てきたコードが設計として妥当か、責務が適切か、性能や整合性の落とし穴がないかをレビューして責任を持つこと。つまり、AIに的確な指示を出す力と、出力を評価して採否を判断する力です。この二つは設計思想を理解していないとできないので、私は実装の代替ではなく、判断とレビューで価値を出す人間でありたいと考えて準備しています。

🧭 なぜ差がつくのか

「AIは間違えるから人間がチェック」だと、結局人間も実装できるべき、という古い前提に戻ってしまっています。採点者は、AIと張り合うのではなく「要件定義・優先順位づけ・出力のレビューと責任」という上流と検証に価値を置けるかを見ます。実装の代替を主張せず、判断力の担い手として自分を位置づけられる人が高く評価されます。

関連用語:
自己経験

開発中に自分では解決できない問題に詰まったとき、どう対処しますか。

✗ NG回答例

エラーメッセージをネットで検索して、出てきた解決策を上から順に試していきます。似たような事例が見つかることが多いので、それを真似すれば大抵は直ります。それでもどうしてもダメなときは、最終的に分かる人に聞いて教えてもらうようにしています。

✓ 加点される回答例

まず、闇雲に検索結果を試す前に「何がどう期待と違うのか」を切り分けます。エラーメッセージを読んで、どこまでは想定どおり動いていて、どこから崩れているのかを絞り込む。原因の当たりをつけたら、小さく再現できる形にして、一つずつ仮説を検証します。この段階でAIや検索も使いますが、出てきた対処をそのまま貼るのではなく「なぜそれで直るのか」を理解してから採用します。理由が分からないまま直ると、再発したときにまた詰まるからです。それでも解決しない、あるいは自分の理解を超える領域だと判断したら、抱え込まずに早めに相談します。その際も「試したこと・分かっていること・分からないこと」を整理して聞くと、相手の時間も無駄にしないし、議論が早い。詰まること自体より、詰まり方を整理できるかが大事だと考えています。

🧭 なぜ差がつくのか

「検索して試す、ダメなら聞く」だと、解決策の当てずっぽうと、最後は丸投げに見えてしまいます。採点者は、問題を切り分けて仮説を一つずつ検証する筋道を持てるか、見つけた対処を「なぜ直るのか」まで理解して採用しているか、そして相談するときに試したこと・分かっていること・分からないことを整理して相手の時間を尊重できるかを見ています。詰まったときの対処を「型」として言語化できる人が、実務でも自走できると評価されます。

関連用語: