事業部エンジニアからの改善提案の進め方 ~ 課題発見から提案まで ~

この記事は[Ateam Brides Inc. Advent Calendar 2019](https://qiita.com/advent-calendar/2019/a-t-brides)　3日目の記事です。

## はじめに

新卒2年目エンジニアの[@fussy113](https://qiita.com/fussy113)です！
半年ほど前から、今年の1月にローンチされたRailsで作られたWebサービスのサイト改善、新規機能の開発を行なっています。

7月ごろの話になるのですが、サイト改善の一環で、CDNを利用した速度改善を行いました。
その話を例にエンジニアからのサービス改善の提案の仕方を紹介していきたいと思います。

## この記事のターゲット

- 提案がなかなか通らず悩んでいるかた
- これから速度改善を考えているエンジニア

進め方の一つ参考になればと思います。

## 実装までに進めたこと

重要なのは大項目の3つをしっかり行うことです。

- 課題の要因分析
  - **何が課題なのかをきちんと把握すべし**
- 課題の解決方法の模索
  - **できる方法はできる限り洗い出すべし**
- PMへの提案
  - **GOサインを貰うための調査はきちんと行うべし**

## 課題の要因分析

いざ課題の要因分析をするぞ！となった時、どうしますか？
とりあえず当たりをつけて、猪突猛進にその解決に勤しむ、、、というのは少々危険性が高く感じます。

ページスピードを例に上げると、ページが遅いという課題には多くのボトルネックとなりうる箇所が存在します。

- フロントエンド
  - 画像のサイズが大きいこと
  - minifyしていない
- バックエンド
  - ロジック部分の計算量が大変なことになっている
  - SQLの問題

並べていくとまだあると思います。その中で**本当は何が要因となって課題が生じているのか**を調査をすることは大切です。
その理由は主に2つあると考えています。

- どこを改善することがインパクトとして大きいのかを把握する
  - `着手したとこ、全然ボトルネックじゃなかったよ...`は防ぐべきです。
- 複数ボトルネックを見つけた場合、優先度をつけて先々を見込むことができる。

調べる方法としては、ページスピード改善なら[RailsのGem](https://github.com/MiniProfiler/rack-mini-profiler)やChromeの開発者コンソールなどがありますね。

私は他のエンジニアの手を借りつつ調査を進め、**サイズが大きい画像ファイルが表示されていること**が主な改善ポイントであることを突き止めました。

## 課題の解決方法の模索

課題解決案を出すにあたって、会社のリードエンジニアにも手を借りながら、以下を実践しました。

1. とりあえず工数、費用は考えず解決のために**できる方法を列挙するだけ列挙する**(発散)
2. 列挙したものを**工数、費用、メリット、デメリットをまとめ、最適な方法を絞り込む**(収束)

2で挙げている、最適な方法は、サービスの規模や状況によって異なると思っています。
私の場合、それぞれを下記をいったんは考えました。

- できる方法
    1. S3に上がっている画像のサイズが大きいのでアップロード時にリサイズをかける方法
    2. CDNを使って画像をキャッシングして取得する方法
    3. ページで画像を取得時に画像サイズにリサイズをかける方法
    4. S3の画像アップロード時にリサイズをかけ、かつCDNを併用する方法(1 + 2)
    5. 元の大きな画像をリサイズしCDNを使ってキャッシングする方法(2 + 3)

そのうち、既にアップロードされている画像を別途リサイズする工数などを考えた結果、`2、3、5`の方法に絞り込み、大きな手間がかからず最大のインパクトがありそうな`5`の案で考えました。

次に、CDNサービスとして何を利用するか、費用に関して考えました。FastlyやAkamaiなど多くのサービスがある中で、Cloudfrontを利用することに決めました。選定した理由としては、下記です。

- 比較的新規のサービスでありまだまだ規模が小さいこと
- 比較的安価であること
- もともとAWSを利用しているため、運用コストが最小に収まるのではないか。

**少ない工数で最大のインパクトを出す**、**現状のサービスに合わせること**を考え、どのように実装するかを検討していくことが大切と考えます。

## 提案するための材料を集めること

実装方法まで決まってしまえばあとは実装進めてく。。。では無く、もちろんプロジェクトの責任者に対して承認をとっていきます。
提案の際、GOサインを貰うために、判断をしてもらうための材料をこれまでのプロセスの中からかき集めて持っていきます。

1. その課題は**どんなことに影響があるのか**
2. その課題を解決するためには**どれくらいの工数、費用がかかるのか**をきちんと伝えること
3. その課題を解決することで、**どれだけの効果(インパクト)が得られるのか**

速度改善を例として、上記3点を文章に落とし込んでみます。

「ページの読み込みが遅いことで、ユーザーの離脱に繋がっている。」
「今月内に月額およそ~円くらいの費用で解決ができる。」
「これにより離脱率が低下する、さらにサイトのSEO評価も改善され、CVに繋がるので実施をしたいです。」

---

上記の3つを進めた結果として、私は無事実装に向けて動き出すことができるようになりました。

## まとめ

提案のための3つのプロセスと要点です。

- 課題の要因分析
  - **何が課題なのかをきちんと把握すべし**
- 課題の解決方法の模索
  - **できる方法はできる限り洗い出すべし**
- PMへの提案
  - **GOサインを貰うための調査はきちんと行うべし**

もっと細かかったりするかもしれませんが、大筋はブレないかと思います。

## 終わりに

いかがだったでしょうか？
提案の進め方の一つの参考、また事業部付のエンジニアの働き方の一つとして、参考になれば幸いです。

速度改善の実装に関しては、~~ちょっと間に合わなかったので~~うまくまとめきることが出来なかったため、12/8に投稿します。よければそちらも呼んでください！
また個人として、[スマートスピーカーアドベントカレンダー](https://qiita.com/advent-calendar/2019/smart-speaker)にも参加します。こちらも興味あればぜひよろしくお願いします！

## 私たちのチームで働きませんか？

![alt](https://brides.a-tm.co.jp/wp-content/uploads/2019/11/ATEAM_BRIDES.jpg)
[エイチーム](https://www.a-tm.co.jp/)は、インターネットを使った多様な事業を展開する**名古屋の総合IT企業**です。
そのグループ会社である**株式会社エイチームブライズ**では、一緒に働く仲間を募集しています！

- [ハナユメ サイト開発グループ](https://jobs.qiita.com/employers/brides-a-tm/development_teams/138)
- [HIMARI開発チーム](https://jobs.qiita.com/employers/brides-a-tm/development_teams/147)
- [技術開発部](https://jobs.qiita.com/employers/brides-a-tm/development_teams/148)

上記求人をご覧いただき、少しでも興味を持っていただけた方は、まずは**チャットでざっくばらんに話**をしましょう。
技術的な話だけでなく、私たちが大切にしていることや、お任せしたいお仕事についてなどを詳しくお伝えいたします！

[Qiita Jobs](https://jobs.qiita.com/)よりメッセージお待ちしております！