# プロジェクトの詳細
## チーム情報
ネイティブエンジニア(3人)
バックエンドエンジニア(自分含め2人)
# プロジェクトの詳細
スタートアップのバックエンドエンジニアとしてライブ配信アプリの立ち上げと新機能開発を担当しました。ネイティブアプリの上流設計も担当しました。
## プロジェクトにおける自身の役割
- 要件定義
- 全体アーキテクチャの設計
- API開発
- バックエンド、ネイティブ開発のリードエンジニア
- エンジニアリングマネージャー
# マネジメント、リーダー経験について❶
## プレイングマネージャーとしての業務
#### 課題
プロダクトの年数に比べて技術的負債がかなり多いことが課題として上がっていました。
原因としては
- 明確な設計指針が決まっていない
- コーディング規約がない
- とりあえずリリースすることが目的になっている(それを保守していくという意識がない)
の三つが挙げられました。
#### 工夫
まず短期的にできる施策としてコーディング規約の明確化や設計指針の明確化を行いました。メンバー全体のmtgで自分の設計を発表しメンバーからも賛否の意見をもらうことで自分がこの決定に携わったという意識を各々に持ってもらいました。保守意識の向上については、中期的な施策にはなりますが、機能を作るときに負債が原因で工数が増える例を毎日の定例で取り上げることで後々困るのは自分たちという意識づけも行いました。
#### 成果
その結果、レビューでも規約に沿っていないなどの指摘が飛び交うようになるなどポジティブな変化が見られました。また、見積もりの際にも既存の負債の解消や新たに余計な負債を生まない工数も含まれるようになり、保守性の向上の意識がチーム全体に浸透していきました。ネガティブな側面としてはとりあえず設計とか気にしずに作りたいというモチベーションのメンバーが離れていくきっかけにもなってしまいましたが、プロダクトの成長という観点で言えばポジティブな面が多かったと思います。
## プレイングマネージャーとしての業務❷
### 開発フロー全体を見直し、デグレを8割減
#### 課題
リリースの度に大きめの不具合が出てしまっていました。前述のユニットテストの不足もありますが、1番の問題はQAが十分になされていないことが問題でした。技術的負債がかなり溜まっていたので、デグレがかなり起きやすい状況になっていましたが、それをカバーしうるだけのQAができていませんでした。また通しテスト中に数多くの不具合が出てきて、特定機能のRevertやリリースの延期などを余儀なくされる状況でした。
#### 工夫
マージ前の機能ごとのQAとリリース前の通しQAを積極的に行うことにより、開発時にデグレが起こらないようにするフローを組みました。また通しQAの項目も不足していたので全機能を洗い出し、それぞれの項目に強弱をつけ全体への影響があまり出ないようにもしました。
#### 成果
リリースの度に起こっていた不具合を約8割減少させることに成功しました。また、マージ前のQAを実施したことにより、リリース時の通しテストで報告される不具合もかなり減らせたおかげで安定したリリースフローの実現ができました。
## バックエンドとiOSチームのテックリードとしての業務
#### 課題
上記の技術負債の他に技術的な知見が少ないこともチームの課題として挙げられました。CTOが技術的にそこまで深ぼった経験がない方ではあったので致し方のないことでもありました(それを悪とは思っていないです)が、プロダクトの成長には技術的な専門性の向上を各チームで行う必要があると感じました。
#### 工夫
バックエンドとiOSのそれぞれでお手本となるようなものを作るため、ある機能のリファクタリングを企画しました。これに準えて実装すればある程度の質は担保されるというものを目指しました。iOSについては実装は他の方に任せることで属人化を防ぐ取り組みもしてみました。
#### 成果
その結果、他の機能もお手本の機能に倣ってリファクタしていきたいという声がチーム内から出るようになりました。実際のリファクタについても、自分の指摘を元に他の方が似たような指摘をまた他の方にしていくという流れが作れ、チーム全体としての技術力の底上げを図ることができました。
# 代表的な施策
### 長期の運用を見越した堅牢な設計技術の導入
#### 課題
Laravelを使用しており、特定の範囲への責務の肥大化やコードの継ぎ足しによる複雑化が進んでおり、ある機能を修正すれば別の機能の不具合が高い確率で発生する状況でした(当然ユニットテストもほぼありませんでした)
#### 工夫
ドメイン駆動開発の一部とCleanArchitectureを導入し、一つ一つのクラスの責務を整理し配置し直すことで修正による影響範囲を限りなく小さく納めることにしました。その結果、機能改修時に別の機能がバグを起こすということはほぼ起こらなくなり、ユニットテストも十分に実装することができました。またバックエンドだけではなく、ネイティブチームへも助言を行い、バックエンドと同じような設計の見直しやユニットテストの導入も進めていました。
#### 成果
変更箇所が局地的になったことによる他の箇所でのバグの発生を少なくすることに成功しました。また、CleanArchitectureを採用したことにより、ビジネスロジック、アプリケーションロジック、プレゼンテーションロジックを実装前に考える必要性が出てきたことにより、実装の抜けもれや仕様の抜け漏れの指摘などが各エンジニアが自分でできるようになりました。
### 大規模施策の推進
#### 課題
リソースが少ない中で事業計画に沿った機能開発をするために、スピード感を持って機能の開発にあたる必要があった。技術的負債が多い中で複雑な機能をその上に作っていく必要があった。
#### 工夫
自分がPMを兼任することでPdMからの仕様の吸い上げから実装までのリードタイムをなるべく少なくするようにしました。またネイティブ開発も一部兼任したことでAPIの仕様などをスピード感を持って決めることができました。既存の箇所に新機能を実装していく部分については、納期と相談しながら適時技術的負債の解消にあたった。技術負債の解消には自分がバックエンドとクライアントサイドの一部を両方兼任することで余計なコミュニケーションロスを減らし、数時間から数日で解決するようにしました。リリース遅延をなくすためにQAの方と協力して境界値テストや既存のデグレチェックなどをかなり手厚くしてもらいました。
#### 成果
ファンランキング機能や課金システムと連携したいいね機能の拡張などの複雑な機能を事故なく遅延なくリリースすることができました。ユーザーからの評判の声もかなり良く、文字通りやって良かったと言えるプロジェクトになりました。
### DBパフォーマンスの向上
#### 課題
リアルタイムの通信が多く行われる状況下でDBのパフォーマンスの問題が顕著になっていました。特にランキングの集計に負荷がかかっており、その度にサーバーリソースが枯渇するという問題があった。
#### 工夫
スロークエリの発見と実行計画をもとにしたインデックスの付与などを行いました。またランキングの集計については、そもそもの設計から見直しました。具体的にはランキングを取得する際に毎回集計処理をしていた部分を、redisのzindexの機能を使い集計を都度行うようにすることで、サーバーに負荷を与えすぎずに要件を満たせるようにしました。
#### 成果
スロークエリの解消により、全体のDBのパフォーマンスが目に見えてわかるくらいに改善しました。またランキングの集計も毎回サーバーが落ちていたところから、大規模イベントのランキング集計にも耐えれるようになりました。