本記事は、ソフトウェア開発者向けのオンラインメディア「CodeZine(コードジン)」からの転載記事です(オリジナル記事)。
サービスの課題を抽出、どこから手をつけるかの判断基準を探る
うるる社は社会課題でもある労働力不足を、ITを使ったマッチングシステムで改善を目指す企業。データ化業務の受託やクラウドワーカーを活用するSaaS事業を主としており、2020年12月に新たなサービスとして「OurPhoto」をM&Aで自社サービスの一環として取り入れた。OurPhotoは七五三や結婚式といった個人の撮影ニーズに対し、フリーのフォトグラファーをマッチングするWebサイト。累計撮影実績も8万件を超える人気サービスだ。
プロが撮影する写真は一味違う。これをリーズナブルな価格で手軽に利用できるマッチングサービスはやはり便利である。M&A実施後、うるる社とのシナジーや、事業拡大ができる状態にすべくOurPhotoのシステム統合を図った。しかし、OurPhoto プロダクト開発部長 プロダクトマネージャー 堂上和那氏は「何からやっていけばいいのだろうと、かなり頭を悩ませました」と当時を振り返る。
M&A前のOurPhotoのシステムは5人ほどのエンジニアが担当し、全員が常駐ではなく実際はCTO1人入れて2、3人での運用だった。インフラはMicrosoft Azure上に構築されていたが、構築は外注だったため詳しい人がいない。見てみると、Azureのインスタンス1つの上で動作するなど障害に弱い状態で、PHPのバージョンアップはされていたものの、システム全体の脆弱性の評価などはされていなかった。コードベースでは、1ファイルで1000行を超えるプログラムファイルが多数存在していた。その他、デプロイは自動化されておらず、手作業でデプロイを行なっており、以前のCTOしか分からないなど属人化も問題だった。
それでも前に進まなくてはいけない。堂上氏は、M&A実施後、インフラやプログラム、開発の進め方、誰がエンジニアかなどの詳細を、端から端まで猛烈な勢いで見渡し、2か月間ですべてキャッチアップし計画を練るまでに至る。
目指すべきは「サービス」と「チーム」の拡大への対応
山のような課題を前に、堂上氏は注視すべき場所を2つとした。それはOurPhotoがこれから成長するために重要となる、サービスとチームだ。サービスでは、今後ユーザー数が拡大してもそれに柔軟に耐えられるシステムが必要、チームでは属人化を廃し、可能な限り自動化を目指すこととした。加えてチームの人員が増えても、生産性を落とさない仕組みも忘れないようにした。サービスとチームがスムーズに拡大できるシステムを目指すと、狙いを定めた。
サービス拡大に備え、インフラ基盤を新たに構築する
OurPhotoのインフラはMicrosoft AzureからAWSに引っ越しすることにした。AzureではWebサーバーやDBサーバーを単一インスタンスで運用していたが、AWSではコンテナ技術を利用して複数のWebサーバーの並行稼動や、DBはAuroraを導入し、オートスケールを可能にするなど、システム全体の可用性を向上させた。もともと他の自社サービスではAWSを使っており、社内エンジニアが慣れており、ナレッジを存分に活かせるという利点もあった。
デプロイフローの自動化では、AWSのコードシリーズを使って実現した。GitHubに新しいコードをマージしたら自動で動く仕組みを実践。これによって基本的には誰でもリリース作業ができるようになる。
AWS Lambdaなどのサーバーレスアーキテクチャーを採用して画像のリサイズ処理を行い、画像のアップロードなどの処理スピードを向上した。これは登録フォトグラファーによる納品作業スピードが上がり、かなりの好評を得た。セキュリティ面では、AWS Security Hub、Amazon CloudWatchなどを利用して、ログの収集や、セキュリティの穴や危険な設定の検知を実施し、定期的なチェックと改善ができる状態にした。
保守性や品質を上げるための改善を実施
1000行を超える巨大なコントローラーのスリム化を実施。堂上氏は「今回の改善で一番時間を使った部分です」と振り返った。コードは必要な処理が上から順にバーっと書いてある状態だったので、データ処理のロジック、業務ロジック、画面操作のロジックなどを適切に分け、責務の分割を実施。これで可読性が大幅に向上。またコードのリファクタリングの中で、バグが相当数見つかり、併せて修正作業も実施した。
スリム化の対象はユーザー側に絞った。堂上氏はその理由を「プロダクトをもっと成長させていく時に、ユーザー側で機能の追加、機能の改修などをたくさんやっていきたい。だからユーザー側のコントローラーをスリムにするように優先順位をつけました」と、事業のフェーズに合わせて作業を進めることが大切と述べた。
属人化の解消では、今までのCTOに手順や運営について明文化してもらう。CTOの時間は、すべてこれに充てた。ただ、しっかりしたドキュメントは時間がかかるので、ヒアリングなどを重ねて適宜判断していった。
当時OurPhotoにはテストコードがまったくなかったので、Unitテストを導入。CI/CDツールである「CircleCI」を導入して、GitHubにプルリクエストを上げたら同時にテストを実行、テストが通らないと次に進めないフローも確立した。ユーザーがサービスを利用する上での重要な操作において、バグを起こさないという観点で、優先順位をつけながらテストを用意した。
その他、技術的負債の確認に「Code Climate」、バグの検知に「Bugsnag」、パフォーマンスの監視に「Datadog」などのツールを活用した。
より高い生産性を目指したチームを構築する
生産性向上のためにはスプリント開発の手法を導入した。従来は少人数での開発だったので、特にリリースのサイクルは決まっていなかったが、今では基本リリースは毎週1回という運用に変更。すでにリリースは自動化してあるので誰でも可能だ。各人のタスクはPivotal Trackerというツールで管理し、毎週1回のミーティングをしっかり行えるようにしている。
リリースフローは見直して、開発環境と検証環境での動作確認を実施、両方のテストはCircleCIが自動でテストを実行し、これを通過しないとリリースに至らないというルールも作った。
プロダクトそのものの成長を考えることが重要
こうした改善の結果、現在開発チームは10人、属人化は解消され効率的に開発サイクルを回せるようになっている。
堂上氏は「特に、属人化問題が早期に解消できたので、その後のチーム拡大に大いに助かりました。チームが大きくなると、新たなコミュニケーションが増え、分からないことも増えてくる。その中で、いかにスムーズに開発を実施できるかが非常に大事」と語った。
スタートアップや新規事業の立ち上げというケースでは「何をどうすれば」といった悩みが多い。堂上氏は「今はどんな事業フェーズなのかを理解し、そこに適切な技術選定や整備を行うことが最も大事です」と自身の経験から得られた知見を共有した。