**概要**
AWSが主催するAPN Next Generation Engineer Leaders Dojo、通称エンジェル道場に会社を代表して参加し、チームでは3タイトル中2タイトルで一位、個人表彰でも1位を獲得しました。
私が担当したサービスアーキテクチャでもアーキテクチャ賞一位の評価をいただいております。
プロジェクト内容としては、若手を対象としてAWSについて学びながらサービスを企画・実装して発表するというものでした。
開発サイクルとしてはアジャイルを採用しました。
**記事**
- https://aws.amazon.com/jp/blogs/psa/angel-dojo-season2-2020/
**サービス概要**
「休日に予定がないけど何かしたい人」をターゲットに、機械学習を組み込んだ旅行提案・旅行サポートサービスです。
- 自宅や自分のデータを登録しておくことで、同じような要素を持つユーザーが好む旅行プランを提案してくれます。
- Googleのレビュー情報と連携しているため、旅行スポットのレビューやその他情報にもすぐアクセスできます。
- 自宅から出て帰ってくるまでの経路や時間・金銭的コストを算出してくれます。
- 旅行先での過ごし方の提案や、その結果を入力することで思い出レポートを生成してくれます。
- 未実装ですが、SNSとの連携機能や複数人で遊びに行きたい場合の募集など、出会い系サイト要素も事業計画にいれていました。
**プロジェクト単位での詳細・課題・対応・学び**
- https://docs.google.com/presentation/d/1qG0Ge1uonbt5wBCHR1_V3DjFG-tZwyV-zCrxFqJ02dA/edit?usp=sharing
社内向けレポートから問題がありそうな内容や画像などをすべて削除したものです。
サービスのアーキテクチャや私が苦労したこと、学びなどを記載しています。
こちらは私の考え方が良く反映されているため、<span style="color: red; ">後半だけでもぜひご覧ください。</span>
**技術的課題の解決例**
<span style="color: red; ">課題:登録フォームの値の動的更新、パラメータの依存関係</span>
<div>
本サービスでは自宅から最初のスポットまでの経路を算出するために、最寄り駅を登録する機能があります。<br>
そしてユーザーのプロフィールを入力する機能を実装した際、最寄り駅の入力は選択式にしていました。<br>
この時、最寄り駅の一覧は自分の住んでいる都道府県からある程度絞り込んで出力するようにしていたのですが、何度も画面遷移させるのはユーザービリティが低いと考えました。<br>
そこで、同一ページ内にある都道府県の選択入力が切り替えられた瞬間に、最寄り駅の入力欄の選択肢が自動的に切り替わるように実装したいと考えました。<br>
Vue.jsでの実装ということで未経験領域+キャッチアップに仕える時間がほとんどない状況でした。<br>
また、開発未経験者が過半数を占める状況であるため、なるべくユーザー情報を取り扱うときにシンプルなものにしたいという状況でした。
</div>
<br>
<span style="color: blue; ">解決:登録フォームの値の動的更新、パラメータの依存関係</span>
<div>
userInfo.jsというユーザー情報を管理するjsを実装しました。<br>
開発者はこのuserInfo.jsをインポートすることでいつでも最新のユーザー情報を扱えるようにしました。<br>
ユーザー情報を静的なものとしてDBに入れておいてそれを逐一取り出すような設計では動的な値変更を迅速に行うことが難しかったため、DB更新はuserInfo.jsが必要なタイミングで自動的に行う用にしつつ、普段はDBへのアクセスを必要とせずパラメータで常に持っておくような実装をしました。<br>
実装はvue.jsのcomputedを駆使して行い、値変更とコード実行を紐づけることで行われるようにしました。<br>
パラメータの情報に変更が入ると依存関係にあるパラメータがすべて自動的に再計算されインポートされているすべての画面に値を適用するため、用途に合わせてDBに保存された登録済み情報を使用するか、自動計算される動的な情報を使うかを選択できるようにしました。<br>
この実装は様々な依存関係を持つ値で使われるようになりこれだけで800行超の大作になりましたが、パラメータの更新→computedにより依存パラメータの更新→そのパラメータのcomputedにより依存パラメータの更新というような動作をするため、メンテナンスすることが難しいコードになってしまいました。<br>
工数と知識不足でパラメータ同士の依存関係が把握しにくいコードになってしまったことは悔しく思っています。<br>
依存関係にあるパラメータの親子をまとめたコンポーネントを作る、一目で親パラメータか子パラメータかわかる命名規則を考える、循環関係を避ける等、オブジェクト指向設計について学ぶべきだったと反省しております。
</div>
**担当領域**
- 開発環境をふくめたサービス全体のアーキテクチャ設計
- 開発環境・アカウント保護・バックエンド・フロントエンド実装
- AWSアカウント運用管理
- 発表トークスクリプト作成
- コードレビュー
- メンバー教育
- スケジューリング、チケット選定、進捗管理、面談などマネジメント
- 会議ファシリテート