プロジェクトの背景と開発方針

転職ポータルサイトを新しく作りたいとのご依頼を受けました。

やりたいこととしては、

  • 求職者はfacebookでログインできる
  • 求職者はユーザー登録しプロフィールや経歴などを登録できる
  • 企業や仲介者は登録された求職者情報をエリアや希望報酬金額などで絞り込み検索できる
  • 求職者情報の公開範囲は「公開」、「マッチングした場合のみ公開」、「非公開」から各項目ごとに設定できる
  • 求職者は検索拒否リストに企業名を登録することで、特定企業から検索されないようにすることができる
  • 企業や仲介者はユーザー登録し求人情報を登録できる
  • 登録された求人情報はサイトに掲載され、エリアや業種、給与金額などで絞り込み検索できる
  • 求職者は気になる求人に「気になる」することができる。気になるは企業に通知されるため、企業側への控えめなアピールとなる
  • 求職者は気になる求人に「応募」すると、企業にマッチングをリクエストできる
  • マッチングが成立すると、サイト内のメッセージ交換システム(チャット)でメッセージをやり取りすることができる
  • 同様に、企業側も気になる求職者に「スカウト」すると、求職者にマッチングをリクエストできる
  • チャットメッセージ受信時や「気になる」、「応募」、「スカウト」などはサイト内やメールで通知される
  • 仲介者(エージェント)も企業と同様にシステムを利用できる
  • 提携サイトから求人情報を転載する仕組みもほしい

とのことでした。

機能の量は多いですが、基本的にWebアプリとバッチで実現可能なため、サイトはPHPとMySQL、バッチはAWS Lambdaという標準的な構成で構築することになりました。

開発のポイント

facebookログイン

facebookログインは初めての試みでしたが、APIの資料(英語)を読みながら問題なく実装することができました。
しかし運用後たびたびfacebookから仕様変更の対応を要求されたため、ややコストが高くなることが分かりました。

性能を考慮したテーブル設計

Webアプリにとってテーブル設計は最も重要で慎重に決めなければならない部分です。一度運用が始まってデータが流し込まれたテーブルを途中で変更することは、大きなコストがかかるためです。

今回はエリアや価格などで絞り込み検索するため、テーブルのインデックスやカラム型を以下の点を考慮しながら慎重に設計しました。

  • 検索時のゼロ値(未選択時の値)をどのように扱うか(NULL許容にするかしないか)
  • 将来のデータ追加や仕様変更に耐えられるか
  • 性能要件を満たせるか
    • 効率的にデータ取得できるか
    • クエリが集中する場面はどこか
    • 将来どこまでデータ量が増えるか(最大レコード数の想定)

性能については将来データが増えた場合も含めて性能要件が確保される必要があります。
そのため、20万件のレコードでもクエリ実行時間が20msec以内になることをテスト検証しました。

提携求人の取り込み

提携サイトからの求人取り込みは弊社のスクレイピングシステムを利用し、組み込みました。またこれをAWS Lambdaで定期実行できるようにしました。

振り返り

求人情報の項目をどうするか、並び順やソートをどうするかなどクライアント様と相談しながら進められました。性能についてはすべてのページで性能要件を満たし、キビキビした表示速度を実現できました。また求人取り込みについては弊社のシステムを流用することで工数を大幅に削減することができました。

プロジェクトデータ

開発期間
4ヶ月
開発人数
1人

使用技術

言語
PHP
Framework
CodeIgniter
データベース
MySQL
画像アップロード
AWS S3
ホスティング
VPS
バッチ
AWS Lambda
メール送信
SendGrid