## 0. このプロジェクトの記載で何が伝わってほしいか
* 要件定義からリリースまで、プロジェクト全体をリードできること
* これを支える前提として、フロントエンド・バックエンド両方の高い技術力と経験を有すること
以下でこれらを示します。
## 1. プロジェクトの内容と課題
有料契約ショップ数日本一のネットショップ作成サービス「カラーミーショップ」の常時 SSL 対応。
https://shop-pro.jp/ssl/
### チームの規模
* プロダクトマネージャー x 1名
* ウェブアプリケーションエンジニア x 5名(私はここに含まれるが、プロダクトマネージャーが兼任で多忙であったため、プロダクトマネージメントのほとんどを私が行った)
* インフラエンジニア x 1名
* デザイナー x 1名
### 課題
制約として下記があった。
(1) SSL 証明書の発行に 1分ほどかかること
* ショップの独自ドメインの SSL 証明書を発行する前にフィッシングサイトチェックがある。これはグローバルサイン API にリクエストを送ることで行い、レスポンスに 10〜20秒かかる
* ドメイン認証もグローバルサイン API にリクエストを送ることで行い、同じく レスポンスに 10〜20秒かかる
* SSL 証明書を発行後、証明書インストールに 30秒かかる(ただしこの点については後に改善されて 1秒以内で実現されるようになった)
(2) ショップ数が多いため、SSL 証明書の更新に工夫が必要
* カラーミーショップで独自ドメインを利用しているショップ数はおよそ 30,000 ショップ
* SSL 証明書の有効期限は31日(毎月1回はそれぞれの証明書の更新が必要)
* 独自ドメインのショップすべてが常時 SSL を利用すると、1日1000件の証明書更新処理が必要になる
したがって、
* (1) の制約があっても、良い UI/UX をどう実現するか
* (2) の条件があっても、運用していけるアーキテクチャ
がキモだった。
## 2. プロダクトマネージメントとして
プロジェクトを通して実現したいことと、その成功を測る指標を定めた。
(1) ショップの SEO などに貢献し、カラーミーショップのプロダクトとしての魅力を上げたい。そのために「常時 SSL を利用するショップ数」を最も重視する指標と決めた
(2) 「常時 SSL を利用するショップ数」が損なわれない限度に、独自ドメインショップの常時 SSL は別途利用料金をいただいて、事業の売上に貢献することに決めた
(3) (2) を実現するために、価格設定には「感情価格決定法」を用いた
* 参考)[一瞬でキャッシュを生む!価格戦略プロジェクト](https://www.amazon.co.jp/dp/4478502218?_encoding=UTF8&isInIframe=0&n=465392&ref_=dp_proddesc_0&s=books&showDetailProductDesc=1)
プロジェクトの後半には、リリース日を重視して機能を切り捨てるか、リリース日を延ばすかの決断が求められることが多いため、「何を重視しないか」も定めた。
(1) 「常時 SSL を利用するショップ数」を上げるためには、できるだけ早くリリースして、競合よりも先にプロモーションをかけることが重要。そのためにレアケースへの対応は重視しない(5%未満のケースへは問題となったときに個別対応する)
(2) ただし、お金(利用料金)が絡む問題については数が少なくても、ユーザー体験に大きく影響し、ソーシャルなどを経由して「常時 SSL を利用するショップ数」に影響が及ぶことも考えられるため、5%未満のケースでもリリース前に対応を済ませておく
## 3. UI を定義した
プロトタイプを使ったユーザビリティテストをしながら UI を改善していき、SSL 証明書の発行に数十秒かかってもユーザー体験を損ねない UI を定義できた。
(プロトタイプの作成はチームのデザイナーに依頼した)
また、このあたりの話をイベントに登壇して話し、会社のプレゼンス向上に貢献した。
* [第6回ペパボテックカンファレンス 〜 もっとおもしろくできる、そして……伝説の夜 〜 開催レポート - ペパボテックブログ](http://tech.pepabo.com/2016/09/27/pbtech-6th-report/) の「(2) 開発フローの中のレビューポイント」
## 4. 全体のアーキテクチャを策定した
SSL 証明書のインストールにかかる時間をできるだけ短くして、良い UX を実現したい(30秒もかけたくない)と考えたため、SSL 証明書を ngx_mruby で動的に適用するようにした(このあたりは詳細はインフラエンジニアに任せた)
* [第6回ペパボテックカンファレンス 〜 もっとおもしろくできる、そして……伝説の夜 〜 開催レポート - ペパボテックブログ](http://tech.pepabo.com/2016/09/27/pbtech-6th-report/) の「(1) SSLと仲良くするやり方」で少し触れた。
SSL 証明書発行を担うサーバーから、SSL 証明書適用を担うサーバーへは API を通じてやり取りするようにした。
また、上に書いた制約のとおり、1日1000件の証明書更新処理を仮に直列で行ったとすると 1000件 x 70秒 = 19時間以上かかるという試算をしたため、利用ショップ数が増えても破綻しないようにするには、処理を並列で実行する必要があると考えた。より具体的には、
* ジョブキューに証明書更新タスクを突っ込んで、複数のジョブワーカーが並列で処理する
* ジョブの粒度を適切に分解することで、証明書発行のロジックを証明書更新でも再利用できるようにする
* ジョブが途中でこけた場合に、こけたジョブを再実行すれば良いようにしておく
というアーキテクチャにした。
### OSS(gem)
グローバルサイン API とのやり取りを行うクライアントは、他のプロダクトでも利用する予定があったことと、できるだけコミュニティに貢献できるようにするため、OSS にした。
* [pepabo/global_sign: A Ruby interface to the GlobalSign API.](https://github.com/pepabo/global_sign)
### ドキュメント作成とテーブル定義
チーム内で共有するため、いくつかのドキュメントを作成した。
* SSL 証明書発行のシーケンス図(自分以外の人が編集できるよう [js-sequence-diagrams](https://bramp.github.io/js-sequence-diagrams/) を使った)
* 主要モデルの状態遷移図(自分以外の人が編集できるよう [flowchart.js](http://flowchart.js.org/) を使った)
* SSL 証明書に関わるテーブル定義(ActiveRecord のマイグレーションファイルを作成)
## 5. 実装
プロジェクトを通じて若手の成長を促進させる目的があったので、実装の主要部分は若手に任せた。私が行ったのは下記。
* gem を作成したことがない若手に gem 作成を任せた。お作法的なところや、gem を利用する側からの視点を指摘するなどした
* [プルリクエストのレビューの一例](https://github.com/pepabo/global_sign/pull/1)
* 上記アーキテクチャの要件(ジョブの粒度を適切に分解されているか、ジョブが途中でこけた場合に、こけたジョブを再実行すれば良いようになっているか等)が守られているかという観点からコードレビュー
* 非同期処理の例外処理や UI まわり等、難易度が高い箇所のペアプログラミングまたは実装
## 6. プロジェクト全体を通して
プロジェクトを
* (1) プロダクトを定義するフェーズ
* (2) プロダクトをつくるフェーズ
に分けたとき、「(1) プロダクトを定義するフェーズ」のほうにだいぶ力を注いだ。
その背景としては、私たちのチームが「(2) プロダクトをつくるフェーズ」は得意だと自信が持てるようになったが、「(1) プロダクトを定義するフェーズ」はまだまだ自信がもてるやり方が確立できていなかったため。そしてビジネスとして、そこがうまくできるようにならないと成功する可能性が小さいため。
自分たちのチームだけでなくペパボ全体がそうであったし、業界全体もそのような気運があったと思う(この頃、プロダクトマネージャーという用語が盛んに使われるようになったと感じている)