Timee Product Team Blog

タイミー開発者ブログ

GitHub Actions Self-hosted Runner 基盤の EKS バージョンアップを自動化した話

こんにちは、タイミーでエンジニアをしている徳富(@yannKazu1)です。

前回の記事では、EKS 上に self-hosted GitHub Actions Runner 基盤を構築した話をご紹介しました。

▼ 前回の記事

https://tech.timee.co.jp/entry/2025/09/22/122415

ありがたいことに、この取り組みは AWS さんの公式ブログでもご紹介いただきました

👉 AWS ブログ

https://aws.amazon.com/jp/blogs/news/timee-amazon-eks-auto-mode/

今回はその続編として、

EKS のクラスターバージョンアップを、どうやって安全に自動化したか

についてお話しします。

EKS のクラスターバージョンアップ、地味につらい

EKS を運用していると、どうしても避けて通れないのが定期的なクラスターバージョンアップです。

  • Kubernetes のマイナーバージョンは定期的に EOL が来る
  • 放置するとサポート切れになる
  • とはいえ、毎回人が確認して手動で上げるのは正直しんどい

「これ、もう少し楽にできないか?」

そう思ったのが、今回の仕組みを考え始めたきっかけでした。

今回の前提:EKS Auto Mode を使っている

今回運用している EKS では、EKS Auto Mode を採用しています。

EKS Auto Mode では、

  • ノード管理
  • 主要な Add-on 管理(VPC CNI / AWS Load Balancer Controller など)

を AWS 側で管理しており、運用負荷を軽減できます。

そのため、クラスターバージョンアップの流れは比較的シンプルです。

  1. マニフェストで 非推奨 API を使っていないか確認する
  2. 問題なければ クラスターバージョンをアップする
  3. ノードや主要 Add-on は AWS が自動で追従する

さらに EKS にはUpgrade Insightsという便利な仕組みがあります。

  • 非推奨 API の使用状況
  • バージョンアップ時に問題になりそうな点

を事前にチェックできるため、

「このバージョンに上げて大丈夫か?」をかなり楽に判断できます。

自動化の方針

とはいえ、いきなり本番クラスターバージョンを自動で上げるのは、さすがに怖い。

そこで、次の方針で仕組みを作りました。

1. 本番とは別にテスト用クラスターを用意する

Self-hosted Runner 用の main クラスターとは別に、検証専用の test クラスターを用意しています。

  • コストを抑えるため Spot インスタンスを使用する
  • 最小構成で test-runner のみを起動する

インフラは次のように管理しています。

  • クラスターや AWS リソース:Terraform
  • ARC Controller などの Helm リソース:Terraform
  • その他の Kubernetes リソース:マニフェスト(Kustomize)

この構成にしていることで、

  • test / main クラスターに ほぼ同じ設定をそのまま適用できる
  • runner の 台数やサイズだけを環境ごとに切り替えられる

といったことが簡単にできます。

結果として、

  • コントローラや設定は本番と同一
  • リソース(インスタンスサイズ・台数)を最小構成にした test-runner

という、「本番に限りなく近いが、低コストなコピー環境」を作れています。

2. テストクラスターで先にバージョンアップする

テストクラスターでは、次の条件を満たした場合のみ

自動でバージョンアップを行います。

① リリースから 1 か月以上経過したバージョンであること

aws eks describe-cluster-versions \
  --include-all \
  --query 'clusterVersions[?versionStatus==`STANDARD_SUPPORT`].{version: clusterVersion, releaseDate: releaseDate}' \
  --output json

取得した結果を jq で加工し、

「リリースから 1 か月以上経過しているバージョン」のみを対象にします。

② Upgrade Insights がすべて PASS していること

INSIGHTS_JSON=$(aws eks list-insights \
  --cluster-name ${{ inputs.cluster-name }} \
  --output json)

ERROR_COUNT=$(echo "$INSIGHTS_JSON" | jq '[.insights[] | select(.category=="UPGRADE_READINESS" and .insightStatus.status=="ERROR")] | length')
WARNING_COUNT=$(echo "$INSIGHTS_JSON" | jq '[.insights[] | select(.category=="UPGRADE_READINESS" and .insightStatus.status=="WARNING")] | length')
  • ERROR / WARNING があればブロックする
  • UNKNOWN は未使用機能なので許容する

これらの条件をすべて満たしている場合のみ、毎朝 7 時に GitHub Actions から aws eks update-cluster-version を実行します。

3. test クラスターの結果を cluster_version.txt の PR として残す

本番クラスターのバージョンアップは、cluster_version.txt に書かれたバージョンへ更新する

という前提で設計しています。

そのため、本番をいつ上げるかだけは人が判断できるように

cluster_version.txt の更新は必ず PR 経由にしています。

test クラスターバージョンアップが正常に完了すると、

  • 実際に上がった EKS バージョンを
  • そのまま cluster_version.txt に書き込み
  • 自動で PR を作成

します。

# **cluster_version.txt**
1.34

この PR をマージすると、その日の深夜に本番クラスターバージョンアップが実行されます。

  • 検証は自動で完了済み
  • 本番反映の日付だけ人が判断する

というバランスに落ち着きました。

本番クラスターバージョンアップフロー

本番クラスターバージョンアップは、毎日 深夜 2 時

GitHub Actions から定期実行しています。

流れは次のとおりです。

1. cluster_version.txt との差分を確認

  • cluster_version.txt のバージョン
  • 現在の本番クラスターのバージョン

を比較し、差分がなければここで終了します。

差分がある場合のみ、以降のチェックに進みます。

2. Upgrade Insights が PASS していることを確認

INSIGHTS_JSON=$(aws eks list-insights \
  --cluster-name ${{ inputs.cluster-name }} \
  --output json)

ERROR_COUNT=$(echo "$INSIGHTS_JSON" | jq '[.insights[] | select(.category=="UPGRADE_READINESS" and .insightStatus.status=="ERROR")] | length')
WARNING_COUNT=$(echo "$INSIGHTS_JSON" | jq '[.insights[] | select(.category=="UPGRADE_READINESS" and .insightStatus.status=="WARNING")] | length')

3. test-runner のヘルスチェックを実行

本番アップグレード前に、

test クラスター上の Self-hosted Runner が正常に動くかを確認します。

簡単な workflow_dispatch のワークフローを用意しています。

name: Test Runner Health Check

on:
  workflow_dispatch

jobs:
  health-check:
    runs-on: test-runner # testクラスター上のtest-runnerを指定する
    timeout-minutes: 10
    steps:
      - run: |
          echo "✅ test-runner is healthy!"
          hostname
          date

このワークフローをgh コマンドで起動し、

10 分以内に success することを確認します。

(ポーリング処理は省略していますが、実装上は完了を待っています)

4. 問題なければ本番クラスターバージョンアップ

aws eks update-cluster-version \
  --name ${{ env.MAIN_CLUSTER_NAME }} \
  --kubernetes-version "$TARGET_VERSION"

流れを図で表すと、以下のとおりです。

Image

なぜ深夜 2 時に「自動で」上げるのか?

「本番反映の日付は人が制御」と書きましたが、厳密には PR をマージした日の深夜 2 時に自動でクラスターバージョンアップが走る 仕組みです。

つまり、人が決めるのは 「いつの深夜にクラスターバージョンアップを実行するか」 だけ。

この設計にしている理由は 2 つあります。

1. 深夜ならデプロイと競合しない

  • デプロイが走っていない時間帯である
  • ノード更新時に Pod が退避しても影響が出にくい
  • デプロイ途中で Pod が落ちる事故を防げる

2. 問題が起きても業務開始後に対処できる

Self-hosted Runner の利用箇所では、Organization variablesを使って runner を指定しています。

runs-on: ${{ vars.RUNNER_AMD64_STANDARD }}

もしクラスターバージョンアップ後に問題が発覚しても、この変数の値を ubuntu-latest などに変更するだけで、全リポジトリのワークフローが GitHub-hosted runner で動くようになります。

コードを一切変更せずにフォールバックできるため、業務開始後に気づいてからの対応でも十分間に合います

このフォールバック手段があるからこそ、

  • 深夜に自動でクラスターバージョンアップを実行
  • 人は「日付を決める」だけ

という運用が成り立っています。

Terraform 管理との付き合い方

インフラは Terraform で管理していますが、

EKS のクラスターバージョンだけは Terraform 管理外にしています。

  • cluster_versionignore_changes を設定している
  • バージョンアップは CLI で実施している

これにより、

  • CLI で上げても Terraform 差分が出ない
  • IaC と運用の責務をきれいに分離できる

というメリットがあります。

まとめ

この仕組みを導入したことで、

  • クラスターバージョンアップの toil を大幅に削減できた
  • 「test → 本番」の安心できるフローを自動化できた
  • Self-hosted Runner が壊れないことを事前に保証できるようになった

という成果が得られました。

EKS Auto Mode の特性を活かすことで、

「人が気合で回す運用」から一段階進められたかなと思っています。

同じように EKS を運用している方の参考になれば嬉しいです 🙌

コンテナのログがDatadogに到達するまでの険しい道のり

こんにちは、DevPFチームの菅原です。

現在、弊社のアプリケーション基盤(ECS on Fargate)では、コンテナログの収集・転送にFireLensを採用し、Datadog Logsへ集約しています。FireLensはタスク定義に数行記述するだけでログ基盤が整う非常に便利な機能です。一方で裏側では、Fluent Bitがサイドカーとして動作し、複雑なパイプラインを処理しています。

「ログなんて標準出力に出せば、あとは勝手に届くもの」

そう思われがちですが、実際にはアプリケーションコンテナからDatadog Logsのexplorerに表示されるまでには、いくつもの難所が存在します。今回は、ログがDatadogに到達するまでのアーキテクチャを紐解きながら、ログが「どこで」「なぜ」欠損するのかを解説します。

ログ転送のアーキテクチャ概要

まずは現在の構成のおさらいです。

  • 基盤: AWS ECS on Fargate(v1.4)
  • ログ収集: FireLens (実体はFluentdまたはFluent Bitサイドカー。弊社ではFluent Bitを採用)
  • 送信先: Datadog Logs

アプリケーションが出力したログは、大まかに以下の経路を辿ります。

  1. Appコンテナ: stdout/stderrへログを書き込む
  2. shim logger プラグイン: containerd-shimのロガープラグイン。shim loggerが各コンテナのstdout/stderrをパイプ経由で定期的に読み込み、サイドカーのFluent Bitに転送。
  3. Log router (Fluent Bit)コンテナ: ログを受け取り、バッファリング・加工を行う
  4. Network: Datadog APIへHTTPSで送信
  5. Datadog: Ingest(取り込み)・Indexing(インデックス化)

一見シンプルですが、この経路には大きく分けて4つの「欠損リスク」が潜んでいます。

アプリケーション 〜 Fluent Bit間のバックプレッシャー

最初の難関は、ログがサイドカーに渡る瞬間です。

仕組み

FireLensを使用する場合、Fargate (v1.4) の内部では shim-loggers-for-containerd が使用されます。アプリケーションが出力したログは、この shim logによってパイプ経由で読み取られ、Unix Socketを経由して Fluentd Forward Protocol でサイドカーのFluent Bitに転送されます。

ここで何が起きるか?

Fluent Bitで処理が詰まったりしてバッファがいっぱいになると、Fluent BitはInputを一時停止します。その間、アプリケーションが出力し続けるログはどうなるでしょうか?

Fluent BitがInputを停止している間に出力されたログは、Fargate基盤側のshim logger内のメモリバッファやその前段のパイプのバッファに溜まります。しかし、このバッファも有限です。よってFluent Bitが復帰して再開したときには、その間のログは闇に消えている可能性があります。

Image
application-to-sidecar

対策

出来るだけ処理が詰まらないようにする、可能な範囲でバッファを大きくすることが対策となると考えます。例えば次のようなことができるでしょう。

  • 不要なログを出力しない
  • log-driver-buffer-limitオプションでのshim loggerレイヤのチューニング
  • log_routerのバッファサイズ、retryの上限設定等のチューニング

Outputの失敗と道連れ欠損

Fluent Bitがログを受け取った後、Datadogへ送信するフェーズです。

仕組み

Fluent Bitはログを1件ずつ送るのではなく、効率化のために複数のログをまとめてChunkにし、一定サイズまたは一定時間ごとに送信します。

ここで何が起きるか?

Outputの失敗は、「インフラ起因」と「ログ内容起因」の2つのパターンに分けられると考えます。それぞれの挙動とリスクを見ていきましょう。

インフラ起因:ネットワークや転送先の障害

インターネット接続の問題や、Datadog API側の一時的な障害、あるいはAPIキー等の設定ミスなどがこれに該当します。

Fluent Bitは送信に失敗すると、設定された回数(Retry_Limit設定)だけ再送を試みます。しかし、障害が長時間続いてリトライ回数を使い切ると、そのChunkは破棄されます。

欠損を防ぐためにリトライを無限に設定することも可能ですが、送信できないログがFluent Bitのバッファに滞留し続けることになります。これが解消されないとバッファが埋まったままになり、結果として前述のインプットの一時停止を引き起こし、新たなログの取り込み自体が止まってしまいます。

https://docs.fluentbit.io/manual/data-pipeline/buffering#per-input-settings

特定ログ起因: 不正なログによる巻き添え欠損

これが厄介なケースです。インフラは正常でも、アプリケーションが出力した「特定のログ」が原因で発生することがあります。

Datadog Logs APIには、「ペイロードあたり最大コンテンツサイズ(非圧縮): 5MB」という制限があります。

例えば、Base64エンコードされた画像やPDFデータを含む数MBの巨大なログが1件出力されたとします。Fluent Bitはこの巨大ログと、同じタイミングで出力された正常な小さいログをまとめて1つのChunkにしてしまいます。Fluent Bitのdatadog output pluginはChunk単位でログを送信します。このChunkを送信しようとすると、サイズ制限超過によりDatadogから 413 Payload Too Large エラーが返されたり、接続がリセットされたりします。 重要なのは、問題のある巨大ログだけでなく、同じChunkに含まれていた正常なログもまとめて拒否されてしまう点です。たった1行の行儀の悪いログのせいで、周囲の無実なログまで道連れにして消えてしまう可能性があるのです。

Fluent Bitのメモリバッファのサイズ制限を設ければいいのでは?と思われるかもしれません。しかし、該当するmem_buf_limit設定はソフトリミットとして実装されているようです。読み解いたソースコードレベルの挙動としては、「書き込み前に空き容量をチェックする」のではなく、「書き込んだ後に上限を超えていないかチェックする」という動きで、一時的に上限を超過することは許容されているようでした。

Image
mem_buffer_limit = 5MBの時に巨大なログが来た場合の挙動

対策

方向性は大きくアプリケーション層での予防的設計と、転送層でのフィルタリング・バッファ制御が考えられます。いずれもトレードオフを伴うため、システムの特性に応じたバランスが求められます。

  • アプリケーション側で長大なログを出力しないよう制限する
  • アプリケーションまたはfluent bitレイヤで一定サイズを超えるログフィールドを自動的に切り捨てるようにする
  • 特定パターンのログを除外または置換する
  • mem_chunk_size, flush_intervalを短くして巻き添え欠損の影響範囲を小さくする

メモリバッファの消失

Fargateのようなコンテナ環境特有のリスクです。

仕組み

Fluent Bitのバッファ設定をデフォルトの memory にしている場合、ログは送信完了までメモリ上にしか存在しません。

ここで何が起きるか?

コンテナが予期せず停止した場合、メモリ上の未送信ログは消滅します。これは異常時だけでなく、通常のデプロイフローでも発生し得ます。

  1. ECSタスク停止時、コンテナにはSIGTERMが送られます。
  2. タスク定義のstopTimeout(デフォルト30秒)以内に終了しない場合、SIGKILLで強制終了されます。
  3. Fluent Bit側にもシャットダウン時の待機設定(Grace)がありますが、これらが噛み合わず、バッファをFlushしきる前にプロセスが強制停止されるとログは欠損します。

Image
引用: 「ECS のアプリケーションを正常にシャットダウンする方法」, Amazon Web Services ブログ, https://aws.amazon.com/jp/blogs/news/graceful-shutdowns-with-ecs/

対策

  • バッファのストレージタイプをfilesystemに変更し永続化する。ただしECS Fargateの場合、現実的に使えるのがEFSくらいで永続化ストレージの利用に制限があるためトレードオフの検討が必要です。
  • stopTimeoutGraceの値を適切に調整し、シャットダウン時にFlush完了までの十分な猶予時間を確保する。
  • flush_intervalを短く設定し、バッファに溜まるログの量を減らすことで、シャットダウン時の欠損リスクを最小化する。ただし、ネットワーク負荷とのバランスを考慮する必要があります。

Datadog側の制限

無事にインターネットを越えてDatadogに届いても、最後の難所があります。

ここで何が起きるか?

Datadog側にも厳格な受入ルールがあり、これに違反すると取り込み後に削除、または切り捨てられます。

  • 日次クォータ超過: コスト管理のために設定したインデックスの上限を超えた場合、インデックスには保存されません(アーカイブ設定があればS3には残ります)。
  • タイムスタンプ: ログの日時が「18時間以上過去」の場合、取り込み対象外となり削除されます。
  • サイズ制限:
    • 単一ログが1MBを超える場合、Datadogによって切り捨て(Truncate)が行われます。
    • 前述の通り、APIへの送信ペイロード全体(非圧縮)が5MBを超えると、そもそも受け入れられずエラーとなります。

対策

  • 日次クォータの監視アラートを設定する
  • 前述の通り、アプリケーション側とFluent Bit側で対策を行い、Datadog側の制限に引っかからないようにする。
  • retry間隔がタイムスタンプの制限を超えないように再送の設計をする

まとめ

ログ基盤の信頼性を高めるためには、これらの欠損ポイントを理解した上での設計・運用が必要です。

  • Input: Fluent Bitが詰まるとその前段でログが溢れ欠損しうる。
  • Output: Chunk単位で処理されるため、異常なログが正常なログを巻き込むことがある。送信リトライはトレードオフがある。
  • Buffer: メモリバッファは揮発しうる。
  • Ingest: Datadog側のクォータやサイズ制限も意識する。

ログが欠損しているという事象に直面したとき、アプリケーションコードだけでなく、この険しい道のりのどこで詰まっているのかを想像できると、調査の解像度がぐっと上がるはずです。

参考資料

RSGT2026に参加してきました

株式会社タイミーのshihorinです。

1月7〜9日に開催された「Regional Scrum Gathering Tokyo 2026(RSGT2026)」に参加してきました。

RSGTに参加するのは、昨年に続き2回目です。昨年11月に「DevEnable室(プロダクト組織運営や技術広報を担うチーム)」に異動したため、今回は組織運営や文化醸成の観点を特に意識して参加しました。

特に印象的だったセッションやOSTで得られた学び・感想を、このブログでアウトプットしてみます。

🪴コミュニティ文化を組織に根付かせる〜推進者とバトンを受け取った実践者が語るコミュニティの価値と持続可能性への道筋〜

speakerdeck.com 株式会社ログラスの飯田さん・永井さんによるセッションです。

コミュニティに参加し始め、コミュニティに助けられた個人の経験を起点に、社内でコミュニティ文化を根付かせ、持続させるまでの実践的な取り組みが、ストーリーに沿って語られるセッションでした。1人で始めたことが会社から認められるようになり、やがて共に推進してくれる仲間にバトンを繋げられた、素敵なストーリーだなと思いました。

このセッションを聞いて、重要だと思った要素はこの2つです。

  1. 自分がやってみて、周りに広める
    • 「なんだか怖い」と思っても、きっかけを逃さず飛び込んでみる。そこで得られたものを周りに広める。
    • 自分がやることで、活動の価値を語れるようになる。
  2. 継続が大事
    • 継続することで複利的に価値が上がる。
    • 維持する努力を続けなければ維持できない。1人の強いパワーだけでも続かない。複数の小さなモメンタムを生むきっかけ作りと、維持するための後押しを根気よく行う。

これらはコミュニティ活動に限らず、カルチャーをつくる・広める上で共通する考え方ではないでしょうか。

最近私は「発信文化を継続的に育てる」という業務に取り組み始めました。自分自身が「発信活動の価値」を語れるようになるために、今年はどこかのカンファレンスにプロポーザルを出してみようと思います……!

そしてこのセッションは、自分自身のコミュニティ活動に関するこれまでと現在地を振り返るふりかえるきっかけにもなりました。

私はタイミー入社前まで、気が向いた時にごく稀にconnpassでイベントを見つけて参加するくらいでした。入社後は、周りのメンバーがカンファレンスやイベントに積極的に参加しているのを知り、私も同様に足を運ぶようになりました。大きな進歩ではあると思いますが、「その場に行くだけで満足してしまっているのかも」と、セッションを通して気づきました。今こそ、努力の方向性を変えるタイミングなのかもしれません。今後は「小さくても良いので自分がその場に何らか貢献する」を意識してコミュニティ参加できるようになりたいと思います。

🔥自己管理型チームと個人のセルフマネジメント

speakerdeck.com 株式会社カケハシの小田中さんによるセッションです。

自己管理型チームであるために大切なことを語られていました。

  • 一人ひとりのセルフマネジメントが必要。セルフマネジメントの土台には「モチベーションマネジメント」があり、モチベーションの源泉(心の着火点)は人によっても時にもよって変化する。
  • メンバーのタイプによって、マッチするモチベーションの引き出し方(目標設定やマネージャーの働きかけ方)がある。
  • 欲求(ERG理論でいう「成長」「関係」「存在」)が損なわれると摩擦が起きる。アルバート・エリスのABC理論を用いて内省し、摩擦を乗り越えられるように行動する。

そして最後は、「自分が何にモチベーションを感じるかを明確にし、まずは自分からセルフマネジメントしてモチベーションを引き出していくことにぜひトライしてください」というメッセージで締められていました。

※ERG理論: 「成長」「関係」「存在」の3つの欲求で構成されるモチベーション理論のこと

※ABC理論: 発生した出来事に対し、信念が影響を起こし、感情を引き起こす、という理論

私が所属しているチームは、以前は各自の守備範囲に集中するスタイルでしたが、今はお互いに越境し支え合う姿を目指しています。まさにこのセッションで語られていた「自己管理型チーム」だと気づきました。

私はついチームのプロセスに焦点を当てがちで、メンバー一人ひとり(自分も含めて)の内面に目を向けることが疎かになっていたように思います。まずは自分、そして周りのメンバーのモチベーションの源泉に思いを馳せ、心の火を燃やし続けられるよう支援していきたいです🔥

Day3のOST

16トラック x 4枠(1枠30分)のテーマが起票されていました。ずらりとテーマが並んだボードは圧巻でした!

どれにするか迷いつつ、今取り組んでいる業務に関連しそうなテーマを選んで参加してきました。

その内2つについて書いてみます。

テーマ:今日の学びを少しずつ、ほんの少しずつ、チームや組織の共通知に変える仕組み

タイミーのプロダクト組織では、業務時間内にカンファレンスに参加した場合、社外発信レポートの執筆もしくは登壇をお願いしています。一方で「レポート執筆・登壇以外にも学びを広める手段は様々あるはずで、もっと試せないだろうか」と個人的に課題感を持っていたため、このテーマに参加しました。

Image

このテーマを起票した方のお話を深掘りしていくと、

  • 会社からRSGTに参加しているメンバーが少数。RSGT、アジャイル、スクラムに興味を持っている人が現時点では限られている。
  • ドキュメントにまとめて渡しても、分量が多いと受け取りづらいことがある。重たいと感じられているのではないかと考えている。
  • 学んできたことを熱心に話しても、人によって反応の温度差がある。

という背景があると分かりました。

学んできた側の心の火は燃え上がっていても、受け取る側の準備ができていない状態のように見えます。

ディスカッションで出た「学びを100そのままぶつけるのではなく、相手が受け取れるタイミングで届けられるよう見極めることが大事なのでは」というアイデアは、特に納得感があり、記憶に残りました。「今がそのタイミングだ!」と気づいた時にすぐ取り出せるように、学んだことの言語化・体系化もセットで必要そうですね。

DevEnable室が策定している「発信にまつわるガイドライン」では、「自身の知見を形式知に変換できること」を発信活動の1つの目的として記載しています。そこに、「時が来た時にすぐ取り出して使える」という具体的な利用シーンを補足することを検討したいと思います。

テーマ:パックマンルール、どうしてる?

先日行われた社内懇親会で、参加者にパックマンルールへのご協力をお願いしました。ですが、知っている人同士で固まってしまいがちでした。

「パックマンルールへの協力をお願いするだけでは足りない」とチーム内で話していたため、ヒントを得ようとこのテーマに参加しました。

Image

ディスカッションしながら自分たちでパックマンルールを試した結果、2つのコツが分かってきました。

今後懇親会などでパックマンルールを使う時は、説明スライドの中にこれらを入れてみようと思います。

  • パックマン側から「食いにいく」:パックマンを形成している人たちは、近くを歩いている人を見つけたら招き入れる(目を合わせる、手招きする、スペースを開ける)。
  • パックマンに自ら「食われにいく」:「今どんな話をしているんですか?」というフレーズを使えば途中からでも入っていける。話しかけられてOK感を自分から演出する(例:「話したい」意思表示シールを貼る)。

運営の立場だと、「人が集まれる場所を用意すること」も1つの工夫として実践できそうです。

例えば、壁際に椅子を並べてみると、3人並んで座ってもグループが閉じた状態にならないので、4人目が入りやすいですよね。

終わりに

前回のRSGTは新設チームのスクラムマスターとして参加していましたが、今回は違う立場での参加でした。

セッションやOSTの選び方はもちろん、スポンサーブースや廊下での会話内容も前回とは変化があり、新鮮な気持ちで参加できました。

今回得られた学びは、言語化・反芻して、時が来た時にすぐ扱えるように準備したいと思います。

そして最後に宣伝です!

タイミーでは現在、一緒にはたらく仲間を募集中です。

学習と実践のサイクルをまわしながらプロダクト開発に取り組みたい方、ご興味があればぜひお話ししましょう!

プロダクト採用サイトTOP

カジュアル面談申込はこちら

pmconf参加レポート(yang & takashi)

今回は、タイミーの「Kaigi Pass」制度を利用して、12/4に開催のされたプロダクトマネージャーカンファレンス(以下、pmconf)に参加してきました。

この制度を通じて、非常に有意義な学びを得ることができましたので、その内容を共有します。


参加セッション

「メルカリのデータ分析AIエージェント『Socrates(ソクラテス)』と、それを支えるデータ整備」

登壇者:株式会社メルカリ データアナリティクスチーム

セッション詳細・学び

1. 背景と課題 (As-is)

メルカリでは専任のデータアナリストのリソースが潤沢ではなく、アナリストがいないチーム(0名のチームも存在)では、PdMが自らが分析を行う必要がありました。

  • 部門を超えたインサイト収集の困難さ: 自分の担当外の領域(例:メルカリ担当がメルペイのデータを見る等)は分析のハードルが高く、工数を要するため、複合的な意思決定が困難でした。
  • リソースの壁: 「分析キャパシティ」がボトルネックとなり、問いの量と質が制限されていました。

2. 解決策:AIエージェント「Socrates」 (To-be)

自然言語で対話可能な分析エージェントを導入することで、以下の状態を実現しています。

  • 未知の領域にも対応: 「メルペイの預金残高の使い道内訳」のような、ドメイン知識がない領域でも、エージェントがデータを探し出して集計・可視化してくれます。
  • 並列思考: 複数の観点(Parallel Agent)でブレストを行い、仮説出しから検証までを一気通貫で実行します。
  • 問いの量と質の向上: リソース制約を気にせず貪欲に調べられるようになりることで、アウトプットの総量もが直結して向上します。

3. 実現のための土台:Basic Tables

AIが正しくデータを扱える理由として、「AI-Readableなデータ分析基盤」の存在が強調されました。

  • 3層構造: Raw Data Tables → Basic Tables → Analytical Tables/Views という構造を採用。
  • 特徴: 「Basic Tables」は人間とAIの両方が分析しやすいように整理された中間テーブルであり、ここに粘り強く投資したことが勝因です。

4. 組織と運用の工夫

ツールを入れるだけでなく、それを使いこなすための組織づく作りもセットで行われています。

  • 独立した実行組織: 企画・開発・マーケまで完結できる遊軍的な「BI Productチーム」が開発を主導。
  • 使いこなしのルール:
    • 気になったらまずエージェントに聞く(依頼する前に相談)。
    • 基礎的なSQLと社内DBの理解を持ち、クエリレビューを徹底して品質を担保する。
  • 人を動かすための活用: レポートを蓄積するだけでなく、「隙あらば分析レポートをシュッ」と提示し、ファクトをベースに組織全体を動かす文化をつく作っています。

5. 要件定義プロセスへの応用

分析だけでなく、要件定義のプロセス全体(インプット→処理→アウトプット)でにおいても活用されています。

  • インプット: ユーザーログ、定性調査、競合調査など。
  • アウトプット: ユーザーストーリー、機能仕様書、ABテスト設計書など。

    これらをAIが処理することで、PdMの業務効率を飛躍的に高めています。


現場視点での気づきと、これからのアクション

今回のセッションを聞いて私たちが何を感じ、現在進めているプロジェクトをどう加速させていくのか。チームとしての「熱量」と「次の一手」をまとめました。

私たちが得た「確信」と「気づき」

■ 「領域横断」こそが、Growthの壁を壊す スライドに映し出された「部門を超えたインサイト収集が困難」という悩みは、正直なところ「これ、今の私たちのことだ」と痛感しました。 特にGrowth領域でスピード感を持って仮説検証を回そうとすると、どうしても担当外のデータやドメイン知識の壁にぶつかります。もし「Socrates」のように社内の全データが地続きになり、AIがその文脈までを理解してくれれば、SQLを書く時間を「ユーザーに向き合って思考する時間」に変えられまする。そうしたの未来図に、強い可能性を感じました。

■ 誰もが「迷子」にならずに意思決定できる組織へ 「意思決定の階層を減らす」という思想も、組織が急拡大している今の私たちにとって非常に重要なテーマです。 新しくジョインしたメンバーが、複雑なテーブル定義の森で迷子にならず、AIという「相棒」を通じて過去の経緯やデータに即座にアクセスできる。それが実現できれば、オンボーディングのスピードも、自走力も劇的に変わるはずです。

■ 定性データも「資産」として使い倒す 数字(定量データ)だけでなく、商談メモや行動ログといった「定性情報」までAIに読ませるという構想にはワクワクしました。 「数字には表れないけれど、現場には落ちているヒント」をAIが拾い上げてくれれば、私たちが生み出す仮説の精度はもっと高まるはず。これを支えるための「徹底したデータ文化」や「BI Productチーム」という体制づくりも含めて、本気で真似していきたいポイントです。


これからやること(Next Actions)

■ 進行中のPoCを、さらに磨き込む 実は現在、私たちも社内で同様のデータ基盤構築に向けた取り組みを、PoC(概念実証)としてすでに始めていますスタートさせています。 「方向性は間違っていなかった」という心強さを感じると同時に、今回のセッションは、そのPoCを成功させるための大きなヒントになりました。

具体的には、以下の動きをすぐに始めます。

  1. 「Basic Tables」の思想を、自分たちのPoCへ
    • 今回の大きな学びである「Basic Tables(AIと人間、両方が読みやすい中間層)」の構造 を、現在私たちが進めているPoCの設計と照らし合わせてみます。
    • DRE (Data Reliability Engineering) チームとも連携し、「今の設計でAIが本当にデータを正しく読めるのか?」という視点でからギャップを洗い出し、PoCの設計図をブラッシュアップします。
  2. スモールスタートで「対話」を始める
    • 基盤整備と並行して、まずは特定のデータセットに絞った形でも「対話型インターフェース」を試せないか検討します。来週さっそくチームで集まり、具体的なロードマップを引く予定です。

メルカリさんの事例を刺激に、私たちも「未来のデータ分析体験」の実装を一気に進めていきます。


関連資料

▼ 参照リンク(セッション内で言及・関連情報)

MLOpsエンジニアがAI Security Conferenceに参加してきたレポート

MLOpsエンジニアのtomoppiです。

データエンジニアリング部 データサイエンスグループ(以下、DSG)に所属し、ML/LLM基盤の構築・改善に取り組んでいます。

AI Security Conferenceに参加してきたので、そのレポート記事となります。Image

余談ですが、当日はまい泉のお弁当をご用意いただきました。大好きなまい泉のカツサンドが出てきて、個人的に最もテンションが上がったポイントでした。

Findy Toolsさんとスポンサーの企業様には、感謝してもしきれません。 Image

以降、真面目にレポートしていきます。

参加動機

MLOpsエンジニアとして本カンファレンスに参加した理由は、3ラインモデルの「第1線」を担う立場として、LLM特有のリスク管理をMLOpsのサイクルに組み込む重要性を感じているからです。

現在、タイミーのMLOpsチームでは、LLM API/LLMOps基盤の開発・運用を通じ、「安心・安全な利用」を最優先事項の一つとして取り組んでいます。

これまでも、LLMアプリケーション向けProduction Readiness Checklistの策定を通じて、セキュリティ観点の整理を進めてきました。

また社内勉強会では、OWASP Top 10 for LLMAI-IRSといったフレームワークを紹介するなど、社内共有も行ってきました。

今回は、これまでの知見をさらに一歩進めるべく、他社の実務に即したセキュリティ運用の事例を収集し、自社基盤へフィードバックするヒントを得る目的で参加してきました。

全体を通して

大きく分けると、テーマは次の3本立てでした。

  • AIガバナンス(組織としてどう決めて回すか)
  • Security & Safety for AI(LLMを利用する際のセキュリティ対策)
  • AI for Security(セキュリティ運用でAIをどう使うか)

各社の前提が違うぶん「唯一の正解」があるわけではなく、それぞれの現実的な落とし所が共有されていたのが良かったです。

共通していたメッセージは、次の3点だと理解しました。

  • セキュリティは重要だが、ブレーキになりすぎると活用が止まる
  • だからこそSecure by Defaultとなるアーキテクチャとプロセスが大事
  • ただし各種ツールはまだ未成熟で、トレードオフの中で各社が意思決定している

印象に残ったセッション

信頼できるAIの実現に向けた東京海上グループのAIガバナンスとセキュリティ戦略(東京海上ホールディングス株式会社)

このセッションは、「信頼できるAI」について、方針→基準→運用→技術の流れで一本の線として説明されており、全体像がつかみやすかったです。

ポイント

  • セーフティセキュリティをまず切り分けて考える
    • セーフティ: AIが誤答や偏りで「害を出さない」ようにする(品質・倫理・説明責任)
    • セキュリティ: 攻撃や漏洩から「守る」(プロンプトインジェクション、機密情報、権限など)
    • そして両方を、場当たり対応ではなくガバナンス(方針・役割・プロセス・監査)として運用する
  • ガバナンスを基本方針/実施基準/実施要領の3層に分け、外向けと運用を切り分ける
  • AIリスクの議論はまずリスクの地図を作ってから話す(論点の漏れ・重複を防ぐ)
    • 例: 意図しない損害、バイアス、説明責任、情報漏洩、モデル脆弱性などを上位カテゴリとして押さえる
  • モデル検証(開発時)ガードレール(実行時)を分けて考える
  • 独自流ではなく、可能な限りグローバル標準の枠組みに寄せる(例: MITRE ATLAS
  • ツールは黎明期なので、ツールありきではなくアーキテクチャとプロセスで統制できる型を先に作る

感想

セーフティ/セキュリティを分けて“運用”に落とす考えは、タイミーで進めているLLM基盤設計でも活用したいと思いました。

また、グローバル企業として関連会社が多いことから、全体を束ねるAI CoE(Center of Excellence) / AI Hubの構想も語られていました。組織の大きさや、そこでガバナンスをスケールさせる難しさについて、ヒントを得られる内容でした。

freee社のAI導入とセキュリティ対策(フリー株式会社)

freee社のセッションは、「AIを全社で使う」前提に立ったときに、セキュリティをブレーキではなく「前に進める仕組み」として設計していたのが印象的でした。

ポイント

  • 主要リスクは漏洩ハルシネーションコスト(扱うデータが機微なので)
  • 展開は実験場 → 交通ルール → 安全装置 → 本格展開の段階設計
  • 「安全装置」をプロキシ(LiteLLMなど)で型化し、ログ・機微情報遮断・出力制御を必須ライン化
  • 市場が追いつかない領域は小さく内製(セキュリティレビュー/脆弱性診断の自動化など)
  • 役割分担も、従来のCSIRT(コーポレート)/PSIRT(プロダクト)の分担を前提にしつつ、
    • ブルー/レッド/ホワイト/パープルの「色」で責務を切り直す
    • 背景: プロダクト特性の変化により守る範囲が広がり、従来の分業だけだと壁ができやすい
    • ねらい: 特にパープルでレッドとブルーの連携を促進し、スピードを落とさない

感想

freee社の発表は、セキュリティ担当部門として“何をどう守るか”が具体的で、解像度が上がりました。要素技術面に関しても、タイミーでLiteLLMを利用した基盤開発を進めていることもあり、実際的に参考になる内容が多かったです。

まとめ

今回一番のキーメッセージだと思ったのは、「AIセキュリティはツールを揃える前に、ガバナンスとアーキテクチャで回る型を先に作るのが大事」という点でした。

東京海上のセッションでは、セーフティ / セキュリティを切り分けたうえで、方針→基準→運用→技術へ落としていくことで、場当たり対応を防げるという点が整理されていました。

freeeのセッションでも、段階的に展開しつつ、プロキシを「安全装置」として型化してスピードを落とさない設計が重要と語られていました。

完璧主義で全部揃えてから進むのではなく、リスクベースで段階的に進めながら、使うだけで守られる状態(Secure by Default)に近づけていくことが、当面の目標になりそうだと思いました。

AI CoEやカラーコードのような組織設計は、いますぐ真似できるものではないですが、「活用を止めないために、どう責務とプロセスを設計するか」という観点は持っておきたいです。

タイミーでも現在、LLM基盤の構築と並行して、LLM機能の検証をいろいろ進めています。今回の学びをヒントに、取り組みを安全に加速させていきます。

自律的な基盤モデル活用を加速させるための開発プロセスの標準化

1. はじめに

こんにちは。株式会社タイミーのデータサイエンスグループ(以下、DSG)でグループマネージャーを務めている菊地です。

前回の記事では、タイミーのDSGが認知負荷をコントロールするために仮想チームという形態をとり、チームトポロジーの考え方をベースに組織を運営していることをお話ししました。

その中で、MLOpsエンジニア主体のプラットフォームチームの役割を「専門性を最大化するための共通基盤を提供すること」と定義しました。現在、その基盤の上でホットなトピックとなっているのが、LLMをはじめとする基盤モデルの活用です。

昨今の基盤モデルの急速な進化に伴い、タイミーの各プロダクトチーム(チームトポロジーにおけるStream Aligned Team、以下SA Team)からも「基盤モデルを使ってユーザー体験を向上させたい」というアイデアが次々と生まれています。プロダクト内のコンテンツ生成から業務の効率化まで、基盤モデルを活用することで解決できる課題の幅は非常に多岐にわたります。

ただ、基盤モデルをプロダクトの機能として組み込むプロセスは、従来のソフトウェア開発とは異なる考慮事項も多く、不確実性も伴います。

  • 「そもそもこの課題に基盤モデルは最適なのか?」
  • 「精度の評価はどう客観的に行えばいいのか?」
  • 「セキュリティやコストの管理はどうすべきか?」

これらの問いに対して、すべての案件にMLOpsエンジニアやデータサイエンティストが付きっきりで関与していると、どうしても開発のスピード感を維持するのが難しくなることもあります。DSGがボトルネックになるのではなく、SA Teamが自分たちの力で自律的に、かつ安全に基盤モデルを活用した機能をリリースできるような状態を整えていく必要があります。

そのような背景から、DSGとして「基盤モデルを用いた機能開発のガイドライン」を策定しました。

本記事では、SA Teamのセルフサービスな開発を支援し、組織全体で価値提供を加速させるためのガイドラインのエッセンスをご紹介します。

2. 開発体制パターンとDSGの関わり方

基盤モデルを活用した機能開発を進めるにあたり、まず私たちが整理したのが、開発の特性に応じた開発体制パターンです。

すべての開発を同じフローに乗せるのではなく、技術的な複雑さや求められる専門性に応じて役割分担を明確にすることで、SA Teamが迷わずに開発を開始できるようにしています。

選択の指針:スピードか専門性か

これら2つのパターンのどちらを選択するかは、主に「基盤モデルの出力がそのまま価値になるか」、それとも「複雑なロジックや既存システムとの高度な統合が必要か」という観点で判断します。

パターン1. セルフサービスパターン(ガイドラインのメイン対象)

SA Teamが主体となり、クラウドプロバイダーが提供するAPIを利用して開発を進めるパターンです。基盤モデル周辺の実装が比較的シンプルに完結し、プロンプトの調整や基本的なRAG(検索拡張生成)の構成で十分な価値が出せるケースを想定しています。

  • 主なユースケース:定型文の生成、ドキュメントの要約、シンプルな分類タスクなど。
  • 責任の所在:機能の企画、プロンプトエンジニアリング、実装、評価までをSA Teamが完結して持ちます。
  • DSGの役割:DSGは、API利用環境の払い出しや、セキュリティ・コストのガードレール提供、技術的な壁打ち相手としての伴走(Enabling)に徹します。

このパターンの最大のメリットは、DSGとの調整コストを最小化し、SA Teamのスピード感で価値検証のサイクルを回せることにあります。

パターン2. Complicated Subsystemパターン

システムやロジック自体が高度に複雑で、運用・改善にデータサイエンティストやMLOpsエンジニアの専門知見が不可欠なケースです。例えば、基盤モデルの出力を独自の数理モデルや推薦アルゴリズムと組み合わせる場合や、ドメイン特有の複雑な評価指標が必要な場合が該当します。

  • 主なユースケース:複雑なマッチングロジックへの組み込み、高度な推論パイプラインの構築など。
  • 責任の所在:DSGがアルゴリズムやバックエンドの主要ロジックに責任を持ち、SA Teamと協力してプロダクトへ統合します。
  • DSGの役割:モデル選定からパイプライン構築、精度評価の設計までを深くリードします。

専門性が求められる部分をDSGが引き受けることで、SA Teamが基盤モデルの深い専門知識をすべて学習する負荷を下げつつ、プロダクトのコア価値を最大化します。

3. 不確実性を乗りこなす5つの開発フェーズ

基盤モデルを活用した機能開発は、従来のソフトウェア開発に比べて不確実性が高く、やってみないとわからないことが多い領域です。そのため、ウォーターフォール型で一気に作り込むのではなく、アジャイルなアプローチで段階的に仮説検証を進めることが成功の鍵となります。

ガイドラインでは、開発プロセスを以下の5つのフェーズに定義しています。ここでは、各フェーズの概要と、私たちが重視している検証のポイントを紹介します。

実際のガイドラインでは、各ステップで「どのような性質の成果物が求められるのか」を具体的に定義しています。さらに、過去の成功事例で作成したシステム構成図や、投資対効果(ROI)の判断資料、プロンプトの評価ログなどを参照できるようにしており、各ステップで目指すべきゴールを明確にイメージできるように工夫しています。

Phase 1: 計画・設計フェーズ

プロジェクトの目的を定義し、ビジネス価値と技術的実現性の両面から、プロジェクトの妥当性を検証します。

  • 検証のポイント:解決したい課題に対して基盤モデルが最適な手段であるか、成功を測るための指標(KGI/KPI)が明確か、既存システムとの安全な連携が可能か。
  • 期待される成果物の例:成功基準を定義したドキュメント、全体的なシステム構成案、想定されるリスクと対策方針の整理。

Phase 2: PoC開発フェーズ

「この機能は本当にユーザー価値があるか?」という仮説を検証するため、最小限のコストで迅速にコア機能を構築するフェーズです。

  • 検証のポイント:基盤モデルの応答性能が実用レベルに達しているか、提示されたユーザー体験(UX)が課題解決に繋がっているか。
  • 期待される成果物の例:主要なプロンプトの初案、コア機能が実際に動作するプロトタイプ、コストや性能を可視化する簡易的なモニタリング環境。

Phase 3: PoC評価・本番移行計画フェーズ

PoCで得られた定量的・定性的なデータに基づき、本番開発へ進むべきかを客観的に判断するフェーズです。

  • 検証のポイント:精度、コスト、速度を総合的に評価した際に、十分な投資対効果(ROI)が見込めるか。
  • 期待される成果物の例:本番開発への移行を判断するための意思決定ドキュメント。
  • 意思決定のプロセス:タイミーでは、本番移行にあたって技術およびプロダクト責任者による承認を必須としており、スピードとガバナンスの両立を図っています。

Phase 4: 本番開発フェーズ

検証された価値を、全ユーザーに安定して提供できる、スケーラブルで信頼性の高い機能を構築するフェーズです。

  • 検証のポイント:最大トラフィックに耐えうる負荷対策がなされているか、プロンプトの変更が品質劣化を招かないための評価基盤が整っているか。
  • 期待される成果物の例:環境分離(dev/stg/prod)が徹底された本番機能、品質劣化を防ぐための自動評価(リグレッションテスト)環境、運用のための各種レポート。

Phase 5: 本番運用・継続的改善フェーズ

安定稼働を維持しつつ、収集したデータに基づいて継続的に機能を改善し、ビジネス価値を最大化するフェーズです。

  • 検証のポイント:実際の利用データに基づき、KPIが想定通り改善されているか。
  • 期待される成果物の例:段階的なリリース計画、インシデント発生時の対応フロー、ユーザーフィードバックの収集・分析プロセス。
  • 継続的改善:新しいモデルの登場やモニタリング状況の変化に合わせ、迅速にプロンプトやモデルをアップデートできる体制を維持します。

4. プロダクト品質を支える技術ナレッジの体系化

開発プロセスが整っても、個々の技術的な判断基準が属人化していては、プロダクト全体の品質を一定に保つことはできません。ガイドラインでは、SA Teamが自律的に最適な意思決定を行えるよう、基盤モデル活用の勘所を技術ナレッジとして集約しています。

ここでは、私たちがガイドラインで定めている技術ナレッジの概要をいくつかご紹介します。

本当に「基盤モデル」が最適か?

基盤モデルは極めて汎用性が高いツールですが、すべての課題に対する正解ではありません。私たちは、開発を始める前に「本当にその課題を基盤モデルで解くべきか?」を立ち止まって考えることを推奨しています。

  • 基盤モデルが得意なこと: 創造性が求められる文章生成、膨大な情報の要約、そして「文脈やニュアンス」を汲み取った高度な分類・抽出、画像や音声を統合して理解するマルチモーダルな処理。
  • 基盤モデルが苦手なこと・適していないこと: 100%の正確性が求められる、シンプルな条件分岐で済むルールベースの処理、すでに特定のタスクに特化した専用AI APIが存在するケース。

「最新技術だから使う」のではなく、コスト・精度・安定性のバランスを鑑みて、従来通りのプログラムや専用APIの方が優れていないかを冷静に見極める眼を養うための基準を明文化しています。

素早い価値検証とデータ資産の積み上げ

一方で、基盤モデルの大きな強みは「機械学習の事前準備をショートカットできること」にあります。

従来の機械学習プロジェクトでは、特定のタスクを解くために大量の学習データを準備し、モデルをトレーニングするという数週間〜数ヶ月単位のプロセスが必要でした。基盤モデルを使えば、この重たい工程を飛び越え、プロンプトの調整だけで数日〜数週間でユーザーへの提供価値を検証できる可能性があります。

たとえ初期のAPIコストが高くついたとしても、まずは最速で「そもそもこの機能がユーザーに求められているか」という本質的な仮説に答えを出す。そして検証の過程で蓄積された「ユーザーの入力」と「フィードバック」は、将来的に専用モデルや自社独自のモデルへ移行する際の貴重な学習データとなります。

「まずは基盤モデルで素早く価値検証を行い、成功すればそのデータを基に、より最適なソリューションへ進化させていく」という、時間軸を味方につけた戦略も取りうることを明文化しています。

処理の安定性と信頼性

基盤モデルの出力をプログラムで安定して扱うためには、自由な文章ではなく、後続の処理で扱いやすい形式でデータを受け取ることが不可欠です。これは一般的に構造化出力と呼ばれていますが、私たちは構造化出力を実装における標準として定義しています。

プロンプトによる指示に加え、モデルのネイティブ機能やバリデーション用のライブラリを適切に組み合わせることで、システムの安定性を高めます。また、APIの利用制限や一時的な負荷増大によるエラーに備え、自動的な再試行や代替モデルへの切り替えといった、プロダクション環境に耐えうる信頼性設計のパターンを共通化しています。

5. おわりに

今回ご紹介したガイドラインは、一度策定して終わりではありません。現場からのフィードバックや日々進化する技術動向を取り入れながら、常にアップデートし続けるドキュメントとして運用しています。

私たちがこのガイドラインを通じて実現したかったのは、不確実性の高い、基盤モデルを活用した開発において、各プロダクトチームが余計な迷いなく自律的に動けるよう、必要な指針を示し、環境を整えることでした。

DSGがすべての案件を抱え込むのではなく、専門知見を標準化して組織全体に開放していく。このプロセスこそが、タイミーが技術の力でミッションを達成するための大きな原動力になると信じています。

We’re Hiring!

タイミーでは、データサイエンティストやMLOpsエンジニアはもちろん、今回ご紹介したようなガイドラインや基盤を使い倒してプロダクトに価値を届けるエンジニア、プロダクトマネージャーなど、全方位で一緒に働くメンバーを募集しています!

最新の技術をどう社会実装するかという仕組みづくりに興味のある方は、ぜひカジュアル面談でお話ししましょう。皆さんの挑戦をお待ちしています!

タイミー採用情報 - Product Team

タイミーのデータサイエンス組織運営と開発の裏側

1. はじめに

こんにちは。株式会社タイミーのデータサイエンスグループ(以下、DSG)でグループマネージャーを務めている菊地です。

タイミーでは「『はたらく』を通じて人生の可能性を広げるインフラをつくる」というミッションを掲げ、日々膨大なマッチングデータや行動データを活用して、プロダクトの価値向上や意思決定の高度化に取り組んでいます。

ありがたいことに、最近は採用活動を通じて多くの方とカジュアル面談でお話しする機会が増えています。その中で、非常によくいただくのが「DSGはどのような組織体制で、どのようにコミュニケーションを取りながら組織運営しているんですか?」というご質問です。

これまでは面談の場で個別にお伝えしてきましたが、私たちの組織も拡大し、フェーズに合わせて柔軟に形を変えてきました。そこで今回、改めてタイミーDSGの現在の「組織のカタチ」を言語化し、候補者の皆さんに私たちのチームの現在地を詳しくお伝えしたいと思い、この記事を書くことにしました。

私たちの組織運営のキーワードは、「認知負荷の低減」と「自律性の最大化」です。

かつては全員で一つのスクラムを組んでいましたが、現在は「仮想チーム」という形態をとり、各チームが自律的に開発サイクルを回しています。本記事では、チームトポロジーの考え方を取り入れた組織構造から、具体的な開発フロー、そしてグループ内の文化までご紹介します。

2. 組織の変遷:なぜ「仮想チーム」へと移行したのか

全員ですべてを把握していた「単一スクラム」時代

以前、まだグループの人数が少なかった頃は、DSG全体で一つのスクラムチームとして活動していました。当時は全員がすべての取り組みの状況を把握し、毎日のデイリースクラムで情報を共有し、全員でリファインメント(バックログの精査)を行っていました。このスタイルは、情報の透明性が高く、誰が何をやっているかが一目でわかるという大きなメリットがありました。

急成長に伴う「認知負荷」の限界

しかし、タイミーというプロダクトの成長に合わせ、DSGが解決すべき課題は急速に増え、かつ多様化していきました。

  • 担当するドメインの拡大
  • MLOps基盤の高度化と、それに伴う専門知識の深化
  • ステークホルダーの増加

こうした状況下で、一つの大きなスクラムを維持しようとすると、メンバー一人ひとりが追わなければならない情報量が爆発的に増えていきました。例えば、あるデータサイエンティストにとっては、自分が担当していない領域の細かい仕様検討を延々と聞き続けなければならず、逆にMLOpsエンジニアにとっては、すべてのモデルの数理的な背景まで深く理解し続けなければならない…といった具合です。

これが、本記事のキーワードである「認知負荷」が限界に達した瞬間でした。

「仮想チーム」とチームトポロジーの導入

この課題を解決するために私たちが取り入れたのが、実組織の中をいくつかの「仮想チーム」に分割する運用です。

「実組織」としては一つのDSGですが、日々の活動(スクラム)は各仮想チーム(Squad)単位で行います。この体制を設計する際、書籍「チームトポロジー 価値あるソフトウェアをすばやく届ける適応型組織設計」の考え方を参考にしました。

チームトポロジーとは、チームの「認知負荷」を考慮して組織とシステム構造を整合させ、高速な価値提供を目指す組織論です。私たちはこれに基づき、チームの性質を以下のように定義しました。

  • MLOpsエンジニア主体のチーム:プラットフォームチーム

    DSを中心とした多様な利用者が、ML/LLMを用いた価値提供に集中できるように、機械学習基盤やLLM基盤、CI/CD、MLミドルウェアなどの「専門性を最大化するための共通基盤」を提供する役割。

  • データサイエンティスト主体のチーム:コンプリケイティッド・サブシステム・チーム

    推薦・マッチングやモデレーションといった特定のドメインに責任を持ち、高度なサブシステムの開発やビジネス上の複雑な課題解決を担う役割。

このように役割とチームを明確に切り分けることで、メンバーは「今自分が注力すべき領域」に認知的リソースを集中することができるようになりました。

DSG内の仮想チーム関係図

%%{init: {'theme': 'base', 'themeVariables': { 
    'fontFamily': 'arial',
    'primaryColor': '#ffffff',
    'edgeLabelBackground':'#ffffff',
    'tertiaryColor': '#f8fafc'
}}}%%
graph BT
    %% --- スタイル定義 ---
    classDef platform fill:#2563eb,stroke:#1e40af,stroke-width:2px,color:#ffffff,rx:10,ry:10,font-size:15px,font-weight:bold;
    classDef css fill:#f97316,stroke:#c2410c,stroke-width:2px,color:#ffffff,rx:10,ry:10,font-size:15px,font-weight:bold;
    classDef dsgContainer fill:#f1f5f9,stroke:#3b82f6,stroke-width:3px,stroke-dasharray: 6 4,color:#1e40af,font-weight:bold,font-size:16px;

    %% --- DSG内部の組織構造 ---
    subgraph DSG ["DSG (Virtual Organization Structure)"]
        direction BT
        
        %% 上層:価値創出の主体
        CSS["コンプリケイティッド<br/>サブシステムチーム<br/>(Squads)"]:::css

        %% 下層:強固な基盤
        MLP["ML基盤チーム<br/>(Platform Team)"]:::platform
        
        %% 供給フロー(強力な支援)
        MLP ====>|専門性を最大化するための共通基盤を提供| CSS
    end

    %% スタイルの適用
    class DSG dsgContainer
    linkStyle 0 stroke:#3b82f6,stroke-width:4px;

関連記事として、データサイエンティストのストリームアラインドチームからコンプリケイティッド・サブシステムチームへの配置変更の変遷は、以下の記事をご参照いただければと思います。

tech.timee.co.jp

3. 現場の意思決定を加速させる「Squad Lead」

仮想チーム(Squad)は、特定のプロジェクトを遂行するためだけのタスクフォースではなく、担当ドメインの成果に対して中長期的に責任を持つ半永久的な組織として機能しています。

このSquadにおいて、現場の自律性を支えているのがDSG独自の役割である「Squad Lead(SL)」です。SLは、データサイエンティストやMLOpsエンジニアが本来の業務と兼務する形で担う「内部的なロール」です。

GMとSLの役割分担

私(グループマネージャー:GM)とSLは、「組織の土台作り」と「ドメインの戦略実行」という軸で役割を分担しています。

  • GM:採用・配置・評価・キャリア成長など、「ヒト・モノ・カネ」といった組織基盤の最適化。
  • SL:担当ドメインにおける「コト(プロダクト・課題)」の解決。ロードマップ策定、短期〜中期の成果創出、ステークホルダーとの合意形成に責任を持つ。

現場のコンテキストを一番理解しているメンバーがSLとして意思決定を主導し、私はそれを組織的な側面から全力でサポートする。この補完関係を築くことで、マネージャーがボトルネックにならないスピーディな開発体制を実現しています。また、あえて「仮想」という柔軟な形にしていることで、メンバーがリーダーシップを経験する機会を広げ、事業状況に合わせた機動的なチーム編成を可能にしています。

4. 専門性を最大化するプラットフォームと開発フロー

では、具体的にどのようにプロダクト開発が進められているのでしょうか。ここからは、MLOpsエンジニアとデータサイエンティストの連携に焦点を当ててご紹介します。

MLOpsエンジニアが整える、専門性に集中するための共通基盤

MLOpsエンジニアは、いわゆるプラットフォームチームとして、利用者が本来の役割に集中できるよう、共通の開発環境やデプロイフローを整えています。

利用者の中心はDSですが、領域によってはデータアナリストやプロダクトエンジニアも想定ユーザーに含まれます。Google Cloudをメイン基盤とし、モノリポ構成でのディレクトリ設計やTerraformによる構成管理、CI/CDスクリプトの整備、さらにLLM基盤の構築やMLミドルウェアの導入・運用までを幅広く担当します。これにより、インフラやデプロイの複雑さを意識せずとも、安全かつ高速に価値を送り出せる仕組みが整っています。

大まかな機械学習基盤の構成は下記ページの「Architecture」セクションをご覧いただければと思います。

product-recruit.timee.co.jp

データサイエンティストによる一気通貫の価値創出

データサイエンティストはこの基盤を使い倒し、ビジネス課題の発見から解決までを一気通貫で担います。

  • 上流工程:課題設定、問題発見、ステークホルダーとの期待値調整。
  • 開発・実装:分析、PoC(LLM活用含む)、本番環境へのエンジニアリング。
  • 検証・改善:デプロイ後のABテスト、効果検証、それに基づく改善サイクルの実行。

整備されたプラットフォーム上で、Dev / Stg / Prod の各環境を使い分けながら高速にサイクルを回しています。このように、基盤を支えるスペシャリストと、事業価値を創出するスペシャリストが背中を預け合える関係性が、タイミーDSGの強みです。

5. チーム運営とシナジーを生む仕組み

仮想チームとして分かれて活動しつつも、グループ全体としての知見の共有や、職種を越えた連携を支えるための「場」や「仕組み」を大切にしています。

MLOpsとDSを繋ぐフィードバックループ

MLOpsエンジニア主体のプラットフォームチームは、2週間のスプリントで動いています。スプリントの終わりには、基盤の利用者(主にDS)に向けた「ML基盤アップデート共有会」を実施しています。

ここでは新機能の周知だけでなく、利用者からの改善リクエストや困りごとを直接受け付けるスプリントレビューのような役割も果たしています。「作って終わり」ではなく、常に利用者の声を聞きながら基盤をブラッシュアップしていく。この対話の仕組みこそが、DSG内での高い開発体験を支えています。

AIも駆使して刺激を与え合う「学び」の習慣

私たちは技術的な研鑽も欠かしませんが、その「継続しやすさ」にもこだわっています。DSG内では定期的に勉強会を開催していますが、現在は隔週1時間で「毎回3,4名が10〜15分ずつ発表する」というスタイルをとっています。

意識しているポイントとしては、発表のハードルを極限まで下げていることです。発表時間を短くすることで、トピックの論点を端的にまとめやすくし、発表のハードルも下げています。発表資料の作成にはNotion AIやNotebookLMといったツールを積極的に活用し、準備の省力化を推奨しています。これにより「資料作りに追われてアウトプットが億劫になる」のを防ぎ、ハイスピードで知見を循環させることに挑戦しています。

また、グループ内に閉じず、他部署のエンジニアを交えた合同輪読会を行っているチームもあり、組織を越えて互いに高め合う文化が根付いています。

制度を活用した「チームビルディング」

仕事以外での繋がりも、心理的安全性を高める重要な要素です。タイミーにはチームビルディング費用の補助が出る全社的な福利厚生制度があり、これを活用して毎月、部署内外のメンバーと交流(飲み会や親睦会)を行っています。

部署内の結束を深める月もあれば、他部署のメンバーと交流する月もあり、こうした定期的な交流の場が「困った時にいつでも相談できる」関係性の土台になっています。

6. おわりに

今回は、タイミーのデータサイエンスグループ(DSG)がどのような組織構造で、どのような思想を持って日々開発・運用を行っているのかをご紹介しました。

私たちが「仮想チーム」や「Squad Lead(SL)」という運用に行き着いたのは、単に組織を管理するためではなく、「メンバー一人ひとりが認知負荷に振り回されず、本来の専門性を最大限に発揮して、プロダクトに価値を届けられる環境」を作りたかったからです。

組織の形は、プロダクトのフェーズや課題に合わせて柔軟に変わっていくべきものです。今回ご紹介した体制も現在の「最適解」ではありますが、今後さらに組織が拡大していく中で、私たちはまた新しい壁にぶつかり、形を変え続けていくはずです。そうした変化を楽しみながら、仕組みそのものをアップデートしていけることも、今のタイミーDSGの面白さだと感じています。

この記事を通じて、私たちの組織運営やチームの雰囲気が少しでも伝わっていれば幸いです。

We’re Hiring!

タイミーではデータサイエンティスト・MLOps Engineerをはじめ、一緒に働くメンバーを募集しています!

カジュアル面談も行なっておりますので、興味のある方はぜひお気軽にお申し込みください!

https://product-recruit.timee.co.jp/

Image