# アカウント管理システム
## 概要
某公共機関がそれまで使用していた Notes を廃し O365 を導入するということで、様々なシステム間のアカウントを一元管理できるアプリを要望した。
開発規模は当初見積もりで 20 人月。それを 2 人の技術者で開発した。
## 要件
* ユーザーが自分自身でどのシステムを使うか選択できること
* 管理者による申請フローがあること
* ActiveDirectory,ExchangeOnline と階層型組織、アカウント情報を同期すること
## やったこと
* 基盤開発
2 人での開発ということで基盤設計に深く関わった。
全体での担当箇所は主にサーバー側で Unity による DI や DDD に沿ったコーディング規約の作成を担当した。
データ連携部分では ActiveDirectory,ExchangeOnline の共通部品を作成した。
またソース管理はそれまで TFVC を使用していたが、Git を提案して採用された。
* 基本設計
申請~申請承認~データ移行までの流れと組織管理の設計を担当した。
またこのドメイン領域のテーブル設計を行った。
* 開発・テスト
フロントエンドは申請(CRUD)画面と申請承認、組織管理(CRUD)を担当。
サーバーサイドは設計部分と同じ領域を担当した。
## 苦労したこと
* 新しく取り入れた技術に追いつくこと
前案件が余裕をもって終えることができたので、十分な準備をすることができた。
そのため新しい技術を積極的に採用していこうという考えの下プロジェクトが始動した。
knockout.js や Git、DDD に沿った設計は今まで未経験だったが、様々な書籍を読み家で実装を試すことで新しい技術を入れたことによるプロジェクト遅延は特に出なかった。
何よりこのときの学習は楽しくもあったし、習慣化することができたので収穫も大きかった。
* テーブル設計
この案件以前ではなんとなくやっていたテーブル設計を勉強しなおした。
複合主キーや意味のある主キーを廃し、サロゲートキーを主キーとすること、マスタと履歴を分離しておくこと、トランザクションの非正規化等を行うことによってわかりやすいテーブル設計ができたと思う。
とちゅう顧客要望でやむをえず組織マスタを非正規化することになったが、上述の学習によってプログラム内部では正規化してラッピングすることができたので影響を最小限にできた。
* 開発範囲の増加
当初 Exchange 連携は別の会社が担当することになっていたが、途中でこちらに担当が回ってきた。
ただ当初から Exchange 連携は想定していたし、それを組み込めるような形で作っていたため設計は大変だったものの対応できた。
元々作業が前倒しだったこともあるが、自分の強みである作業速度の速さを生かして初めの想定の期間内に作業が完了できた。
* Exchange データ同期の設計
Exchange データ同期には以下の課題があった。
* Exchange 連携時にそこそこの確立でエラーが発生する。
* セッション確立やコマンド実行がおそい。
* セッションの同時確立数に制限がある。
* コマンド実行する際セッションに対して排他性を確保する必要がある。
これに対して以下の解決策を実施した。
* 申請承認データはキューテーブルに登録して同期は 30 分に1度実行する。
* べき等性を保ち、再実行可能にする
* 同一データに対する同期処理は最後の処理だけ同期処理をおこなった。
* コマンド発行時セッションを共有しセマフォによるはいた処理を実装した。
* コマンドは最小単位で非同期実装することで待ち時間を最小にした。
## 今後改善できそうなこと
* 継承 → 委譲
実装上継承を多用していたが、もっと他クラスに委譲をしたほうがよかった。
* キューの実装
この案件ではデータベース上にキューテーブルを設計したが、Azure や AWS のメッセージングサービスを提案してもよかった。
* Clean Architecture
本プロジェクトではドメイン駆動設計を読み解きながら基盤設計をしていたが、結果としてClean Architecture に近いものを作成した。当時はClean Architectureを知らなかったため結果的にすでにある考えに近い実装ができたのは方向性的に間違っていなかったという意味でよかったが、次は改めて学びなおして実装したいと思った。