[決定版]未経験エンジニアの技術面接質問事項15選

#はじめに
**「頭で分かっていても、言葉にできていなければそれは理解ではなく暗記」**という誰かの名言にはっとさせられたので、改めて技術面接で聞かれそうなことをこちらで言語化していきます！

なお、できる限り簡潔かつ詳しく？答えられるようにしてますので、正確でないものもあるはずです。ガチの詳細は各自ググってください！

#質問内容

##Rubyのいいところは
オブジェクト指向を採用しており、保守、運用に秀でており、インタプリタ方式なのでデバッグも容易です。また、動的型付け言語かつ**シンプルな構文が多いので記述量少なくあらゆる実装**を行うことができます。

##MVCの仕組みについて教えてください

MVCとは、**プログラミング手法のアプローチ**の一種でRuby on Railsでも採用されています。
Webアプリケーションを動かすために必要な処理の一部を分類し分けることで、**保守性、可読性の高いコードを維持できます**。


- 「V」を表すViewで表示される見た目の部分を整えます。
- 「M」を表すModelでアプリケーションにおけるビジネスロジック(データベースから取得してきた値を加工するメソッドや、レコード検索の条件が書かれたメソッド、データを保存する前に加工するメソッドなど)を定義します。
- 「C」を表すControllerでクライアントからのリクエストに対して適切なレスポンスを返すことや、そのレスポンスに必要なデータの用意を行います。

##AWSとは何ですか？
Amazon Web Servicesの略で、Amazonが提供するクラウド型Webサービスの総称。
その中の有名なサービスの1つであるEC2は、クラウド上にサーバを用意でき、自社にサーバ本体を置く必要がなくなるサービスです。

##Ruby の「include」とは何ですか？
moduleをクラスに含めるメソッド。
例えば、moduleAをclassBにincludeすると、moduleAに含まれているメソッドをclassBのインスタンスが使えるようになります。

##エラー解決はどのように行いますか？
まず、起こっている**エラーのログ**を見ます。undefind methodといったよく見るエラーであれば、自力で対処します。
そうでないものは、**仮説を立てた上で**、どこで何が起きているかなど課題を最小単位までに分解してエラー原因を模索します。あまり見たことがないエラーについては必要に応じて検索します。

##オブジェクト指向とは何か
オブジェクト指向とは現実世界を正しく捉えることで、プログラムの動作を属性値とメソッドを持ったパーツの組み合わせで実現するという考え方。
（パーツの特徴を定義するのがclass、そこから作られる実際のパーツはインスタンスと言われます。）

[参考記事](https://eng-entrance.com/what-oop#:~:text=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A8%E3%81%AF%E3%80%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0,%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8C%E9%9B%A3%E3%81%97%E3%81%84%E3%80%82&text=%E3%81%A8%E8%A8%80%E3%82%8F%E3%82%8C%E3%81%A6%E3%82%82%E3%82%8F%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E3%82%82%E3%81%AE%E3%81%AF%E3%82%8F%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E3%80%82)

##参照渡し、値渡しの違いについて教えてください
参照渡しの場合は、わかりやすく言えば元の変数の置いてある場所を書いた紙を渡すやり方なので、仮引数の変更は実引数にも影響します。
一方、値渡しの場合は、元の変数をコピーして渡すので、仮引数に変更を加えても実引数には影響がありません。

[参考記事](https://wa3.i-3-i.info/diff345programming.html)

##アジャイル開発の利点を挙げてください
アジャイル開発の一番の利点は顧客の要望に臨機応変に対応できることです。イテレーションという「計画」「設計」「実装」「テスト」からなる一つのサイクルを1~2週間で、すばやく繰り返す変更に強い開発手法のこと。


##DBの正規化とは何か
正規化とは、データベースの構造を効率的でシンプルな形にすることです。

|  正規系の段階 |  概要  |
| ---- | ---- |
|  非正規形 |何もしてない  |
|  第一正規形  |  重複するカラムや値を分離  |
|  第三正規形  |  情報が混在するエンティティの分離  |


##SQLとは何
"SQLとは、Structured Query Languageの略で、リレーショナルデータベース管理システム（RDBMS）と対話するための言語です。
###（プラスα）SQLで具体的にどのようなことができますか？
データベースやテーブルの「作成/更新/削除」やデータの「登録/更新/削除/検索」、またデータを特定するための条件を指定することができます。

###(プラスα)SQLの基本構文を教えてください
CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT

##ログイン、ログアウトの仕組みを説明してください
認証にメールアドレスとパスワードを利用する場合、ログインはユーザ情報を保存しているテーブルからユーザが入力したメールアドレスとパスワードがマッチするデータがあるかどうかを判定します。
ログアウト時にはログイン時の保存されるセッションデータを削除することでログイン状態を解除するという仕組みです。　　

##クッキーとセッションの違いを説明してください
Cookie（クッキー）は、Webページなどで、ブラウザに情報を保存するための仕組みの1つです。
クライアントコンピュータが、あるWebサーバーに初めて接続した際に、Webサーバーがクライアントコンピュータの中に、そのWebサーバー専用のCookieファイルを作成し、次回、クライアントコンピュータが同じWebサーバーに接続したときには、WebブラウザがそのCookieをWebサーバーに送信するといった仕組みをとります。

セッションとは、通信の開始から終了までを指します。クライアントとサーバーで通信を行う場合であれば、クライアントからサーバーへ接続した時点でセッションが始まり、サーバーから切断するとセッションが終了します。この一連の流れを管理することをセッション管理と言います

[参考記事](https://www.ntt.com/bizon/glossary/j-s/session.html)

##ブラウザにURLを打ち込んでサイトが表示されるまでの仕組みを教えてください
初めに、DNSサーバにアクセスし、WebサイトのIPアドレスを特定し,そのIPアドレスを持つサーバーに対してhttpリクエストを送信します。
サーバーがそのhttpリクエストを元にクライアントの要求を承認すると、サーバーはクライアントに“200 OK”というメッセージを返します。承認が行われるとサーバーからWebサイトの情報がデータパケットという形で転送されてクライアント側に表示されるという仕組みです。

##viewを作成するときにエンジニア目線で気をつけていることはありますか？
保守性・メンテナンス性の高いコードを書くように気をつけています。具体的には、BEMという方法論を使ってフロントを設計することで可読性、再利用性の高いコードを実現できるように心がけています。

###BEMとは？
BEM とは、命名規則の一種で、モジュラーでメンテナンス可能なスタイルを書くことができます。
[参考記事]（https://frasco.io/5-reasons-to-use-bem-f5ca38f748a1）

##データベースのトランザクションについて説明してください
トランザクションとはデータベースに対して行われるワンセットになった処理のまとまりのことです。


#おわりに
どうでしょうか？言語化できましたか？
しっかりと言語化して他人につたえられるようにしましょう！