# 概要
- チケット検索/購入/動画閲覧/投げ銭等ができる動画配信サービスとその管理システムを新規開発しました。フロントエンド・バックエンド・チーム管理を担当しました。
# 開発チーム
PM × 2名
PL × 1名
エンジニア × 10名 -> このエンジニアチームの管理を実施
テストエンジニア × 10名
デザイナー × 1名
# 使用技術
- Docker, Jenkins, AWS, PHP8.0, MySQL8.0, Redis, Apache、独自FW
- HTML, CSS, Javascript
- Slack, Redmine, Backlog, Discord
# 担当範囲
エンジニアチームや顧客との課題整理、進捗などをPLとして管理、およびバックエンドエンジニアのメンバーとして基本設計〜実装/単体テストまでを担当しました。
- 管理:顧客との仕様のすり合わせや課題管理をBacklog上で行い。確定事項はRedmineに起票してエンジニアに共有していました。WBSを作成して進捗管理を行い、タスクの遅れ等は人員へのRedmineタスクの付け替えや顧客との調整をしていました。また設計書やソースレビューを担当しました。
- 設計:PlantUMLによるシーケンス図の作成、draw.ioで画面設計書の作成を行い、Markdownで機能設計書として顧客に見せていました。APIのインターフェースはSwaggerを使って作成し、バッチ設計も行いました。
- 実装:ログイン/会員登録、チケット購入(SBPS/PayPal)/払戻、在庫管理、購入履歴、お気に入り登録、チケット検索/一覧/詳細等、視聴ページ、外部システムデータ連携バッチ、会員管理、売上管理、コンテンツ管理、CSV出力、ライセンス管理など
# 取り組み
- 数に限りのある限定チケットの在庫管理を検討・実装しました。購入フローに入った瞬間に仮の在庫を確保しますが、大量のアクセスが想定されたため、仮在庫はDynamoDBで管理しました。購入が成立したタイミングでDBに格納することにしましたが、購入しない場合もあるため、仮在庫の有効期限を設け、定期的なバッチ処理で在庫の整合性を担保するようにしました。
- 決済処理の際に、SBPSへのAPI連携・基盤システムへの連携、メール送信など複数の処理が必要でした。基盤システムへの連携はやり直しができないため、トランザクションに苦労しました。ステータスを設け、SBPSの連携のみ失敗した場合は、ユーザーには失敗と出して、次の決済では基盤システムへの連携をスキップするようにしました。
- 動画を検索する全文検索がLIKEになっており、検索に5分程度かかるパフォーマンスになっていました。Elasticsearch等外部サービスは使えなかったため、フルテキストインデックスで解決を試みました。半角スペース区切りでも検索したかったので、パーサーはngramを採用し、漢字1文字もあったため、1文字区切りとして設定しました。結果的に検索は30秒未満に抑えられました。
- チケット管理など業務システム側は使う人数が限られるため、基本は楽観ロックを採用しました。
- コーディング規約(PSR2)やeditorconfig、Docsを書いてもらうなどを行い、最低限のコード品質を保ちました。
# 課題
- 仕様の未確定やコード品質の低下
仕様がなかなか確定しなかったり、確定しない状況で作り始めたため、コード品質の低下が発生しました。また、コロナだったため、リモートの中で若手のメンバーをサポートしたり、仕様をエンジニア間で整理する必要がありました。
# 工夫した点・成果
- Discordの導入やチケット管理の共有
Discordを導入し、常に話せる状態を作ったことで仕様の勘違いや漏れをできるだけ抑えるようにしました。
またペアプロを実施し、最低限のコードの品質を揃えることにしました。
顧客との仕様策定が会議・チケット・個別Slackなどでバラバラになってしまっていたため、Backlogに統一し、内容はRedmineに起票して情報やタスクの整理を行いました。
# 解決できなかった課題
- デグレーションの多発(ユニットテストの導入)
メンバーの追加や入れ替え、また仕様の細かい変更が多く、デグレーションが多発しました。請負のため、ユニットテストコードの必要性を理解してもらえず、書くことができませんでしたが、必要性を痛感しました。