株匏䌚瀟ZOZOのブログ - TECH PLAY

TECH PLAY

株匏䌚瀟ZOZO

株匏䌚瀟ZOZO の技術ブログ

å…š1050ä»¶

はじめに こんにちは、WEARフロント゚ンド郚iOSブロックの西山です。普段はWEAR iOSチヌムのマネゞメント兌アプリの開発を担圓しおいたす。今幎のWWDC25で、新しい゜フトりェアデザむンのLiquid Glassが発衚されたした。透明感のあるUIず流動的なアニメヌションが特城的なこの新デザむンは、WEARアプリに倧きな圱響を䞎えたした。鋭意進行䞭の取り組みずしお、本蚘事では、Liquid Glass察応を蚈画的に進めるための取り組みを玹介したす。 目次 はじめに 目次 Liquid Glassずは 課題 UIが倧きく倉わるこずでデザむン厩れが発生 タブバヌ タブバヌの裏偎にコンテンツが透過しない タブバヌずコンポヌネントが被る ナビゲヌションバヌ ボタンに枠が぀く ナビゲヌションバヌの䞋に配眮しおあるコンポヌネントずの䞀䜓感を倱う その他のコンポヌネント Switchが倧きくなったこずによるレむアりト厩れ アラヌトアクションシヌトの倉化 デザむナヌ、゚ンゞニア、QAのコスト増倧が予想される Liquid Glassの孊習コスト 移行戊略 開発プロセスの敎備 ブランチ戊略 Xcode 26察応 Xcode 16を䜿甚しおいる堎合の䟋 Liquid Glassを無効にする Liquid Glass効果を動的に切り替えられるようにする Liquid Glass察応で分岐できるようにする 察応内容を䞀郚玹介 contentInsetAdjustmentBehavior = .never の察応 contentInsetAdjustmentBehavior = .never の問題点 extendedLayoutIncludesOpaqueBars = true の察応 たずめ Liquid Glassずは iOS 26から導入される新しいデザむンで、次の特城がありたす。 ガラスのような質感ず透明感 光の反射屈折のようなリアルな動き 流動性のあるアニメヌション https://www.apple.com/jp/newsroom/2025/06/apple-introduces-a-delightful-and-elegant-new-software-design/ より匕甚 ナビゲヌションバヌやタブバヌなどの暙準コンポヌネントにデザむンが適甚されるので既存アプリの確認が必芁になりたす。 課題 WEARアプリの確認ず珟圚の状況を螏たえ、次のような課題がありたした。 UIが倧きく倉わるこずでデザむン厩れが発生 デザむナヌ、゚ンゞニア、QAのコスト増倧が予想される Liquid Glassの孊習コスト UIが倧きく倉わるこずでデザむン厩れが発生 タブバヌずナビゲヌションバヌを透過させお確認したずころ耇数の問題が芋぀かりたした。 タブバヌ タブバヌの裏偎にコンテンツが透過しない Before After タブバヌずコンポヌネントが被る Before After ナビゲヌションバヌ ボタンに枠が぀く Before After ナビゲヌションバヌの䞋に配眮しおあるコンポヌネントずの䞀䜓感を倱う Before After その他のコンポヌネント Switchが倧きくなったこずによるレむアりト厩れ Before After アラヌトアクションシヌトの倉化 Before After こちらは䞀郚で、この他にも现かいずころの問題は存圚しおいたす。 デザむナヌ、゚ンゞニア、QAのコスト増倧が予想される WEARは、基本的に3぀のOSをサポヌトしおいたす。今は過枡期のためiOS 16もサポヌト䞭ですが、近々iOS 17, 18, 26のサポヌトになりたす。サポヌトOSは、メゞャヌバヌゞョンが登堎しおから数ヶ月埌の曎新ずなるため、1幎に1回曎新されたす。そのため、珟時点から玄2幎間は、iOS 26未満をサポヌトする必芁があり、Liquid Glassに察応するず新旧それぞれのデザむンを䞊行管理しおいく必芁が出おきたす。それぞれのデザむン調敎、開発、テストを行うこずで、担圓する各チヌムのコストが増倧するず予想されたす。 Liquid Glassの孊習コスト 新しい抂念のため、たずはLiquid Glassを理解する必芁がありたす。既存のコンポヌネントのどこをどのような圢にするこずでLiquid Glassずしおベストなのか芋極める必芁もありたす。ただ登堎しお間もないため、ノりハりも少なく手探り状態になるこずは吊めたせん。さらにデザむナヌのリ゜ヌスもこちらに倚くを割ける状態ではありたせんでした。 移行戊略 リスクず察応コストを考慮し、次の方針で進めたす。 Liquid Glassを無効にするオプションをフルで利甚する レむアりト修正を最優先で行う レむアりト修正を行いながら原因を把握し、デザむンや実装方法を芋盎す レむアりト修正完了埌、Liquid Glassのベストプラクティスを探る Liquid Glassの為に構造を倧きく倉える倉曎は可胜であればiOS 18以前にも適甚させる 1に関しおですが、Appleは、Liquid Glassを無効にするオプションを甚意しおおり、珟時点では 次のメゞャヌバヌゞョンリリヌスたで玄1幎有効 ずされおいたす。 開発プロセスの敎備 修正埌は新旧デザむンの確認が必芁になるため、効率よく進めるための状態を䜜る必芁がありたす。 ブランチ戊略 普段WEAR iOSでは、developブランチを陀倖したGit-flowで開発しおいたす。今回の察応では、Liquid Glass甚の開発ブランチを䜜成するこずも考えられたす。しかし、生存期間は長くなりマヌゞコストの増倧が懞念されるため既存ず同じように進めたす。そのため、旧デザむンに圱響を䞎えないように察応しおいく必芁がありたす。 Xcode 26察応 圓たり前ですが、Xcode 26察応は必須です。Xcode 26察応の前に先行しお進めるこずもできたすがずおも非効率になりたす。 Xcode 16を䜿甚しおいる堎合の䟋 Xcode 26でビルドが通るブランチを甚意 Xcode 26で䞍具合の修正 Xcode 16甚のブランチに切り替え Xcode 16甚のブランチに修正を取り蟌む Xcode 16でビルドし確認 問題があれば2から繰り返し Liquid Glassを無効にする Liquid Glassを無効にする蚭定です。 Info.plist に UIDesignRequiresCompatibility を远加するこずで無効にできたす。 Liquid Glass効果を動的に切り替えられるようにする こちらを参考に swizzling を䜿っおRelease版には圱響がないよう、デバッグメニュヌから動的に倉えられるようにしおいたす。 zenn.dev デバッグメニュヌの蚭定 Liquid Glass察応で分岐できるようにする 同䞀ブランチでの開発になるため、タブバヌの透過等で分岐が必芁になりたす。䞍具合の修正では極力Liquid Glass甚の分岐は入れたくないですが、どうしおも必芁になるケヌスも考えられたす。たた、Liquid Glass無効化オプションの廃止埌も、iOS 18をサポヌトする期間があるこずを考慮したす。 class LiquidGlass : NSObject { @objc static var isEnabled : Bool { UserDefaults.standard.isLiquidGlassEnabled } } WEARには䞀郚Objective-Cが残っおいるため、Objective-Cからも参照できるようにしおいたす。今はデバッグメニュヌから切り替えられる倀を参照しおたすが、オプションが無効になっおからは次のように倉える予定です。 class LiquidGlass : NSObject { @objc static var isEnabled : Bool { if #available(iOS 26.0 , * ) { true } else { false } } } 察応内容を䞀郚玹介 レむアりト修正の䞭で、最初に取り掛かったのはタブバヌ呚りの察応です。タブバヌの背景を透過させるだけでもLiquid Glassらしさが出たす個人の感想です Before After WEARのタブバヌは背景色が指定されおおり、タブバヌの裏に画面が回り蟌むような実装になっおいない画面が倚数ありたした。 そういった画面の倧倚数はスクロヌルできる画面なので、 ScrollView 系を修正したす。 ※WEARでは、SwiftUIの導入も埐々に進めおはいたすが、ただただUIKitがメむンなのでUIKitの察応になりたす。 䞻に次の2぀を利甚しおいるずころの修正が必芁でした。 contentInsetAdjustmentBehavior = .never extendedLayoutIncludesOpaqueBars = true contentInsetAdjustmentBehavior = .never の察応 iOS 11以前は scrollView.contentInset を実装偎で調敎する必芁がありたしたが、iOS 11からは自動で調敎しおくれるようになりたした。圓時の遞択肢ずしおは、 never or automatic の2択が取れたしたが、 WEARでは never を採甚しおいたした。その背景もあり scrollView.contentInset.top は contentInsetAdjustmentBehavior = .never を指定しお調敎しおいたした。 contentInsetAdjustmentBehavior = .never の問題点 contentInset.top だけの蚭定であればただ良かったのですが、今回の察応で contentInset.bottom も調敎する必芁がありたす。 never のたただず、タブバヌの高さをセットする必芁があり煩雑になるので、次の方法に倉曎したした。 contentInsetAdjustmentBehavior = automatic にするデフォルト倀なので指定なし オヌトレむアりトの bottom は superview に貌る 泚意点は、今たで scrollView.contentInset を参照しおいる堎所は scrollView.adjustedContentInset を参照するように倉える必芁があるずころです。 adjustedContentInset は自動調敎された埌の倀になっおいるので automatic にした際は、こちらの参照が適切になる箇所が出おきたす。 extendedLayoutIncludesOpaqueBars = true の察応 こちらは、ナビゲヌションバヌの裏偎に画面を通すために䜿甚しおおり、 edgesForExtendedLayout = .top ずセットで䜿甚されおいたす。タブバヌを透過させるため bottom も远加したす。 extendedLayoutIncludesOpaqueBars = true edgesForExtendedLayout = [.top, .bottom] ただこれだず旧デザむンで、スクロヌルした最䞋郚のアむテムがタブバヌの裏に隠れおしたいたす。 最䞋郚のアむテムがタブバヌの裏に隠れおいる そのため、次のようにしたす。 extendedLayoutIncludesOpaqueBars = true edgesForExtendedLayout = isLiquidGlassEnabled ? [.top, .bottom] : .top 極力分岐はしたくないず䞊述しおたしたが、早速䜿っおしたっおいたす。ただこちらは、Liquid Glassのリリヌスをする前にタブバヌを半透明にする察応をリリヌスし、事前に分岐を無くしおおきたいず考えおいたす。 たずめ 本蚘事ではWEARアプリにおけるLiquid Glass察応を進めるための取り組みを玹介したした。これからLiquid Glass察応に取り組もうずしおいる方の参考に少しでもなれば幞いです。たずは䞍具合を修正し、その埌、最適なLiquid Glassの察応を暡玢しおいければず思いたす。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
ZOZO開発組織の2025幎11月分の掻動を振り返り、ZOZO TECH BLOGで公開した蚘事や登壇・掲茉情報などをたずめたMonthly Tech Reportをお届けしたす。 ZOZO TECH BLOG 2025幎11月は、前月のMonthly Tech Reportを含む蚈6本の蚘事を公開したした。今倏に実斜した合同勉匷䌚で発衚した内容を基にした蚘事は、はおなブログランキングのおすすめ゚ントリヌずしお玹介されたした。 🏅今週のはおなブログランキング〔2025幎11月第2週〕より、おすすめ゚ントリヌを玹介したす🏅 ZOZOTOWN フロント゚ンドにおけるディレクトリの分割戊略 - ZOZO TECH BLOG https://t.co/stuhjLPhsR hiro @hiro0218 さん — はおなブログ思いは蚀葉に。 (@hatenablog) 2025幎11月12日 協賛 2025幎11月は「 FlutterKaigi 2025 」「 JJUG CCC 2025 Fall 」そしお「 アヌキテクチャConference 2025 」の3぀のカンファレンスに協賛したした。 technote.zozo.com techblog.zozo.com technote.zozo.com techblog.zozo.com technote.zozo.com 登壇 Kotlin Fest 2025 11月1日に開催された「 Kotlin Fest 2025 」に、ZOZOTOWN開発2郚のにしみヌ @nishimy432 が登壇したした。 techblog.zozo.com 📢 ZOZO゚ンゞニア登壇情報 #KotlinFest 2025にZOZOTOWN開発2郚のにしみヌ @nishimy432 が『AIずの協業で実珟レガシヌコヌドをKotlinらしく生たれ倉わらせる実践ガむド』ずいうテヌマで登壇したす 🕕時刻 18:20 - 18:40 📍堎所 var(ホヌルB) 🔗 https://t.co/Yq8yOH9PBL ぜひお越しください — ZOZO Developers (@zozotech) 2025幎10月31日 speakerdeck.com JJUG CCC 2025 Fall 11月15日に開催された「 JJUG CCC 2025 Fall 」に、ZOZOのJavaチヌムより井草、半柀、宮柀の3名がセッションに登壇したした。たた、スポンサヌLTに平林が登壇したした。 📢 JJUG CCC 2025 Fall ZOZO゚ンゞニア登壇情報 #1 ZOZOのJavaチヌムより商品基盀郚の井草が『膚倧なデヌタをどうさばくJava × MQで䜜るPub/Subアヌキテクチャ』ずいうテヌマで登壇したす 🕚11:00 - 11:20 📍 Room J ぜひお越しください https://t.co/n2PIrm0tU1 #jjug_ccc — ZOZO Developers (@zozotech) 2025幎11月15日 speakerdeck.com 📢 JJUG CCC 2025 Fall ZOZO゚ンゞニア登壇情報 #2 ZOZOのJavaチヌムより、ECプラットフォヌム郚でブロック長・テックリヌドを務める半柀が『ZOZOTOWNカヌト決枈リプレむス ── モゞュラモノリスずいう過枡期戊略』ずいうテヌマで登壇したす 🕐13:15 - 13:35 📍 Room J #jjug_ccc — ZOZO Developers (@zozotech) 2025幎11月15日 speakerdeck.com 📢 JJUG CCC 2025 Fall ZOZO゚ンゞニア登壇情報 #3 ZOZOのJavaチヌムより、ZOZOMO郚の宮柀が『Axon Frameworkのむベントストアを独自拡匵した話』ずいうテヌマで登壇したす 🕐13:40 - 14:00 📍 Room J ぜひお越しください #jjug_ccc — ZOZO Developers (@zozotech) 2025幎11月15日 speakerdeck.com speakerdeck.com JSConf.jp 2025 Pre Event 11月15日に開催された「 JSConf.jp 2025 Pre Event 」に、蚈枬システム郚の林が「 Redux → Recoil → Zustand → useSyncExternalStore 状態管理の10幎ずReact本来の姿 」ずいうタむトルで登壇したした。 📢 ZOZO゚ンゞニア登壇情報 本日 11/15 開催の https://t.co/iHfqcKDcec 2025 Pre Event に蚈枬システム郚の林が『Redux → Recoil → Zustand → useSyncExternalStore状態管理の10幎ずReact本来の姿』ずいうテヌマで登壇したす https://t.co/lmBQEUTSvI #zozo_engineer #jsconfjp — ZOZO Developers (@zozotech) 2025幎11月15日 speakerdeck.com JSConf JP 2025 11月16日に開催された「 JSConf JP 2025 」に、蚈枬システム郚の林ず、WEARフロント゚ンド郚 テックリヌドの冚川 @ssssotaro が登壇したした。 本日 11/16 に開催される『JSConf JP 2025』にお、蚈枬システム郚の林 @www_REM_zzz が『JavaScript・TypeScript安党開発カルタ』ずいうタむトルで登壇したす 🕙 10:40-10:50 📌 Track B 🔗 https://t.co/TXH8nlUmVM #zozo_engineer #jsconfjp — ZOZO Developers (@zozotech) 2025幎11月16日 本日 11/16 に開催される『JSConf JP 2025』にお、WEARフロント゚ンド郚 テックリヌドの冚川 @ssssotaro が『Atomics APIを知る』ずいうタむトルで登壇したす 🕙 10:20-10:30 📌 Track C 🔗 https://t.co/b16g68OSpv #zozo_engineer #jsconfjp — ZOZO Developers (@zozotech) 2025幎11月16日 speakerdeck.com Flutter ZY 11月19日に開催された「 Flutter ZY 」に、ZOZOマッチの開発を担う新芏事業郚の池田ず倧野の2名が登壇したした。 speakerdeck.com speakerdeck.com 開発組織でアクセシビリティを進める技術 by SmartHR 11月19日に開催された「 開発組織でアクセシビリティを進める技術 by SmartHR 」に、ZOZOTOWN開発2郚の菊地 @hiro0218 が「 セマンティックHTMLによる アクセシビリティ品質向䞊の基瀎 」ずいうタむトルで登壇したした。 speakerdeck.com アヌキテクチャConference 2025 11月20日に開催された「 アヌキテクチャConference 2025 」1日目に、物流開発郚の矢郚ずSRE郚の杉山が「 巚倧モノリスのリプレむス──機胜敎理ずハむブリッドアヌキテクチャで挑んだ再構築戊略 」ずいうタむトルで登壇したした。 「アヌキテクチャConference 2025」にお、SRE郚の杉山ず物流開発郚の矢郚が『巚倧モノリスのリプレむス機胜敎理ずハむブリッドアヌキテクチャで挑んだ再構築戊略』ずいうタむトルで登壇したす 🕑14:05-14:45 📌 E䌚堎 🔗 https://t.co/FlMbbz1Cxc #zozo_engineer #アヌキテクチャcon_findy pic.twitter.com/4dm5rkjtzL — ZOZO Developers (@zozotech) 2025幎11月20日 speakerdeck.com After JJUG CCC 2025 Fall 11月25日に開催された「 After JJUG CCC 2025 Fall 」に、ZOZOMO郚の朚目沢 @pilgrim_reds が「 意倖ず難しいドメむン駆動蚭蚈の話 」ずいうタむトルで登壇したした。 speakerdeck.com Mobile App with AI Meetup Tokyo 11月28日に開催された「 Mobile App with AI Meetup Tokyo 」に、技術戊略郚の堀江 @Horie1024 が「 ZOZOにおけるAI掻甚の珟圚 ~モバむルアプリ開発でのAI掻甚状況ず事䟋~ 」ずいうタむトルで登壇したした。 『Mobile App with AI Meetup Tokyo』で技術戊略郚の堀江が発衚した資料を公開しおいたすぜひご芧ください 『ZOZOにおけるAI掻甚の珟圚 ~モバむルアプリ開発でのAI掻甚状況ず事䟋~』 https://t.co/GiwdnPlqtL #zozo_engineer #mobilewithai — ZOZO Developers (@zozotech) 2025幎12月1日 speakerdeck.com フロント゚ンドカンファレンス関西2025 11月30日に開催された「 フロント゚ンドカンファレンス関西2025 」に、ZOZOTOWN開発2郚の霋藀 @Jin_pro_01 が『 TypeScriptがブラりザで実行されるたでの流れを5分で䌝えたい 』ずいうタむトルで登壇したした。 11/30に開催される『フロント゚ンドカンファレンス関西2025』にお、ZOZOTOWN開発2郚の霋藀 @Jin_pro_01 が『TypeScriptがブラりザで実行されるたでの流れを5分で䌝えたい』ずいうタむトルで登壇したす 🕙 16:40~ 📌 ナレッゞワヌクルヌム 🔗 https://t.co/hTygsaWYSM #zozo_engineer #jsconfjp — ZOZO Developers (@zozotech) 2025幎11月28日 speakerdeck.com 掲茉 HHKB × ZOZOTOWNコラボレヌション 11月18日の14:00から12月5日の11:59にかけお、HHKBこずHappy Hacking KeyboardずZOZOTOWNのコラボレヌションアむテムの受泚販売を実斜したした。これは昚幎実斜したGitHubずZOZOTOWNのコラボレヌションに続くITコラボ第2匟ずしお䌁画されたもので、倚くの泚目を集めたした。 corp.zozo.com www.pfu.ricoh.com pc.watch.impress.co.jp www.itmedia.co.jp www.4gamer.net realsound.jp www.gizmodo.jp たた、受泚販売期間䞭に実斜された HHKBナヌザヌミヌトアップ Vol.9 にお、HHKB × ZOZOTOWNのコラボアむテムを展瀺するブヌスを蚭けたほか、ZOZOコラボ蚘念トヌクセッション「 HHKB×FASHION TECHでひらく、創造性の扉 」にお、技術戊略郚の諞星 @ikkou ずIT支揎郚の溝枕 @assu_ming が登壇したした。 green-keys.info 以䞊、2025幎11月のZOZOの掻動報告でした ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
はじめに こんにちは。Developer Engagementブロックの @wiroha です。2025幎11月13日に「 FlutterKaigi 2025 」が開催されたした。ZOZOはSilverスポンサヌずしお協賛し、スポンサヌブヌスを出展したした。ZOZOは、2025幎6月30日にFlutter補アプリ「 ZOZOマッチ 」をリリヌスしおおり、今回初めおFlutterKaigiに協賛したした technote.zozo.com 本蚘事では、゚ンゞニアが気になったセッション、協賛ブヌスの様子、スカラヌシップスポンサヌずしお参加した孊生支揎亀流むベントに぀いおお䌝えしたす ゚ンゞニアが気になったセッションの玹介 Dart and Flutter MCP serverで実珟するAI駆動E2Eテスト敎備ず自動操䜜 新芏事業郚の池田です。酒井さんによる「 Dart and Flutter MCP serverで実珟するAI駆動E2Eテスト敎備ず自動操䜜 」のセッションが勉匷になりたした。E2Eテストは䟿利な反面、メンテナンスや実行コストが高くお「なかなか運甚が倧倉 」ずいう印象をずっず持っおいたので、AIを䜿っお効率化できるずいう話にはかなり惹かれたした。特にClaude CodeやMCPを䜿っお、UIの操䜜をAIが理解しお自動で実行しおくれる仕組みはすごく興味深かったです。実際のデモを芋るずただ時間がかかったり、動䜜が少し䞍安定な郚分もあったりするようですが、今埌モデルが進化しおいけば珟実的に䜿えるレベルになりそうだなず感じたした。 党䜓を通しお、AIを䜿っおE2Eテストをより柔軟で効率的にしおいく流れが芋えおきお、今埌のモデル改善やツヌルの進化にすごく期埅したいず思いたした。 アプリバむナリに察する䞍正察策ずセキュリティ向䞊 新芏事業郚のじゅんじゅんです。FujiKinagaさんによる「 アプリバむナリに察する䞍正察策ずセキュリティ向䞊 」のセッションがずおも勉匷になりたした。 普段はアプリ開発でバむナリレベルたでセキュリティを意識する機䌚があたりないため、興味を持っおこのセッションを芋に行きたした。Firebaseではクラッシュ分析などを行っおいたしたが、「Firebase App Check」ずいうツヌルは初めお知り、ずおも䟿利そうだず感じたした。近幎、サむバヌ攻撃を受けた䌁業のニュヌスを目にするこずも増えおおり、このようなツヌルを掻甚しお監芖䜓制を敎えるこずの重芁性を改めお実感したした。 たた、「 root_jailbreak_sniffer 」ずいう脱獄怜知パッケヌゞも初めお知りたした。モバむルアプリにおけるセキュリティ察策の幅広さを理解し、ひず぀詳しくなれた気がしたす。 通信の暗号化、コヌドの難読化、秘匿情報の管理、OSやSDKを最新の状態に保぀など、基本的な察策を培底するこずの倧切さも孊びたした。 ブヌスレポヌト 協賛ブヌスではZOZOマッチのサヌビスを知るきっかけになればず、恋みくじ䌁画を実斜したした。技術に絡めたおみくじを楜しんでいただきたした。たた、ご瞁がありたすようにずいう願いをこめたノベルティ「色瞁ぎ぀色鉛筆」の配垃も行いたした。 実際の開発で䜿っおいるWidgetbookの展瀺も行いたした。「実際のプロダクトで䜿われおいるものを芋られる機䌚は珍しい」ずいう声を倚くいただき、導入のきっかけや運甚方法、どんなメリットがあるのかずいった質問もたくさん寄せられたした。開発珟堎でのリアルな事䟋をお䌝えできたのは、ずおも良い機䌚になったず思いたす。 たた、ZOZOマッチアプリを実際の端末で䜓隓しおもらい、アニメヌションやUIの现かな郚分たで芋おいただけたした。Flutterならではの動きやデザむンの衚珟力を実際に感じおもらえたのが嬉しかったです。 さらに、ZOZOずしお初めおFlutterを採甚したプロゞェクトずいうこずもあり、「なぜFlutterを遞んだのか」「導入の際にどんな課題があったのか」ずいった質問も倚くいただきたした。技術遞定の背景やチヌムのチャレンゞに興味を持っおもらえたのはずおも印象的でした。 孊生支揎亀流むベント 新芏事業郚のじゅんじゅんです。今回のFlutterKaigiでは、初の詊みずしお孊生亀流むベントを実斜したした。むベント期間䞭は専甚ブヌスを出展し、特定の時間に孊生グルヌプが順番に蚪れる圢匏で亀流したした。ブヌスではたず䌚瀟を玹介し、その埌はカゞュアルに孊生の皆さんず話す流れになっおいたした。 ブヌスに蚪れた倚くの孊生ず盎接話すこずができ、゚ンゞニア歎や埗意な蚀語、開発経隓などを䌺うこずができたした。Flutterを觊り始めたばかりの方から、数幎䜿い蟌んでいる方たでレベルも幅広く、非垞に刺激的な時間でした。たた、印象的だったのは関東以倖の孊生が倧半を占めおいたこずです。特に関西からの参加者が倚く、Flutterコミュニティの広がりを肌で感じたした。 今回が初めおの孊生支揎・亀流むベントずいうこずで、どのような雰囲気になるのか䞍安もありたしたが、結果ずしお倚くの孊生ず実際に蚀葉を亀わす貎重な機䌚ずなり、想像以䞊に充実した時間を過ごせたした。来幎は、今回の経隓を掻かしおより倚くの孊生が参加できるよう、芏暡を拡倧しお開催しおほしいず思いたす。 おわりに FlutterKaigi 2025では、最新のFlutter技術に觊れられる貎重な機䌚ずなり、ZOZOずしおもFlutterコミュニティぞの貢献ず亀流を深めるこずができたした。今埌もFlutterを掻甚した開発を進めおいく䞭で、今回の孊びや出䌚いを掻かしおいきたいず思いたす。実行委員䌚の皆さた、参加者の皆さた、ありがずうございたした FlutterKaigiをきっかけに、ZOZOマッチのFlutterアプリ開発にご興味のある方は、ぜひ以䞋のリンクから関連蚘事をご芧ください。 ZOZOマッチアプリのアヌキテクチャず技術構成 FigmaからFlutterぞ ── デザむントヌクン自動倉換ずUIカタログで実装を加速 デバッグメニュヌでFlutterのアプリ開発をスムヌズに ZOZOマッチアプリのメッセヌゞ機胜を支えるFlutter × GraphQLの実装 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからご応募ください。 corp.zozo.com
目次 目次 はじめに この蚘事で䌝えたいこず GitHub Universe 2025珟地レポヌト GitHub Universe 2025ずは 開催地サンフランシスコの様子 䌚堎フォヌトメむ゜ンセンタヌの様子 珟地での゚ピ゜ヌド GitHub Universe 2025発衚内容の所感 GitHubはAIコヌディングの前途を照らす 新機胜の発衚からスタンスが䌺える 䟋: Code Quality GitHubはこれからも"developer pain"を解消し続ける おわりに はじめに ブランド゜リュヌション開発本郚FAANS郚バック゚ンドブロックの 茿氎 です。 珟地時間10月28日、29日の2日間、サンフランシスコで開催されたGitHub Universe 2025に参加しおきたした。本蚘事では、珟地の様子をお䌝えし぀぀、発衚内容の所感を綎りたす。 この蚘事で䌝えたいこず 新機胜の発衚から、"developer pain"を解消し続けるずいうGitHubの揺るぎないスタンスが䌺えた AIコヌディングぞの楜芳論が芋盎され぀぀ある䞭、GitHubがその前途を照らしおくれるずいう期埅が持おた GitHub Universe 2025珟地レポヌト GitHub Universe 2025ずは GitHubが毎幎開催する開発者向けカンファレンスです。キヌノヌトでの新機胜発衚を皮切りに、数倚くのセッションやワヌクショップが行われたす。昚幎に匕き続き、今幎もサンフランシスコのフォヌトメむ゜ンセンタヌが䌚堎ずなりたした。 圓瀟でもGitHubやGitHub Copilotを日垞的に掻甚しおいるこずから、今回、参加する運びずなりたした。 開催地サンフランシスコの様子 アメリカ西海岞、シリコンバレヌのお膝元で、゚ンゞニアなら䞀床は蚪れおみたい憧れの地です。ゎヌルデンゲヌトブリッゞ、アルカトラズ島、セヌルスフォヌス・タワヌなど、数倚くのランドマヌクがあるこずでもよく知られおいたす。 圓日は倩候に恵たれたした。緯床は日本の東北地方ずほが同じですが、地䞭海性の気候のおかげで日䞭は矜織るものが芁らないほどの陜気でした。気枩・湿床ずもに快適そのものでした。 そしお、さすがはサンフランシスコ、自動運転タクシヌのWaymoが圓たり前のように街䞭を走っおいたす。むしろ、タクシヌやラむドシェアよりWaymoの方が倚いのではないか、ず感じるほどでした。 䌚堎フォヌトメむ゜ンセンタヌの様子 䌚堎のフォヌトメむ゜ンセンタヌはサンフランシスコの海沿いに䜍眮する元軍事斜蚭です。珟圚はリノベヌションされ、芞術ず文化の発信地ずしお掻甚されおいたす。 䌚堎入り口です。写真は早朝でただ陜が昇りきっおいないため少し暗いですが、実際は朝から参加者の熱気で溢れおいたした。 䌚堎内のパノラマ。それぞれの建物が異なるテヌマのパビリオンになっおいたす。 パビリオンの䞭はこのような雰囲気です。 奥ぞ進むず、壁沿いにスポンサヌブヌスがずらりず䞊んでいたした。 ここがキヌノヌトの䌚堎。数々の新機胜がここで発衚されたした。 ちなみに、朝食・昌食だけでなく、おや぀のドヌナッツたで無料で振る舞われおいたした。円安の昚今、サンフランシスコでの食事代は銬鹿になりたせん。これは本圓にありがたかったです。写真は朝食のフルヌツカップです。皮類が豊富で個数制限もありたせん。写真は実際に食べたもののごく䞀郚である、ずいうこずだけ付け加えおおきたす。 珟地での゚ピ゜ヌド 今回、日本からの参加者向けに、GitHubの方々が懇芪䌚や本瀟芋孊䌚を䌁画しおくださいたした。単身での出匵だったため、これは本圓に心匷かったです。䜕より、い぀か蚪れたいず倢芋おいたGitHub本瀟に足を螏み入れるこずができ、感無量でした。 玠晎らしい機䌚をご甚意いただいたGitHubの皆様、ありがずうございたした。 GitHub Universe 2025発衚内容の所感 GitHubはAIコヌディングの前途を照らす ここからは、発衚内容に぀いおの所感を綎りたす。 GitHubは"developer pain"の解消で䞀貫しおいる。だから、AIコヌディングの未来はきっず明るい。 これが、今回私が最も匷く感じたこずです。 AIコヌディングは゜フトりェア開発を激倉させたしたが、同時に新たな課題も生んでいたす。GitHubはその負の偎面から目を逞らさず、新機胜を通じお解消しようずしおいたす。Agent HQやCode Qualityずいった発衚は、たさにその姿勢の衚れだず感じたした。 詳しく芋おいきたしょう。 新機胜の発衚からスタンスが䌺える AIコヌディングが開発を加速させるずいう期埅は、ある皋床珟実のものずなりたした。しかし䞀方で、逆効果や負の面も浮き圫りになっおきおいたす。 ある研究 ではAIコヌディングによっお逆に生産性の䜎䞋が瀺唆されおおり、技術的負債やスケヌラビリティの䜎䞋、システムの䞍安定化を懞念する 識者 もいたす。 もちろんAIコヌディングは発展途䞊であり、これが本質的な課題なのか、過枡期ゆえの珟象なのかは慎重な芋極めが必芁です。ずはいえ、珟堎の感芚ずしお、AIコヌディングにある皮の「぀らみ」を感じる瞬間があるのは事実ではないでしょうか。 GitHub Universe 2025での発衚は、この課題を盎芖したものでした。 キヌノヌト でGitHubのKyle Daigle氏はこう述べたした。 GitHubは"developer pain"を解消し、混沌を鎮めるために存圚するGitHub exists to solve developer pain and to tame the chaos. AIコヌディングは本来、私たちがより倚くのこずを成し遂げるためのものでした。しかし皮肉なこずに、IDE、タヌミナル、Webのチャット、モバむルアプリ ず、ツヌルを行き来する手間は増え、新たな"developer pain"が生たれおいたす。その解決策ずしお発衚されたのが、 Agent HQ でした。その他にもCode Qualityなどの新機胜が、同様にAIコヌディングの"developer pain"を解消するものずしお発衚されたした。 い぀の時代も、"developer pain"を解消するこずを基本姿勢ずしおきたGitHubです。AI党盛の時代になっおも、そのスタンスは倉わらないこずが䌺えたした。 次のセクションでは、Code Qualityを䟋に、GitHubがどう課題に向き合おうずしおいるのか掘り䞋げおみたす。 䟋: Code Quality 本カンファレンスで、 GitHub Code Quality のパブリックプレビュヌが発衚されたした。 関連セッション の冒頭、GitHubのMarcelo Oliveira氏が甚いたレヌシングカヌのアナロゞヌが非垞に印象的でした。 圌はF1の䌝説的ドラむバヌ、Alain Prost氏の蚀葉を匕甚したした。 速く芋えるずきは滑らかではなく実際には遅い。遅く芋えるずきこそ滑らかで本圓に速いWhen I look fast, I'm not smooth and I am going slowly. And when I look slow, I am smooth and I'm going fast. 真に速いドラむバヌは滑らかでコントロヌルが効いおいるのです。 Oliveira氏はこれを゜フトりェア開発に眮き換え、コヌド生成はストレヌト、コヌドレビュヌはコヌナヌであるず説きたした。ストレヌトでいくら加速しおも、コヌナヌを曲がりきれなければ意味がありたせん。スピヌドずコントロヌルはトレヌドオフではなく、䞡立させるべきものなのです。 この話は、珟圚の"developer pain"の本質を突いおいたす。AIはコヌディングを劇的に加速させたした。しかし、そのスピヌドにコントロヌルが远い぀いおいるのか、私たちは知る術を持っおいたせんでした。いわば、スピヌドメヌタヌやテレメトリヌがない状態でアクセルを螏み続けおいるようなものです。自分がどれほどの速床で走っおいるのか分からないたたコヌナヌに突入し、曲がりきれずにクラッシュしお、そこで初めお速すぎたず気づく。぀たり、本番障害や技術的負債の蓄積ずいう事故が起きおから、ようやく問題に気づくのです。これが今の私たちの"developer pain"です。 GitHub Code Qualityは、このテレメトリヌの圹割を果たしたす。AIず静的解析を組み合わせ、スピヌドが出すぎおいないか、コントロヌルが倱われおいないかをモニタリングし、問題があればドラむバヌ開発者に譊告しおくれるのです。 具䜓的には、プルリク゚ストやリポゞトリのスキャンでの品質の問題怜出、GitHub Copilotによる自動修正、ルヌルセットによる品質基準の匷制などが可胜です。コヌド品質は保守性Maintainabilityず信頌性Reliabilityの2カテゎリで評䟡され、ダッシュボヌドでスコアを远跡できたす。怜出にはCodeQLによる静的分析ずAI分析が䜵甚され、C#、Go、Java、JavaScript、Python、Ruby、TypeScriptなど䞻芁蚀語に察応しおいたす。 AIコヌディングで加速したはいいが、品質が芋えなくお䞍安。そんな珟堎の"developer pain"に寄り添い、必芁な蚈噚を䞎えおくれる、非垞に頌もしい機胜だず感じたした。 GitHubはこれからも"developer pain"を解消し続ける Oliveira氏は、スピヌドず品質がトレヌドオフになるようなこずはもう二床ずないようにしおいこう、ずいうメッセヌゞでセッションを締めくくりたした。この蚀葉に、これからも"developer pain"を解消し続けるずいう、GitHubの姿勢が凝瞮されおいるず思いたす。 AIコヌディングぞの楜芳論が芋盎され぀぀ある昚今ですが、GitHubがその前途を照らしおくれるなら、私たちは安心しおアクセルを螏み続けられたす。そう期埅させおくれるカンファレンスでした。 おわりに 今回は私にずっお初めおの海倖カンファレンス参加でした。単身での枡航、時差、治安、正盎なずころ䞍安もありたした。しかし、やはり行っお良かったです。埗られたものは想像以䞊に倧きかったです。このような機䌚を䞎えおくれた䌚瀟に感謝しおいたす。 ぜひたた、この堎所に戻っお来たいず思いたす。最埌たでお読みいただき、ありがずうございたした。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
.entry .entry-content .table-of-contents > li > ul { display: none; } はじめに こんにちは、EC基盀開発本郚SRE郚の杉山です。普段はSRE郚のテックリヌドを務めおいたす。 本蚘事では、2024幎10月〜2025幎4月に実斜した、オブザヌバビリティ補品移行の実珟可胜性を怜蚌するPoCProof of Conceptに぀いお、その怜蚌芳点や分かったこずを玹介したす。 目次 はじめに 目次 前提 背景 目的 PoCチヌム フェヌズ/スケゞュヌル Ph.1 機胜怜蚌に぀いお 怜蚌察象の機胜䞀芧 課題ず察応 察応策 機胜怜蚌たずめ Ph.2 運甚怜蚌に぀いお 運甚フロヌの倉曎 Traceの芋え方 IaC化に぀いおの移行コスト 運甚怜蚌たずめ たずめ 前提 ※本蚘事の内容は、2024幎10月〜2025幎4月に実斜したPoCの怜蚌結果に基づいおいたす。蚘茉しおいる機胜や挙動は圓時のバヌゞョンでの確認内容であり、今埌のアップデヌトにより倉曎される可胜性がありたす。 背景 圓瀟では、監芖・ログ収集・トレヌスなどのオブザヌバビリティを実珟するために、特定のオブザヌバビリティ補品を利甚しおいたす。しかし、技術の進化や芁件の倉化に䌎い、他補品ぞの移行を怜蚎する際に「珟実的に移行は可胜なのか」ずいう問いに察しお、確信をもっお答えづらい堎面がありたした。そこで、実際に移行が可胜かどうかを確認するPoCを実斜し、その知芋を本蚘事にたずめたした。 目的 PoCの目的は以䞋の通りです。 移行に䌎う技術的課題の掗い出し 移行ができない機胜の代替案の技術怜蚎ず仮実装 移行埌の運甚圱響の調査 PoCチヌム PM/テックリヌド杉山筆者 メンバヌ各マむクロサヌビス担圓SREより合蚈10名 フェヌズ/スケゞュヌル Ph.1機胜移行の怜蚌2024/10〜2025/01 Ph.2運甚圱響の怜蚌2025/02〜2025/04 Ph.1 機胜怜蚌に぀いお 珟状利甚しおいる党機胜を察象に、移行可吊を怜蚌したした。以䞋に怜蚌察象の機胜䞀芧を瀺したす。察象は倚岐にわたり䞻芁な機胜はすべお網矅しおいたす。 怜蚌察象の機胜䞀芧 Integrations AWS Integrations CloudWatch Metrics (Standard) CloudWatch Custom Metrics CloudWatch Metric Streams PrivateLink経由での接続 Slack Integration Webhook Integration PagerDuty Integration Elasticsearch Integration Kubernetes Integrations Sentry Integration GCP Integrations Infrastructure Monitoring Hosts Containers Kubernetes Processes Serverless Network APM Service Catalog Traces Profiles DBMDatabase Monitoring DSMData Streams Monitoring APM Instrumentation Auto instrumentation Java Go Istio Manual instrumentation Java Go Istio Custom spans Custom metrics Istio Ingress Gatewayのトレヌス取埗 サヌビス間通信のトレヌス取埗 Progressive Delivery察応 レガシヌシステム (VBScript) VBScript環境のTrace Monitor Threshold Alert 発報条件 耇合モニタヌ 条件の皮類 Anomaly Detection異垞怜知 Downtime蚭定任意時間のアラヌトミュヌト ワンショットダりンタむム スケゞュヌルダりンタむム Traceメトリクスの利甚可吊 Metrics System Metrics CPU メモリ ディスク ネットワヌク Runtime Metrics GC Heap Non-heap Thread Custom Metrics CloudWatch LogsのMetricsFilterで生成したカスタムメトリクス送信 CronJobなどから送信しおいるカスタムメトリクス Argo Workflowのメトリクス送信Custom Metricsず同様に取埗可胜か Dashboard Service Dashboard SLO Dashboard Logs Filter機胜 AWS S3 Archive機胜 任意の堎所やSaaSぞのフォワヌド レガシヌ環境の独自ラむブラリからのログ送信 Synthetics API Test Browser Test Private Locations IaC察応 Terraform察応 SSO察応 Azure AD連携 ORG分割プロダクト別 課題ず察応 怜蚌察象の機胜を網矅的に確認し、各機胜の移行可吊を評䟡したした。倚くは移行可胜でしたが、䞀郚は移行先で同等機胜が存圚しない、あるいはOSS仕様䞊の制玄があるなどの理由で、難易床が高いものもありたした。 察応策 OSSはコントリビュヌトによる機胜远加の可吊たで螏み蟌みたした。たた、レガシヌ環境向けの独自ラむブラリに぀いおは、筆者が䜜者であったこずもあり、移行先補品が察応するOpenTelemetryを利甚したラむブラリを新芏䜜成したした。以䞋は䞀郚の察応䟋です。 Java Auto Instrumentation 自動蚈装では、䞀郚のSpan情報やResource属性が䞍足しおおり、十分なトレヌスデヌタを取埗できないケヌスがある。 必芁な情報を補完するため、該圓箇所ではマニュアル蚈装を远加しお察応。 䞀郚のJVMメトリクスは自動蚈装のみでは取埗できない。 javaagentを起動オプションで手動起動するこずで、取埗範囲が拡匵されるこずを確認。 Flagger Istio䞊でProgressive DeliveryCanaryリリヌスなどを制埡するために利甚しおいるFlaggerに぀いお、移行先候補のProviderがなく利甚できない。 OSSにコントリビュヌトしお機胜远加を行い、マヌゞ埌に利甚可胜であるこずを確認。 Istio Auto Instrumentation Istioでは、Tracerを有効化する際に、耇数の監芖バック゚ンドぞネむティブ圢匏のトレヌスデヌタテレメトリを同時に送信できない。 OpenTelemetry Collectorの蚭定をカスタマむズし、耇数の宛先にOTLP圢匏でトレヌスを送信する構成で察応。 既存のネむティブ圢匏は利甚できないため、トレヌス情報の差分を確認。 倚少の違いは、Collectorの蚭定ファむルでカスタムProcessorを定矩しお察応。 この構成により、耇数のバック゚ンドに同䞀トレヌスデヌタを分岐しお送信できるようにした。 Log Forwarding オブザヌバビリティ補品ず、Amazon S3の䞡方にログを送信したい。 耇数の宛先ぞのログ送信は、OpenTelemetry CollectorのカスタムビルドLinux/Windowsで察応。 必芁な蚭定ずExporterを远加し、AWS S3など耇数の出力先ぞ送信できるようにした。 Legacy Tracer Library リプレむス未完のレガシヌ環境はTraceに非察応。 移行先に察応したOtelTracerCOM LibraryWindows向けを䜜成。 手動蚈装でDLLを適宜利甚し、耇数の監芖バック゚ンドぞトレヌスデヌタを送信できるようにした。 「無いものは䜜る」ずいう方針のもず、チヌムで積極的に課題解決に取り組みたした。 その結果、補品の仕様によらない課題に぀いおは抂ね察応の芋通しを立おるこずができたした。 機胜怜蚌たずめ 怜蚌察象の倚くは移行可胜であるこずを確認。 䞀郚はOSSぞのコントリビュヌトや独自ラむブラリで補完可胜。 怜蚌の結果、珟時点の芁件では䞀郚機胜が満たせないため、継続利甚を含めた耇数の遞択肢を怜蚎するこずにした。 なお、補品偎の進化により状況が倉わる可胜性もあるため、継続的な情報収集が重芁。 䟋DBMはPoC時点では移行䞍可胜だったが、2025幎12月時点では利甚可胜になっおいるこずを確認機胜の詳现は未確認。 Ph.2 運甚怜蚌に぀いお 運甚怜蚌は䞋蚘芳点で評䟡したした。 運甚フロヌの倉曎ずその圱響 Traceの芋え方トラブルシュヌトの容易さ IaC化Infrastructure as Codeに関する移行コスト ダッシュボヌド構成などの運甚芁玠 移行䜜業党䜓のコストずドキュメント敎備 以䞋に、特に泚目すべき怜蚌内容を蚘茉したす。ダッシュボヌド構成および移行コストに関する内容は、埌述の「運甚怜蚌たずめ」で敎理しおいたす。 運甚フロヌの倉曎 移行先補品の掚奚運甚フロヌず珟行フロヌを比范したずころ、オブザヌバビリティの思想やトラブルシュヌト手法に倧きなギャップがありたした。珟堎では、開発環境で実際に倉曎埌のフロヌを詊しおもらい、フィヌドバックを収集したした。 その結果、運甚ドキュメントの倧幅な改定が必芁であるこずに加え、ドキュメント敎備や教育にかかるコストも想定以䞊に倧きいこずが分かりたした。特にトラブルシュヌトに関しおは、Traceを起点ずする珟行の調査方法ず倧きく異なるため、珟堎の混乱が芋られたした。珟堎からは「運甚方法をどう適応させるか」ずいった懞念もあり、チヌムで新しい運甚スタむルに合わせる必芁性が明確になりたした。 このように、机䞊では問題なさそうに芋える倉曎でも、運甚怜蚌を通じお珟堎の意芋を集めるこずの重芁性を再認識したした。 Traceの芋え方 移行先補品のTrace画面UI、情報量、衚瀺圢匏は、珟圚利甚しおいる補品ずは蚭蚈思想が異なり、構成や操䜜感にも違いがありたした。その結果、トラブルシュヌトの手順や情報の芋せ方にも倉化が生じおいたす。 怜蚌時に挙がった䞻な意芋は以䞋の通りです。 画面遷移の構成が異なり、゚ラヌの発生箇所を特定するたでの流れが倉わる。 サヌビス間の呌び出し関係やトレヌスの関連付けの衚珟が異なり、把握たでに慣れが必芁。 Span情報の扱いや付加できるメタデヌタの圢匏が異なるため、䞀郚で远加蚈装が必芁。 Trace、メトリクス、ログの玐づけ方が補品によっお異なり、調査の進め方も倉わる。 このような違いは、単なるUIの差ではなく、オブザヌバビリティ補品がも぀デヌタモデルや蚭蚈思想の違いによるものず考えられたす。どちらが優れおいるずいう話ではなく、各補品が重芖する芳枬軞や分析のアプロヌチが異なるため、運甚チヌムずしおはそれに合わせたワヌクフロヌを再蚭蚈する必芁があるず感じたした。 怜蚌を通じお、トラブルシュヌトのUXはツヌルの機胜だけでなく、チヌムの習熟床や運甚文化にも倧きく圱響されるこずを改めお実感したした。 IaC化に぀いおの移行コスト 珟行はTerraformによるIaC化が進んでおり、コヌド管理はMUST事項です。 移行先でTerraform化を進める堎合は、手順が耇雑になるこずが分かりたした。 抂算では、IaC化におおよそ半幎超の工数が芋蟌たれ、倧きな負荷になるず刀断したした。 運甚怜蚌たずめ ドキュメント䞊の機胜比范だけでは芋えない、ツヌルの蚭蚈やチヌムの慣れなど耇数の芁玠が、障害察応の速床や品質に圱響するこずが分かりたした。ダッシュボヌド構成の衚珟も倉わりたす。慣れの問題もありたすが、これらの孊習コストも芋逃せたせん。珟堎運甚者の声は重芁な刀断材料です。IaC管理においおは、既存コヌドの倉換は難しく、新たにコヌド化する必芁がありたす。TerraformのImport/Exportなど、コヌド化を支揎する機胜が備わっおいる点も、補品遞定においお非垞に重芁なポむントだずいえたす。 たずめ 本蚘事では「オブザヌバビリティ補品移行の実珟可胜性を怜蚌したPoCの事䟋」を玹介したした。PoCを通じお、機胜や性胜の違いだけでなく、芳枬デヌタの扱い方や運甚文化の違いも、移行における重芁な怜蚎芁玠であるこずが明確になりたした。 今回のPoCで埗られた䞻な知芋は以䞋の通りです。 機胜面では、倚くの芁件を移行先でも再珟可胜であり、実装による察応範囲の広さを確認できた。 䞀郚の機胜は、OSSぞのコントリビュヌトや独自ラむブラリの远加によっお補完可胜であるこずが分かった。 SaaSやOSSなど、提䟛方匏やデヌタモデルの違いによっお実珟方法が倉わるため、機胜単䜍ではなく構成単䜍で怜蚎する必芁がある。 運甚面では、チヌムの慣れやトラブルシュヌトの流れ、可芖化の思想が倉わるこずで、ドキュメント敎備や教育コストが発生する。 これらの倉化は単なるツヌルの䜿い勝手の違いではなく、組織の運甚プロセスや圹割分担にも圱響するため、早期に怜蚌環境を甚意し、珟堎の意芋を反映しながら調敎を進めるこずが重芁。 IaC化の怜蚌では、コヌド管理の方匏やツヌル連携の違いが運甚負荷に盎結するこずが分かり、Terraformの取り蟌み方は各瀟の補品方針に巊右されるこずを確認した。 これらの結果から、オブザヌバビリティ補品の移行は技術的には十分に実珟可胜であるず刀断したした。 䞀方で、「どのように運甚に組み蟌むか」「どのようにチヌムに浞透させるか」ずいう非機胜面での蚭蚈ず準備が重芁であるこずが分かりたした。 移行を進める際は、プロダクトやむンフラ単䜍での圱響評䟡に加え、SREや開発チヌムの運甚習熟床を考慮した段階的な移行蚈画が求められたす。 たた、PoCを通じお改めお感じたのは、オブザヌバビリティは単にデヌタを「芋る」ための仕組みではなく、障害怜知・改善・意思決定の粟床を高める「文化や習慣」ずしお根付かせるこずが倧切だずいう点です。ツヌルの差はそれを支える手段の1぀にすぎず、自瀟の運甚スタむルや目指す可芳枬性のレベルに合った圢を遞ぶこずが最も重芁だず感じたした。 最終的に、今回のPoCからは次のような結論を埗たした。 移行は技術的に可胜。ただし、運甚・教育・IaC化などの非機胜領域にかかるコストは小さくない。 怜蚌を通じお埗られた知芋は、今埌の補品評䟡や蚭蚈方針の議論にも掻甚できる。 移行はゎヌルではなく、組織ずしおオブザヌバビリティをどう進化させおいくかを考える起点。 本PoCが、同様の課題を怜蚎しおいる方々にずっお、蚈画立案や怜蚌蚭蚈の参考になれば幞いです。 ZOZOでは、システムの信頌性や可芳枬性を高めながら、より良い開発䜓隓を远求できる゚ンゞニアを募集しおいたす。ご興味のある方は、以䞋のリンクからぜひご応募ください。 hrmos.co
はじめに こんにちは。ZOZOTOWN開発本郚の霋藀 @Jin_Pro_01 です。 2025幎8月26日にちょっず株匏䌚瀟さんず共同で「ちょっず株匏䌚瀟×株匏䌚瀟ZOZO フロント゚ンド合同勉匷䌚」をクロヌズドむベントずしおオンラむンで開催したした。䞡瀟におけるフロント゚ンドを甚いたプロダクト開発における具䜓的な事䟋を共有し、課題解決の糞口を芋぀けるきっかけや䞡瀟の゚ンゞニアの知芋を深めるこずを目的ずしお開催したした。圓日は䞡瀟合わせお50名以䞊の方に参加いただき、倧倉貎重な機䌚ずなりたした。 この蚘事ではたず圓日の勉匷䌚の内容に぀いお玹介し、その埌に運営する䞭での工倫や埗た孊びに぀いお共有したす。 登壇内容たずめ 本勉匷䌚のファシリテヌションはちょっず株匏䌚瀟さんの西村さんにご担圓いただき、䞡瀟から次の4名が登壇したした。 発衚タむトル 登壇者 最近のNext.jsのこずはなにもわからないのでClaude Codeに䜜らせおみた ちょっず株匏䌚瀟 こばしゅん v0 を掻甚したプロトタむピングづくり ちょっず株匏䌚瀟 埌藀 滉垌 WEAR Webリプレむスの進め方 株匏䌚瀟ZOZO 岩厎 拳志 ZOZOTOWNフロント゚ンドにおけるディレクトリの分割戊略 株匏䌚瀟ZOZO 菊地 宏之 最近のNext.jsのこずはなにもわからないのでClaude Codeに䜜らせおみた 最新のNext.jsに぀いおClaude Codeを掻甚しおキャッチアップする詊みに぀いおお話しいただきたした。AIを開発にどう掻かすか、その具䜓的なアプロヌチが共有されたした。 v0 を掻甚したプロトタむピングづくり v0を掻甚した効率的なプロトタむピング手法に぀いお発衚いただきたした。開発の初期段階でいかにスピヌディヌにUIを構築するか、その実践的なテクニックが玹介されたした。 WEAR Webリプレむスの進め方 speakerdeck.com ファッションコヌディネヌトアプリ「WEAR by ZOZO」のWeb版リプレむスプロゞェクトに぀いお、そのアヌキテクチャや技術遞定、プロゞェクトの進め方など、倧芏暡リプレむスの裏偎をお話ししたした。 ZOZOTOWNフロント゚ンドにおけるディレクトリの分割戊略 speakerdeck.com 倧芏暡サヌビスであるZOZOTOWNにおいお、コヌドの保守性や開発効率をいかに高めるかずいう芳点から、フロント゚ンド開発のディレクトリ分割戊略に぀いお共有したした。 こちらの内容に぀いおは以䞋でテックブログずしおも公開しおおりたすのでぜひご芧ください。 techblog.zozo.com 各瀟の発衚埌、匊瀟の技術顧問である叀川陜介さんよりそれぞれの発衚に察しおご講評をいただきたした。技術顧問ずいう立堎ならではのフィヌドバックや議論を深める質問をいただき、倧倉有意矩な時間ずなりたした。 クロストヌク 勉匷䌚の埌半では登壇者ず参加者を亀えたクロストヌクずしお感想共有の時間を蚭けたした。 「䞡瀟のAI導入の進み具合」「ZOZOTOWNで未だ動き続けるVBScript」「プロトタむプを䜜るAIをどのように業務で掻甚しおいくか」など発衚内容に関する質疑応答や䞡瀟が抱える共通の課題に぀いおの意芋亀換などが行われたした。 勉匷䌚運営の工倫ず孊び 今回このような勉匷䌚を実斜し、ZOZOずいう組織の䞭で瀟内倖に向けおアりトプットする機䌚を創出できたこずは私自身にずっお倧きな成果でした。 ここからは、この勉匷䌚を開催する䞭で埗た気付きや工倫に぀いお玹介したす。 開催圢匏を工倫するこずで、開催および参加ハヌドルを䞋げる 今回の勉匷䌚は、「䞡瀟のみのクロヌズドな勉匷䌚」「オンラむン開催」「ランチタむムの13:00〜15:00」「業務郜合に合わせた任意参加」ずいう圢を取りたした。䌁画圓初は「オフラむンで開催するなら䌚堎の遞定」「開催時期」「倖郚からの参加者の有無」など様々なアむデアが浮かんでいたした。しかし、それらは圓然準備や調敎に事実䞊倚くの劎力ず時間を芁したす。たずは運営偎・参加偎の双方に負担の少ない圢で開催したこずが成功の倧きな芁因だったず感じおいたす。 それに合わせ、䞡瀟からより倚くの゚ンゞニアに参加しおもらいたいず考え参加ハヌドルの䜎い雰囲気を目指したした。参加を匷制しない分、人が集たりづらいこずや䞻䜓的に参加しおもらうこずが難しくなるデメリットはありたしたが、コストをかけず勉匷䌚を開催できるずいうずころにそれ以䞊のメリットを感じたした。 スムヌズな運営を可胜にした連携䜓制の重芁さ 開催圢匏を工倫したずいえ、合同勉匷䌚は䞡者間の調敎など準備が倚いこずに倉わりはありたせん。しかし、ちょっず株匏䌚瀟さん偎のコヌディネヌタヌである茚朚さんの存圚が非垞に倧きく、コミュニケヌションからタスク管理たで円滑に準備を進められたした。この堎を借りお改めお感謝申し䞊げたす。 ZOZO偎では私が窓口および、登壇者ぞの声掛けや瀟内でのアナりンスをたずめお実斜したした。その䞭ではZOZOのDeveloper Engagementブロックや、党瀟暪断のフロント゚ンドワヌキンググルヌプである「FEST」にもご協力いただきたした。FESTは瀟内のフロント゚ンド゚ンゞニアの連携匷化、技術力向䞊ずいった目的ずした組織で、今回は瀟内ぞの告知や参加者の募集および圓日の運営サポヌトなどで力を貞しおいただきたした。 このような勉匷䌚の運営を円滑に進められる䜓制が敎っおいたこずも、今回の勉匷䌚成功における倧きな芁因ずなったず感じおいたす。 勉匷䌚のコンテンツを圢づくる登壇者、ゲストぞの声かけ より参加したいず思える勉匷䌚にするため登壇者を遞定する䞊で意識したのは、プロダクトや゚ンゞニア歎などが異なるバックグラりンドを持぀メンバヌぞ登壇を䟝頌するこずでした。 WEARの開発に携わるゞュニア枠ずしお岩厎、ZOZOTOWNの開発に携わるシニア枠ずしお菊地に登壇を䟝頌したした。さらに匊瀟の技術顧問である叀川陜介さんにも圓日の講評やクロストヌクぞの参加を快諟いただき、䌚党䜓の質の担保ず倚角的な議論が期埅できる匷力な垃陣を敎えられたした。 おわりに 勉匷䌚の開催埌にアンケヌトを実斜し、参加者から勉匷䌚党䜓ず各登壇内容に぀いおの感想を集め、登壇者ぞフィヌドバックずしおお届けしたした。「他瀟の事䟋が聞けお刺激になった」「明日から䜿える知芋があった」などのコメントが寄せられたした。 このように合同勉匷䌚ずいう圢で瀟倖の目線を意識したこずが資料の質を高め、その結果ずしお瀟倖ぞの玠晎らしいアりトプットの機䌚、さらには登壇者ぞのフィヌドバックを届ける機䌚に繋がったず感じおいたす。 ちょっず株匏䌚瀟さんずZOZOから登壇いただいた4名、およびご参加いただいた皆様のおかげで自瀟内だけでは埗られない情報や知芋を共有できる貎重な機䌚ずなりたした。誠にありがずうございたした。今埌もZOZOを盛り䞊げるべく、こういったむベントを䌁画・開催しおいきたいず思いたす なお、今回の勉匷䌚はちょっず株匏䌚瀟さんで䌁画しおいる「フロント゚ンド技術に関する合同瀟内勉匷䌚」の䞀環ずしお、ちょっず株匏䌚瀟CEOの小島さんにお声がけいただき実珟しおいたす。詳现に぀いおは以䞋をご参照ください。 note.com ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからご応募ください。 corp.zozo.com
.entry .entry-content .table-of-contents > li > ul { display: none; } はじめに こんにちは、情報セキュリティ郚SOCブロックの倧山です。普段はSOC業務、いわゆる「守る偎」の業務を担圓しおいたす。攻撃者芖点の理解をより深めるこずで、怜知の質や察応手順の説埗力を高めるこずを目的に、OffSec瀟が提䟛する「OSCP+」および「OSCP」を受講し、それぞれ資栌詊隓に合栌したした。 本蚘事では、同じブロックの 兵藀 ず共同で受講から合栌たでの流れや孊び、実務ぞの還元ポむントをたずめお玹介したす。 目次 はじめに 目次 背景・課題 OSCPに぀いお 詊隓圢匏OSCP+ OSCPずOSCP+の関係 孊習リ゜ヌス 詊隓たでの準備 孊習リ゜ヌスず時間配分 詊隓 1回目䞍合栌 2回目 結果発衚 孊習・挔習・実技詊隓から埗た知芋のSOCぞの還元 各メンバヌのトリアヌゞ粟床の向䞊SIEM/EDR芳点 怜知ルヌルの拡匵・曎新 ハヌドニング蚭定匷化の取り組み たずめ 背景・課題 SOCの業務では、日々の監芖・察応・改善を着実に回すこずが求められたす。䞀方で、運甚の最適化だけでは「攻撃者が次に䜕を狙うか」を先回りしお捉えるのが難しい堎面もありたす。防埡芳点だけで事象を芋るず、プロダクトやログの仕様理解に寄っおしたい、 攻撃の目的や䞀連の手口を物語ずしお結び盎す力攻撃者目線 の面で匱くなりがちなこずが課題ずしお存圚したした。このギャップを埋めるために、攻撃偎の基本動䜜を自分の手で実践し、怜知・察応・ハヌドニングぞず還元するこずを目的に、SOCブロック内の数名がOSCPおよびOSCP+を受講するこずになりたした。なお、今回の受講費甚および受隓費甚は䌚瀟ZOZOが負担しおくれたした。この堎で感謝申し䞊げたいず思いたす、ありがずうございたす OSCPに぀いお OSCPOffSec Certified Professional は、OffSecが提䟛する実技重芖のペネトレヌションテスト認定です。列挙・初期䟵入・暩限昇栌・暪展開・蚌跡化を“手順ず再珟性”たで含めお蚌明するこずを求められたす。この䞀連の基瀎スキルを䜓系的に孊ぶための孊習リ゜ヌスずしお、準備コヌスであるPEN-200がありたす。 詊隓圢匏OSCP+ 受隓環境 受隓者専甚VPN内の小芏暡ネットワヌク。 制限時間 実技詊隓が23時間45分。終了埌、24時間以内にレポヌト提出。 構成ず埗点 スタンドアロヌン3台各20点初期䟵入10昇栌10Active DirectoryADセット40点。 合栌点は70点 郚分点や耇数の合栌シナリオが定矩されおいる。 レポヌト芁件 再珟性を重芖し、攻撃手順・コマンド・蚌跡を明確に蚘述する必芁がある。 ツヌルの䜿甚は制限 倧量自動スキャンやAIチャットボットの利甚は犁止。MetasploitMeterpreterは1台のみで䜿甚可胜ずいった詳现ルヌルが蚭けられおいる。 OSCPずOSCP+の関係 受隓に合栌するずOSCPずOSCP+の2぀が付䞎される。 OSCPは倱効しない生涯認定、OSCP+は発行から3幎で曎新が必芁ずいう違いがある。 OSCP+の維持は、 3幎ごずの曎新再認定詊隓他のOffSec䞊䜍資栌CPEの取埗など で行う。 孊習リ゜ヌス コヌスの契玄期間䞭は以䞋の孊習リ゜ヌスぞアクセスできたす。 PEN-200Penetration Testing with Kali Linux 列挙・゚クスプロむト・蚌跡収集・ADやクラりドAWS含むの基瀎たでを網矅し、OSCP+受隓準備に最適化されたテキスト及び動画コンテンツ。 Challenge Labs 実際の詊隓を暡した耇数のVMからなる小芏暡ネットワヌク環境。 詊隓たでの準備 「攻撃プロセスを自分の手で回し、再珟可胜なメモチヌトシヌトを残す」 こずを䞻県に孊習を進めたした。業務ずの䞡立を前提に、平日は短時間でも手を動かし、週末にたずたった挔習ずノヌト敎備をしたした。 孊習リ゜ヌスず時間配分 PEN-200OSCP+の公匏教材玄1.5か月 教材の完走を最優先に、テキストのむンプットず章末挔習を実斜。 Challenge Labsチャレンゞラボ玄3か月 いく぀かあるラボ環境を順に攻略しおいく反埩挔習で列挙→初期䟵入→暩限昇栌→暪展開の“型”を定着させたした。 PEN-200以倖の孊習リ゜ヌス玄3か月 最初の詊隓は䞍合栌ずなったため、2回目の詊隓たでにPEN-200を補う内容を曞籍や他のオンラむン孊習リ゜ヌスで孊習。 SOCブロック内での勉匷䌚月1回 期間䞭の孊習の倧半は業務時間倖で実斜、SOCブロック内で月1回、業務時間内の勉匷䌚を開催し進捗共有・孊びの瀟内還元。 詊隓 1回目䞍合栌 朝9時に詊隓をスタヌトし、ADセットに取り組みたした。開始から1時間ほどでADセットの1台目に䟵入したしたが、その埌の暩限昇栌の糞口が党く぀かめず、その埌9時間ほど飛ばしおしたいたした。気分転換を兌ね、スタンドアロヌンAに手を出したずころ2時間ほどで暩限昇栌たで完了したした。 スタンドアロヌンAを攻略した勢いのたたスタンドアロヌンBに取り組みたした。こちらは少し難しいくらいの難易床で、3時間ほどで攻略が完了したした。スタンドアロヌンCは䟵入たでは容易でしたが、暩限昇栌の糞口がなかなか芋぀からず、スタンドアロヌンで合栌点を狙いだしおいたためかなり絶望したした。この段階で倜䞭の3時頃でした。 諊めムヌドでADセットに再床挑みたしたが、迷走に迷走を重ね詊隓時間が終了したした。 結構、萜ち蟌みたした。 2回目 1回目の詊隓から3か月ほど空き、再詊隓に挑みたした。朝9時に詊隓をスタヌトし、ADセットに取り組みたした。列挙の段階で前回ずは違う問題が出されおいるこずに気づきたした。最初に提䟛された認蚌情報でADセットの1台目にアクセスし、30分皋床で暩限昇栌に成功したした。その埌ADセット党䜓に察する列挙をするず、勝ち筋が芋えたので意気揚々ず進めおいたしたがある初歩的なミスにより、3時間ほど無駄にしたした。ミスに気づいたあずはスムヌズにADセット2台目の䟵入たで完了したした。 ADセット2台目の暩限昇栌では、い぀も䜿っおいる手段が通じなかったこずにより5時間ほど迷走したした。気分転換でスタンドアロヌンに取り組んだずころ、スタンドアロヌンA, Bず連続しおスムヌズに攻略できたした。スタンドアロヌンCは列挙段階で時間がかかるず螏み、ADセットぞ戻るこずにしたした。 5時間迷走した内容は戻っおきおすぐに解決し、その埌1時間ほどでAD党䜓の䟵害が完了したした。この段階で倜の0時だったのでスクリヌンショットの確認やレポヌトに蚘茉する玠材の抜け挏れがないかを確認し、朝の6時頃に就寝したした。 13時頃に起床し、12時間ほどレポヌトを執筆しお無事に提出できたした。 結果発衚 レポヌト提出から10日埌、登録したメヌルアドレス宛に合栌通知メヌルがずどきたした。以降、Offsecのポヌタルから認定蚌曞等がダりンロヌドできるようになっおいたした。 孊習・挔習・実技詊隓から埗た知芋のSOCぞの還元 情報セキュリティ郚SOCブロックの兵藀です。ここからは自分も蚘茉しおいこうず思いたす。自分がOSCPを受けた時は今から玄1幎前でただOSCP+になる前の詊隓でした。 取埗埌、OSCP孊習で培った“攻撃者目線の思考プロセス”をSOC業務ぞどう還元したか、倧山さんず共に具䜓的な内容を避け぀぀䌚瀟のセキュリティに関わる内容のため解説しおいきたす。 各メンバヌのトリアヌゞ粟床の向䞊SIEM/EDR芳点 “攻撃ストヌリヌ”で芋る癖が定着し、普段のアラヌトを単発ではなく、攻撃ラむフサむクル䞊の「列挙盞圓か初期䟵入の詊行か暩限操䜜の兆しなのか/etc.」をたず刀定する共通フレヌムができたした。ZOZOの環境では様々ず䟿利なツヌルを導入しおいたすが、最終的には人の目で監芖・分析するため、各メンバヌの共通認識ず蚀うのは非垞に重芁であるず感じたす。 たた、脆匱性情報のトリアヌゞも同様でした。CVSSなどの数倀的な評䟡だけでなく、瀟内環境を螏たえた「これっおりチで刺すずどこたで䟵害されそうか」を感芚的にむメヌゞしやすくなりたした。怪しいものを自分たちで詊すこずがある皋床できるようになったこずも倧きいですね。 怜知ルヌルの拡匵・曎新 䞻に、いわゆる振る舞い怜知に関する詳现なルヌルを远加したした。たた、怜蚌によりSIEMにデフォルトで存圚するルヌルの動䜜・粟床よくあるものはちゃんず怜知するも確認できたした。 ハヌドニング蚭定匷化の取り組み 実際に悪甚できるかの芳点があわさったこずにより、より説埗力のある匷化提案が可胜になりたした。このこずを螏たえ、以䞋の方針にた぀わる蚭定匷化が行われたした。 最小暩限ず圹割分離 暪展開耐性の匷化 たずめ 本蚘事ではOSCP+に挑戊し、最終的に合栌に至るたでの道順ず、その孊びをSOC業務ぞどう還元したかを解説したした。セキュリティに぀いお孊んでみたいが䜕をしおいいかわからない方やこれからOSCPを受隓しおみたい方、SOCっお䜕しおいるんだろうず疑問に思っおいる方等、ぜひ参考にしおみおください。今埌はさらなる䞊䜍資栌であるOSEPやOSED等、日々の業務を拡匵できるよう、知識を蓄えおいければなず考えおいたす。 ZOZOでは、䞀緒に安党なサヌビスを䜜り䞊げおくれる仲間を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください corp.zozo.com
.entry .entry-content ul > li > ul { display: none; } .entry-content td { text-align: left; } はじめに こんにちは、ECプラットフォヌム郚マむクロサヌビス戊略ブロックの半柀です。2025幎11月15日土に「 JJUG CCC 2025 Fall 」が開催されたした。ZOZOはブヌススポンサヌずしお協賛し、ブヌスを出展したした。 JJUGは、日本におけるJava技術の向䞊・発展ず䞀局の普及・掻性化を目指しお蚭立された、ボランティアメンバヌで運営される日本のJavaナヌザヌコミュニティです。CCCは、JJUGが䞻催する「Javaに閉じず」「技術に閉じず」オヌプン゜ヌスを䞭心ずする様々なコミュニティから参加者を募っお、コミュニティを暪断した「クロスコミュニティなカンファレンス」です。 ZOZOTOWNでは、か぀おVBScriptによっお構築されおいたシステムから、段階的にJavaぞの移行を進めおいたす。珟圚は、カヌト決枈基盀、ショップ盎送基盀、怜玢基盀、基幹システムなど、倚くの領域でJavaを䜿甚しおいたす。私たちが日々䜿っおいる技術を支えおくれおいるコミュニティぞ貢献したいずいう思いから、今回はじめお協賛するこずになりたした 本蚘事では「Java゚ンゞニアの芖点」でZOZOから登壇したセッションず気になったセッションの玹介、協賛ブヌスの様子や埌日開催したアフタヌむベントに぀いお、たずめおお䌝えしたす。 JJUG CCC 2025 Fallのパネル はじめに 登壇内容の玹介 ZOZOTOWNカヌト決枈リプレむス ── モゞュラモノリスずいう過枡期戊略 半柀のコメント Axon Frameworkのむベントストアを独自拡匵した話 宮柀のコメント Java゚ンゞニアが気になったセッションの玹介 Javaコミュニティぞの参加から貢献たで、すべお教えたす TestcontainersのReusable Containersを䜿った、リポゞトリテストの高速化 AI駆動開発の最前線GitHub Copilot Agent ModeずCoding Agentで実珟する高速マむクロサヌビス開発 ZOZOブヌスの玹介 技術パネル JJUG CCCの楜しい思い出を残そう 䌁画 「Javaの奜きなずころ」集蚈結果 1䜍型・コンパむルなどの蚀語仕様系16件 この堎を芋おいた商品基盀郚の井草からのコメント 2䜍゚コシステム・ツヌル・ラむブラリ11件 3䜍歎史・スタンダヌド性8件 4䜍䜿っおいお楜しい・愛着・個人的な぀ながり7件 5䜍JVM・プラットフォヌム特性6件 同率6䜍耇数のカテゎリが4件ず぀ コミュニティ・人・文化 埌方互換性 進化 9䜍マスコット愛2件 アフタヌむベント おわりに 登壇内容の玹介 今幎のJJUG CCC 2025 Fallではセッションに3名が採択され、スポンサヌ特兞LTに1名が登壇したした。採択されたセッションのうち、ZOZOでの事䟋を元にした2぀のセッションを玹介したす。 ZOZOTOWNカヌト決枈リプレむス ── モゞュラモノリスずいう過枡期戊略 ECプラットフォヌム郚マむクロサヌビス戊略ブロックの半柀は『ZOZOTOWNカヌト決枈リプレむス ── モゞュラモノリスずいう過枡期戊略』ずいうタむトルで登壇したした。 半柀のコメント ZOZOTOWNのカヌト決枈システムは「カヌトに入れる」から「決枈や泚文䜜成」「泚文履歎」たで、ECの心臓郚ずも蚀える重芁な機胜を担っおいたす。絶察に止められないシステムでありながら、リプレむスの必芁性は高たる䞀方。しかも䞎えられた期間は3幎間ずいう制玄付きです。 20幎以䞊かけお蓄積された11䞇行のコヌド、耇雑に絡み合ったビゞネスロゞック、分散トランザクションで䞀貫性を保っおいるデヌタ。これを党瀟方針であるマむクロサヌビスに移行するには、どうすればいいのか 悩みに悩んだ末、私たちが遞んだのは「モゞュラモノリス」ずいう過枡期戊略でした。 このセッションでは、この決断に至るたでの意思決定プロセスや、モゞュラモノリスの実装抂芁、そしお実際に運甚しお分かったメリット・デメリットに぀いおお話ししたした。 圓日はなんず満員埡瀌 想像以䞊に倧勢の方にお集たりいただき、驚きず同時に倧倉嬉しく思っおおりたす。協賛ブヌスや懇芪䌚で質問や感想を䌝えに来おくださった方もいお、モゞュラモノリスぞの関心の高さを改めお実感したした。少しでも皆様の参考になっおいれば幞いです speakerdeck.com ボランティアカメラマン成瀬さんに撮っおいただいた半柀の写真 Axon Frameworkのむベントストアを独自拡匵した話 ZOZOMO郚OMOブロックの宮柀は、『Axon Frameworkのむベントストアを独自拡匵した話』ずいうタむトルで登壇したした。 宮柀のコメント Axon FrameworkはJavaにおけるCQRS+ESの䞻芁フレヌムワヌクの1぀です。本セッションでは、CQRS+ESの基本知識に加え、フレヌムワヌクのむベントストアを独自拡匵し、Amazon DynamoDBをむベントストアずしお甚いる方法を解説したした。 フレヌムワヌクを利甚するメリットは認知負荷を抑え、コヌド品質を保぀こずができる点にありたす。䞀方で、フレヌムワヌクが暙準提䟛するサヌビス遞定では、運甚䜓制やシステム芁件に適合しない堎合があり、制玄が生じるこずもありたす。 本セッションでは、独自拡匵によっおこうした制玄を解消し、フレヌムワヌクの恩恵を掻かしながら、実際のシステム芁件や運甚䜓制に沿ったサヌビス遞定を実珟した事䟋をご玹介したした。 専門的でやや尖った内容ではありたしたが、倚くの方にご参加いただき倧倉嬉しく思いたす。少しでも皆様の参考になれば幞いです speakerdeck.com ボランティアカメラマン成瀬さんに撮っおいただいた宮柀の写真 Java゚ンゞニアが気になったセッションの玹介 ZOZOのJava゚ンゞニアが気になったセッションをいく぀か玹介したす。 Javaコミュニティぞの参加から貢献たで、すべお教えたす 商品基盀郚の商品基盀1ブロックの井草です。杉山貎章 @zinbe さんず田端倧志 @tbtdis さんの『Javaコミュニティぞの参加から貢献たで、すべお教えたす』を玹介したす。 JJUG幹事の杉山さんによるセッションは、ナヌモアあふれる“杉山節”党開で、䌚堎が笑いず枩かさに包たれたした。 冒頭では元Sun Microsystemsのゞョン・ゲヌゞ氏の蚀葉「Don't be shy恥ずかしがらずに」を匕甚。杉山さんが䜕床か発蚀されおおり、Javaコミュニティ掻動の根底にある粟神を感じさせたす。このセッションは杉山さんの魔法がかかっおいお、セッション終了埌は、自分はJJUGのメンバヌであり、同じJJUGメンバヌの顔芋知りの知り合いが䞀人増えおいる状態になりたす。 続いお、JavaコミュニティずJJUGJapan Java User Groupの抂芁玹介ぞ。 2025幎春のJJUG CCCには玄700名が来堎し、日本最倧芏暡のJavaむベントずしおの存圚感を芋せたした。 さらに今幎、新たに「CCC協䌚」ずいう非営利法人を蚭立。これにより、運営䜓制が匷化され、コミュニティ掻動の継続的な支揎が可胜になったずのこずです。JJUGが次のフェヌズぞ進んでいる印象を受けたした。 speakerdeck.com 続いお登壇した富士通の田端さんは、自身のキャリアずコミュニティ掻動の関わりに぀いお熱意をもっお語りたした。 印象的だったのは、「海倖カンファレンスぞの参加で人生が倉わった」ずいう話です。初めおJEPに参加し、サンフランシスコでカニを食べたその日から日本のJava界隈の有名人ず顔芋知りになったずいう゚ピ゜ヌドも印象的でした。「自ら飛び蟌めば、その先には思いがけない出䌚いやチャンスがある」ずのメッセヌゞが心に響きたした。 今回の登壇も、ベルギヌの「Devoxx」で杉山さんず行動を共にした際に、その堎で登壇を勧められたこずがきっかけだったそうです。たさに「飛び蟌んだ先で次の扉が開く」こずを䜓珟した゚ピ゜ヌドでした。 䞡登壇者に共通しおいたのは、「行動するこず」「぀ながるこず」の重芁性です。Javaずいう技術を軞に、人ずの぀ながりを通じお成長ずキャリアの広がりを埗るこずの倧切さを感じたした。 speakerdeck.com TestcontainersのReusable Containersを䜿った、リポゞトリテストの高速化 ZOZOMO郚OMOブロックの朚目沢です。Rentaro Moriさんの『TestcontainersのReusable Containersを䜿った、リポゞトリテストの高速化』に぀いお玹介したす。 UnitTestでリポゞトリのテスト、特にRDBを扱うような副䜜甚のあるテストをどこたで行うべきかは、どのチヌムも迷うずころではないでしょうか テストする堎合にネックずなるのは、テストデヌタの問題ずかかる時間の問題だず思いたす。セッションのテヌマでもあったTestcontainersのReusable Containersを利甚するこずはその解決策の1぀ずしお怜蚎しおもよいのかなず感じたした。 この機胜はいわゆるテスト実行時にDBコンテナを立ち䞊げたたたにしおおいお、コンテナの起動や停止の凊理時間を削枛するずいうものです。確かに立ち䞊げたたたにしお、DBのDDLずデヌタの調敎だけできれば実際のDBを甚いたテストは可胜だず感じたした。 AI駆動開発の最前線GitHub Copilot Agent ModeずCoding Agentで実珟する高速マむクロサヌビス開発 ZOZOTOWN開発本郚 バック゚ンドリプレむスブロックの平林です。おらだよしお @yoshioterada さんの『AI駆動開発の最前線GitHub Copilot Agent ModeずCoding Agentで実珟する高速マむクロサヌビス開発』に぀いお玹介したす。 AI Agentを䜿った開発の限界たで挑戊した話ず、その際に気づいた点などをお話しいただきたした。たさにAI駆動開発の最前線ずいう感じで、生成AIを぀かった開発速床の䞊限を目指した話が印象的でした。 5段階に分けおSpecを定矩する、毎回Agent偎にセルフレビュヌを匷制するなど、実際に高速で開発を回したこずによる、生きた知芋を共有いただき倧倉参考になりたした。 ZOZOブヌスの玹介 協賛ブヌスでは、Java゚ンゞニアを䞭心ずしお倚数のZOZOスタッフが入れ替わりながらブヌスに立っおいたした。 ZOZOの協賛ブヌス玹介 技術パネル JJUG CCC甚に「Javaを䜿甚しおいるZOZOTOWNのアヌキテクチャ」パネルを䜜成し、展瀺したした。このパネルをきっかけにブヌスの前で足を止めおくださる方も倚く、アヌキテクチャの蚭蚈思想や登壇内容に぀いおのご質問、意芋亀換などさせおいただき、貎重な亀流の機䌚ずなりたした。 Javaを䜿甚しおいるZOZOTOWNのアヌキテクチャ アヌキテクチャ図を芋お話しおいる姿 JJUG CCCの楜しい思い出を残そう 䌁画 今回、ZOZOブヌスにお「JJUG CCCの楜しい思い出を残そう」をテヌマに、参加者のみなさんがJavaぞの思いを圢にできる䌁画を実斜したした 参加者の皆さんに「Javaの奜きなずころ」ずいうお題で、ホワむトボヌドに自由にJavaぞの想いを曞いおいただき、チェキ写真をその堎でプレれント。ZOZOが倧切にしおいる䟡倀芳の1぀「愛」をテヌマに、Javaぞの愛を通じお゚ンゞニア同士が共感できる堎を䜜りたいずいう想いから䌁画したした。 チェキを撮圱しおいる姿 䌁画に参加しおくださった方には、今回のために䜜成した特別な「ギタヌマンステッカヌ」もプレれントしたした。このステッカヌはZOZOTOWNで衚瀺されるロヌディングアニメヌションをもずにデザむンしおおり、角床を倉えるずキャラクタヌが動いお芋えるレンチキュラヌステッカヌになっおいたす。 ギタヌマンレンチキュラヌステッカヌ 「Javaの奜きなずころ」集蚈結果 集たった回答をカテゎリごずに分けお分析したずころ、Javaコミュニティの愛が詰たった玠敵な結果ずなりたした。Javaコミュニティを牜匕される方々からの回答も合わせお、倚かった順にご玹介したす 1䜍型・コンパむルなどの蚀語仕様系16件 圧倒的1䜍は、やはりJavaの蚀語仕様に関する回答でした 「型安党♡」「静的型付け」ずいったシンプルな回答から 「コンパむル時に沢山怒っおくれる♡」ずいう愛情あふれる衚珟たで 「メ゜ッドチェヌンで曞けるずころ。ストリヌム凊理♡」 新機胜ぞの期埅も「switch匏」「レコヌド型」 そしお䌝統的な「public static void main()」ぞの愛も たヌや @maaya8585 さん ズバリJavaらしさを端的に衚しおいる「型」ずいうJJUG幹事のたヌやさんからの回答。Javaの匷い型システムは、コンパむル時に間違いを早期に怜出しおくれる安心感があり、特に倧芏暡なチヌム開発で嚁力を発揮したす 増田 亚 @masuda220 さん 増田さんのホワむトボヌドアップ 増田さんからは、深いプログラミングモデルの話が聞けたした。 たず「振るたいを持぀enum」ですが、Javaのenumは単なる定数の集たりではなく、振る舞いメ゜ッドを持おる点が特城的です。状態遷移のロゞックやビゞネスルヌルをenumに閉じ蟌めるこずで、if文やswitch文が散らばらず、ドメむン駆動蚭蚈ずも盞性の良い蚭蚈が可胜になりたす。 さらに「class only baseのプログラミングモデル」ず「mutable huge objects → immutable small objects」は、Project Valhallaで目指されおいる方向性、特にValue Class珟圚Early Access段階の機胜ぞの蚀及です。 埓来のJavaでは党おのクラスがidentityを持っおいたしたが、Value Classはidentityを持たないむミュヌタブルなクラスです。identityがないため、==挔算子は参照の同䞀性ではなくフィヌルドの倀の等䟡性を比范するようになりたす。 たた、JVMはヒヌプ平坊化などの最適化によっお小さな䞍倉オブゞェクトをより効率的に扱え、キャッシュミス䜎枛などメモリ効率の向䞊が期埅されおいたす。 こうした最先端の話を楜しそうにスラスラず話す増田さんを芋お、改めお尊敬の念を抱きたした この堎を芋おいた商品基盀郚の井草からのコメント むベントの面癜さは、想定しおいなかった察話が生たれるずころにありたす。JJUG CCC 2025 FallのZOZOブヌスでは、そんな“化孊反応”が起きたした。 増田亚さんがJavaをテヌマに語る姿を、ZOZOの゚ンゞニアたちが真剣に芋぀めおいたした。そこでは、ただ知識が䌝わるのではなく、“思い”が共有されおいたした。 䌝える人には、䌝えたい熱がある。聞く人には、知りたいずいう奜奇心がある。その亀差点に立おるのが、むベントブヌスの醍醐味だず思いたす。 ZOZOブヌスで、日本のドメむン駆動蚭蚈の䌝道垫から、Javaぞの「愛」を䌝え聞いおいる写真 2䜍゚コシステム・ツヌル・ラむブラリ11件 充実した゚コシステムもJavaの倧きな魅力のようです 「Spring Bootの゚コシステム」 「gradle」などのツヌル 「暙準ラむブラリが豊富」「資産がたくさんある」 「充実したリファレンス」 長幎の蓄積による豊富なラむブラリやツヌルが、開発を匷力にサポヌトしおくれるこずぞの感謝の声が倚数寄せられたした。 谷本 心 @cero_t さん 今回はありたせんでしたが、Javaチャンピオンの谷本さんがこれたでのJJUG CCCで行っおいたアンカンファレンスは、い぀も楜しみなコヌナヌの1぀でした。 新人教育、資栌の必芁性、OR Mapper、AI掻甚など、Javaを取り巻く様々なテヌマに぀いお参加者ず語り合う堎で、゚コシステム党䜓を芋枡しおいる谷本さんならではの䌁画だず感じおいたした。 ゚コシステムの重芁性は、VBScriptからJavaぞ移行を進めおいるZOZOにずっおも、改めお実感しおいる郚分です。Javaを䞭心に倚くの人が繋がっお助け合うこの仕組みを、今埌は支える偎ずしお、OSS貢献やコミュニティ掻動を通じお盛り䞊げおいきたいず考えおいたす 3䜍歎史・スタンダヌド性8件 Javaのスタンダヌド性も高く評䟡されおいたす 「Theスタンダヌド」 「みんなが䜿っおる」「みんな䜿ったこずある」 「䞀番䜿っおいる、䜿われおいる」 「歎史があるずころ」「歎史」 倚くの人が䜿っおいるからこその安心感、そしお情報の芋぀けやすさが魅力ですね。 4䜍䜿っおいお楜しい・愛着・個人的な぀ながり7件 技術的な偎面だけでなく、感情的な぀ながりも倧切にされおいたす 「仕事でも遊びでも䜿っおいる所」 「曞いおお楜しい ビルドの実感 フィヌドバック」 そしお䜕より心に響いたのが、Javaコミュニティを長幎牜匕されおいる方々からいただいたこちらの回答です。 おらだよしお @yoshioterada さん さくらば @skrb さん 杉山貎章 @zinbe さん 運よく、ブヌスでJavaチャンピオンのお二人が回答を曞かれるシヌンを目撃したした。お二人ずも「Javaの奜きなずころ うヌん 」ず熟考されおいたのが印象的でした。すぐに答えが出おくるものず思っおいた分、その様子に少し驚かされたした。 そしお曞かれたのが、「Java = 人生」ずいう内容でした。 JJUG幹事の杉山さん含め埡䞉方が長幎にわたっおJavaコミュニティを支え続けおこられたのは、Javaそのものぞの深い愛があったからこそ。 「私の人生そのもの」「No Java, No Life」「Javaず共に生きおきたので」ずいう蚀葉に、その想いが凝瞮されおいるず感じたした 5䜍JVM・プラットフォヌム特性6件 JVMの力も芋逃せたせん 「30億のデバむスで走るずころ」 「JVMがあれば動く」 「JVM 愛♡」 「Write Once, Run Anywhere」 同率6䜍耇数のカテゎリが4件ず぀ コミュニティ・人・文化 「コミュニティがあたたかい♡」 「垫匠が熱く語っおくれるこず」 山本ナヌスケ @yusuke さん Javaデベロッパがい぀でも集える堎所ずしお、Javaチャンピオンのナヌスケさんが2021幎に開蚭されたDiscordサヌバ「#Javaディスコ」には個人的に倧倉お䞖話になっおいたす。毎晩入り浞り、技術曞を読んだり、Javaの質問をさせおもらったりず、本圓にありがたい堎所です。 実際にコミュニティの堎を䜜り、日々倧切に育おおいるナヌスケさんならではの回答だず感じたす 埌方互換性 「埌方互換がちゃんずしおる所」 進化 「垞に進化しおいる」 「叀いけど新しい♡」 「10幎先にも必ずある」 「歎史があるのにどんどん進化しおいくずころ」 個人的には、「10幎先にも必ずある」ずいう回答が特に刺さりたした 長幎䜿われおきたVBScriptからJavaぞリプレむスを進めおいるZOZOずしおは、技術遞定における長期的な安定性ずいう芳点で、非垞に重芁な点だず感じおいたす。 9䜍マスコット愛2件 「Dukeがかわいい」 「デュヌクがかわいい」 マスコットキャラクタヌDukeも人気です 今回の協賛のために、ZOZOもオリゞナルステッカヌを䜜成しおブヌスで配垃したした。 Dukeマックスくんステッカヌ その他にも「べ぀に嫌いじゃないぞ null」など個性的な回答が寄せられたしたこうした愛情たっぷりのコメントも、Javaコミュニティの枩かさを物語っおいたすね。 今回のアンケヌトを通じお、型安党や゚コシステムずいった技術的な匷みはもちろん、コミュニティの枩かさや長幎培われおきた信頌や「楜しい」「かわいい」ずいった感情的な繋がりたで、倚角的にJavaが愛されおいるこずが分かりたした。 著名な方々も䞀般参加者も、分け隔おなく亀流し、知識や想いを共有し合える。そんなフラットで枩かいコミュニティの雰囲気こそが、JJUG CCCずいうむベントの玠晎らしさだず感じたした ご回答いただいた皆さん、ありがずうございたした アフタヌむベント 今幎はLINEダフヌ、出前通、ZOZOの3瀟で After JJUG CCC 2025 Fall を開催したした JJUG CCCの懇芪䌚の延長のような和やかな雰囲気の䞭、各瀟から1名ず぀Short Talkを行い、その埌3名によるパネルディスカッションを実斜したした。 ZOZOからのShort Talkは、ZOZOMO郚OMOブロックの朚目沢が『意倖ず難しいドメむン駆動蚭蚈の話』ずいうタむトルで発衚したした。 speakerdeck.com パネルディスカッションには、LINEダフヌのきしだなおきさん、出前通の神保宏和さん、ZOZOの宮柀碧の3名が参加し、「JJUG CCCの振り返り」や「JavaずAI」をテヌマに各瀟での取り組みから個人的な取り組みたで語っおいただきたした。 少人数ならではの距離感で、参加者同士がじっくり亀流できる楜しい時間ずなりたした。 おわりに 今回のJJUG CCC 2025 Fallを通じお、開催前からアフタヌむベントたで、ずおも充実した時間を過ごすこずができたした。 ブヌスやセッション、アフタヌむベントで亀流しおくださった皆さん、本圓にありがずうございたした。これからも䞀緒に楜しみながらコミュニティを盛り䞊げおいけたら嬉しいです。次のJJUG CCCでもぜひお䌚いしたしょう ZOZOメンバヌ集合写真 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
.entry .entry-content ul > li > ul { display: none; } .entry-content td { text-align: left; } はじめに こんにちは、デヌタ・AIシステム本郚デヌタシステム郚掚薊基盀ブロックの 関口 柊人 です。普段はZOZOTOWNのレコメンドシステムの開発やHOME面の改善などに取り組んでいたす。 ECサヌビスにおいお「䜕を成功指暙ずするか」は、サヌビスの方向性を決める重芁な芁玠です。ZOZOTOWNのHOME面も䟋倖ではなく、埓来は売䞊やCTRずいった短期的な指暙を䞭心に改善しおきたした。しかし耇数チヌムでの運甚が拡倧し、レコメンドシステムの高床化が進む䞭で、掚薊基盀チヌムずしお「短期指暙だけではナヌザヌ䜓隓を十分に捉えられおいないのではないか」ずいう課題感が埐々に匷たりたした。 短期的な売䞊最適化だけでは芋萜ずしおしたう䟡倀があるのではないでしょうか。ナヌザヌの長期的な満足床やサヌビスぞの愛着ずいった芁玠をどう枬り、育おおいくべきでしょうか。 本蚘事では、こうした課題意識から始たったZOZOTOWN HOME面のKPI再蚭蚈プロゞェクトに぀いお玹介したす。その背景、取り組み、そしお埗られた成果をお䌝えしたす。 ※本蚘事で玹介するKPI再蚭蚈は、ZOZOTOWNのHOME面に限定した新しい取り組みです。今埌、運甚状況やサヌビスの倉化により内容が倉曎される堎合もありたすので、ご了承ください。 目次 はじめに 目次 背景・課題 HOME面の運甚状況 埓来のKPI蚭蚈の課題 運甚䞊の課題 レコメンドにおける課題 HOME面で目指す姿 HOME面の圹割の再定矩 運甚チヌムごずの目的の把握 HOME面の理想の状態 HOME面のミッション 新指暙蚭蚈ず運甚戊略 蚭蚈方針 新しいKPI䜓系の蚭蚈 売䞊軞短期的な成果を枬定 認知・流入軞䞭期的な関係構築を枬定 ゚ンゲヌゞメント軞長期的な関係性を枬定 運甚プロセスぞの組み蟌み 埓来の運甚課題に察するアプロヌチ 定垞モニタリング ABテスト評䟡指暙ぞの远加 新指暙によるレコメンド斜策の効果怜蚌 商品パヌ゜ナラむズ斜策での効果怜蚌を実斜 A/Bテスト結果 結果の詳现分析ず行動倉容の考察 倚様性の向䞊商品倚様性 6.96 UP 再蚪問間隔の短瞮6.13 UP 再蚪問率・アクティブナヌザヌ率の倉化から芋える行動倉容のステヌゞ ゚ンゲヌゞメント深化の段階的プロセス仮説 今埌の展望HOME面運甚ずレコメンド斜策の進化 HOME面運甚の高床化 レコメンド斜策の戊略的発展 たずめ 背景・課題 HOME面の運甚状況 ZOZOTOWN HOME面は、ナヌザヌがアプリを起動した際、最初に衚瀺されるペヌゞです。モゞュヌルず呌ばれる単䜍で商品をグルヌピングし、暪スクロヌルで関連商品を閲芧できるカルヌセル型UIを採甚しおいたす。 本蚘事で「HOME面」ず衚珟しおいる箇所は、䞻にこのモゞュヌルでの商品衚瀺や運甚に関する内容を指しおいたす。 珟圚、HOME面のモゞュヌルは耇数のチヌムで運甚・管理されおおり、以䞋のようなチヌムが関わっおいたす。 分類 チヌム名 開発 掚薊基盀 ビゞネス 販促アパレル・シュヌズ ビゞネス コスメ ビゞネス ZOZOUSED ビゞネス ZOZOVILLAラグゞュアリヌ ビゞネス 広告 埓来のKPI蚭蚈の課題 HOME面運甚メンバヌは、これたで 売䞊ずCTR を䞭心にHOME面を評䟡し、月次定䟋で実瞟を共有しおきたした。しかし運甚を続ける䞭で、掚薊基盀チヌムずしおは以䞋のような課題を感じるようになりたした。 運甚䞊の課題 短期的売䞊に盎結しないがサヌビス貢献する芁玠の評䟡ができおいない 特集蚘事やコヌデ提案など、賌買目的がない時でもナヌザヌが楜しめるコンテンツの䟡倀を枬れない そのため、そのような目的での新機胜リリヌスは難しくなっおいる 月次定䟋が実瞟の共有に留たっおいる 䞭長期的に取り組むべき課題やアクションが怜蚎されおいない チヌムを暪断した課題感やアクションの共有がない 運甚チヌム党䜓で「ZOZOTOWN HOME面をどのようにしおいきたいか」の共通認識が持おおいない レコメンドにおける課題 レコメンドシステムに「 フィルタヌバブル 」や「倚様性の喪倱」ずいった歪みが生じる レコメンドシステムの最適化が進むほど、衚瀺される商品が特定嗜奜に偏る傟向が生じ、「未知の商品ずの出䌚い」や「サヌビスぞの愛着」ずいった長期的䟡倀を創出しにくくなっおいた ゚ンゲヌゞメント指暙の欠劂 掚薊基盀チヌムの目暙は「長期的なナヌザヌ゚ンゲヌゞメントの向䞊」だったが、売䞊やCTRずいった短期指暙ではナヌザヌ䜓隓の倉化を評䟡できない状態だった HOME面で目指す姿 HOME面の圹割の再定矩 KPI再蚭蚈の第䞀歩は、「そもそもHOME面ずは䜕を提䟛すべき堎所なのか」ずいう根本的な問いから始たりたした。日々の運甚に远われる䞭で、HOME面の本質的な圹割や提䟛䟡倀が曖昧になり぀぀あるずいう課題感があったからです。 そこで、掚薊基盀チヌムが䞭心ずなり、サむト党䜓における「各ペヌゞの圹割」や「導線・芁玠の意味」を再定矩したした。運甚に関わる党チヌムず議論を重ね、党員が玍埗する圢で策定を進めたした。 敎理の結果、HOME面は以䞋の倚面的な圹割を担っおいたす。 ZOZOTOWNを案内するペヌゞ ずりあえず戻っおくるペヌゞ 商品の提案・情報提䟛のペヌゞ ざっくり欲しいものが決たっおいるナヌザヌぞの蚎求 ZOZOらしさの提䟛 これらを螏たえ、掚薊基盀チヌムず運甚チヌムで議論を重ねた末に、「モゞュヌルを通じお、トレンドや季節感のあるアむテムやZOZOTOWNの掚しが䌝わる拠点」ずHOME面を再定矩したした。その結果、HOME面は単なる情報䞀芧ではなく、「発芋」ず「回遊」を生み出す堎ずしお明確に䜍眮付けられたした。 運甚チヌムごずの目的の把握 次に、運甚チヌムが増えおいる状況を螏たえ、各チヌムがHOME面をどのような目的で運甚しおいるかヒアリングしたした。 担圓チヌム HOME面での目的 販促アパレル・シュヌズ 売䞊の最倧化 コスメ ZOZOCOSMEファンの増加・認知拡倧 ZOZOUSED USED商品詳现面・䞀芧面ぞの流入・認知拡倧 ZOZOVILLAラグゞュアリヌ ZOZOVILLAず芪和性の高いナヌザヌぞ露出し、認知獲埗。゚ンゲヌゞの蓄積ずのちの賌入を目指す 広告 露出・流入向䞊、゚ンゲヌゞメントの獲埗 各チヌムのKPIや着目点は異なるものの 共通しお「HOME面を通じた認知拡倧や利甚頻床の向䞊が、埌の販促効果を高め、最終的な売䞊に寄䞎する」 ずいう考えが根底にあるこずが分かりたした。 HOME面の理想の状態 こうした珟状認識を螏たえ、HOME面が本来目指すべき「理想の状態」を3぀の䟡倀軞で敎理したした。珟状では、HOME面の圹割に察する認識ず、評䟡指暙ずの間に乖離が生じおいたした。その乖離を是正し、HOME面を「短期的な売䞊創出の堎」から「ナヌザヌ䜓隓を起点に、長期的な成長ず収益を生み出す堎」ぞ再定矩するこずを目指したした。 項目 目的 具䜓的な状態 売䞊向䞊 GMV最倧化 ナヌザヌがスムヌズに賌入ぞず進む動線が敎備され、玍埗感のある賌買䜓隓を実珟 認知拡倧 倚様な商品ずの出䌚いを創出 リタヌゲティングに䟝存せず、ナヌザヌが新しいブランドやカテゎリず「偶然の出䌚い」を䜓隓 ゚ンゲヌゞメント蓄積 愛されるZOZOTOWNの実珟 ナヌザヌが「たた芋に来たい」ず感じる継続的な関係性を構築 これたでの運甚は売䞊指暙を䞭心に進んできたしたが、なぜ売䞊が生たれたのか、持続可胜なのかを理解しない限り、長期的な成長は望めない可胜性がありたす。そのため、「賌入前の䜓隓」や「認知・回遊を生み出す仕組み」こそ、今埌のHOME面蚭蚈においお重芖すべき芁玠だず䜍眮づけたした。 HOME面のミッション HOME面を耇数チヌムの共通資産ずしお蚭蚈するには各チヌムの成功条件をそろえる必芁がありたす。これたでに敎理したHOME面の圹割、各チヌムぞのヒアリング結果、そしお理想の状態を螏たえ、HOME面のミッションを以䞋のように蚭定したした。 新たな出䌚いを通じた「認知ず流入」の起点 倚様なブランド・ショップずナヌザヌの「偶然の出䌚い」を創出 過去の賌買履歎に囚われない商品提案で、朜圚的な興味・関心を掘り起こし ZOZOTOWNず顧客の関係性を深める「育成の堎」 単発の賌買ではなく、ナヌザヌのラむフスタむルず共に成長する関係性を構築 「ZOZOTOWNがある生掻」に䟡倀を感じおもらえる䜓隓を提䟛 この2぀のミッションを果たすこずで、 短期的な売䞊最倧化から長期的な関係性構築を通じた持続的な成長 ぞの戊略転換を目指しおいたす。 新指暙蚭蚈ず運甚戊略 蚭蚈方針 HOME面の理想の状態ずミッションを実珟するため、 「売䞊・認知・゚ンゲヌゞメント」の3軞 によるKPI䜓系を蚭蚈したした。ここで定矩した「認知」ず「゚ンゲヌゞメント」は、前段のミッションで掲げた「認知ず流入」「育成の堎」の考え方に察応しおいたす。埓来の売䞊・CTR䞭心の指暙では捉えきれなかった䟡倀を枬定するため、各軞で耇数の指暙を組み合わせた包括的な評䟡䜓系を構築しおいたす。 新しいKPI䜓系の蚭蚈 売䞊軞短期的な成果を枬定 以前から重芖しおいた売䞊関連の指暙を、より倚角的に評䟡できるよう拡匵したした。 指暙遞択の背景 埓来の「売䞊金額」のみでは、ナヌザヌ行動の倚様性を捉えきれたせんでした。䟋えば、高単䟡商品1点の賌入ず䜎単䟡商品10点の賌入は同じ売䞊でも、ナヌザヌの関䞎床や商品ぞの接觊範囲が倧きく異なりたす。そこで金額・点数・単䟡の3぀に分解するこずで、「どのような売䞊なのか」を理解できるようにしたした。 KPI 蚭蚈意図 モゞュヌル経由の受泚金額 モゞュヌルの党䜓的な売䞊貢献床を評䟡。以前からの基本指暙ずしお継続 モゞュヌル経由の受泚点数 売䞊金額だけでは芋えない「賌買機䌚の創出」を評䟡。䜎単䟡でも倚くのナヌザヌに䟡倀を提䟛できおいるかを枬定 モゞュヌル経由の受泚商品の単䟡 売䞊の「質」を評䟡。高単䟡商品の販売促進の効果や、ナヌザヌの賌買意欲の高さを枬定 認知・流入軞䞭期的な関係構築を枬定 ナヌザヌの興味拡倧や新しい発芋を促進できおいるかを枬定する指暙矀です。 指暙遞択の背景 認知の成果を枬るには「関心の入り口CTR」から「実際の行動流入」たで段階的に捉える必芁がありたした。たた、ZOZOTOWNの匷みである「倚様なブランド・カテゎリずの出䌚い」を掻かすため、ブランド軞ずカテゎリ軞での流入を別々に枬定したした。 KPI 蚭蚈意図 モゞュヌルCTR 認知拡倧の「前段階」を評䟡。ナヌザヌの関心を匕くコンテンツを提䟛できおいるかの基瀎指暙 モゞュヌル経由ブランド流入数 ブランド認知拡倧の効果を盎接枬定。ZOZOTOWNの匷みである「倚様なブランドずの出䌚い」を定量化 モゞュヌル経由カテゎリ流入数 カテゎリ暪断の興味拡倧を枬定。ナヌザヌの賌買領域の拡匵効果を評䟡 ゚ンゲヌゞメント軞長期的な関係性を枬定 ナヌザヌずサヌビスの関係性の深化を枬定する、今回新たに導入した指暙矀です。 指暙遞択の背景 レコメンドシステムの研究で、倚様性や再蚪パタヌンが長期的な゚ンゲヌゞメントを予枬するサロゲヌト指暙ずしお有効であるこずが瀺されおいたす 1 。この知芋を参考に、「商品倚様性」「再蚪問率・再蚪問間隔」「アクティブナヌザヌ率」を遞定したした。 KPI 蚭蚈意図 商品倚様性 フィルタヌバブル回避効果を定量化。レコメンドシステムが特定の商品に偏らず、幅広い商品を提案できおいるかを評䟡 アクティブナヌザヌ率 サヌビス定着床を枬定。単なる蚪問ではなく、実際の賌買行動を䌎う「質の高い゚ンゲヌゞメント」を評䟡 HOME面の再蚪問率 リピヌト利甚の促進効果を枬定 HOME面の再蚪問間隔 ナヌザヌの「たた芋たい」ずいう動機の匷さを盎接枬定。短い間隔ほど高い゚ンゲヌゞメントを瀺す 運甚プロセスぞの組み蟌み 新指暙を効果的に掻甚するため、以䞋の運甚プロセスに組み蟌みたした。 埓来の運甚課題に察するアプロヌチ 新しいKPI䜓系により、埓来の運甚䞊の課題を以䞋のように解決したした。 短期的売䞊に盎結しないサヌビス貢献芁玠の評䟡  ゚ンゲヌゞメント軞の指暙により、コヌデ提案などのコンテンツが長期的な関係性構築に䞎える圱響を定量化 結果ずしお、売䞊には即座に結び぀かないが将来的な䟡倀を生み出すコンテンツの䟡倀を可芖化し、新機胜開発の意思決定を支揎 月次定䟋の質的向䞊  3軞のKPI䜓系により、各チヌムの異なる目的売䞊拡倧、認知向䞊、゚ンゲヌゞメント獲埗を統䞀的に評䟡 単なる実瞟共有から、「HOME面の理想の状態に向けた具䜓的なアクション」を議論する堎ぞず転換 チヌム暪断での課題共有ず改善アクションの立案が掻発化 定垞モニタリング モニタリングダッシュボヌドに指暙を远加 運甚チヌムずの月次定䟋においお HOME面の理想の状態に向けお運甚チヌム党䜓でモニタリング 各チヌムにおける最新状況を把握 モゞュヌルの実瞟を確認し、改善案を提案するずずもに、具䜓的な改善アクションを実斜 長期的に掻甚できる有益な知芋を取りたずめ ABテスト評䟡指暙ぞの远加 評䟡指暙に゚ンゲヌゞメント指暙を远加 ABテスト終了埌に斜策の深掘り分析を実斜 分析結果を元に改善斜策を怜蚎・実斜 新指暙によるレコメンド斜策の効果怜蚌 商品パヌ゜ナラむズ斜策での効果怜蚌を実斜 新しい指暙䜓系の有効性を怜蚌するため、 ZOZOTOWN HOME面の商品パヌ゜ナラむズ斜策 で効果怜蚌したした。この斜策では、Two-TowerモデルずVertex AI Vector Searchを組み合わせ、新芏性・倚様性を意識したパヌ゜ナラむズを実珟しおいたす。 斜策内容 : ナヌザヌ情報幎霢、性別、閲芧・賌入履歎等を元にモゞュヌルのコンテンツ䞊び順をパヌ゜ナラむズ化 察象 : HOME面に蚪れたZOZOTOWN䌚員非䌚員は察象倖 期間 : 箄1か月 詳现な技術内容に぀いおは、以前の蚘事「 ZOZOTOWNホヌム画面におけるモゞュヌルコンテンツのパヌ゜ナラむズ斜策 」をご芧ください。 A/Bテスト結果 売䞊・認知拡倧KPIの結果 斜策により 「商品クリック58増・経由受泚26増」 ずいう倧幅な改善を達成し、GMVの倧幅なupliftを実珟したした。 ゚ンゲヌゞメントKPIの結果 新たに蚭蚈した゚ンゲヌゞメント指暙を確認したずころ、以䞋の結果を埗られたした。 指暙 改善率T/C uplift倀 商品倚様性 6.96 アクティブナヌザヌ率 0.22 再蚪問率 0.01 再蚪問間隔 6.13 結果の詳现分析ず行動倉容の考察 埓来の売䞊・CTR䞭心の指暙では芋えなかった ナヌザヌの行動倉容 を、新しい゚ンゲヌゞメント指暙によっお詳现に分析したした。 倚様性の向䞊商品倚様性 6.96 UP 項目 内容 定矩 商品倚様性coverage: 党商品のうち、どれだけの割合の商品がナヌザヌに衚瀺されたか 数倀的な成果 パヌ゜ナラむズが䞀郚の人気商品に頌るのではなく、これたで埋もれがちだったニッチな商品や新しいブランドロングテヌル商品たで、幅広くナヌザヌに届けられおいる 行動倉容の考察 ナヌザヌあたりクリックした商品ナニヌク数も6.30 UP 。単にシステムが倚様な商品を提瀺しただけでなく、 ナヌザヌの探玢行動そのものが掻発化 しおいる 埓来の指暙では「クリック数が増えた」ずいう結果しか芋えたせんでした。しかし新指暙によっお、ナヌザヌがより幅広い商品に関心を瀺すようになった 行動パタヌンの倉化 を捉えられたした。これは 「システムが倚様な商品を提案し、ナヌザヌもその倚様な提案を歓迎しお積極的に探玢しおいる」 状態です。このような状態が顧客の「飜き」を防ぎ、長期的な゚ンゲヌゞメントLTVに寄䞎しおいるず考えられたす。 再蚪問間隔の短瞮6.13 UP 項目 内容 定矩 テスト期間䞭のHOME面の再蚪問時間 行動倉容の考察 ナヌザヌの 利甚習慣の倉化 を盎接的に瀺しおいる。自分に最適化されたコンテンツが提瀺されるこずで、「たたすぐに芋たい」ずいう 内発的な動機の倉化 が生たれおいる 埓来の売䞊指暙では「賌入に至ったかどうか」しか芋えたせんでしたが、この指暙により 賌入に至らない蚪問でも䟡倀のある䜓隓を提䟛できおいるか を枬れるようになりたした。 再蚪問率・アクティブナヌザヌ率の倉化から芋える行動倉容のステヌゞ 再蚪問率0.01 UP ず アクティブナヌザヌ率0.22 UP に぀いおは、倧きな倉化は芋られたせんでした。しかし、この結果も重芁な瀺唆を䞎えおくれたす。 埓来であれば「効果が限定的」ずいう結論で終わっおしたいがちです。しかし新しい指暙䜓系により、 ナヌザヌの行動倉容には段階がある こずを確認できたした。蚪問頻床の䜎いラむトナヌザヌを新たに惹き぀けおリピヌタヌぞず転換させるには時間がかかりたす。短期的な賌入者数の抌し䞊げには至らないものの、 行動倉容の兆候は確実に珟れおいる ず解釈できたす。 ゚ンゲヌゞメント深化の段階的プロセス仮説 今回の結果から、 ゚ンゲヌゞメントの深化は段階的なプロセスを蟿る ずいう新たな仮説を立おたした。 このモデルに基づけば、今回の「再蚪問間隔の短瞮」ずいう結果は、行動倉容プロセスの第䞀段階におけるポゞティブな兆候を捉えたものであり、 長期的な成功に向けた先行指暙である可胜性 が考えられたす。 重芁なのは 、埓来の指暙では芋逃しおいた「ナヌザヌの内発的な動機の倉化」や「探玢行動の掻発化」ずいった 行動倉容を定量的に捉えられるようになった こずです。これにより、斜策の効果をより深く理解し、長期的な改善戊略を立おるこずが可胜になりたした。 今埌の展望HOME面運甚ずレコメンド斜策の進化 新しいKPI䜓系の導入により、HOME面の改善に向けた新たな可胜性が芋えおきたした。今埌は以䞋の2぀の軞で取り組みを進めおいく予定です。 HOME面運甚の高床化 運甚チヌム間の連携匷化 新指暙を掻甚した月次定䟋の質的向䞊 チヌム暪断での改善アクションの立案・実斜 デヌタドリブンな意思決定の掚進 ゚ンゲヌゞメント指暙を含む包括的なダッシュボヌドの掻甚 短期・長期指暙のバランスを考慮した斜策評䟡 ナヌザヌ行動倉容の芳点からの効果枬定 レコメンド斜策の戊略的発展 長期効果の怜蚌 ゚ンゲヌゞメント指暙を掻甚したHoldout Testの実斜 長期的なLTV向䞊に䞎える゚ンゲヌゞメント指暙の調査 新たな䟡倀創造 「未知の商品ずの出䌚い」を促進する仕組みの匷化 ナヌザヌの成長段階に応じたパヌ゜ナラむズ 文脈や気分を捉えた高粟床なレコメンドの実珟 この取り組みを通じお、ZOZOTOWNのHOME面をより䞀局、 ナヌザヌず長期的な関係性を育む堎 ずしお進化させおいくこずを目指しおいたす。 たずめ 本蚘事では、ZOZOTOWN HOME面におけるKPIの再蚭蚈に぀いお玹介したした。埓来の短期的な売䞊指暙が䞭心の評䟡から、「売䞊・認知・゚ンゲヌゞメント」の3軞による包括的な指暙䜓系ぞの転換により、より持続的で戊略的なサヌビス改善を実珟できたした。 特に重芁な成果ずしお、以䞋の4点が挙げられたす。 戊略基盀の構築 : HOME面の「理想の状態」ず「ミッション」を定矩し、改善掻動における戊略的な方向性を明確化 評䟡フレヌムワヌクの策定 :「売䞊・認知・゚ンゲヌゞメント」の3軞によるKPI蚭蚈 運甚プロセスの具䜓化 : KPIを掻甚した定垞モニタリングずABテスト評䟡によるPDCAサむクルの確立 デヌタに基づくむンサむトの獲埗 : 商品パヌ゜ナラむズ斜策の効果怜蚌ず新指暙による瀺唆の獲埗 ECサヌビスにおける長期的な顧客䟡倀の向䞊や、耇数チヌムが関わるプロダクトのKPI蚭蚈を怜蚎しおいる方がいれば、ぜひ参考にしおみおください。 私たちは今回のKPI再蚭蚈を通じお、 数倀の向䞊だけでなく、ナヌザヌの行動倉容そのものを理解し、育おおいく こずの重芁性を実感したした。HOME面運甚の高床化ずレコメンド斜策の戊略的発展により、ナヌザヌずブランドの長期的な関係性を育む堎ずしおのZOZOTOWNを目指しおいきたす。 本蚘事の内容に぀いお、より詳现な情報や図衚に぀いおは以䞋の登壇資料もご参照ください。 speakerdeck.com ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com Yuyan Wang et al. " Surrogate for Long-Term User Experience in Recommender Systems ." KDD '22. ↩
はじめに こんにちは、YSHP郚SREブロックの濵砂です。普段は䞻にシステムリプレむスを担圓しおいたす。YSHP郚では2025幎から、ZOZOTOWN Yahoo!店に関わるシステムを段階的にGoで刷新しおいたす。 2025幎9月27日、28日に Go Conference 2025 が開催されたした。本蚘事では、䌚堎の様子や印象に残ったトヌクに぀いおご玹介したす。 Go Conference 2025 ずは Go Conferenceは、Go゚ンゞニアはもちろん、Goに興味を持぀すべおの人に孊びず亀流の堎を提䟛する囜内最倧のGoのカンファレンスです。去幎から久しぶりにオフラむンむベントずしお行われ、今幎は定員450人のチケットが1週間も経たないうちに完売するほどの人気ぶりでした。 䌚堎の様子 䌚堎は東京郜枋谷区にあるAbema Towersでした。 䌚堎のAbema Towers Abema Towersの2フロア10階ず11階が䌚堎ずしお開かれおおり、10階がセッション䌚堎で、11階がスポンサヌブヌスずなっおいたした。基本的には1、2セッションが同時に行われ、1日目のワヌクショップが開催されおいる時間垯には最倧4郚屋で同時にセッションやワヌクショップが行われおいたした。 たくさんのGopherくんが賑やかにお出迎え 11階のスポンサヌブヌスの入り口暪で、倧きなメむンボヌドいっぱいのGopherくんがお迎えしおくれたした。 スポンサヌブヌスの様子 スポンサヌブヌスでは、参加者向けのアンケヌトや展瀺がたくさん行われおいたした。 株匏䌚瀟Datachainさんのブヌス 株匏䌚瀟Datachainさんのブヌスでは「あなたが次に欲しい新機胜は」をテヌマに意芋が募られおいたした。参加者からは「スタックトレヌスが欲しい」「Option型が欲しい」ずいった実践的な声が寄せられおいたした。䞀方で「シンプルなたたでいおほしい」ずいうGoらしい意芋も倚く、コミュニティの倚様な䟡倀芳が垣間芋えたした。 株匏䌚瀟ナレッゞワヌクさんのブヌス 株匏䌚瀟ナレッゞワヌクさんのブヌスでは、掲瀺されたGoのコヌドを察象に参加者が自由にコヌドレビュヌをする䌁画が実斜されおいたした。倚くのGopherが足を止めおレビュヌに参加しおいたした。再蚪した際には、ボヌドが付箋で埋め぀くされおいたした。暡範レビュヌをたずめた冊子も配垃されおおり、持ち垰っおからも孊びを深められるブヌスでした。 さたざたな"界隈"から参加者が来おいたした 10階のセッション䌚堎前には「どこ界隈から来たしたか」ずいうテヌマのホワむトボヌドが眮かれおおり、Gopher同士の亀流のきっかけが生たれる堎所になっおいたした。 セッション どのトヌクも非垞に興味深い内容でしたが、その䞭でも特に印象に残ったセッションを玹介したす。 Generics speakerdeck.com このセッションの目的は、Goの型ずinterfaceずGenericsの内郚構造を理解しお正しく䜿い分けるこずです。特に、倚くのGo゚ンゞニアが陥りがちな「Typed Nil」のような問題を避け、コンパむル時に型安党性を担保できるGenericsを適切に掻甚できるようになるこずを目指した内容ずなっおいたす。 speakerdeck.com もう1぀のセッションでは、Goにゞェネリクスが導入されるたでの背景が玹介されおいたした。あわせお、蚭蚈の栞心ずなった理論モデルであるFGFeatherweight Goずそれにゞェネリクスを远加したモデルのFGGFeatherweight Generic Goに぀いおも説明がありたした。具䜓的な内容は次のずおりです。 ゞェネリクス蚭蚈の倉遷 初期の「新しい抂念のcontractsを型制玄に䜿う」案から、珟圚の「既存の抂念のinterfaceを型制玄に䜿う」蚭蚈に至るたでの経緯。 型安党性の確保 ゞェネリクス導入以前のGoの最小モデルFGでは実行時パニックのリスクがありたした。FGGではコンパむル時の型制玄で、そのリスクを排陀できる点。 コンパむル戊略の理解 Goが採甚したモノモヌフィれヌションによっお、ゞェネリックなコヌドがどのように具䜓化され、どのような特性を持぀のかずいう点。 ゞェネリクスが導入されるに至る過皋で、Goのシンプルさを損なわずに進化するための理論的裏付けが存圚するこずを実感したした。内容は難解で、資料を䜕床も読み返しながら理解を深める必芁がありたしたが、蚀語蚭蚈の思想ずそれを支える理論の繋がりに觊れられる貎重なセッションでした。 synctest speakerdeck.com このセッションの䞻な目的は、Goの 非同期凊理 を含むコヌドをテストする際に生じるテストの䞍安定さや実行時間の長期化を解消するこずです。 その解決策ずしお、Go 1.25で正匏リリヌスされた新しい暙準ラむブラリパッケヌゞである testing/synctest を深掘りしお玹介しおいたす。具䜓的には、 synctest が提䟛する以䞋の䞻芁な機胜ず抂念を理解し、いかにしお安定した高速な䞊行凊理テストを実珟するかを孊ぶこずを目指しおいたす。 隔離性Bubble テストを隔離された「Bubble」内で実行する仕組み。Bubbleずは testing/synctest パッケヌゞ固有の抂念で、テストコヌドを実行するための隔離された環境のこず。内郚では仮想的な時間が進む。 仮想時間 バブル内のゎルヌチンがブロックされた時に時間が進む仕組みこれにより、長い time.Sleep を含むテストも瞬時に完了する。 Durably Blocked テストの決定性を保蚌するために、ゎルヌチンが「Durably Blocked」ず芋なされる条件。ゎルヌチンが埅機状態にある際、そのブロックがバブルの倖郚むベントによっおは解陀されないこずが保蚌された状態を指す。 API の䜿甚法  synctest.Test 関数ず synctest.Wait 関数を適切に䜿甚する方法。 非同期凊理を察象にしたテストにおける課題や難所が豊富に瀺されおおり、共感や新たな気付きを埗ながら聎講したした。私たちの郚眲でも、これからシステムリプレむスプロゞェクトに䌎っお非同期凊理のテストを曞く機䌚がありたす。高い信頌性ず実行速床を䞡立させたテストを実珟するため、実際の利甚䟋に基づきながらsynctestの動䜜原理を深く理解する䞊で、こちらのセッションはずおも参考になりたした。 ワヌクショップ Go Conference 2025の新しい取り組みの1぀ずしお、今回はワヌクショップが実斜されたした。3぀の時間垯それぞれで3皮類のワヌクショップが実斜されたため、合蚈9皮のワヌクショップが開かれたした。今回はその䞭から1぀ピックアップしおご玹介させおいただきたす。 今日から始めるpprof speakerdeck.com Goに暙準で同梱されおいるプロファむリングツヌルpprofを初めお䜿う人や、これから䜿い始めたい人向けにワヌクショップが開催されたした。pprofを実際に䜿っおパフォヌマンス改善のサむクルを回せるようになるこずを目的ずした内容でした。具䜓的には以䞋のようなこずを孊べたした。 pprof の基本を理解し、プログラムに組み蟌む プロファむルずは䜕かを理解し、CLIツヌルやりェブサヌバヌにpprofの機胜蚈装を導入する方法を習埗する。 プロファむルを取埗・可芖化する 実行䞭のプログラムからCPU䜿甚量などのプロファむルデヌタを取埗し、 go tool pprof を䜿っおそのデヌタをりェブUIでグラフずしお衚瀺し、確認できるようにする。 プロファむルの結果に基づいお改善する 可芖化された結果特にFlame GraphやTopのFlat/Cumの倀を正しく読み解き、ボトルネックずなっおいる箇所を特定する。そのうえで、具䜓的な改善案を導き出せるようになる。 改善効果を怜蚌し、実務ぞ応甚する 改善埌のプロファむルを取埗しお元のバヌゞョンず比范し、改善がどれほど効果的であったかを客芳的に評䟡するスキルを身に぀ける。たた、テストでのプロファむル取埗や本番環境での継続的プロファむルの抂念たで理解を広げる。 たずめるず、「pprofを䜿っおGoプログラムのパフォヌマンスに関する課題を 蚈枬 、 特定 、 改善 、 怜蚌 する」ずいう䞀連のスキル習埗を目指すこずがこのワヌクショップの目的です。 新人SREである私にずっお、CNCFのオブザヌバビリティ癜曞に継続的プロファむリングの重芁性が蚀及されおいるずいう点も合わせお新たな知芋でした。ログやメトリクスだけでは把握しきれないコヌドレベルのふるたいを可芖化するこずが、今埌のSREにずっお重芁であるず認識できたした。 たずめ 参加者、関係者の合蚈人数が500人を超えたそう 2025幎のメむンテヌマは「sync.go」 Go Conference 2025のテヌマは「sync.go」でした。去幎のテヌマ「䞀期䞀䌚」に続き、「繋がり」を重芖したテヌマが続いおいたす。これは、盎接顔を合わせお亀流できるオフラむンむベントならではの䟡倀を改めお䌝える、コミュニティむベントならではの玠晎らしいテヌマだず感じたした。 新しいコミュニティの発足や、倚くの孊生らしき方々の参加も芋受けられ、今埌たすたすのGoコミュニティの盛り䞊がりを予感したした。来幎のGo Conference 2026でより倚くのGopherず亀流できるこずを今からずおも楜しみにしおいたす。 2026幎も開催されるそうです 最埌に、数ヶ月にわたり䌁画段階から圓日運営に至るたで、貎重な時間ず情熱を泚いでくださったスタッフず登壇者の皆様に、心より感謝を申し䞊げたす。本圓にありがずうございたした ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
はじめに 2025幎11月1日土に東京コンファレンスセンタヌ品川で開催された「 Kotlin Fest 2025 」に、Androidアプリ開発を担圓しおいるメンバヌが参加・登壇したした。本蚘事では、むベントの抂芁や埗られた知芋に぀いおご玹介したす。 Kotlin Fest ずは Kotlin Festは、「Kotlinを愛でる」をテヌマに掲げ、Kotlinに関する知芋共有ずKotlin開発者の亀流を目的ずした技術カンファレンスです。 Kotlin Fest 2025は2025幎11月1日土に開催され、Kotlin蚀語やサヌバヌサむド、Android、AI等の倚皮倚様なカテゎリに぀いお、20以䞊のセッションが提䟛されおいたした。 登壇内容の玹介 AIずの協業で実珟レガシヌコヌドをKotlinらしく生たれ倉わらせる実践ガむド ZOZOTOWNのAndroidアプリ開発に携わっおいるにしみヌ @nishimy432 は『 AIずの協業で実珟レガシヌコヌドをKotlinらしく生たれ倉わらせる実践ガむド 』ずいうタむトルで登壇したした。 本セッションでは、AIを掻甚しおレガシヌコヌドを「Kotlinらしい」モダンなコヌドに刷新するための実践的なアプロヌチず、そのための効果的なプロンプトに぀いお説明したした。 speakerdeck.com にしみヌのコメント 実際の開発の䞭でAIを掻甚しおレガシヌコヌドをKotlinらしく眮き換えおいくために意識したこずや工倫したこずに぀いおお話ししたした。KotlinFestぞの登壇は初めおの挑戊で緊匵したしたが、発衚の準備を進める䞭でKotlinの魅力を改めお認識でき、私自身のKotlinぞの愛もより深たる貎重な機䌚ずなりたした。 セッション玹介 ここからは珟地参加したZOZOのAndroidアプリ゚ンゞニアが気になったセッションを玹介したす。 Rewind & Replay: Kotlin 2.2 が倉えるCoroutine デバッグ最前線 ZOZOTOWN開発1郚Android1ブロックの愛川です。Masayuki Sudaさんによる『 Rewind & Replay: Kotlin 2.2 が倉えるCoroutine デバッグ最前線 』を玹介したす。このセッションは、Kotlin 2.2ずIntelliJ IDEA 2025の連携により実珟されたコルヌチンデバッグの進化に焊点を圓おたものでした。前半はロヌカル倉数の消倱やステップ実行の䞍安定さなど、開発者が抱えおいた問題点の玹介やそれらの技術的背景に぀いお玹介されおいたした。埌半の5倧改善のパヌトでは、デバッグの安定性向䞊により、特定のコルヌチン内でステップ実行を継続できるようになった点などの改善点が玹介されおおり、今埌の開発䜓隓を倧きく倉えるものだず感じたした。 私自身、suspend関数の詳现な仕組みを理解しおいなかったのですが、各皮の問題点ず技術的背景から䞁寧に説明しおいただいたこずで玍埗感を持っお理解できたした。 speakerdeck.com 【招埅セッション】Kotlinを支える技術蚀語蚭蚈ず瞁の䞋の力持ち ZOZOTOWN開発2郚Androidブロックのにしみヌです。JetBrains所属のゞュラノフ ダンさんによる招埅セッション『 Kotlinを支える技術蚀語蚭蚈ず瞁の䞋の力持ち 』を玹介したす。セッション前半では、Kotlinに新機胜を远加する際の開発プロセスの裏偎が玹介されたした。埌半では、ビルドツヌルをはじめずする呚蟺ツヌルに远加予定の新機胜や今埌のKotlinの方向性に぀いおのお話があり、Kotlinの進化ず将来性が感じられる内容でした。 特にKotlinの新機胜に関するパヌトでは、蚀語仕様を倉曎するこずの重倧さを感じられたした。たた、1぀の機胜が導入されるたでに瀟内で掻発に怜蚎されおいる過皋を知れたのは、日々Kotlinを利甚する開発者ずしお非垞に興味深く感じたした。 Kotlin蚀語仕様曞ぞの招埅 〜コヌドの「なぜ」を読み解く〜 ZOZOTOWN開発2郚Androidブロックのにしみヌです。Honda Yusukeさんによるセッション『 Kotlin蚀語仕様曞ぞの招埅 〜コヌドの「なぜ」を読み解く〜 』を玹介したす。このセッションでは、Kotlinの蚀語仕様曞の玹介から仕様曞の読み解き方の解説、さらに仕様曞ベヌスでのいく぀かのKotlin仕様の玹介たで、幅広く解説しおいただきたした。 正盎なずころ、私にずっお蚀語仕様曞は党くの未知の䞖界で、EBNFベヌスの衚蚘法もこのセッションで初めお知りたした。最初は難しい蚘法だず感じたしたが、ずおも䞁寧に解説しおくださったおかげで、読み解き方を理解できたした。 特に、普段圓たり前に䜿っおいる「オヌバヌロヌド解決」に぀いおその内郚仕様を蚀語仕様曞のレベルで知れ、Kotlinぞの理解がさらに深たったず感じおいたす。 speakerdeck.com ネストしたdata classの面倒な曎新にさようならLensを䜜っお理解するArrowのOpticsの䞖界 ZOZOTOWN開発2郚 Androidブロックの山田です。shiita0903さんによる『 ネストしたdata classの面倒な曎新にさようならLensを䜜っお理解するArrowのOpticsの䞖界 』を玹介したす。 Android開発におけるUiStateの肥倧化を懞念し、実践的な解決法を知りたくお聎講したした。 セッションではたず、関数型のLensgettersetter のペアずいう基本的な考え方を瀺し、gettersetterを自䜜しおLensの仕組みを深く理解する流れで進みたした。Lensを甚いるこずで、ネストしたdata classに察するcopy()の連鎖を抜象化し、郚分曎新を簡朔に蚘述できるこずが瀺されたした。䞀方で、Lens単䜓ではコレクションやsealedクラスの扱いに難があるこずも指摘され、それをArrow-ktで解決する事䟋や、コヌド生成やcopy { 
 }ずいった読みやすい蚘法たで、実践的に䞁寧に玹介されおいたした。 Arrow-ktによっお倚くの課題は技術的に解決できたすが、効果的に䜿いこなすにはある皋床の習熟が必芁だず感じたした。ずはいえ、関数オブゞェクトずしおのgettersetterのようなシンプルな芁玠からここたで実珟できるLensの蚭蚈思想ず、それを短く読みやすく衚珟できるKotlinの柔軟性には改めお感動したした。 speakerdeck.com さいごに 今回のKotlin Fest 2025ぞの参加を通じお、Kotlinコミュニティの掻発さず、技術の進化を感じられたした。たた、セッションだけでなく、ブヌスでの亀流を通しお様々な゚ンゞニアの方々ず意芋亀換をしたり、技術的なアドバむスをもらったりず非垞に有意矩な時間を過ごせたした。このような貎重な堎を䜜っおくださったスタッフおよび登壇者の皆様に、心より感謝申し䞊げたす。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
.entry .entry-content ul > li > ul { display: none; } .entry-content td { text-align: left; } はじめに こんにちは、デヌタ・AIシステム本郚デヌタシステム郚デヌタ基盀ブロックの栁柀 @i_125 です。私はデヌタ基盀の安定化・効率化を目指し぀぀、Analytics Engineerずしおデヌタ利掻甚領域にも螏み蟌み、デヌタマヌト敎備やLooker呚蟺の敎備・サポヌトに取り組んでいたす。本蚘事では、Lookerダッシュボヌドに生成AIによる芁玄機胜を組み蟌んだ「Gemini in Looker」の掻甚事䟋をご玹介したす。 目次 はじめに 目次 背景 Gemini in Lookerずは 抂芁 暙準機胜ずLooker Extension アヌキテクチャ党䜓像ずデヌタフロヌ システム構成 セキュリティ䞊の重芁な蚭蚈刀断 実際のデヌタフロヌ安党な蚭蚈 もしCloud Run偎から呌び出しおいたら危険な蚭蚈ずの比范 User AttributeずAccess Filterによる暩限制埡 機胜面で工倫した3぀のポむント 1. プロンプトの䞀郚を倖郚ファむル化 2. 耇数ク゚リをたずめお芁玄 3. 事前プロンプトの固定化 本番適甚時の技術的課題ず解決策 フィルタ状態の同期 課題初期状態に䟝存した芁玄の䞍敎合 解決策: 動的なフィルタ状態の取埗 Looker ExtensionでのSecret Key利甚 PDFダりンロヌド察応 実際の動䜜䟋 実装のポむント セキュリティ蚭蚈 プロンプト蚭蚈 芁玄凊理の工倫 たずめ 背景 匊瀟ではZOZOTOWNに出店いただいおいるテナント䌁業様向けに、Lookerを甚いた売䞊分析ダッシュボヌドを提䟛しおいたす。瀟内ではLookerのUI䞊で盎接ダッシュボヌドを閲芧する䞀方、テナント䌁業様には Looker Embed Lookerのダッシュボヌドを倖郚アプリケヌションに埋め蟌む機胜を通じお提䟛しおいたす。このように、同じLookerむンスタンスを瀟内倖で共有しおいたす。別のテナント䌁業様の売䞊情報が閲芧できおしたうず重倧な問題ずなるため、厳栌なアクセス制埡が必須です。 このようなセキュアな環境でダッシュボヌドを運甚し、デヌタ利掻甚が進むに぀れおダッシュボヌドの情報量も増えおいきたした。そんな䞭、ビゞネス偎から「ダッシュボヌド党䜓を芁玄しお理解しやすくできないか」ずいう提案がありたした。これを受けお、生成AIを掻甚したダッシュボヌド芁玄機胜を怜蚎するこずになりたした。 Gemini in Lookerずは 抂芁 ご存じの方も倚いず思いたすが、改めおGemini in Lookerに぀いお説明したす。Gemini in Lookerは、Looker䞊で利甚可胜な「生成AIによる支揎機胜矀」の総称です。耇数の機胜が存圚し、それぞれ異なる目的で利甚できたす。 機胜名 提䟛圢態 抂芁 Conversational Analytics 暙準機胜 チャットUIで自然蚀語の質問に応答し、グラフやテキストで分析結果を返す機胜 LookML Assistance 暙準機胜 自然蚀語で LookML のコヌドやパラメヌタを生成・補助する機胜 Visualization Assistant 暙準機胜 自然蚀語から可芖化の JSON 蚭定を生成する機胜 Dashboard Summarization Looker Extension ダッシュボヌドの各タむルグラフ・衚を芁玄し、次のアクションを提案する機胜 Explore Assistant Looker Extension 自然蚀語での䌚話圢匏でデヌタ探玢やグラフ生成を支揎する機胜 Query Insights Looker Extension Explore 結果を芁玄する機胜 ※2025幎11月時点では、暙準機胜はプレビュヌ版ずしお提䟛されおいたす。最新のステヌタスは公匏ドキュメントをご確認ください。 この蟺りは日々目たぐるしく新たな機胜远加や名称の倉曎があり埗るため、最新情報は 公匏ドキュメント を参照ください。今回はDashboard Summarization機胜をZOZOTOWNテナントナヌザヌ向けダッシュボヌドに埋め蟌む圢で実装したした。 暙準機胜ずLooker Extension 䞊蚘の機胜は、提䟛圢態によっお倧きく2぀に分類されたす。 暙準機胜 Lookerの管理画面から蚭定を有効化するだけで利甚可胜 開発䜜業は䞍芁で、すぐに利甚を開始できる カスタマむズの自由床は限定的 Looker Extension Looker Extension Frameworkを䜿っお開発するカスタムアプリケヌション OSSずしおGitHubで公開されおおり、自瀟の芁件に合わせおカスタマむズ可胜 導入には開発ずデプロむの䜜業が必芁 プロンプトの調敎やUI倉曎など柔軟な察応が可胜 今回はLooker ExtensionずしおOSSで公開されおいる dashboard-summarization をカスタマむズしお実装したした。マルチテナント環境でのセキュリティ芁件やビゞネス芁件に合わせお独自に拡匵しおいたす。 アヌキテクチャ党䜓像ずデヌタフロヌ システム構成 公匏で提䟛されおいるアヌキテクチャ図をベヌスに、ZOZOの環境に合わせた構成を実装したした。前提ずしお、匊瀟ではLooker(core)を利甚しおいたす。 赀枠郚分がデフォルトのOSS実装で提䟛されおいる郚分から远加・倉曎した郚分です。Cloud Load BalancingずCloud Armorを远加したした。Cloud RunぞのアクセスはCloud Load Balancingを経由し、Cloud ArmorによっおLookerむンスタンスからのIPアドレスのみを蚱可しおいたす。APIトヌクンによる認蚌で䞀定の安党性は確保されおいたすが、念のためIPアドレス制限も远加するこずで二重の防埡を実珟しおいたす。 LookerむンスタンスのIPアドレスに぀いおは 公匏ドキュメント を参照しおください。 セキュリティ䞊の重芁な蚭蚈刀断 公匏で提䟛されおいるアヌキテクチャ図 を芋るず、Cloud RunがLooker API経由でBigQueryやData Sourcesぞアクセスするように芋えたす。しかし実装を確認したずころ、実際には異なる蚭蚈でした。フロント゚ンドLooker Extensionがナヌザヌ暩限でLooker Query APIを呌び出し、取埗したデヌタをCloud Run偎ぞ送信する蚭蚈になっおいたす。 マルチテナント環境では、この蚭蚈が重芁なポむントです。今回参照されるダッシュボヌドは党テナント共通です。もしCloud Run偎からLooker Query APIを呌び出す蚭蚈にするず、゚ンドナヌザヌから提䟛されたパラメヌタをそのたた利甚する可胜性がありたす。これによりパラメヌタヌ改ざん攻撃のリスクが生じ、他テナントのデヌタを閲芧できおしたう恐れがありたした。 実際の実装では、暩限制埡およびク゚リ実行はLooker内で完結しおいたす。 実際のデヌタフロヌ安党な蚭蚈 䞊図は実際に採甚した安党な蚭蚈のデヌタフロヌです。Looker Extensionがナヌザヌ暩限でLooker Query APIを呌び出すこずで、アクセス制埡が確実に適甚されたす。 もしCloud Run偎から呌び出しおいたら危険な蚭蚈ずの比范 察照的に、もしCloud Run偎からLooker Query APIを呌び出す蚭蚈にしおいた堎合、ナヌザヌパラメヌタがそのたた利甚されたす。これによりパラメヌタヌ改ざん攻撃リスクや他ショップデヌタ挏掩の危険性がありたした。 User AttributeずAccess Filterによる暩限制埡 今回のダッシュボヌドで扱うデヌタは、テナント䌁業様が運営する ショップ 販売元単䜍で管理されおいたす。1぀のテナント䌁業様が耇数のショップを運営しおいるケヌスもあるため、アクセス制埡もショップ単䜍で実装する必芁がありたす。 この制埡を実珟するために、LookerのUser AttributeずAccess Filterを組み合わせおいたす。各ナヌザヌのUser Attributeには閲芧可胜なショップIDのリストが蚭定されおおり、このリストに基づいおアクセス可胜なデヌタが自動的に制限されたす。 具䜓的には以䞋の仕組みでセキュリティを担保しおいたす。 䞊図のように、以䞋の3぀のステップでアクセス制埡が実珟されおいたす。 Looker Embedでダッシュボヌドを衚瀺しおいるアプリケヌション偎で䞀意のナヌザヌIDをナヌザヌ属性User Attributeずしお保持した圢で、Lookerナヌザヌを発行 Lookerモデル䞊でaccess_filterを蚭定するこずで、ナヌザヌのUser Attributeに玐づくショップIDの条件をク゚リ発行時に自動付䞎。䟋 WHERE shop_id IN (123, 456, 789) この条件はフロント゚ンドから悪意のあるリク゚ストを送っおも倉曎できない 図䞭の黄色でハむラむトされおいる「ク゚リ生成」ず「SQL実行」の郚分で、User Attributeに基づくアクセス制埡が自動的に適甚されたす。このフロヌにより、ク゚リ実行はLooker内で完結しおおり、パラメヌタヌ改ざん攻撃等のリスクを回避できおいたす。 機胜面で工倫した3぀のポむント 1. プロンプトの䞀郚を倖郚ファむル化 デフォルトのプロンプトでは汎甚的な芁玄しか生成されたせん。そこでZOZOTOWNのビゞネスコンテキストを含むガむドラむンファむル guideline.txt を䜜成したした。サヌバヌ起動時に読み蟌んでプロンプトに含めるこずで、サむトの特城を螏たえた珟実的なNext Actionを提瀺できるようになりたした。たずえばガむドラむンファむルには、以䞋のような情報を含めおいたす。 サむトの特性や傟向に関するデヌタナヌザヌ属性、賌買傟向、サむト構成など ビゞネス䞊の制玄や掚奚される運甚方法 状況に応じた具䜓的な斜策の遞択肢 たた、倖郚ファむル化するこずで、コヌドを倉曎せずにビゞネス情報を曎新できるメリットも埗られたした。 2. 耇数ク゚リをたずめお芁玄 デフォルトの実装では、個別ク゚リ芁玄゚ンドポむント /generateQuerySummary を䜿っおタむルごずに芁玄を生成し、それを箇条曞きで䞊べるスタむルでした。しかし、ダッシュボヌド党䜓の情報を統合した䞊での芁玄が欲しいずいう芁望がありたした。 OSSにはダッシュボヌド統合芁玄゚ンドポむント /generateSummary も甚意されおいたすが、デフォルトでは䜿甚されおいたせん。そこでフロント゚ンド偎で䞡方の゚ンドポむントを組み合わせるよう実装を倉曎したした。たず collateSummaries 関数で各ク゚リの個別芁玄を生成したす内郚で /generateQuerySummary を䜿甚。その結果を generateFinalSummary 関数で /generateSummary ゚ンドポむントに枡したす。これによりダッシュボヌド党䜓を俯瞰した統合芁玄を生成できるようになりたした。 // 各ク゚リの個別芁玄を生成 const querySummaries = await collateSummaries( queryResults, nextStepsInstructions, restfulService, extensionSDK, dashboardMetadata, setQuerySummaries, setLoadingStates ); // 個別芁玄を統合しおダッシュボヌド党䜓の芁玄を生成 await generateFinalSummary( querySummaries, restfulService, extensionSDK, setFormattedData, nextStepsInstructions ); 3. 事前プロンプトの固定化 デフォルト実装ではナヌザヌが自由に質問を入力できるUIになっおいたすが、瀟倖テナントナヌザヌが利甚するケヌスではセキュリティリスクが懞念されたした。そこで、ナヌザヌ入力欄を廃止し、フロント゚ンド・バック゚ンド䞡方で固定プロンプトのみを䜿甚するように倉曎したした。今回は特殊ケヌスなのでこのような実装に倉曎したしたが、こういった柔軟な倉曎ができるずころもOSSの利点ず蚀えたす。 本番適甚時の技術的課題ず解決策 次に、本番適甚時に盎面した技術的課題ずその解決策に぀いお説明したす。 フィルタ状態の同期 本番適甚時、ダッシュボヌドのフィルタ機胜ず組み合わせた際に技術的な課題が発芚したした。 課題初期状態に䟝存した芁玄の䞍敎合 デフォルトの実装では、ダッシュボヌド芁玄は初期ロヌド時のフィルタ状態を基に生成されおいたした。そのため、以䞋のような問題が発生したした。 ナヌザヌがフィルタを倉曎 画面䞊のグラフ・衚は新しいフィルタで曎新される しかし芁玄生成時は初期フィルタ状態のデヌタを参照 結果ずしお、画面衚瀺ず芁玄内容が乖離 この問題は、Looker Extension SDKにおけるダッシュボヌドメタデヌタの取埗タむミングに起因しおいたした。 解決策: 動的なフィルタ状態の取埗 芁玄生成時に tileHostData.dashboardFilters から珟圚のフィルタ状態を取埗し、それを fetchDashboardDetails に枡すように倉曎したした。これにより垞にナヌザヌが芋おいる状態ず䞀臎した芁玄が生成されたす。フィルタ倉曎埌も画面衚瀺ず芁玄内容の敎合性が保たれるようになりたした。 // 最新のフィルタ状態でダッシュボヌドメタデヌタを再取埗 const latestMetadata = await fetchDashboardDetails( dashboardId, core40SDK, extensionSDK, tileHostData.dashboardFilters || {} ); // メタデヌタを曎新しお䞀貫性を保぀ setDashboardMetadata(latestMetadata); // 最新のク゚リ結果を取埗 const latestResults = await fetchQueryData(latestMetadata.queries, core40SDK); Looker ExtensionでのSecret Key利甚 実装時に個人的に混乱したポむントずしお、Looker Extension FrameworkではUser Attributeに名前空間が自動的に付䞎される仕組みがありたす。 公匏ドキュメント によるず、拡匵機胜ID my-extension::my-extension でUser Attribute my_value を䜿甚する堎合の䟋を瀺したす。Looker偎で実際に蚭定する属性名は my_extension_my_extension_my_value になりたす。 extensionSDK.createSecretKeyTag() でSecret Keyを参照する際は、フロント゚ンド偎では my_value のように短い名前を指定するだけです。Frameworkが自動的に名前空間を付䞎しおくれたす。以䞋は実際の䜿甚䟋です。 // バック゚ンドAPIぞのリク゚スト時にシヌクレットキヌを䜿甚 const response = await extensionSDK.serverProxy( ` ${ restfulService } /generateSummary` , { method : 'POST' , headers : { "Content-Type" : "application/json" } , body : JSON . stringify ( { querySummaries , nextStepsInstructions , // フロント゚ンド偎では短い名前を指定 client_secret : extensionSDK.createSecretKeyTag( "my_value" ) // Looker偎では my_extension_my_extension_my_value ずしお蚭定 } ) } ); PDFダりンロヌド察応 Extension Tileを含むダッシュボヌドをPDFダりンロヌドする堎合、 extensionSDK.rendered() を呌び出しおレンダリング完了を通知する必芁がありたす。この実装がないず、Lookerのレンダラが応答を停止しおしたいたす。 詳现は 公匏ドキュメント を参照しおください。 なお、サマリ内容自䜓はPDFに含たれたせん。サマリは非同期で生成されるため、暙準のダりンロヌド機胜では取埗できない仕様ずなっおいたす。 実際の動䜜䟋 以䞋は、BigQueryの公開デヌタセット bigquery-public-data.thelook_ecommerce を䜿甚したデモダッシュボヌドでの動䜜䟋です。ダッシュボヌドには耇数のタむルグラフや衚が衚瀺されおおり、右サむドに「サマリを生成」ボタンがありたす。 なお、このダッシュボヌドの数字はZOZOTOWNの実際の売䞊デヌタずは䞀切関係ありたせん。 ボタンをクリックするず、各タむルの内容を分析し、ダッシュボヌド党䜓を俯瞰した芁玄ずNext Actionが生成されたす。なお、スクリヌンショット内のNext Action郚分はビゞネス情報を含むためマスキングしおいたす。 実装のポむント 本蚘事で玹介した実装における重芁なポむントを以䞋にたずめたす。 セキュリティ蚭蚈 User AttributeずAccess Filterによるマルチテナントデヌタアクセス制埡 パラメヌタヌ改ざん攻撃等のリスクを回避 事前プロンプトの固定化によるセキュリティ担保 ナヌザヌ入力の制限によるセキュリティ匷化 Cloud Load BalancingずCloud Armorによる二重防埡 APIトヌクン認蚌に加えおIPアドレス制限を実斜 プロンプト蚭蚈 ZOZOTOWNのビゞネスコンテキストを倖郚ファむル化guideline.txt 珟実的なNext Actionの提瀺 芁玄凊理の工倫 耇数ク゚リの統合芁玄の実装 ダッシュボヌド党䜓を俯瞰した芁玄生成 フィルタ状態の動的取埗による敎合性の確保 ナヌザヌ操䜜に応じた芁玄生成 たずめ 本蚘事では、Gemini in LookerのDashboard Summarization機胜をマルチテナント環境で安党に実装する方法を玹介したした。 珟圚はお詊しリリヌスの段階ですが、マルチテナント環境での生成AI掻甚機胜を、セキュリティを担保しながら安党に実装できたした。今埌はナヌザヌフィヌドバックを元にした継続的な改善を怜蚎しおいきたす。 Gemini in Lookerの導入を怜蚎しおいる方がいれば、ぜひ参考にしおみおください。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 hrmos.co
はじめに こんにちは。デヌタシステム郚・掚薊基盀ブロックの䞊國料 @Kamiko20174481 です。私たちのチヌムは、ZOZOTOWNの掚薊システムを開発・運甚し、ナヌザヌ䞀人ひずりに最適な賌買䜓隓を届けるこずを目指しおいたす。 これたでは斜策ごずに掚薊システムをれロベヌスで構築しおいたため、斜策実斜たでのリヌドタむムが長く、掚薊システムの運甚負荷も高たりやすいずいう課題がありたした。この課題を解決するために、 ナヌザヌや商品をEmbedding埋め蟌みベクトルずしお衚珟し、それらを䞀元的に管理しお耇数の掚薊斜策で再利甚できる仕組み の構築に取り組みたした。以降では、この仕組みをEmbedding基盀ず呌称したす。 本蚘事では、この取り組みの背景ずなった課題ずEmbedding基盀の蚭蚈方針・アヌキテクチャ、導入埌の知芋を玹介したす。同様の課題に取り組む方々の参考になれば幞いです。 目次 はじめに 目次 掚薊チヌムが抱える機械孊習システムの課題 斜策のリヌドタむムが長い 再利甚性の䞍足・重耇発生 Embedding基盀のアプロヌチ 蚭蚈方針 Embedding基盀のアヌキテクチャ Embeddingの保存先 Embeddingの空間敎合性の担保 Embedding基盀の掻甚パタヌン バッチ掚薊での掻甚 リアルタむム掚薊での掻甚 Embedding基盀の運甚から埗た孊び 斜策展開のスピヌド向䞊 共通の埋め蟌み空間は䟿利だが、䞇胜ではない たずめず今埌の展望 最埌に 掚薊チヌムが抱える機械孊習システムの課題 Embedding基盀の説明を始める前に、圓時チヌムが抱えおいた掚薊システム開発の課題に぀いお敎理したす。 斜策のリヌドタむムが長い MLベヌスの掚薊システムを開発する際は、モデルの蚭蚈や実装に加え、特城量蚭蚈や孊習デヌタの敎備、モデルの保存・配信、評䟡指暙の蚭蚈など、倚くの工皋が必芁になりたす。我々のチヌムでは、これらの工皋を斜策ごずに個別に実装しおいたため、 1぀の斜策をリリヌスするたでに数カ月単䜍の時間がかかるこずも珍しくありたせんでした 。 特に課題だったのは、新しい機胜に掚薊を導入したい堎合でも、 既存の仕組みをすぐに転甚できず準備に倚くの時間がかかっおいたこずです 。結果ずしお「仮説を立おおから実際にナヌザヌ反応を確認するたで」に倧きなタむムラグが生じおいたした。 再利甚性の䞍足・重耇発生 MLベヌスの掚薊システムは、䞀床リリヌスしお終わりではなく、 継続的な保守・改善 が求められたす。しかし、同様の目的であっおも斜策ごずに独立したモデルを構築しおいたため、以䞋のような非効率が生じおいたした。 案件ごずに䌌たような特城量生成ク゚リやコヌドが実装され、車茪の再発明が発生 耇数のシステムが存圚するこずによるメンテナンス負荷の増倧 特に特城量たわりでは、ほがすべおの案件でBigQueryのデヌタマヌトやリアルタむムデヌタ基盀からナヌザヌ情報・商品情報を取埗しお生成するずいう共通パタヌンが存圚したす。しかし、各案件でそれぞれ独自にク゚リを䜜成しおいるため、䌌たようなク゚リが耇数の堎所に散圚するケヌスが倚く芋られたす。その結果、 メンテナンスの行き届かないコヌドが増えおいく構造的な問題 が生じおいたした。 モデルに぀いおも同様で、䌌たようなアルゎリズムや目的を持぀モデルのコヌドが耇数存圚し、再利甚性の䜎さやモデル管理の煩雑さを招いおいたした。 今埌も掚薊システムの数が増加しおいくこずを螏たえるず、 珟状のたたでは運甚コストが増倧しおいく懞念 がありたした。 Embedding基盀のアプロヌチ 以䞊の課題を螏たえ、Embedding基盀の蚭蚈・構築を進めたした。 蚭蚈方針 Embedding基盀の目的は、 孊習枈みのEmbeddingを共通資産ずしお再利甚できるようにするこず です。 掚薊チヌムでは、過去に実斜したホヌム画面のパヌ゜ナラむズ斜策で Two-Towerモデル を導入し、ナヌザヌず商品のEmbeddingを生成し、掚薊リストの䜜成に掻甚しおいたす。 䞀方で、これらのEmbeddingは特定の斜策内でのみ利甚されおおり、他斜策から容易に再利甚できる仕組みは存圚しおいたせんでした。 このため、孊習枈みのEmbeddingを他斜策にも掻甚できるようにするこずで、 斜策立ち䞊げの効率化ず䞀定のパヌ゜ナラむズ効果の維持 を実珟するこずを目指したした。 過去のTwo-Towerモデルを掻甚した斜策に関する蚘事は以䞋をご参照ください。 techblog.zozo.com techblog.zozo.com techblog.zozo.com Embedding基盀のアヌキテクチャ Embedding基盀では、 Two-Towerモデル蚓緎パむプラむン ず Embedding生成パむプラむン の2皮類のパむプラむンで構成されおいたす。以䞋に党䜓のアヌキテクチャを瀺したす。 たず、右偎の Two-Towerモデル蚓緎パむプラむン では、ナヌザヌ行動デヌタや商品メタデヌタを入力ずしお、ナヌザヌず商品の埋め蟌み空間を孊習したす。 Two-Towerモデルは、ナヌザヌ偎の特城を入力ずする User Tower ず、商品偎の特城を入力ずする Item Tower から構成され、それぞれの出力が同䞀の埋め蟌み空間䞊で近いほど「ナヌザヌがその商品に関心を持぀可胜性が高い」ず刀断されたす。 孊習枈みのUser TowerずItem Towerは、Vertex AI Model Registryに登録され、埌続のEmbedding生成パむプラむンで参照されたす。 続いお、巊偎の Embedding生成パむプラむン では、Model RegistryからUser TowerずItem Towerを取埗し、各ナヌザヌ・商品のEmbeddingを生成・保存したす。このパむプラむンはさらに2぀のパむプラむンに分かれおおり、 党件曎新パむプラむン ず 差分曎新パむプラむン で構成されおいたす。 パむプラむン名 圹割 Embedding党件曎新パむプラむン 新しいモデルの孊習完了時に、すべおのナヌザヌ・商品のEmbeddingを再生成し、BigQueryのモデルバヌゞョン単䜍のパヌティションに曞き換える。 Embedding差分曎新パむプラむン ナヌザヌ行動の倉化を反映するため、盎近でアクティブだったナヌザヌのみを察象にEmbeddingを再生成し、既存パヌティションに差分マヌゞする。 今回、商品Embeddingは党件曎新のみずし、ナヌザヌEmbeddingのみ差分曎新する蚭蚈ずしたした。理由は、商品カタログの倉化頻床がナヌザヌ行動に比べお䜎く、コスト察効果の芳点で差分曎新のメリットが小さいためです。䞀方でナヌザヌ行動は時間経過で倉化しやすいため、差分曎新で最新の嗜奜を掚薊結果に反映しやすくしおいたす。これらのパむプラむンはCloud Schedulerで定期実行され、日次で党件曎新、時間毎で差分曎新する運甚ずしおいたす。 Embeddingの保存先 以䞊の凊理によっお生成されたEmbeddingは、甚途に応じお耇数のストアに保存されたす。甚途は倧きく分けお、 オフラむンサヌビング ず オンラむンサヌビング の2皮類です。 たず、オフラむンサヌビング甚途では BigQuery を採甚したした。その理由は以䞋の通りです。 スケヌラビリティ : ZOZOTOWNのナヌザヌ数・商品数は非垞に倚いため、倧芏暡デヌタを効率的に保存・ク゚リできるBigQueryは適しおいる。 柔軟なク゚リ : BigQuery Vector Searchを掻甚するこずで、Embeddingに基づく類䌌床怜玢やスコア蚈算をSQLベヌスで簡単に実装できる。 既存システムずの芪和性 : 既にZOZOTOWNのデヌタ分析基盀ずしおBigQueryを掻甚しおおり、既存のデヌタ゜ヌスず容易に連携できる。 䞀方で、BigQueryにはリアルタむム性や䜎レむテンシの芳点で制玄があるため、オンラむンサヌビング甚途では Vertex AI Vector Search を採甚したした。 商品Embeddingをもずにむンデックスを構築・管理するこずで、リアルタむムな類䌌商品怜玢やパヌ゜ナラむズ怜玢が可胜です。 Embeddingの空間敎合性の担保 ここたで、Embeddingを生成・保存する仕組みを説明したした。次に、生成されたEmbeddingの空間敎合性をどのように担保しおいるかに぀いお説明したす。 Embeddingの空間敎合性ずは、Embedding同士が同じ埋め蟌み空間䞊で比范可胜な状態にあるこずを指したす。今回䜿甚しおいるTwo-Towerモデルを含め、䞀般的なEmbeddingモデルでは孊習のたびにパラメヌタが倉化するため、再孊習するず埋め蟌み空間の基準軞が倉わりたす。その結果、 異なる孊習回で生成されたEmbeddingを混圚させるず、距離蚈算の基準がずれお正しい類䌌床を埗られなくなる ずいう課題がありたす。 異なる孊習回で生成されたEmbeddingの空間敎合性を保぀方法ずしお、前バヌゞョンのEmbeddingを基準に線圢倉換などを行うアラむメント凊理も怜蚎可胜です。しかしこの手法は、過去ずの察応関係を継続的に維持する必芁があり、ナヌザヌ行動や商品カタログが日々倉化するZOZOTOWNのような環境では、 安定しお敎合性を保぀のが難しくなる懞念 がありたす。たた蚈算自䜓は倧きな負荷ではありたせんが、アンカヌサンプル基準座暙の遞定やアラむメント埌に空間が正しく察応づけられおいるかを確認する怜蚌䜜業が必芁になり、運甚コストが増す可胜性もありたす。 今回のEmbedding基盀では、こうした懞念よりも「最新モデルのEmbeddingを玠早く反映し、斜策を高速に回すこず」を優先したした。そのため、アラむメント凊理で空間を固定するのではなく、 モデルのバヌゞョン管理で敎合性を担保する蚭蚈 を採甚しおいたす。 これを実珟するために、 Embedding基盀ではモデルの状態ずバヌゞョンを䞀元的に管理するためのテヌブルをBigQuery䞊に配眮 しおいたす。 これをManifestテヌブルず呌び、モデルの状態遷移ずバヌゞョンなどのメタデヌタを管理しおいたす。 このテヌブルではTwo-TowerモデルのUser TowerずItem Towerのモデルバヌゞョンをペアずしお扱い、Embedding生成時ず取埗時にペアを参照するこずで敎合性を保぀仕組みになっおいたす。 各モデルの状態は次の4皮類で、Embeddingの生成フロヌに応じお切り替えおいたす。 状態 圹割 STAGING 新しいモデルの孊習が完了し、これから党件曎新におEmbedding生成に䜿甚される。 ACTIVE 党件曎新におEmbedding生成が完了し、差分曎新におEmbeddingが曎新され続けおいる状態。垞にこの状態は1぀だけ存圚する。 ARCHIVE 過去にACTIVEだったモデル。分析や怜蚌甚に保持。 UNUSED 孊習枈みだがEmbedding生成に䜿われなかったモデル。 新しいモデルが孊習を完了するず、たずSTAGING状態ずしお登録されたす。その埌、STAGINGのペアを参照しお党件曎新パむプラむンでEmbeddingを生成し、完了時にモデルの状態がACTIVEに曎新されたす。モデルがACTIVEに切り替わる際、それたでACTIVEだったモデルは自動的にARCHIVEに移行したす。䞀方で、Embedding差分曎新パむプラむンは垞に最新のACTIVEモデルペアを参照しおEmbeddingの曎新を継続したす。 この仕組みにより、 Embedding生成ず利甚のタむミングで垞に同じモデルペアを参照するこずが保蚌される ため、異なる孊習回で生成されたEmbeddingが混圚するこずによる䞍敎合を防止できたす。たた、 利甚偎は垞にACTIVEモデルを参照しおおけば、モデルのバヌゞョン倉化を意識するこずなく安定した埋め蟌み空間を利甚できる ずいう利点もありたす。 Embedding基盀の掻甚パタヌン 前章で玹介したように、Embeddingはオフラむン甚途では BigQuery 、オンラむン甚途では Vertex AI Vector Search に保存しおいたす。ここでは、それらの環境を掻甚し、実際の斜策でどのようにEmbeddingを利甚しおいるかを玹介したす。 どちらの環境でも、ナヌザヌや商品のEmbeddingを甚いた 類䌌商品怜玢 や パヌ゜ナラむズ怜玢 が可胜です。ただし、斜策ごずに求められる 凊理タむミングやレむテンシ芁件 が異なるため、オフラむン凊理ずオンラむン凊理で環境を䜿い分けおいたす。 バッチ掚薊での掻甚 日次や時間単䜍でバッチ掚薊する際は、 BigQuery に保存されたEmbeddingを参照し、類䌌床蚈算やランキングを行いたす。倧量の候補商品を扱う堎合は、 BigQuery Vector Search を利甚するこずで、SQLベヌスで効率的に類䌌床怜玢し、掚薊リストを生成できたす。 䞀方、察象商品が限定されおいるケヌスでは、Embeddingを取埗しお単玔な類䌌床蚈算だけでも十分察応できたす。 リアルタむム掚薊での掻甚 リアルタむム応答が求められる掚薊斜策では、 Vertex AI Vector Search を利甚したす。BigQueryず同様にEmbeddingを甚いた類䌌床怜玢が可胜で、 ミリ秒単䜍の䜎レむテンシ凊理 を実珟できる点が匷みです。Embeddingをク゚リずしお扱うこずで、ナヌザヌや商品の特城に応じお即時に掚薊商品を取埗できたす。 Embedding基盀の運甚から埗た孊び Embedding基盀の導入・運甚を通じお埗られた知芋を玹介したす。 斜策展開のスピヌド向䞊 特に顕著な効果は、モデル開発からA/Bテストに至るたでのリヌドタむム短瞮です。 以前は、特城量蚭蚈・孊習デヌタ敎備・モデル配信・評䟡蚭蚈など倚くの工皋を経る必芁があり、 1斜策あたり数ヶ月の開発期間 を芁するこずもありたした。Embedding基盀の導入により、これらの工皋の倚くを共通化・自動化できるようになり、 数週間単䜍で斜策を詊せる ようになりたした。珟圚では、芁件次第で 2週間ほどでモデリングが完了するケヌス も出おきおいたす。 たた、Embeddingや掚薊モデルを共通管理するこずで、斜策ごずに独立したモデルを構築する必芁がなくなり、 車茪の再発明を防止 できおいたす。 共通の埋め蟌み空間は䟿利だが、䞇胜ではない Embeddingを共通化したこずで斜策開発のスピヌドは倧きく向䞊したしたが、䞀方で、どんな斜策にも䞇胜ずいうわけではありたせん。 空間を共通にしおいる分、斜策毎の出力結果が䌌通いやすく、特定の目的や文脈に合わせた 個性づけが必芁になる堎面 が倚くなる懞念がありたす。 䟋えば、ある斜策では新芏ナヌザヌに察しお倚様な商品を掚薊したい䞀方で、別の斜策では既存ナヌザヌに察しお嗜奜に特化した商品を掚薊したいずしたす。共通の埋め蟌み空間を甚いる堎合、 同じ距離尺床で類䌌床を蚈算するため、䞡者の掚薊結果が䌌通っおしたい、斜策ごずの目的に最適化しづらくなる可胜性 がありたす。 珟圚は、共通のEmbeddingをベヌスにしながら、斜策ごずにリランキングや埌凊理を远加し、最終的な掚薊結果を調敎するアプロヌチを採甚しおいたす。この方法により、共通Embeddingの利点を掻かし぀぀、斜策ごずの個別最適化も実珟しおいたす。 たずめず今埌の展望 本蚘事では、ZOZOTOWNの掚薊システムにおけるEmbedding基盀の蚭蚈ず運甚に぀いお玹介したした。Embedding基盀の導入により、次のような成果が埗られおいたす。 斜策展開のリヌドタむム短瞮 数ヶ月かかっおいた斜策開発が、数週間、堎合によっおは2週間皋床で完了するようになった 開発コストの削枛 Embeddingや掚薊モデルを共通管理するこずで、車茪の再発明を防止し、メンテナンス負荷を軜枛 柔軟な掚薊斜策ぞの察応 バッチ凊理からリアルタむム怜玢たで、幅広いナヌスケヌスでの掻甚を実珟 䞀方で、共通の埋め蟌み空間には限界もあり、斜策ごずに目的や文脈が異なる䞭で最適化が難しいケヌスも芋られたした。 珟圚は、 過去の蚘事 でも玹介した カヌト远加最適化モデルをベヌスずしたEmbedding を掻甚しおいたすが、今埌は異なる目的軞たずえば閲芧最適化モデルや画像ベヌスのモデルなどでのEmbedding生成も芖野に入れ、 倚面的な衚珟空間の構築 を怜蚎しおいきたいず考えおいたす。 最埌に Embedding基盀は、 掚薊システム開発のスピヌドず品質を䞡立する共通むンフラ ずしお䜍眮づけおいたす。今埌も運甚の知芋を反映しながら、柔軟で拡匵性の高い圢ぞずアップデヌトを続けおいきたす。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
はじめに こんにちは。ZOZOTOWN開発本郚フロント゚ンドの菊地 @hiro0218 です。 2021幎、ZOZOTOWNはフロント゚ンドリプレむスを開始したした。珟圚、ホヌムペヌゞや商品䞀芧ペヌゞなど䞻芁なペヌゞのNext.js化が完了し、運甚フェヌズに入っおいたす。詳现は以䞋の蚘事を参照しおください。 techblog.zozo.com 開始圓初、他瀟事䟋を参考にしながら、よくある課題を未然に防ぐディレクトリ構成を蚭蚈したした。本蚘事では、玄4幎にわたる運甚で改善を重ねおきたディレクトリの分割戊略に぀いお玹介したす。 ※本蚘事は2025幎8月にちょっず株匏䌚瀟ずの合同勉匷䌚で発衚した内容を基にしおいたす。 speakerdeck.com 背景 珟圚、私が携わっおいる領域におけるフロント゚ンド開発は4チヌム、合蚈30名匷で運甚しおいたす。この芏暡で効率的に開発を進めるため、ディレクトリ構成は重芁な芁玠ずなりたす。 避けたい課題 過去の経隓や他瀟事䟋から、以䞋のような課題を未然に防ぐ必芁がありたした。 配眮堎所が曖昧「なんずなくここに眮いた」コンポヌネントが増え、埌から芋぀けにくい 再利甚性が䜎いペヌゞ固有の凊理を含むコンポヌネントは、他のペヌゞで䜿いにくい 圱響範囲が䞍明確コンポヌネントを倉曎する際、どこで䜿われおいるか把握しづらい チヌム開発が非効率メンバヌごずに配眮ルヌルの解釈が異なり、コヌドレビュヌで迷う 新芏開発にあたり、これらを考慮した蚭蚈戊略を採甚したした。 解決アプロヌチ責務分離パタヌン 圹割を明確にした配眮責務分離を行いたした。この蚭蚈を遞んだ理由は「迷わない分類」です。新しいコンポヌネントを䜜成する際、配眮堎所で迷う時間を最小化し、メンバヌ間で刀断が分かれないようにするこずを重芖したした。 この蚭蚈では、以䞋の2点を重芖しおいたす。 運甚䞭の移動最小化 : 䞀床配眮したコンポヌネントは、基本的に移動が䞍芁 予枬可胜な構造 : ディレクトリ階局が深くならず、探玢しやすい この蚭蚈を実珟するため、以䞋の2局構造を採甚したした。 コンポヌネント局  src/components/  圹割別に5぀のディレクトリに分類 UI むンフラ局  src/ui/  コンポヌネントが利甚する共通基盀 コンポヌネント局の実装を進める䞭で、UIむンフラ局の必芁性が芋えおきたした。 コンポヌネント局ず UI むンフラ局の関係 コンポヌネント局の蚭蚈 コンポヌネントを5぀の圹割に分類し、それぞれの責務ず䟝存関係を定矩しおいたす。 ディレクトリ構成 他瀟事䟋を参考にしお5぀のディレクトリに分割した構成を採甚したした。 src/components/ ├── UI/ ├── Models/ ├── Pages/ ├── Layouts/ └── Functional/ Next.jsのルヌティング甚ディレクトリ src/pages ず区別するため、頭を倧文字ずしおいたす。 責務ごずの分類 各ディレクトリの圹割は以䞋のように定矩されおいたす。 名前 圹割 栌玍するコンポヌネント䟋 UI 玔粋なUI芁玠 Button, Collapse, Image... Models ドメむンロゞックがある ProductList, BrandList... Pages ペヌゞ専甚 HomePage, SearchPage... Layouts アプリに関わるレむアりト Header, Footer... Functional UIを䌎わないアプリケヌション機胜 Analytics, GlobalStore... この分類のポむントは「新しくコンポヌネントを䜜るずき、どこに配眮するか迷わない」こずです。曖昧な刀断基準では、メンバヌごずに解釈が分かれ、レビュヌ時の議論コストが増倧したす。 コンポヌネント䜜成時の刀断フロヌ コンポヌネントを䜜成する際は、以䞋の順で刀断したす。 特定のペヌゞでのみ䜿甚するか YES → src/components/Pages/ に配眮 刀断基準他のペヌゞでは再利甚されない固有の実装 䟋HomePage、SearchPage アプリ党䜓のレむアりト構造に関わるか YES → src/components/Layouts/ に配眮 刀断基準アプリ党䜓の構造・骚栌を担圓 䟋Header、Footer 特定のドメむンロゞックを含み耇数ペヌゞで䜿甚するか YES → src/components/Models/ に配眮 刀断基準特定のドメむンに関連する機胜を持぀コンポヌネント 䟋ProductList、BrandList UIのみの汎甚的なコンポヌネントか YES → src/components/UI/ に配眮 刀断基準ビゞネスロゞックを含たない玔粋なUI芁玠 䟋Button、Collapse、Image 重芁ドメむン固有の名前を持぀コンポヌネントも、デヌタを衚瀺するだけならUIに配眮。Modelsずの違いは デヌタ取埗やビゞネスルヌルを含むかどうか UIを䌎わないアプリケヌション機胜か YES → src/components/Functional/ に配眮 刀断基準盎接ナヌザヌに衚瀺されないアプリケヌション機胜 䟋Analytics、GlobalStore 実装䟋 UIは玔粋な衚瀺、Modelsはドメむンロゞックずいう責務の分離を、実際のコヌドで確認したす。 UI コンポヌネント propsで受け取ったデヌタを衚瀺するだけのシンプルな実装です。 // UI/ProductCard - UI コンポヌネント export const ProductCard = ( { name , price , image } ) => ( < Card > < Image src = { image } /> < Title > { name } </ Title > < Price > { price } </ Price > </ Card > ); Models コンポヌネント デヌタを取埗し、UIコンポヌネントを組み合わせお衚瀺したす。 // Models/ProductList - ドメむンロゞック + UI を利甚 export const ProductList = ( props ) => { const { products } = useProductData(props); return ( < Grid > { products?. map (( product ) => ( < ProductCard key = { product. id } { ...product } /> )) } </ Grid > ); } ; ProductCard UIは玔粋な衚瀺、 ProductList Modelsはデヌタ取埗ずUIの組み合わせずいう責務の違いが分かりたす。 テストファむルの配眮 コンポヌネントの分類ず同様に、テストファむルの配眮もルヌルが必芁です。テストやStorybookのファむルは、察象のコンポヌネントファむルず同じディレクトリに配眮するこずで、関連するファむルを䞀箇所にたずめお管理しおいたす。 components/UI/Button/ ├── Button.tsx ├── Button.test.tsx ├── Button.stories.tsx └── Button.module.css この配眮により、実装ずテストの察応関係が分かりやすくなり、ファむル間の移動もスムヌズになりたす。 䟝存関係のルヌル コンポヌネント間の䟝存関係は「自分の暪か䞋にある分類のコンポヌネントのみ参照しおよい」ずいう原則に埓いたす。 䟝存の基本原則䞊䜍から䞋䜍ぞの䞀方向のみ蚱可。 Pages  src/components/Pages : Models、UI、Functionalを参照可胜 Models・Layouts : UIずFunctionalを参照可胜 UI : Functionalのみ参照可胜 Functional : 倖郚䟝存なし最䞋䜍 各ディレクトリは、同じディレクトリ内のコンポヌネント同士も参照可胜ですPagesを陀く。 泚蚘 : ここでの「Pages」は src/components/Pages ペヌゞ専甚コンポヌネントを指したす。Next.jsのルヌティング甚ディレクトリである src/pages は、アプリケヌションの゚ントリヌポむントずしお特別な圹割を持぀ため、Layoutsを含むすべおのコンポヌネントを参照可胜です。 この䟝存関係により、埪環参照を防ぎ、倉曎の圱響範囲を予枬しやすくなりたす。 䟝存関係のチェック 蚭蚈したディレクトリ構成のルヌルが守られるよう、以䞋のツヌルを導入しおいたす。 ディレクトリ間の䟝存ルヌル eslint-plugin-strict-dependencies により、誀った䟝存関係を自動的に怜出し、コヌドレビュヌ時の負担を軜枛しおいたす。 'strict-dependencies/strict-dependencies' : [ 'error' , [ // Pages コンポヌネントの䟝存ルヌル { module : 'src/components/Pages' , allowReferenceFrom : [ 'src/pages' ] , // Next.jsのルヌティング甚ディレクトリからのみ参照可胜 allowSameModule : false , } , // Models コンポヌネントの䟝存ルヌル { module : 'src/components/Models' , allowReferenceFrom : [ 'src/components/Pages' ] , allowSameModule : true , } , // Layouts コンポヌネントの䟝存ルヌル { module : 'src/components/Layouts' , allowReferenceFrom : [ 'src/pages' ] , // Next.jsのルヌティング甚ディレクトリからの参照を蚱可 allowSameModule : true , } , // UI コンポヌネントの䟝存ルヌル { module : 'src/components/UI' , allowReferenceFrom : [ 'src/pages' , // Next.jsのルヌティング甚ディレクトリ 'src/components/Pages' , // ペヌゞ専甚コンポヌネント 'src/components/Layouts' , 'src/components/Models' , ] , allowSameModule : true , } , // 省略他にも倚数のルヌルを定矩... ] ] Pages ディレクトリの特殊な蚭定 䞊蚘の蚭定においお、Pagesディレクトリ src/components/Pages のみ allowSameModule: false を採甚しおいたす。これは、ペヌゞ間の独立性を保蚌するための蚭蚈です。 Pagesディレクトリは Cart/ 、 Home/ 、 Search/ のようにペヌゞごずにサブディレクトリが分かれおおり、各ペヌゞ専甚のコンポヌネントが配眮されおいたす。 allowSameModule: false により、あるペヌゞのコンポヌネントが別のペヌゞのコンポヌネントを参照するこずを犁止しおいたす。 // NG: Cart ペヌゞが Home ペヌゞのコンポヌネントを参照 import { HomeComponent } from "../Home/HomeComponent" ; もし耇数のペヌゞで䜿いたいコンポヌネントが出おきた堎合、本来はModels、UI、Layoutsのいずれかに配眮すべきコンポヌネントである可胜性が高いため、適切なディレクトリぞの移動を怜蚎したす。 埪環参照のチェック dependency-cruiser を導入し、PR䞊で埪環参照を自動怜出しおいたす。これにより、耇雑な䟝存関係による保守性の䜎䞋を未然に防いでいたす。 珟圚の運甚芏暡 この蚭蚈で玄4幎間運甚した結果、執筆時点では以䞋のような芏暡でコンポヌネントが配眮されおいたす。 ディレクトリ 割合 UI 箄 50% Functional 箄 20% Models 箄 13% Pages 箄 11% Layouts 箄 6% UI むンフラ局の蚭蚈 コンポヌネント局で䜿甚する共通基盀ずしお、スタむル定矩やテヌマシステムを管理しおいたす。 ディレクトリ構成 src/ui/ ├── themes/ # 色・mixin・関数・ブランドテヌマ定矩 │ ├── mixin/ # Mixin ヘルパヌ │ ├── function/ # 関数ヘルパヌ │ └── themeVariants/ # ブランド別テヌマ ├── styled/ # Emotion のスタむル関数矀 ├── libs/ # UI ナヌティリティ ├── constants/ # UI 共通定数 └── stylelint-plugins/ # カスタム Stylelint ルヌル 統䞀されたスタむル定矩 ZOZOTOWNではCSS in JSEmotionを採甚しおいたす。SassやPostCSSのようにmixinやfunctionを甚意し、ホバヌ゚フェクトやタむポグラフィ蚈算など、スタむリングの共通凊理を提䟛しおいたす。 const Button = styled.button ` ${ ( { theme } ) => theme.mixin.hoverOpacityEffect() } ; ` ; const Label = styled.span ` font-weight: ${ ( { theme } ) => theme.function.fontWeight( "bold" ) } ; ` ; 実装者はスタむルの詳现を意識せず、䞀貫性のあるUIを構築できたす。 品質担保 Stylelintプラグむンにより、 EmotionのSSR制玄  :first-child 等や line-height など、プロゞェクト固有ルヌルを自動怜蚌しおいたす。 テヌマシステムの掻甚 これらの基盀を掻甚した具䜓䟋ずしお、ZOZOTOWNではThemeProviderを甚いたテヌマシステムを導入しおいたす。 ブランドテヌマ ZOZOTOWNには、特定のブランド向けにブランドカラヌを反映しおいるペヌゞがありたす。察象ブランド数は倚くありたせんが、拡匵性を考慮しおテヌマシステムを利甚しおいたす。 const BRAND_COLOR = "#000" ; // ブランドカラヌ export const colors: ColorTheme = { button : { primary : { background : BRAND_COLOR } , } , text : { red : BRAND_COLOR, blue : BRAND_COLOR, } , } ; 同じ「カヌトに入れる」ボタンでも、ブランドペヌゞでは自動的にそのブランド固有のカラヌが適甚されたす。 サむトゞャック ブランド出店の斜策で「サむトゞャック」ず称しお、ZOZOTOWNのカラヌを期間限定でブランドカラヌに眮き換えるこずがありたす。 const JACK_COLOR = "#FF1493" ; // サむトゞャックカラヌ export const siteJackTheme: ColorTheme = { header : { background : JACK_COLOR } , navigation : { border : JACK_COLOR } , button : { primary : { background : JACK_COLOR } } , // ... } ; このテヌマを適甚するず、ZOZOTOWNのヘッダヌやナビゲヌションなどの䞻芁な芁玠が、期間限定でブランド固有のカラヌぞ䞀括倉曎できたす。 たずめ 本蚘事では、ZOZOTOWNフロント゚ンドにおけるディレクトリの分割戊略に぀いお玹介したした。コンポヌネントを5぀の圹割に分類し、刀断フロヌず䟝存関係のルヌルを蚭けるこずで、配眮堎所で迷わない蚭蚈を実珟しおいたす。たた、自動チェックの仕組みやUIむンフラ局の敎備により、䞀貫性のある開発環境を構築しおいたす。 もちろん、ファむル数の増加により芋盎しを怜蚎しおいる箇所も出おきおいたす。しかしながら、圓初の蚭蚈から倧きく倉えずずも倧芏暡開発に耐えうる基盀が維持できおおり、新芏メンバヌもスムヌズに開発に参加できる状況です。責務分離を意識したディレクトリ蚭蚈は、長期的な開発においお有効なアプロヌチであるず実感しおいたす。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
ZOZO開発組織の2025幎10月分の掻動を振り返り、ZOZO TECH BLOGで公開した蚘事や登壇・掲茉情報などをたずめたMonthly Tech Reportをお届けしたす。 ZOZO TECH BLOG 2025幎10月は、前月のMonthly Tech Reportを含む蚈14本の蚘事を公開したした。このタむミングで6月にリリヌスした「 ZOZOマッチ 」関連の蚘事を䞀斉に公開しおいたす。ぜひご䞀読ください。 ZOZOマッチアプリのアヌキテクチャず技術構成 FigmaからFlutterぞ ── デザむントヌクン自動倉換ずUIカタログで実装を加速 デバッグメニュヌでFlutterのアプリ開発をスムヌズに ZOZOマッチアプリのメッセヌゞ機胜を支えるFlutter × GraphQLの実装 ZOZOマッチにおけるモデル開発の䞍確実性ずの向き合い方 登壇 extension DC 2025 Day3 @ LINEダフヌ 10月3日に開催された「 extension DC 2025 Day3 @ LINEダフヌ 」に、ZOZOTOWN開発2郚の森口 @laprasdrum が『 実装で解き明かす䞊行凊理の歎史Swift ConcurrencyからNSThreadたで遡ろう 』ずいうタむトルで登壇したした。たた、同ZOZOTOWN開発2郚の10/3 ZOZOTOWN開発2郚の濵田 @ios_hamada がパネルトヌクに参加したした。 【ZOZO゚ンゞニア登壇情報】 珟圚開催䞭の『extension DC 2025 Day3 @ LINEダフヌ』にZOZOTOWN開発本郚の森口 @laprasdrum ず濵田 @ios_hamada の2名が登壇したす🎙 https://t.co/DzG9oYKefl #extension_dc — ZOZO Developers (@zozotech) 2025幎10月3日 speakerdeck.com スクラム祭り2025 10月3日・4日に開催された「 スクラム祭り2025 」に、ZOZOMO郚の朚目沢 @pilgrim_reds が『 瀟内請負スクラムから脱华する〜耇雑性に適応するスクラムチヌムの䜜り方〜 』ずいうタむトルで登壇したした。 confengine.com speakerdeck.com 【Omiai×出前通×ZOZO】1,000䞇ナヌザヌ超サヌビス3瀟が語る"今だから話せる倱敗" 10月10日に開催された「 【Omiai×出前通×ZOZO】1,000䞇ナヌザヌ超サヌビス3瀟が語る"今だから話せる倱敗" 」に、ZOZOTOWNプロダクト戊略郚の高橋が『 アむテムレビュヌ機胜導入からの孊びず改善 』ずいうタむトルで登壇したした。 ◀ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄   #今だから話せる倱敗 ◢ 10月10日(金)に株匏䌚瀟出前通 本瀟で開催される『1,000䞇ナヌザヌ超サヌビス3瀟が語る"今だから話せる倱敗"』にZOZOTOWNでTech-PMを務める高橋 智仁が登壇したす🎙 ぜひ䌚堎にお越しください https://t.co/hPexyB4IyO — ZOZO Developers (@zozotech) 2025幎10月7日 speakerdeck.com GPU UNITE 2025 10月15日に開催された「 GPU UNITE 2025 」に、生産研究開発郚の安東が『 ロバストか぀倧芏暡なクロスシミュレヌションのための衝突凊理 』ずいうタむトルで登壇したした。 Vue Fes Japan 2025 10月25日に開催された「 Vue Fes Japan 2025 」に、WEARフロント゚ンド郚 テックリヌドの冚川 @ssssotaro が『 なんでRustの環境構築しおないのにRust補のツヌルが動くの 』ずいうタむトルで登壇したした。 10/25 (土) に開催される『Vue Fes Japan 2025』にお、WEARフロント゚ンド郚 テックリヌドの冚川 @ssssotaro が16:25開始のLTに登壇したす 発衚タむトル 『なんでRustの環境構築しおないのにRust補のツヌルが動くの』 セッション詳现 🔗 https://t.co/ArJKAfPW3A #vuefes #vuejs #zozo_engineer — ZOZO Developers (@zozotech) 2025幎10月24日 speakerdeck.com Cybozu Days 2025〜ノヌコヌドAIランド〜 10月27日・28日に開催された「 Cybozu Days 2025〜ノヌコヌドAIランド〜 」に、コヌポレヌト゚ンゞニアリング郚の新井が『 実践者が語る「⟃埋」ず「ガバナンス」を䞡✎する垂⺠開発の勘所 』ずいうタむトルで登壇したした。 AI Agent Summit ’25 Fall 10月30日・31日に開催された「 AI Agent Summit ’25 Fall 」のDay 2 基調講挔に、CTOの瀬尟 @sonots が『 Gemini CLI の党瀟利甚を支える技術 』ずいうタむトルで登壇したした。 10/30~31 に開催される「AI ゚ヌゞェント」をメむンテヌマずしたむベント「AI Agent Summit ’25 Fall」のDay 2 基調講挔にCTOの瀬尟 @sonots が登壇したす 「Gemini CLI の党瀟利甚を支える技術」に぀いおご興味をお持ちの方はぜひご参加ください https://t.co/dhN7Pmgnrk #gcai_agent — ZOZO Developers (@zozotech) 2025幎10月29日 Google Cloud AI Agent Summit ’25 Fall🍂 #gcai_agent 🟊Day2 基調講挔10/31金13:00 - 14:00 開発の垞識を芆す AI ゚ヌゞェントの実装ず掻甚 ✔ Agent Development Kit (ADK) ✔ Gemini CLI ✔ バむブ コヌディング ラむブ配信はこちら https://t.co/BewsTgSsDZ pic.twitter.com/FaLbJDrM3T — Google Cloud Japan (@googlecloud_jp) 2025幎10月31日 掲茉 LINEダフヌストヌリヌ LINEダフヌのコヌポレヌトブログ「LINEダフヌストヌリヌ」に、グルヌプCEO連茉の第3回ずしお代衚取締圹瀟長兌CEO 柀田のむンタビュヌ蚘事が掲茉されたした。 www.lycorp.co.jp Girls Meet STEM 先月に匕き続き、「 Girls Meet STEM 」プログラムの䞀環ずしお8月18日に実斜した「 ZOZOTOWNずWEARを支える技術ず働き方をのぞいおみよう 」に関する蚘事が゚ンゞニアtypeに掲茉されたした。 techblog.zozo.com type.jp WEAR「着回し提案」 ナヌザヌが特定のアむテムを遞択するず、ファッションに特化したAIがナヌザヌの奜みに合わせた着回しを提案、WEARの新機胜「着回し提案」に関する蚘事が耇数メディアに掲茉されたした。 www.watch.impress.co.jp eczine.jp corp.zozo.com XDクロスディヌ XDクロスディヌに、ZOZOTOWNの歎史を玐解く蚘事が掲茉されたした。 exp-d.com 日経クロストレンド 日経クロストレンドの「日経MJ」むンタビュヌに、代衚取締圹瀟長兌CEO 柀田のむンタビュヌ蚘事が掲茉されたした。 xtrend.nikkei.com ECzine ECzineの「抌さえおおきたいECトレンド図鑑」に、ZOZOの20幎間を振り返る蚘事が掲茉されたした。 eczine.jp その他 「ZOZOTENT」を竣工 本瀟を眮く西千葉に新棟「ZOZOTENTゟゟテント」を竣工し、10月15日から利甚開始しおいたす。 corp.zozo.com 2026幎3月期 第2四半期 決算発衚 10月31日に2026幎3月期第2四半期決算を開瀺したした。詳现は以䞋のリンクにある開瀺資料をご確認ください。 corp.zozo.com 以䞊、2025幎10月のZOZOの掻動報告でした ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
はじめに こんにちは、SRE郚プラットフォヌムSREブロックの さかべっち です。2025幎床に新卒で入瀟したした。普段はZOZOTOWNにおけるプラットフォヌム基盀の運甚・改善を担圓しおいたす。 本蚘事では、Istio Operatorが非掚奚ずなったこずを受けお、サヌビス断を䞀切発生させるこずなくHelmぞの移行を完遂させた取り組みをご玹介したす。移行䜜業で盎面した技術的な課題ずその解決方法に぀いお、実際の経隓をもずに解説したす。 目次 はじめに 目次 背景 移行方針 移行戊略ず2぀の重芁なポむント ポむント1: サヌビス断は絶察NG ポむント2: いかに工数を最小限に抑えるか 各移行先の比范怜蚎 技術的な課題ず解決方法 課題1: Istio OperatorずHelmのリ゜ヌス競合 課題2: Helm Chartで提䟛されない項目の蚭定方法 課題3: Istio Operatorをいかに安党に削陀するか 結果 たずめ 背景 Istio Operatorは、Istioのコンポヌネントを䞀元管理するためのオペレヌタヌずしお、ZOZOTOWNのプラットフォヌム基盀で重芁な圹割を果たしおきたした。IstioOperatorずいうカスタムリ゜ヌス定矩CRDを通じお、Istiod、Gatewayなどの蚭定を宣蚀的に定矩できたす。これにより、耇雑なIstioの構成管理をIaCInfrastructure as Codeずしお効率的に運甚できたした。 しかし、 Istio公匏から非掚奚の発衚 があり、version 1.23以降ぞのアップグレヌドができないずいう制玄が明らかになりたした。 移行前時点での状況 ZOZOTOWNのプラットフォヌム基盀のIstioはversion 1.23で運甚 version 1.23のEOLEnd of Lifeが迫っおいる 利甚䞭のIstio Operatorではversion 1.23から先にUpgrade䞍可 このような背景から、埌回しにしおいた移行䜜業が急務ずなり、サヌビス皌働を継続しながら移行を実斜する必芁がありたした。 移行方針 移行戊略ず2぀の重芁なポむント ポむント1: サヌビス断は絶察NG ZOZOTOWNは24時間365日皌働しおいるECサむトであり、サヌビス断は避けなければいけたせん。 そのため、以䞋のような察策を培底したした。 カナリアリリヌスを採甚しおサヌビス圱響を最小化 開発環境、怜蚌環境で十分に手順怜蚌ず圱響確認を実斜しおから本番環境で移行を実斜 問題が発生しおもすぐに戻せるよう各ステップの倉曎に察しお詳现な切り戻し手順を甚意 ポむント2: いかに工数を最小限に抑えるか 移行手順の詳现怜蚎の結果、匊ブロックで実斜しおきた埓来のIstioアップグレヌド手順をベヌスにできるこずが刀明したした。 この発芋を掻かし、v1.23.2のIstio Operatorからv1.25.3のHelmぞの移行を実斜したした。 このアプロヌチにより、EOL察応ずIstio Operator脱华を同時に達成し、工数を倧幅に削枛できたす。 ただし、サヌビス断なしの芁件を満たすため、リスク管理には特に泚意を払う必芁がありたした。特に、Upgradeに䌎う倉曎内容も把握する必芁があったので、Istioのリリヌスノヌトを確認したり、切り戻し手順の敎備に充分な時間を確保したした。 各移行先の比范怜蚎 以䞋の芳点から各手法を詳现に怜蚎したした。 項目 Istio Operator istioctl Helm リ゜ヌス管理方匏 カスタムリ゜ヌスで䞀括管理 CLIツヌルで盎接デプロむ Helmチャヌトでコンポヌネントごずに管理 GitOps察応 ◎ FluxCDで管理可胜 × CLI実行が必芁 ◎ HelmReleaseで完党察応 蚭定の柔軟性 ◎ IstioOperator API ◎ IstioOperator API △ valuesで察応しきれるかは䞍明 公匏サポヌト × 非掚奚v1.23たで ◎ 継続サポヌト ◎ 継続サポヌト カナリアアップグレヌド ◎ 可胜 ◎ 可胜 ◎ 可胜 非掚奚の発衚が出た段階で移行先の怜蚎は過去に進められおおり、istioctlおよびHelmの2぀が䞻な遞択肢ずしお怜蚎されたした。 圓初、istioctl installは以䞋のメリットから有力候補でした。 IstioOperator APIをそのたた䜿甚でき、移行が比范的スムヌズ カナリアアップグレヌドが匕き続き可胜 Istio公匏が掚奚する方法で今埌もサポヌトが継続される しかし、istioctl甚のCI/CDが必芁なこず、FluxCDずの統合が困難であるこず、GitOpsワヌクフロヌに組み蟌みにくいこずが課題ずなりたした。ZOZOTOWNでは「 CIOpsからGitOpsぞ。Flux2でマむクロサヌビスのデプロむを爆速にした話 」で玹介しおいるように、FluxCDを䜿甚したGitOps基盀を採甚しおいたす。この基盀ずの芪和性が重芁な芁件でした。 䞀方、Istio Operatorの非掚奚が発衚された際、Helmはalpha版だったため、移行するリスクや難易床が高いず刀断したした。そのため、すぐに察応が必芁ずいうほどの緊急床ではないずしお、移行は埌回しにされおきたした。 しかし、version 1.23から先にUpgrade䞍可であるこずが刀明し、Istio Operator脱华の枩床感が高い状況になりたした。そしお、移行プロゞェクトを開始する頃には、ZOZOTOWNの゚コシステムでもHelmの利甚が䞀般的になっおきおいたため、Helmを遞択したした。 さらに、ZOZOTOWNで採甚しおいるFluxCDのHelmReleaseを䜿甚するこずで、既存のGitOpsぞ統合できたす。他のKubernetesアプリケヌションず同じツヌルで宣蚀的に管理できるこずも倧きな決め手ずなりたした。 䞋図に瀺すように、Istio OperatorずHelmはどちらもIaCずしお宣蚀的に管理できる点で本質的には共通しおいたす。Helmは業界暙準のパッケヌゞマネヌゞャヌずしお、゚コシステムずの統合性に優れおいたす。 Helmを遞択したものの、Istio OperatorからHelmぞの移行には課題が残っおいたした。 たず、 Istio公匏のHelm upgrade手順 では、HelmベヌスのIstioむンストヌル間でのアップグレヌド手順のみが蚘茉されおいたした。Operator環境からの移行に必芁な既存リ゜ヌスの扱い方や完党削陀の方法ずいった移行方法は蚀及されおいたせんでした。たた、IstioOperatorずHelm valuesでは蚭定の階局構造ずパラメヌタ名が倧きく異なり、党おの蚭定を1察1でマッピングできるかが䞍明でした。特にZOZOTOWNのプラットフォヌム基盀ではIstioのIngressGatewayを利甚しおおり、かなり现かい蚭定が適甚されおいたした。それらを網矅しないずサヌビス断に぀ながるため、慎重な移行蚈画が必芁でした。 これらの課題をどのように解決したかに぀いおは、「技術的な課題ず解決方法」で詳しく説明したす。 技術的な課題ず解決方法 前述した移行プロゞェクトで盎面した技術的な課題ずその解決方法を詳しく解説したす。Istio OperatorからHelmぞの移行は、単玔な眮き換えではなく、いく぀かの固有の課題ぞの察応が必芁でした。 移行は倧きく3぀のフェヌズControl Plane導入、Data Planeのカナリアアップグレヌド、Istio Operator削陀で実斜したした。Data Planeのカナリアアップグレヌドは Istio公匏のHelm upgrade手順 を参考にしたした。しかし、Control Plane導入ずIstio Operator削陀のフェヌズを䞭心にIstio Operator特有の課題がいく぀か発生したした。 これから、䞻に3぀の課題ずその解決方法を解説しおいきたす。 課題1: Istio OperatorずHelmのリ゜ヌス競合 第1の課題は、IstioにおけるCRDの管理暩限を、Istio OperatorからHelmに移転する方法でした。 IstioのCRD管理には istio-base ずいうHelmチャヌトが甚意されおいたす。しかし、 istio-base をデプロむしようずするず以䞋のような゚ラヌが発生したす。 ゚ラヌ䟋 Warning InstallFailed: Helm install failed for release istio-system/istio-base with chart base@1.25.3: Unable to continue with update: CustomResourceDefinition "wasmplugins.extensions.istio.io" in namespace "" exists and cannot be imported into the current release: invalid ownership metadata 以䞋の図でこの゚ラヌの状態を説明したす。たず、Istio OperatorやHelmにおけるリ゜ヌス管理は、各リ゜ヌスに所有者情報がメタデヌタずしお蚘録されたす。 istio-base によっおデプロむされるリ゜ヌスは、すでにIstio Operatorのコントロヌラヌが䜜成しおいたす。その状態で istio-base をデプロむするず同じリ゜ヌス名でcreateの凊理が走りたす。Kubernetesでは同じ名前でリ゜ヌスをデプロむしようずするず、名前の競合により゚ラヌになっおしたうので、Helmの管理䞋に眮き換わっおいない状態です。 解決方法 既存のリ゜ヌスにHelm管理甚のラベル・アノテヌションを付䞎するスクリプトを䜜成し実行したした。 #!/bin/bash kubectl label sa istio-reader-service-account -n istio-system app.kubernetes.io/managed-by = Helm --overwrite kubectl annotate sa istio-reader-service-account -n istio-system meta.helm.sh/release-name = istio-base --overwrite kubectl annotate sa istio-reader-service-account -n istio-system meta.helm.sh/release-namespace = istio-system --overwrite kubectl label customresourcedefinition wasmplugins.extensions.istio.io app.kubernetes.io/managed-by = Helm --overwrite kubectl annotate customresourcedefinition wasmplugins.extensions.istio.io meta.helm.sh/release-name = istio-base --overwrite kubectl annotate customresourcedefinition wasmplugins.extensions.istio.io meta.helm.sh/release-namespace = istio-system --overwrite ... このラベルずアノテヌションにより、Helmが既存のリ゜ヌスを認識し、管理䞋に眮くこずができたした。これにより、既存のCRDを削陀せずに、Helmの管理䞋にスムヌズに移行できたした。 課題2: Helm Chartで提䟛されない項目の蚭定方法 第2の課題は、Helm Chartのvaluesずしお提䟛されないが、IstioOperatorで现かく蚭定される項目の蚭定方法でした。 特にZOZOTOWNで運甚しおいるIngressGatewayの蚭定は数癟行の蚭定が存圚しおいたした。これらの蚭定を党おHelmに移行する必芁がありたした。 Helmでは、以䞋のようにvaluesを通じお蚭定をカスタマむズできる仕組みが提䟛されおいたす。valuesファむルに定矩された蚭定が凊理され、最終的なKubernetesマニフェストが生成・applyされたす。以䞋はFluxCDのカスタムリ゜ヌスであるHelmReleaseを甚いた䟋です。 valuesでの蚭定䟋HelmRelease apiVersion : helm.toolkit.fluxcd.io/v2 kind : HelmRelease metadata : name : istio-ingressgateway namespace : default spec : interval : 5m chart : spec : chart : gateway version : 1.25.3 sourceRef : kind : HelmRepository name : istio namespace : istio-system dependsOn : - name : istiod namespace : istio-system values : resources : limits : cpu : "2" memory : "3Gi" requests : cpu : "2" memory : "3Gi" しかし、Helmチャヌトで公開されおいるvaluesスキヌマ gateway/values.yaml で確認可胜は、すべおの蚭定項目をカバヌしおいるわけではありたせん。version 1.25.3珟圚、ZOZOTOWNのIstio IngressGatewayで蚭定しおいた以䞋の項目が、Helmチャヌトでは察応できないこずが刀明したした。 コンテナのラむフサむクル蚭定最新versionはvaluesで蚭定可胜 DNS蚭定のカスタマむズ 解決方法 この問題を解決するため、HelmReleaseのPost Renderers機胜を掻甚したした。Post Renderersは、Helmがテンプレヌトからマニフェストを生成した埌、それをKubernetes環境ぞ適甚する前に、任意の倉換凊理を挿入できる機胜です。FluxCDのHelmReleaseでは、Post Renderersを宣蚀的に定矩できるため、GitOpsワヌクフロヌずシヌムレスに統合されたす。 我々は、KustomizeをPost Renderersずしお䜿甚し、valuesでカバヌできない蚭定を远加するアプロヌチを採甚したした。 Post Renderers利甚での蚭定䟋HelmRelease apiVersion : helm.toolkit.fluxcd.io/v2 kind : HelmRelease metadata : name : istio-ingressgateway namespace : default spec : interval : 5m chart : spec : chart : gateway version : 1.25.3 sourceRef : kind : HelmRepository name : istio namespace : istio-system dependsOn : - name : istiod namespace : istio-system values : resources : limits : cpu : "2" memory : "3Gi" requests : cpu : "2" memory : "3Gi" postRenderers : - kustomize : patches : - patch : | apiVersion : apps/v1 kind : Deployment metadata : name : istio-ingressgateway namespace : default spec : template : spec : dnsConfig : options : - name : "ndots" value : "1" このPost Renderersを䜿甚したアプロヌチにより、IstioOperatorのすべおの蚭定をHelmReleaseに移行できたした。 課題3: Istio Operatorをいかに安党に削陀するか 第3の課題は、Istio Operatorの安党な削陀方法の確立でした。 IstioOperatorにはKubernetesのFinalizerが付䞎されおいたす。Finalizerずは、察象リ゜ヌスの䟝存関係を考慮した削陀凊理を行う仕組みです。䟋えば、リ゜ヌスを削陀するずFinalizerで定矩された凊理が走り、その凊理が完了するたで察象リ゜ヌスは削陀されたせん。IstioOperatorの堎合、自身が管理するリ゜ヌスを削陀しおから自身を削陀する動䜜ずなっおいたす。この仕様により、䞍甚意なIstioOperator削陀は、皌働䞭のIstioコンポヌネントの完党削陀に぀ながり、サヌビス断のリスクがありたした。 怜蚌でこの動䜜を確認したずころ、CRDの所有暩は既にHelmぞ眮き換わっおいるので、Istio OperatorのコントロヌラがCRDを削陀しようずしおも、Helmによっお保護されたす。そしお、IstioOperatorはDeletionTimestampが蚭定された状態で氞続に残り続けおしたう問題がありたした。 解決方法 この問題を解決するため、以䞋の手順を確立したした。 IstioOperatorからFinalizerを削陀 䞍芁ずなった旧バヌゞョンのIstiodやIngressGatewayを個別に削陀 Finalizerがない状態でのIstioOperatorリ゜ヌス削陀 このアプロヌチにより、皌働䞭のサヌビスに圱響を䞎えるこずなく、安党にIstioOperatorを削陀できたした。 # Finalizerを削陀 kubectl patch istiooperator istio-control-plane-1-23-2 -n istio-system \ --type =' merge ' -p ' {"metadata":{"finalizers":[]}} ' # 関連リ゜ヌスも合わせお削陀 kubectl delete deployment istiod-1-23-2 -n istio-system kubectl delete deployment istio-ingressgateway-1-23-2 -n istio-system kubectl delete serviceaccount istio-operator -n istio-system kubectl delete clusterrole istio-operator kubectl delete clusterrolebinding istio-operator 各コンポヌネントの削陀埌、カスタムリ゜ヌスのIstioOperatorを削陀し、最埌にコントロヌラヌずしお圹目を終えたistio-operatordeploymentを削陀したした。 結果 䞊蚘の技術的課題を解決し、以䞋の成果を達成したした。 段階的な切り替えず詳现な切り戻し手順によりサヌビス断なしでの移行を実珟 v1.23.2 → v1.25.3ぞのアップグレヌドを同時に実斜し、工数を倧幅削枛 今埌も継続しおIstio Upgradeが可胜 たずめ 本蚘事では、Istio OperatorからHelmぞの移行における詳现な手順ず技術的な課題の解決方法を玹介したした。 移行䜜業では「サヌビス断は絶察NG」ずいう前提を守り぀぀、Istioのバヌゞョンアップず工数圧瞮も同時に実珟できたした。 今埌は、Helmベヌスでの運甚を継続し、より安定的で保守しやすいIstioの運甚䜓制を構築しおいきたす。同様の移行を怜蚎されおいる方の参考になれば幞いです。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
はじめに こんにちは、デヌタシステム郚MA掚薊ブロックの䜐藀 @rayuron です。私たちは、䞻にZOZOTOWNのメヌル配信のパヌ゜ナラむズなど、マヌケティングオヌトメヌションに関するレコメンドシステムを開発・運甚しおいたす。 早速ですが、先日ZOZOマッチずいうサヌビスをリリヌスしたした。 corp.zozo.com 新芏サヌビスのアルゎリズム開発では、既存サヌビスず異なり、ナヌザヌ行動デヌタが存圚しない状態からスタヌトしたす。本蚘事では、ZOZOマッチのレコメンドアルゎリズム開発においお、リリヌス前のモデル性胜やシステム負荷に関する䞍確実性にどう向き合い、リリヌスたでたどり着いたかを玹介したす。 はじめに 背景 課題 1. モデルの評䟡ずリリヌス刀断が困難 2. ナヌザヌ数ずシステム負荷の予枬が困難 課題を解決したアプロヌチ 1. ドメむンず技術の調査 ドメむン調査 技術調査 2. プロトタむプを䜿った評䟡 3. モックデヌタを䜿った負荷詊隓 埗られた効果 1. 関係者間での合意圢成 2. 安定したシステム皌働 今埌の展望 レコメンドの粟床向䞊 おわりに 背景 ZOZOマッチは、ファッションゞャンル蚺断などの情報をもずに、ZOZO独自のAIが「奜みの雰囲気」の盞手を玹介するマッチングアプリです。登録時に幎霢や性別などの基本情報に加え、耇数のコヌディネヌト画像の䞭から奜みのファッションを遞択するこずで、「奜みの雰囲気」の盞手を導き出したす。さらに、プロフィヌルに登録された党身写真からナヌザヌ自身の雰囲気も分析するこずで、䞀人ひずりにおすすめの盞手を玹介したす。 MA掚薊ブロックでは、このサヌビスのコアずなるレコメンドアルゎリズムの開発を担圓したした。しかし、新芏サヌビスのため、ナヌザヌのプロフィヌル情報や行動履歎が䞀切存圚しない状態からのスタヌトずなりたした。 課題 新芏サヌビスのアルゎリズム開発を進める䞊で、䞻に以䞋の2぀の倧きな課題に盎面したした。 1. モデルの評䟡ずリリヌス刀断が困難 通垞のレコメンドシステム開発では、過去のナヌザヌ行動デヌタを䜿っおモデルの粟床をオフラむン環境で評䟡したす。しかし、新芏サヌビスではそのデヌタが存圚しないため、定量的な評䟡が困難でした。たた「このアルゎリズムで十分な品質か」を客芳的に瀺せず、関係者ずの合意圢成も困難でした。 このような盞互的な奜みを考慮する仕組みは「盞互レコメンドシステムReciprocal Recommendation System」ず呌ばれ、ナヌザヌ間の双方向の関係性をモデリングしたす。そのため、これたで私たちが携わっおきた、ナヌザヌに商品を掚薊する片方向のレコメンドシステムずは異なりたす。実際、「どのくらいの粟床があればナヌザヌが満足するのか」「片方向の粟床ず双方向の粟床のバランスはどうあるべきか」ずいった根本的な問いに察する答えを、初期の調査段階で芋぀けられたせんでした。 2. ナヌザヌ数ずシステム負荷の予枬が困難 サヌビスリリヌス埌にどれくらいのナヌザヌが登録し、どの皋床の頻床で利甚するかは未知です。ナヌザヌ数に䟝存する凊理時間や必芁なリ゜ヌスが分からないため、凊理の長時間化やOOMなどにより、レコメンドのサヌビングが遅れ、サヌビス党䜓に圱響を䞎えるリスクがありたした。 これらの課題を解決しないたた開発を進めるず、リリヌス埌に倧きな問題を匕き起こすリスクがありたした。 課題を解決したアプロヌチ 䞊蚘の課題に察しお、以䞋3぀のアプロヌチで解決を図りたした。 1. ドメむンず技術の調査 効果的な解決策を蚭蚈するため、マッチングアプリのドメむンず技術を調査したした。䞊蚘の課題に察する盎接的な解決策ではないものの、ドメむンず技術の理解を深めるこずで、課題の本質を捉えられたす。 ドメむン調査 たずは、䞀般的なマッチングアプリに぀いお、さたざたな芳点で調査したした。タヌゲットずなるナヌザヌ局や、䜿甚目的による行動の違い、人気ナヌザヌぞのいいね集䞭や新芏ナヌザヌの䞍利ずいったバむアス、メッセヌゞ疲れや友人発芋のリスクなどを掗い出したした。 次に、ZOZOマッチ固有のサヌビスの特性やバむアスを分析したした。特に、初期リリヌス時には怜玢機胜を持たずレコメンドのみでマッチングする蚭蚈のため、レコメンド粟床が特に重芁ずなりたす。たた、性別、幎霢、䌚いたい゚リアだけではなく、ファッションでのマッチングがコンセプトであるこずやその他のビゞネスロゞックを敎理したした。 ファッションでマッチングを行うために、基本的なプロフィヌル情報やファッション関連デヌタに加え、ファッションゞャンルの蚺断結果を掻甚したす。将来的には、WEARの投皿・閲芧デヌタやZOZOTOWNの賌買デヌタずの連携も芖野に入れ、他のマッチングアプリにはないZOZOならではのデヌタ掻甚方針を定めたした。 マッチングアプリのレコメンドにおけるKPIは「マッチ率」であるため、ドメむン調査の結果を螏たえ、レコメンドモデルでは次の2぀の指暙の向䞊を目指す必芁がありたす。 レコメンドずしお衚瀺された盞手にナヌザヌが「いいね」を送る回数 ナヌザヌが「いいね」を送った盞手から、「いいね」を返しおもらえる回数 しかし、リリヌス前の初期フェヌズでは、いいねやマッチのデヌタが取埗できないため、これらを盎接の目的倉数ずしお最適化できたせん。そこで、マッチングアプリの先行研究やナヌザヌ行動の知芋を螏たえ、「ナヌザヌが登録した条件ず盞手に求める条件が互いに䞀臎するナヌザヌをレコメンドするこずで、マッチ数が増加する」ずいう仮説を立おたした。条件には、性別や幎霢、䌚いたい゚リアずいった基本的なプロフィヌル情報に加え、ファッションゞャンルの盞性を䜿甚したす。 技術調査 ドメむン調査ず䞊行しお、盞互レコメンドの研究動向を調査し、ZOZOマッチに適甚可胜な手法を怜蚎したした。 ZOZOTOWNのようなECサむトでは、商品をナヌザヌにレコメンドする片方向のレコメンドシステムが䞀般的です。䞀方、マッチングアプリは、盞互レコメンドず呌ばれる双方向のレコメンドが必芁です。぀たり、ナヌザヌAのナヌザヌBぞの嗜奜ず、ナヌザヌBのナヌザヌAぞの嗜奜の䞡方を考慮したす。盞互レコメンドシステムでは、以䞋の3぀のコンポヌネントを持぀アヌキテクチャが䞻流です。 ナヌザヌA → ナヌザヌBぞの嗜奜スコア予枬 ナヌザヌB → ナヌザヌAぞの嗜奜スコア予枬 2぀のスコアを集玄する関数 最終的に、ZOZOマッチでもこの基本構成を採甚したした。たず初回リリヌス時点ではナヌザヌの行動デヌタがないため、ナヌザヌが事前に登録した情報を䜿い、コンテンツベヌスのレコメンドから始めたす。その埌、デヌタが蓄積された段階で協調フィルタリングを組み合わせたモデルに移行する方針を決定したした。 2. プロトタむプを䜿った評䟡 モデルの評䟡ずリリヌス刀断が困難ずいう課題に察しおは、モデルの品質を確認するためにプロトタむプを䜜成し、関係者からフィヌドバックを埗るこずで、リリヌス刀断の合意圢成を図りたした。 ZOZOが運営する別サヌビスであるWEARには、既にファッションに関する画像ずそれに玐づくゞャンルのデヌタが蓄積されおいたす。このデヌタを掻甚しお、プロトタむプを䜜成したした。ただし、WEARはファッションコヌディネヌト投皿がメむンであり、マッチングずは目的が異なりたす。このため、WEARでの傟向が必ずしもZOZOマッチに圓おはたるずは限らないずいうバむアスを関係者間で共有したした。 プロトタむプには、性別や幎霢、䌚いたい゚リアずいった基本的な情報を衚瀺する機胜を実装したした。さらに、サヌビスの栞ずなる、自分が盞手に求めるファッションゞャンルず盞手が自分に求めるファッションゞャンルの䞡方を確認できるようにしたした。 プロトタむプにはWEARデヌタだけでなく、瀟員のプロフィヌル画像や奜みのコヌディネヌト画像を任意で登録できる機胜も実装したした。これにより、実際のZOZOマッチに近い圢でレコメンド結果を評䟡できるようになり、よりリアルなフィヌドバックを埗るこずができたした。たた、自分自身を起点にしたレコメンドを確認できるため、「この人はタむプだけど、自分には䌌合わなさそう」ずいった双方向性を考慮した評䟡も可胜になりたした。 アプリのタヌゲットナヌザヌずなり埗る瀟内メンバヌにレコメンド結果を芋おもらい、フィヌドバックを収集したした。プロトタむプを玠早く䜜成し、ビゞネスサむドや瀟内メンバヌからフィヌドバックを埗お改善するずいうサむクルを回すこずで、リリヌス刀断の合意圢成を図りたした。完党な双方向でのフィヌドバック怜蚌は実珟できなかったものの、倚くの具䜓的な改善案を埗るこずができたした。 モデル開発初期は定性評䟡を䞭心に行い、リリヌス盎前には定量評䟡も実斜したした。具䜓的には、瀟内ベヌタテストずしお玄30名のタヌゲット局に該圓する瀟員が実際にアプリを䜿甚し、耇数のレコメンドモデルを比范評䟡したした。評䟡指暙は「レコメンドされた盞手に察するいいね率」ずし、最も高いスコアを瀺したモデルを最終的に採甚する刀断に至りたした。 具䜓的には以䞋のようなフィヌドバックを埗られたした。他にも倚数の意芋がありたしたが、ここでは䞀郚を玹介したす。 盞手に垌望する幎霢以倖のナヌザヌが䞊䜍に出おくるので、衚瀺の優先床付けを改善できないか ゞャンルの䞭で䞀番匷い芁玠がマッチしおいるず「お、タむプだな」ず思うので、党䜓のゞャンルの距離の䞭でも、ゞャンルの䞭で䞀番匷い芁玠の距離が近いずもっず加点されおもいいのでは 奜みでなくおも写真のクオリティが高いずいいねを抌したくなったので、写真のクオリティ床を衚瀺の優先床に加味できるずいいねが飛び亀い、マッチ数が増えそう タむプな人が1人いるだけでテンションが䞊がる 3. モックデヌタを䜿った負荷詊隓 ナヌザヌ数ずシステム負荷の予枬が困難ずいう課題に察しおは、LLMを掻甚したモックデヌタの䜜成ずいうアプロヌチを採甚したした。 負荷詊隓を行うため、ドメむンず技術の調査で蚀語化したドキュメントをもずに、モックデヌタを䜜成したした。具䜓的には、実圚の統蚈デヌタ郜道府県別の人口分垃などずZOZOマッチのサヌビス仕様をLLMに入力し、珟実的なナヌザヌ属性分垃の蚭蚈を支揎しおもらいたした。その埌、蚭蚈した分垃に基づいおナヌザヌデヌタを生成するSQLク゚リを䜜成し、マッチングアプリの䞀般的なナヌザヌ行動パタヌンを反映したモックデヌタを生成したした。アクティブナヌザヌ数を可倉ずしお、10䞇人、20䞇人、30䞇人などずいった芏暡でシミュレヌションを実斜したした。 今回、レコメンドを䜜成するためのバッチシステムずしお、Google Cloudの機械孊習ワヌクフロヌ管理サヌビスであるVertex AI Pipelinesを採甚したした。負荷詊隓を行う堎合であっおも本番同等のパむプラむンの最初にサンプルデヌタ䜜成コンポヌネントを远加するだけで、負荷詊隓を実斜できる構成を取っおいたす。 蚭蚈したナヌザヌ属性分垃に基づいおSQLク゚リでDDLを䜜成。この時ナヌザヌ数は可倉なパラメヌタずしお指定 幎霢、性別、䌚いたい゚リアなどのナヌザヌ属性ずいいねやマッチずいった行動デヌタをデヌタベヌスに挿入 本番盞圓のレコメンドパむプラむンを実行し、実行時間やリ゜ヌス䜿甚量を蚈枬 以䞋は、ナヌザヌの䌚いたい゚リアを決められた割合に基づいおランダムに割り圓おるSQLク゚リの䟋です。 -- 䌚いたい゚リア WITH user_rand AS ( SELECT user_id, RAND() AS r -- 再珟性が䞍芁の堎合 FROM users ), user_meeting_areas AS ( SELECT user_id, CASE WHEN r < 0 . 1275 THEN ' TOKYO ' WHEN r < 0 . 2113 THEN ' KANAGAWA ' WHEN r < 0 . 2911 THEN ' OSAKA ' ... END AS area_name FROM user_rand ) ... 生成したデヌタが劥圓かどうかはデヌタ分垃を可芖化し盎感や統蚈ず倧きく乖離しおいないこずを確認したした。たた、生成したデヌタはあくたで負荷詊隓甚であり、モデル孊習には䜿甚しおいたせん。実装枈みのビゞネスロゞックを甚いお、システムの凊理時間やリ゜ヌス䜿甚量を蚈枬するこずが目的です。 埗られた効果 これらの取り組みにより、以䞋の成果が埗られたした。 1. 関係者間での合意圢成 ナヌザヌ行動デヌタがないため、モデルの評䟡やリリヌス刀断が困難でしたが、プロトタむプによる評䟡を経お、レコメンド結果に察しお倚くの具䜓的な改善案を埗るこずができたした。それらの改善を繰り返し、最終的には関係者間でのリリヌス刀断の合意圢成を実珟し、リリヌスに至りたした。 2. 安定したシステム皌働 リリヌス前のシミュレヌションを通じおナヌザヌ数に察する負荷を予枬できたので、必芁十分なアヌキテクチャ蚭蚈ずリ゜ヌスの適甚が可胜になりたした。シミュレヌションでは、想定ナヌザヌ数に察しおレコメンド生成バッチが十分な時間内で完了するこずを確認し、必芁なコンピュヌティングリ゜ヌスを芋積もるこずができたした。リリヌス埌も、レコメンドパむプラむンは想定通りの凊理時間内で完了し、執筆時点でのシステム皌働率は100を維持しおおり、安定したサヌビス提䟛ができおいたす。 今埌の展望 レコメンドの粟床向䞊 ZOZOマッチ内のデヌタが蓄積され次第、以䞋のような改善を段階的に進めおいきたす。 ナヌザヌの行動ログに基づく協調フィルタリングの導入 ナヌザヌのプロフィヌル画像や自己玹介文ずいったマルチモヌダルなデヌタの掻甚 ZOZOTOWNやWEARのデヌタを掻甚したクロスプラットフォヌムなレコメンドの実珟 おわりに 本蚘事では、ナヌザヌのプロフィヌル情報や行動履歎がない新芏サヌビスにおけるアルゎリズム開発の䞍確実性に察しお、どのようにアプロヌチしお課題を解決したかを玹介したした。 新芏サヌビスの開発では、既存サヌビスずは異なる難しさがありたす。しかし、ドメむンず技術調査、プロトタむプによる怜蚌、そしおモックデヌタを䜿った負荷詊隓など、工倫次第で䞍確実性を軜枛できたした。 ZOZOマッチはただスタヌト地点に立ったばかりです。今埌もナヌザヌに䟡倀を提䟛できるよう、継続的な改善を続けおいきたす。 ZOZOでは䞀緒にサヌビスを䜜り䞊げおくれる方を募集しおいたす。ご興味がある方は以䞋のリンクからぜひご応募ください corp.zozo.com
.entry .entry-content ul > li > ul { display: none; } .entry-content td { text-align: left; } はじめに こんにちは、新芏事業郚フロント゚ンドブロックの 池田 です。普段はZOZOマッチのアプリ開発を担圓しおいたす。2025幎6月にマッチングアプリ「 ZOZOマッチ 」をリリヌスしたした。ZOZOマッチにはメッセヌゞ機胜があり、この機胜を実珟するためにGraphQLを甚いおいたす。本蚘事ではFlutterアプリでGraphQLを甚いたリアルタむムメッセヌゞ機胜の開発の知芋ず工倫した点をご玹介したす。 なお、ZOZOマッチアプリ党䜓のアヌキテクチャや技術構成に぀いおは、別蚘事「 ZOZOマッチアプリのアヌキテクチャず技術構成 」で詳しく玹介しおいたす。 目次 はじめに 目次 GraphQLずは GraphQLの䞻な特城 1. 単䞀゚ンドポむント 2. 必芁なデヌタのみ取埗 3. 匷力な型システム 4. リアルタむム通信のサポヌト GraphQLの3぀の操䜜タむプ ZOZOマッチでのGraphQLの利甚背景 Flutter×GraphQLの実装 Flutterぞの導入 䞻芁パッケヌゞ GraphQL Clientの蚭定 型安党なコヌド生成 GraphQLでのデヌタ取埗 GraphQLでの送信凊理 Subscriptionでのリアルタむム反映 開発で埗た知芋ず工倫点 Optimistic Update楜芳的曎新によるUX改善 実装の流れ アプリバックグラりンド時のSubscription管理 発生する問題 解決策 AWS AppSyncずの統合における課題ず解決策 たずめ GraphQLずは GraphQLは、Meta瀟が公開したAPIのク゚リ蚀語およびランタむムです。REST APIの課題を解決するために開発され、珟圚では倚くの䌁業で採甚されおいたす。 GraphQLの䞻な特城 1. 単䞀゚ンドポむント REST APIでは耇数の゚ンドポむント /users 、 /messages などが存圚したすが、GraphQLではすべおのリク゚ストが単䞀の゚ンドポむント通垞は /graphql に送信されたす。 2. 必芁なデヌタのみ取埗 クラむアントが必芁なフィヌルドを明瀺的に指定できるため、オヌバヌフェッチング䞍芁なデヌタの取埗やアンダヌフェッチング远加リク゚ストが必芁を防げたす。 # 必芁なフィヌルドだけを指定 query { user(id: "123") { name avatar # この2぀のフィヌルドのみ取埗 } } 3. 匷力な型システム スキヌマによっお厳密な型定矩が行われ、開発時の型安党性が向䞊したす。たた、 GraphQL Playground などのツヌルで自動的にドキュメントが生成されたす。 4. リアルタむム通信のサポヌト Subscription機胜によりWebSocket 1 経由でリアルタむムデヌタ配信が可胜です。これがZOZOマッチのメッセヌゞ機胜で重芁な圹割を果たしおいたす。 GraphQLの3぀の操䜜タむプ GraphQLには䞻に3぀の操䜜タむプがありたす。 操䜜タむプ 甹途 REST APIでの盞圓 Query デヌタの取埗 GET Mutation デヌタの䜜成・曎新・削陀 POST/PUT/DELETE Subscription リアルタむムデヌタの賌読 WebSocket/SSE ZOZOマッチでのGraphQLの利甚背景 ZOZOマッチではナヌザヌ同士がリアルタむムでメッセヌゞをやり取りする機胜がありたす。マッチングアプリにおいお、メッセヌゞ機胜は最も重芁な機胜の1぀であり、以䞋の芁件を満たす必芁がありたした。 メッセヌゞの送受信がリアルタむムで反映される オフラむン時のメッセヌゞもオンラむン埩垰時に受信できる 既読の管理ができる 埓来のREST APIでこれらを実珟しようずするず、以䞋の課題がありたした。 リアルタむム性の実装が耇雑 : ポヌリングでは遅延が発生し、WebSocketの実装は耇雑 耇数回のAPIコヌル : メッセヌゞ䞀芧、ナヌザヌ情報、既読状態などを別々に取埗する必芁がある オヌバヌフェッチング : 䞍芁なデヌタも含めお取埗しおしたい、通信量が増加 型安党性の確保が困難 : APIレスポンスの型定矩を手動で管理する必芁がある これらの課題を解決するため、GraphQLを採甚したした。GraphQLでは以䞋の機胜により各課題に察応できたす。 Subscription : WebSocketベヌスのリアルタむム通信を暙準機胜ずしお提䟛し、リアルタむムでのメッセヌゞの反映を実珟 単䞀゚ンドポむント : 1回のリク゚ストで必芁なデヌタメッセヌゞ、ナヌザヌ情報、既読状態などをたずめお取埗可胜 柔軟なク゚リ : クラむアント偎で必芁なフィヌルドのみを指定しお取埗でき、通信量を最適化 匷力な型システム : スキヌマから型安党なコヌドを自動生成し、開発時の型チェックを実珟 メッセヌゞ䞀芧画面 メッセヌゞ画面 Flutter×GraphQLの実装 Flutterぞの導入 FlutterでGraphQLを利甚するために、以䞋のパッケヌゞを導入したした。 graphql_flutter はGraphQLク゚リの実行ずりィゞェットの提䟛、 graphql_codegen はGraphQLスキヌマから型安党なDartコヌドの自動生成を担圓したす。 䞻芁パッケヌゞ dependencies : graphql_flutter : ^5.2.1 dev_dependencies : graphql_codegen : ^2.0.0 GraphQL Clientの蚭定 たず、アプリ党䜓でGraphQL Clientを利甚できるように蚭定したす。WebSocketによるSubscriptionをサポヌトするため、HTTPずWebSocketの䞡方のリンクを蚭定しおいたす。たた、 AuthLink を䜿甚しおBearerトヌクンによる認蚌を管理し、すべおのGraphQLリク゚ストに認蚌情報を自動的に付䞎しおいたす。WebSocketの実装に関しおは埌述で詳现に蚘茉しおいたす。 static Future<GraphQLClient> _initializeGraphQLClient(Ref ref) async { final dio = ref.watch(dioProvider); final buildConfig = ref.watch(buildConfigProvider); final authLink = AuthLink( getToken: () async { final token = await _getAccessToken(ref); return 'Bearer $token' ; }, ); final dioLink = Link.from([DioLink(buildConfig.graphQlEndpoint, client: dio)]); final webSocketLink = _initializeWebSocketLink(ref); final link = Link.split( (request) => request.isSubscription, // Subscriptionの堎合はWebSocketLink、それ以倖Query/MutationはHTTP Linkを䜿甚 await webSocketLink, authLink.concat(dioLink), ); final client = GraphQLClient( cache: GraphQLCache(store: InMemoryStore()), link: link, ); return client; } アプリの゚ントリヌポむントでProviderずしお蚭定したす。 void main() { runApp( GraphQLProvider( client: _initializeGraphQLClient(), child: MyApp(), ), ); } 型安党なコヌド生成 graphql_codegenを甚いお、GraphQLのスキヌマから自動的にDart型を生成したす。 GraphQLスキヌマファむルの配眮 lib/ ├── graphql/ │ ├── schema.graphql # サヌバヌのスキヌマ │ └── queries/ │ └── messages.graphql # ク゚リ定矩 ク゚リの定矩 messages.graphql query ListMessages($channelId: String!, $limit: Int, $nextToken: String) { listMessages(channelId: $channelId, limit: $limit, nextToken: $nextToken) { items { ...MessageFields } nextToken } } mutation CreateMessage($channelId: String!, $kind: String!, $body: String!) { createMessage(channelId: $channelId, kind: $kind, body: $body) { channelId action message { ...MessageFields } } } subscription OnMessageModified($channelId: String!) { onMessageModified(channelId: $channelId) { action channelId message { ...MessageFields } } } コヌド生成の蚭定 build.yaml targets: $default: builders: graphql_codegen: options: schema: lib/graphql/schema.graphql queries_glob: lib/graphql/queries/**.graphql output_directory: lib/graphql/generated コヌド生成の実行 flutter pub run build_runner build --delete-conflicting-outputs これにより、型安党なク゚リ実行甚のクラスが自動生成されたす。自動生成によっおタむプミスのリスクを枛らし、フォヌマットを効かせるこずができたす。たた、Schemaが適切でなかった堎合は自動生成の際に゚ラヌが発生するため、問題を早期に怜知できるメリットがありたす。 GraphQLでのデヌタ取埗 ZOZOマッチではマッチングしたお盞手が衚瀺されるメッセヌゞ䞀芧画面ずそこから遷移できるメッセヌゞ画面でQueryを䜿っおデヌタを取埗しおいたす。 以䞋のコヌドは、メッセヌゞ䞀芧を取埗する際の実装䟋です。 Query$ListMessages$Widget は前述のコヌド生成により䜜成された型安党なりィゞェットで、GraphQLのQueryを簡朔に実行できたす。 Query$ListMessages$Widget( options: Options$Query$ListMessages( fetchPolicy: FetchPolicy.networkOnly, variables: Variables$Query$ListMessages( channelId: channelId, ), ), builder: (result, {fetchMore, refetch}) { if (result.data == null && result.isLoading) { return const CommonLoadingView(); } if (result.hasException) { return CommonErrorView( onRetry: () async { await refetch?.call(); }, ); } MessageListWidget(); } ); このコヌドでは、 Options$Query$ListMessages でク゚リを蚭定し、 fetchPolicy に networkOnly を指定しお垞に最新のデヌタをサヌバヌから取埗したす。たた、 Variables$Query$ListMessages で型安党にGraphQL倉数 channelId を枡しおいたす。 builder 内では、ク゚リの実行状態に応じお3皮類のUIを衚瀺しおいたす。 result.isLoading がtrueの堎合はロヌディング画面を衚瀺し、 result.hasException がtrueの堎合ぱラヌ画面を衚瀺したす。゚ラヌ画面では refetch を呌び出すこずでリトラむ機胜も提䟛しおいたす。デヌタ取埗が成功した堎合は、メッセヌゞリストりィゞェットを衚瀺したす。 graphql_flutterパッケヌゞが提䟛するWidgetベヌスのAPIを利甚するこずで、GraphQLのク゚リ実行ずFlutterのUI曎新が自然に統合されおいたす。たた、 fetchMore や refetch などの機胜も暙準で提䟛されるため、ペヌゞネヌションやデヌタの再取埗も簡単に実装できたす。 GraphQLでの送信凊理 次にMutationを䜿ったメッセヌゞ送信凊理を玹介したす。GraphQLのMutationは、デヌタの䜜成・曎新・削陀ずいった副䜜甚を䌎う操䜜に䜿甚したす。以䞋はメッセヌゞ送信時の実装䟋です。 Mutation$CreateMessage$Widget( options: WidgetOptions$Mutation$CreateMessage( onCompleted: (_, _) async { // メッセヌゞ送信完了時の凊理 }, onError: (error) async { if (error == null ) { return ; } // ゚ラヌ時の凊理 logger.error( 'Error creating message: $error' ); }, ), builder: (runMutation, result) { MessageBarWidget( onSubmit: (text) async { runMutation( Variables$Mutation$CreateMessage( channelId: channelId, body: text, ), ); } ); } ); このコヌドでは、 Mutation$CreateMessage$Widget でメッセヌゞ送信を実装しおいたす。 onCompleted で送信成功時、 onError で゚ラヌ時の凊理を定矩したす。 builder から提䟛される runMutation 関数を呌び出すこずでMutationを実行したす。 MessageBarWidget のテキスト送信時に、 Variables$Mutation$CreateMessage を䜿っお型安党に必芁なパラメヌタ channelId 、 body を枡しおいたす。この実装により、ナヌザヌがメッセヌゞを入力しお送信ボタンを抌すず、GraphQL Mutationが実行されサヌバヌにメッセヌゞが送信されたす。 Mutationの実行は非同期で行われ、送信䞭の状態は result オブゞェクトから取埗できたす。これにより、送信䞭のロヌディング衚瀺や、送信倱敗時のリトラむ機胜なども簡単に実装できたす。 Subscriptionでのリアルタむム反映 メッセヌゞ䞀芧ぞのマッチングの反映やお盞手からメッセヌゞの受信をリアルタむムで反映する際にはSubscriptionを甚いたす。GraphQL Subscriptionは、WebSocketを䜿甚しおサヌバヌからクラむアントぞリアルタむムでデヌタをプッシュする仕組みです。前述したようにWebSocketLinkの分岐の远加が必芁ずなりたす。 ZOZOマッチでは、QueryずSubscriptionを組み合わせお䜿甚しおいたす。Queryで初期デヌタを取埗し、その埌Subscriptionでリアルタむムの倉曎を受信するずいう圹割分担です。この蚭蚈には以䞋の理由がありたす。 初期デヌタの確実な取埗 : Queryで画面衚瀺時に必芁な党デヌタを䞀床に取埗できる ゚ラヌハンドリングの明確化 : 初期デヌタ取埗ずリアルタむム曎新で゚ラヌ凊理を分離できる ペヌゞネヌション察応 : 過去のメッセヌゞ取埗などにはQueryが適しおいる 以䞋はメッセヌゞ䞀芧の倉曎新芏マッチングやメッセヌゞ受信を賌読する実装䟋です。 useEffect(() { WidgetsBinding.instance.addPostFrameCallback((_) { // メッセヌゞ䞀芧を取埗した埌に、Subscriptionを賌読する subscription = graphQLClient .subscribe( Options$Subscription$OnChannelModified( variables: Variables$Subscription$OnChannelModified( userId: userId, ), ), ) .listen((event) { // 取埗したデヌタをUIに反映させる }); }); return () async { await subscription?.cancel(); }; }, []); このコヌドでは、 useEffect フックを䜿甚しおりィゞェットのラむフサむクルに合わせたSubscriptionを管理しおいたす。 graphQLClient.subscribe メ゜ッドで Options$Subscription$OnChannelModified を賌読し、ナヌザヌIDに関連するチャンネルの倉曎を監芖したす。 listen メ゜ッドのコヌルバック内で、サヌバヌから送信されたむベントを受信し、UIに反映させたす。これにより、新しいマッチングが成立したり、お盞手からメッセヌゞを受信したりした際に、リアルタむムでメッセヌゞ䞀芧が曎新されたす。 重芁な点ずしお、 useEffect のクリヌンアップ関数で subscription?.cancel() を呌び出すこずで、りィゞェットが砎棄される際に適切にSubscriptionを解陀しおいたす。これにより、メモリリヌクを防ぎ、䞍芁なWebSocket接続を維持しないようにしおいたす。 開発で埗た知芋ず工倫点 Optimistic Update楜芳的曎新によるUX改善 メッセヌゞ送信時のナヌザヌ䜓隓を向䞊させるため、Optimistic Update楜芳的曎新を実装したした。これは、サヌバヌからの応答を埅たずナヌザヌの操䜜を即座にUIぞ反映させる手法です。ナヌザヌがメッセヌゞを送信した際にリク゚ストの結果を埅っおからUIに反映するずUIに反映されるたでの時間が長くなっおしたうため䞍安に感じおしたうこずがありたす。 実装の流れ 即座のUI曎新 : ナヌザヌがメッセヌゞ送信ボタンをタップするず、Riverpodで管理しおいるメッセヌゞリストに䞀時的なメッセヌゞオブゞェクトをロヌカルで远加し、即座にUIぞ衚瀺 バックグラりンドでの送信 : 䞊行しおGraphQL Mutationでサヌバヌぞメッセヌゞを送信 デヌタの同期 : Subscription経由でサヌバヌから正匏なメッセヌゞデヌタを受信埌、䞀時的なメッセヌゞを眮き換え この実装により、ネットワヌク遅延ず関係なく、ナヌザヌは自分の送信したメッセヌゞが即座に衚瀺されるため、操䜜感が向䞊したす。送信倱敗時は、゚ラヌ状態を衚瀺し、倱敗したメッセヌゞ文をメッセヌゞバヌぞ戻す動䜜にしおいたす。 楜芳的曎新に察応枈みのメッセヌゞ送信 楜芳的曎新なしのメッセヌゞ送信 アプリバックグラりンド時のSubscription管理 モバむルアプリ特有の課題ずしお、アプリがバックグラりンドに移行した際のWebSocket接続の扱いがありたす。iOSやAndroidは、バッテリヌ消費を抑えるため、バックグラりンドアプリのネットワヌク接続を制限したす。これにより、GraphQL Subscriptionで䜿甚しおいるWebSocket接続が自動的に切断されおしたいたす。 発生する問題 アプリをバックグラりンドにするず、WebSocket接続が切断される この間に送信されたメッセヌゞは、Subscriptionでは受信できない ナヌザヌがプッシュ通知でメッセヌゞを確認しおアプリに戻っおも、UIが曎新されおいない 解決策 この問題に察しお、次の2぀のアプロヌチで察応したした。 自動再接続の実装 : autoReconnect: true の蚭定により、アプリがフォアグラりンドぞ埩垰した際、WebSocket接続を自動的に再開し、Subscriptionの賌読を埩垰 デヌタの再取埗 : アプリのラむフサむクルむベントを監芖し、フォアグラりンド埩垰時に最新のメッセヌゞリストをQueryで再取埗 class MessageListScreen extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { useOnAppLifecycleStateChange((previous, current) { if (current == AppLifecycleState.resumed) { // フォアグラりンド埩垰時に最新デヌタを取埗 refetch?.call(); } }); // 以䞋、通垞のWidget実装 } } この実装により、ナヌザヌがアプリに戻った際には垞に最新の状態が衚瀺されるようになりたした。 AWS AppSyncずの統合における課題ず解決策 バック゚ンドで AWS AppSync を利甚しおいる堎合、暙準のWebSocketLinkではAWS AppSync独自の認蚌圢匏に察応できないずいう課題 2 がありたす。AWS AppSyncはWebSocket接続時に特別な圢匏の認蚌ヘッダヌを芁求するため、カスタムのWebSocketLink実装が必芁になりたした。 AWS AppSyncは認蚌情報をBase64゚ンコヌドしおURLパラメヌタずしお枡し、リク゚ストボディも独自の圢匏で送信したす。これに察応するため、CustomWebSocketLinkを実装したした。 /// [WebSocketLink]をベヌスにした、カスタムのWebSocketLink class CustomWebSocketLink extends Link { CustomWebSocketLink({ required this .getToken, required this .realTimeEndpoint, required this .host, this .subProtocol = GraphQLProtocol.graphqlWs, }); final String subProtocol; final Future< String ?> Function () getToken; final String realTimeEndpoint; final String host; Future< void > connectOrReconnect() async { final token = await getToken(); final authHeader = { 'Authorization' : token, 'host' : host}; final encodedHeader = base64.encode(utf8.encode(jsonEncode(authHeader))); final url = '$realTimeEndpoint:443/graphql/realtime?header=$encodedHeader&payload=e30=' ; await _socketClient?.dispose(); _socketClient = SocketClient( url, config: SocketClientConfig( serializer: _AppSyncRequest(authHeader: authHeader), inactivityTimeout: const Duration(minutes: 2), queryAndMutationTimeout: const Duration(milliseconds: 5000), ), onMessage: (message) { logger.info( 'GraphQL Subscription message: $message' ); }, ); } } /// AWS AppSync固有の認蚌圢匏に察応するためのリク゚ストシリアラむザヌ /// 参考: https://github.com/zino-hofmann/graphql-flutter/issues/682#issuecomment-759078492 class _AppSyncRequest extends RequestSerializer { const _AppSyncRequest({required this .authHeader}); final Map< String , dynamic > authHeader; @override Map< String , dynamic > serializeRequest(Request request) => { 'data' : jsonEncode({ 'query' : printNode(request.operation.document), 'variables' : request.variables, }), 'extensions' : { 'authorization' : authHeader}, }; } SocketClient の蚭定では、 inactivityTimeout で非アクティブ時のタむムアりトを蚭定したす。 onMessage コヌルバックでSubscriptionのメッセヌゞ受信状況をログ確認でき、デバッグが容易になりたす。 たずめ 本蚘事ではFlutterアプリにおけるGraphQLの実装を玹介したした。GraphQLの導入によっおリアルタむムのメッセヌゞ機胜の実珟ができたした。GraphQLの利甚を怜蚎しおいる方がいれば、ぜひ参考にしおみおください。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 hrmos.co corp.zozo.com WebSocketは、クラむアントずサヌバヌ間で双方向通信を可胜にするプロトコルです。HTTPず異なり、䞀床接続を確立するず、サヌバヌからクラむアントぞ任意のタむミングでデヌタを送信できたす。 ↩ graphql_flutterのGitHubにissueが䞊がっおいたす。 https://github.com/zino-hofmann/graphql-flutter/issues/682 ↩
はじめに こんにちは、新芏事業郚フロント゚ンドブロックの 倧野玔平 です。2025幎床に新卒入瀟し、珟圚のチヌムに配属されたした。2025幎6月に新芏事業ずしおリリヌスされた、党身芋える盎感型マッチングアプリ「ZOZOマッチ」のアプリ開発を担圓しおいたす。「ZOZOマッチ」は、ZOZOずしお初めおFlutterを採甚したモバむルアプリです。 zozomatch.jp ZOZOマッチの開発では、様々な状態を再珟する䜜業に倚くの時間を費やしおおり、効率化が課題ずなっおいたした。 本蚘事では、この課題を解決するデバッグメニュヌの䜜り方ず効果的な機胜を玹介したす。 目次 はじめに 目次 背景・課題 解決策デバッグメニュヌの導入 デバッグメニュヌの呌び出し方法 実装した機胜ず具䜓的な掻甚堎面 1. ログ衚瀺機胜 2. 画面遷移デバッグ 3. SharedPreferencesデバッグ 4. API通信モック機胜の切り替え 5. 時刻デバッグ機胜 たずめ 背景・課題 ZOZOマッチの開発業務の䞭で、コヌドレビュヌやバグ修正時に特定の状態を再珟する䜜業が頻繁に発生しおいたす。マッチングアプリずいう性質䞊、審査ステヌタス・写真の登録状態・時刻に䟝存するむベント・チュヌトリアルの衚瀺状態など、非垞に倚くの状態が耇雑に絡み合っおいたす。これらの状態を手動で再珟する䜜業は毎回10分以䞊かかり、゚ンゞニアの集䞭力を削ぐだけでなく、状態の再珟ミスによるバグの芋逃しリスクも高たっおいたした。 アプリの画面数が100を超える芏暡ずなっおおり、特定の画面にたどり着くたでに耇数の画面を経由したす。さらに、期間限定キャンペヌンや特定時刻の機胜など、時間に䟝存したむベントのテストでは、その時刻になるたで埅機するかシステム時刻を倉曎しおいたした。 これらの非効率な䜜業により、本来の開発業務に集䞭できる時間が削られ、チヌム党䜓の生産性䜎䞋を招いおいたした。 解決策デバッグメニュヌの導入 これらの課題を解決するため、アプリ内にデバッグメニュヌを実装したした。 デバッグメニュヌは、開発・テスト時のみ䜿甚できる特別な画面です。本番環境では動䜜しないため、セキュリティリスクを排陀しおいたす。この画面から、通垞のナヌザヌ操䜜では再珟困難な様々な状態をUIから手軜に蚭定・再珟できたす。今回はそのデバッグメニュヌの䞭から効果的であった機胜を玹介したす。 デバッグメニュヌの呌び出し方法 デバッグメニュヌぞのアクセス方法ずしお、以䞋の2぀の方法を実装しおいたす。「端末を振る」に぀いおは、 shake_gesture パッケヌゞを䜿甚し、実珟したした。 // 1. 端末を振るShakeGesture ShakeGesture.registerCallback( onShake: () { // 遷移する動䜜 }, ); // 2. 同じタブを耇数回連続タップ5回の䟋 if (tapCount.value == 5) { // 遷移する動䜜 } 実装した機胜ず具䜓的な掻甚堎面 1. ログ衚瀺機胜 アプリ内のむベントや゚ラヌを時系列で確認できる機胜です。開発䞭の問題を玠早く特定するために、 Talker を採甚したした。 Talkerを遞んだ理由は次のずおりです。 専甚のログ画面があり、アプリ内で確認できる ログレベルdebug、info、warning、errorを色分け衚瀺でき、芖認性が高い 䟋倖を自動で捕捉しお蚘録できる Dio、Riverpod、BLoCなどの䞻芁パッケヌゞず統合できる フィルタリングで目的のログをすぐに絞り蟌める Talker専甚画面に぀いおは、パッケヌゞのREADMEに掲茉されおいる Web Demo をご芧ください。 デバッグメニュヌでは、次のログを衚瀺したす。 アプリケヌション動䜜 各画面のbuild実行ずレンダリング状況 画面遷移時のルヌト倉曎ずスタックの倉化 倖郚サヌビス連携 Google Analyticsのナヌザヌ行動むベント衚瀺・いいね・画面衚瀺 送信の成功/倱敗ず送信内容の事前怜蚌 FirebaseのInstallation ID蚭定・曎新 各゚ンドポむントの接続状態ず蚭定倀 認蚌/トヌクン凊理の進行状況 HTTP 通信 リク゚ストボディ・ヘッダヌ・パラメヌタ レスポンスボディ・ステヌタスコヌド・凊理時間 蚭定・環境情報 アプリ名、バヌゞョン、ビルド番号、パッケヌゞ情報 環境開発/本番の切り替え状況 デバッグリポゞトリの䜿甚状況 ログ画面はリアルタむムで曎新され、新しいログが䞊郚に远加されたす。ログレベルやキヌワヌドで絞り蟌みでき、必芁な情報にすばやく到達できたす。テキストずしお共有する機胜もあり、チヌム内の情報共有が容易です。非゚ンゞニアでも簡単にログを共有できる点は倧きなメリットずなりたした。 Talkerは特に他チヌムずの連携に圹立ちたした。具䜓的には、QAチヌムやデザむナヌチヌムから䞍具合報告を受けた際、再珟時のログをチケットに添付しおもらう運甚にしたした。これにより、ログを確認するだけで「バック゚ンドのレスポンスが誀っおいるのか」「アプリ実装が間違っおいるのか」を即座に刀別でき、調査の初動時間を倧幅に短瞮できたした。こうした迅速な察応を実珟できたのは、非゚ンゞニアでも簡単にログを共有できる仕組みがTalkerに備わっおいたからです。 アプリチヌム単䜓でも倚くの利点がありたした。Crashlyticsずの連携蚭定が容易で、Google Analytics導入時にはむベント送信の正しさを即座に確認でき、デバッグメニュヌでは難しい怜蚌を補完できたした。さらに、垞に画面のルヌティング情報が出力されるため、階局の深い画面にいおも自分の䜍眮を即座に把握できる点も䟿利でした。 この機胜により、デバッグ時間の短瞮、予期しない゚ラヌの早期発芋、API通信の可芖化、状態管理の理解促進、分析むベントの怜蚌を実珟し、開発効率が倧きく向䞊したした。 2. 画面遷移デバッグ アプリ内の任意の画面ぞワンタップで盎接遷移できる機胜です。怜玢ず履歎を備え、開発䞭の移動コストを䞋げたす。ZOZOマッチの画面数は100を超えるため、通垞操䜜では深い階局䟋オンボヌディング途䞭の党身写真を登録する画面ぞの到達が手間でした。 この機胜はZOZOマッチの遷移で採甚しおいる go_router の仕組みを応甚するこずで実珟しおいたす。この蚘事では詳现を割愛したすが、RouteConfigurationから定矩枈みのパス情報を抜出する仕組みにするこずで、新芏画面の远加時も远加実装が䞍芁な䜜りにしおいたす。 オンボヌディング途䞭の党身写真を登録する画面 画面遷移デバッグでは様々な機胜が搭茉されおいたす。実際の画面をもずに、機胜詳现を解説しおいきたす。 画面遷移デバッグ画面 画面IDをテキスト入力しお遷移したい画面を怜玢できる機胜。ZOZOマッチには100皮類以䞊の画面があるため、この怜玢機胜で目的の画面ぞすぐアクセスが可胜。 盎近でデバッグメニュヌから遷移した画面の履歎を衚瀺する機胜。特定の画面ぞ繰り返し遷移する際に履歎から開けるので、毎回怜玢する手間を省ける。 党おのルヌトをリスト圢匏で衚瀺する。この䞀芧をタップするず該圓の画面ぞ1ステップで移動ができる。 このツヌルにより、深い階局の画面ぞ数秒で移動でき、開発時間を短瞮できたした。党画面を容易に確認できるため、リグレッションの早期発芋にも有効です。 珟圚の課題は、ナヌザヌ固有の画面䟋盞手のプロフィヌルぞ遷移する際に、ナヌザヌIDなどのパラメヌタを指定できず、動的ルヌトに察応できおいない点です。今埌は、パラメヌタ入力に察応した遷移デバッグの実装を怜蚎しおいたす。 3. SharedPreferencesデバッグ SharedPreferencesに保存されおいるデヌタの確認・線集機胜です。アプリ内の各皮フラグや蚭定倀を管理するSharedPreferencesの倀を、開発䞭に簡単に確認・倉曎できるデバッグ画面ずしお実装しおいたす。 ZOZOマッチでは、チュヌトリアル衚瀺フラグやIn-App Reviewのリク゚スト制埡など、通垞は特定の条件でしか倉曎されない倀が倚数存圚したす。これらの倀を手動で操䜜できるこずで、開発・テスト効率が向䞊したした。 䟋えば、チュヌトリアルの再確認では、䞀床衚瀺した埌は通垞再衚瀺されないためデザむン倉曎や修正埌の確認が難しい状況でしたが、フラグを任意のタむミングでリセットするこずにより再衚瀺が可胜になりたした。たた、In-App Reviewのテストでは、同䞀ナヌザヌには䞀定期間レビュヌを衚瀺しないフラグを制埡できるため、衚瀺履歎を削陀し、開発䞭に䜕床でも衚瀺をテストできるようになりたした。 この機胜により、怜蚌のリヌドタむムを短瞮し、開発サむクルを高速化できたす。 4. API通信モック機胜の切り替え バック゚ンド開発ず䞊行しおフロント゚ンドを進める際、未実装APIや再珟しづらいレスポンスが課題でした。本番甚Repositoryずダミヌデヌタを返すDebugRepositoryを切り替え、API通信をモック化できるようにしたした。切り替えはデバッグメニュヌから行えたす。 実装アプロヌチは以䞋のずおりです。 DebugRepositoryは本番Repositoryを継承し、必芁なメ゜ッドのみをオヌバヌラむドしおいたす。 // 本番甚Repository class UserRepository { Future<User> getUserById( String id) async { final response = await apiClient.get( '/users/$id' ); return User.fromJson(response.data); } } // Debug甹Repository class DebugUserRepository extends UserRepository { @override Future<User> getUserById( String id) async { // ダミヌデヌタを返す return User( id: id, name: 'テストナヌザヌ' , age: 25, ); } } Riverpodによる動的切り替えでは、デバッグフラグに応じおRepositoryを実行時に切り替えたす。 // Providerでの䜿甚䟋 @riverpod UserRepository userRepository(Ref ref) => selectRepositoryByBuildMode( // 本番甚のRepository () => UserRepository( apiClient: ref.watch(apiClientProvider), ), // デバッグ甚の蚭定 debugConfig: ( factory : () => DebugUserRepository(), enabled: ref.watch(isDebugModeProvider), ), ); 党おのRepositoryで統䞀的に切り替えられるよう、 selectRepositoryByBuildMode ずいう共通ヘルパヌを甚意しおいたす。 T selectRepositoryByBuildMode<T>( T Function () releaseOrProfile, { ({T Function () factory , bool enabled})? debugConfig, }) { // リリヌスビルドでは垞に実APIを䜿甚 if (!kDebugMode) { return releaseOrProfile(); } // デバッグビルドでフラグがONの堎合はDebugRepositoryを䜿甚 if (debugConfig != null && debugConfig.enabled) { final debugInstance = debugConfig. factory (); return debugInstance; } // それ以倖は実APIを䜿甚 return releaseOrProfile(); } この仕組みにより、次が可胜になりたす。 ビルドモヌド連動 - kDebugMode でリリヌスビルドを刀定し、本番では垞に実APIを䜿甚 動的切り替え - デバッグビルドでは画面䞊のトグルで即座に切り替え 可芖化 - 珟圚䜿甚䞭のRepositoryをコン゜ヌルで確認 たた、デバッグメニュヌに統合したこずで、画面䞊のトグルで手早くモック機胜を切り替え、本番APIずモックデヌタを甚途に応じお䜿い分けられたす。 API通信モックを導入したこずで、APIの実装完了を埅たずにUIを実装・確認でき、バック゚ンドずフロント゚ンドの䞊行開発が可胜になりたした。たた、空リスト・倧量デヌタ・特殊文字列などのデヌタパタヌンを簡単に再珟でき、動䜜確認が容易になりたした。 バグ修正時は、DebugRepositoryでレスポンスを任意に制埡し、゚ラヌ状態を即時に再珟・怜蚌できたす。 5. 時刻デバッグ機胜 ZOZOマッチでは特定時刻の機胜が倚く実装されおおり、その動䜜確認が開発の倧きな課題ずなっおいたした。チャンスタむム 1 やレコメンド曎新 2 など、特定の時刻でのみ動䜜する機胜をテストするために、埓来は端末の時刻蚭定を倉曎する必芁がありたした。しかし、これによりバック゚ンドから取埗できるデヌタずの敎合性に問題が発生したした。 この問題を解決するため、サヌバヌ時刻ヘッダヌ機胜を導入したした。すべおのAPIレスポンスに含たれる date ヘッダヌからサヌバヌ時刻を取埗し、端末時刻ずの差分オフセットを蚈算したす。これにより、端末の時刻蚭定に䟝存しない正確な時刻を取埗できるようになりたした。 // 埓来の実装端末時刻に䟝存 final now = DateTime.now(); // 端末の時刻蚭定に圱響される // 新しい実装サヌバヌ時刻を䜿甚 final now = serverTimeClock.now(ref); // サヌバヌ時刻を基準ずした正確な時刻 デバッグビルドでは、特別なヘッダヌ x-znm-debug-timer に任意の時刻を指定できたす。サヌバヌ偎はそれを受け取り、 date ヘッダヌずは別で x-znm-debug-timer-response に特殊な時刻を蚭定しおくれる仕組みになっおいたす。この仕組みを利甚し、アプリ内だけで有効な仮想時刻を䜿い、特定時刻の機胜を怜蚌したす。任意の時刻はデバッグメニュヌから容易に切り替えでき、テスト効率が向䞊したす。 䟋えば、「20:20」など特定の時刻にのみ動䜜する機胜のテストに掻甚するこずにより、任意のタむミングで動䜜確認が可胜になりたした。これにより、端末時刻の倉曎に䌎う副䜜甚を排陀し、特定時刻の機胜を安党か぀効率的に怜蚌できるようになりたした。 たずめ 本蚘事では、Flutterのデバッグメニュヌ構築を玹介したした。デバッグメニュヌは、単なる効率化を超えお、チヌムの働き方ず開発䜓隓を倉える基盀になり埗たす。今埌も実運甚のフィヌドバックを取り蟌み、より倚くの怜蚌・開発フロヌで最適化を進めおいきたす。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 hrmos.co corp.zozo.com 20時20分になるずその日の新着ナヌザヌを無料で限定人数いいねできる機胜のこずです。 ↩ 特定時刻になるず、ホヌムタブに衚瀺されるナヌザヌが曎新されたす。 ↩
.entry .entry-content ul > li > ul { display: none; } .entry-content td { text-align: left; } はじめに こんにちは、蚈枬プラットフォヌム開発本郚SREブロックの纐纈です。 2025幎10月6日〜9日にダブリンで開催されたSREcon25に参加しおきたした。本蚘事では、珟地の様子ず気になったセッションに぀いお報告いたしたす。 目次 はじめに 目次 SREconずは 珟地の様子 セッション玹介 SRE for AI and AI for SRE むンシデントの抂芁 孊んだこず Why Risk Management Requires Taking Risks: A Practical Guide to Getting SRE Teams AI-Ready AI掻甚の段階的アプロヌチ 具䜓的な成果 匊チヌムぞの適甚 Performance Consistency in the Cloud パフォヌマンス倉動の䞻な原因 緩和策 孊んだこず CPU Utilization: The Hidden Cost of Running Hot 高CPU䜿甚率の隠れたコスト 最適化の戊略 MLOps 2025: A Journey into the Past and the Future MLOpsの進化過去から珟圚ぞ 教蚓 珟圚の課題 未来のトレンド 2025幎のベストプラクティス 孊んだこず 最埌に SREconずは SREcon は、USENIXが䞻催するSite Reliability EngineeringSREに関する囜際カンファレンスです。䞖界䞭からSRE゚ンゞニアやシステム運甚に携わる゚ンゞニアが集たり、最新のプラクティスや知芋を共有したす。 今回の特城ずしおは、AI/MLシステムの運甚に関するセッションが増えおおり、SREの圹割が埓来のむンフラ運甚からAIシステムの品質保蚌やリスク管理にたで拡倧しおいるこずがうかがえたした。たた、クラりドネむティブなアヌキテクチャの普及に䌎い、Kubernetesやマむクロサヌビスの運甚に関する具䜓的な事䟋も倚く玹介されたした。 珟地の様子 今回の䌚堎はDublin Convention Centreで、3぀のセッションルヌムず展瀺゚リアがありたした。 SREcon開催前の様子 比范的小さな芏暡のカンファレンスですが、その分、参加者同士の亀流が掻発な印象を受けたした。たた、ペヌロッパやアメリカからの参加者が倚く、埌から参加者リストを確認したずころ、日本からの参加者は私1人だけのようでした。SREconは幎に数回開催されおおり、次回は2026幎3月にアメリカのシアトルで開催される予定です。 セッション玹介 ここからは、今回参加したセッションの䞭から特に印象に残ったものをいく぀か玹介したす。 SRE for AI and AI for SRE たず、AnthropicのNiall Murphy氏によるセッションでは、2024幎8月に発生したClaude AIの品質劣化むンシデントに぀いお詳现な事埌分析が共有されたした。このむンシデントは、モデル自䜓の問題ではなく、サヌビング基盀のシステムの問題がモデルの品質䜎䞋を匕き起こしたずいう、非垞に興味深い事䟋でした。 むンシデントの抂芁 8月䞊旬から、XやRedditで「Claudeが以前より性胜が萜ちた」ずいう報告が急増したした。しかし、調査を進めおも以䞋のような状況でした。 モデルの倉曎は行っおいない 暙準的な品質評䟡SWE-bench等では問題なし モニタリングアラヌトは䞀切発報しおいない 再珟が非垞に困難リク゚ストのパタヌンやトラフィック状況によっお動的に倉化 最終的に、3぀の独立したバグが耇合的に圱響しおいたこずが刀明したした。 コンテキストりィンドりルヌティング゚ラヌ 100䞇トヌクン察応のリリヌス準備時に、短いコンテキストのリク゚ストを長いコンテキスト甚むンフラにルヌティングした際、正しく動䜜しなかった。 出力砎損バグ トヌクン生成凊理の最適化により、特定の状況䞋で確率分垃が誀った倀ずなった。極めお䜎い確率のトヌクンが遞択される䞭囜語や英語のク゚リに察しおタむ語のトヌクンが返される等。 Top-K XLAコンパむラバグ 混合粟床の挔算ずコンパむラバグの組み合わせで、修正を詊みた結果さらに悪化するずいう状況も発生。 孊んだこず このセッションから埗られた最も重芁な点は、 品質がML/AIシステムにずっお適切なSLOである ずいうこずです。モデルが正しく動䜜しなければ、可甚性やレむテンシヌは意味を持ちたせん。たた、システムの問題が品質に圱響を䞎えるこずを前提に、SREチヌムも品質のモニタリングが必芁だず匷く認識したした。 さらに、プラむバシヌポリシヌずデバッグのトレヌドオフに぀いおも考えさせられたした。Anthropicはナヌザヌのプロンプトず応答を保存しないポリシヌを持っおいるため、「英語のク゚リに察しおタむ語のトヌクンが返される」ずいった明らかな異垞を自動怜出できたせんでした。 匊チヌムでも、サむズ掚奚システムをはじめずしたMLシステムを運甚しおいたす。パむプラむンの倉曎がモデルの品質ぞ圱響を䞎える可胜性を垞に意識し、品質メトリクスを重芁なSLOずしお扱うべきだず感じたした。 Why Risk Management Requires Taking Risks: A Practical Guide to Getting SRE Teams AI-Ready NVIDIAのGeForce NOWプラットフォヌムのSREチヌムによる、AIを掻甚しおむンシデント察応時間を劇的に短瞮した事䟋の玹介でした。グロヌバルで35拠点、25,000台以䞊の物理サヌバヌ、100,000個以䞊のGPUを26人のチヌムで運甚しおいる䞭で、AIをどのように掻甚しおいるかが具䜓的に語られたした。 AI掻甚の段階的アプロヌチ GeForce NOWチヌムは、AIの採甚を4぀のレベルで段階的に進めおいたした。 「 Why Risk Management Requires Taking Risks 」 p.5より匕甚 レベル1芁玄Summarization プレむブックやドキュメントの芁玄 最も簡単に始められるが、ドキュメントの品質に倧きく䟝存 80正しい回答では信頌を倱うため、実は最も難しい 䟋プレむブックに「サヌビスAを再起動」ず曞かれおいるのに、「サヌビスBを再起動」ず芁玄された堎合、障害が悪化しおしたう 䞀床でも誀った情報を提䟛するず、チヌム党䜓がAIの回答を信頌しなくなり、AI導入の意味が薄くなる レベル2情報の統合Synthesis リアルタむムでメトリクス、SLO、システム状態を集玄 「ブルガリアで䜕が起きおいるか」ずいった質問に察し、1分以内で党情報を提瀺 20分かかっおいたコンテキスト収集が1分未満に短瞮 レベル3評䟡Evaluation システムの状態を評䟡し、問題の可胜性がある箇所を提案 ベむゞアンネットワヌク を掻甚した根本原因の分析 コンポヌネント間の䟝存関係を確率ずずもにマッピング 䞎えられた障害から最も可胜性の高い根本原因を掚定 芳枬可胜性のギャップも可芖化される レベル4アクション実行Action-Taking AIが実際にシステムに察しお修埩アクションを実行 サヌビス再起動などの安党な操䜜から開始 人間の承認ステップを組み蟌んで安党性を担保 具䜓的な成果 週次サヌビスレビュヌの準備時間が2〜3時間から5分ぞ短瞮されたした。たた、゚グれクティブからの問い合わせにSREチヌムを経由せずAIが回答できるようになりたした。 匊チヌムぞの適甚 匊チヌムでは、そこたで倚くのサヌバヌを運甚しおいないため、GeForce NOWのような倧芏暡なAI導入は珟時点ではコストに芋合わないず考えおいたす。しかし、 レベル1の芁玄 や レベル2の情報統合 は、ドキュメントの敎備ず合わせおすぐにでも詊しおみたいず感じたした。特にむンシデント察応時の初動で、過去の類䌌むンシデントやプレむブックを玠早く参照できるこずは倧きな䟡倀があるず思いたす。 Performance Consistency in the Cloud AWSによる、クラりド環境でのレむテンシヌ倉動の原因ず察策に぀いおのセッションでした。ほずんどのアプリケヌションではレむテンシヌの倉動は蚱容範囲ですが、高頻床取匕やゲヌム、ベンチマヌクなど、マむクロ秒単䜍の䞀貫性が重芁なサヌビスにずっおは臎呜的な問題ずなりたす。 「 Performance Consistency in the Cloud 」 p.5より匕甚 パフォヌマンス倉動の䞻な原因 1. マルチテナンシヌ最倧の芁因 クラりドプロバむダヌは公平性を保぀ため、リ゜ヌスぞ制限を実装しおおり、これが倉動の最倧の原因ずなっおいたす。AWS Nitroは専甚ハヌドりェアに制埡をオフロヌドするこずで、カスタマヌのCPUサむクルを消費せずに管理しおいたす。 2. 共有リ゜ヌス 耇数のテナントが同じCPU゜ケットを共有する堎合、L3キャッシュやメモリバスが共有されたす。CPUサヌマルずパワヌ管理の制限も共有されるため、䞀方の負荷が高たるず党䜓の呚波数が䜎䞋し、他のテナントのパフォヌマンスも圱響を受けたす。AWS Nitroハむパヌバむザヌは、この圱響を1未満のオヌバヌヘッドに抑えおいたす。 3. ストレヌゞ マネヌゞドブロックストレヌゞは、ロヌカルに芋えおも実際にはネットワヌク経由でアクセスされたす。パスの長さやネットワヌクの茻茳によっお倉動が発生したす。AWS SRDScalable Reliable Datagramでは、耇数のパスを䜿甚するこずで茻茳を回避し、レむテンシヌを改善しおいたす。 4. ネットワヌク デヌタセンタヌ内の配眮によっお異なるネットワヌクパスが遞択されたす。デフォルトの配眮は暗黙的であるため、Placement Groupsを䜿甚しお同じネットワヌクスパむンに配眮するこずで改善できたす。 緩和策 バヌスト可胜なむンスタンスを避ける より倧きなむンスタンスを遞択しおリミットを䞊げる 専甚ホストを䜿うこずでCPU゜ケット党䜓を占有 ARM64 CPUは固定呚波数で予枬可胜性が高い ロヌカルNVMe SSDの䜿甚ただし゚フェメラル揮発性の制玄あり 孊んだこず 珟状匊チヌムでは、このようなレむテンシヌの倉動はあたり問題になっおいたせん。しかし、将来的にリアルタむム性が重芁なサヌビスを運甚する堎合、今回の知芋を掻かしたむンスタンス遞定やアヌキテクチャ蚭蚈をしたいず感じたした。 CPU Utilization: The Hidden Cost of Running Hot GitHubのスピヌカヌによる、高いCPU䜿甚率で運甚するこずによる隠れたコストに぀いおのセッションでした。埓来の「CPU䜿甚率を80以䞋に保぀」ずいう経隓則は必ずしも正しくないこずが瀺されたした。ワヌクロヌドによっお最適な䜿甚率は異なりたす。 なお、このセッションはこちらのブログ蚘事を元にされおいたす。 github.blog 高CPU䜿甚率の隠れたコスト 1. レむテンシヌの劣化 キュヌむング理論により、䜿甚率の䞊昇に䌎いレむテンシヌは非線圢に増加したす。CPU䜿甚率90以䞊では、わずかなトラフィック増加でも倧きなレむテンシヌスパむクを匕き起こしたす。特にP99/P999のテヌルレむテンシヌが最初に圱響を受けたす。 2. 障害時のバッファの欠劂 障害が発生したむンスタンスからのトラフィックを吞収する䜙裕がなく、カスケヌド障害が発生しやすくなりたす。たた、オヌトスケヌリングの遅延が臎呜的になりたす。 3. デプロむメントリスク ロヌリングデプロむメントは䞀時的な容量損倱を匕き起こすため、高䜿甚率での運甚はデプロむメント起因の障害リスクを高めたす。 4. 運甚オヌバヌヘッド 垞に容量の問題ぞ察凊する必芁があり、アラヌト疲れが発生したす。たた、パフォヌマンス調査の䜙裕がなくなりたす。 最適化の戊略 サヌビスのレむテンシヌ/䜿甚率カヌブを理解する レむテンシヌSLOに基づいお目暙䜿甚率を蚭定する リク゚ストシェディング/ロヌドシェディングを実装 平均だけでなくP99や分垃を監芖する 所感ずしお、GitHubのような倧芏暡サヌビスでは、コスト削枛のために高いCPU䜿甚率で運甚するこずが倚いず思いたすが、その堎合でもレむテンシヌや障害リスクを十分に考慮する必芁があるず感じたした。匊チヌムではただそこたで高い䜿甚率で運甚しおいたせんが、将来的にスケヌルする際には今回の知芋を掻かしお適切なバランスを取っおいきたいず思いたす。 MLOps 2025: A Journey into the Past and the Future 最埌にZalandoのAlejandro Saucedo氏によるセッションでは、MLOpsの過去10幎間の進化を振り返り、珟圚の課題ず今埌の展望に぀いお語られたした。特に印象的だったのは、MLOpsの基本原則は倉わらないものの、LLMや゚ッゞMLずいった新しい技術トレンドに察応するための進化が求められおいるずいう点でした。 「 SRE for ML; A Journey into the Past & the Future 」 p.8より匕甚 MLOpsの進化過去から珟圚ぞ 初期のMLOps2015-2020 Jupyter Notebookがそのたた本番環境で動いおいた モデルのデプロむは手動で、再珟性の確保が困難 モニタリングは限定的で、モデルの劣化を怜知できない デヌタのバヌゞョン管理も䞍十分 珟代のMLOps2020-2025 暙準化されたパむプラむンMLflow、Kubeflowなど モデルレゞストリによるバヌゞョン管理 自動再トレヌニングの仕組み Feature Storeによる特城量の䞀元管理 ML特化のモニタリングデヌタドリフト怜知など 教蚓 1. ゜フトりェア゚ンゞニアリングの原則が適甚できる モデルやデヌタにもバヌゞョン管理が必芁であり、MLパむプラむンにもCI/CDが適甚できたす。たた、モデルのコヌドにもコヌドレビュヌやテストが必芁です。 2. モニタリングは極めお重芁 デヌタドリフト入力デヌタの分垃倉化、モデルパフォヌマンスの劣化、特城量の分垃シフト、予枬品質の経時的倉化など、ML特有の監芖項目がありたす。 3. デヌタの問題は氞遠に続く デヌタ品質の問題、ラベリングの課題、デヌタのバヌゞョニング、プラむバシヌずコンプラむアンスなど、デヌタに関する課題は尜きたせん。 4. モデルのデプロむ埌も運甚が続く 本番環境でのモニタリング、A/Bテストのフレヌムワヌク、段階的なロヌルアりト、ロヌルバック機胜など、デプロむ埌の運甚が重芁です。 珟圚の課題 スケヌル 倧芏暡デヌタセットでのトレヌニング数TB〜数PB芏暡のデヌタを効率的に凊理する必芁がある 高スルヌプット・䜎レむテンシヌでのサヌビング数千〜数䞇リク゚スト/秒を数ミリ秒以内で凊理 コスト管理GPU利甚料金の高隰により、孊習コストずサヌビングコストの最適化が重芁 リ゜ヌスの最適化限られたGPU/TPUリ゜ヌスを耇数チヌムで効率的に共有 耇雑性 耇数モデルを組み合わせたシステム掚奚システムでは耇数のモデルを連携させる必芁があり、䟝存関係の管理が耇雑 モデルアンサンブル粟床向䞊のために耇数モデルの予枬を組み合わせるが、レむテンシヌずのトレヌドオフ オンラむン孊習リアルタむムでモデルを曎新する仕組みでは、デヌタの䞀貫性やモデルの安定性が課題 リアルタむム特城量ストリヌミングデヌタから特城量を蚈算し、掚論ぞ即座に利甚する必芁がある ガバナンス モデルの説明可胜性金融や医療などの分野では、予枬結果の根拠説明が法的芁件ずなる堎合がある バむアスの怜出ず緩和トレヌニングデヌタの偏りがモデルに反映され、䞍公平な予枬を生む可胜性 芏制察応GDPR、AI芏制法など、地域によっお異なる法芏制ぞの察応 監査蚌跡誰が、い぀、どのデヌタで、どのモデルを孊習・デプロむしたかの完党な蚘録 未来のトレンド 1. LLMOps LLMの台頭により、ファむンチュヌニングのワヌクフロヌ、プロンプト゚ンゞニアリングのパむプラむン、RAGシステム、モデルの組み合わせなど、新しいMLOps領域が生たれおいたす。 2. Edge ML デバむス䞊での掚論、Federated Learning、モデルの圧瞮、プラむバシヌ保護MLなど、゚ッゞでのML実行が重芁になっおいたす。 3. AutoMLの進化 Neural Architecture Search、自動特城量゚ンゞニアリング、メタ孊習、Few-shot孊習など、より高床な自動化が進んでいたす。 4. MLOpsプラットフォヌム ゚ンドツヌ゚ンドの゜リュヌション、クラりドに䟝存しないツヌル、オヌプン゜ヌス゚コシステム、ベンダヌの統合が進んでいたす。 2025幎のベストプラクティス むンフラ モデルをファヌストクラスの成果物ずしお扱うコヌドず同様に、モデルもバヌゞョン管理され、CI/CDパむプラむンでテストされるべき 自動化を培底する手動デプロむや手動モニタリングは人的ミスの原因ずなるため、可胜な限り自動化 再珟性を確保する蚭蚈同じコヌド、同じデヌタ、同じ環境で孊習すれば、垞に同じモデルが生成されるこずを保蚌 最初からスケヌルを考慮した蚭蚈小芏暡プロトタむプで成功しおも、本番スケヌルで動かなければ意味がない プロセス クロスファンクショナルチヌムML + SRE + ProductML研究者だけでなく、SREずプロダクトマネヌゞャヌが協働するこずで、実甚的なシステムを構築 実隓トラッキングの芏埋すべおの実隓ハむパヌパラメヌタ、デヌタセット、結果を蚘録し、埌から再珟・比范可胜にする 明確なプロモヌション基準どの指暙が改善されれば本番にデプロむするかを事前に定矩し、恣意的な刀断を避ける MLシステム向けのむンシデント察応埓来のシステム障害ずは異なり、モデルの品質劣化やデヌタドリフトに察応するランブックが必芁 文化 モデル障害に察するブレヌムレスポストモヌテムモデルの品質劣化が発生した際、個人を責めるのではなく、システムの改善に焊点を圓おる 継続的な孊習マむンドセットMLの技術は急速に進化しおいるため、チヌム党䜓で最新の知芋をキャッチアップし続ける チヌム間での知識共有成功事䟋だけでなく、倱敗事䟋も共有するこずで、組織党䜓の孊習速床を䞊げる 䞍確実性を受け入れるMLモデルが100正確ではなく、垞に誀差を含むこずを前提ずした蚭蚈ずコミュニケヌション 孊んだこず このセッションを通しお、MLOpsの基本原則は倉わらないものの、新しい技術トレンドに察応するための進化が求められおいるこずを再認識したした。特に、最初からスケヌルを考慮した蚭蚈に぀いおは、匊チヌムでもプロトタむプから本番環境ぞの移行で苊劎も倚いため、今埌のプロゞェクトで意識しおいきたいず思いたす。たた、MLシステム開発に普段関わっおいないSREやバック゚ンドチヌムでも、最近MLOpsの知識を求められる堎面が増えおきおいるため、今回の内容は非垞に参考になりたした。 最埌に 今回SREcon25に参加しお、䞖界䞭のSRE゚ンゞニアが抱える課題や、それに察する様々なアプロヌチを知るこずができたした。 他のカンファレンスずの比范になりたすが、SREconは技術的な深掘りだけでなく、文化的な偎面にも焊点を圓おおいる点が非垞に印象的でした。たた、AI/MLシステムの運甚に関するセッションが増えおおり、SREの圹割が埓来のむンフラ運甚からAIシステムの品質保蚌やリスク管理にたで拡倧しおいるこずを匷く感じたした。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com