# プロジェクト1: マッチングアプリ開発プロジェクト
## 概要
自社サービスで運営しているマッチングアプリの開発プロジェクト。
サービスの改修や新規機能追加が主な開発業務。
## チーム情報
- エンジニア
- エンジニアマネージャー: 1名
- メンバー: 4名(含む: 私)
- デザイナー: 1名
- ビジネスサイド
- プロダクトマネージャー: 1名
- ディレクター: 4名
- マーケター: 2名
その他、SREチームやカスタマーサポートなど。
# 開発内容1: デート中の男女のコミュニケーションサポート機能
## 機能概要
男女にお互いのアプリ上のQRコードを読み取ってもらい、コンテンツやクーポンを表示するなどして、デート中のコミュニケーションサポート機能
## 開発の流れ
- 企画から仕様策定まで
- 企画の草案はディレクターから起案された
- 機能の検討は私を含めたエンジニア2名で調査から担当
- 仕様の擦り合わせは、ディレクターと私を含めたエンジニア2名で行う
- 設計から実装まで
- API設計, DB設計の草案は私が作成し、エンジニアマネージャーにレビューいただいた
- 実装は2名で担当し、私がフロントを7割, バックエンド3割を担当
## 苦労した点
### 1. 機能自体の検討からエンジニアが担当
- QRコードを利用した機能についてディレクターサイドの知見が浅かったため、企画の詳細部分についてはエンジニアへ依頼された
- QRコード自体の仕様から調査し、どのような機能にできるかを検討
- セキュリティ面に関しては、機能の実態を勘案して、どの程度まで許容できるかを検討
- なるべく早く実装したいという要望があったため、既存テーブルを利用して最小限の工数で済むような設計を行った
### 2. QRコードの読み取りが未実装であった
- アプリ内にQRコードの読み取り機能が未実装であったため、ライブラリ等の調査・比較検討から行なった
## 使用した技術
バックエンド: Ruby on Rails, フロントエンド: Vue.js
- QRコードの生成には、バックエンドにてRubyのGem(ライブラリ), 読み取りにはフロントエンドにてJavaScriptのライブラリ(jsQR)を使用した
- どちらもGitHubでのスター数が多く、メンテナンスも活発であったため採用した
- `Barcode_Detection_API`というWeb APIの利用も検討したが、Experimentalであり、対応ブラウザが限られていたため断念した
- 対象ユーザーかどうか等のバリデーションについては、バックエンドにて実装済みであったキャンペーン機能などを流用した
# 開発内容2: eKYCを利用した本人確認機能
## 機能概要
外部のeKYCサービスを利用した本人確認機能。マッチングアプリは業者による悪質な利用が多いため、本人確認機能の実装が求められていた。
## 開発の流れ
- 企画から仕様策定まで
- ディレクターから起案
- 複数のeKYCサービスを比較検討したため、その際の技術的な検討は私が行った
- ネイティブアプリでの挙動に関しては、ネイティブ担当の委託エンジニアと調査・動作確認を行なった
- 設計から実装まで
- DB設計、API設計等を含め、私が担当
## 苦労した点
### 1. 外部APIを使う際の各種設定
- API利用には、APIキーの発行や、SSL証明書の設定が必要であった
- 本番やステージング環境を含めた各環境サーバーに、APIキーの設定やSSL証明書の配置を行う
- API利用に関わるロジックをサービスクラスに切り出し、このAPIをアプリ内で汎用的に利用できるようにした
### 2. どの程度の柔軟性を持ったDB設計にするか
- 将来的に外部サービスを乗り換えた際の柔軟性まで考慮するか否かに悩み、いくつかのDB設計を比較検討した
- 結果的には、柔軟性の低さを許容し、最もシンプルなDB設計で実装した
- 各種eKYCサービスのAPIレスポンスのデファクトスタンダードがあるか怪しかったため、過度な柔軟性を持たせることは避けた
- ビジネスチームの動きから、頻繁な外部サービスの乗り換えは想定しづらいと判断した
### 3. リーダー業務との兼務(やや番外)
- リーダーを任されたタイミングでの開発であったため、リーダー業務との兼務が課題となった
- タイムマネジメントに関しては現在も模索中であり、日々奮闘している
## 使用した技術
バックエンド: Ruby on Rails, フロントエンド: Vue.js + TypeScript
### 基本的な処理の流れ
- フロントエンドにてeKYCを呼び出す
- 本人確認書類や顔写真等を撮影した後、外部サービス側のDB保存される(なお、ここはiframe内にて動作する仕様であった)
- この時、固有IDが発行される(注1)
- バックエンドのAPIに対して、フロントで取得したeKYCの固有IDを送信
- バックエンドにて、eKYCの外部API呼び出し、固有IDに基づく本人確認結果のステータスを取得
- 結果をDBに保存し、ユーザー情報と紐付る
- フロントにて、バックエンドからの本人確認結果を取得
- 本人確認結果に応じて、ユーザーに対しての画面表示を変更
フロントエンドについては、eKYCのドキュメントの内容を反映した型定義を行なったため、他エンジニアも改修がしやすい形となった。
注1: この時に本人確認の結果もレスポンスとして渡るが、セキュリティ面を考慮し、バックエンドにて再度外部APIを呼び出す設計にした