### 【プロジェクトの目的】
エンドユーザーから注文を受ける際、手書きで注文をとっているゴルフ場が多かったため、ゴルフ場に特化したレストラン注文アプリを提供してデジタル化・業務の円滑化を図る。
### 【プロジェクトの概要】
ゴルフ場向けレストランの注文システムをアジャイル体制で開発。
チームメンバーはエンジニア5名+1名(PM)で構成。
私はユーザー様が使用する管理画面やAPIの開発に従事。
iPadアプリはアプリチームが開発を行っており、連携して開発している。
### 【使用技術】
- PHP8(PHPUnit、Xdebug)
- Laravel9(Laravel Sail)
- JavaScript(ES6)
- Vue3(CompositionAPI)
- Vite
- Tailwind CSS
- Linux
- Apache
- Docker
- MySQL8
- Git、GitLab
- AWS(EC2, RDS, S3)
- Postman
- Xcode
- Teams, Backlog, Notion
- ChatGPT, Codex
### 【プロジェクトにおける自身の役割】
開発において、フロント/バックエンドの実装を行い、設計、実装、コードレビュー、運用保守、問い合わせ対応を担当。その際、AI 技術も活用。
リリース工程においては動作確認内容の洗い出し後、メンバーへテストの指示、完了後はPMへの報告まで実施。
また、新しく入社したメンバーのフォローも担っている。
### 【業務の流れ】
- いただいた要望について、メンバー達と仕様設計を行う
- 管理画面やAPIの実装 (アプリの修正があればアプリチームに報告)
- PR(MR)を出してレビューをもらう
- テスト環境にデプロイして動作確認
- 問題なければ本番リリースして、お客様にお知らせする
- 問い合わせがあれば対応
### 【現状】
約100ヶ所のゴルフ場様に導入していただいており、並行して問い合わせ対応も実施。
細かい修正や、お客様から要望があれば追加機能を随時リリースしている。
### 【チームが抱えている課題】
- 技術的負債
- 問い合わせ対応工数の増加
### 【改善状況】
- 技術的負債
- 機能追加などの実装をするついでに、それに関係している処理をリファクタリング。
- 時間があれば積極的に修正。(レビュアーの負担を無くすために修正は小出しに出す)
- 実装前に複数人で設計レビュー会を行い、ブラックボックス化を防ぐ。
- 問い合わせ対応工数の増加
- 機能ごとの操作マニュアルを作成して、お客様の目に見えるところに配置。
- リリース通知の文言に機能について詳しく記述し、マニュアルにも誘導する。
### 【課題に対して自身が発揮した成果】
#### マニュアル置き場の作成 (Laravel,Vue.js,AWS)
エンジニアも問い合わせ対応をしており、件数が増加したことで開発に割く時間を十分に確保できず、
結果的に業務量が増えたり、開発スピードが落ちてしまうことが課題だった。
当時は、すぐにカスタマーサポートの人員を増やすことが出来なかったため、まずは問い合わせ件数を減らすことに着目した。
今までは営業があらかじめ、クライアント様に紙のマニュアルを渡すが、
複雑な操作方法に関する質問や、そもそもマニュアルを紛失してしまい、結局問い合わせで操作方法を案内する、というケースが多かった。
なので、クライアント様が使用する管理画面に、全てのマニュアルを見ることができる一覧ページを作成すれば、問い合わせまで発展せず、自己解決していただけるのではないか、と思い実装に進んだ。
具体的な解決方法としては、もともとマニュアルはPDFで作成していたので、
AWSのS3に、全てのマニュアル(PDF)をアップロードしておき、
クライアント様の管理画面から参照して表示できるように実装する、という方法。
PDFをデータベースで管理しない理由として、PDFは100ページを超えるものがあり、
大容量になることでコストがかなり掛かってしまう可能性があるため、
比較的安価なS3で管理する、ということが背景にある。
構想自体はシンプルだったのだが、S3内の情報を直接外部のユーザーが閲覧するには認証が必要で、単純にHTMLで表示させることは不可能だった。
そこで、もともとLaravelプロジェクトにインストールされていたライブラリ`aws-sdk-php`があったので、
`S3 Presigned URL`という、AWSアカウントを持たないユーザーに対して、
一時的なURLを吐き出すことができる処理をLaravel側で施し、そのURLにアクセスさせることでPDFの表示に成功。
結果、ユーザーが、気軽にマニュアルを見ることができる環境を作り出すことに成功しました。
新しくシステムを導入したクライアント様に関しては、最初のうちはよく問い合わせをいただいていたが、
マニュアルが自由に見れる旨を説明したところ、それ以降操作に関する問い合わせは少なくなった。
問い合わせが完全に無くなることはないが、以前より開発に集中できる環境を作れたのではないか思っている。
#### おしらせ機能 (Laravel,Vue.js)
約100ヶ所以上のゴルフ場を運用しており、それぞれ管理画面もっている。
1つのDBインスタンスで運用すると、データ量的にパフォーマンスに影響が出そうなため
前提としてDBインスタンス(`Amazon Aurora MySQL`)を複数用意して、均したもの振り分けて運用。
その中で、全ゴルフ場に<strong style="color: red;">お知らせを通知する機能</strong>を実装。
ですが、全ゴルフ場向けにお知らせを通知すると、
全てのDBインスタンスのテーブル(`notificationsテーブル`)にレコードが作成され、長期スパンでみると、
データが増えすぎてコスト面の懸念が発生する。
なのでマスターデータとして、既存の社内環境にもお知らせテーブル(`notificationsテーブル`)を作成し、
レコードを追加していくことにした。
そして本番環境のお知らせテーブルの接続先は社内環境にした。(具体的には`config/database.php`に社内環境の接続情報を記述し、`Notification`モデルの`$connection`にその接続先を指定した。)
そうすることで全ゴルフ場で表示されるお知らせは、社内環境のテーブルを見に行っているので、
今後はその社内環境のテーブルにだけ追加していけば良くなる。
エンジニア側の運用も楽になるし、中長期に渡り増えるデータ量も抑えられることに成功した。