ACES エンジニアブログ

ACESのエンジニアブログです。

エンジニアがPdM領域に踏み込む挑戦 - 10%ルールの実践と学び -

こんにちは、株式会社ACES でテックリードをしている奥田(@masaya_okuda)です。

今日のLLM並びにAIエージェントによる開発体験の変化は凄まじいですね。以前はコーディングだけで手一杯でしたが、多くの業務でスピードアップの恩恵を受けています!

そんな中で、フロントエンド・バックエンド・デザインなどあらゆる領域を越境してプロダクトのあるべき姿を構想し、優れた顧客体験を生み出すプロダクトエンジニアという職種が注目されています。

note.com

本記事ではプロダクトエンジニアを目指し育てるためのチャレンジをご紹介します。

フルサイクルエンジニアが多く所属するチーム

私たちのチームでは、エンジニアのほぼ全員がフルサイクルエンジニアとして働いています。要件定義から設計、実装、テスト、リリース、リリース後のサポートまで一貫して関わるため、縦割りの役割分担はしていません。

しかしプロダクトロードマップのような上段の戦略からお問い合わせレベルの軽微なものまで、「何を作るのか?」の意思決定がPdMに集中し、同時にボトルネックにもなっていました。

Right Touch社の責任分解点のスライドが非常にわかりやすかったので引用すると、以下のような状態になることが理想でした。

参考: 小規模組織のプロダクトエンジニアとして、アンラーニングしたこと - Speaker Deck

このような責任分解点のチームを目指すにあたり、「10%ルール」という取り組みを実践することになりました。

10%ルールとは?

10%ルールとは、エンジニアの毎月のリソースの10%を「エンジニア主体でプロダクト価値向上の仮説検証に充てる」ための時間にするというものです。エンジニアが主体となり、プロダクトやユーザーの課題に対してどのような打ち手が有効かを提案し、要求定義も行います。

この実験的な取り組みを、まずは私が3ヶ月実践しチームにFBすることとなりました。 「毎月1つ提案からリリースまでやり切る」を目標にして取り組んだことを以下でご紹介します。

1ヶ月目: 顧客課題の把握

最初の月は、どのような機能がプロダクトの価値向上に寄与するのかが分からず、手探りの状態でした。多くの機能アイデアは思いつくものの、それをどのように優先順位付けすればよいのかがわからなかったのです。

そこで、まずは以下のアクションを取りました。

  • これまでのお問い合わせ履歴を一通り確認
  • 営業、カスタマーサクセス(CS)、社内のユーザーから課題をヒアリング

その結果、少しずつ共通する課題も見えてきました。ここからユーザーストーリーや機能を考えるにあたり、「その場限りではなく、プロダクトに中長期的な価値となる提案をしよう」と考えました。いくつかの機能を考えて改めてBizメンバーに壁打ちしたところ、「短期的な売上や解約防止には直結しない、結びつくまでに他にも機能開発が必要」というFBを受けました。

短期的な価値も踏まえてもう一度提案したいと考え、企画した機能は取り下げることにしました。この時EMの小林から「一発で通る企画なんてないから、何度もチャレンジしよう!」と励まされたことが印象に残っています。

2ヶ月目: 既存機能の価値向上

改めて課題を整理した際に、「MVPとしてリリースしたが、その後の改善が滞っている機能」に注目しました。ファーストリリース後、ユーザーにとって使いにくいまま他の開発に埋もれている機能はないか?という観点です。

具体的には、会議の一括操作機能をリリースしたものの、閲覧権限に関わるグループの紐付けを一括で変える操作が未実装であり、使いづらさに繋がっていました。ユーザーはプロダクトを少数のメンバーで使い始めて徐々に展開していく際に、グループの運用を見直したかったのです。

今回は開発まで進むこととなり、UI/UXの設計もデザイナーと行いました。この際、AIツールのBoltを活用することで、複数の機能モックを作りデザイナーやBizメンバーと「具体的な動きや操作感」まで擦り合わせることができました!

会議に紐づくグループの一括変更機能

3ヶ月目: データに基づく意思決定

次に取り組んだのは、CSやユーザーから寄せられた「音声のみの会議を一時的に外部共有できないことがネックになることが多くて…」というフィードバックでした。

私たちはZoomなどのオンライン会議の議事録サービスを提供しており、会議の動画と議事録を一時的に外部共有する機能がありますが、音声のみの会議は2つの理由から共有機能を提供していませんでした。

  • リリース当初、音声のみの会議はIP電話ツールと連携しないと作成されず、利用するユーザーがかなり限定的だった
  • 開発コストが高く、他の開発候補と並べた時に劣後となっていた

特に1つ目の理由があったためCSから相談を受けた時は意外でした。詳細を聞くと、以前リリースされた「動画音声ファイルをアップロードして議事録を作成する機能」をご利用するお客様が増えており、伴って音声ファイルをアップロードして作成する会議の割合が増えているとのことでした。

録画・録音データをアップロードして解析できる機能

実際にアップロードして作成された会議の割合を調べると、この機能の利用率は右肩上がりで伸び続けており、動画と音声の割合は4:6で音声のみの会議の方が多く作成されていることがわかりました。

開発コストが低いことに気づき、数日で機能が完成

先の調査で音声会議の割合は増えており、伴って共有機能の不足が使いづらさにつながっていることがわかりました。次に開発コストですが、調べてみると簡単に開発できることがわかりました。

  • 近い箇所の実装を直近で行なっており、コードの知識が深くなっていた
  • リファクタリングによって複雑性が軽減され、コンポーネントの共通利用ができる状態になっていた

最終的に設計〜実装までを3日ほどで完了しリリースすることができました!

要件定義の際に、「合わせてこんな改善もした方が良いのではないか?」という意見もいくつか上がりました。開発コストとリリーススピードを考慮し、ユーザーストーリーに直接関係ない部分はスコープ外と判断しました。

振り返り: エンジニアがPdM領域まで踏み込む難しさと面白さ

この3ヶ月を振り返って、PdM領域の仕事の難しさを痛感しました。「作った方が良さそうなこと」は無限にありますが、その中で優先順位やスコープを決めるには多くの時間をインプットにあてる必要があります。

  • プロダクトロードマップなど大きな粒度でのスケジュールを決定、調整
  • 日々お問い合わせの確認
  • Bizサイドとのmtgを通して情報の収集/把握/深掘り

エンジニアが限られた時間の中でPdMのインプットをトレースするのは非常に難しく、時間を要することを実感しました。

一方で、エンジニアには「より適切なHowを考えられる」という強みがあります。要求定義の段階から関わることで、

  • どうすればユーザーの課題を埋められるのか?
  • どの選択肢が最もコストパフォーマンスが良いのか?
  • 将来の開発のしやすさを考慮した際に最適な設計は何か?

といった視点を持つことができます。PdMが「難しい」「時間がかかる」と考えることでも、エンジニアが見ると「すぐにできる」「選択肢が複数ある」といった視点が持てる場合があります。

これらの強みを活かし、エンジニアとPdMが適切に噛み合うことで、プロダクト開発はよりスピーディーに、品質の高いものになっていくのだと感じました。今後もこの取り組みを継続し、さらなる価値向上に貢献していきたいです。

最後に

本記事では、エンジニアがPdM領域に踏み込み、プロダクト価値向上に主体的に取り組む「10%ルール」の実践を通じて、PdMとの適切な役割分担や意思決定のスピード向上に挑戦した事例をご紹介しました。

この取り組みを支えているのは、「エンジニアがプロダクト全体を見渡し、ユーザーの価値に直結する意思決定を行う」文化です。ACESでは、エンジニアがPdMやBizと密に連携しながら、技術だけでなく、プロダクトの未来を共に創る環境があります。

このような開発スタイルに興味をお持ちの方、プロダクトエンジニアとして幅広い領域で価値を発揮したい方、ぜひ一度カジュアルにお話ししませんか? ACESのチームで、新しいプロダクトのあり方を一緒に探求していきましょう!

ACESの採用情報はこちら↓

youtrust.jp

youtrust.jp

「徹底的にパクる」で開発生産性を最大化!他社の知見を活かす方法

こんにちは、株式会社ACES でテックリードをしている福澤 (@fuku_tech) です!

最近、新車を購入し、遂に昨日納車されました!しばらくはノー残業で早く帰宅して、たっぷりと新車を楽しもうと心に決めた今日この頃です。

1. はじめに

大学院時代、ポスドクの方から「論文や技術書には執筆者の数ヶ月・数年にわたる集大成が詰まっている。それを短時間でトレースできるなら、とても効率の良い投資だ」という話を伺ったことがあります。

この考え方は、開発生産性の改善にも当てはまるのではないでしょうか。試行錯誤を繰り返すことも大切ですが、すでに成功している企業の知見を活用することで、より効率的に進めることが可能です。

ACES Meetの開発チームでは、他社の技術ブログや取り組みを参考にしながら、開発生産性の向上に努めています。本記事では、「徹底的にパクる」というアプローチで、どのように開発生産性を向上させているのかをご紹介します。

2. 他社の知見の取り入れ方

私たちは、以下の基準に沿って参考にする企業を選定しています。

  • 開発生産性の向上に成功している企業
  • 開発の進め方や文化を積極的に外部に発信している企業
  • 自社と開発思想や文化に共通点が多い企業

具体的には、最近では Findyさん、Nealleさん、ユーザベースさんといった企業のテックブログや公開資料を参考にし、自社の開発プロセスの改善に取り組んでいます。

ただし、単に他社のやり方をそのまま模倣するのではなく、自社の課題や現状を踏まえて、適用可能かどうかを判断することを重視しています。どんなに優れた施策でも、環境やチームの状況が異なれば、そのまま導入することが最適とは限りません。

そのため、まずは他社の取り組みの背景や目的を理解し、それが自社にどのような価値をもたらすのかを十分に咀嚼した上で、自分たちなりにアレンジして取り入れるよう努めています。

3. 実践事例

私たちは、開発生産性向上のために他社の知見を積極的に活用し、実際にいくつかの施策を取り入れてきました。ここでは、特に効果が大きかった事例を紹介します。

なお、昨年10月からこれらの施策を継続的に取り入れた結果、PR数の観点では、施策実施前(7~9月)と施策実施後(10~12月)を比較すると、開発生産性が1.5倍以上に向上しました。

3-1. Findyさんの爆速開発シリーズを徹底的にパクる

以下のテックブログやスライドを読み込み、自分たちの課題感に刺さるところから愚直に取り入れていきました。

Findyさんは、私たちが目指したいと考えているものに近い開発文化や思想を言語化して発信してくれているため、非常に参考にしている企業の一つです。特に、「とにかく早く顧客に価値あるものを届ける」という姿勢に共感を抱いています。

なお、ACES Meetの開発チームでは、Findyさんのテックブログに記載されている内容を施策として次々に展開することで、「次はFindyさんの記事に書いてあるこれをやってみよう!」といった会話が自然に成立するようになっており、チーム全体でFindyさんのファンになっていますw

tech.findy.co.jp tech.findy.co.jp tech.findy.co.jp tech.findy.co.jp tech.findy.co.jp tech.findy.co.jp speakerdeck.com

3-1-1. 小さなPull Requestの徹底

  • 課題感:
    • 1つのPull Requestに複数の変更が含まれ、レビュー負担が増大
    • レビュアーと実装者の認識がずれ、指摘や修正が多発し、手戻りが発生
  • 実践内容:
    • タスク分解の強化:事前に要件を具体化し、小さなタスク単位で開発
    • PRの粒度を明確化:「意味のある最小単位」でPRを作成する指針を共有
    • レビュアーとの事前認識合わせ:実装前にバディを組み、タスク分解と開発方針を共有
  • 結果:
    • PRの適切な粒度が維持され、レビューが効率化
    • レビュー時に「何を見るべきか」が明確になり、負担が軽減
    • 仕様や設計の共通理解が深まり、手戻りが減少

本取り組みの詳細については、以下の記事をご参照ください。 tech.acesinc.co.jp

3-1-2. レビュー最優先の文化醸成

  • 課題感:
    • PRのレビューが後回しになり、開発の停滞やリリース遅延が発生
    • レビュー待ちの時間が長くなることで、フロー効率(開発のスムーズさ)が低下
  • 実践内容:
    • レビューの迅速化Google’s Code Review Guidelines - Speed of Code Reviews を参考に最遅でも1次レビューは1日以内としていたところを、2〜3営業時間以内を目標に修正
    • フロー効率の低下を防ぐための認識合わせ:「レビューの遅れが開発全体に与える影響」をチームで共有
    • レビュー通知の見逃し防止:SlackとGitHubを連携し、PRの通知を確実に受け取れるように
  • 結果:
    • レビューの迅速化により、開発の停滞が減少し、フロー効率が向上
    • レビュアー・レビュイー双方の負担が軽減し、フィードバックの質が向上
    • 通知を活用することで、PRレビューの抜け漏れが減少

3-1-3. CIの高速化

  • 課題感:
    • CIの実行時間が長く、開発者の待ち時間が増え、フィードバックサイクルの高速化を阻害
  • 実践内容:
    • Rust製のLinterへの移行:フロントエンドは Biome、サーバーサイドは Ruff に移行し、Lint時間を短縮
    • テストの並列実行GitHub Actionsの matrix機能 を活用し、テストの並列実行を実現。その際、各コンテナにテストケースを均等に配分し、全体の実行効率を最適化
  • 結果:
    • Lint時間:1分弱 → 3秒未満、テスト時間:10分弱 → 5分未満に短縮
    • CIの高速化により、開発者の待機時間が減少し、フロー効率が向上

3-1-4. feature flag の活用

  • 課題感:
    • 一定規模のユーザーストーリー開発ではepicブランチを運用していたが、長期間のブランチ維持によりコンフリクトやマージ負荷が発生
    • 一部のユーザーに対して先行リリースを行う仕組みがなく、段階的な展開が難しい
  • 実践内容:
    • DevCycleの導入:feature flag を手軽に管理できる環境を整備
    • feature flag の運用開始:完成した部分から順次マージできるようにし、完全ではないがトランクベース開発に近づけた
    • 段階的なリリースフローの確立:社内限定リリース → 全体公開と、柔軟なリリースを実現
  • 結果:
    • epicブランチを不要にし、開発中の変更を早期にメインブランチへマージできるようになり、コンフリクトの発生が減少
    • 段階的なリリースが可能になり、リスクを抑えながら新機能を展開できるようになった
    • デプロイのハードルが下がり、よりスムーズでカジュアルなリリースが可能に

3-2. Nealleさんの借入メモを徹底的にパクる

Nealleさんは、Findyさんと同様にACES Meet開発チームと共通する開発思想や文化を有しており、さらにACES Meetの開発チームと同様に Python/Django を採用しているため、技術面でも参考にしやすいと感じている企業です。そのため、テックブログを定期的にチェックしています。

ちょうど「やらないことを増やし、開発スピードを上げる」ことを意識していたタイミングで、以下の記事を拝読しました。借入メモについて、具体的な運用イメージが得られたことで、すぐにチームに展開し、運用を開始しました。

nealle-dev.hatenablog.com

私たちのチームでは、まずは運用に乗せることから始めたいと考え、上記記事で紹介された方法をよりライトな形にアレンジして取り入れています。

ACES Meet開発チームにおける借入メモの運用方針

結果として、開発時に「この部分は積極的に借入を実施し、戦略的に判断・着手を遅らせよう」というコミュニケーションが増えた感覚があり、導入してからすぐに借入メモの効果を実感できています。

関連する内容を以下の記事でも記載しているので、詳細はそちらをご覧ください。

tech.acesinc.co.jp

3-3. ユーザベースさんのペアプロのノウハウを徹底的にパクる

私たちのチームは、これまで自然発生的にペアプロやモブプロを実施していましたが、体系的なプラクティスとして意識できていなかったため、より効果的な方法を模索していました。

そのような中、ユーザベースさんが公開している以下のpair-programming-guidelineの存在を知りました。実践的な内容が整理されており、チーム全員で読み合わせを行った上で、取り入れやすいプラクティスから適用を始めています。

github.com

もともと設計フェーズでは ペア作業を推奨 していたため、その流れを活かしながら導入を進めました。最初のステップとして、従来のdesign doc作成時のペア作業に対してプラクティスを適用することから始めています。

ACES Meet開発チームにおけるペアプロ・モブプロの活用方針

そして、実際にペアプロ・モブプロを実践してみたところ、以下のような効果が得られています。

  • 複雑な実装の早期解決: 1人で進めていたら1日以上かかりそうだった実装が、ペアプロで知恵を出し合うことで 15分で解決
  • ハイコンテキストな設計の効率化: 新規ユーザーストーリー実装時に、既存の認可ロジックに手を加える必要があったケースで、モブプロを活用し、ナレッジシェア・影響範囲の洗い出し・設計を迅速に実施。結果として、フロー効率とレビュー速度が向上

このように、ユーザベースさんのガイドラインを活用することで、チームのコラボレーションが強化され、ペアプロ・モブプロが「なんとなくやる」から「効果的に活用する」へと進化しています。今後もプラクティスを深化させ、さらなる開発生産性の向上を目指します。

4. まとめ

本記事では、「徹底的にパクる」という戦術を通じて、他社の知見をどのように取り入れ、ACES Meet の開発生産性を向上させているかをご紹介しました。

このアプローチは、単に模倣するのではなく、自社の課題や状況に合わせた最適な形へと落とし込むことで、より効果を発揮していると考えています。

そして、徹底的にパクる戦術が実現できるのは、チーム全員が新しいチャレンジに寛容で、変化を楽しむ組織であるからこそだと感じています。

本記事を通じてACES Meetの開発チームにご興味をお持ちいただけましたら、ぜひカジュアル面談でお話ししましょう!

ACESの採用情報はこちら↓

youtrust.jp youtrust.jp

失注の理由はココだった!CREが解き明かした勝ちパターンと負けパターン

あいさつ

はじめまして、ACESでソフトウェアエンジニア兼CREをしている村上です。

最近はポーカーにハマり、内でも外でもポーカーばかりしています。社名のACESはポーカーにおける最強ハンドの名前と一致しているのでそれにあやかってポーカーも強くなりたいものです。

前回の記事で、CREの役割として以下の3つの挙げました。

  1. 顧客の現状を把握できるようにする
  2. 顧客の問題を取り除き、やりたいことを実現できるようにする
  3. CS業務を効率化し、顧客に向き合える時間を増やす

今回はこの中から、

  • 顧客の現状を把握できるようにする
  • 顧客の問題を取り除き、やりたいことを実現できるようにする

の2点を中心に、どのような取り組みをしているかを紹介します。

顧客の現状を把握する

顧客の課題解決にはまず顧客の現状を把握することが大切です。

ここではどのような方法で顧客の現状を把握し、その中でどのような気づきがあったかを具体例を交えて説明します。

トライアル中のミーティングの内容を確認する

顧客の現状を把握するうえで、CREになった僕がまず始めにやったのはトライアル中に行っている顧客とのミーティングをひたすら見ることでした。

初期は過去200件程度のミーティングを確認し、以降も月100件弱のミーティングを継続的に確認して常に顧客の現状を把握するようにしています。

これだけ多くの会議を見るとなると問題になるのが時間です。1つのミーティングが1時間ほどあると仮定すると、そのまま再生して全てをチェックするのは非常に時間がかかります。そこでポイントを絞り、主に以下のような点を重点的に確認しています。

  1. 顧客が何に困っていて、どのような期待を持ってトライアルを始めたのか
    • 「営業向けの教材を作りたい」「自社のノウハウを記録・共有したい」など
  2. 実際にプロダクトを使う中で詰まった部分や質問されたこと
    • 「UIが分かりにくい」「文字起こしが正しく出なかった」など
  3. 最終的に顧客の目的は達成できたか、その理由は何か
    • 「十分な会議が蓄積できなかった」「フィードバックを得る時間が足りなかった」など

これらの確認を通じて「顧客が求めている価値」と「その価値を阻害する要因」を把握することができます。

(ちょっと寄り道) ACES Meetで要点を簡単に把握できます!

実はこのトライアル中のミーティングの内容確認には、弊社のプロダクトであるACES Meetを活用しています。

ミーティング動画を丸々チェックするのが大変でも、以下の機能を使うことで効率よく要点を掴むことが可能です。

  • AIまとめ機能

    • 会議内でどんなトピックが話されていたかを、大まかにテキスト化・要約してくれます。

  • ハイライト機能

    • 指定した内容に関連する部分をピンポイントで抽出し要約してくれます。

これらの機能を活用することで、 顧客が本当に言いたかったことや困っている部分を効率よく抽出・分析できています。

どんな現状が把握できたか

実際に数多くのトライアル中のミーティングを見ていく中で、トライアル時に満足していただける顧客と逆にトライアル時に満足していただけず失注してしまう顧客をいくつかのパターンに分類することができました。

一例として、「ACES Meetで営業向けの教材を作りたい」という顧客に対して多かった失注パターンを紹介します。

  1. 教材を作りきれずにトライアルが終わってしまう
    • 教材を作るには大量の商談からお手本になる商談を抽出する必要があるが、トライアル期間内に十分な量の商談を録画することができない
  2. トライアル期間中に会議を振り返る時間が取れない
    • 大量の商談を録画したとしてもその内容を確認して教材を作る時間をトライアル期間中に取れない

顧客の問題を取り除く

ここまででどのように顧客が抱えている課題を把握するかについて書いてきました。

通常顧客の抱える課題は機能開発によって解決することが多いですが、中にはプロダクトに機能を追加しなくても解決できるものもあります。

例えば上述した「顧客が教材作成という大きな目標を達成する前にトライアルが終了してしまう」というパターンについては、大きな目標を達成するための中間目標を設けるという解決策がありました。

具体的には教材作成を目的とする顧客にはいきなり教材を作ることを案内するのではなく、

  • まずはAIまとめ機能やハイライトを使って商談の振り返りをしやすくする
  • 商談の振り返りをした中で「良い商談」「そうでない商談」を判断できるようにする
  • 「良い商談」を蓄積することで最終的に教材を作成する

といった形で段階を踏んで大きな目標を達成できるイメージを持ってもらうようにしました。

結果、これまで「教材を作る」ことを目的としていた顧客は目的を達成できずに失注してしまうことが多かったのですが、満足して契約していただけることが少しずつ増えてきました。

最後に

今回は、CREの主な役割の中から「顧客の現状を把握できるようにする」と「顧客の問題を取り除き、やりたいことを実現できるようにする」という2つに着目し、実際の取り組みと改善例を紹介しました。

今後も引き続き、顧客の現状に向き合い、どうすれば顧客により満足してもらえるかを考えていきたいと思います。

もしこの記事を読んで「CREに興味が湧いた」という方や、「ACESでどんな働き方ができるのか知りたい」という方がいましたら、ぜひお気軽にご連絡ください!ACESの採用情報も公開していますので、一緒に顧客の価値を最大化する取り組みにチャレンジしませんか?

少しでも興味を持っていただけた方は、ぜひカジュアル面談のお申し込みをお待ちしております!

ACESの採用情報はこちら↓

https://youtrust.jp/recruitment_posts/085878a8d5af64114c9365e75daebf9d

https://youtrust.jp/recruitment_posts/7c1f175e5ad9afc175945650f999d5ec

ACES Meet流MVP開発の進め方

こんにちは、株式会社ACES でテックリードをしている福澤 (@fuku_tech) です!

最近、新車を購入し、遂に昨日納車されました!しばらくはノー残業で早く帰宅して、たっぷりと新車を楽しもうと心に決めた今日この頃です。

1. はじめに

ACES Meet は商談や会議内容を可視化し、営業組織の強化を支援する 営業DX×AI SaaS です。音声書き起こしや対話分析など、多様な AI アルゴリズムを活用し、営業の生産性向上をサポートしています。

現在、ACES Meet は PMF(Product Market Fit)に向けて試行錯誤を続けている段階にあり、市場のニーズを捉え、素早く仮説検証を繰り返すことが不可欠です。

そのため、私たちは MVP(Minimum Viable Product)の考え方を取り入れ、ユーザーのフィードバックをもとにプロダクトを進化させる戦略を採っています。

本記事では、ACES Meet のプロダクト開発戦略を以下の MVP - not "bike to car" の記事の内容を踏まえながら、私たちがどのように MVP を考え、どのようにプロダクトを成長させているのかを具体的に紹介していきます。

www.linkedin.com

また、本記事は以前公開した以下の記事の内容をさらに掘り下げたものです。併せて読んでいただくことで、ACES Meet の開発戦略についてより深く理解していただけると思います。

tech.acesinc.co.jp

2. MVP - not "bike to car" の記事における主張

MVP - not "bike to car" の記事で筆者は、MVP開発において異なる製品を段階的に発展させるのではなく、最初から最終製品の形を意識しながら試作と改良を重ねることが適しているのではないか、という考えを主張しています。

ここで、説明しやすいように以降の文章では、下図の中段の絵のことを「キックボードから作る絵」と呼称し、下段の絵を「手押し車から作る絵」と呼称します。

MVP - not "bike to car"

MVPについて語る時、キックボードから作る絵のように「キックボード → 自転車 → バイク → 車」といった形で、段階的に進化させることがMVPのあり方とされることが多い*1ですが、筆者はこのアプローチが部分的にしか正しくないと指摘しています。MVPでは、最初から最終製品の形を意識しつつ、必要最低限の機能を備えたものを開発し、そこから改良を重ねる方法も有効なのではないか、というのが筆者の主張です。

例えば、車を開発する場合、キックボードから始めるのではなく、最初から「最低限の車」として試作し、テストを繰り返す方が目的に合っているのではないかと述べています。

また、筆者はユーザー体験(UX)の視点も重要だと指摘しており、初期のプロトタイプでは技術的な要素を最小限に抑えながら、ユーザー体験を検証する方法が有効であるとも考えています。

具体的には、手押し車から作る絵のように、初手はエンジンを搭載せず、ボランティアが車を押して動きを再現することで、技術的な負担を抑えつつ、ユーザーの反応を確かめることができるのではないかと提案しています。

このように、筆者は段階的な製品の進化ではなく、最初から本来目指す形を模索しながら改良を重ねるアプローチがより実用的ではないかと主張しています。

3. ACES Meet における「手押し車から作る絵」の解釈

以降、手押し車から作る絵の各フェーズのことをそれぞれ以下の名称で表現します。

  • STEP1: 手押し車
  • STEP2: 簡易トラック
  • STEP3: 試作車
  • STEP4: 完成車

ACES Meet の開発チームでは、プロダクト戦略として手押し車から作る絵を意識しながら開発を進めています。さらに、手押し車 → 簡易トラック → 試作車の進化と、試作車 → 完成車の進化には本質的な違いがあるのではないか? という独自の解釈を入れています。

この違いを端的に言うと、手押し車 → 簡易トラック → 試作車のフェーズは少しずつ形状が変化しながら進化しているのに対し、試作車 → 完成車のフェーズではタイヤ・エンジンの厚み・ライト・ボディ・塗装が一気にアップデートされていることが挙げられます。つまり、試作車 → 完成車のフェーズでは、それまで積み上げた知見やデータをもとに、プロダクトを抜本的に刷新するフェーズに入るのではないか? という仮説を持って解釈しています。*2

この考え方をもとにすると、手押し車 → 簡易トラック → 試作車は、試行錯誤を重ねながらロジカルに改善を積み重ねることで進化するフェーズであり、試作車 → 完成車は、それまでの知見をもとにプロダクト全体を再構築する大規模な転換フェーズであると捉えることができます。

この認識を持つことで、開発チームとしては、手押し車 → 簡易トラック → 試作車を「実験フェーズ」と割り切り、過度に時間をかけないようにする一方、試作車 → 完成車でスクラップ & ビルドしやすい形になっていれば多少の荒削りな部分があっても許容できる、という意思決定がしやすくなります。

4. ACES Meet の開発への適用

ACES Meet では、最初から最終製品の形を意識しつつ、最低限の機能を備えたMVPを市場に投入し、ユーザーのフィードバックをもとに進化させるというアプローチを採用しています。特に、第3章で述べたように、手押し車 → 簡易トラック → 試作車は実験フェーズ、試作車 → 完成車はプロダクトを抜本的に刷新するフェーズと捉えており、開発の進め方もこれに合わせて調整しています。

各フェーズでは、プロダクトの本質的な価値を見極め、開発リソースを適切に投下することが重要になります。

そのため、何を開発するかだけでなく、何を開発しないかを明確にすることも常に意識し、「やらないことを増やす」という方針を持ちながら取捨選択を進めています。

4-1. 実験フェーズでは本質的な価値を優先

手押し車 → 簡易トラック → 試作車のフェーズでは、ユーザーが求める本質的な価値を最小限の形で提供し、試行錯誤を重ねながら改善を続けることを重視しています。すべての機能を網羅するのではなく、仮説を立てながら最もインパクトの大きい機能に優先的にリソースを投下することで、スピードと価値提供のバランスを取っています。

4-1-1. ユーザーが価値を感じる部分を優先する

このフェーズでは、ユーザーが「業務プロセスの改善に繋がった」と実感できる体験や機能を最小限の形で提供することを最優先としています。そのため、すべての機能を作り込むのではなく、利用頻度やフィードバックをもとに、本当に求められている機能に集中し、優先的に開発を進めています。

仮説の精度を高めるために、ワークショップやユーザーインタビューを定期的に実施し、ユーザーの実際の課題やニーズを深掘りしています。こうした検証を繰り返しながら開発を進めることで、限られたリソースの中で最大の価値を生み出せるよう努めています。

ワークショップやインタビューの具体的な進め方については、また別の記事で詳しくご紹介する予定です。

4-1-2. 試行錯誤を前提にしつつ、拡張性を担保する

MVP開発では、試行錯誤を恐れず、素早く価値を届けることが重要です。初期段階では何が正解か分からないため、細かい仕様にこだわりすぎず、ユーザーに少しでも価値を提供できるのであれば試す、という柔軟なスタンスで進めています。

ただし、試行錯誤を重ねるからこそ、拡張性の確保も欠かせません。すべての機能を作り込むのではなく、将来的な変更や追加がしやすいように設計の柔軟性を持たせます。そのため、どこまで作り込むべきかは事前にチームで議論しながら進めています。

MVPとして開発を進める際、今後の拡張性をどこまで考慮するかはケースバイケースです。「とりあえず動けば良い」と割り切るのか、ある程度の変更を見越して設計しておくのかは、プロダクトの状況や開発の優先度に応じて判断する必要があります。

こうした判断に迷った際には、以下のフローチャートを指針の一つとし、「今回はどこまでやるか・何を捨てるか」を議論しながら進めています。

このように、ACES Meet の開発チームでは、試行錯誤を前提にしつつ、将来的な変更や拡張にも対応できる形を維持することで、スピードと継続的な進化のバランスを取ることを意識しています。

4-1-3. スピードと品質を両立するための開発方針

MVP開発ではスピードを優先する一方で、品質をおろそかにすると後のフェーズで修正コストが膨らみ、結果的に開発スピードを損なうリスクがあります。そのため、「スピードと質はトレードオフではない」という前提をチームで共有し、両立を前提とした開発を行うこと を重視しています。*3

たとえば、データモデルの設計やAPIのインターフェースなどの後からの変更が難しい部分は、序盤から適切に設計し最低限の拡張性を確保します。一方で、後から調整しやすい部分はスピードを優先し、短期間での改善が可能な範囲で進めることで、過度な作り込みを避けながらも品質を維持しています。

また、単一責任の原則を守ることで、コードの修正や拡張を容易にし、不必要なリファクタを減らすことを意識しています。責務を明確に分割することで、変更の影響範囲を最小限に抑え、開発のスピードを損なわない仕組みを構築しています。

加えて、チーム内では「スピードを維持しつつ、無駄な負債を抱え込まない方法」を学ぶ機会を設け、コードレビューやペアプログラミングを通じてナレッジを共有しています。さらに、判断に迷った際には、4-1-2で示したフローチャートを指針とし、意思決定の基準を統一することで、開発のスピードと持続可能性の両立を図っています。

4-1-4. 中長期的な借入(技術的負債)を「借入メモ」で管理する

ACES Meet の開発チームでは、Nealle さんの ソフトウェア開発における「借入」との上手な付き合い方 を参考にしながら、借入メモを活用した技術的負債の管理を試験運用しています。

「借入メモ」は、技術的負債を記録し、適切なタイミングで解消するための仕組みです。設計・実装時に「ここはスピードを優先する」と判断した場合、その背景や課題、関連URL、解決案をドキュメント化し、該当コードには以下のようなコメントを残しています。

# TODO: DEBT {日付} {ドキュメントのURL}

借入はリリース後できるだけ早く返済することを基本としつつ、優先度を見極めながら管理します。また、次回そのコードを触る際には、boyscout 的に改善を加えることも推奨し、負債の放置を防いでいます。

このように、MVP開発のスピードを維持しながら技術的負債を計画的にコントロールすることで、プロダクトの健全性を保つことを意識しています。

4-2. 試作車を完成車までアップデートするかどうかの意思決定

試作車 → 完成車では、試行錯誤を経た上でプロダクトのコアになり得るものを厳選し、完成形へと昇華させるフェーズに入ります。すべての機能を一律にアップデートするのではなく、ユーザーが本当に価値を感じているコア機能とその周辺に限定して取り組むことが重要です。

プロダクトを抜本的に刷新する試作車 → 完成車のフェーズはそれなりに時間とリソースを無駄を使う工程になるため、どこまでをアップデート対象とするかはユーザーの利用データやフィードバックをもとに慎重に判断する必要があります。

また、このフェーズでは、従来の延長線上での改良ではなく、抜本的な変革が求められる場合も多くあります。そのため、スクラップ & ビルドの必要性を受け入れ、開発チーム外の関係者(経営層・ビジネスチーム)とも事前に合意を取ることが重要です。

ここでの決断はプロダクトの中長期的な成長を左右するため、単なる技術的な判断ではなく、事業戦略の観点を含めて慎重に検討する必要があります。

5. おわりに

本記事では、MVP 開発における「手押し車から作る絵」の考え方をもとに、ACES Meet の開発方針を紹介しました。

手押し車 → 簡易トラック → 試作車のフェーズでは、本質的な価値にフォーカスし、スピードと品質の両立を意識しながら試行錯誤を重ねることが重要です。仮説検証を繰り返しつつ、拡張性を考慮し、技術的負債の管理を徹底することで、後のフェーズへの負担を最小限に抑えています。

試作車 → 完成車のフェーズでは、プロダクトのコアになり得るものを厳選し、必要に応じて抜本的な再設計を行うことで、最終製品に向けた進化を加速させます。従来の延長線上の改善にこだわらず、スクラップ & ビルドも視野に入れながら開発を進めています。

MVP 開発では、単に早く作るだけではなく、「何を開発し、何を開発しないか」を明確にし、適切な投資判断を行うことが重要です。

今後もこのアプローチを磨きながら、プロダクトの成長を支えていきます。

本記事を通して、ACES に少しでも興味を持っていただけた方は、ぜひカジュアル面談のお申し込みをお待ちしております!

ACES の採用情報はこちら↓

youtrust.jp

youtrust.jp

*1:https://blog.crisp.se/2016/01/25/henrikkniberg/making-sense-of-mvp

*2:MVP - not "bike to car" ではそこまでは語られていないため、あくまでも私たちの独自の解釈です。

*3:id:t-wada さんの質とスピードの内容に大いに影響を受けています。

まさにコストカット祭り - GPUサーバー代を約30%削減した話 -

こんにちは!ACES でソフトウェアエンジニアをしている西川(@kotosearch)です。

今回は「まさにコストカット祭り - GPUサーバー代を約30%削減した話 -」と題して、高くつきがちな GPU サーバーに焦点をあてて、実際に私たちがコストカットに成功した Tips を皆さんにご紹介したいと思います。

前提として ACES は上場を目指しており、事業の健全性や採算性が求められる中で、予実の達成は不可避です。喫緊の課題として原価通信費(サーバー代など)の増大が上がっており、こちらを削減することが至上命題でした。

1年ほど前の話にはなりますが、2024年2-3月ごろにかけて行ったコスト削減の取り組みについて語って行きます。

そもそも GPU サーバーって高いの?

私たちのプロダクト ACES Meet では、録画・録音した会議データを解析し、文字起こしやサマリー、スタッツ等をユーザーに提供する Web アプリケーションです。

音声や動画の解析はプロダクトのコアバリューなのですが、音声・動画解析は非常に高負荷なタスクであり、CPU に比べて並列計算が高速な GPU を使う方法が主流です。

しかし、GPU インスタンスは CPU インスタンスに比べて利用料金が高いので、「必要な時に必要なリソースだけ使う」という観点を持たずに運用していると、あっという間に月々の費用が跳ね上がってしまいます。

EC2 インスタンスのオンデマンド料金(東京リージョン)で比較すると、同じスペックでも GPU インスタンスの方が2倍ほど高い料金設定となっています。

抱えていた課題

前提として、ACES Meet では AWS Batch を使って GPU インスタンスを起動し、推論処理を実行します。

AWS Batch は「インスタンスの起動 ⇒ コンテナの起動・実行・停止 ⇒ インスタンスの停止」を自動でやってくれるサービスで、インスタンスの起動時間に応じて課金されます。

推論に使う重みファイルは Docker イメージに含まれており、ECR から都度 docker pull してインスタンスを起動していました。

そしてこの仕組みで運用していると、次第に以下のような課題に直面しました。

  • docker イメージにモデルの重みファイルや pytorch のような重いライブラリなどを含んでおり、docker pull に 10分 以上かかる
  • docker pull が長いせいでインスタンスの起動時間が伸びてしまい、コストが高くなる
  • 実行環境を隔離するため1つのEC2インスタンスに1コンテナだけ起動するようにしているので、イメージキャッシュが非常に使いづらい

特に docker pull 時間が伸びることで、コストとユーザー体験の両面で悪い影響を与えていたので、なんとか GPU サーバーの起動時間を短くできないか模索していました。

解決法

結論からお話しすると、コストカットで効果的だったアプローチは以下の2つでした。

  1. コンテナイメージの容量を削減する
  2. ボリュームの I/O 性能を上げる

詳しく解説していきます。

1. コンテナイメージの容量を削減する

重みファイルを Docker イメージではなく S3 に配置

AIを活用していると学習済みモデル(重みファイル)の容量が大きくなるケースが多々あります。

従来はこれらのファイルをコンテナイメージに直接含めていましたが、イメージサイズが増えて docker pull が非常に遅くなることで、起動も遅くなるしコストも増えるという問題がありました。

重みファイルは切り離し可能だったので、こちらは AWS S3 に配置し、コンテナ起動後にダウンロードする方式に変更しました。

重みファイルを剥がしたことでコンテナ自体が軽量化し、プル時間の削減によってGPUサーバー代を15%削減できました。

こちらはシンプルな方法ですが、運用している以外と盲点になっていて気づかなかったので、ちょっとした労力で大きくコスト削減できた例でした。

2. ボリュームの I/O 性能を上げる

EBS ボリュームを gp2 から gp3 に変更

GPU サーバーとは直接関係ないですが、まずはボリュームタイプを gp3 へアップグレードしました。

理由は「シンプルに安い」のとスループットを上げられる」こと。同じ容量でも実は gp3 の方が20%安く、また IOPS やスループットなども gp2 に比べて大幅に引き上げ可能です。

後述するスループット向上」のためにアップグレードしたかったのですが、ストレージを変えるだけで単価も下がるのはラッキーということで、すぐさま gp3 に移行しました。

docs.aws.amazon.com

EBS ボリュームのスループットを上げる

まず用語の解説からです。ボリュームの I/O 性能を表す指標には次の2つがあります。

  • IOPS: 1秒間にストレージへ読み書きできる回数
  • スループット: 1秒間にストレージへ読み書きできる容量

docker イメージはモデルや推論関連のライブラリなど重いものが入っていると、スループット性能を上げることで docker pull が早まる可能性があるのです。

解説に入る前に、docker pull について少し掘り下げます。

Docker イメージは複数のレイヤーで構成されており、レイヤーの実態は圧縮された tar アーカイブファイルです。

docker pull を実行すると、各レイヤーをリモートレジストリから並列でダウンロードし、ダウンロードできたレイヤーから順次展開(解凍)していきます。

% docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
f7ec5a41d630: Pull complete
aa1efa14b3bf: Extracting  2.654MB/26.58MB  # 展開中
b78b95af9b17: Download complete
c7d6bca2b8dc: Download complete
cf16cd8e71e0: Download complete
0241c68333ef: Download complete

dockerlabs.collabnix.com

docker pull に時間がかかっていた原因をよく調べると、ダウンロードより解凍に時間がかかっていることがわかりました。

ということは、ストレージのI/O性能を上げて解凍を早めれば良いのでは?ということで、やってみました。

重いイメージを素早く解凍する必要があるので、IOPS ではなくスループットを上げて検証してみることにしました。(スループット: 1秒間にストレージへ読み書きできる容量)

前提として、GPU サーバーのコスト推移は以下のように計算します。概算を知りたいので、細部は省略しています。

段階的にスループットを上げて検証し、インスタンス起動時間とコスト削減幅をプロットしていった結果、スループット275MB/s にすると最も ROI が高いことがわかりました。

結果的にインスタンス起動時間は4分短縮。GPUサーバー代をさらに18%削減できました。

当然ユースケースによりますが、docker pull 時間が長い場合はI/O性能を上げてやると、起動時間の短縮 & コストカットにつながるかもしれません。

(余談)コストカットはお祭りである

もちろん粛々とコストカットに取り組むことは大切ですが、同時に周りを巻き込んでお祭りムードでやることも大事でした。

みんなで肩組んで、どこがボトルネックなのか?どこを潰せばこれだけ減らせるか?を取り組むメンバー全員で向き合って話し、一致団結することで士気も高まって次々とアイデアが浮かんできました。

コストカットは前に進むというより後ろを振り返るような業務ですが、

  • やったらやった分だけすぐに数字に出る
  • 開発だけではなく、会社全体がハッピーになる

のようにいいこと尽くしなので、むしろやっていて楽しいしお祭りなんです。

ちなみに、「芸術は爆発だ」ならぬ「コストカットはお祭りだ」というお話は、こちらでも語られているのでぜひ👇

youtu.be

まとめ

クラウドサーバーは「インスタンス起動時間 + インスタンスの稼働時間」で課金されるので、この両面でコストカットしてくことが重要です。

今回は推論処理そのものの見直しではなく、アプリケーションレイヤーだけで解決可能な「インスタンス起動時間」にフォーカスしてコストカットを行いました。私個人としては、I/O性能を見直すことで docker pull が早くなるというのはかなり意外な発見でした。

GPU サーバーは優れたパフォーマンスを持つ一方で、運用を誤るとコスト面で大きなデメリットを生むので、今回ご紹介したような小さな工夫を積み重ねて、コストカットの参考にしていただければと思います!

半年でライブラリを最新化!スタートアップが実践する継続的メンテナンス

こんにちは、株式会社ACES でテックリードをしている奥田(@masaya_okuda)です。

リポジトリで利用するライブラリを適宜バージョンアップするのは、現場によっては当たり前かもしれません。しかし、プロダクトを前に進めるため日々機能開発を行うスタートアップにおいて、継続してバージョンアップを実施するのは容易ではありません。

本記事では、入社後半年で全てのライブラリを最新にバージョンアップし、2024年1月からこの状態を保ち続けている取り組みについてご紹介します!

なぜライブラリのバージョンアップを継続的に行うのか?

ライブラリのバージョンアップを継続的に行うことで、以下のような状況が起こりにくくなると考えています。

  • EOLの前後で、慌てて開発ロードマップの変更を余儀なくされる
  • ビッグバンバージョンアップによるインシデントリスク
  • 機能開発を止める、もしくはバージョンアップ担当者とのコンフリクトに常に気を使う
  • メンテナンスされてないリポジトリだから手を抜いてもいいという割れ窓の力学

グラフはフロントエンドのリポジトリにおいて、dependabotが作成したバージョンアップPR数です。

2024年にdependabotが作成したバージョンアップPR数

近年フロントエンドの変化は大分安定したように思います。ですが気を抜くとすぐにバージョンが離れてしまうため、コツコツと対応していくことが重要です。ACES Meetのフロントエンドリポジトリでは日次でバージョンアップを行っています。

入社時は責任者が曖昧な状態

私が入社した当時、正社員のフロントエンドエンジニアは他におらず、業務委託の方が片手間でメンテナンスを行っている状況でした。TypeScriptをはじめとする主要なライブラリもメジャーバージョンから大きく離れており、セキュリティアップデートも滞っている状態でした。

これまで携わったプロジェクトにおいても、メジャーバージョンレベルのアップグレードが後回しにされる傾向があり、それが技術的負債の蓄積につながる場面を目にしてきました。技術的負債が蓄積されると、最終的には大規模なリファクタリングやシステムのリプレイスが必要となり、事業運営にまで影響を及ぼす可能性があります。

ちょうどNext.jsのメジャーバージョンアップが行われた直後でもあったため、「これ以上バージョンの遅れを放置することは避けたい」という思いから、まずは私がリポジトリオーナーとしてメンテナンスを主導することを決めました。

入社後半年で全てのライブラリを最新に

特に主要ライブラリのメジャーバージョンが2つ以上離れた場合のビッグバンバージョンアップを懸念し、下記の順で対応しました。

  1. セキュリティアップデートで対応可能なものを全てバージョンアップする
  2. Next.jsのメジャーバージョンなど、離れすぎると破壊的変更の対応が困難になるものを優先的にあげる
  3. dependabotを導入し自動でバージョンアップPRを作成
  4. その他のライブラリも順次最新化

特に2は破壊的変更に対する広範囲の修正が必要、関連ライブラリも上げないと壊れるなど、泣きそうになりながら気合いで乗り切ったのは良い思い出です(笑)

CIで守りながら毎日自動でバージョンアップ

dependabotがライブラリのバージョンアップ時に自動でPRを作成してくれるものの、都度確認してマージするコストが高い状況でした。そこでGitHub Actionsを整備し、パッチバージョンの場合は自動マージされるようにしてから格段に運用しやすくなりました!

バージョンアップPRのマージを安心して行える背景には以下の防波堤があるためです。

  • ユニットテストが厚く影響のある変更はCIでちゃんと落ちる
  • ユーザーにMUSTで保証したいシナリオがリグレッションテストで定義されており、リリース前に必ず動作確認される

余談ですがリグレッションテストの自動化も進めており、今後はより高頻度なリリースを目指しています!

ライブラリバージョン以外もメンテナンスする

バージョンアップ以外にも適宜メンテナンスしています。その際にもほとんどのライブラリが最新のため、「TypeScriptやReactのバージョンがネックで新しい技術を導入できない」などはありません。

  • Recoil → Jotai
  • ESLint & Prettier → Biome
  • Popper → Floating UI
  • Node.jsのLTSに追従

Recoilは以前からずっと開発停止していましたが2025年始に遂にアーカイブとなりました。ACES Meetでは半年以上前からJotaiに移行しており緊急対応を回避できました。

github.com

破壊的変更を伴うメジャーバージョンアップや別ライブラリへのリプレイスには、一定の工数が必要です。これまでは以下のような方法で対応してきました。

一方で、Next.jsのApp Routerへの移行のように1ヶ月単位で工数が必要な大玉はなかなか着手できない状況でした。残業での対応は長続きせず品質の担保も難しいため、今期からは組織目標に組み込みきちんとリソース確保できるようにしました。

技術ロードマップの策定

テックリードの福澤と共に、DORA Core Modelに基づいて技術戦略を整理しロードマップを策定しました。ロードマップには技術負債解消の項目もありますが、あくまでも事業成長をゴールとし、商業的な成功やチームの満足度など、組織が目指す最終的な結果である成果(Outcomes)から逆算して注力すべき領域を定めました。

詳しくは福澤のテックブログでご紹介していますので、こちらもぜひご覧ください!

tech.acesinc.co.jp

策定の背景には、ACES Meetの開発チームが機能開発において高い生産性を維持し、経営層やBizチームからの信頼を積み重ねてきたことも大きいです。

tech.acesinc.co.jp

ACESはBizもエンジニアも「プロダクトをより安定させ、より遠くへ進めるためには?」と、同じ方向を向いて議論できる土壌があります。

また、経営層との合意ももちろん大切ですが、1エンジニアとして現代の開発プロセスにマッチした新しい技術や方法を通して、メンバーが開発を楽しめるようにしていきたいとも考えています!

Takepepeさんを技術顧問に迎え、Next.js App Routerへ移行!

フロントエンド領域におけるロードマップの第一弾として、Next.js v15へのメジャーバージョンアップとApp Routerへの移行を2025年1月に完了しました!工数の確保に加え、『実践 Next.js ― App Routerで進化するWebアプリ開発』の著者であるTakepepeさんを技術顧問に迎え、移行プロセスや移行後の設計について議論を重ねました。

約70画面の移行を、機能開発を止めることなくダウンタイム0で達成でき胸を撫で下ろしています。移行後の新しいディレクトリ設計に早くも「より開発しやすくなった」「どこに何を作るか迷わなくなった」という声も上がっており、生産性の改善に繋がりそうです。

App Router移行とその後の活用に関しては、また個別記事でご紹介できればと思います!

おわりに

今回はライブラリのバージョンアップの取り組みを中心に、ACES Meet開発チームの技術負債への向き合い方についてご紹介しました。フロントエンド領域に限らず以下の観点を大事にしています。

  • ライブラリのバージョンアップやメンテナンスはコツコツ継続的に実施する
  • 目的や重要性を含めてマネジメント・経営と合意し、ロードマップとして可視化する

今後も機能拡張と安定した技術基盤構築の両方を妥協することなく推進していきます!

最後に、私たちと一緒に事業と技術の両面で力を発揮いただける方を募集しています!ACESに少しでも興味をお持ちいただけましたら、ぜひカジュアル面談でお話ししましょう!

ACESの採用情報はこちら↓

youtrust.jp

youtrust.jp

夜間作業からの脱却!日中リリースのすすめ

1. はじめに

こんにちは、株式会社ACESでソフトウェアエンジニアをしている豊森です。

最近、家のエアコンの効きが今ひとつで、リモートだと寒さを感じることが増えました。オフィスは暖房が効いて快適なので、出社のありがたみを実感しています。

さて、多くの開発現場では、プロダクトのリリース作業をユーザーの利用が少ない夜間に行うことが一般的です。私自身も、前職では毎週複数回の夜間リリースを実施している時期もあり、生活リズムが乱れることに悩まされました。次第に開発効率に影響が出てきたため、リリース頻度を隔週に落とした経験もあります。

一方、ACES Meetの開発チームではフィードバックサイクルを速くするために、リリース頻度を隔週から週次に増やす取り組みをしてきました。

フィードバックサイクルについては以下の記事もご覧ください。

tech.acesinc.co.jp

持続可能な週次リリースを実現するために、リリース作業を昼間に行うようにしました。その結果、リリース作業の負荷が軽減され、プロダクト開発にも良い影響を与えています。

この記事では、私たちのチームが日中リリースを実現するために取り組んだ内容についてご紹介します。

2. 日中リリースがもたらすメリット

夜間リリースはエンジニアの生活リズムを乱し、心身に大きな負担をかけます。日中リリースに切り替えたことで、夜間作業が不要になり、健康的な働き方が実現できました。この負担軽減により、開発業務に集中しやすくなり、プロダクト全体の品質向上にもつながっています。

さらに、日中リリースによりリリース頻度を増やすことが可能になります。私たちのチームでは隔週リリースから毎週リリースにしましたが、作業が昼間になったこととリリース作業自体を圧縮したことで、無理なく継続できています。これにより、開発した機能を素早くユーザーに提供することができており、フィードバックサイクルを短縮できました。

また、昼間であれば他のメンバーや責任者も稼働していることもメリットの1つです。もし、リリース作業中に予期せぬ問題が起きた場合でも、必要があればすぐにチーム全体で連携して対応することができます。

3. 日中リリースの技術的課題と克服方法

具体的に日中リリースをするための技術的な課題とその克服について見ていきます。

3-1. サービスを止めないリリース手法

Blue/Greenデプロイを使ってダウンタイムを発生させないことは前提ですが、動作しているアプリケーションに影響を与えないためのアプローチが重要です。そのために、変更を段階的に実施する工夫が求められます。

3-2. デプロイ順序の工夫

ACES Meetでは、フロントエンドのSPAと、そこから呼び出されるバックエンドのAPIが、それぞれ独立した構成になっています。

フロントエンドを変更して新しいAPIを呼び出す場合には、バックエンドを先にデプロイする必要があります。逆に、不要になった機能をオミットする場合は、フロントエンドからの呼び出しがなくなるまでは、バックエンドのAPIを残しておく必要があります。

私たちの場合は、Webアプリケーション部分について以下の順序でデプロイしています。

  1. DBマイグレーション
  2. バックエンドデプロイ
  3. フロントエンドデプロイ

そのため、新しい機能を追加する場合、新規のAPIを用意してフロントエンドから呼び出すだけなら特別な考慮は必要ありません。もし、機能をオミットする場合には、最初にフロントエンドからAPI呼び出しの導線を削除し、APIエンドポイントの削除は翌週のリリースで行うといった分割が必要になってきます。

3-3. DBマイグレーションの工夫

DBへの大きな変更はサービス停止に繋がる可能性があるため、日中リリースにおいてDBマイグレーションは特に注意が必要です。ACES Meetの開発では、新機能の実装や既存機能のアップデートに伴うDBのマイグレーションは頻繁に発生します。そのため、マイグレーションのパターンごとに、DBへの影響を整理し、ダウンタイムやパフォーマンスの低下を防ぐために入念な計画を立てています。

例えば、新規のリソースを追加するためにテーブルの作成を行うマイグレーションは比較的安全です。稼働中のアプリケーションからは参照されていないため、マイグレーションを行っても問題は起きません。

一方、既存のリソースを削除または変更するマイグレーションは、慎重な対応が求められます。例えば、不要になったテーブルを削除する際には、アプリケーションコードから影響箇所を全て削除してからマイグレーションを実行する必要があります。このような場合、影響を最小限に抑えるため、アプリケーションコードの削除とテーブル削除でデプロイを複数回に分けることも検討します。

3-4. 後方互換性を保つ

動作中のアプリケーションに影響を与えないためには、後方互換性を意識した設計が不可欠です。

例えば、APIに新しいリクエストパラメータとして user_type を追加する場合、既存のフロントエンドが user_type なしでリクエストを送る可能性があります。このような場合、サーバー側で user_type を必須にせず、デフォルト値や存在チェックを用意することで、既存の動作に影響を与えないように対応します。

そのため、設計段階でも後方互換性について、古いデータやリクエストが新しい仕様で意図しない挙動を引き起こさないかを、チェック項目として確認を徹底しています。

3-5. インパクトのある変更は夜間リリースも選択肢

もちろん、どうしてもサービス停止が発生するインフラの変更や、DBの大きな変更は夜間に実施します。日中リリースにこだわらず、ユーザー影響を最小限に抑えるために夜間リリースを実施することは選択肢の一つです。

4. 高頻度リリースを支える日中リリース以外の工夫

日中リリースを導入した後も、毎回のリリースを無理なく実現するための改善を行いました。

4-1. デプロイ作業の簡略化

リリース回数が増えるため、煩雑だったリリース手順を見直しました。

まず、デプロイ前の準備や確認に時間がかかっていた工程をプルリクエストを作成するだけで済むように運用を改善しました。

さらに、属人的になりつつあったデプロイのスクリプトを簡易な手順で実行できるようにCDを整備しました。前述のプルリクエストをマージするだけでデプロイできるようにしています。

現在は、正社員メンバー全員がデプロイできるようになり、ローテーションでペアを組んでデプロイを担当しています。1回のデプロイ時間は準備からデプロイ結果の検証まで1~2時間かかっていたものが、今は30分程度で済んでいます。現在も改善を続けており、さらなる高速化に取り組んでいます。

4-2. リグレッションテストの効率化

リグレッションテストの効率化も重要な取り組みであり、私たちのチームでは本番リリース時の網羅的なテストはやめることにしました。 本番リリース前には以下のテスト工程によって、プロダクトの品質を担保しています。

本番環境では環境差分などポイントを絞った確認だけにすることで、リリース時の検証工程を大幅に短縮することができました。

また、ステージング環境でのリグレッションテストにおいても、外注することで開発チームの負担を軽減しています。

5. 日中リリースを実現したプロセスと成功の鍵

具体的な導入プロセスの事例と、その成功の鍵についてご紹介します。

5-1. 導入プロセス

以下のステップで段階的に導入しました

  • 8月中旬
    • リリース頻度を隔週から毎週リリースに変更
    • ステージング環境のリグレッションテストを外注
  • 9月初旬
    • リリースを夜間リリースから日中リリースに変更
  • 10月中旬
    • CD改善によるリリース手順の簡易化
    • 本番環境でのリグレッションテストを縮小

現在は安定した週次リリースの運用ができています。

5-2. 成功を支えた要因

日中リリースの取り組みは、エンジニアリングマネージャーの提案から始まりました。 エンジニアリングマネージャーの取り組みは以下の記事に詳しく書かれているのでご覧ください。

tech.acesinc.co.jp

その提案に対し、どう実現するかをチームで議論し、具体的な解決策に1つ1つ取り組んできました。改善を推進しようとする積極的な姿勢や、変化を柔軟に受け入れる文化がチーム全体に根付いていたことも大きな要因です。この文化があったからこそ、新しい試みに前向きに挑戦し、たった2ヶ月で持続可能な日中リリースを実現できました。

6. まとめとこれからの展望

日中リリースへの移行によって、エンジニアの負担軽減、リリース頻度の向上といった、多くの成果を得られました。この取り組みにより、私たちは持続可能な週次リリースを実現し、プロダクトの品質向上とフィードバックサイクルの短縮を達成しています。

次の目標は、さらにリリース頻度を高めることで、ユーザーにより迅速に価値を届けることです。そのために、以下の施策を進めています。

  • 自動テストを強化してE2EテストをCIに組み込む
  • リリース作業手順簡略化の推進
  • Featureフラグの活用による影響範囲の最小化

私たちのチームでは一緒に改善に取り組むメンバーを募集しています!少しでも興味を持っていただけた方は、ぜひカジュアル面談のお申し込みをお待ちしております!

youtrust.jp

youtrust.jp