👏

面談時対策(面談時の質問と解答例)

2023/02/22に公開

質問内容

アクティブレコードの経験はありますか?

  • ございます
  • CRUD操作全般
  • バリデーションの追加
  • 画像系の処理(imageマジック)
  • リサイズの処理
  • 画像の削除の実装
    など

記事
https://qiita.com/penguin_note/items/adb0b9bf7c13c1b1d44d
(Rails触っていれば全員あります。)

React.jsの実装経験はありますか?

はい、React.jsの実装経験があります。

最近のプロジェクトでは、顧客管理と注文一覧のフロントエンド部分を担当しました。
(何ができるか?例(一覧をリアクトで作った。CSVの実装も行いました。))
具体的には、Railsをバックエンドとして使用し、JSON形式でデータをフロントエンドに送りました。Reactでテーブルコンポーネントを作成し、Ajaxで動的にデータを取得しています。

Reactのstateとpropsを活用して、データを効率的に管理・表示していました。このプロジェクトは私にとってReactの初めての実装であり、一部は手こずりましたが、リサーチと実践を通じて、ほぼ独力で実装を成功させました。

どんなシステムか?を作っているのかの説明。(具体的に画像の説明)

仕様書で気をつけていたことは?

  • 5W5hを明確化してから書くことを意識しておりました。

  • 仕様書を作成する際、私は5W1Hの考え方をベースにして明確化して書くことを重視しています。具体的には、
    その機能でユーザーが何ができるのか(What)
    誰がその機能を使用するのか(Who)
    どの画面や状況でその機能を使うのか(Where)
    その機能が必要とされる背景や理由は何か(Why)
    いつまでにその機能を完成させる必要があるのか(When)

  • これらの要点をクリアにした上で、補足情報とともにタイトルや関連する画面の情報を添えて仕様書を整理することを気をつけています。

  • なんの仕様書を書いたか?

  • 労務管理システムで

    • 身分写真2というカラムを追加したさいの影響範囲に関しての仕様書を作成致しました。
  • これにより、開発者や関係者が仕様書を読む際に、機能の背景や目的、使用方法を明確に把握することができるようなります。

  • 開発者以外の人が見ても気を使ってます!

印象に残ったレビュー

印象に残ったロジック

はい。
私が特に印象に残ったロジックは、検索機能のテストコードです。以前勤めていた現場で、検索に関する多数のテストケースが用意されていました。具体的には、前方一致、後方一致、両方一致、完全一致といった基本的な検索条件から、さらにはSQLクエリを直接入力した場合の挙動に至るまで網羅的にテストされていました。

網羅的(もうらてき)なテストによって、コードの堅牢性(けんろうせい)が高まるだけでなく、未来のリグレッションも効率的に防ぐことができると感じました。
テストケースの設計にどれだけ多角的に考えるべきかを学びました。

以前の現場で新規機能で、一覧系の実装で
フロントとサーバーで分かれていたので、フロントからJson形式でリクエストを送りサーバー側でレスポンスで受け取る処理が印象的でした!

RailsのMVCで完結する現場経験しかなく、初めての実装でしたので、仕組みなどのキャッチアップに苦労しましたが、実際に動いて、常駐先のお客様が喜んでいたことも印象的です。

苦労したことはなんですか?

はいございます!
特に直近の案件で新規機能の一覧系の実装で、フロントエンドとバックエンドが分かれていたため、JSON形式でのリクエストとレスポンスのハンドリングの実装に初めて取り組んだことです。
これまでRailsのMVCで完結するような開発しか経験していなかったので、その仕組みに対する理解に時間がかかりました。

また、Reactの実装ではJavaScriptを「ゴリゴリ」と触るのが初めてで、propsやstateの管理など、デバッグしながらデータを確認する過程も大変でした。

さらに、以前の保守案件では、1つの実装に対して50~100通りものテストケースを自ら設計し、テストコードを書く作業は苦労しました。

しかし、これらの経験が私を成長させてくれました。
新しい技術スタックやアーキテクチャに対応できる柔軟性、デバッグスキル、高品質なテストコードを書く能力など、これらの苦労が今の私のスキルセットを形作っています。

  • 共同開発でのGitの扱い方
  • 文章でのコミュニケーション
  • Where文でデータを絞る事
  • なにを絞ってきたら良いのかがわからない・
  • フロントとサーバー側が分かれていた時のAPI通信処理
  • テストコードの実装
  • バッチ処理(Rakeタスクファイルの作成) など

バッチ処理はどういった実装をしましたか?

  • お知らせメールを規定の時間に送受信を行う実装を行いました。
  • 4ファイル程作成し、Rakeタスク内の処理の実装を行いました

実装時気を付けていたことは?(コードレビューの質問でも使える)

実装時にはいくつかのポイントに特に気をつけています。

  • 再利用性: できるだけ再利用可能なメソッドを作成するよう心がけています。
  • 可読性:
    • コメントは誰が見てもわかりやすいように、そして誤字脱字がないように注意しています。
    • なぜ?その処理を書くようにしてるか?を見てます。
  • コードフォーマット: prettierやRubocopを必ずpush前に実行して、コードの整形を行います。
  • 命名規則: 重複したメソッド名がないか、またわかりやすいメソッド名を使用しているかを確認します。
  • リファクタリング: メソッドが長くなり過ぎていないか、メソッド化できる部分がないかを常に考慮します。
  • パフォーマンス: 無駄な処理が入っていないか確認します。
    • SQLとincludeとegalordを使い分ける
      • アクティブレコードで実装していて、SQLを見るようにしてました。
  • Todoコメント: 実装中や未完成の部分には、Todoのコメントを残しています。
  • コードの最適化: Rubyのコードがさらに削減できないかを検討します。

これらの点に気をつけることで、コードの品質を確保し、チームメンバーがレビューしやすく、また後からメンテナンスしやすいコードを目指しています。

案件を選ぶ際の優先順位は?

  • 雰囲気
    • 向上心のある方々に囲まれた雰囲気
    • チーム内でコミュニケーションは取りやすい環境か?
  • 内容
    • 新しい言語や未経験の言語をチャレンジさせて頂ける現場
    • (バックエンドだけでなく、フロントエンドやインフラをやらせていただけるところ)
    • 仕様書や設計書なども積極的に書いていきたいです。

実装中に困ったことをどういったように解決したのか?

  • まずは、できるだけ調べるところは調べます。
  • (業務時間外でキャッチアップします!)
    • あまりにも、わからなかったら、以下にします。
  • ハドルや、スラックなどを使って、「わからない場所」と「調べた箇所」をまとめてから現場の方に質問して解決しておりました。
  • GitHubに細かくPushを行い、一つ一つの処理に、コメントを残し、質問をしておりました。
  • Qiita記事や、Notionにまとめてシェアをしておりました。

質問の中で意識していたことは?

  • 結論からゆっくりとした口調で話す事を意識しておりました。
  • 質問テンプレートを作成し、メモ帳に貼り付け、それに沿って質問しておりました。
  • ツールやメールでは引用を必ず使っておりました
  • Slackでは質問の内容ごとにグレーで囲うなど工夫をしておりました。
  • 1時間置きに途中経過を報告

PCは何を使っているのか?

  • Windows
  • Mac

テストコードを書いた事はあるのか?

はい、テストコードの作成経験があります。
特に最近の案件で、注文や顧客一覧ページのテストを担当しました。具体的にはHTTPリクエストの正確性や、ページング処理のテストを行いました。

一覧表示のテストでは、ページごとのアイテムの最大数と、各ページで取得されるデータが正確かどうかを検証を行い、
検索機能のテストでは、名前などの検索条件に対して、前方一致、後方一致、中央一致、空の条件、そしてSQLインジェクションが実行されないかといった多角的なテストを行っていました。

テストコードで気をつけていたことは?

  • テストコードを書く際に特に気をつけていたことは、全体的なテストの網羅性と品質を確保することです。まず、単体テストの仕様をスプレッドシートに洗い出し、それに基づいてテストケースを設計していました。このスプレッドシートにはチェックボックスを配置し、テスト観点が漏れないように細心の注意を払っていました。

また、テスト仕様書自体もレビューを必ず受けていました。これにより、他のメンバーの視点を取り入れ、より堅牢なテストコードを書くことができました。

- 基本的な関数
	- letはインスタンス変数やローカル変数をletという機能で置き換え
	- describeには、テストの対象のメソッド名記述する。
	- contextに、特定の条件が何かを記述する。(なんの値を渡された時か?)
	- exampleには、アウトプット(どのようなことが起きているのか?)

リクエストスペックとシステムスペックの使い方の違いは理解しているのか?

  • リクエストスペック

    • APIのテストや、コントローラのアクションが期待通りに動作するかをテストするためのもの
  • システムスペック

    • ユーザーインターフェース全体のフローをテストする場合や、JavaScriptの動作を含むUIをテストする

仕様書は何を意識して書いたか?

  • 仕様書は誰でも理解しやすいように意識しました。
    具体的には、
    図形描画(ずけいびょうが)などの視覚的な要素を用いて、複雑な情報を直感的かつ分かりやすく伝える方法を採用しました。また、Googleスプレッドシートの図形描画機能を活用することで、チームメンバーが容易にアクセスし、必要に応じて編集やアップデートを行うことができるようにしました。
    誰が見ても明確に理解できるように心掛けました。

あとは、各自書いたことなどを伝えると良い

以下は、参考まで。

  • 仕様書を作成する際の焦点

ユーザビリティとアクセシビリティ: 仕様書は誰でも理解しやすいようにデザインしました。これには、図形描画(ずけいびょうが)などの視覚的な要素を用いて、複雑な情報を直感的かつ分かりやすく伝える方法を採用しました。また、Googleスプレッドシートの図形描画機能を活用することで、チームメンバーが容易にアクセスし、必要に応じて編集やアップデートを行うことができるようにしました。

明確性と簡潔性: 仕様書内の記載は、専門的な用語を適切に使用しつつも、誰が見ても明確に理解できるように心掛けました。重要なポイントは簡潔に、しかし必要な情報は省略せずに伝えるようにしました。これにより、チームメンバーや関係者が迅速に情報をキャッチし、適切な判断やアクションを取ることが容易になります。

詳細性と正確性: さらに、プロジェクトの成功に不可欠な詳細情報を、細部にわたって正確に記載しました。これには、特定の機能の要件、実装のための具体的なステップ、期待されるアウトプットなど、プロジェクトに関わる重要なデータや手順を含みます。細かい部分まで正確に記載することで、ミスのリスクを減らし、プロジェクトの進行をスムーズにすることができます

javascriptは書けるか?

  • はい!Reactかけますので、javascriptも書けます。
  • 前回の案件で、フロント側がReactとサーバ側がRailsでやっていたので書けます!
    • 各商品の売上を排出し、CSVでエクスポートする実装をJSで行いました
      - 注文の実装を担当しまして、各注文を一覧で出力することやそれをCSVインポートすることを行いました。

AWSは触ったか?

  • ございませんがCloud Watchでログを見て、バグを修正した事はございます

コードレビュの経験はあるのか?

はいございます!

  • 重複した処理はないか?
  • メソッド名は分かりすいか?
  • テストコードで漏れがないか?
    • 条件が間違えてないか?誤字脱字はないか?
    • テストケースのパターン(できるだけ気をつけてるように見てます。)
  • Todoコメントが必要な時には記載してあるのか?
  • 無駄な処理は入ってないか?
    • SQLまで見てます
  • インデントは揃っているのか?
    などを重点的に見ておりました

  • コメントアウト誰が見てもわかりやす記述してあるのか?(誤字脱字がないか?)

  • Rubyのコードが削減できないか?

  • バグがないか二重チェックを必ず行う。

  • パーシャルファイル内で、インスタンス変数を使わないように

    • 部分テンプレートの再利用性が低くなるため
  • インデントがそろっているのか?

  • CSSのClassと波かっこの間はスペース空いているのか?

  • 最後の行は改行されているのか?

  • n+1問題は大丈夫か?

    • ループ処理の中でその都度SQLを発行してしまいパフォーマンスが低下してしまう問題のことです。例えると、スーパーで商品を1点お会計して再び並ぶの繰り返しをした書き方。
      上記をまとめてお会計するようなコードを書くように考慮しているか?という観点で見ていました。
      記事(n+1)
      https://qiita.com/hirotakasasaki/items/e0be0b3fd7b0eb350327

  • preloadとeager_loadを使い分けることを意識しておりました。
    「ActiveRecordを介して発行されるSQLに気を配るようにしています」

興味がある技術は?

  • React

  • Vue.js

  • Go言語です。
    私が特に興味を持っている技術はGo言語です。Go言語は非常に多用途で、高いパフォーマンスと効率的なシステム開発が可能です。それだけでなく、YouTube、ぐるなび、さらにはドローンの開発にも使われていると聞き、その多様性と拡張性に驚きました。特に、ドローン技術は未来の多くの産業で重要な役割を果たすと考えており、
    Go言語でのドローン開発については大変興味深いです。

追記
これまでの経験では機械やネットワークの開発には直接携わったことがありませんが、将来的にはプログラミングで機械を制御するようなプロジェクトに挑戦したいと考えています。

特に、多用途なプログラミング言語を使って、物理的なデバイスやネットワーク機器を動かすことができると思うと、非常にわくわくします。

なんの言語やフレームワークで使っている

  • バージョンRuby2.6.6
  • rails6.0.4.1

リモートでの開発経験は?

  • ございます
  • 1回目と2回目と4回目の案件がリモートでした

目指しているエンジニア像は?

  • フルスタックエンジニアを目指しております。
  • Rubyだけでなく様々な言語の実装や上流工程も行えて、信頼が厚いエンジニアを目指しております

なんでIT来たの?(深い所を聞きたい!)

案1

  • 知り合いのエンジニアの方がリモートワークのフリーランスをやっており、憧れていたため、プログラミングの勉強を行い、IT業界にきました!

案2

  • SNSをよく使っており、

    • 投稿や、コメントやメッセンジャーなどの仕組みが気になったのがきっかけです。
  • 通帳アプリを使用しており、

    • 銀行に行かなくても残高が見れる事に興味を持ち、仕組みが気になった事がきっかけです
  • 前職である介護アプリを使っており、利用者様の健康状態、年齢、性格などがわかりやすく管理してあり、作る側に回りたいと思ったからです

現場で苦労した事エピソードなど

  • テスト仕様書、テストコードの作成。
    - 前回の現場で、観点ベースで多量に書いたこと
    - 自主学習や、記事を作成して、エンジニアコミュニティでアウトプットすることで、徐々に覚えていきました。
    • サーバー側とフロント側の連携の仕組みの理解
      • RailsのMVCしか触ったことがなかったので、エンドポイントや、リクエスト、レスポンスを使って、送る処理のキャッチアップに少々時間がかかりました。

  • スマホとPC時のレスポンシブ対応をするのが難しかった。
  • Get、Postの違いがわからなかった。
  • OpenApiの仕組みが難しかった。
  • Reactの仕組み。(なぜ動いているのかが理解できなかった)
  • パラメーターの階層の理解
  • アソシエーションの理解
  • n+1問題の理解
  • hidden_fieldの使い方
    • フォームから入力させないまま、値を受け渡したい時に使用するもの理解が大変
      名前をformに入力しなくてもパラメーターに入力しなくても送る時に使いました。

Railsのレベルは?

  • CRUD操作、アソシエーション、MVCアーキテクチャに関しては習熟しており、これまでのプロジェクトでエラーなく効率的に実装できました。
  • また、テストコードの記述も行えます!特に単体テストや統合テストにおいて細かいケースを網羅するよう心がけています。

実装での長所は?

  • 私の実装における長所は、バックエンドからフロントエンドまで幅広い技術スタックに精通している点です。具体的には、「CRUD操作」、「アソシエーション」、そして「MVCの扱い方」においては、サクサク実装できます。また、フロントエンドとサーバー間の連携処理にも慣れています。

最近では、コードの再利用性とメンテナンス性を高めるため、メソッドを工夫して整理しています。特に、ファットコントローラーが生じる問題を避けるために(View_helperやデコレーター)、ロジックを適切に再利用できるように工夫しています。

さらに、品質を確保するためにテストコードも細かく書くようにしています。これによって、後々のリファクタリングや機能追加が行いやすく、チーム全体の生産性を高めていけるところです!

DDDの開発やったことあります。

短所

  • 他システムとのAPIの連携の処理の経験がまだないので、調べながら行うので、時間が少々かかると思います。

外部連携の実装経験?

  • フロントとサーバー側のAPI処理
  • ラインAPI
  • グーグルAPI
  • YouTUBEAPI
  • フロントとサーバーを繋ぐためのAPI
  • S3
  • ラインの通知機能 など

Railsの魅力は?

  • 学習がやりやすい
  • 少ない記述で済むのでそれだけ開発期間を短縮できる。
    • アクティブレコードを使って、メソッドの定義などを短縮できる
  • RubyGemsなどのライブラリを活用すことで少ない人員で開発できる。
  • 読み易いコードのためメンテナンスが容易になる。

Railsのデメリットは?

  • Railsのみの学習だと、簡単にシステムが作れてしまうがゆえに、基礎レベルの低下により、新しい言語の習得が遅れてしまう危険性がある。

  • 処理速度が遅い
    - インタプリタ方式が採用されているため、速度を気にしないアプリケーションを作成する時に利用される方式

  • 汎用性が高すぎるが故に自由度も高く、エラーの特定がしずらい

  • コードの修復がしにくい

    https://kredo.jp/media/what_is_ruby-on-rails/

セキュリティ面で気をつけていたことは?

  • セッションに期限を設定する事
    • PCでユーザーがアプリからサインアウトし忘れた場合に、何者かにユーザーセッションをハイジャックされる状況を防止するためには、セッションをできる限り早期に無効にするべきです。
  • アカウントロックの仕組みを作ること
    • ユーザーがパスワードを5回以上間違えた場合にアカウントロックを10分指定

知っているセキュリティの種類は?

  • 情報セキュリティ
    • 「機密性」「完全性」「可用性」を維持することです。
      • 機密性とは、アクセスを認められたものだけが、その情報にアクセスできる状態を確保すること、つまりは関係のないものに情報を見せないことを意味する。
      • 安全性とは、情報が破壊、改ざん、消去されていない状態かを確保する事を意味する。
      • 可用性とは、必要な時はいつでも情報にアクセスできる状態を確保することを意味する。
    • 情報とセキュリティの記事
    • https://zenn.dev/takaya314/articles/dc8120b185fbd1

DBは触ったことあるか

  • ございます。
    - 以前の案件で、PHPアドミンを使用しておりました。
    - 直近の案件ではシークォエル プロを使っておりました。
    本番環境のDBで、お客様の要望に応えて、SQLを記述して、データを更新した経験もございます。
    (3回目の案件で、契約書の内のデータを変更した際にデータ移行する。)
    Rakeタスク内にSQLを記述。

自己学習やRails以外の経験などはいかがでしょうか?

  • 直近ではReactの経験もございます。
    フロント言語を含め上流工程にも興味があり、将来的にはフルスタックエンジニアを目指していきたいと考えております

Reactについて

コンポーネントとは何か?

  • コンポーネントはReactの基本的な構造要素で、UIを構築するために用いられます。それぞれのコンポーネントは独立して動作し、必要に応じて他のコンポーネントとデータをやり取りします。

propsとstateの違いは?

  • propsは親から子へとデータを渡すために使用されます。
  • stateはコンポーネント内で管理される動的なデータです。

Reactのライフサイクルメソッドについて説明してください。

  • クラスコンポーネントにおいては、componentDidMount, componentDidUpdate, componentWillUnmountなどのライフサイクルメソッドがあります。それぞれのメソッドがコンポーネントの異なるライフサイクルステージで呼ばれます。

React Hooksについて説明してください。

  • React Hooks(useState, useEffect, useContextなど)は関数コンポーネントにステートやライフサイクルのような機能を追加するためのAPIです。

  • useState
    このHookを使うと、関数コンポーネント内でステートを持つことができます。

  • useEffect
    このHookを使うと、関数コンポーネント内で副作用(データの取得、購読、手動でのDOMの操作など)を行うことができます。

  • useContext
    このHookを使うと、関数コンポーネント内でReactのコンテキストを使うことができます。

JSXとは何か?

  • JSX(JavaScript XML)は、JavaScript内でHTMLのような構文を用いてコンポーネントを記述するための言語拡張です。

Virtual DOMとは何か?

Virtual DOMは、実際のDOMとは独立したメモリ上の表現であり、Reactが高速なUI更新を実現するための核心的な概念です。

key propの重要性は?

  • keyはReactが要素のリストを効率よくレンダリングする際に使用されます。各要素に一意のkeyを割り当てることで、Reactは変更、追加、削除を効率的に行います。

Reactでのイベント処理について説明してください。

Reactのイベント処理はJavaScriptのDOMイベント処理と似ていますが、Reactは独自のイベント処理システム(合成イベント)を持っています。

条件付きレンダリングとは何か?

  • 条件に応じて異なるコンポーネントや要素をレンダリングすることです。if-elseステートメントや三項演算子がよく用いられます。

高階コンポーネント(HOC)とは何か?

  • 高階コンポーネント(High-Order Component, HOC)は、コンポーネントを引数として取り、新たなコンポーネントを返す関数です。
    このような基礎的な質問に対して明確かつ具体的に答えられる能力は、Reactの理解度を測る一つの指標となります。

担当業務について

<担当業務>

ダッシュボード画面実装

  • 新規実装で、各商品の当月と週と1年の合計売り上げをダッシュボードに表示させる実装を行っておりました
    売上を計算するメソッドや、ダッシュボードのエンドポイントなどを作成いたしました。

顧客一覧画面実装

  • 新規実装で、各顧客データの取得、テーブル作成、検索機能の実装を担当しました。

顧客詳細詳細画面の実装

  • 顧客の詳細画面の実装を行いました。
    詳細画面内での各顧客情報の更新。
    紐づいている注文の編集画面のモーダル表示の実装を行いました。

フィルター機能実装

  • 新規実装で、検索用のエンドポイントを加えて、フロントから、飛んでくるパラメータで条件をつけて、Like検索を行っておりました。

注文一覧実装

  • 新規実装で、各注文データのJson形式で取得、テーブル作成、検索機能の実装を担当しました。

検索機能実装

  • 観点ベースで、単体仕様書を作成後に各顧客や注文の検索機能を担当しました。

テストコード実装

  • 単体仕様書を参考にしながら出戻りのないように行っておりました。

DB追加

- 顧客グループDBの追加を行いました。(migrationで行う)

RDBを改善するために何をしてたか?

  • 一連の処理をtransactionに加えて、必ず全ての処理が完了

  • 処理が遅いは?
    バックグランド処理にする。
    jobを積む

DBのテーブル数

  • 50くらい

Discussion