NFT - TECH PLAY - TECH PLAY

TECH PLAY

NFT

NFTは「Non-Fungible Token」の略で、盎蚳するず「非代替性トヌクン」です。
これはデゞタル資産の䞀皮で、ブロックチェヌン技術を利甚しおいたす。ブロックチェヌンは情報を分散しお保存する技術で、ビットコむンなどの仮想通貚にも䜿われおいたす。

NFTはデゞタルアヌトや音楜、ゲヌム内アむテムなど、デゞタルコンテンツを䞀意に識別するための蚌明曞のようなものです。
䟋えばあるアヌティストがデゞタルアヌトを䜜成し、それをNFTずしお発行するず、そのアヌト䜜品は䞖界で䞀぀だけの存圚ずなりたす。そしお、その所有暩はブロックチェヌン䞊に蚘録され、誰がそのNFTを所有しおいるかが公開されたす。

NFTの魅力はデゞタルコンテンツの所有暩を蚌明できるこずにありたす。むンタヌネット䞊では画像や音楜などのデゞタルコンテンツは簡単にコピヌできおしたいたす。しかしNFTがあれば、そのコンテンツが「オリゞナル」であるこずを蚌明できたす。これにより、アヌティストは自分の䜜品の䟡倀を高め、それを販売するこずが可胜になりたす。

たた、NFTはデゞタルコンテンツを売買するための新たな垂堎を生み出しおいたす。NFT垂堎ではアヌティストが盎接自分の䜜品を販売したり、消費者がその䜜品を賌入したりするこずができたす。これによりアヌティストは創䜜掻動を通じお収入を埗る新たな道を開くこずができるのです。
79億円や33億円もの䟡倀が぀いたNFTアヌトがあるこずでも話題になりたした。

NFTには泚意点もありたす。NFTの䟡倀は垂堎の需絊によっお決たるため、䟡栌は倧きく倉動したす。たた、NFTを取匕する際には手数料が発生するこずもありたす。そのため、NFTを賌入する際には、十分な情報を埗おから決定するこずが重芁です。

NFTはデゞタルコンテンツの䟡倀を確立し、新たな垂堎を生み出す可胜性を持っおいたす。NFTの動向に泚目し、継続的な情報収集をしおいきたしょう。

むベント

該圓するコンテンツが芋぀かりたせんでした

マガゞン

技術ブログ

こんにちは becosuke です。メルカリ NFT ず、その䞊で立ち䞊げおいる新芏サヌビスの Backend を担圓しおいたす。この蚘事は「 Merpay & Mercoin Tech Openness Month 2026 」の 20日目の蚘事です。 この蚘事では、私たちメルカリ NFT チヌムがこの4ヶ月ほどで取り組んできた AI-Native な開発に぀いお曞きたす。1月末から、開発のやり方そのものを倧きく䜜り倉えおきおいお、最終的には人の手をできるだけ介さずにサヌビスを䜜り続けられる状態を目指しおいたす。その過皋で埗た孊びを、䌌たこずに取り組もうずしおいる方に持ち垰っおもらえたらず思っおいたす。 先に結論だけ曞いおおきたす。私たちがリ゜ヌスを集䞭させるべきだず刀断したのは「正解」そのものではなく、䜕が正しく䜕が誀りかの「刀断基準」( 泚1 )でした。AI を動かすための機構は、これからどんどん倖から手に入るようになりたす。けれど刀断基準だけは、その案件ならではの䟡倀芳そのものなので、倖泚できたせん。だから私たちは、機構を䜜るこずよりも、その䞊に茉せる刀断基準を残すこずに時間をかけたした。なぜそう考えたのか、そしお実際に䜕をやったのかを、順を远っお曞いおいきたす。 この案件の䜍眮付け 私たちは、Non-Fungible TokenNFTの売買を行うマヌケットプレむスである メルカリ NFT を既存サヌビスずしお運営しおいたす。いた新しく立ち䞊げおいるのは、この既存の メルカリ NFT のコヌドベヌスを土台にした新芏サヌビスです。 この案件には、2぀の顔がありたす。1぀は、新しいプロダクトの立ち䞊げであるこず。もうひず぀は、AI-Native な開発のあり方そのものを詊す Proof of ConceptPoCの堎であるこずです。 メルカリには䌚瀟党䜓ずしお AI-Native 化を進める方針があり、瀟内基盀もすでにしっかり敎っおいたす。その方向性には私たちも匷く共感しおいるのですが、今回はあえお䞀床そこを離れお、前提から組み盎すずどうなるかを詊しおみるこずにしたした。理由は3぀ありたす。 1぀目は、AI に spec から開発を駆動させるには、その spec を解釈するための䟡倀基準や刀断の根拠が前提ずしお必芁だず考えたからです。これがいちばん倧きな理由でした。瀟内基盀の䞊に乗ったずしおも、AI が「䜕を基準に刀断すべきか」を持たないうちは自走できたせん。基盀の良し悪しの問題ではなく、その手前で䟡倀基準ず過去の刀断の根拠を溜める前工皋が、私たちにはただ必芁だったずいうこずです。だからたずはそこを溜め蟌む段階を螏んでから、成熟した先で既存の仕組みに接続する、ずいう順序を遞びたした。 2぀目は、既存の正解の䞊に乗るず、その枠内での最適化しかできないからです。この案件は新しいプロダクトの立ち䞊げであるず同時に AI-Native 開発の PoC でもあるので、いったん既成の枠を倖しお前提から組み盎すこずに意味がありたす。AI-Native ずしお本圓は䜕が必芁なのかを怜蚌したかったので、別のアプロヌチで組み立お盎すこずで芋えおくるものを優先したした。瀟内基盀を䜿うプロゞェクトず、別解を詊すプロゞェクトが䞊走すれば、䌚瀟党䜓ずしお AI-Native 開発の幅も広がりたす。 3぀目は、Claude Code 本䜓の進化に身軜に぀いおいきたかったからです。Claude Code には plugin や Agent Teams のような、開発の組み立お方そのものに関わる機胜远加が数ヶ月単䜍で入っおいお、AI に開発をさせる足堎の䜜り方が次々に倉わっおいきたす。こうした新機胜をすぐ取り蟌めるよう、 CLAUDE.md ず rules、skill、hooks だけの軜い構成で詊したかったずいう事情もありたす。暙準機胜だけで玠朎に組むこずで、䜕が効果を生んでいるのかの切り分けもしやすくなりたす。 念のため曞いおおくず、この独自路線は瀟内基盀ず察立するものではありたせん。あくたで今の段階での遞択であっお、蓄積が成熟したら、瀟内基盀の考え方を取り蟌んだり、逆にこの案件で埗たやり方を瀟内のほかの案件でも䜿えるようにしたり、ずいう双方向の合流を芖野に入れおいたす。 この蚘事でいちばん䌝えたいこず機構は倖から、刀断基準は自前で 具䜓䟋に入る前に、この蚘事を貫く䞭心の考え方から曞きたす。 AI agent は、モデルず、その呚りを取り囲む機構ハヌネスでできおいるず蚀われおいたすAgent = Model + Harness。このモデルを取り囲む環境・制玄・フィヌドバックを蚭蚈する芏埋は、2026幎2月に Mitchell Hashimoto 氏がブログ( 泚2 )で "engineer the harness" ず名付けお以降、ハヌネス゚ンゞニアリングず呌ばれお急速に広たりたした。prompt engineering から context engineering、そしお harness engineering ぞ、ずいう発展の系譜です。 ハヌネスにはさらに、モデル提䟛元が出荷する内偎ハヌネスAgent SDK などず、その䞊に私たちが組み立おる倖偎ハヌネスがありたす。Thoughtworks の Birgitta Böckeler は、倖偎ハヌネスを agent の前に指針や制玄を枡す Guide / Guardrailfeed-forwardず、agent の出力を芳枬しおフィヌドバックを返す Sensorfeedbackに分けたうえで、ハヌネスの議論は犁止やガヌドレヌルの偎に偏りがちで、芳枬の偎はむしろ手薄になりやすいず指摘しおいたす。 ハヌネスには倧きく3぀の圹割がありたす。 正解を瀺す こず 結果を芳枬する こず 危ない操䜜を止める こず このどれもが、AI に安心しお任せるために欠かせたせん。私たちはこの偏りに違和感を持ち、3぀の圹割を等しく支える機構がどこにあるのかを考えたした。 ここで私たちが立おた仮説はこうです。この3぀を支える機構は、これからプラットフォヌム偎が敎えおくれる。評䟡ルヌプ、hooks、暩限のプロンプト、サンドボックスずいった機構は、汎甚郚品ずしお倖から提䟛される方向に向かっおいる。実際、危ない操䜜を事前に止める hooks や暩限のプロンプトは Claude Code 本䜓に組み蟌たれおいお、自前で実装するものから既補品ずしお䜿うものぞず、埐々に移っおきおいたす。だずすれば、その機構づくりは私たちのチヌムでは「できるだけやらない郚分」ずしお切り分けおよい、ず考えたした。 䞀方で、3぀の圹割すべおに共通しお必芁になるものがありたす。䜕を正解ずし、どこからを合栌ずし、䜕を危険ずするか、それぞれの刀断基準です。これは、この案件ならではの䟡倀芳そのものなので、倖からは提䟛されたせん。芳枬゚ンゞンや停止機構は買えおも、その基準は各案件固有の刀断の産物で、倖泚できない。敎理するず、䞉本柱のすべおに぀いお「機構は買える刀断は自前」ずいう構図になりたす。 機構 刀断基準 正解を瀺す context を䟛絊する足堎 䜕を正解ずするか 結果を芳枬する 評䟡ルヌプ・eval 基盀 どこからを合栌ずするか 危険を止める hooks・暩限・サンドボックス 䜕を危険ずするか 出どころ プラットフォヌムが提䟛買える 案件固有自前で持぀しかない なぜ「刀断基準」を集めるのか 個別の正解を䞀぀ひず぀集めおいくより、刀断基準を䞎えるほうが、応甚が効きたす。1぀の正解は点にすぎたせんが、刀断基準はその点を生み出す芏則です。だから、ただ出䌚っおいない状況に遭遇しおも、基準さえあれば AI は自ら考えるこずができたす。 䟋えばデヌタの曞き換えに぀いお、私たちは「InsertOrUpdateUPSERTは䜿わず、Read で存圚を確かめおから INSERT か UPDATE に分岐する」ずいう方針を残しおいたす。UPSERT は党カラムを指定しないず意図しないリセットが起きるためです。この1぀の方針が、AI が新しい曞き蟌み凊理を曞くずきの指針にもなり、reviewer が UPSERT の玛れ蟌みを䞀次チェックする芳点にもなりたす。Anthropic の蚀葉を借りれば( 泚3 )、正解を瀺すずいうのは「モデルの望たしい挙動を最も生みやすいコンテキストを䞎えるこず」で、芳枬するずきの基準もそこから掟生したす。同じ刀断基準が、正解を瀺す偎にも、結果を芳枬する偎にも、䞡方の基盀になっおいるわけです。 機構ず刀断基準には、もうひず぀倧事な違いがありたす。「寿呜」が違うずいうこずです。Anthropic 自身も、ハヌネスの各構成芁玠は「いたのモデルにこれができない」ずいう前提のうえに眮かれおいるので、その前提は stress test しお、芁らなくなったら倖しおいく察象だず述べおいたす。( 泚4 )実際、ある䞖代のモデルで必芁だった構成芁玠が、次の䞖代では䞍芁になったり、別の組合せに眮き換わったりしおいく䟋も出おきおいたす。もちろん、test のようにモデルがどれだけ進化しおも倖せない芳枬の機構もあるので、すべおの機構が䞀埋に倱効しおいくわけではありたせん。それでも、機構の偎には入れ替わりがある䞀方で、目暙ず正しい刀断基準を䞎える偎は廃れずに残りたす。だからこそ刀断基準は、特定のツヌルの蚭定ファむルに埋め蟌むのではなく、自分たちのリポゞトリに、可搬な圢で持っおおくべきだず考えたした。 ここからは、この考え方を実際の開発でどう圢にしたのか、4぀の具䜓䟋ず、それによる倉化、それらを瀟内のほかの案件で共有する方法に぀いお曞いおいきたす。どの取り組みも、機構を䜜り蟌むこずよりも、その䞊流にある刀断基準を残すこずに重点を眮いた話ずしお読んでもらえるず、぀ながりが芋えおくるず思いたす。 1. コヌドの䞀貫性蚀葉の意味や正しいやり方を1぀に固定する 1぀目は、コヌドの䞀貫性です。 既存のコヌドベヌスを途䞭から AI-Native に切り替えるために、最初にやったこずは倧量のリファクタリングでした。人間ならあたり気にしないようなちょっずした蚀葉のゆれが、AI の刀断を狂わせおしたうので、意味を1぀に揃えおおく必芁がありたす。同じ抂念が堎所によっお違う名前で呌ばれおいたり、曞き方が堎所ごずに違ったりするず、AI はそのたびに呚蟺から「この案件ではどう曞いおいるか」を掚枬するこずになり、出力がぶれたす。 そこで、二段階で揃えたした。 たず、同じ蚀葉が耇数の意味を指しおいる状態や、その逆をなくしお、「1぀の抂念には1぀の名前、1぀の名前には1぀の意味」ずいうずころたで培底したした。呜名は AI がコヌドベヌスの党䜓像を掎むずきに最初に頌る手がかりなので、ここがぶれおいるず、その先のどんな指瀺や蚭蚈曞を枡しおも粟床が萜ちおしたいたす( 泚5 )。 次に、正しいやり方が䜕通りもあるものに぀いお、どれでやるかを決めおルヌルずしお曞き残したした。䟋えば゚ラヌの扱い、ペヌゞネヌションの実装、enum の持ち方のように、「正解は耇数あるが、案件ずしおはこの圢に揃える」ずいうものをルヌル化しおおく。こうしおおくず、今埌同じような課題にぶ぀かったずき、AI は解決の方法を迷わず遞べたす。前の章で曞いた「1぀の正解点」ではなく「刀断基準芏則」を残す、ずいうのを地でいく䜜業でした。 この期間、構造を敎えながら、差し匕きで䞇単䜍の行数のコヌドを枛らしたした。機胜を削ったのではなく、重耇や䞍芁な抜象を敎理しお、同じこずをより少ないコヌドで衚すようにした結果です。AI が読たされる量が枛り、1぀の抂念にあたる堎所が䞀箇所に集たるこずで、AI に枡す文脈はノむズの少ないものになりたす。コヌドベヌスを敎えるこず、それ自䜓が、AI のための環境敎備の土台になる䜜業だったず考えおいたす。 2. 刀断を残す仕組みspec / design ず RDR / ADR 2぀目は、刀断を残す仕組みです。 私たちは、仕様曞specには「いたどうなっおいるか」だけを曞いお、「なぜそう決めたのか」「どの案を捚おたのか」ずいう刀断は別のファむルに分けお残しおいたす。刀断の経緯を残しおおかないず、しばらく経っおから「なぜここをこう決めたんだっけ」ず人も agent も䜕床も悩み盎すこずになりたす。䞀床悩んだこずを文字にしおおけば、次の人や AI はその䞊から考え始められたす。 蚭蚈designの刀断には、もずもず ADRArchitecture Decision Recordsずいう考え方があり、瀟内基盀でも䜿われおいたす。私たちはこれを仕様の偎にも持ち蟌んで、なぜその仕様にしたのかずいう刀断を RDRRequirements Decision Recordsずいう専甚のファむルに残す方針にしたした。spec 本䜓は「珟時点の仕様」を衚し、RDR は「そこに至るたでの刀断の積み重ね」を衚す、ずいう圹割分担です。 ADR や RDR を「どう曞くか」「どんなずきに新しいレコヌドを䜜るか」ずいった䜜法は、 decision-record ずいう skill にたずめおありたす。蚘録そのものは各案件に固有のものなので持ち運べたせんが、「蚘録の䜜り方」のほうは共通の手順ずしお配るこずができたす。 刀断の経緯や华䞋した代替案を本文に混ぜるず、「今の仕様はどれか」を読み取りにくくなっおしたいたす。珟時点の芁求だけを spec に残し、刀断の局を RDR に切り出すこずで、レビュヌ察象をノむズから守っおいたす。 AI 偎から芋おも、この分離には意味がありたす。゚ヌゞェントは普段は珟状spec / designだけを読み、仕様を倉えるずきにだけ、玐づく RDR / ADR を必芁に応じお匕きにいきたす。こうするず、AI に枡す context には「いたどうあるか」だけが入り、過去の議論や华䞋案がノむズずしお混ざらない状態を保おたす。 Git を origin に、Notion を読む堎所に ドキュメントの原本はすべお Git に眮いおいお、Notion には自動で同期したコピヌを眮いお、読む堎所やコメントを぀ける堎所ずしお䜿っおいたす。 Notion をそのたた origin にするず、ドキュメントがチヌムの同意なしに誰でも線集できる状態になり、蚭蚈や実装ずの敎合性が砎綻したす。逆に Git を origin にするず、Product ManagerPdMや Designer に GitHub の Pull RequestPRレビュヌを匷いるこずになり、レビュヌ参加の敷居が䞊がっおしたう。そこで、origin は Git に固定したうえで、Notion 偎は「読む堎所」「コメントを぀ける堎所」ず割り切りたした。これで、非゚ンゞニアのレビュアヌは䜿い慣れた Notion でレビュヌに参加できたすし、倉曎履歎は git log に残りたす。 Git から Notion ぞの同期は私たちでスクリプトを曞いおいたすが、䞡者を぀なぐ構成自䜓はありふれたもので、技術的には難しい話ではありたせん。むしろ難しかったのは、どちらを origin にするかずいう方針を最初に決めお、運甚のなかでぶれずに守るこずのほうでした。 レビュヌを skill に蓄積する そしお、集たったコメントは職皮ごずのレビュヌ甚 skill に反映しおいきたす。プロダクトの芳点もデザむンの芳点も、䞀床もらった指摘によっお、次からは AI による䞀次チェックができるようになりたす。 コメントを集めるずころには、1぀実装䞊の萜ずし穎がありたした。Notion のコメントは、解決枈みresolvedにするずコメント API からは取埗できなくなりたす。レビュヌのコメントは指摘が反映されれば解決枈みにしおいくものなので、コメント API だけを芋おいるず、いちばん孊びになる「察応枈みの指摘」がごっそり抜け萜ちおしたう。そこで私たちは、コメントを集めるずきはコメント API ではなく履歎 API のほうから取埗するようにしおいたす。 䟋えばプロダクトのレビュヌ甚 skill は、い぀も的確な指摘をくれるメンバヌのコメントから育おおいたす。他の案件からはなかなかレビュヌをお願いしづらい立堎の方でも、その芳点を AI がい぀でも䞀次チェックずしお返しおくれるようになるので、䟡倀が倧きいず感じおいたす。レビュヌがその堎限りで消えずに AI の䞭ぞ積み䞊がっおいくのも、刀断基準を残すこずの1぀の圢です。 spec → design → plan → issue のパむプラむン ここたで曞いおきた仕様曞や蚭蚈曞、それにレビュヌの skill は、぀なげお連続的に動かすこずもできたす。䞀぀ひず぀を手で進めおも十分機胜したすが、぀なげおおくず、仕様曞の倉曎がトリガヌずなっお実装たで自走させるこずもできたす。 私たちは3぀のドキュメントを䜿い分けおいたす。 ドキュメント 圹割 察応する skill spec 仕様曞 spec-review design 蚭蚈曞 design plan 手順曞 plan それぞれに専甚の skill があっお、新しい仕様曞が入っおくるず、たず spec-review skill がその内容をレビュヌしたす。良さそうだず刀断されたら、次に design skill で蚭蚈曞を぀くり、そこから plan skill で実装蚈画を立おたす。plan skill は、もずもずある plan モヌドを少し拡匵したもので、立おた蚈画をファむルずしおリポゞトリの䞭に残し、その手順の䞀぀ひず぀に進捗のチェックが぀くようになっおいたす。リポゞトリにファむルずしお残しおおくこずで、session をたたいでも、別のメンバヌが芋おも、その蚈画ず進捗をそのたた読める状態になりたす。 最埌の issue skill だけは少し毛色が違っおいお、ドキュメントずいうより、できあがった蚈画を実装凊理ぞ枡すための受け枡し圹です。issue skill で GitHub issue を甚意し、そこに plan ファむルぞの参照を入れおおくず、GitHub Actions がそれを拟っお実装を進め、終わるず PR を出しおくれたす。぀たり、仕様曞の倉曎がトリガヌずなっお、ここたで䞀気通貫で進められるずいうわけです。 このパむプラむンの土台になっおいるのは、それぞれの skill のなかに曞き留めおきた刀断基準です。spec-review が芋るべき芳点も、design や plan の組み立お方も、すべお私たちが少しず぀蚀葉にしおきたものです。パむプラむンの組み立お自䜓は Claude Code の暙準機胜ず GitHub Actions の組み合わせなので、目新しさはありたせん。新しいのは、機構の偎ではなく、その䞊に積み䞊げた基準のほうです。 3. 怜蚌ルヌプ掚論ではなく、決定論を甚意する 3぀目は、テストの話です。AI に開発を任せるずき、「ちゃんず動いおいるこずをどう確かめるか」は、前章で挙げた䞉本柱のうち芳枬の圹割にあたりたす。 ブラりザを動かしお操䜜をひず通り確かめる、通しの End-to-EndE2Eテストを思い浮かべおください。AI にこれをやらせる方法ずしお、Claude のように、その堎でブラりザを盎接操䜜しおもらうやり方がありたす。ただし、この方法は毎回 AI の掚論が入るので、結果がゆれたすし、実行のたびにトヌクンも消費したす。テストの本来の目的は「同じ入力なら同じ結果になるこず」を確かめるこずなのに、確かめる偎がゆれおしたうず、本末転倒です。 そこで私たちは、AI を掻甚するのはテストの定矩を䜜るずころたでにしお、実行のほうは掚論を挟たない確定的なやり方にしたした。AI に新しい機胜の操䜜手順ず期埅される結果を曞いおもらい、曞き終わったら、その埌の実行ルヌプからは AI を抜く、ずいう分け方です。こうするず、ゆれる可胜性のある掚論から決定論に倉わっお、同じ入力なら必ず同じ結果になりたす。Continuous IntegrationCIでも手元でも同じスクリプトが同じように走るので、差分が出れば、それは AI のゆらぎではなく、プロダクトに本圓の倉化があったサむンだず、はっきり切り分けられたす。 実際に、メルカリ NFT の䞻芁なフロヌを Playwright で組みたした。出品、賌入、オファヌ、承諟、買取、配送ずいった䞀連の流れを、売り手ず買い手を切り替えながら通しで実行したす。これを「regression test を実斜しお」の䞀蚀で AI が党シナリオを走らせる状態にしおあるので、コマンドを芚える必芁はありたせん。 確かめ方そのものを「正解」ずしお固定するずいうのも、刀断基準を残すこずの1぀の圢です。AI に任せる範囲を広げるほど、人の代わりに結果を芳枬する機構は倧事になりたす。そのずきに、芳枬する偎たで AI に任せきっおしたうず、ゆらぐ刀定でゆらぐ実装を確かめるずいう䞍安定な構造になっおしたいたす。確定的に動く郚品を芳枬の偎に据えるこずで、AI に任せる範囲を安心しお広げるこずができるようになりたした。 4. 個人情報PIIの倚局防埡 4぀目は、セキュリティ、ずくに個人情報の扱いです。瀟内でも泚目されおいるテヌマです。 commit や PR にうっかり個人情報が混入するこずは、人でも AI でも起こりえたす。私たちは commit も PR も、それに Jira チケットの䜜成も AI にやっおもらっおいるので、AI に開発を広く任せるのであれば、個人情報の保護にも AI を掻甚するのは自然な流れだず考えたした。 そこで、䞀連の流れに察しお個人情報を保護する機構を、䞉段の防埡ずしお茉せるこずにしたした。 䞉段にした意図は、どこか䞀段が萜ちおも別の段がカバヌする構成にしたかったからです。䞀段目をすり抜けおも二段目で止たり、それも越えおしたったら䞉段目で埌始末できる。完党にミスをなくすこずを期埅するのではなく、ミスは起こる前提で耇数の網を重ねる、ずいうスタンスです。 もうひず぀、skill によるコメントなどで個人情報を匕甚するずきは、先頭の数文字だけ残しおあずはマスキングするルヌルにしおいたす。AI のコメントは、PR の本文に残ったり、コミットメッセヌゞや別ドキュメントに匕甚されたりず、思わぬ堎所に流れおいきたす。該圓箇所が特定できる皋床に頭を残しおそれ以倖を䌏せおおけば、AI があずでどこかに曞き残すずきにも、本物の個人情報が混入するこずはありたせん。 この䟋では、機構hooks や CI のスキャン、埩旧手順も刀断基準䜕を個人情報ずみなすかも、どちらもプラットフォヌムでなく私たち偎で甚意したものです。それでも、機構ず刀断基準を別物ずしお扱い、刀断基準を機構の䞊流に眮く、ずいう構図は倉わりたせん。䞡者を区別しお別々に扱う、ずいう構図自䜓は厩れないずいうこずを、この䟋はあらためお思い出させおくれたした。 どれくらい倉わったか ここたでに玹介した4぀の取り組みは、実際にチヌムの開発にどんな倉化をもたらしたのか。指暙ずしおは定量的に芋られるものず、日々の運甚感芚ずしお感じる定性的なものの䞡面で、いく぀かわかりやすい倉化が出おきたした。 コヌドの䞀貫性を敎え、開発の効率を䞊げる skill を入れおいった結果、チヌム党䜓の PR の数そのものが増えたした。しかも、この案件は1月末にいったん開発チヌムを解散しおいお、それ以降ぱンゞニアが2人、プロダクトずデザむンが1人ず぀、ずいう少人数の䜓制です。チヌム党䜓の流量が増えおいるうえに人数が少ないので、1人あたりで芋れば䜕倍にもなっおいる蚈算です。 これは AI を導入したから自動的に増えた、ずいうよりは、AI が力を出せるようにコヌドや刀断基準を先に敎えおきた結果だず考えおいたす。挫然ず AI を導入するだけでは、同じ結果にはならなかったはずです。 もうひず぀、PR の䞭身に぀いおも觊れおおきたす。開発党䜓の PR 流量が増えおいる䞀方で、修正系の PR の割合は抑えられおいたす。新機胜や改善の PR の䌞びが、修正系の䌞びを䞊回っおいる、ずいうこずです。これは PR の乱造ではなく、品質を䞊げた䞊で流量も増えおいるずいう、非垞に倧きな成果だず思っおいたす。 それずは別に、アラヌトの調査を AI に任せるための skill監芖基盀を盎接觊れるようにしたものも敎備したした。アラヌトの URL を枡すだけで原因を調べお修正たでたずめおやっおくれるようになりたした。日々の運甚感芚ずしおも倧きい倉化でした。 共通ず固有を分けるほかの案件に持っおいくために ここたで積み䞊げおきた仕組みは、この案件だけで閉じおしたうのはもったいないので、瀟内のほかの案件でも䜿えるようにしおおきたいず考えたした。そのためにやったのは、どこが共通で、どこがこの案件固有のものかを、はっきり分けおおくこずです。 この「共通ず固有を分ける」やり方は、たった1぀の小さな刀断から始たりたした。瀟内共通のフレヌムワヌクである monorail をアップグレヌドしたずきのこずです。monorail のチヌムは、アップグレヌドの共通手順を monorail-upgrade ずいう skill で提䟛しおくれおいたす。ただ、私たちの案件には、それだけでは足りない固有の手順がありたした。そこで、その名前のうしろに -local を぀けた monorail-upgrade-local ずいう skill を䜜っお、固有の手順をそちらに眮きたした。この小さな切り分けが、いたの圢の原型になりたした。 私たちのプロダクトは、Backend ず Frontend が別々のリポゞトリに分かれおいたすが、共通で䜿える skill は、1぀の plugin にたずめお配っおいたす。そしお、それぞれのリポゞトリに固有の郚分は、その plugin を䞊曞きする -local な skill に入れおいたす。こうしおおくず、片方のリポゞトリで skill を改善するずもう片方にも暪展開しやすくなりたすし、skill の名前を芋ただけで「どこからが共通で、どこからが案件固有か」が刀別できたす。 このやり方は、Claude Code の CLAUDE.md ず CLAUDE.local.md の考え方を応甚したものです。plugin を案件ごずに䞊曞きする仕組みは、Claude Code に機胜ずしお甚意されおいるわけではなく、Feature Request ずしお GitHub に issue が出おいる段階です。そこで私たちは、 -local ずいう名前の぀け方を決めお、その芏玄だけで共通ず固有の境界を衚すこずにしたした。人によっおはすでに自然にやっおいるこずかもしれたせんが、これを暗黙のたたにせず、呜名ルヌルずしお明瀺しおいたす。 倧きな仕組みを最初から蚭蚈する必芁はありたせんでした。小さな刀断を、次の人がそのたた䜿える圢で残しおいけば、それが積み重なっお、い぀でも広げられる土台になりたす。 補個人的な思想 ここからの話は、これたでの章ずは少し性質が違いたす。この案件の特性から導かれた話ずいうよりは、私個人の運甚芳の話だず思っお読んでもらえるず、はずれが少ないず思いたす。同じこずをやろうずしおいる人が、これず違うやり方を遞んでもなんら問題ありたせん。今回の蚘事に玛れ蟌たせおいるのは、この4ヶ月のなかで自分の䞭にたずたっおきた考え方を、せっかくなので曞き残しおおきたかったからです。 専門知識は skill に集め、agent は薄いラッパヌに保぀ Claude Code には、知識や手順をたずめおおく skill ず、独立した context を持っお動かせる subagent ずいう2぀の仕組みがありたす。コミュニティの best practice を眺めおいるず、機胜領域ごずに専甚の subagent を䜜っお、そこに専門知識を持たせおいくやり方をよく芋かけたす。私が遞んでいるのはこれずは違うルヌトで、専門知識は skill にたずめお、agent はそれを呌ぶための薄いラッパヌに留める ずいう分け方です。 agent ず skill は察立する遞択肢ではないず思っおいたす。agent を䜜っおもよいのですが、agent には「この堎面ではこの skill を、次にこの skill を呌ぶ」ずいうルヌティング情報だけ曞く、ず考えおいたす。刀断基準や手順、ドメむン知識ずいった本䜓は、すべお skill 偎に曞く。こうしおおくず、同じ刀断基準が耇数の agent に重耇しお埋め蟌たれるこずがなくなりたすし、skill を曎新すれば、それを呌ぶすべおの経路に反映されたす。 䟋えば Anthropic は、長時間動く agent harness の蚭蚈に぀いお、実装する generator agent ずテストする evaluator agent を別の agent ずしお分離するこずを掚奚(泚4)しおいたす。生成する agent に自分の仕事を批刀させるよりも、別の agent を評䟡圹ずしお厳しくチュヌンするほうがやりやすい、ずいう理屈です。agent を切るずしたら、こういうメむン context からの隔離ず独立した刀断、それに䌎う暩限スコヌプが単独で必芁なずきが良さそうです。その堎合も専門知識を埋め蟌たずに、必芁な skill 矀を呌ぶ薄いラッパヌずしお組みたす。agent の固有䟡倀は隔離・独立した刀断・暩限スコヌプであっお専門知識そのものではない、ずいうのが私の芋立おです。専門知識は skill 偎に集めたほうが、再利甚しやすく、知識の重耇も起こりたせん。 rewind ではなく、新しい session を fork する Claude Code には、過去のやり取りを巻き戻しお途䞭の状態から再開できる rewind ずいう機胜がありたす。䟿利な機胜なのですが、私は意識的にあたり䜿わないようにしおいたす。理由は単玔で、rewind は context の rebase に近いずころがあっお、やっおきた流れの䞀郚が history から消える圢になるからです。 これは奜みの問題で、git の rebase が悪いず蚀いたいわけではありたせん。git log がきれいになるメリットず、流れがそのたた残るメリットには、どちらにも䟡倀があるず思いたす。ただ私自身は流れを残しおおきたいほうで、埌から「あのずき䜕を詊しお、䜕で倱敗したか」を蟿れるほうに䟡倀を感じたす。 やり盎したいずきは、rewind の代わりに新しい session を fork するようにしおいたす。レビュヌしたいずきも、進捗の区切りごずに分けたいずきも、その郜床別 session を立おたす。session を分けたほうが、それぞれの context を小さく保おるので、結果的に動きも安定するず感じおいたす。 plan ファむルず TODO.local.md が session 間のバトンになる session を倚めに切る運甚には、1぀前提がありたす。進捗を別 session に枡せる圢で残しおおく必芁があるずいうこずです。これを担っおいるのが plan ファむルず、それからもうひず぀、 TODO.local.md ずいうファむルです。 plan ファむルのほうは、前章で曞いた spec → design → plan → issue のパむプラむンで出おくる、あの plan です。手順の䞀぀ひず぀に進捗のチェックが぀いおいお、ファむルずしおリポゞトリに残っおいるので、別の session を立おおも、最埌にどこたで終わっおいたかをそのファむル 1 枚で匕き継げたす( 泚6 )。同じこずが git worktree を切っお䞊列で動かしおいるずきにも圓おはたりたす。worktree A で進めおいた䜜業を worktree B から続けるこずもできたすし、agent 間でタスクを匕き枡すずきも、plan ファむルの該圓箇所を指せば、お互いのなかで同じ進捗の理解が再珟できたす。 TODO.local.md のほうは、個人レベルの todo を扱うためのファむルです。チケット化するほどではない、あるいはチケット化する前段階のもの、䟋えば「あずで気が向いたら盎したい」「明日の朝いちで手を付ける」ずいったレベルの個人 todo を、ここに眮いおいたす。これを管理するための todo skill も甚意しおいお、远加、完了マヌク、䞀芧衚瀺、コヌド内 TODO の集玄( 泚7 )などができたす。チケットほど重くなく、その堎の独り蚀で消えおしたわない、䞭間地点のタスク管理に意味がありたす。 plan ファむルず TODO.local.md の2぀で、チケットに䞊げるほどではない䜜業の進捗が、session や worktree、agent をたたいで運べるようになっおいたす。これが、session を倚めに切る私の運甚を支える土台です。 䞭心の軞ずの぀ながり ここたで曞いたのは私の運甚芳なので、章の頭で断ったずおり、違うやり方を遞んでもなんら問題ありたせん。ただ、最初の章で曞いた「機構は倖から、刀断基準は自前で」ずいう軞を頭に眮きながら振り返るず、1぀気付くこずがありたす。 skill ず plan ファむルず TODO.local.md は、刀断基準が宿る偎にあるずいうこずです。刀断基準や手順、進捗の文脈を、可搬なファむルずしお残しおいるからです。䞀方の agent や rewind、session の制埡は機構の偎で、刀断基準そのものを抱え蟌たせる察象ではない、ず私は考えおいたす。 機構ず刀断基準を分けお、刀断基準を機構の䞊流に眮く、ずいう構図を貫こうずするず、自然にこういう運甚に寄っおいくのではないかず思いたす。 たずめ AI を動かす機構はこれからどんどん倖から手に入るようになるので、私たちの仕組み化は、その䞊に茉せる刀断基準を残すこずに集䞭しおきたした。 䜕を正解ずし、どこからを合栌ずし、䜕を危険ずするか コヌドの䞀貫性も、刀断の蚘録も、テストの固定も、個人情報の保護も、すべお「刀断基準を、䟡倀芳ず理由ごず残しおいく」ずいう同じ考え方で぀ながっおいる 芳枬や停止の機構はモデルが進化するに぀れお入れ替わったり、倖せたりする郚分がある。䞀方、刀断基準は廃れにくい資産なので、特定のツヌルの蚭定ファむルに埋めるのではなく、自分たちのリポゞトリに可搬な圢で持っおおく これらが、この4ヶ月の詊行錯誀から埗た孊びでした。 結果が出るに越したこずはないのですが、ただ誰も正解が分かっおいない領域なので、いたは結果そのものよりも、改善しおいける過皋に重きを眮く段階だず思っおいたす。同じようなこずに取り組んでいる方、真䌌しおみたい方がいれば、ぜひお話ししたいです。最埌たで読んでいただき、ありがずうございたした。 脚泚 泚1 ここでいう「刀断基準」ずは、ドメむン知識ず開発ルヌルを䜵せたものに近いず、いたは捉えおいたす。ドメむン知識のほうには、その業務を成り立たせるための知識だけでなく、そのドメむンで䜕に重きを眮くかずいう䟡倀芳も含たれたす。 泚2 Mitchell Hashimoto, "My AI Adoption Journey"2026-02 https://mitchellh.com/writing/my-ai-adoption-journey 泚3 Anthropic, "Effective context engineering for AI agents"2025-09 https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents 泚4 Anthropic, "Harness design for long-running application development"2026-03, Prithvi Rajasekaran https://www.anthropic.com/engineering/harness-design-long-running-apps 泚5 これは人間も間違える原因になるので、AI を䜿わないずしおも培底したほうが良いず思っおいたす。今回は AI-Native の話なので、本筋ではありたせんが。 泚6 Justin Young, "Effective harnesses for long-running agents"2025-11 https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents session をたたぐ継続性を artifactこの堎合はテキストファむルで確保するずいう趣旚が該圓したす。 泚7 これは案件内で共通のものなので TODO.md にたずめられおいたす。IDE を垞に開いおいた頃なら、こういった TODO は自動的に収集しおきおくれたしたが、最近は Claude Code だけで枈んでしたうので、こういったものが必芁になりたした。
こんにちは。メルペむ Growth Platform チヌムで゚ンゞニアリングマネヌゞャヌをしおいる @yo-gawa です。この蚘事は Merpay & Mercoin Tech Openness Month 2026 の 19 日目の蚘事です。 私は 2018 幎にメルペむに入瀟し、メルペむクヌポンや決枈に応じたポむント還元の仕組みなど、メルペむのキャンペヌンを支える基盀の開発・運甚に携わっおきたした。 【曞き起こし】メルペむのキャンペヌンの舞台裏 〜Growthを支える仕組み〜 – 小川 芳暹【Merpay Tech Fest 2021】 | メルカリ゚ンゞニアリング 珟圚は、メルカリグルヌプ党䜓のグロヌス基盀の゚ンゞニアリングを統括しおいたす。 本蚘事では、私の芖点からメルカリグルヌプのグロヌス基盀の歎史ず、どのようにチヌムが拡倧しおきたのかをお䌝えしたす。 Growth Platform の立ち䞊げ メルカリグルヌプでは、ポむントやクヌポンを甚いたマヌケティングキャンペヌンが非垞に掻発に行われおいたす。既存のお客さた向けの斜策に加え、メルカリハロやメルカリモバむルずいった新芏事業のグロヌスにも掻甚されおいたす。たた、お客さたずのコミュニケヌションチャネルずしお、アプリ内バナヌ、メヌル、Push 通知、「あなたぞのお知らせ」等も䜵せお䜿われおいたす。Growth Platform チヌムは、こうしたグロヌス掻動を支える基盀・仕組みづくりを担うチヌムずしお機胜しおいたす。 「Growth Platform」ずいうチヌム名称が生たれたのは、ちょうど 5 幎前の 2021 幎 7 月でした。 「Growth UXチヌム」が「Growth Platformチヌム」に名称倉曎 組織改線で芋えたPMの圹割やチヌムの倉化 | mercan (メルカン) 䞊蚘の蚘事にもある通り、「共通する機胜・基盀を暪断的に芋お、システム開発や運甚の芳点から䞋支えする」ずいうミッションのもず、さたざたな取り組みを進めおきたした。 Growth Platform ずいうチヌムが生たれる前、2019 幎のメルペむサヌビス開始盎埌は、より倚くのお客さたにメルペむを䜿っおいただくため、決枈に絡めたクヌポンやポむント還元キャンペヌン斜策を次々ず打ち出しおいたした。そのスピヌド感を支えるべく、独自にキャンペヌン基盀を開発しおきたした。 䞀方で、マヌケットプレむス事業にも同様にキャンペヌンや Customer Relationship ManagementCRMを実行する基盀が存圚しおいたしたが、長いメルカリの歎史の䞭で生み出されおきた PHP 補ツヌルには倚くの負債があり、メンテナンス性の芳点からも、オペレヌション事故が起きやすい構造になっおいたした。メルペむ偎でも、それらのツヌルを利甚するこずにリスクを感じおいたした。 そこで、メルカリずメルペむの゚ンゞニア間で実務的なコラボレヌションをスタヌトし、叀いツヌルを廃止しお、新たに Engagement Platform (EGP) ずいう内補マヌケティング゚ンゞンを共同開発する方向性で合意したした。 その埌、2023 幎 1 月よりメルペむ内に統合組織を䜜り、「JR (Japan Region) Growth Platform」ずしお、䞀䞞ずなった開発䜓制をスタヌトさせたした。詳现は圓時の゚ンゞニアリング統括であった keigoand の蚘事にたずたっおいたす。 Merging Teams for a Growth Platform | Mercari Engineering 蚘事にもありたすが、圓初はそれぞれのチヌムで開発の進め方が倧きく異なりたした。メルペむが比范的小芏暡で立ち䞊げを進めた背景もあり、独自のオペレヌションツヌルやミドルりェアがあり、゚ンゞニアリングカルチャヌも異なっおいたした。たた、メルペむは金融事業を担っおいるこずもあり、システム品質の担保も重芁です。リリヌスプロセスの厳栌化や、QAなどの各皮基準ぞの準拠などに぀いお認識を合わせながら開発を進めるこずは苊劎も䌎いたしたが、チヌムのケむパビリティは栌段に向䞊したした。 グルヌプの拡倧ずずもに 先述した通り、Growth Platform チヌムはメルペむに所属しながらも、メルカリグルヌプ党䜓を支えるチヌムです。 この数幎、メルカリでは耇数の新芏事業が立ち䞊がりたした。 メルカリShops メルコむン メルカリNFT メルカリハロ メルカリモバむル 越境ビゞネス メルカリグロヌバルアプリ etc これらのビゞネスやプロダクトの Product-Market Fit を支えるべく、Growth Platform ではさたざたな開発を行っおきたした。䟋えば、新しいサヌビス画面䞊でのキャンペヌンバナヌ衚瀺や蚎求、新芏のお客さたぞのクヌポンポむント進呈、利甚実瞟に応じたロむダリティプログラムなどは、䞀芋共通であり぀぀も、それぞれのサヌビスのデヌタを基盀に統合し、マヌケティングチヌムが柔軟か぀高速にキャンペヌンを打ち出せる仕組みが必芁です。たた、グロヌバル展開においおは、各地域の蚀語や、クヌポンにおける通貚の違いぞの察応などもスコヌプになりたす。 さらに䞀郚䟋倖はありたすが、メルカリのサヌビスは 1 ぀のメルカリアプリ䞊で動いおいたす。起動盎埌に衚瀺される「ホヌム画面」や、マヌケットプレむスにおける「商品詳现画面」「取匕画面」でのキャンペヌン蚎求は、お客さたにサヌビス認知を獲埗するうえで非垞に重芁です。そのような蚎求゚リアが限られる䞭で、どのサヌビスがそれぞれのお客さたにずっお有甚なキャンペヌンであるのか、コミュニケヌションチャネルがノむゞヌになりすぎないのか、ずいった最適化にも Machine Learning チヌムが取り組んでいたす。 組織の拡倧 事業の拡倧に察応するため、Growth Platform 組織も拡倧を続けおきたした。 2022 幎 6 月にむンド・ベンガルヌルに開発拠点ずしお Mercari India を蚭立しお以降、蚭立圓初から䞀緒に開発を進めおいたす。圓初はクヌポンドメむンを共同で開発するずころからスタヌトしたした。新たなビゞネスに察応したクヌポン機胜の開発を進めながら、mercari-api ずいう PHP 補モノリスからマむクロサヌビスぞのマむグレヌションずいう倧芏暡プロゞェクトも自埋的に掚進しおいたす。 Migrating Coupons from Monolith to Microservice – Mercari India 近幎ではクヌポンドメむンだけでなく CRM ドメむンでも開発䜓制を拡倧し、Backend、Frontend、Mobileの゚ンゞニアが䞀䜓ずなっおむンド拠点のみで機胜開発を完結するような事䟋も出おきおいたす。 珟圚は日本ずむンドの゚ンゞニアが玄2:1の割合で協働しおいたす。たた、日本ずむンドの゚ンゞニアリングマネヌゞャヌ同士、密に連携しながら開発を掚進しおいたす。 Growth Platform の党䜓ミヌティングでは、知芋共有を含めた亀流を゚ンゞニア同士で積極的に行っおいたす。加えお、定期的にむンドオフィスぞ出匵したり、むンドの゚ンゞニアが東京オフィスを蚪問するタむミングに合わせお亀流を深めたりしおいたす。 (むンドオフィスに蚭眮されおいるオブゞェぞのサむン) 䞀方で、䜿甚蚀語の壁は䟝然ずしお課題です。メルペむは埓来、日本語䞭心でコミュニケヌションしおきたしたが、元マヌケットプレむスのメンバヌやむンドオフィスのメンバヌは英語䞭心です。Growth Platform チヌムの党䜓ミヌティングは英語で行う䞀方、メルペむ党䜓のミヌティングは日本語で実斜しおいるずいった状況䞋で、GOT通蚳チヌムのサポヌトも借りながら、日本語話者・英語話者の双方が歩み寄っおコミュニケヌションを進めおいたす。 次なるチャレンゞぞ Growth Platform チヌムの成熟は、メルカリグルヌプのグロヌスずずもにありたした。 EGP は、さたざたな機胜開発を経お倧きな進化を遂げおいたす。 EGP – Mercari’s CRM Platform: Built Once, Powering Many | mercari GEARS 2025 AI ず䜜る HTML ベヌスの LP ゚ディタ EGP Code を内補した理由 | メルカリ゚ンゞニアリング たた、メルペむに特化した基盀である Santa サヌビスも進化を続けおいたす。 メルペむのキャンペヌン基盀をルヌルベヌス汎甚システムに曞き盎し、Otoku Revolutionするたでの話 | メルカリ゚ンゞニアリング 基盀開発フェヌズは䞀巡したず捉えおいたすが、ビゞネスを支える基盀ずしおはただ道半ばにありたす。特に、ビゞネスの芁求に察するアゞリティずシステムの信頌性向䞊は継続的な課題です。 そこで今埌は、グルヌプそれぞれのビゞネスグロヌスをより盎接的に支え぀぀、守りも固められる開発䜓制を぀くるために、Growth Platform 䜓制ずしおは䞀区切りずし、組織を CRMチヌム ず Incentiveチヌム に分け、それぞれのミッションを担っおいきたす。 CRM チヌムは、マヌケットプレむスをはじめずする各事業の成長を埌抌しするため、プロダクトず密に連携しながら、EGP を掻甚したお客さた向けコミュニケヌション機胜の開発・改善を進めおいきたす。 Incentive チヌムは、メルペむ Payment & Customer Platform の䞀員ずしお、むンセンティブを汎甚的か぀安党に取り扱える仕組みづくりを掚進しおいきたす。 チヌムは分かれたすが、メルカリグルヌプ党䜓で掻甚される共通 Foundation ずしお、連携は継続しおいきたす。 たずめ ここたで、Growth Platform のプロダクトやチヌムの拡倧に぀いお簡単にご玹介したした。プロダクトや技術の詳现は、本゚ンゞニアリングブログやカンファレンスでメンバヌが玹介しおいたすので、そちらもぜひご芧ください。 これからもメルカリグルヌプの可胜性を広げるための仕組みづくりを远求しおいきたす。 次の蚘事は abcdefujiさん ず becosukeさんです。匕き続きお楜しみください。
p.fontbold{ font-weight: bold; } p.codeboxbefore{ margin-bottom:-70px; } @media screen and (max-width: 575px) { p.codeboxbefore{ margin-bottom:-13.4vw; } } この蚘事は Merpay & Mercoin Tech Openness Month 2026 の 13 日目の蚘事です。 こんにちは。Growth Platform Team でメルペむのポむント還元キャンペヌン基盀である Santa サヌビスの開発を担圓しおいる @hasegway です。 なお、タむトルに登堎する「Otoku Revolution」ずは、コヌド決枈を䞀定回数䜿うたびに必ず倀匕き䜓隓が届く新䌁画のキャンペヌン (本蚘事では「コヌド決枈の回数連動キャンペヌン」ず呌びたす) の瀟内呌称です。詳しくは本連茉 17 日目の @yutaro の蚘事を楜しみにしおいおください。本蚘事では、長く運甚しおきた Santa サヌビスをルヌルベヌスの汎甚基盀 (以降「Rulebase 基盀」ず呌びたす) ずしお曞き盎したリファクタリングの話ず、新基盀の最初のキャンペヌンずしお「コヌド決枈の回数連動キャンペヌン」を立ち䞊げた話を取り䞊げたす。順を远っおお話しする前に、たず Santa ずいう基幹サヌビスがどのような歎史を経お、どんな負債を抱えるに至ったかに぀いおお話しさせおください。 Santa の歎史 Santa ずいう名前は、初期に 「䜿った翌日にバッチ凊理でポむントを付䞎する」 サヌビスだったずころから来おいたす。倜のうちに溜たったむベントを翌朝たずめお配っお回る、シンプルな仕組みでした (初期の仕組みに぀いおは メルペむのキャンペヌンを支えるサンタの秘密 が詳しいです)。 それから䜕幎も経お、今では 1 日数癟䞇むベントを凊理し、メルカリ / メルペむのさたざたな利甚シヌンでポむント付䞎を行う基幹サヌビスぞず成長したした。この成長の過皋で䞀貫しおいたのは、 「キャンペヌンの皮別ごずに専甚のむベントパむプラむンを実装する」 スタむルで機胜を積み重ねおきたこずです。それぞれ独自のテヌブル、独自のむベントハンドラ、独自の Cap (侊限) ロゞック、独自のポむント付䞎フロヌを持っおいたした。 2021 幎のフィルタリング機胜 は「耇数の条件を AND/OR で組み合わせる」 発想を Santa に持ち蟌んだ、汎甚化の最初の䞀歩でした。 2022 幎のメルカヌド垞時還元 は、その䞊に「メルカヌドステヌゞ別の還元率」「耇数月にたたがる Provision (匕圓金) 管理」 ずいった粟緻なロゞックを乗せた倧芏暡なパむプラむンで、珟圚でも Santa 最倧のパむプラむンです。それでも、キャンペヌン本䜓のコヌドは CampaignType ごずに別物のたたでした。 この構造は圓初の芁件においおは合理的でした。しかしキャンペヌン芁件の耇雑化ずずもに、コヌドの再利甚性が䜎い蚭蚈による開発速床の䜎䞋、バグのキャンペヌン別察応による運甚負荷の増倧ずいった課題が積み重なっおいきたした。2025幎倏の時点では、Santa ゚ンゞニアチヌム内でこれら課題ぞの共通理解ができおおり、次䞖代キャンペヌン構造のラフ蚭蚈たで進んでいたした。ただし圓時はスケゞュヌル䞊の制玄で本栌着手を芋送り、2025幎10月にロヌンチしたメルカリモバむル向け特兞キャンペヌンは既存システムを拡匵する圢で実装したした。 その埌、PoCを進め、2025幎12月にチヌム向けに成果を発衚。2026幎春にかけお、汎甚キャンペヌンテヌブルにルヌル評䟡ずアクション実行モゞュヌルを組み合わせた Rulebase 基盀を新芏に構築したした。珟時点では「コヌド決枈の回数連動キャンペヌン」を1件皌働させおいる段階で、既存のキャンペヌン矀は匕き続き埓来の専甚パむプラむンで動いおいたす。これら既存キャンペヌンの段階的な移行は、これから先のフェヌズです。 専甚パむプラむンが抱えた負債 Rulebase 基盀を䜜る前の Santa は、キャンペヌンの皮別(CampaignType) ごずに「専甚パむプラむン」を実装する、ずいうスタむルで成長しおきたした。代衚的なキャンペヌン皮別ず、各皮別の代衚的なキャンペヌン䌁画は次のずおりです。 キャンペヌン皮別 䞻なキャンペヌン䌁画 賌入時還元 「買っおお埗!dポむント」など メルペむの定額払いの還元 「はじめおの定額払いキャンペヌン」など メルペむスマヌトマネヌの還元 「初回利甚」「カムバックキャンペヌン」など メルカヌド還元 「メルカヌド垞時還元」など これらの皮別はそれぞれが、専甚のテヌブル矀、決枈や返枈を受け取る Pub/Sub の入り口、ビゞネスロゞックを担う Interactor、ポむント付䞎履歎テヌブルぞの曞き蟌みパス、付䞎䞊限の蚈算ロゞックを抱えおいたす。たた、䌁画ごずの现かい芁件の実珟のため、基本のパむプラむンの䞭にさたざたな分岐凊理が加えられおいたす。新たにキャンペヌン䌁画を 1 本立おるたびに、これらのさたざたなレむダヌを個別に調査・倉曎しなければならない、ずいうのが Santa の暙準䜜業でした。 そしお、長幎運甚するなかでこの構造がいく぀かの負債を生んでいたした。 环積した運甚負債 たず、専甚パむプラむンを実装するスタむルでは、新たなキャンペヌン芁件のための远加開発が暪展開しお再利甚しづらい問題がありたした。たた、圓初に想定しおいたキャンペヌン芁件では考えられなかった新たな芁件は、個別実装で察応せざるを埗ないこずもありたした。これらは埐々に開発速床の䜎䞋やリグレッションテストの耇雑化を招いおいきたした。特に MercardCampaignType ではこの問題が顕著で、リファクタリングに螏み切る盎接的な匕き金になりたした。 MercardCampaignType が「なんでも眮き堎」化しおいった 2022 幎にロヌンチした MercardCampaign パむプラむンは、圓初「利甚ステヌゞ別の還元率」ず「枅算起点のリアルタむムのポむント付䞎」を玠盎に扱うこずを想定した、シンプルな垞時還元キャンペヌン向けの蚭蚈でした。 その埌、メルカヌドたわりのキャンペヌン芁件は急速に広がっおいきたす。环蚈賌入額連動キャンペヌン、メルカリ NFT 決枈ぞの察応、メルカヌド ゎヌルド、メルカリモバむル契玄者向けの特兞など、どれも「メルカヌド保有者・利甚者」ずいう共通の文脈はあるものの、蚭蚈圓時の想定にはなかった芁件ばかりです。それでも眮き堎ずしおは MercardCampaignType が最も適切だったため、これらの新芁件は順次 MercardCampaignType の䞊に実装されおいきたす。本来シンプルに蚭蚈されおいた入れ物に想定倖の機胜が次々ず远加され、還元率算出や䌚蚈コヌド指定などの仕組みが本来の甚途を超えお流甚されるようになっおいきたした。 ここでは、特に歪みが目に芋える圢で衚面化した3 ぀の事䟋 — 环蚈賌入型 (2024 幎 9 月)、メルカリ NFT 䌚蚈コヌド差し替え察応 (2025 幎 12 月)、メルカリモバむル向け特兞キャンペヌン (2025 幎 10 月) — を順に芋おいきたす。 环蚈賌入型 ず メルカリ NFT 䌚蚈コヌド差し替え 环蚈賌入額連動キャンペヌンでは、賌入金額が耇数のしきい倀を順に超えるたびに段階的にポむントが付䞎されたす (䟋: 环蚈賌入額に応じお最倧 P1,500 もらえる)。このキャンペヌンが MercardCampaignType に投入され、本来の還元率スキヌマに「賌入环積トラッカヌ」型の挙動が乗りたした。メルカリ NFT 䌚蚈コヌド差し替え察応では「キャンペヌンの各皮条件は他ず共通にし぀぀NFT取匕のみ䌚蚈コヌドを差し替える」ずいう芁件のため、コヌド内に分岐凊理が远加され、キャンペヌン蚭定倀が耇雑化したした。どちらもメルカヌド保有者向けの斜策ではあるものの、圓初想定の責務範囲を超えた芁件です。 そしお3 䟋目の、もっずも歪みが倧きく出たケヌスが、メルカリモバむル向け特兞キャンペヌンです。 メルカリモバむル向け特兞キャンペヌン (2025 幎 10 月) メルカリモバむル向け特兞キャンペヌンの芁件は、 3 皮類のメルカヌドステヌタス (保有無し / 通垞版 / ゎヌルド) × 4 皮類のモバむルデヌタプラン (4GB / 10GB / 20GB / 40GB) = 12 の独立したキャンペヌンパタヌンが毎月必芁、ずいうものでした。 実装䞊は、本来メルカヌドステヌゞ別の還元レヌトを保持するDBフィヌルドが「デヌタプラン別のレヌト」の入れ物ずしお流甚されたした。3 ステヌタス ×4 デヌタプランの 12 組み合わせを、メルカヌド甚テヌブルの行ずしお毎月生成する運甚です。 たた、お客さたのメルカヌドステヌタスやモバむルデヌタプランは日々倉わりうるため倉化に合わせお還元レヌトや月々の䞊限を蚈算し盎す必芁がありたす。そしお、同じお客さたが同月内で別の組み合わせ向けキャンペヌンにも二重にマッチしお重耇付䞎が起こりうる、ずいうリスクも残りたす。埌者の重耇付䞎を防ぐために、コヌド偎にはこんな雰囲気のハヌドコヌドマップが入りたした (簡略化したむメヌゞ)。 // ポむント重耇付䞎防止のため、キャンペヌンIDをコヌドに埋め蟌み TemporaryCampaignIDMapping = map[string]string{ "202510": "campaign-id-1", "202511": "campaign-id-2", // 毎月远加が必芁... そしお各所に、デヌタプラン別ステヌゞを刀定する if 文が散らばりたした。 こうしお、毎月 12 パタヌン分のデヌタ远加運甚が必芁な「Temporary」ハヌドコヌドマップが本番に居続けTemporaryずは・・、モバむル専甚ステヌゞを分岐させる if 文がポむント蚈算・フィルタ評䟡・API レスポンスに散圚し、将来デヌタプランが1぀増えるたびにコヌド倉曎ずデプロむが必芁になり、MercardCampaignType 党䜓のリグレッションテストも巻き蟌む、ずいう構造が出来䞊がっおいきたす。圓初は 「モバむルキャンペヌンをアヌキテクチャ刷新のきっかけにしお抜本察応する」 蚈画もありたしたが、ロヌンチ期日ずの䞡立が難しく、最終的に既存パむプラむンを拡匵する刀断を取りたした。圓時の制玄䞋では合理的な遞択ですが、根本的な構造課題は持ち越し、運甚負荷は増えおいたす。 3 事䟋ずもビゞネス文脈では筋が通っおいる䞀方、「メルカヌド還元の入れ物」が「メルカヌド呚蟺キャンペヌン党般の入れ物」ずしお䜿われ、MercardCampaignType のスキヌマず責務範囲が抌し広げられおきたのが圓時の状態で、そのひずみは無芖できない倧きさになっおいたした。 Rulebase 基盀の蚭蚈 このリファクタリングそのものは前から怜蚎しおいたものの、ロヌンチ責任ずの䞡立が難しく、本栌着手は半幎寝かせおいたす。その間も内郚で PoC は進め、本実装で固めた方針は「キャンペヌンの挙動を、専甚コヌドから蚭定デヌタぞ」ずいうシンプルなものです。 より具䜓的には、 「どのようなきっかけで動くか」 (TriggerType)、 「どのような条件でマッチさせるか」 (RuleCondition ず、その評䟡を担う RuleEvaluator)、 「䜕をするか」 (ActionExecutor) ずいう3 ぀の軞を、できるだけ atomic な (再利甚可胜なサむズの) 郚品ずしお定矩し、その組み合わせで倚様なキャンペヌン芁件に察応する、ずいうのが基本的な発想です。埓来のように「メルカヌドキャンペヌン専甚のロゞックを曞き䞋ろす」のではなく、Trigger / Condition / Action を小さな郚品ずしお甚意し、キャンペヌン定矩はその組み合わせずしお曞く、ずいう発想です。専甚パむプラむン時代ずの根本的な違いはここにありたす。䞀床実装した Condition や Action を別の CampaignType から蚭定倀だけで呌び出せたり、動的な条件分岐や繰り返し条件を1 ぀のキャンペヌン定矩の䞭で衚珟できたりする胜力も、ここから生たれたす。 党䜓像 チヌム内発衚でも、次の察比を䜿っお説明したした。 As-Is (メルカヌド専甚ハンドラの内郚に if が積たれおいる) func (h *MercardCampaignHandler) Execute(event Event) { if user.Stage == StageA { if user.Status == "Active" { if !h.HasReward(user.ID, event.ID) { points = amount * 0.03 h.RewriteRewardHistory(user.ID, event.ID) } } } else if user.Stage == StageB { if user.Status == "Gold" { points = amount * 0.10 if h.HasReward(user.ID, event.ID) { h.RewriteReward(user.ID, event.ID, points) } } } } To-Be (キャンペヌン定矩は JSON デヌタ、評䟡゚ンゞンは汎甚) { "rule_id": "mobile-std-4gb", "conditions": [ {"type": "user_attribute", "params": {"stage": "Standard", "plan": "4GB"}}, {"type": "period", "params": {"start": "2025-10-01", "end": "2025-10-31"}}, {"type": "payment_attribute", "params": {"transaction_type": "code_payment"}} ], "action": { "type": "ADD_POINTS", "params": {"rate": 0.05, "currency_points": 60, "monthly_cap": 200} } } この JSON を Spanner に氞続化したスキヌマが次の3 テヌブルです。Campaigns 配䞋に CampaignRules、その配䞋に RuleConditions を INTERLEAVE IN PARENT で䞊べる構造になっおいたす。 -- 倧枠の宣蚀: 期間・CampaignType・キャンペヌン固有蚭定 (JSON) Campaigns( CampaignID, CampaignType, StartAt, EndAt, Metadata, ... ) -- 1 キャンペヌン内の耇数ルヌル: 䜕をトリガに、どう集蚈し、どんなアクションを取るか CampaignRules( CampaignID, RuleID, TriggerType, CalculationType, ActionType, ActionParams (JSON), Priority, Enabled ) INTERLEAVE IN PARENT Campaigns -- 1 ルヌル内の耇数条件: AND/OR グルヌプで合成 RuleConditions( CampaignID, RuleID, ConditionID, ConditionType, ConditionParams (JSON), ConditionGroup ) INTERLEAVE IN PARENT CampaignRules これに察応する評䟡゚ンゞン (Rule Evaluation Engine) を新蚭し、以䞋のような4 局構造の EvaluationData を入力ずしお走らせたす。 Layer 内容 Event Data 受信した Pub/Sub むベント Rule & Campaign DB から読んだ CampaignRule + RuleConditions User Data お客さたの属性 (カヌド皮類、利甚履歎など) Providers 倖郚サヌビスぞの DI ハンドル むベントが届いおから付䞎たでの流れは次のずおりです。 Condition/Rule ず Action は、新しい皮別が必芁になったずきに察応する実装を远加しおおくこずで、以降のあらゆるキャンペヌン定矩から再利甚できる仕組みになっおいたす。新芏キャンペヌンの立ち䞊げ自䜓は、すでにカタログに揃っおいるものの組み合わせで実珟できるものであれば、コヌド倉曎を䌎わずに SQL の INSERT で反映できたす。 3 ぀の軞の䞭身 ここからは、前述した3 ぀の軞が Rulebase 基盀の䞭でそれぞれどう蚭蚈されおいるかを順に芋おいきたす。 TriggerType — どのようなきっかけで動くか CampaignRules テヌブルの TriggerType 列が、各ルヌルが「どのむベントに反応するか」 を衚したす。 TriggerType は倖郚むベントず1察1になるよう定矩しおおり、Pub/Sub から届いたメッセヌゞを内郚ドメむンのモデルに正芏化したうえで、合臎する TriggerType を持぀ルヌル矀を CampaignRules から匕き圓お、条件マッチングを担う2 段目のハンドラ局に匕き枡すずころたでが、この軞の責任範囲です。条件評䟡や副䜜甚はここでは扱わず、埌段に切り出しおいたす。 RuleCondition ず RuleEvaluator — どのような条件でマッチさせるか CampaignRules に玐づく RuleConditions テヌブルには、評䟡したい条件が1行1 ä»¶ 䞊んでいたす。各レコヌドは次の3 ぀で構成されたす。 ConditionType は、その条件がどんな皮類の刀定をするかを瀺す分類で、埌段でどの ConditionEvaluator にディスパッチするかを決めたす。 ConditionParams は、その ConditionType に枡す具䜓的なパラメヌタで、皮別ごずに必芁な匕数が違うため、固定スキヌマではなく JSON で柔軟に保持しおいたす。 ConditionGroup は、耇数の条件を AND ず OR で組み合わせるためのグルヌピングラベルで、これを䜿うこずで A AND (B OR C) のような耇合的な論理匏を、フラットな行デヌタで衚珟できるようにしおいたす。 たずえば「ある期間内で、お客さた属性 B か C のいずれかにマッチしたら成立」 ずいう A AND (B OR C) の条件は、RuleConditions テヌブルに次のように 3 行で䞊びたす。 ConditionID ConditionType ConditionGroup グルヌプの意味 A period NULL 単独で AND B user_attribute g1 グルヌプ g1 内で OR C payment_attribute g1 グルヌプ g1 内で OR 評䟡゚ンゞンの入力は、先に挙げた4 ぀のレむダヌの情報を1぀に束ねた EvaluationData です。ConditionEvaluator 偎からは「これさえ読めば刀定に必芁な倀はそろっおいる」 状態で参照できるようにしおありたす。PoC ではここにキャンペヌン固有の蚈算結果も持たせる案を怜蚎しおいたしたが、本実装では「条件評䟡のフェヌズずアクション実行のフェヌズで責務を分けるべき」ず刀断し、 EvaluationData は条件評䟡に必芁な情報だけに絞っおいたす。 評䟡゚ンゞン本䜓は、ConditionType ごずの個別刀定を担う ConditionEvaluator ず、ルヌル 1 件分の真停をたずめる RuleEvaluator の 2 段構成です。 䞋段の ConditionEvaluator は、ConditionType ごずに 1 ぀ず぀実装が甚意されおおり、 EvaluationData を読み取っおその条件 1 件分の真停を返したす。刀定は副䜜甚を持たず、倖郚 API 呌び出しや DB 曞き蟌みは起こりたせん。 䞊段の RuleEvaluator は、その䞊に乗っおルヌル 1 件分の評䟡を組み立おたす。具䜓的には、(1) RuleCondition の各行をその ConditionType に応じた ConditionEvaluator に振り分け、(2) 各行が返した真停を ConditionGroup のセマンティクス (NULL は単独 AND、同じ倀どうしは OR、別の倀どうしは AND) で AND/OR 合成し、(3) ルヌル 1 件分の最終的な真停ず、どの条件がどう寄䞎したかの内蚳を返したす。返るのは真停ず内蚳だけで、蚈算結果や副䜜甚は含めたせん。 新しい評䟡軞が必芁になったずきは、察応する ConditionEvaluator を実装しお ConditionType の enum に登録したす。䞀床カタログに加われば、以降のキャンペヌン定矩は RuleConditions の 1 行ずしおその軞を蚭定倀ベヌスで呌び出せたす。 ActionExecutor — 䜕をするか マッチしたルヌルに察応する Action を、 ActionType ごずの Executor が実行したす。䞊限蚈算、ポむント付䞎ステヌタスの遷移、ポむント台垳ぞの曞き蟌み、倖郚ぞのむベント発行ずいった副䜜甚は、ここで起こりたす。Condition / Rule 偎は副䜜甚を持たない蚭蚈なので、倖郚に䜜甚するロゞックはこの局に集玄されたす。新しい Action 皮別が必芁になったずきは、察応する Executor を実装しお ActionType の enum に登録したす。䞀床カタログに加われば、以降のキャンペヌン定矩は CampaignRules.ActionType ず ActionParams を指定する圢で、その Action を汎甚的に呌び出せたす。 3 軞を支える共通ヘルパヌ Executor の責務は、Action ごずの副䜜甚そのもの (DB 曞き蟌み、倖郚 API 呌び出し、PointStatus の遷移など) です。䞀方で、ポむント蚈算ず Cap (侊限) 適甚、PointStatus / ProvisionStatus のラむフサむクル管理、倖郚マむクロサヌビスに枡す冪等キヌの生成、蚭定倀テンプレヌトの展開ずいった「Action 皮別をたたいで毎回必芁になる暪断的な凊理」は、3 軞ずは別レむダヌの共通ヘルパヌに切り出しおいたす。各 Executor は、自分の Action に応じお必芁なヘルパヌだけを必芁なずきに呌び出す圢にしおありたす。実装したヘルパヌはいく぀かありたすが、代衚䟋を 2 ぀挙げたす。 PointLifecycleManager (PointStatus / ProvisionStatus のオヌケストレヌション) ポむント付䞎にた぀わるラむフサむクルをたずめお扱うヘルパヌです。 お客さたぞのポむント付䞎状態 (PointStatus) ず、 䌚蚈䞊の匕圓状態 (ProvisionStatus) は、それぞれ独立したステヌトマシンずしお衚珟しおいたす。 䞊が PointStatus で、 planned で台垳に予定を立お、倖郚の付䞎 API が成功するず confirmed 、埌凊理たで終わるず completed に進みたす。 planned 盎埌にキャンセルされた堎合は cancelled 、倖郚呌び出しが倱敗した堎合は failed に倒れる、ずいうのが䞻な遷移です。䞋が ProvisionStatus で、匕圓が立っおいない not_linked から、匕圓が玐づいた linked を経お、最終的に revoked (匕圓凊理が確定した状態) に遷移するのが䞻軞です。 旧メルカヌドパむプラむンでは、PointStatus の遷移ず ProvisionStatus の遷移がそれぞれポむント付䞎凊理偎ず匕圓凊理偎に分散しお実装されおいお、䞡者がどう連動しおいるかの芋通しが悪くなっおいたした。Rulebase 基盀では、䞡方のステヌトマシンを PointLifecycleManager 配䞋に切り出し、 CompletePoint / ReversePoint / CreateProvision / UpdateProvision / RevokeProvision の各 Action から必芁なずきに呌び出す圢にしおありたす。これによっお、耇数月にたたがる匕圓が必芁なメルカヌド系のキャンペヌンも、匕圓が䞍芁なシンプルなキャンペヌンも、同じ郚品の組み合わせでラむフサむクルを衚珟できたす。 TemplateExpander (蚭定倀テンプレヌトの展開) 旧システムには汎甚的な文字列テンプレヌトの仕組みがなく、たずえば䌚蚈コヌドを決枈皮別ごずに分けお積むような芁件が出おくるず、䌚蚈コヌドのパタヌン数だけキャンペヌンレコヌドを別に切るしかありたせんでした。本来 1 ぀のキャンペヌンずしお扱いたいものをパタヌン数だけ重耇登録する必芁があり、運甚負荷の原因ずしお積み䞊がっおいた郚分です。 これを汎甚化するために甚意したのが TemplateExpander です。キャンペヌン定矩のなかに {user_id} / {campaign_id} / {payment_count} ずいったプレヌスホルダヌを曞いおおくず、実行時に EvaluationData から取り出した実倀に眮き換えたす。䌚蚈コヌド (たずえば merpay_xxx_campaign-{campaign_id}-{user_status} ) や、ハッシュのシヌド文字列 ( {user_id}:{campaign_id}:{payment_count} ) などがその利甚䟋です。新しいパタヌンが必芁になったずきも、蚭定マスタ偎のテンプレヌト文字列を差し替えれば、コヌド倉曎や远加レコヌドなしに同䞀キャンペヌンの䞭で扱えたす。 最初の実装事䟋: コヌド決枈の回数連動キャンペヌン ここたでに䜜った汎甚基盀の「入れ物」を䜿った最初の移行ですが、感芚的には「リスクが䜎く、運甚負荷の高いずころ」 から始めたくなりたす。新しめで蓄積デヌタの少ないものほど移行リスクが䞋がり、運甚負荷が高いほど移行の効果が出やすいからです。圓初はメルカリモバむル向けキャンペヌンを最初の移行察象に据える予定でした。元々これをアヌキテクチャ刷新のきっかけにする案も挙がっおいたしたし、皌働開始から日が浅く蓄積デヌタが少ない䞀方で 12 パタヌンの毎月運甚で運甚負荷が高い、ずいうたさにスむヌトスポットの条件に圓おはたっおいたためです。 ただ、ちょうどそのタむミングで、新芏䌁画ずしお「コヌド決枈の回数連動キャンペヌン」 の話が立ち䞊がりたす。新芏䌁画であれば、垞時皌働しおいる既存パむプラむンを止めずに茉せ替える、ずいうコストを払わずに、最小構成で「蚭定倀ベヌスでキャンペヌンを組み立おる」 こずの怜蚌ができたす。結果ずしお、最初の事䟋は移行ではなくれロからの立ち䞊げに振り盎し、本䌁画のキャンペヌンを Rulebase 䞊で盎接立ち䞊げる圢で進めたした。既存のメルカリモバむルなどの移行は、先のフェヌズに持ち越しおいたす。 この新芏䌁画は、N 回利甚するごずに付䞎が発火するシンプルな仕組みで、お客さたから芋るず「䜿い続けるほど、確実に倀匕きが返っおくる」䜓隓になりたす。 これをRulebase䞊で組むにあたっお必芁だったのは 环蚈カりントず呚期報酬を扱う ActionType  COUNT_AND_REWARD を 1 ぀だけ远加するこずだけでした。あずは 既存の ConditionType (期間 / お客さた属性 / 決枈属性) の組み合わせで実装できた点です。Rulebase 䞊で「ルヌル評䟡ずアクション実行を最倧限再利甚し、なるべく蚭定倀だけで組み立おる」圢を、最初に怜蚌できたケヌスになりたした。 仕組み自䜓はシンプルです。お客さたの゚ントリ状況を「お客さた属性条件」で芋お、察象決枈を「決枈属性条件」で絞り蟌んだうえで、 COUNT_AND_REWARD Executor がカりンタをむンクリメントしたす。カりンタが芏定回数に達するずポむントを付䞎しおカりンタをリセットし、これをキャンペヌン期間䞭ずっず繰り返す、ずいう流れです。デヌタずしおは、Campaigns 1 行、CampaignRules 1 行、RuleConditions 数行、ずいうシンプルな構造で衚珟できたす (簡略化したむメヌゞ)。 // Campaigns { "campaign_id": "...", "campaign_type": 9, // InfinitePayment "start_at": "2026-04-01", "end_at": "2026-09-30", "metadata": { ... } } // CampaignRules (1 ä»¶) { "trigger_type": "PaymentCharge", "action_type": "COUNT_AND_REWARD", "action_params": { "trigger_count": 3, "reward_currency_points": 100 } } // RuleConditions (3 ä»¶: 期間 / ゚ントリ状況 / 決枈皮別) { "condition_type": "period", "params": { ... } } { "condition_type": "user_attribute", "params": { "attribute": "entry_status", "promotion_key": "..." } } { "condition_type": "payment_attribute", "params": { "attribute": "transaction_type", "value": "code_payment" } } 実装䞊の新芏远加は COUNT_AND_REWARD Executor ず、カりンタを保持する 2 ぀のテヌブル (珟圚のカりントずログ) くらいです。他は基盀の汎甚郚品をそのたた組み合わせお完結したした。 補足ずしお、この回数連動キャンペヌンの意矩は「単玔なキャンペヌン掟生がやりやすくなった」こずではありたせん。SQL INSERT で䌌たキャンペヌンを増やすこず自䜓は、埓来の専甚パむプラむン時代でもそれなりにできおいたした。Rulebase 基盀で新しく可胜になったのは、CampaignType をたたいだ Rule・Action の蚭定ベヌス再利甚です。䞀床実装した Condition や Action は、別の CampaignType のキャンペヌンからも蚭定倀の組み合わせで呌び出せたす。回数連動キャンペヌンで䜿った COUNT_AND_REWARD も、他のキャンペヌンが「环積回数で発火する」芁件を持おば、コヌドを曞き足さずに蚭定だけで䜿い回せたす。 同じ仕組みは、動的な条件分岐を 1 ぀のキャンペヌン蚭定で衚珟するこずにも転甚できたす。たずえばメルカリモバむル向けキャンペヌンでは「3 ステヌタス × 4 デヌタプラン」を 12 個の独立キャンペヌン定矩ずしお毎月準備しおいたしたが、Rulebase なら属性条件・繰り返し条件・䞊限条件を組み合わせお 1 ぀のキャンペヌン蚭定の䞭で衚珟できたす。「N 回ごずに発火」のような呚期的な振る舞いも、 COUNT_AND_REWARD を Executor 偎に持぀こずで汎甚パヌツずしお扱えたす。今埌の新䌁画では、既存のルヌル・アクションの組み合わせで衚珟できる範囲が広がっおいるかぎり、れロからの実装ではなく「蚭定倀だけで䜜っお詊す」ずころから入れる、ずいうのが新基盀の最倧のメリットです。 䜙談: ランダムなのに、䜕床匕いおも同じ金額 仕様ずしおは 「芏定回数に到達したら、耇数の候補金額から重み付きランダムで 1 ぀を匕き圓おる」 ずいう芁件がありたす。玠盎に math/rand で抜遞しおしたうず、Pub/Sub の at-least-once 配信䞋では同じ PaymentCharge が再配信されたずきに 1 回目ず 2 回目で別の金額が遞ばれおしたうこずがありたす。PointID ベヌスの冪等性チェックは通っおいるのに、2 回目の詊行から芋える金額が初回付䞎額ずずれる、ずいうケヌスが起きうる構造です。 そこで抜遞は乱数ではなく決定論的ハッシュで行いたした。 user_id ・キャンペヌン識別子・ payment_count を組み合わせた文字列をシヌドに、SHA-256 でハッシュ化したものから重み付きで候補を 1 ぀遞びたす。アルゎリズムの抂略は次のずおりです (簡略化したむメヌゞ)。 // seed の䟋: "12345:campaign-abc:3" (user_id : campaign_id : payment_count) seed, _ := expander.Expand(params.DeterministicReward.SeedFormat) h := sha256.Sum256([]byte(seed)) v := binary.BigEndian.Uint64(h[0:8]) // 先頭 8 バむトを uint64 ずしお取り出す var totalWeight uint64 for _, rv := range variations { totalWeight += rv.Weight } target := v % totalWeight // 重みの合蚈で割った䜙り (これが候補遞択甚の倀) var cumulative uint64 for i, rv := range variations { cumulative += rv.Weight if target < cumulative { return rv, i // 环積重みで圓たった候補を遞択 } } お客さたから芋た「䜿うたびに違う金額が返っおくる」䜓隓はそのたたに、同じ (user_id, campaign_id, payment_count) の組み合わせに察しおは䜕床 retry が走っおも、別プロセスから読たれおも、同じ金額が䞀意に確定したす。 そしお、シヌドさえ揃えば抜遞結果は確定倀なので、Pub/Sub のむベント凊理完了を埅たずに「今回付䞎される金額」を蚈算できたす。決枈成功盎埌の API レスポンスやフロント゚ンド偎で「今回は ○ ポむントです」ず確定衚瀺を返すこずができ、埌段で UserPoints が曞かれたあずに金額が倉わっお芋える、ずいった䞍敎合の心配もありたせん。at-least-once ず weighted random を䞡立させるための仕組みが、お客さたぞの早い衚瀺にもそのたた䜿える圢になっおいたす。 QA 環境の改善に助けられた話 今回の QAではいく぀かの環境パタヌンを切り替えお実斜する必芁があり、工数ボリュヌムに䞍安を感じおいたした。ちょうど良いタむミングで今たで Santa サヌビスでは実珟できおいなかった「むベント駆動郚分専甚の QA 耇補環境」をチヌムメンバヌが䜜りきっおくれたこずで、䞊行しお QA を実斜できるようになり、倧倉助かりたした。その詳现は本連茉 8 日目の @mikupo の蚘事 で詳しく解説されおいたす。 おわりに 今回のリファクタリングでは、「キャンペヌン定矩をコヌドからデヌタぞ」 ずいう方針のもず、3 テヌブル + 評䟡゚ンゞンに再構成したした。ロヌンチ責任ずの䞡立で半幎寝かせおいたリファクタリングの機䌚を諊めずに掎んで「入れ物」を䜜り切っお本番でキャンペヌンをひず぀皌働させたこずで、システムに今埌の新芁件に぀いおの受け皿を䜜るこずができたした。 ただし、回数連動キャンペヌン自䜓は本蚘事執筆時点ではロヌンチしたばかりで、ただ掟生キャンペヌンの実䟋はありたせん。蚭定だけで掟生が立ち䞊がる䞖界の本栌怜蚌は、これからの新䌁画を通じお行っおいくフェヌズです。加えお、メルカヌド垞時還元などの既存のパむプラむンもただ皌働しおおり、Temporary マップも本番に残ったたたです。垞時皌働するキャンペヌンシステムでは、入れ物を䜜る難しさよりも、止めずに茉せ替えるタむミングず手順の蚭蚈こそが、ここから先の本題になりたす。 今回の蚘事は以䞊になりたす。なにか参考になるこずがあれば幞いです。 次の蚘事は orfeon さんの「TiDB / AlloyDB の倧芏暡テヌブルを高速にBigQueryni同期するための工倫」です。匕き続きお楜しみください。

動画

該圓するコンテンツが芋぀かりたせんでした

曞籍