2022年5月にCTOとして入社してから約1年半、これまで取り組んで来たことを振り返ってみました!(もちろん僕だけで行った訳ではなくエンジニア全体で行った取り組みです)
これまで整備されていなかったところを整備出来た事によってサービスの品質を上げたり、デリバリーの速度向上によりビジネスが加速するようにしてきました。基本的な部分の取り組みが多いですが以前からすると大幅に変わったので紹介します!
EC2からECSへのインフラの変更
サーバーにはAWSのEC2を使用していましたがECS Fargateに乗せ換えました。開発はDockerにより元々行っていた為、コンテナをGitHub Actionsによりビルドしてデプロイ出来るようになり、環境の変更を行いやすくしました。また、オートスケールも自動的にされるので安定稼働させることが出来るようになりました。
Aurora Serverless V2の導入
データベースにはMySQLを使用していましたが、一部のプロダクトのデータベースをMySQL互換のAurora Serverless V2に変更しました。Aurora Serverless V2の単価がかなり高く思ったほど費用は下がらなかったですが、サイトの負荷でスケールするだけでなく、バッチ処理でもスケールしたりする為、パフォーマンスの面でも良くなっただけでなく安定稼働させられる様になりました。
AWS Batchの導入
これまで、バッチ処理を行う際Lambdaを使用してバッチ処理用のEC2を立ち上げ実行し、完了後にLambdaによりEC2を停止させるという事をやっていましたが、AWS Batchを導入しバッチ処理もスケールしやすくし、環境の変更も行いやすくしました。
テストの追加
サーバー、フロント共にテストが書かれていませんでした。サーバーではpytest、フロントではjestのテストフレームワークを採用しています。
情報が多くメンテナンスもされている為これらのテストフレームワークを導入しました。これまでテストが書かれていなかったという事もありなるべく情報が多く、便利なライブラリやテスト独特の書き方などなるべくスムーズに入れるようにこれらのフレームワークを選択しました。
現在まだ十分にテストが書かれていない部分もありますが更に追加しています。
Pull Request / レビュー
プルリクエストやレビューの文化もなかった為早急に導入しました。main/developへのマージには最低1人のレビューを必須としています。現在ほとんどのPRは2~3人によってレビューされています。
また、プルリクについてもプルリクにどの様な情報を載せたほうが良いか、レビューの役割についても コードの品質を保つ / コードの把握 / 他人のコードを読むことによって勉強になる / 質問もok / 指摘だけでなく良い部分にもコメントしよう / レビューをする側もされる側も感謝とリスペクトを忘れない などエンジニア全体で共有することによってプルリクエストによって良い議論が出来るようにしました。
TypeScript / Pythonの型ヒントの導入
これまでフロントの一部ではTypeScriptが導入されていましたが、フロント・サーバー含め全体的に型の導入を進めました。アプリケーションの規模も大きくなり複数人で開発するようになってきたため型による恩恵をかなり得られるようになりました。
CI/CDの構築
入社時デプロイは手動で行っているという状況でした。GitHub Actionsを用いてフロント、サーバー、インフラとすべての領域で自動化を行いました。
インフラのコード化(IaC)
下記の様な理由でTerraformを選択しました。
- シンプルな構文であること(複雑になりにくい)
- CloudFormationをバックエンドに持つツールの場合、インポート出来るリソースに制限
- 情報が多い
HCLのレビューについてもAtlantisというCIツールを導入しました。これにより環境デプロイ時にロックを行い競合しないようにしたり、適用した時の差分が確認しやすくなったり、操作をプルリク上で行える事によって他の人も状態を把握することが出来るようになりました。
DRF(Django Rest Framework)からの脱却
DRFを使う事によってOpenAPIのドキュメントを自動生成してくれるという利点はありましたが、簡単な処理のAPIの場合は簡潔に書けますが、複雑な処理のAPIを作る際には逆に煩雑になってしまうという事がありました。
アプリケーションが複雑になるにつれて作るAPIも複雑なものになってきてコードがどんどん煩雑になってきてしまっていた為、アーキテクチャの見直しを行い、DRFの使用をやめてDjango Ninjaというライブラリを使ってOpenAPIのドキュメントを自動生成するという方針にしました。現在移行中です。
Vue.jsからReactへの変更
現在・将来を考えた時の情報量の多さや型の面での利点、ライブラリの豊富さ、今後のエンジニアの採用のしやすさなどを考えてReactへ移行することにしました。移行時の課題も沢山ありまだまだ途中ですが今年も進めていく予定です。
分析基盤の構築
分析したいデータをKinesis Data Firehoseを経由してS3に簡単に送ることが出来る分析基盤を構築しました。S3やDBに保存されたデータをAthenaにより汎用的にすぐに分析することが出来る為、分析へのハードルがかなり下がりました。
BIツールの導入
これまで感覚で行っていた事を見える化して分析出来るようにしました。また、これまでエンジニアが行っていたCSVの出力の自動化やデータをサーバー側で取得していたフロントエンドから分析データをS3に送ることでデータベースへの負荷を減らしたり幅広く活用されています。
当初はRedashをAWSにて構築して使用していましたが現在はQuickSightを利用しています。現在はエンジニアのみがダッシュボードの作成を行っていますが、今後はダッシュボードの作成が出来る人を増やしていこうと思っています。
採用
入社時のエンジニアは3人でしたが現在は17人、当時から5倍以上に増えてチームとして分かれたり、勉強会をしたり、1on1で振り返りや相談が出来るようにしたり、フロントエンド開発の業務へのスムーズな参入をサポートするためのカリキュラムを作成したり、PMも入社して組織的に動けるようになってきました。これから更に開発を推し進めるため採用を頑張っていきます!
最後に
これまでに色々な改善を行ってきましたが、まだ基本的な部分が整備出来てやっとスタート地点に立てたというだけなので、2024年を飛躍の年としてエンジニア全体の力で頑張っていきたいと思っています!
iimonではエンジニアを募集しています!カジュアルからでもお話させていただきたく、是非ご応募していただけると嬉しいです! Wantedly