Timee Product Team Blog

タイミー開発者ブログ

RubyKaigi 2025参加レポート(Day2 vol.1)

2025年4月16日から18日の3日間愛媛県松山市にて、RubyKaigi 2025が開催されました。

rubykaigi.org

タイミーでは、昨年に続き、世界中で開催される技術系カンファレンスに無制限で参加できる「Kaigi Pass」という制度を活用し、新卒内定者やインターン生を含む総勢16名が現地でカンファレンスに参加しました。

前回に引き続き参加レポートの第2回として、Day2 vol.1と題し、Day2で現地参加した各エンジニアの印象に残ったセッションとその感想をまとめてお届けします。

今後も、Day2 vol.2Day3と続けてレポートを公開予定です。

各セッションごとに内容を整理し、参加者自身の視点から学びや気づきをまとめています。読者の皆様にとって、今後の学びの参考になれば幸いです。

Performance Bugs and Low-Level Ruby Observability APIs

rubykaigi.org

概要

「遅すぎて不具合に感じる」というパフォーマンスの問題をPerformance Bugsとして紹介し、その問題は「遅さ」ではなく、CPU、メモリ、時間といったリソースの過剰消費の問題として捉えるべきとしました。その問題が本番環境やユーザー体験、コストに与える影響を評価することが重要とした上で、そのための調査にはRubyのObservability APIを使うと良いということが紹介されました。発表ではTracePoint APIやPostponed Job APIなど具体的なAPIと簡単なプロファイラの作り方を紹介していました。最後にPerformance Bugsとの向き合い方を紹介して終わっています。

主要APIの解説と活用例:

  • low_level_toolkit gem: 低レベルAPIの利用例と簡単なツール群を提供。
  • TracePoint API (内部イベント含む): メソッド呼び出し、クラス定義、例外発生に加え、オブジェクト生成(new_object)やGCの開始/終了(gc_start, gc_end)といったVM内部イベントもフック可能。オブジェクト割り当ての追跡やGCタイミングの計測デモが示された。コールバック内での制限(オブジェクト生成不可など)にも言及。
  • Postponed Job API: 低レベルAPIのコールバック内で安全にRubyコード(オブジェクト生成やAPI呼び出しを含む)を実行させるための仕組み。「セーフポイント」と呼ばれるVMが安全な状態になったタイミングで実行される。GC完了時にRubyコードで情報を記録するデモが示された。
  • Frame Profiling API: 低オーバーヘッドで現在のバックトレース(コールスタック)を取得できる。プロファイラ構築の基礎。
  • Debugger Inspector API: フレームプロファイリングより高コストだが、はるかに詳細な情報(呼び出し元のオブジェクト、メソッド引数、ローカル変数、バインディング、命令シーケンスなど)にアクセスできる。デバッガ構築に利用される。呼び出し元のオブジェクトやそのバインディングを取得するデモが示された。
  • GVL Instrumentation API: Global VM Lock (GVL)の取得・解放、スレッドの実行・待機状態遷移を追跡できる。スレッドがGVL待ちでどれだけ時間を費やしているかを計測するデモが示された。

感想

タイミー入社からの約5年間、自分はそれなりにパフォーマンスとは向き合ってきたと思っています。弊社でもDatadogを利用しているのですが、これまでのパフォーマンス改善でとても役に立ちました。パフォーマンス改善の話をすると、昔は超簡単なn+1の改善をすれば2倍3倍と早くすることができました。しかしながら明らかに低速な部分が減るとちょっとずつ丁寧な観測が要求されます。その際にメソッドコールやオブジェクト生成などが観測できるととても便利です。今回の発表では、そんな際に利用しているプロファイラがどうやって作られているのかを紹介しているものでした。言語やプロファイラの理解を深めるために一回触ったり作ったりしてみようと思います。プロファイラは小さいものを含めてまだ作ったことがないので楽しみです。

(@Juju_62q)

RubyKaigi前に #Rubygemsコードリーディング部でdd-trace-rbのソースコードを読んでいました。各Rubyバージョンへのパッチ対応をしつつ、C実装も独自に拡張しており、尚且つ型を書いていたので、とても練度の高いgemだなと。

発表では、TracePoint API、Postponed Job APIなどRuby VM内のAPIにはどんなものがあって、どのように活用できてどんなデータが取得できるのかという話がありました。

これらのAPIを使ってRelease GVL profilerをわずか107行で作ったという話がありましたね。

普段からモニタリングやログ探索の場面でDatadogにはかなりお世話になっており、便利に使っていました。内部実装に関しては知見がなかったので、プロファイラの実装に関してイメージが湧いたのは自分にとって有意義でした。

プロファイラは使うだけで作ったことはないのですが、イメージが湧いたので自分で作ってみようと思います。

P.S. IvoにセッションやDatadogへの感謝を直接伝えて、一緒に写真を撮ってもらいました!ありがとうございました!

(@dak2)

サービスの規模が大きくなっていくほどパフォーマンスの問題とも真摯に向き合っていく必要があります。自分はタイミーで初めて規模の大きいソフトウェア開発を経験したこともあり、パフォーマンスの問題との付き合い方は勉強中です。

これまではとにかく「遅ければ遅いほど問題だ」と考えていましたが、そうではなくパフォーマンス劣化によって「ユーザー体験や自社のコスト増にどの程度影響しているか」という視点が大事なんだという学びを得られました。

監視ツールでは純粋に処理に時間がかかっているものはわかりますが、それぞれがどの程度ユーザー体験やコスト増に繋がっているかはパッと見わからないです。この辺りの判断を行えるようになるためには各リソースにかかるコストを把握する必要があり、また様々あるドメインについて、レスポンスが悪化することによってどの程度ユーザーに不便をかけるのかも把握しておく必要がありそうだなと思いました。一人で全部把握するのは大変ですが、組織全体として誰かが知っていれば評価はできると思うので、誰がどの領域に詳しいか、誰も知らないものはどれかをきちんと把握し、これからもパフォーマンス問題に向き合っていきたいです。

今回紹介していただいたツールもパフォーマンス劣化の原因を特定するのに役立ちそうなので、一通り使えるようになりたいと思います。

(@rhiroe)

プロダクト開発は作って終わりではなく、日々モニタリングを行い改善していく必要があります。今までもdatadogを使ってモニタリングは行っていましたが、どのような仕組みでモニタリングを可能にしているのかは理解できていない状態でした。

発表では、低レベルなRubyの可観測性 (Observability) APIについての解説があり、複数のAPIが紹介されていました。また、パフォーマンスの問題をどう捉えるかという視点についても言及がされており、どれくらいユーザーやコストに対して影響を与えているかが大事であるというものでした。パフォーマンスは良い方が良い、というのは間違いないかなとは思っているのですが、どこからが修正すべき問題として捉えるのかどうか、というのは新しい観点であり新鮮でした。

今回の発表でプロファイラのイメージが少しだけ湧いたため、紹介されていたAPIやサンプルコードを用いてプロファイラの作成にも取り組んでみようと思いますし、今後の改善においては、ユーザーやコスト面の影響などを考えて優先度をつけていきたいです。

(@nissy325)

docs.google.com

ZJIT: Building a Next Generation Ruby JIT

rubykaigi.org

概要

ShopifyのRuby & Rails infrastructure teamのMaximeによるセッションでは、新しいRubyのJIT コンパイラであるZJITの開発概要が説明されました。ZJITは、将来20年以上にわたる利用を見据え、高性能、高保守性、高拡張性を目指しているようです。ZJITはメソッドベースのコンパイルと SSAに基づく中間表現を採用し、高速な関数呼び出しの実現を目指しています。初期のマイクロベンチマークでは、インタプリタやYJITよりも高速な結果が出ています。Ruby 3.5でオプショナルで利用可能になるとのこと。4.0では実験的に取り込まれる予定らしいです。今後は、より現実的なベンチマークでの性能向上とコンパイラの最適化に注力していくとのことです。

感想

一番気になっていたMaximeのセッション。このセッションではRubyの次の20年を見据えたZJITという新しいコンパイラや、YJITとの違いについて発表がなされました。

近年、Rubyのバージョンが上がるごとにYJITの性能も良くなっており、Rubyのバージョンを上げたら速くなった…!という体験をされている方も多いかと思います。

ただ、性能の伸びは徐々に鈍化しているようです。

Rubyは良い言語だけど、もし速度が遅ければ、パフォーマンス最適化要求の波に飲まれていずれ滅ぶという趣旨の発言もありました。

そういったモチベーションからZJITに取り組まれているとのこと。

ZJITはSSA(Static Single Assignment Form)に基づく中間表現を採用しているようです。SSAとは「すべての変数の使用に対して、その値を定義(代入)している場所がプログラム上で一箇所しかないように変数の名前を付け替えた中間表現形式」のようです。これは多くのコンパイラで広く使われている中間表現です。これによってコンパイラの設計が理解しやすくなり、拡張も容易になるとのこと。コンパイラについては何もわからないので、Deep Diveしてみようと思いました。

高速なJIT-to-JITの呼び出し、ポリモーフィックインラインキャッシュなどYJITでは難しかった高度な最適化機能の実装になるらしいです。

セッションの中で弊社のブログが紹介されましたね!これからも発信し続けていきたいです。

tech.timee.co.jp

この記事にもあるようにRuby 3.4.2のYJITによる高速化の恩恵は受けられませんでしたが、次の YJIT、並びにZJITの動向に目が離せません。(ZJITのPRマージされたみたいですね!)

参考資料

(@dak2)

Dissecting and Reconstructing Ruby Syntactic Structures

rubykaigi.org

概要

Rubyの柔軟性と表現力を裏側で支えるParser(特にparse.y)が抱える課題と、解決アプローチを通して、Rubyの構文構造の根底にある原則とパターンについて学ぶことができます。

感想

これまでRubyでアプリケーション開発を行う上で、Parserの存在を特に意識することはありませんでした。しかし、この発表を通して、Rubyのシンプルに見える見た目の内部には、非常に複雑な構文構造が存在し、それがRubyの持つ柔軟性や豊かな表現力を支えていると実感することができ、発表者の@ydah_ さんの熱意も相まって、一気にこの分野への興味が出てきました。

重複した部分を特定し共通構造を抽出して抽象化するというアプローチは、日々のアプリケーション開発でも行われているものですが、それを長年にわたり多くのRubyコミッターによって開発されてきたparse.yに対して行うのは非常に困難だったのではと想像します。今回、Lramaの新しい記法を用いることで構造の抽象化を実現し、Rubyの柔軟な文法を維持しながら、保守性と可読性の向上を可能にしている点にとても感銘を受けました。

(@creamstew)

speakerdeck.com

Speeding up Class#new

rubykaigi.org

概要

このセッションでは、 RubyのClass.newのパフォーマンス改善について解説していました。現状のC言語実装では、RubyとCの呼び出し規約の切り替えなどにコストがかかる点が課題でした。このオーバーヘッドを解消するため、Ruby自身でClass.newを実装する新しい試みが紹介されました。これにより、多くの場合で高速化を実現しましたが、メモリ使用量の増加やスタックトレースのわずかな変化といったトレードオフも存在するとのことです。

感想

普段Railsアプリケーションの開発に携わる中で、Rubyのコードがどう動いているかについて気にすることはほとんどありません。ましてや、パフォーマンスを改善しようと考えたことはなかったので、Class.newのような基本的な部分に改善の余地があるとは想像もしていませんでした。このような改善に取り組む熱意を尊敬するとともに、こういった方々に我々は支えられているのだなと改めて感じました。

また、RubyとCがどのようにデータをやり取りしているかの深い部分を知ることができ(完全には理解できませんでしたが…)、よりRubyに詳しくなれたような気がします。

今後は、感謝の気持ちを忘れずに開発に臨むとともに、パフォーマンス改善をする際には「実は Rubyのコード自体にボトルネックがあるのでは?」という視点を持ちたいと思います。

(@otaksy)

“Class.newをCじゃなくRubyで動かす”、とだけ聞くと「Cの方が速いでしょ?Rubyで動かすと遅くならない?」と思いましたが、話を聞くとClass.newの呼び出し箇所が非常に多く、オブジェクト生成の部分だけを見た場合の速度はCで動かした方が速いが、RubyからCに切り替えるためのコストも含めるとRubyだけで動いた方が速いという説明を聞いて納得しました。

この改善によって一般的なユースケースではパフォーマンスの有意な改善が見られるそうなので楽しみです。Ruby3.5にこの変更が含まれる予定だそうですが、次はRuby4.0になるかもみたいな話もあり、楽しみが2倍です。

(@rhiroe)

Benchmark and profile every single change

rubykaigi.org

概要

このセッションでは、Benchmark-Driven Development(ベンチマーク駆動開発)という手法が紹介されていました。その内容は、コーディングする前にベンチマークを設計し、コーディング前後でベンチマークの実行結果を比較することで、変更によるパフォーマンスの悪化を早期に発見できるというものです。ベンチマーク駆動開発を用いて、RubyフレームワークのSinatraを100倍高速化させたXinatraを実装する取り組みについても紹介されていました。

感想

これまでパフォーマンス改善を何度か経験してきましたが、多くの場合、パフォーマンスが無視できないほど悪化してから改善に着手していました。そのため、コーディング段階でベンチマークを実行し、パフォーマンスの悪化を防ぐというアプローチは、斬新でありながらも有効だと感じました。

また、N+1のような明確なボトルネックを解消した後に、チリツモでパフォーマンスが悪化している状態を何度も見てきたため、チリをツモらせないための解決策としても活用できそうです。

ただし、すべての開発にこの手法を適用すると、開発効率が落ちる可能性があるため、そのトレードオフは考慮する必要がありそうです。そのため、まずはパフォーマンスが特に重要な機能に絞って、この手法を実践してみようと思いました。

(@otaksy)

おわりに

RubyKaigi 2025 Day2 vol.1レポートでは、低レベルAPIやパフォーマンス改善などRubyの深層に迫るセッションを中心に、現地参加したエンジニアそれぞれの視点からの学びや気づきをお届けしました。

本レポートで取り上げたセッションでは、普段は見えないRubyの仕組みやパフォーマンスへの深い知見を得られたことで、Rubyの奥深さに一層興味が湧きました。

今後もDay2 vol.2、Day3とレポートを公開しますので、どうぞお楽しみに!

Day1の前日に立ち寄った松山市内の海岸

RubyKaigi 2025参加レポート(Day1)

2025年4月16日から18日の3日間愛媛県松山市にて、RubyKaigi 2025が開催されました。

rubykaigi.org

タイミーでは、昨年に続き、世界中で開催される技術系カンファレンスに無制限で参加できる「Kaigi Pass」という制度を活用し、新卒内定者やインターン生を含む総勢16名が現地でカンファレンスに参加しました。

本レポートでは、Day1の様子を、参加したエンジニアが注目したセッションごとに、ポイントや得た知見をまとめてご紹介します。

今後も、Day2 vol.1Day2 vol.2Day3と続けてレポートを公開予定です。

各セッションごとに内容を整理し、参加者自身の視点から学びや気づきをまとめています。読者の皆様にとって、今後の学びの参考になれば幸いです。

Make Parsers Compatible Using Automata Learning

rubykaigi.org

概要

Ruby のパーサーである parse.y と Prism には非互換性が存在するが、それを検知するためには本来膨大なテストが必要になる。筆者はオートマトン理論を応用することでそれぞれのパーサーの不一致性を定量的に検出できるのではないかという仮説を立て、限定的な条件を当てはめて試行してみた結果、見事にバグを検出して修正することができた。

感想

若いうちから才覚を発揮して個人的に敬愛している makenowjust さんの発表です。内容は概要の通り。

研究とかだとよくある話ですが、現実世界の複雑性に対して理論をそのまま適応できずにより限定されたスコープにのみ理論を適用する、というアプローチがしばしば見受けられます。

今回もそのケースで、Ruby の文法全体は文脈自由言語なので今回の定式をそのまま適用することはできないため、Visibly Push-down Automaton の適用範囲に限定しています。

今回の発表で私が意義深いと思ったのは、その限定されたスコープにおいてもバグの検出に成功したこと、そして、そのバグの修正をコミットすることで言語コミュニティに成果をきちんと還元していることです。

10年近く前に私が大学で卒論を書いたときには研究室のアウトプットがコミュニティから断絶されていて論文を書いたあとも放ったらかしになっていたことを嘆きましたが、こうやってきちんと行動している人物がいることを考えると日常の忙しさに逃げていた私は視座が低かったなと恥じる思いです。

(@Hiromi Kai)

speakerdeck.com

Ruby's Line Breaks

rubykaigi.org

概要

Ruby における改行の扱いと例外、そしてその背景にある技術的な複雑さを紹介してより理解しやすい解決策を提案しています。

感想

Ruby における改行の背後に潜む lexer state という「混沌への扉」といかに向き合って克服していくかという、周辺知識のあまりない自分には中々難しい話ではありましたが、発表者の @spikeolaf さんが、分かりやすく、かつ引き込まれる語り口で解説してくれたので興味を持つことができました。他の Ruby コミッターの方も「理解不能」「怖い」「完全に理解できる人はいない」と語るほど複雑な lexer state をモデル化して最終的には完全に排除したいという壮大な目標を掲げており、いつか「混沌への扉」が閉じることを楽しみにしたいと思います。

(@ creamstew)

speakerdeck.com

Introducing Type Guard to Steep

rubykaigi.org

概要

RBS のエコシステムに積極的に contribute されている @tk0miya さんによる、RBS の Type Guard による Type Narrowing(型の絞り込み)をより便利にしたよ、という発表でした。

Ruby の型チェッカーSteepは型の絞り込みをサポートしていますが、is_a? や nil? などの基本的なメソッド以外(例: Active Support の present? やユーザー定義の判定メソッド)では、開発者の意図通りに型が絞り込まれず、冗長なコードや誤った型エラーが発生することがありましたが、この問題がある程度解消されます。

既に本体に取り込み済みの Union Type に対する Type Guard と提案中の User-Defined な Type Guard の紹介がメインになっています。

感想

タイミーでも実際に RBS/Steep を使っていて、意図した挙動とは異なる挙動を Steep がとることは稀によくあります。そのときは社内にいる soutaro さんに共有し、手元の実装を修正するか本体に変更を入れてもらうかを相談することがちょくちょくあるのですが komiya さんは自ら提案をしパッチを送る活動をされていて流石だなと感じました。

User-Defined な Type Guard も大変魅力的でこれが導入されると、Ruby での静的型付けの表現力の幅がグッと広がるのではないかと感じています。タイミーの中でも状態に応じてメソッドの返す値が異なるものは存在します。それらに対して User-Defined Typed Guard がどう活用できるのかを改めて考えてみたいと思いました。

(@euglena1215)

発表の主旨とは少しずれますが、この機能を使ってメソッドの呼び出し順序を表現することもできそうだなぁと思って興味深く聞かせていただきました。

型の絞り込みが期待通りできず、コードが冗長になる(e.g. something || raise)という経験は多いですが、多過ぎて慣れてしまったので、この発表を聞いてそういえばそうかもなぁという気持ちになりました。この辺りを表現するために複雑な型を書くことを要求されると、なかなか普及はしないかもしれないですが、Union Type に対するものについては、開発者が特に複雑な何かをする必要がなさそうなので純粋に嬉しいなぁと思いました。

(@rhiroe)

docs.google.com

Deoptimization: How YJIT Speeds Up Ruby by Slowing Down

rubykaigi.org

概要

YJIT を開発されている @k0kubun さんによる発表。

YJIT が Ruby のコードを最適化するために、あえて一部の処理を非最適化しているという内容でした。

YJIT の最適化されたコードが、場合によっては逆に効率が悪くなってしまうため、必要に応じて元のインタープリタ実行に戻すということを行っているとのことです。

またCで実装されたメソッドと、Ruby で実装されたメソッドの比較も行われ、C と Ruby のコードの境界を複数またぐ場合にはボトルネックが発生し、YJIT の特性を考慮した実装戦略が必要であることに触れられていました。

感想

YJIT は有効にするだけで使い方を意識する必要なく Ruby アプリケーションが高速化される魔法のような技術だと考えていましたが、その裏側では非常に複雑な技術基盤のもと成り立っているということを感じました。

タイトルにあるとおり高速化を行うためにあえて非最適化を行うという、直感と反する実装が行われていることが興味深かったです。

低レイヤーの知識に触れる機会がこれまでなかったのですが、コンパイラの実装に興味を持つきっかけとなりました。

(@Keisuke Kuwahara)

speakerdeck.com

Ruby Taught Me About Under the Hood

rubykaigi.org

概要

このセッションでは、文字エンコードの歴史から発表者である @ima1zumi さんの運命的な(?)出会いをした EBCDIC、そこから Ruby と出会い Ruby の文字エンコードに貢献していくまでの道のりと対応の苦労が紹介されていました。

感想

私はプログラミングを始めてから、そこまで文字コードに深く思い入れを持たずこれまでのエンジニアキャリアを過ごしてきました。

そのため、コメントでエンコーディングがおかしくなることを避けるために半角カタカナしか使わないことがあったというのは衝撃でしたし、Code Point と UTF-8 byte sequence が別物というのもあまり考えたことがありませんでした。

複数の Code Point で構成される絵文字 🧑‍🧑‍🧒‍🧒 が存在し、Unicode 15.1.0 からは Indic_Conjunct_Break for Devanagari をサポートするために新たなハンドリングのルールを実装する必要があったことなど、文字コードの奥深い世界を垣間見れてとても面白かったです。まさか Unicode アップグレード対応をするためには世界の言語体系に精通している必要があるとは思ってもいませんでした…。

(@euglena1215)

Opening Keynote が文字コードという、なかなか通好みなテーマだったのに自分は驚きましたが、蓋を開けてみれば @ima1zumi さんの文字コード愛にあふれる技術的な解説の面白さと、その愛を突き詰めた結果として Ruby のコミッターになったというストーリーのエモさがクロスオーバーする、最高のセッションでした。

セッションに登場した EBCDIC については、自分はメインフレームの経験がないため知らなかったのですが、銀行システムで半角カナが多く使われる理由に関係しているのかもしれない、などと想像がふくらみ、非常に興味を持ちました。(とはいえ業務で扱いたいとはあまり思いません)

セッションを通して、文字コードは「文化」と「技術」の交差点であることを改めて実感しました。人間の曖昧で多様な文字を、コンピュータの厳密で機械的なルールに落とし込むという課題は、非常にエキサイティングだと思います。 とりあえず『プログラマのための文字コード技術入門』をもう一度読み直そうと思います。

(@sugaishun)

speakerdeck.com

Automatically generating types by running tests

rubykaigi.org

概要

テストを実行するだけで、メソッドの引数や戻り値の型情報を収集し、RBS 形式のコメントをRuby コードに自動挿入するツール rbs-trace gem を開発したという内容です。

技術的には、Ruby の TracePoint API を利用し、メソッド呼び出し時(:call)とリターン時(:return)の情報をフックして引数や戻り値のクラスを取得し、それを型情報にしてコメントを挿入します。

Model::ActiveRecord_Relation.name で ActiveRecord::Relation が取得されてしまうといったような例を挙げ、klass.name では正確なクラス名が取得できず、UnboundMethod を利用して実際のクラス名を取得するといった工夫も披露してくださいました。

また void 判定にも苦労されたそうで、Prism ライブラリでコードをパースし、AST(抽象構文木)を解析。メソッド呼び出しがdef直下かつメソッド定義の最後の処理でない場合に、戻り値が利用されていないと判断し void 型とするとしたそうです。

感想

型の導入については、特に既存のRailsアプリケーションへの導入のハードルが高く、不完全なものであっても一通り型情報を用意するというだけでも大変なコストがかかります。

この rbs-trace を使えば、テストを実行するだけである程度の型コメントが手に入るので、これから型を導入しようと考えているものについてはとても助かるライブラリだろうなと思いました。

rbs-inline と併用することを前提とされている点もよく、rbs-inline は型コメントがなければuntyped で RBS が生成されるので、これで(不完全な)型情報が(動的に生成されたものや移譲されたメソッドを除いて)一通り揃うことになります。型導入の最初の一歩としては十分すぎるくらい型情報が揃うので、型導入やってみたいけどハードルが高いと感じていそうな組織があれば推していこうと思いました。

(@rhiroe)

speakerdeck.com

おわりに

RubyKaigi 2025のDay1も、実践と研究の境界線を行き来するような深い技術セッションが続き、Ruby という言語が進化を続けていることを改めて実感する一日でした。

低レイヤの最適化、型システムの発展、文字コードという文化的テーマまで、まさに“Ruby らしさ”が詰まったセッションばかりで、各登壇者の情熱や貢献から多くの刺激を受けました。

Day2、Day3にも魅力的なセッションが数多く控えています。今後公開予定のレポートも、引き続きどうぞご期待ください!

タイミーでProduction Readiness Checkをやってみたよ

はじめに

こんにちは!タイミーでPlatform Engineerをしている @MoneyForest です。

本記事では、タイミーで実施したProduction Readiness Checkの取り組みを紹介します。

Production Readiness Checkとは

プロダクションレディネスチェック(Production Readiness Check)とは、「サービスが本番環境で安定して運用できる状態にあるかどうかを評価」するプロセスのことです。

UberのSREの知見から書かれた書籍 プロダクションレディマイクロサービス には、以下のように書かれています。

Uberのすべてのマイクロサービスは、安定性、信頼性、スケーラビリティ、耐
障害性、パフォーマンス、監視、ドキュメント、大惨事(カタストロフィ)対応を備
えていなければならないという8つの原則を考え出しました。そして、サービスが安
定性、信頼性、スケーラビリティ、耐障害性、パフォーマンス、監視、ドキュメント、
大惨事対応を備えているとはどういうことかを定義する基準を考えていきました。大
切なのは、どの基準も定量化できるものにすることでした。そうすれば、マイクロサー
ビスの可用性が飛躍的に向上したという測定可能な結果が得られます。我々は、これ
らの基準を満たし、要件を備えたサービスを本番対応(プロダクションレディ)と表
現することにしました。

背景

株式会社タイミーはマイクロサービスを採用しておらず、主要事業であるスキマバイトサービス「タイミー」のアプリケーションは主に1つのRailsアプリケーションで構築されています。

モジュラモノリスという形でシステムのドメインとオーナーシップを論理的に分割してきました。

一方で直近は事業戦略、ガバナンス、クォータの観点から一部機能をサブシステムに分割する動きもあります。

つまり「マイクロサービスアーキテクチャほど頻繁にサービスは新規に立ち上がらないが、定期的にサービスは新規に立ち上がっている」という状態です。

なぜやるか

タイミーではマルチテナントのコンテナオーケストレーション基盤は存在せず、システム・サブシステムごとにECSクラスターを構築しています。

アプリケーションもRuby on Railsが採用されることが多いものの、言語およびフレームワークは都度選定されています。

また、サービス開発はアプリケーション、インフラ合わせてストリームアラインドチーム(Squad)のスクラム開発によって行われています。

上記の通り、現状ではゼロベースに近い状態から開発を行うため、信頼性などの様々な観点で注意すべき点が出てきます。

そのため、サブシステムや関連サービスのリリースに際して「本番環境で安定して運用できる状態にあるか」を評価点検する仕組みは一定の価値を発揮すると考えます。

タイミーのProduction Readiness Checklist

プロダクションレディマイクロサービス の内容をベースに、タイミーの技術選定に合わせ、より具体的な内容に落とし込み、チェックリストを作成しました。

書籍には以下の考慮がなされていますが、タイミーではクラウドインフラはAWS、オブザーバビリティツールはDatadog、と限られたものを活用しており、より具体的な記述になっているほうがチェックしやすいと判断しました。

テクノロジーはものすごい速さで動き、変化しています。私は可能な限り、
読者を既存のテクノロジーに縛り付けるようなことは書かないようにしました。たと
えば、すべてのマイクロサービスは、ロギングのためにKafkaを使うべきだとは言わ
ず、本番対応のロギングの重要な要素を説明し、実際にどのテクノロジーを選んで使
うかは読者に委ねるようにしました。

また、内容についてはClient-Server-Databaseの3層アーキテクチャを前提としています。

サーバレスアーキテクチャの場合は対象外です。

チェックの各項目は書籍を参考に以下の観点に分類しています。

観点 主なキーワード
安定性・信頼性 開発サイクル、デプロイパイプライン、依存関係処理、unhealthyなホストの検出、healthyなホストへのルーティング、グレースフルシャットダウン、APIバージョニング
スケーラビリティとパフォーマンス リソースの効率的な使い方、リソースの把握、キャパシティプランニング、依存関係のスケーリング、トラフィック管理、タスクの処理、スケーラブルなデータストレージ
耐障害性・大惨事対応 冗長化、一般的な大惨事と障害シナリオ、障害の検出と修正の方法、回復性テストの詳細、インシデントと機能停止の処理方法
監視 監視、構造化ロギング、ダッシュボード、アラートのトリアージ
ドキュメント・組織運営 サービスの適切なドキュメントの問題と、開発チームと技術組織全体でアーキテクチャと組織運営の理解

タイミーのProduction Readiness Checklistの詳細

実際のチェックリストの内容を観点ごとに紹介します。

1. 安定性・信頼性

  • コード管理
    • コードがGitHubリポジトリで適切に管理されている
    • 環境構築方法がdevcontainerやdocker-composeなどをベースに、環境差異が少なく導入工数が低い構成になっている
  • CI/CD
    • GitHub Flowによる開発の場合、以下のいずれかの設定が実装されている
      • CDの依存にCIのPass状態があること
      • ブランチ保護ルールの「Require branches to be up to date before merging」が有効化されていること
    • CIでコードの静的解析(Lintチェック)、セキュリティチェック、テストを実施している
    • 特別な理由がない限り、CI/CDパイプラインにGitHub Actionsを採用している
    • 各環境のCDパイプラインが自動化されている
    • CDの成功/失敗がSlackに通知される仕組みがある
  • インフラストラクチャ
    • AWSアカウントのサポートレベルがエンタープライズに設定されている
    • ALBのヘルスチェックにアプリケーションのヘルスチェックエンドポイントが使用されている
    • ECSでアプリケーションコンテナの依存関係にDatadog Agent、AWS for Fluent Bitが指定されており、アプリケーションコンテナが最後に立ち上がるよう依存関係が設定されている
  • アプリケーション設計
    • アプリケーションのAPIエンドポイントがバージョニング可能なURIパターンに設計されている
    • Deep Health Check パターンに基づいたヘルスチェックエンドポイントが実装されている
    • ECSのコンテナライフサイクルの仕様 を踏まえたグレースフルシャットダウンが実装されている
    • ALBのスティッキーセッションが無効でも正常に動作する設計になっている
    • ローリングデプロイにより新旧バージョンにトラフィックが分散しても問題ない設計になっている
    • アプリケーションがマルチスレッドで動作する場合、スレッドセーフになっている

2. スケーラビリティとパフォーマンス

  • オートスケーリング
    • ECSでCPUベースのオートスケーリングが設定されている
    • ECSでCPUスパイク時のオートスケーリングが設定されている
  • スケーラブルなデータストレージの選択
    • データベースにAurora MySQLのLTSバージョンを使用している
    • キャッシュにAmazon ElastiCache for Valkeyを採用している
  • パフォーマンステスト
    • 負荷テストが実施されており、想定されるトラフィック量に対する性能が検証されている

3. 耐障害性・大惨事対応

  • ロールバック
    • ECSでデプロイサーキットブレーカーが有効化されており、サービス更新失敗時に自動的にロールバックする仕組みがある
  • 可用性
    • Aurora MySQLで2台以上のリーダーインスタンスが配置されている
    • Auroraのサブネットグループに3AZを指定し、インスタンスが異なるAZに分散配置されている
    • Aurora MySQLの自動バックアップが有効化されており、ポイントインタイムリカバリ(PITR)による復元が可能になっている
    • Aurora MySQLのバックトラック機能が有効化されている
    • ElastiCacheレプリケーショングループでのマルチAZ化が有効化されている
  • 障害対応
    • SPOF(単一障害点)となりうる箇所が洗い出され、ドキュメント化されている
    • 想定される障害シナリオがRunbookとしてドキュメント化されている
    • 社内で定められたインシデント・障害対応フローに準じた障害対応手順が整備されている

4. 監視

  • ロギングとトレーシング
    • ALBのリクエストログがS3に保存され、日時でパーティショニングされており、Athenaでクエリ可能な状態になっている
    • ECSのサイドカーにDatadog Agent、AWS for Fluent Bitが設定されている
    • アプリケーションにDatadog APM Tracingが計装されている
    • ヘルスチェックエンドポイントで、正常時のログとTraceの出力が抑制されている
    • APM Tracingでリクエスト単位でTraceが出力され、最低でもDB、キャッシュ、外部サービスへのHTTPリクエストの単位でSpanを確認できる
    • アプリケーションのログが構造化されており、採用言語に応じてDatadogのドキュメントに準拠した実装がされている
    • ログとトレースの相関付けがされており、採用言語に応じてDatadogのドキュメントに準拠した実装がされている
    • アプリケーションがミドルウェアでリクエストログを出力するようになっている
    • リクエストごとに一意となるIDを生成または上流から受け取り、リクエストログとTraceに出力している
    • リクエストログを識別するためのフィールドが定義されている(Datadogでリクエストログ用のログインデックスに保存するため)
    • Sentryによるエラートラッキングが設定されている
  • データストア監視
    • Aurora MySQLのPerformance Insightsが有効化されている
    • Aurora MySQLで以下のパラメータが有効化されている
      • binlog_format = ROW
      • Datadog DBM 関連パラメータ
      • slow_query_log
      • long_query_time
      • innodb_print_all_deadlocks
      • performance_schema
  • ダッシュボードとアラート
    • Datadogにシステムメトリクスを監視できるダッシュボードが整備されている
    • Datadogにユーザー影響が発生した場合のモニタリングアラートが設定されている
      • Warning/Criticalの閾値が適切に定められている
      • オーナーチームが定義されている
      • Runbookへのリンクが添付されている
    • ビジネスメトリクス(ログインや課金の成功率など)を監視できるダッシュボードまたはウィジェットがある
    • モニタリングダッシュボードを定点観測するスキームがある

5. ドキュメント・組織運営

  • ドキュメンテーション
    • システムの概要説明とアーキテクチャ図が整備されている
    • システムの連絡先とコンタクト方法を記載したドキュメントがある
    • AWSやSaaSなど依存サービスのクォータが洗い出されており、クォータの引き上げ手順が整理されている
    • DBスキーマを元に最新のER図を生成する仕組みがある
    • GitHubリポジトリにREADMEが作成されている
    • READMEに以下が記載されている(リンクでも可)
      • リポジトリの概要
      • 環境構築手順
      • ディレクトリマップ
    • すべての依存サービス(関連社内サービス、外部SaaS)が洗い出され一覧化されている

まとめ

今回はProduction Readiness Checkの取り組みを紹介しました。

この取り組みはボトムアップ的に始めたものではありますが、全社的に当たり前のように行われるものにしていきたいです。

また書籍にはないですが、セキュリティやデータ連携もプロダクションレディの重要な要素になると思っているので、DREやセキュリティ部門と連携してチェックリストを拡充していきたいという思いもあります。

もっと知見を深めて、さらに楽しいエンジニアライフを送りたいと思います!またね〜

【イベントレポート】try! Swift Tokyo 2025

タイミーでiOSアプリエンジニアをしている前田 (@naoya)と申します。 2024年4月9日〜11日に開催された「try! Swift Tokyo」に参加してきました。

try! Swift Tokyo

try! Swift Tokyoとは

Swiftに関わる開発者が世界中から集まる年に一度の国際カンファレンスです。最新技術や開発の知見をシェアするトークセッションが開催される他に、エンジニア同士が交流する場としても毎年大きな盛り上がりを見せています。

今年のアップデート

ロケーション

昨年は渋谷の「ベルサール渋谷ファースト」での開催でしたが、今年は立川の「立川ステージガーデン」に場所を移しての開催でした。

立川ステージガーデン

会場のすぐ近くには昭和記念公園があり、落ち着いた空気感の中で、カンファレンス参加者同士でリラックスして交流できました。また、今回の会場はライブ会場としても使用される場所で、椅子の座り心地がすごく良かったのが印象的でした。

会場内の様子

try! Tokyo 2025アプリ

公式アプリも進化していて、今年はリアルタイム翻訳機能が搭載されました。これまで通りの翻訳レシーバーも用意されていましたが、アプリ上でもスピーカーの話が即座に日本語表示されるようになっており、翻訳精度も非常に高くて驚きました。多言語の壁を超えて楽しめる、素晴らしい体験でした。

try! Tokyo 2025アプリの翻訳機能

アーカイブ動画が即日公開

なんと、イベント終了当日にYouTubeにトークセッションのアーカイブ動画がアップロードされました。会場では理解しきれなかったトークも、すぐに振り返ることができるのは本当にありがたかったです。

try! Swift Tokyo 2025 - YouTube

印象に残ったセッション紹介

三日間に渡り、さまざまなトークを聴くことができました。その中でも、僕が気になったトークをいくつかご紹介します。

iOS 17, 16, 15などの新機能

www.youtube.com iOS 15〜17で追加されたAPIを改めて紹介するトークです。毎年のWWDCで膨大なAPIが発表されますが、実際のプロダクト開発で使われずに、APIの存在を忘れてしまうことはよくあります。本トークでは、そういった開発者に向けて、iOS 15〜17で追加されたいくつかのAPIを紹介するトークです。僕が全く知らなかったAPIを各OSバージョンごとに一つずつご紹介します。

privacySensitive(_:) (iOS 15.0+) developer.apple.com privacySensitive(_:) は、プライバシー保護のための修飾子です。個人情報や機密データを含むViewにこのモデイフィアを付加することで、アプリがバックグラウンドに移行した時、該当のViewをマスクすることができます。

privacySensitive(_:)

UIHostingConfiguration (iOS 16.0+) developer.apple.com UIHostingConfiguration は、UITableViewCellUICollectionViewCell など、UIKitのセル内でSwiftUIのViewを直接使えるようにできる構造体です。セル内のUIのコードを、モダンで簡潔に記述することができます。

UIHostingConfiguration

ContentUnavailableView (iOS 17.0+) developer.apple.com ContentUnavailableView は、「表示する内容がない」状態を、ユーザーにわかりやすく伝えるためのViewです。

ContentUnavailableView

40万以上DLされた個人開発アプリをサービス終了するためにしたこと

www.youtube.com 40万DLを達成した個人開発iOSアプリ「WebCollector」のサービスを終了するにあたり、実施した対応や、その際に考慮したことについてのトークです。WebCollectorは、フルサイズでWebページのスクリーンショットを撮影できるアプリです。スクリーンショット画像は、クラウド上に保存できます。 たくさんのユーザーにDLされていたアプリですが、Safariの標準機能でページ全体のスクリーンショット画像を記録する機能が追加されたり、AdMobの広告が掲載されなくなったことで、サービスの運営が難しくなってしまい、サービスのクロージングをご決断されたとのことでした。 Firebase Remote Configで、サービス終了ページの表示をコントロールしたり、Firebase Cloud Messagingで、Push通知を受け取れるようにすることで、サービスの終了を丁寧に周知した事例をご紹介されていました。 僕も長く個人アプリを開発しているので、思い入れがあるアプリをクロージングすることはかなり辛いことだろうなと思いました。そのような中でも、丁寧にサービスをクロージングをされたことは本当に素晴らしいと感じました。 以下の記事で内容の詳細が語られているので、ぜひご覧ください。 note.com

Swift × Android: Skipが切り拓くクロスプラットフォーム開発の未来

www.youtube.com Skipは、Swift / SwiftUIだけでiOSとAndroidの両方に対応したアプリを開発できる、クロスプラットフォーム開発を行うためのツールです。SwiftUIをJetpack Composeに変換したり、SwiftコードをKotlinに変換したりできます (Transpiled Mode)。さらに、SwiftコードをAndroid上でそのまま動かすこともできます (Native Mode)。 iOSのネイティブアプリ開発には、開発ツールはXcodeを使い、Swift / SwiftUIコードを記述します。一方、Androidでは、開発ツールはAndroid Studioを使い、KotlinまたはJavaコードを記述します。iOS・Android両プラットフォームでアプリをリリースする場合、それぞれの開発ツール・プログラム言語を習得する必要があり、学習コストが膨大でした。 しかし、Skipを使用することで、単一のソースコードで両プラットフォームのアプリを開発できます。こちらのトークでは、スピーカーの方が実際にSkipを使用してアプリ開発を行なった実体験についてのトークです。主なトークポイントは以下の三つです。

  1. Androidアプリ側は期待通りのUIになるか。
  2. Transpiled ModeとNative Modeどちらを選択すべきか。
  3. 既存のアプリをSkipに移行することが可能かどうか。

「1」については、期待通りのUIを生成できているとのことでした。ただし、ナビゲーションバーのように、SwiftUIとJetpack Compose間で表示仕様が異なる箇所があるので、それらの仕様差異を理解しておいたほうが良いとのことでした。

「2」については、Native Modeがおすすめとのことでした。Transpiled Modeでは、Swiftで書かれたコードをターゲットプラットフォーム向けに変換 (トランスパイル)してビルドします。現在は、変換に対応していないAPIが多くあり、Android用のコードを書いたり、別APIの使用を検討する必要があるようです。ただ、Native Modeにもデメリットがあり、アプリサイズが大きくなったり、ビルド時間が長くなったりするので、それぞれのメリット・デメリットを考えた上で、アプリの特性に合わせて選択したほうが良さそうとのことでした。

「3」については、不可能ではないが、かなりチャレンジングになるとのことでした。理由としては以下の二つです。

・iOS側で使用しているライブラリがAndroidに対応していないものがある。

・AndroidのAPIに変換できないiOSのAPIがまだたくさんあり、場合によっては膨大なAndroid用のコードを記述する必要がある。

まだ実用面で課題はたくさんあるものの、最近では、SwiftUIで記述したコードをAndroid用にもコンパイルすることが可能になったり、 APIのサポート範囲が拡大していることもあり、今後かなり期待できるツールとのことでした。

本記事では一部のトークについて書きましたが、その他にもさまざまな分野のトークがありました。今回はvisionOSについてのトークが多かった印象を受けました。このように、普段の業務では耳にしない内容のトークを聞くことができ、非常に有意義な三日間でした。

最後に

try! Swift Tokyoでは、久しぶりに再会できた友人との時間や、普段関わることのない社外エンジニアの方々との出会いがあり、本当に充実した三日間を過ごせました。

今回紹介できなかったトークの他にも、面白いトークがたくさんありました。

記事にある内容や、その他の内容についても、もしタイミーのエンジニアと話したいという方がいらっしゃればぜひお気軽にお話ししましょう!

product-recruit.timee.co.jp

Google Cloud Next ‘25 in Las Vegas に参加してきました!

こんにちは!株式会社タイミーの貝出です。データサイエンティストとして働いており、主にカスタマーサポートの業務改善に向けたPoCやシステム開発など行っております。

先日、2025年4月9日~11日にラスベガスで開催された「Google Cloud Next '25」に、Data Science Group の小関と貝出で現地参加してきました! 業務でも Gemini を利用することが多く、今回はAgent関連の発表も多いとのことで大変楽しみにしていました!

今回のブログでは、現地の様子や注目した発表・セッション、そしてイベント全体の雰囲気について共有させていただきます。

イベント概要

  • イベント名: Google Cloud Next '25
  • 開催地: アメリカ合衆国、ラスベガス
  • 開催期間: 2025年4月9日~11日
  • 参加目的: Google Cloudの最新技術(特にLLMやAgentまわり)のキャッチアップ、事例調査、ネットワーキング

会場はMandalay Bay Convention Centerで、世界中から多くの参加者が集まり、活気に満ち溢れていました。

Google Cloud Next '25 Expo会場の入口

事前準備

アメリカへの海外出張が決まり、国内出張とは異なる手続きや準備が必要となりました。私自身パスポートの有効期限が切れていたため、まずはパスポートの申請から始めることに。併せて、渡米に必要なESTAの申請も行いました。

タイミーでは、海外出張の手続きがNotionで体系的にまとめられており、非常に助かりました。航空券やホテルの手配も社内のシステムを通じてスムーズに申請できました。特にフライト時間は税関検査の所要時間も考慮されているようで、大変ありがたかったです。

ホテル選びに関しては、Data Science Group の菊地さんからおすすめのホテル情報を教えていただき、効率的に検討を進めることができました。大変感謝しています。

今回の海外出張準備にあたり、参考になったウェブサイトを以下に記載します。

www.hyperbilling.jp

iret.media

渡航スケジュール

日本からの参加ということで、参考までに今回の私の渡航スケジュールをご紹介します。時差調整も含め、余裕を持った日程を組みました。

日付 (2025年) 時間 (現地時間) 移動/内容
4月8日 09:20 サンフランシスコ国際空港 着
13:00 サンフランシスコ国際空港 発
15:00 ハリーリード国際空港 着
15:50 ホテルチェックイン
4月9日 (Day 1) 終日 Google Cloud Next '25 参加 (セッション、Expo等)
4月10日 (Day 2) 終日 Google Cloud Next '25 参加 (セッション、Expo等)
4月11日 (Day 3) 終日 Google Cloud Next '25 参加 (セッション、Expo等)
4月12日 3:30 ホテルチェックアウト
6:00 ハリーリード国際空港 発
8:00 サンフランシスコ国際空港 着
13:30 サンフランシスコ国際空港 発
4月13日 14:00(日本時間) 羽田空港 着

初日ハリーリード空港に到着すると、Lyftを利用してホテルへ向かいました。今までUber/Lyftを利用したことはなく、本当に利用できるかドキドキしましたが、無事ホテルまで到着できました。アプリの仕様もわかりやすく、ドライバーも親切だったため、満足度はとても高かったです!マッチングプラットフォームを運営しているタイミーとしても大変参考になりました。

Lyftを利用し、目的のホテルへ

Google Cloud Next '25

Keynote

Day 1の朝にOpening Keynote、Day 2の昼にDeveloper Keynoteがあり、どちらも大盛況でした。特にOpening Keynoteは会場が満席で入れず、モニターのある別室で視聴することに。会場の熱気とは対照的に、別室はやや落ち着いた雰囲気でした。

どちらのKeynoteでもAgentに関するサービスが大きく取り上げられ、特にAgent2AgentADKAgentSpaceが今回の目玉として紹介されていました。概要は以下です。

  • Agent2Agent
    • Agent2Agent(A2A)は、2025年4月9日にGoogleから発表されたオープンプロトコルで、異なるベンダーやフレームワークで構築されたAIエージェント同士が安全に情報を交換し、企業全体のアプリケーションやプラットフォーム上で連携できる相互運用性を提供する。
  • ADK
    • Agent Development Kit(ADK)とは、GeminiやGoogleのAIツールと統合されたオープンソースのAIエージェント開発フレームワークである。ワークフローエージェント、マルチエージェントシステム、関数ツールやカスタムツールの組み込み、デプロイ(Cloud Run/DockerやVertex AI Agent Engine)など、柔軟かつモジュール式の構造でエージェントの設計・実装・評価をサポートする。
  • AgentSpace
    • Google Agentspaceは、社内の主要アプリケーション(Confluence、Google Drive、Jira、SharePointなど)へのセキュアな接続、Google品質のマルチモーダル検索、Geminiを活用したレポート生成やオートメーション機能を備えたエンタープライズ向けエージェントハブである。直感的なエージェントデザイナーでのカスタムエージェント作成や、パートナー提供エージェントの統合も可能で、組織全体で安全かつコンプライアンス遵守のもとAIエージェントを展開できる。

Opening Keynoteの朝の光景。人がめちゃ多い

Developer Keynote は会場に入れた

Expo & Startup Hub

Expo会場は大盛況で、Anthropic のブースやNeo4jのブースに訪問しました。すっかり写真を撮るのを忘れてしまい、記録はありませんが…。

個人的には、Anthropic のブースが印象に残っています。Claude 3.7 Sonnet が Agent として初代ポケモンの攻略に挑戦した実験に関するポスターが紹介されていました(参考: https://www.anthropic.com/research/visible-extended-thinking)。プロンプトには、AgentがActionするためのツールの定義やシステムプロンプト、ポケモンに関する知識ベース、Action履歴などが盛り込まれており、非常に長い(Long Contextな)内容となっていました。個人的に、このようなプロンプトをどのように制御し、どう最適化したかに興味があり質問したところ「色々なTipsはあるものの、タスクやモデルによって変わるため、結局は実験と分析のイテレーションを繰り返すことが重要だ」というお話をいただきました。

また、Expo会場の一角にはStartup Hubがありました。そこで朝食を取っていると、他の会社の方々とコミュニケーションを取ることができました。セキュリティの会社や自動テストツールを開発している会社の方と会話し、何にGoogle Cloudを使っているか、なぜGoogle Cloud Nextに来たのか、といった話を聞くことができました。皆さん、やはりGeminiやAgentをどのように自社製品に活かしていくかについて興味をお持ちで、生成AIへの関心の高さを感じました。

Startup Hub での朝食

Next’25 Party

イベントはMandalay Bayから徒歩10分程度の場所にあるAllegiant Stadiumで開催されました。ガンガンのクラブミュージックがかかる場内のテンションは最高潮でしたが、自分はスタジアムの端でビールを飲みながら、少し離れて眺めていました。

隣に座っていたシンガポールのデータ分析企業に勤務する方が声をかけてくださり、Looker と Tableau の違いやAgentSpaceについて話すことができました。「Looker は使いやすいけど可視化に少し弱点があるので、そのあたりはTableauがいいよ」とのことでした。

Allegiant Stadiumの外観

Next’25 Partyの様子

気になった発表

How good is your AI? Evaluate it at every stage.

概要

Google Cloud AIが提供する GenAI Eval Service は、多様なモデル(Proprietary、Open、Google、Customized)に対応可能なAIモデル評価サービスです。Pairwise/Pointwise といった評価モードや、Computation(計算ベース)/Autorater(モデルベース)といった評価方法を選択できます。

Google Cloudユーザーからの要望に基づき、本サービスを活用した以下のアプローチに関する紹介とデモが行われました。

  1. GenAIバッチ評価 (Autorater): Autorater(モデルベース評価)をバッチ処理で実行し、評価プロセスを効率的にスケールさせる手法。
  2. Autoraterの性能評価・カスタマイズ: ベンチマークデータに対する人間の評価結果を用いて、Autorater自体の評価精度を測定・改善するアプローチ。評価結果を利用し、プロンプトの改善、設定調整、追加データによるチューニングを通じて、Autoraterの信頼性向上が可能になります。
  3. Rubrics-driven評価: 多様なデータセットや複雑なユースケースに適した評価手法。特に、評価基準(ルーブリック)の自動生成機能により、迅速かつカスタマイズ性の高い評価が可能になります。
  4. Agentの評価: 応答の質、推論・計画能力、ツール利用など、さまざまな評価対象が存在します。推論・計画能力や、記憶、Self-Reflection の評価はまだ研究中とのことでした。

感想

Google CloudにGenAI Eval Serviceという評価に特化したサービスが存在することを今回初めて知りました。紹介された機能が現状で利用可能かはわかりませんが、今後のPoCフェーズで検証したいと考えています。特に、評価基準(ルーブリック)を自動生成できる点は、効率化の観点から個人的に大きな可能性を感じます。

また、プレゼンテーションの冒頭では、効果的な評価のためのステップとして「(1)具体的な評価目標の設定、(2)ユースケースに合ったデータセットの選択 、(3)適切な評価方法の選択、(4)評価結果の分析」の重要性が強調されていました。GenAI Eval Serviceを利用することで、これらのステップを体系的かつ効率的に進めることが可能になると感じました。

Long context is all you need

概要

本発表では、Google DeepMindのResearch ScientistであるNikolay Savinov氏が、GeminiのLong Contextに関する成果と応用先を紹介しました。

LLMはパラメータ記憶だけでは最新情報やプライベート情報に関して正確な出力ができないため、プロンプトに過去のやり取りや提供されたPDFなどのデータ、背景情報を含めたインコンテキスト記憶の活用が重要です。

最新モデルである Gemini 2.5 Pro は、Long Contextでの性能を評価する各種ベンチマークデータセットにおいてo3‑mini‑high、GPT‑4.5、DeepSeek R1、Claude Sonnet 3.7などと比較して高い性能を示していました。また、コンテキストウィンドウが1Mトークン(将来的には2Mトークン)に拡大していることも紹介されました。2Mトークンとは、約10万行のコードを扱える規模とのことです。

Long Contextの応用例としては、動画・音声分析(情報抽出や要約)、大規模文書分析(比較やQA)、コード理解(リポジトリ把握や機能特定)、エージェント(過去行動や文脈に基づく動作)、少数ショットのインコンテキスト学習などが挙げられていました。

さらに、実利用のTipsとしてコンテキストキャッシュによるコスト削減、RAGとの組み合わせによる知識活用、無関係コンテキストの排除、クエリ長とレイテンシの考慮、Proモデルやプロンプト工夫の重要性が示され、Long ContextがLLMの可能性を大きく広げるとの結論で締めくくられました。

質疑応答では、コンテキストキャッシュの最適化方法について「プロンプト冒頭にできるだけ固定部分を置くのがいいと思うが、実際にはさまざまなバリエーションを検証してほしい」とのアドバイスがあり、またlost in the middleの緩和度合いについては「ベンチマーク性能が向上しており、他モデルより緩和されている」との回答がありました。

感想

業務においても、プロンプトに多くの情報を詰め込むアプローチを検討しているため、Long Contextの取り組みは大変ありがたいです。また、LLMによってはシステム指示の記述位置によってモデルが指示を無視したり従ったりする傾向があるため、Geminiの最新モデルを積極的に利用したいと思います。さらに「Long Contextが可能になればRAGは不要か?」という問いには、レイテンシや無関係コンテキストの問題から使い分けが必要だという説明も非常に納得できました。

おわりに

4月8日に日本を発ち、13日に帰国するまでの約5日間、短い期間ではありましたが、刺激的な新サービスの発表や多くの方々との貴重な出会いに恵まれ、あっという間の充実した時間でした。

現地では、Google Cloud Japanの皆様に大変手厚くサポートいただき、慣れない土地でも安心して過ごせました。他の日本企業の方々との交流の機会を設けていただいたり、興味深いデモをご紹介いただいたりと、細やかなお心遣いに深く感謝しております。さらに最終日には、イベント全体のまとめセッション「Next ’25 Highlight」を開催いただき、見逃してしまったセッションの情報もしっかりとキャッチアップすることができました。皆様の温かいサポートに、心より感謝申し上げます。

今回の素晴らしい経験から、次回もぜひ参加したいと強く感じております。また、特に社内のデータ関連チームにとって非常に有益なカンファレンスでしたので、その価値を社内で広く共有していきたいと考えております。

「ウェルカム・トゥ・ラスベガス」の看板

現在、タイミーでは、データサイエンスやエンジニアリングの分野で、共に成長し、革新を推し進めてくれる新たなチームメンバーを積極的に探しています!

product-recruit.timee.co.jp

また、気軽な雰囲気でのカジュアル面談も随時行っておりますので、ぜひお気軽にエントリーしてください。↓

hrmos.co

hrmos.co

ObservabilityCON on the Road Tokyo 2025に参加してきました!

こんにちは! タイミーでPlatform Engineerをしている @MoneyForest です。

ObservabilityCON on the Road Tokyo 2025に参加してきました。

参加した感想や気づきなどをお届けします。

はじめに

普段は Datadog をメインに利用している弊社ですが、他のツールなどを知ることで深まる知見もあると考え、先日開催された Grafana Labs 主催の「ObservabilityCON on the Road Tokyo」に参加してきました。本記事では、Grafana エコシステムの印象や、イベントで得られた気づきについて共有したいと思います。

イベントアーカイブ

日本語吹替版の全セッションのアーカイブが以下のリンクで配信されています。

Webinars and videos | Grafana Labs

ObservabilityCON on the Road 基調講演

ObservabilityCON on the Road 基調講演 | Grafana Labs

基調講演で特に気になった点は「OpenTelemetry Datadog Receiver」でした。 Grafana エコシステムの強みは、オープンソースをベースにしている点です。ベンダーロックインを避けつつ、必要に応じてマネージドサービスであるGrafana Cloudを利用するという手法を取ることができます。

そのため、GrafanaはOpenTelemetryを推しており、その流れからOpenTelemetryエコシステムのコントリビュートと競合製品から自社製品への誘導を同時に行う一手だなと思い、驚きました。具体的には、このレシーバーによりDatadogのメトリクス形式をOpenTelemetryのネイティブ形式(OTLP)に変換できるため、既存のDatadog Agentをそのまま使いながら、データをGrafana CloudやPrometheusなどに送信できるようになります。

また、OpenTelemetry Datadog receiver のコードの公開をGrafanaが発表しているという点についても意外でした。てっきりこういった内容はDatadog社が発表すると思っていたのですが、競合が発表を行っているという点も興味深いです。

Grafana Labsの「ビッグテント」思想の「データがどこにあっても、どのようなツールを使っていても、アクセスできるようにすべき」という考え方は、特にマルチクラウド環境やハイブリッド環境が当たり前になっている現在、非常に共感できるポイントでした。

弊社でもオブザーバビリティにかけるコストはサービスの成長に伴い増大しており、ロックインは主にコスト面でリスクになりえると考えています。OpenTelemetryベースの実装にすることで、製品、OSSの乗り換えや、セルフホストなどコスト最適化で幅広い手段を取ることができるようになると思います。

計測とデータ取り込みを一瞬で実現:Grafana Alloy、Grafana Beyla、OpenTelemetryのデモ

計測とデータ取り込みを一瞬で実現:Grafana Alloy、Grafana Beyla、OpenTelemetryのデモ | Grafana Labs

こちらのセッションではGrafana AlloyというOpenTelemetryの100%互換のコレクターや、Grafana Beylaという計装ライブラリの紹介がありました。

Grafana Beylaは、eBPFベースのアプリケーション自動計測ツールで、実行中のサービスのメトリクスやトレースを自動的に取得できます。Go言語でOpenTelemetry SDKで計装する場合、通常はコード上で明示的にトレーサーの開始やスパンを切る必要があると思っていたのですが、Beylaではそれらのコードレベルでのインストルメンテーションなしに観測データを収集できることに驚きました。

これは、OpenTelemetryのドキュメントにある「Zero-code Instrumentation」というコンセプトに沿ったものです。

このアプローチは、アプリケーションを修正せずに計装できるというメリットがあります。

DatadogでもRubyはRailsフレームワークに基づいた自動計装機能があり、Goでも DataDog/orchestrion などのOSSが発表されています。

この辺りは言語やライブラリごとに自動計装のやり方が異なる点があるため、どこかで実装のPoCを行ってみたいなと思いました。

合成テスト、負荷テスト、実ユーザーモニタリングでエンドユーザー体験を把握する方法

合成テスト、負荷テスト、実ユーザーモニタリングでエンドユーザー体験を把握する方法 | Grafana Labs

k6はGrafanaが提供するJavaScriptでテストシナリオなどを記述できるGo製のツールです。

自分も負荷テストツールとしてはよく使っていて、使いやすいツールくらいの認識だったのですが、あらためて本セッションを見ることでk6のメンテナがGrafanaであることのメリットを感じることができました。

このツールが生成するレポートを、Grafana Cloudおよび周辺のエコシステムと組み合わせることでよりリッチなインサイトを得られることがセッションのデモを通じてわかりました。例えば、負荷テスト時のバックエンドの挙動をTraceやProfileと組み合わせて分析することで、ボトルネックの特定が容易になります。

Core Web Vitalの測定やSynthetics Test、ユーザージャーニーベースの観測はどのオブザーバビリティツールでもできると思いますが、メジャーな負荷テストツールを持っているのはGrafanaの強みだと思いました。

まとめ

オブザーバビリティの分野はOpenTelemetryというエコシステムを中心に日々変化していっているため、定期的にイベントに参加して体系的なキャッチアップを行う必要があると思いました。

Grafanaはオープンソースをベースにしているため、ベンダーにとどまらない汎用的な知識を各セッションから学ぶことができました。弊社でも引き続きオブザーバビリティに関する情報キャッチアップを行っていきます。

JaSST'25 Tokyoに参加しました

タイミーQAEnablingチームの矢尻、岸、片野、山下、松田です。

ソフトウェアテストに関する国内最大級のカンファレンス「JaSST (Japan Symposium on Software Testing)」が2025/03/27、28の2日間にわたって開催されました。

speakerdeck.com

本レポートでは、印象に残ったセッションの内容を中心に、2日間の会の様子をお伝えします。

「タイミーQAの挑戦」JaSST登壇レポート:品質文化と開発生産性の両立を目指して

タイミーでQAコーチを担当している矢尻です。

今年のJaSSTは、タイミーとして「タイミーQAのリアルな挑戦:DevOps時代の開発生産性と品質文化を創造する」というセッションで登壇させていただきました。QA Enablingチームの立ち上げから約1年間の試行錯誤を経て得た学びや課題を、チームメンバー全員でパネルディスカッション形式で共有しました。短いセッションでしたが、「品質文化をどのように組織に根付かせていくのか」「開発生産性を保ちながら品質を向上させるには?」など、多くの参加者の皆さんから具体的で深い質問や意見をいただき、学び合いが生まれる貴重な場になりました。この場を借りて御礼申し上げます。

また、全体のセッションを通じて印象的だったのは「チーム組成」や「品質基準」、そして「開発プロセスへのQAの適応」といったテーマへの関心の高さです。QAを単なるテスト業務としてではなく「品質文化を醸成する存在」として位置付け、チームや組織をどう巻き込み、どう改善していくのかについて議論が活発だったのが印象深かったです。QAがビジネス価値にどう貢献できるかを考えるヒントが多く、特に他社が品質基準の明確化やプロセス改善にどのように取り組んでいるかを知ることで、自分たちの現状や課題を改めて客観視できました。

今回のJaSSTをきっかけに、今後もタイミーのQA Enablingチームとして、開発現場により深く寄り添いながら、品質と開発生産性の両立、そしてさらなる品質文化の浸透を目指していきたいと思います。

大規模プロジェクトにおける品質管理の要点と実践

タイミーでSETをしています岸です。JaSSTは昨年に引き続きオフラインでの参加でした。知人と久しぶりに話もできたりで良い2日間を過ごせたと思います。

私が聴講したセッションからは「大規模プロジェクトにおける品質管理の要点と実践」のレポートをお届けします。

第三者検証のSHIFT社から2名でインタビュー形式の発表でした。ここでの「大規模」はリリースまでに10年、参画人数は数千人を想定とのことで、なかなか経験する機会のないものです。とにかくプロジェクト初期からステークホルダーが多いので、関係者間でどのように調整するのか、いわゆる隠れた仕様をどのように拾い上げるのかが焦点になりました。回答としては、リスト化やスケジュール調整をまずしっかりすること、現場に足を運んでユーザーの声をしっかり聞くことを挙げていました。その上で「100%を目指すといつまでも要件定義が終わらない。90%くらいを目指し、漏れたものは次のフェーズへ回すようにする」ことがとても重要だとおっしゃっていました。

私たちタイミーの開発では10年がかりで続くような長期プロジェクトはなく、小さいリリースを何度も繰り返すスタイルをとっています。一見違う世界の話のようにも感じられますが「100%を目指すと終わらない」という話は私たちにも共通するものだと感じました。

ネット銀行におけるスマートフォン実機でのテスト自動化について

SETの片野です。

今年のJaSST TokyoはタイミーのQAチームとして登壇する機会をいただき、私個人としては初めての現地参加となりました。

たくさんの素晴らしいセッションの中で、特に印象に残ったのは「銀行におけるスマートフォン実機でのテスト自動化について」(坂本豪志さん) です。

このセッションでは、BaaS (Banking as a Service)としてパートナー企業にスマートフォンアプリを提供するネット銀行における、スマートフォン実機を用いたテスト自動化の取り組みについて語られました。

スマートフォンの実機を用いた受入テスト、リグレッションテスト等を一部自動化することで、パートナー企業1社導入につき数十人日規模だったテスト工数を80%近く削減されたそうです。その過程で直面した課題と解決の事例として、事前データの準備、テスト端末同士の相性による接続性の問題、特定のロケーターで要素がつかめなくなる不安定なテストへの対応などが紹介されました。

特に興味深かったのは事前データの準備に関する取り組みです。テスト対象システムのユーザーデータは属性や関連データ(多岐に渡る金融商品とそれらの契約状態など)が多く、加えて複数のサブシステム間で整合性を取る必要があるため、データ準備に手間がかかったりテストの繰り返し実行が難しかったそうです。これらの問題に対して、データ駆動テスト的なアプローチの適用や、テスト再実行時のデータリセット要否に基づくテストシナリオの整理などを行い自動化に向けた改善を実現したそうです。様々な事情で手動オペレーションや運用でカバーせざるを得ない部分を残しつつも、ご本人の言葉を借りれば「泥臭く」取り組まれたとのことでした。

この「泥臭く」という言葉に象徴されるように、セッション全体を通じて理想論や教科書的な内容にとどまらず、現実の課題に真正面から向き合い、解決策を模索する姿勢が強く伝わってきました。それは、まさに私たちが日々の業務で直面している状況とも重なり、深く共感する点がありました。また、当日のセッションで語られた内容はどれも現場の経験から得られた現実的かつ有用な情報ばかりでした。私自身もテスト環境の改善に携わっており、今後の業務に直接活かせる具体的な内容が数多くありました。

テスト環境の改善では、時にスマートな解決策を見いだせず泥臭い作業の連続になることがあります。しかし、このセッションを通じて、理想と現実のバランスを取りながら、粘り強く課題解決に取り組むことの大切さを改めて認識しました。

QAが売上に貢献できることはなんだろう?

タイミーでQAコーチをしている山下です。(入社して半年たったばかりでまだまだ見習いQAコーチという気持ちです。)

久しぶりにオフラインでJaSSTに参加をしてきました。新しい会場でとても綺麗で快適でした!が、オフラインだと会場が満席で聞きたいセッションを聞けない…!ということもあり、オフラインの難しさを思い出したりもしました。

今回私が参加した中で、特に印象に残ったセッションは「ソフトウェアがJISマーク認証される時代に!~標準化がもたらすソフトウェア品質の確保や市場への信頼性向上~」でした。

タイトルの通り、ソフトウェア製品でJISマークの認証を取るためのプロセスなどを紹介してくださっていたのですが、一番刺さったのは「なぜJISを取ろうと思ったのか?」という質問に対する登壇者の伊藤さんの「QAが売上に貢献できるのはなんだろうとよく考えていて、JISがあることで選んでもらえることがあるんじゃないかと考えた」という回答でした。 だいぶ昔にWACATEに参加した際に「一生懸命たくさんテストしたとして、そのプロダクトは売れるの?」と問いかけをしてもらったことがあり、それが確かにそうだ…と当時の自分には衝撃的で時折思い出しては考えるテーマだったので、JISマークの取得が競合との差別化につながるのかー!と目から鱗、明るい気持ちになりました。

機能追加があった場合には追加の認証試験が必要なため、実際にスピードの速い開発で適用することは難しそうでしたが、これからも引き続きQAが売上に貢献できることは何か?は考え続けたいテーマだと思いを新たにできました。

その他にも、このセッションに引き続き品質基準に対するテーマにしたセッションなど多くの発表や、昔の同僚と久しぶりに再開しどんなところでAIを活用しているか話したりと多くの刺激をもらえた2日間でした。

私がJaSSTで心を奪われた,組織を強くするマネジメント術

2024年の9月に入社したSETの松田です。

先日参加したJaSSTは、私にとって初参加・初登壇の機会となり、非常に特別な2日間となりました。

特に印象に残ったセッションは、SmartHR平田さんによる「スケールアップ企業のQA組織のバリューを最大限に引き出すための取り組み」です。

セッションでは、主にマネージャーとしての目標設定やチームの仕組みづくりについて語られていました。平田さんが、マネージャーとして取り組むべき「チームの現状課題」「チームが目指すべき目標」「目標達成のための具体的なタスク」を明確に言語化されていた点が非常に印象的でした。これは、QA/SETチームだけでなく、あらゆる部署やチームにも共通して当てはまる内容だと感じました。

メンバーの能力を最大限に引き出すために、チームの先頭に立ってあらゆるステークホルダーと交渉・調整を行い、障害となる壁を次々と取り除いていく平田様の姿勢に「こんなマネージャーがいるのか!」と深く感銘を受けました。

ぜひまた機会があれば、品質保証部のセッションをお聞きしたいです。

スケールアップ企業のQA組織のバリューを最大限に引き出すための取り組み | ドクセル

JaSSTは、テストに関する知見を深めるだけでなく、多くの素晴らしい方々と出会える貴重な機会でした。来年は、私もコミュニティの一員として、何か貢献できるよう準備して参加したいと思います。来年も皆様とJaSSTでお会いできることを楽しみにしております!!!!!!!

おわりに

弊社は今回2度目のゴールドスポンサーとしてJaSST Tokyoに協賛させていただきました。次回以降もなんらかの形で貢献して一緒にコミュニティを盛り上げていければと思います。

また、弊社ではQA、SETの採用も積極的に行っております。

hrmos.co hrmos.co タイミーのQA、ソフトウェアテストについてもっと知りたいという方はぜひカジュアル面談でお話ししましょう。

product-recruit.timee.co.jp