## 開発
自社プロダクトであるAI学習サービスの開発・設計(2020/4〜現在)
## 使用技術・ツール
React, Redux, TypeScript, Redux Thunk, Cloud Functions, Firebase Authentication, Node, Express, GCR, GKE, Datadog, Brightove Video, Mailgun, Sentry, Wovn
## チーム規模・状況
全員がフロントエンド・バックエンドのタスクを担うことがあったが、基本的にチームは以下のような構成だった。
- チーム構成
プロダクトマネージャー:1人
サーバーサイドエンジニア:(時期によって)1-3人
フロントエンドエンジニア:(時期によって)1-2人(このうち1人が自分)
デザイナー:2人
## タスク詳細
### Reactアプリケーションのフロントエンドのリファクタリング
- どのような課題があったか:
- フロントエンドにテストが無かったのでテストを導入しようとしたが、Componentが肥大化していたことでテストの導入がしずらかった。また、Componentのlocal stateの規模が大きすぎたり、Component内部でAPIを叩いていたことでComponentと副作用を伴うロジックが密結合になっていた。
- どのように行ったのか:
- Component内で扱っていた一部のlocal stateを切り出してReduxで管理するようにした。
- Redux Thunkを導入することで、Component内部で扱っていたAPIをRedux Thunkに切り出した。
- 何が解決されたのか:
- 各Componentで重複したロジック(非同期処理周り)をRedux Thunkに集約することができたことでComponent内部の冗長性が減った。また、データを参照する時もactionを発行するのみとなりシンプルになった。
- ComponentとAPIの密結合が解消されたことでComponentを分解することができ、それによってユニットテストを導入することができた。
- Componentが参照するstateがReduxのstateになったことで、Componentで参照するstateのデータで齟齬が起きにくくなった。
### アプリケーションの新機能の設計および実装
プロダクトマネージャーとデザイナーから機能とデザインのインプットを受け、仕様に関しての設計を行い新機能の開発を行った。
#### ユーザにユニークIDと所属部門の情報を追加してそれらで管理できるような新機能:
- 担当:フロントエンド
- なぜ行ったのか:大規模クライアントでは、例えば1000人以上のメンバーを抱えていたため管理画面にて管理・検索をしにくい状態であったため。
- 何が解決されたのか:大量のメンバーが存在するチームにおいて管理画面でのメンバーの管理のしにくさが解消され、管理者がより快適にメンバー管理を行うことができるようになった。
- どのように行ったのか:ユニークIDや所属部門のstateを追加する実装を行った。所属に関してはReduxを利用することで、どこの画面からも所属一覧を参照できるようにした。所属の情報に関してlocal stateではなくReduxを採用したのは、多くの画面(コンポーネント)で参照する必要があったため各コンポーネントのlocal stateで管理するよりグローバルなstateとして管理した方が情報の齟齬が起きにくかったり、データフローも分かりやすいと考えたため。
#### 所属部門別で管理権限を設定できる新機能:
- 担当:フロントエンド
- なぜ行ったのか:大規模クライアントでは、マスター管理者の下に紐づくような、例えば所属部門単位での管理者権限がある方が便利だというフィードバックを受けていたため。
- 何が解決されたのか:所属部門ごとに管理者権限を付与することができ、より細かくメンバー管理を行えるようになった。
- どのように行ったのか:もともと存在していた管理者権限あり/なしの二つのステータス加えてその中間のステータスとして所属別の管理者権限を追加した。それらのstateを追加したり、管理者権限あり/所属別管理者/管理者権限無しのそれぞれのステータスで何ができて何ができないといった権限設計を行いながらそれらの実装を行った。またこの機能はオプション機能であるため、この機能を購入したクライアントのみこの機能を利用できるように特定のモードとして定義してUIやUXの出しわけを行った。
#### ユーザ情報の要素によって絞り込み検索できる新機能:
- 担当:バックエンド
- なぜ行ったのか:名前以外でのメンバー検索方法がなかったため特定のメンバーに到達およびそのメンバー情報を編集をするUXが良くなかったため。
- 何が解決されたのか:特定のメンバーを検索する時に、例えば管理者権限の有無や所属部門での検索が行えるようになり、より簡単にメンバーの情報編集が行えるようになった。
- どのように行ったのか:ユーザに設定されている情報(管理者権限の有無/受講ライセンス/所属部門/タグなど)によって、絞り込んで検索表示できるようにした。フロントエンドから渡されるクエリによって、それらの内容によってクエリを継ぎ足しながらmongoDBから取得するようにした。なるべくDBに負担をかけないこととコードの可読性をあげるために、クエリを継ぎ足しながらDBからデータを取得するロジックにした。