既存の旅行予約システムの刷新を行うプロジェクトに要件定義から参画。
主にサーバサイドの設計実装、テスト及びそれを行う小規模(3~7人)なチームのマネジメント行う。
新規機能の追加の為の刷新というよりも、既存システムの不満点の解消や、システムデザインがビジネスに合っていない事による(e.g.データモデルが正規化されていない、状態遷移が曖昧な事によるサーバフロント間の状態ずれなど)不具合の解消や高い保守コストの削減を目的とした刷新であったので、
要件定義の段階の早い段階からプロトタイピングを行い、画面モックやDFD、UMLの各種図表により顧客や実際に使用するオペレータと意見を交換しながら仕様を固めていった。
技術的なシステム構成としては、フロントエンドはAngular 4を用い、DOM操作や描画は主にこちらで行っており、サーバサイドはWeb APIとして動作をし、都度必要な情報の提供を行う。
サーバサイドは認証機構として独自のSSOを利用するためSpring Securityを拡張し認証、認可を実装し、冗長構成におけるセッションレプリケーションをSpring Sessionにより実装、Web APIとしての基本的な機能(HTTPリクエストのハンドリング、データベースへのアクセス、データ整形等)はSpring Framework 4 , Spring Boot ,Spring
Data JPA (Hibernate)により構築、単体試験はSpockというフレームワークを用い行った。
実装時のコードはJava 8とKotlinを用い、単体試験コードのみGroovyを用いた。
基本的にはJava 8により実装を行い、DTOやドメインモデル等どうしても冗長なコードが多くなってしまう箇所に部分的にKotlinを採用し実装する事により、コード量を減らし、可用性、保守性を高めた。
技術的に特に難しいことをしていたわけでは無いが、とにかく変更が多く、自ずとOOPやDDDについて深く意識し解りやすいコードについて再度考える事となった。(e.g. ドメイン層にはどのような処理をカプセル化するべきか、サービス層の責務はどのように分類するか等)
RDBMSのデータスキーマも都度変更があり苦しめられたが、幸いJPAによるO/R Mapping及び、ドメイン層で大分吸収できたのでそこまで深刻な手戻りは発生しなかった。
ただ、チームメンバでHibernate(JPA)に対する知識があるのが私だけだったので、最後までN+1問題や意図しないLazy Fetchには対処が必要だった。
チームのタスク管理及びCI/CD環境はGitLabによりAWS上に構築し、少人数のチームではあったがGitLab Flowにより開発を進めPushをトリガにGradleを用いてビルド、単体試験、コード検証、パッケージング、そしてデプロイまで行っていた。