株式会社永産システム開発 / backendエンジニア
大手転職支援サービス企業 採用支援サービスの開発
# プロジェクト概要 ## 目的・背景 某大手転職支援サービス企業の依頼により、既存のアプリケーションに対して機能の追加開発を行うというもの。 既存アプリケーションは別会社により作成されたものであり、それを引き継いで追加機能開発を行った。 (現在私が作業中のプロジェクトです。) 既存機能として、このアプリケーションが提供する機能は主に以下である。 * 企業が採用候補者に対して適性検査を受験させる機能 * その受験結果を分析する機能 ## 規模感、チーム構成、担当した役割 本プロジェクトはスケジュールに対して機能数が膨大なため、2社の開発チームが共同して実装を行った。 分担は機能ごととしており、担当する機能に対してはfrontend、backendともに実装を行った。 また、クライアント会社様で大枠の仕様は決めてくださったが、設計に落としこむ作業からは弊社側で対応した。 私が担当した業務は主に以下である。 * 面接サポートツールの実装 * 社内アンケート機能の実装(現在作業中のため、適宜追記します。) * 弊社実装チームのPM ## 使用技術 言語: Ruby、 JavaScript フレームワーク: Ruby on Rails、React.js DB: PostgreSQL インフラ: AWS # 開発・実装内容 ## 1. 複雑な条件分岐のクラス実装 ### 概要 本アプリケーションでは、面接官が面接時に資料として活用する面接シート機能が存在する。 この面接シートは、候補者の適性検査の結果をもとに、その候補者の適正を深ぼるような質問が自動で割り当てられる仕組みである。 ### 課題・問題点 この質問の割り当ては、対象となる性格特性に応じ、複雑な条件分岐を実装することが必要である。 また、定期的なメンテナンスにより、質問を割り当てるロジックの追加や改修に対応できる必要がある。 ### 打ち手・使用した技術 上記課題を解決するためには、拡張性・メンテナンス性を高められるようなクラス設計が必要である。 そこで、本機能のクラス設計は、GoFのデザインパターンにおけるStrategyパターンを採用した。 ### 成果 当初、本機能の拡張性に関しては特に言及されていなかったが、クライアント様へのヒアリングをもとに定期的なメンテナンスによる追加・改修が想定されることがわかった。 そこで、上記のように、Strategyパターンを使用したクラス設計を採用することにより、今後の想定される拡張に対し柔軟な構造に仕上げることができた。 クライアント様からは、アプリケーションの長期運用まで想定した設計を提案・実装したことについて、好評をいただけた。 ## 2. 面接シート作成の非同期化 ### 概要 上述の面接シート作成は、複数の受験者の面接シートを複数件一括でも作成できるという要件があった。 ### 課題・問題点 面接シートに対して質問を割り当てる処理はそれなりの計算量があるため、一括作成時にレスポンスが遅く、ユーザビリティが低下することが考えられた。 よって、面接シートの作成処理を非同期化することを提案させていただいた。 また、非同期化に伴い、面接シート作成画面において、現在非同期で作成中の処理があるか否かをフィードバックする処理の実装も合わせて提案させていただいた。 ### 打ち手・使用した技術 非同期処理でデータを作成するところまではsidekiq gemが標準的にサポートしているが、現在作成中の非同期処理が存在するか否かをユーザーごとにチェックして、フィードバックを返すことは標準的な実装ではない。 そこで、sidekiq gemが内部で使用しているmoduleをいくつか流用し、特定のユーザーが面接シートに関する非同期処理のjobを持っているかチェックし、Ajaxでフィードバックする仕組みを自作した。 この際、sidekiqが持つjobの状態や、どこまでのテストが書かれているか等、gemの深い読み込みを行い、アプリケーション側で自動テストする際に網羅的で漏れのない検証を行えるようにも工夫した。 ### 成果 当初、面接シートの一括作成時におけるユーザビリティの低下は考慮されていなかった。 しかし、ユーザビリティを向上させるために非同期化に対応、更に適切なフィードバックを返すことを提案し、実現できた。 クライアント様からは、仕様には書かれていない部分にまで配慮した設計を提示できたことに好評をいただけた。 # 本プロジェクトを通して学んだこと * Railsのデザインパターンである、Serviceクラスを用いた、modelからのビジネスロジックの分離。 * sidekiq gemや非同期処理の深い理解 * RailsにおけるAjax通信 * capistrano gemを用いたデプロイ運用 * PMをやりながら実装を並行して進める際のリソース配分等