# 所属
オープンワーク株式会社
# 概要
サービス内新規コンテンツの開発
# 体制
- PM 1名
- 開発リーダー 1名
- エンジニア 1名
- デザイナー 1名
- アナリスト 1名
# 担当
PM1名、開発2名、デザイナー1名、アナリスト1名体制での、開発リーダー
# 使用技術
PHP, Symfony, Python, MySQL, ElasticSearch, ECR, Docker Compose
# 課題
## サービスとしての課題
弊社では世の中の会社のクチコミを載せているサービスを運営していますが、実は求人もあって応募もできるサービスです。
しかし、そういった就職マッチングサイトという認知度がまだまだ低いので、そこに課題がありました。
その課題を解決するための一つとして、各会社の推定年収グラフを一新し、唯一のコンテンツを用意することでサイト流入を増やしたり就職マッチングサイトとしての価値を高めていくというプロジェクトが立ち上がり、そこに参画しました。
開発のみで終わるプロジェクトで終わるものではなく、その後のプロモーションの予定も立っていたプロジェクトでした。
以下プロモーション活動の一部です。
https://newspicks.com/news/5434914/body/
## 開発における課題
現行サービスではPHPを利用していますが、年収データを算出する計算ロジックをPHPの関数で実現できない事が途中でわかりました。(行列計算を行うため)
また、プロモーション開始時期が決まっていた(つまり期限が決まっていた)中で、通常の開発で実現できないので工数を掛けない他の方法を考える必要がありました。
# 取り組み
## 技術選定
PHPではなくPythonであれば簡単に実現が可能だという事がわかったので、計算ロジックのみ別サーバーを作成して実装することにしました。
また、最初は年収グラフの描画を外部ライブラリを使って描画する想定でいましたが、工数やライセンス管理の煩雑さを考え自前でシンプルなviewを実装することにしました。
# 工夫した点
## 適切な分担
経験言語によって担当を分ける事で効率的に進めました。
もう1人の開発メンバーがPythonの経験があったのでその実装を全て任せました。
そこに集中してもらうため、私は以下のようなそれ以外の作業を全て行いました。
- PHPの実装
- 共通利用するテーブルの設計・実装
- Python環境の整備をインフラエンジニアと進める
- Python実装のソースコードレビュー
- PMとの連携
- 進捗管理
Pythonの実装に集中してもらう事だけではなく、私の方で先にPHP側の実装を終わらせられそうだったので、終わった後にヘルプに入れると考えてこのような配分にしました。
結果的にスムーズに開発が進み、スケジュール内にリリースすることができました。
## 見通しの良い設計
私の実装範囲の話です。
既存ページ内の機能を作り直す開発でしたが、既存のソースコードは古く複雑・難解になっていました。
そこで、既存の記述を思い切って全て削除し、DDDの観点で新たに設計・実装を行いました。
各層(Presentation, usecase, domain, infrastructure)を用意し実装を進めていきましたが、その結果以下のような成果が得られました。
- 層単位でユニットテストが書けた
- 層単位でコードレビューを依頼でき、レビュワーの負担も小さくできた
- ソースコードの見通しが全体的に良くなり、テスト後の修正もやり易かった
## MVPを意識した技術選定
ギリギリまで開発をしないように、MVPでリリースするということを意識しました。
要件を詰めながら並行して設計を行っていたのですが、その中でも削れそうな箇所としてグラフ描画の部分でした。
既存の機能でHighchartsというグラフ描画ライブラリ(javascript製)を利用していたので、当初は同じようにして利用できないかと考えていました。
しかし、ライブラリで用意されている定型的なグラフでは表現が難しく、ライブラリ自体のキャッチアップも時間がかかりそうでした。
そこで、わざわざHighchartsを使わなくても表現できるのでは、と考え要件をPMと見直したところ
SSRでも実現できるとわかったのでその方針で進めました。
結果的にグラフ描画についての工数をほぼデザイナー側で賄う事ができ、エンジニアはロジックの構築に専念する事ができました。
## リモート下での効率的な開発
開発期間が短いので、毎日朝会を行って進捗確認や相談を行っていましたが、それ以外でもわからなくなった時は都度画面共有をしながらペアプロを行いました。
その結果最初の見積もりよりも半月ほど前倒しでリリースする事ができました。