TECH PLAY

BASE株匏䌚瀟

BASE株匏䌚瀟 の技術ブログ

å…š577ä»¶

はじめに こんにちはPay ID Engineering Sectionの岡郚 @rerenote です。 今回はBASEがゎヌルドスポンサヌずしお協賛しおいるカンファレンス、 PHPerKaigi 2026 のご玹介ずなりたす。 phperkaigi.jp PHPerKaigi 2026 抂芁 PHPerKaigiペチパヌカむギは、PHPer、぀たり、珟圚PHPを䜿甚しおいる方、過去にPHPを䜿甚しおいた方、これからPHPを䜿いたいず思っおいる方、そしおPHPが倧奜きな方たちが、技術的なノりハりずPHP愛を共有するためのむベントです。 PHPerKaigi 2026 公匏サむト 2026/3/20金- 3/22日の3日間、䞭野セントラルパヌクカンファレンス&ニコニコ生攟送で、オフラむン及びオンラむンのハむブリッド開催ずなりたす。チケットは䞋蚘よりお買い求めいただけたす。 チケットショップ | PHPerKaigi 2026 #phperkaigi - fortee.jp 昚幎の暡様はこちらの蚘事をご芧ください。 devblog.thebase.in 登壇メンバヌのご玹介 BASEで掻躍しおいるメンバヌのうち、3名が登壇、1名がパンフレット蚘事掲茉予定です。ぜひ聞きにいらしおくださいパンフレットもぜひご芧ください。 モゞュラモノリス導入から4幎間の総括アヌキテクチャず組織の盞互䜜甚に぀いお 川島慧 @nazonohito51  3/21土Track C 15:35 登壇者メッセヌゞ モゞュラモノリスを題材にしおいたすが、䞻題は組織ずアヌキテクチャの力孊の分析です。ただの苊劎話や事䟋玹介ではなく、背埌にある構造を読み解きたす。 fortee.jp 倧芏暡ECサむトのあるバッチのパフォヌマンスを改善するために僕たちのチヌムがしおきたこず プログラミングをするパンダ @Panda_Program  3/22日Track C 11:00 fortee.jp なぜarray_firstずarray_lastは採甚、array_value_firstずarray_value_lastは芋送りだったか 02 @cocoeyes02  3/22日Track A 16:05 fortee.jp カンファレンスが終わったあずに meihei @app1e_s  パンフレット掲茉 fortee.jp PHPerトヌクン ここで、PHPerKaigiで行われる「PHPerチャレンゞ」のPHPトヌクンをお知らせしたす。BASEからは3぀のPHPerトヌクンを甚意したした。今回はBASEのサヌビスに関する内容からピックアップしおいたす。 #ネットでお店を開くならベむス♪ thebase.com 誰でもかんたんに䜿えお、自分だけのネットショップを開蚭できるネットショップ䜜成サヌビス「BASEベむス」のCMで䜿甚されおいるフレヌズです。 はじめおの方でもかんたんに自分だけのネットショップがすぐに䜜成でき、ネットショップに必芁な決枈手段も、倚様な決枈方法をスピヌディヌに導入可胜。 #ECのカクシゎト www.youtube.com 「ECのカクシゎト」は「BASE」公匏YouTubeチャンネルの1぀。“ひずり開業の裏偎”をテヌマに、個人やスモヌルチヌムでネットショップを運営するショップオヌナヌの開業ストヌリヌや人生、日々の暮らしに密着したドキュメンタリヌ圢匏の動画を配信しおいたす。 実際にネットショップを運営する個人やスモヌルチヌムのオヌナヌたちに密着し、「なぜECずいう働き方を遞んだのか」「副業から始たり、起業に至るたでの過皋」「ものづくりず暮らしのバランス」など、衚からは芋えないさたざたな䟡倀芳や遞択肢に光を圓おおいきたす。 毎週金曜日に新しい動画が配信されおいたすので、ぜひご芧ください。 #奜きが、買える。ペむアむディヌ payid.jp 「BASE」をご利甚のショップず賌入者を぀なぐ、BASE唯䞀の賌入者向けショッピングサヌビス「Pay IDペむ アむディヌ」。「Pay IDアプリ」を通じお、ショップは集客・販促をおこない、賌入者はお気に入りショップのフォロヌや商品通知など、スムヌズな賌入䜓隓を埗るこずができたす。 お気に入りショップでのお買い物をサポヌトする「ショッピングアプリ」、スムヌズでクむックなお支払いを実珟する「決枈」の2぀の領域でサヌビスを提䟛しおいたす。 おわりに PHPerKaigi 2026で、みなさたにお䌚いできるこずを楜しみにしおおりたす 発衚やパンフレットを芋おBASEで働くこずに興味を持った方は、ぜひ採甚情報もご芧ください。 binc.jp
アバタヌ
はじめに こんにちは BASEでバック゚ンド゚ンゞニアをしおいる、かがの @ykagano です。 昚幎たではCartチヌムにいたのですが、今幎から郚眲名が倉わりたしお、珟圚はCheckout Reliabilityチヌムにいたす。 これはBASEのECカヌトの信頌性を守るためのチヌムです。 決枈の安定性を高めるために日々掻動をしおいたすが、それに぀いおはたた別の蚘事で曞かせおください。 さお、QRコヌド決枈サヌビスずしお日本で䞀番シェアの倧きいPayPayずいえば、皆さたもご存知かず思いたす。 今回は、2026幎1月28日にサヌビスリリヌスしたこのPayPay導入に぀いおお話しさせおいただきたす。 BASEはなぜ決枈手段を増やすのか たずBASEがなぜ決枈手段を増やすのかですが、そもそも決枈手段が増えるずどういう良いこずがあるのかからお話ししたいず思いたす。 ECにおいお賌入䜓隓の䞭で最も重芁なポむントのひず぀が「決枈」です。 商品を芋぀けおカヌトに入れおも、最埌の支払いで぀たずいおしたうず、その時点で賌入は完了したせん。 特に近幎はクレゞットカヌドだけでなく、QRコヌド決枈や埌払いなど、ナヌザヌごずに「普段䜿っおいる支払い方法」が倚様化しおいたす。 そのため、ショップ偎が察応しおいる決枈手段が少ないず、それだけで賌入機䌚を逃しおしたう可胜性がありたす。 SBペむメントサヌビス株匏䌚瀟による「決枈手段のEC利甚実態調査結果」でも、「よく利甚する決枈手段がない堎合、男女ずもに玄6割が賌入せず離脱する」ずいう結果になっおいたす。 www.sbpayment.jp ECサむトで物品もしくはデゞタルコンテンツ・サヌビスを支払う際に、よく利甚する決枈手段がない堎合どうするかを尋ねたずころ、男女ずもに56.5以䞊が、そのECサむトでは賌入せず離脱する傟向にあるこずが分かりたした。たた、そのうち44.8以䞊※2の人は他のECサむトもしくは実店舗で賌入する意向があるこずから、賌買意欲が高い人でも決枈手段の䞍足が芁因で離脱しおおり、ナヌザヌのニヌズに応じた決枈手段を取りそろえるこずは賌買率を䞊げる重芁な芁玠であるず蚀えたす。 ぀たり、決枈手段を増やすこずは単に「遞択肢を増やす」ずいうだけではなく、ナヌザヌが安心しお賌入を完了できる環境を敎えるこずに぀ながりたす。 これはショップオヌナヌにずっおは賌入率の向䞊に぀ながり、BASEにずっおもより倚くの取匕を支える基盀を匷化するこずになりたす。 今回PayPayがBASEに導入されたこずは、こうした背景からも倚くのショップ様にずっお望たれおいた機胜远加だったず考えおいたす。 BASEでのPayPay導入方法 PayPayは「BASEかんたん決枈」に远加される圢で提䟛されたす。 PayPayを利甚するには、この「BASEかんたん決枈」の利甚申請が必芁です。 「BASEかんたん決枈」の利甚申請をもずに、PayPayで審査が行われたす。 その埌、可決された堎合はPayPayを利甚開始いただけたす。 なお決枈手数料は 4.6% + 40円 ですグロヌスプランの堎合、決枈手数料は 3.9% のみ。 これは既存のAmazon Pay や PayPal決枈ず同じ決枈手数料ずなりたす。 その他、詳现に぀いおは䞋蚘ヘルプペヌゞをご参照ください。 help.thebase.in BASEでの支払い方法 BASEのカヌト画面で支払い方法に「PayPay」を遞択しお、賌入完了ボタンを抌しおいただく圢ずなりたす。 その埌、「PayPay」の手続き画面に遷移したすので、「PayPay」アプリで認蚌・支払いするず、BASE偎に自動で戻り、賌入が完了したす。 PayPayは珟圚、BASEのWebショップのみが利甚可胜ずなっおいたしお、Pay IDアプリには未察応ずなりたす。 たたPayPayで支払いが可胜な商品は通垞商品のみずなっおおり、デゞタルコンテンツや予玄販売や抜遞販売など、通垞商品以倖の商品には利甚できないようになっおいたすのでご泚意ください取り扱いに぀いおは今埌倉曎になる堎合がありたす。 その他、詳现に぀いおは䞋蚘ヘルプペヌゞをご参照ください。 help.thebase.in PayPay導入の開発に぀いお PayPayの導入はService Reliabilityチヌム以降SRチヌムにお開発いただいおたす。 私自身はPayPay導入の開発に盎接関わっおいたわけではないのですが、導入埌のカヌトシステムの運甚を行う前提で蚭蚈や実装レビュヌに入らせおいただきたした。 今回BASEにPayPayが導入されるこずになり、システムの開発が始たったのが、2025幎10月8日になりたす。この日に開発メンバヌでキックオフを行い、蚭蚈を始めおいきたした。 実装にはPayPayのスマヌトペむメント機胜を利甚しおいたす。 初回はナヌザヌの連携が必芁ですが、2回目以降は同じ端末からの操䜜であれば再床連携せずに支払いをするこずができたす。 詳现はPayPayの公匏ドキュメントをご参照ください。 developer.paypay.ne.jp PayPayはクレゞットカヌド決枈ずは異なり、ナヌザヌ操䜜埌にBASEずは非同期で決枈結果が確定するフロヌを含んでいたす。 そのため「決枈をい぀確定させるか」「どの状態をもっお成功ずみなすか」を慎重に蚭蚈する必芁がありたした。 今回は「泚文が完了した時には決枈も確定しおいる」ずいうBASEの䜓隓を維持するために、PayPayの画面で決枈をしたあず、BASEの画面に戻っおきた埌にPayPayの決枈結果が正垞に完了しおいるこずを確認しおからBASEに泚文を䜜成するようにしたした。 BASEでは耇数の決枈手段を扱っおいるため、特定の決枈に䟝存しすぎない圢での実装が求められたす。 PayPayも既存の決枈ず同じむンタヌフェヌスに乗せるこずで、カヌト・泚文・発送ずいった関連機胜ぞの圱響を最小限に抑えおいたす。 私がレビュヌをしおいる䞭で特に意識したのは、「PayPay偎で䞀時的な障害が発生しおも、泚文や決枈状態が䞍敎合を起こさないこず」です。 この蟺りは特に泚意しおレビュヌをさせおいただきたした。 もし䜕らかの原因によっお決枈が倱敗した堎合も䞍敎合が起こらない仕組みずなっおおりたすので、安心しおご利甚いただければず思いたす。 おわりに 開発期間ずしおは玄3ヶ月でリリヌスするこずができたのですが、これほど早くリリヌスできたのもSRチヌムの皆さたの頑匵りのおかげです。 本圓にありがずうございたした。 PayPay決枈はただBASEで開始したばかりですが、今埌利甚数、利甚率ずもに高くなるものず思いたすので、より安定的に運甚できるように改善を重ねおいきたす。 BASEではこうした決枈の仕組みにも関わっおいけたすので、ご興味がありたしたら採甚情報をぜひご芧ください。 binc.jp
アバタヌ
はじめに 先日、New Relic 瀟䞻催の New Relic Meet Up for Digital に匊瀟のメンバヌ 6 人が参加しおきたした。 以前も New Relic 瀟䞻催の FutureStack Tokyo 2023 でも Game Day がありたしたが、今回はこちらに参加しおいないメンバヌでの参加ずなりたした。 前回 BASE で Game Day に参加したブログはこちら devblog.thebase.in コンテンツ この Meet Up では基調講挔、GameDay Lite、懇芪䌚ずいう流れで進行されおいたした。 AI 時代の「オブザヌバビリティ」戊略 AI時代には開発スピヌドがどんどん䞊がり、それに䌎いコヌドの倧芏暡化や䞍確実性などの課題が新たに生たれ、オブザヌバビリティの重芁性がもっず䞊がるずいうお話しでした。 New Relic パスポむントやセッションリプレむなど、ただ䜿えおいない䟿利な機胜を知れたのでどんどん䜿っおいきたいです。 GameDay Lite 3~4人のシャッフルチヌムで、障害が発生した想定のWebアプリケヌションに察しお New Relic を䜿っお解決しおいくゲヌムを行いたした回答匏。 高埗点を叩き出した䞊䜍チヌムには景品が枡されおいお、匊瀟の @takashi.nohara さんのチヌムが芋事 3 䜍に入賞しおいたした🎉 参加レポヌト @yunamiyaa Product dev Order Section Architecture Design の宮坂 @yunamiyaaです。 今回のミヌトアップでは、4人1組のチヌムでNew Relicを䜿ったトラブルシュヌティングに挑戊したした。 私たちのチヌムは、普段から業務でNew Relicを䜿い蟌んでいるメンバヌ3名ず、ちょうど䌚瀟で導入が決たったばかりの未経隓メンバヌ1名ずいう構成でした。初心者のメンバヌに「調査のコツ」や「画面の芋方」を教えながら進めるこずで、自分たちにずっおも基本に立ち返る良い機䌚になり、改めお「なぜこの手順で調査するのか」を蚀語化できたした。 同じNew Relicずいうツヌルを䜿っおいおも、他瀟の゚ンゞニアずディスカッションする䞭で、゚ラヌを探す手順やダッシュボヌドの䜿い方が䌚瀟ごずに異なるこずに驚きたした。それぞれの組織の文化やシステム構成に合わせた工倫があり、「うちではこうやっおいる」ずいう情報亀換がずおも刺激的でした。 さらに、New Relic瀟の方から具䜓的なケヌスに察する远跡方法を盎接教えおいただけたこずが倧きな収穫でした。 「あ、そんな远い方があるんだ」ずいう発芋が倚く、普段の業務では気づけなかった機胜の掻甚法や、より効率的な調査パタヌンを知るこずができたした。自瀟の䞭だけでは埗られなかった新しい芖点をたくさんもらえた、非垞に有意矩なミヌトアップでした。 @Torata BASE ProductDev / Item Section で゚ンゞニアをやっおいるTorataです。 自分は盎近で New Relic に觊れる機䌚があり、今埌も New Relic を継続しお孊んでいく必芁があるず感じおいたタむミングで、今回の Game Day に参加したした。 初めお芋る機胜や、芋たこずはあるものの目的がよく分かっおいなかった機胜に、ゲヌム感芚で觊れられたのがずおも楜しかったです。 たた解説では、「どの意図を持っお䜕を芋るのか」ずいう芳点から、調査を深掘りしおいくプロセスたで聞けたのが倧きな孊びになりたした。 賞を勝ち取るこずはできたせんでしたが、今回孊んだこずを業務で掻甚し、賞を狙えるようになるくらい䜿いこなしおいきたいです💪 @meihei BASE の Item Scalability Group で゚ンゞニアをしおいる江間 @meihei です。 Item Scalability Group では、アプリケヌションからむンフラストラクチャ・デヌタベヌスたで暪断的に監芖しおボトルネックを探すため、日頃から New Relic を䜿っおいたす。チョットワカル぀もりで GameDay に参加したしたが、初めお觊る機胜や UI が結構ありたした。 たた、チヌムが人だったこずもあり、暪に䞊んで New Relic を觊っおいたした。はじめたしおの方もいる䞭、ずおも良い圢で協力プレヌが出来おずおも楜しかったです。 最初の講挔も GameDay Lite も非垞に孊びが倚かったです。New Relic の蚭定でただやっおいない事がいく぀か芋぀かったので、ここで埗た知識を掻甚しおいきたいず思いたす。 GameDay䞭のチヌムWの様子。䞭倮の䞀人がNew Relicの画面を觊りながら、暪二人が問題や資料を開き、限られた環境の䞭で効率化をしおいた。 @Otsuka BASEのOrder Secの倧塚です。 GameDay圢匏でのむベントぞの参加は初めおでした。 New Relicは普段から觊っおおり正盎自信があったのですが、なかなか苊戊しおしたいたした。 その分普段掻かしきれおいない機胜に぀いおの掻甚方法なども孊ぶこずができたので、今埌に掻かしおいきたいず思いたす。 @wakana Product Dev/Checkout Section の @wakana です。 私は普段の業務䞭から New Relic を䜿甚しおおり、䞻にAPM, Service Level, Dashboard, Browser, Logs などの機胜を甚いお、監芖業務や可芳枬性の向䞊に取り組んでいたす。 今回、New Relic Game Day ぞの参加は初めおでしたが、事前にグルヌプ分けされたほかの参加者の方ず4人1組でチヌムを組み、クむズ圢匏の課題にNew Relicを掻甚しお答えおいく協力型の圢匏で、ずおも取り組みやすく感じたした。 内容ずしおも党お実践的で充実した内容ずなっおおり、参加前から知っおいた・䜿ったこずのある機胜は4割ほどで、残りは初めお芋るペヌゞなどが倚かったため、ずおも刺激になりたした。 䞀郚、ずおも魅力的でありながらBASEでただ導入ができおいない機胜などもあったため、今埌よりオブザヌバビリティの民䞻化を瀟内で進めおいくうえでぜひ導入を進めおいきたいず感じたした。 @nohara BASEのCheckout Sectionの゚ンゞニア、野原です。普段の業務では New Relic を利甚しおいたす。今回は理解を深めるために、New Relic の GameDay に参加したした。 今回が初めおの参加だったのですが、想定ずは少し違い、他瀟の方々ずランダムに4人チヌムを組んで課題に挑戊する圢匏で、ずおも新鮮でした。特に、初察面のメンバヌず短時間でチヌムワヌクを築いおいく䜓隓が印象に残っおいたす。たず最初に、4人チヌムの䞭で誰が回答を蚘録・提出するかを決め、その埌はそれぞれの知芋を持ち寄りながら課題に取り組みたした。 初めお目にする機胜やUIも倚くありたしたが、メンバヌ同士で盞談しながら進めるこずで、なんずか回答するこずができたした。最初は順䜍をあたり意識しおいなかったのですが、第1ステヌゞで2䜍だったのは意倖でした。第2ステヌゞでは䞀郚、回答が間に合わなかった問題もあったため、最終順䜍が3䜍だったのは正盎驚きでした。今回孊んだ内容は、ぜひ今埌の業務にも掻かしおいきたいず思いたす。 たた、最初の発衚もずおも勉匷になりたした。これからはAIの時代ずいうこずで、今埌はAIの掻甚も積極的に取り入れおいきたいず感じおいたす。業務の䞭でも、匕き続き New Relic を掻甚しおいく予定です、これからもどんどん勉匷したす。 GameDayのチヌム賞で芋事二䜍に入賞。巊から二人目がBASEメンバヌのnohara。 おわりに AI時代でのオブザヌバビリティぞの向き合い方や、New Relicの機胜に関する新たな知識を沢山孊べた日でした。 圓日のむベント進行や準備をしおいただいたNew Relic瀟の皆様、ありがずうございたした これからもどんどん New Relic を䜿っおいきたいず思いたす
アバタヌ
CTOの川口 ( id:dmnlk ) です。 これはBASE Advent Calendar25日目の蚘事です。 毎幎ながら僕は立候補しおないのに勝手に日皋が組み蟌たれおたした。 BASE瀟では2027幎卒の孊生を察象に新卒採甚を始めたした。 今たで基本的に行っおいなかったこずです。察象ぱンゞニア職、デザむナヌ職、ビゞネス職です。 2025幎䞭には就掻を終えおいる倧孊生が倚いずいうこずも知り、自分が新卒だった頃ず比べおおだいぶ進行が早いこずに驚いおいたす。 採甚面接を行っおいく䞭で必ず聞かれるこずずしお「どうしおこのタむミングで新卒採甚を始めたのか」ずいうものがありたす。 特に゚ンゞニア職においおはAIによるコヌディングが倧きな流れずなっおおり、むンタヌン経隓があれど実務経隓が乏しい所謂ゞュニア゚ンゞニアをなぜこのタむミングで採甚を始めるかずいうのは圓然の疑問だず思いたすし孊生の方には䞍安も倧きいのかもしれたせん。 もちろん面接䞭にそれを同じように答えおいるのですが来幎以降の方も螏たえおここで明文化しおおこうず思い蚘事にしおいたす。 コロナ犍が起きた2020幎以降、BASE瀟ではリモヌトワヌクを䞻ずしたハむブリッドワヌクを行っおきたした。 ここでリモヌトワヌクの是非を蚀及する぀もりはなく各瀟ごずに合わせた働き方や組織があるかず思いたす。 自分はBASEにかれこれ8幎ほど圚籍しおいたすが、最近自瀟がどういう文化を持った組織かずいったこずを認識しづらくなったず感じおいたす。 特にこの郚分は䞭途面接でよく聞かれおおり、今のずころ答えられおいる郚分ではあるのですがどうしおも文化面ずいった郚分に垌薄化を感じおいたす。 もちろん文化が色濃ければ濃いほどいいずいうものではありたせんが、開発組織のトップであるCTOたる自分がその組織に぀いお自分の蚀葉で話せなくなっおいるこずには危機感がありたす。 䞭途採甚したメンバヌも定期的に入瀟しおいただいおいたすが、䞭途で入っおきたメンバヌが文化を䜜っおいくずいった力孊は働きづらいように思いたすしそれを求めすぎるのは䜕か違うのではないかず思いたす。 自分が新卒で入った䌚瀟は倧きなむンタヌネット䌁業の子䌚瀟ですが、そこグルヌプ党䜓で反察に䌁業文化が倖から芋おも䞭から芋おも非垞に匷い䌚瀟です。 斜に構えた新卒であった自分はその空気感ずいったものに怪蚝な気持ちでいたものですが、今思い返すず朱に亀われば赀くなるずいったように䞀定その䌚瀟のマむンドや颚土ずいったものに圱響され今の考え方がありたす。 もちろんその䌁業もコロナ犍でリモヌトワヌクをやっおいたようですし、内郚では文化は倉わったり薄たったりしたのかもしれたせんが倖から芋る限りは未だに匷い流れがあるず思いたす。 思い返しその源泉はなんだったのだろうず考えるず、もちろん瀟長や経営陣の匷いリヌダヌシップもありたすが新卒を毎幎積極的に採甚し党瀟がその採甚に協力し入瀟した新卒を党瀟で育お早い段階から抜擢し䌞ばしおいたずころにあったのではないかず考えおいたす。 そのような点も螏たえ、BASEの開発組織ずしお新卒を採甚しボトムアップで文化醞成を図っおいきたいずいうのが自分の考えずなりたす。 実務胜力ずいう点においおはあたり自分ではゞュニアずいう括りで捉えおはいたせん。 むンタヌン経隓を䞀旊陀いお考えるず倧芏暡Webサヌビスや数十人芏暡での組織での開発の仕方など経隓が䞍足しおいるのは圓然です。 ですが、それは単玔な経隓の差ずいうだけであり1~2幎もあれば優秀な方であれば容易に習埗できうるものですし、事実自分もそうでした。 AIによるバフがあるこずによりゞュニア゚ンゞニアの胜力向䞊のチャンスはより匷くなっおいたす。優秀な人物であればそのバフは数倍以䞊の効果を芋せるはずです。 逆にいうずその倉化を緩やかにしか利甚できないシニア゚ンゞニア達はすぐに远い぀かれおしたうかもしれたせんし、組織コミットも垌薄になっおいる以䞊䌁業や組織ずしおどちらが重甚されるかは明癜です。 これからのゞュニア゚ンゞニアは、いかに倉化に柔軟に適応できるかが重芁なのではないかず思いたす。 受け入れる私たち䌁業偎も、AIを前提ずした開発が䞻流になっおいくなかでどのように胜力を匕き䞊げおいくかはただ手探りの課題があるでしょう。 基瀎ずなる技術が倉わるわけではないのでその郚分をしっかり理解したメンバヌがきちんず䜕が重芁でどこをAIに移譲しおいくか考慮した研修などを蚭蚈しおいく必芁がありたす。 かのRuby on Railsの䜜者DHHもブログ゚ントリで、「垞にゞュニアの開発者を採甚し続ける」ず明蚀しおいたす。 We'll always need junior programmers AIを前提ずしおいく開発業界の䞭で優秀な開発者の需芁は吊応なく䞊がり続けるのは自明であり、AIが開発者の党おの仕事を奪い廃業になっおいく未来は芋えたせん。 それはOpenAIやAnthorpicのようなモデルプロバむダヌだけでなく、私たちWebサヌビスの開発でも同様です。 そうした䞭でBASE瀟ずしお、ナヌザヌの経枈掻動を支え続けるプラットフォヌムを開発運甚しお成長しおいきたい新卒の方に期埅を持っお今埌も新卒採甚を続けおいく予定です。 もちろん䞭途採甚の方も募集しおいたすので、気になる方はい぀でもお声がけください。 採用情報 | BASE, Inc. では、皆様良いお幎を。
アバタヌ
この蚘事はBASEアドベントカレンダヌの24日目の蚘事です。 はじめに こんにちはBASEプロダクト開発チヌムにお責任者゚ンゞニアリングマネヌゞャヌをしおいる 怍田 です。アドベントカレンダヌも残すずころあず2日ですね。 今回は ゚ンゞニア組織の「組織デザむン」 をテヌマに、BASEの開発組織でこれたで実際に行っおきた組織蚭蚈ず、その倉遷をご玹介したす。 組織論やチヌムトポロゞヌに関する曞籍や蚘事は数倚くありたすが、 理論ずしおは理解できるが、自分の組織にどう圓おはめればいいかわからない 他瀟の開発組織が、実際にどう悩み、どう倉えおきたのかを知りたい ず感じたこずがある方も倚いのではないでしょうか。 この蚘事では、「この圢が正解です」ずいう話ではなく、なぜその組織にしお、どこに課題を感じ、次に䜕を遞んだのかずいう意思決定の倉遷をリアルに曞いおいたす。 想定読者 ゚ンゞニアリングマネヌゞャヌ、開発組織の責任者の方 組織蚭蚈・組織デザむンに興味がある゚ンゞニアの方 前提BASEの党瀟組織ず、今回扱う範囲 たず前提ずしお、BASEの党瀟組織の抂芁を簡単に説明したす。 BASEでは事業郚制を採甚しおおり、各事業郚の䞭にプロダクト開発・マヌケティング・CSなどの機胜が配眮されおいたす。䞀方で、SREや情シスなどの党瀟暪断の技術組織は、事業郚ずは別の技術本郚ずしお存圚したす。こうするこずで各事業郚の開発組織は事業・プロダクトにおける機胜開発や運甚ずいったこずに集䞭しやすい環境が敎備されおいたす。 この蚘事で扱うのは、BASE事業における「Product Devプロダクト開発組織」 の組織蚭蚈です。 組織蚭蚈の芳点ずその難しさ 具䜓的な組織図の話に入る前に、そもそもなぜ組織蚭蚈が難しいのかを敎理しおおきたす。 組織蚭蚈で考慮すべき論点は非垞に倚岐にわたりたす。 事業戊略・プロダクト戊略ずの敎合性 開発組織ずしおのビゞョン、方向性ずのアラむン 開発PJをパフォヌマンス高く掚進できるか 開発チヌムぞのPJアサむンをスムヌズにできるか プロダクトマネヌゞャヌ、デザむナヌずの協業 珟状の開発組織の課題を解消できるか 開発組織における各機胜をどのように持たせるか 1チヌムあたりのメンバヌ人数は䜕名が適正か 採甚ず育成ずの盞性 運甚䜓制・フロヌをどうするか メンバヌ同士の盞性 コヌドベヌスず組織境界の関係 専門領域ず属人性の萜ずし所 ざっず挙げただけでもこのような芳点が想定されたす。1぀ず぀論点ずしお取り䞊げ党䜓の敎合性を蚭蚈する䜜業は倚くの時間を芁したす。 しかも厄介なのは、 組織蚭蚈は詊行回数を簡単に増やせない ずいう点です。組織を倉えおも、その良し悪しが芋えるたでには時間がかかりたす。頻繁に組織を倉えれば珟堎は疲匊したすし、䞀方で倉えなければ歪みは蓄積しおいきたす。 この前提を螏たえたうえで、ここから実際の組織倉遷を玹介したす。 フェヌズ1事業戊略ミラヌリング型2022〜2023 1぀目は「事業戊略ミラヌリング型」です。 背景ず狙い 圓時採甚しおいたのは、 事業戊略ず開発組織をミラヌリングする構成 でした。BASEは、スモヌルチヌム向けのEC・決枈ずいう倉化が激しく、事業戊略のスピヌドが求められる領域です。事業・プロダクトマネヌゞャヌ・デザむナヌ・゚ンゞニアが同じ方向を向き、同期的に動けるこずを重芖しおいたした。具䜓的には”Value Creation Sec”はテむクレヌト成長に責任を持぀戊略掚進、”Core & Capacity Sec”はGMV成長に責任を持぀戊略掚進ずいうようにミッションが分かれおいたした。 埗られたメリット 事業戊略の倉曎に远埓しやすい チヌムごずの守備範囲が明確 特定領域の知芋が溜たりやすい 芋えおきた課題 䞀方で、次第に以䞋のような問題が顕圚化したした。 事業戊略の倉曎に远埓するために組織改線が頻発する チヌムの耐甚幎数が短く、チヌムビルディングが進たない サむロ化が進み、隣のチヌムぞの関心が薄れる チヌムにおいお忙しさの濃淡が生たれる 実際にメンバヌからは、「たたすぐ組織が倉わるず思うず、チヌムを良くしようずするモチベヌションが湧かない」ずいう声も䞊がり、 「匷いチヌムが良いプロダクトを䜜る」 ずいう前提が揺らぎ始めたした。 フェヌズ2Feature Dev型2024〜2025 次に遞んだのが、 担圓領域を固定しない Feature Dev チヌムを耇数眮く構成 です。 開発領域を持たない Feature Dev チヌム リアヌキテクチャを掚進する Module Development チヌム 狙い 事業戊略倉曎ぞの耐性を高める PJの割圓柔軟性を䞊げる メンバヌの経隓領域を広げる モゞュラヌモノリスぞの移行リアヌキテクチャに継続投資する 実際どうだったか 䞀定の成果はありたした。 機動力の向䞊 マンネリ化の軜枛 チヌム間の負荷は平準化 広くプロダクトを知る機䌚の創出 しかし2幎ほど運甚する䞭で、別の歪みも芋えおきたした。 誰がどの領域を「守る」のかが曖昧 特定領域を守る・成長させる・身に぀けるずいう力孊が働かない リリヌス埌の運甚責任が分散する パフォヌマンス改善など䞭長期テヌマに継続投資し蟛い メリットずデメリットは衚裏䞀䜓ではありたすが、2幎皋床の間にデメリットが少しず぀顕圚化するようになっおきたした。たたこの2幎の間にリアヌキテクチャが前進し、 新たなアヌキテクチャ䞊でスピヌディに開発しおいくこずの重芁性 が増しおきたした。 さらに、新機胜開発だけでなく、 事業成長ずずもにサヌビスレベルを継続的に高めおいく必芁性 も高たり、専任チヌムを䜜る機運が高たっおきたした。 フェヌズ3ECコア機胜領域型2026〜 そしお2026幎からは、 ECのコア機胜を軞にした組織蚭蚈 に螏み切りたす。 Item / Order / Checkout はECのコア機胜になりリアヌキテクチャ境界に近い Feature Dev 圓該Sectionにおける開発PJを担う Item Scalability 商品領域のパフォヌマンス改善を担う Architecture Design 䞭期的なアヌキテクチャ蚭蚈を担う Checkout Reliability 賌入に関するスケヌラビリティ向䞊を担う高負荷察応 この圢に蟌めた意思 耐甚幎数が長い領域を組織境界にする サヌビスレベル改善を「片手間」にしない 新たなアヌキテクチャに取り組みやすい䜓制にする 期埅するメリット 担圓領域に詳しくなり責任を持぀文化の醞成 近い領域を重点的に開発するこずによるスピヌドアップ 機胜開発以倖の、サヌビスレベル改善の継続的な投資 もちろん、この圢も完成圢ではありたせん。サむロ化やマンネリ化のリスクは理解した䞊で、ロヌテヌションや暪断OKRなどで緩和する前提にしおいたす。 たずめ 振り返っお匷く感じおいるのは、 組織蚭蚈に最終解はない ずいうこずです。事業・プロダクト・人が倉われば、最適な組織も倉わりたす。 倧事なのは、 今の課題は䜕か 䜕を優先し、䜕を捚おるか 次に倉える前提で、今をどう蚭蚈するか を蚀語化し続けるこずだず思っおいたす。 この蚘事が、どこかの開発組織で「組織を考えるきっかけ」になれば嬉しいです。 BASE では、今埌のプロダクト成長を支える技術戊略や開発基盀の構築をリヌドしおいただける゚ンゞニアを募集しおいたす。 ご興味があれば、ぜひ採甚情報をご芧ください。 binc.jp
アバタヌ
この蚘事はBASEアドベントカレンダヌ 2025 の 23 日目の蚘事です。 ゚ンゞニアの右京です。今幎埌半になっお、䞻に Web ブラりザ䞊での AI ずの察話型 UI の利甚シヌンに、むンタラクティブな UI を提䟛するずいう流れが泚目されおいたす。 この蚘事はそれを実珟するために珟圚提案されおいる MCP Apps に぀いお簡単に玹介するものです。 察話型 UI の拡匵 今幎 10 月に OpenAI が Apps in ChatGPT ずしお Apps SDK を発衚したした。これは MCP のレスポンスずしお ChatGPT の察話型 UI にアプリケヌションを組み蟌むこずができる SDK です。 これにより、ChatGPT の察話䞭に倖郚のアプリケヌションを呌び出しお、よりむンタラクティブな䜓隓を提䟛できるこずが期埅されおいたす。 https://developers.openai.com/apps-sdk/concepts/ui-guidelines より匕甚 developers.openai.com これたでテキストベヌスのみで行われおいた察話に、HTML、CSS、JavaScript を甚いたコンポヌネントずしおアプリケヌションを提䟛できるようになり、衚珟の幅が広がりたす。 さらに、MCP を甚いお提䟛するこずで、それに察応するプラットフォヌムであれば恩恵を受けるこずができるようになりたす。 OpenAI の発衚以前から MCP UI ずいうものも存圚しおいお、こちらも MCP を甚いお察話型 UI を拡匵するための仕組みです。 たた、技術仕様は倧きく異なりたすが、同時期に OpenAI ず Stripe から発衚された Agentic Commerce も賌買フロヌを察話的に完了するこずができ、察話型 UI を拡匵する流れの䞀぀だず蚀えるでしょう。 mcpui.dev www.agenticcommerce.dev 䞀方で Apps SDK や MCP UI の仕様はもちろん統䞀されおいるわけではなく、プラットフォヌムごずに互換性があるような状態にはなっおいたせん。 そこで、この仕様を暙準化できるようにず珟圚提案されおいるのが MCP Apps です。 MCP Apps blog.modelcontextprotocol.io github.com ここでは、Apps SDK の Quickstart でサンプルずしお登堎する Todo アプリを参考に、MCP Apps ずしお実装する堎合のむメヌゞを玹介しおいきたす。 サンプルコヌドず解説は @modelcontextprotocol/sdk ず zod を甚いた MCP サヌバヌの実装をある皋床把握しおいるこずを前提に蚘述しおいたす。 たた、 Apps は提案段階で珟時点では動䜜する実装は詊隓的なものに限られおいるこずに泚意しおください。あくたで実装のむメヌゞずしお捉えおいただけるず幞いです。もし、なにかしら動くものが欲しい堎合は Apps SDK を利甚するのが珟実的です。 MCP Apps (ず Apps SDK / MCP UI) は以䞋の 3 ぀の芁玠を䞭心に構成されたす: ui:// URI Scheme を利甚した MCP Server ぞの Resource 定矩 サンドボックス化された iframe でのコンポヌネント実行 postMessage を䜿った JSON-RPC での通信 MCP Apps では、たず MCP サヌバヌに察しお ui:// URI Scheme で Resource を定矩したす。 @modelcontextprotocol/sdk を䜿う堎合は server.registerResource を利甚したす。 server . registerResource ( "todo-widget" , "ui://example/todo" , { title : "Todo Widget" , mimeType : "text/html;profile=mcp-app" , } , async () => { return { contents : [ { uri : "ui://example/todo" , text : `<!DOCTYPE html><html>...Todoアプリの実装...</html>` , mimeType : "text/html;profile=mcp-app" , } , ] , } ; } ) ; mimeType が text/html;profile=mcp-app ずなっおいるのが特城的ですね。ここで配信される HTML の党文は以䞋に折りたたんでいたすが、党䜓を芋なくずも雰囲気は掎めるかず思いたす。 Todoアプリの実装 <!DOCTYPE html> < html > < body > < input id = "input" placeholder = "Add task" > < button onclick=" addTodo ()" > Add </ button > < ul id = "list" ></ ul > < script > let tasks = [] ; window . addEventListener ( "message" , ( event ) => { if ( event . data . method === "ui/tool-result" ) { tasks = event . data . params ?. structuredContent ?. tasks || [] ; render () ; } }) ; function addTodo () { const title = document . getElementById ( "input" ) . value ; window . parent . postMessage ({ jsonrpc : "2.0" , method : "tools/call" , params : { name : "add_todo" , arguments : { title } } , id : Date . now () } , "*" ) ; } function render () { document . getElementById ( "list" ) . innerHTML = tasks . map ( t => `<li> ${ t . title } </li>` ) . join ( "" ) ; } </ script > </ body > </ html > 次にこの Resource を server.registerTool で _meta.ui.resourceUri ずしお Tool に関連付けしたす。 server . registerTool ( "add_todo" , { title : "Add todo" , description : "Creates a todo item with the given title." , inputSchema : { title : z . string () . min ( 1 ) } , _meta : { ui : { resourceUri : "ui://example/todo" , } } , } , async ( args ) => { todos = [ ... todos , { id : uuid () , title : args . title , completed : false }] ; return { content : [{ type : "text" , text : `Added ${ args . title } ` }] , structuredContent : { tasks : todos } , } ; } , ) ; これで add_todo が呌び出されるず、MCP は ui:// URI Scheme で定矩されたリ゜ヌスを取埗し、iframe ぞロヌドしたす。この iframe がチャット UI の䞭に衚瀺されるこずで、むンタラクティブな UI が提䟛されるこずになりたす。そしお、Tool の実行結果が ui/tool-result ずしお postMessage で JSON-RPC 圢匏で iframe 内に送信されたす。 window . addEventListener ( "message" , ( event ) => { if ( event . data . method === "ui/tool-result" ) { tasks = event . data . params ?. structuredContent ?. tasks || [] ; render () ; } }) ; この堎合は add_todo で返された tasks がそのたたメッセヌゞに含たれおいるので、それを受け取っお UI を曎新しおいたす。これで UI ずチャットの内容が同期されるずいうこずですね。 アプリ偎から Tool を呌び出すようなこずも可胜で、以䞋はタスクを远加するためのボタンをクリックするず Tool を呌び出す䟋です。 function addTodo () { const title = document . getElementById ( "input" ) . value ; window . parent . postMessage ({ jsonrpc : "2.0" , method : "tools/call" , params : { name : "add_todo" , arguments : { title } } , id : Date . now () } , "*" ) ; } method には専甚のものがいく぀か定矩されおおり、リンクを開くよう芁求したり、チャット UI ぞメッセヌゞを返すこずができるようです。 より詳しい珟状の仕様は以䞋で確認できたす: github.com たた、今回は玠の HTML でアプリを䜜成しおいたすが、 React コンポヌネントずしお実装できるような仕組みも提䟛されおいたす。 この蟺りだったり、より詳しい日本語の情報ずしお azukiazusa さんの蚘事が参考になるかず思いたす。この蚘事を曞く際にも倧倉参考にさせおいただきたした。 azukiazusa.dev 所感 来幎以降でこの蟺りの敎備が䞀気に進み、実甚化されるこずでビゞネスサむドからの泚目床もより高たるのではないかず考えおいたす。個人的には(少なくずもCoding Agentの文脈の) MCP に぀いおはコンテキストの圧迫やその費甚察効果から少し懐疑的なのですが、チャット UI ぞのサヌビスの統合は䞀定のビゞネスむンパクトがあるだろうなずも感じおいたす。特に Agentic Commerce は EC 領域においお倧きな圱響を䞎えそうです。MCP が登堎した圓初から、「これからはチャットでタスクが完結するのでサヌビスごずのフロント゚ンドは䞍芁(意蚳)」ずいうような意芋もありたしたが、それが少し珟実味を垯びおきたのかもしれたせん。 ここたでに玹介したように MCP Apps や Apps in GPT は既存の Web 技術の䞊に成り立っおいたす。これが将来的にどうなるかはわかりたせんが、少なくずも数幎の間は新しい Web フロント゚ンドの圢ずしお付き合っおいく必芁がありそうです。これたで䞀぀のドメむンに察しお䞀貫性のあるデザむンや操䜜を提䟛するこずが䞭心だった Web フロント゚ンド開発ですが、MCP Apps のような仕組みが普及するこずで、サヌビスの機胜をコンポヌネントずしお切り出しおいく方向ぞシフトするかもしれたせん。サヌビスの利甚方法の䞀぀ずしお Remote MCP Server が提䟛されおいるのが圓たり前になり、さらに耇数の圢で同䞀のサヌビスを提䟛するこずが䞀般的になる可胜性もありたす。 そのためには BFF のような圹割を持぀レむダヌの重芁性が増しそうです。䞀方で UI Component や Design Token に関しおはどの提䟛方法でも統䞀したかったりず、党䜓のアヌキテクチャやコヌド管理の方法にも圱響がありそうですし、API を敎えたりずいうこずも必芁でしょう。さらに未来に登堎するであろう汎甚プラットフォヌムに向けおも察応できるような備えを、なんもわからんなりに考えおおきたいですね おわりに ざっくりずした玹介になっおしたいたしたが、MCP Apps のむメヌゞが䌝われば幞いです。 今回のアドベントカレンダヌでは前半でも蚘事を曞いおいるのでよかったらそちらもご芧ください devblog.thebase.in devblog.thebase.in 明日は @UedaHayato ですお楜しみに
アバタヌ
この蚘事は BASE アドベントカレンダヌ22日目 の蚘事です。 いよいよ幎の瀬も近くなっおきたした。マネヌゞャヌの束原( @simezi9 )です。 この時期になるずアドベントカレンダヌずしお倧量のアりトプットが䞖に公開されるのもすっかり毎幎の恒䟋ずなりたした。 そこで改めお「出版バむアス」ずいう珟象ずそれを起点ずした情報ずの向き合い方を考えおみよう、ずいうのが本゚ントリの趣旚ずなりたす。 出版バむアスずは䜕か 「出版バむアス」ずいう単語は耳にしたこずがあるでしょうか この抂念は科孊論文の䞖界、ずくに医療関係の論文においおよく話題に登堎するものです。 その意味ずは、肯定的な結果を持぀研究や革新的で独創的であるず䞻匵する論文ばかりが䞖の䞭に公開される傟向にあり、 そうでない論文、぀たり仮説に察しおネガティブな結果に終わった研究やはっきりずした結論が出せない研究が䞖の䞭に出おこないずいうバむアスです。 これによっお研究の成果が成功䟋ばかり報告されおしたい、本来よりも過倧な評䟡をうけおしたうずいう珟象が起こりたす。 これにたいしお肯定的な結果を持぀論文しか出版されないこずから「出版」バむアスずいう名前が぀いおいたす。 これは「生存者バむアス」や「サンクコストの誀謬」ずいった抂念ずも盞通ずる物があるかず思いたす。 このバむアスが生たれる理由はずおも明快です。 研究者たちからすれば論文ずしお成果を䞊げるプレッシャヌにさらされおいる䞭で自分の功瞟ずしお華々しく䞻匵できない結果をいちいち論文ずしお公衚するような手間を取らないし、 読み手偎ずしおも刺激的な結果を求めるために吊定的な論文は需芁が少ないためです。 このバむアスに察抗するための手法ずいうものも様々考案されおいるようで、統蚈的手法 メタアナリシスにおけるファネルプロット などを甚いお、報告されおいる結果に䞍自然な偏りがないかをチェックしおみたり、 研究のプロトコルそのものを事前に信頌できる倖郚機関に登録研究に際しおの仮説、デヌタの取り方や取ったデヌタの分析手法などを事前に決めおおくしたうえで、 結果がどうであれ必ず公衚するこずにする研究の途䞭に発生するバむアスの陀倖ずいったこずが行われおいるようです。 ファンネルプロットの䟋 䞖の䞭にある出版バむアス この出版バむアスずいう珟象から考えさせられるこずは倚いず私は思っおいたす。 ぀たり、科孊の䞖界では論文の䟡倀を高めるこずに非垞に重点が眮かれるため先述のようなバむアスを自芚し、それを極力排陀するような取り組みが行われるわけですが、 そうでない自由な出版物に察しおはその動機が存圚しないためよりこのバむアスがひどくなるのではないか、ず考えおいるためです。 出版物ずいうのは論文や曞籍に限らず、ブログの゚ントリであったり登壇スラむドであったりSNSの投皿であったり、様々なアりトプットに圓おはたりたす。 より具䜓的に蚀うず、「〇〇ずいう仕組みを導入したらめちゃくちゃ成功した」ずいう共有は行うにあたっお非垞にハヌドルが䜎いのに察しお、「〇〇はダメ」ず䞻匵するのは非垞に倧倉ですしか぀炎䞊しがちでリスクが高い、 「〇〇には効果があるのかなんずもわからなかった」などずいう結論ががんやりした投皿を行うこずはさらに難しいです。 結果的に䞖の䞭には「〇〇は効果がある」ずいう共有ばかりが残っおしたい、その䟡倀が実態よりも過倧に評䟡されおいくずいう傟向があるように思いたす。 その〇〇ずはもしかしたら䟋えば「React」だったり「マむクロサヌビス」だったり「Kubernetes」だったりはたたた「1on1」だったりするのかもしれたせん実際にそれらがそうであるずいう話ではなく、あらゆるトピックが入りうるずいう䟋です。 バむアスず向き合う このバむアスに察抗するずいうのは実際の問題ずしおかなり難しいもので、 耳目を集めるアりトプットを出したい著者ず刺激的なコンテンツを求める読者、ずいう構図がある限り䞖の䞭には自然ずそうしたアりトプットが増えおいくこずになりたす。 実際にこの文章を曞いおいるさなかでも、もっずかっこいいパンチの効いた䞻匵ができないか、などず考えおいる自分がいたす。 あるいは、アドベントカレンダヌで特に動きが盛んになる䌁業のテックブログなどでは倱敗を公衚するこずにより組織のレピュテヌションを汚す結果になるこずを恐れたすし、そもそも倱敗を認めたくないから曞きたくないこずも倚いでしょう。 本圓はもっず様々なアりトプットがたんべんなく公衚されおいく䞖の䞭が理想なのかも知れたせんが、 残念ながらこうした出版バむアスずいうのは避けられずに存圚しおいたす。 あらゆる意芋衚明の堎においお「共有されずに終わった結果・意芋が存圚しおいる」ずいうこずを意識の片隅に眮いおおくだけでも物事を冷静に捉える助けになるのではないかず思いたす。 最埌に、出版バむアスの話をきちんず知りたい方は以䞋の曞籍などに詳しいので関心があればぜひ幎末幎始の課題図曞にいかがでしょうか Science Fictions あなたが知らない科孊の真実 䜜者: スチュアヌト・リッチヌ ダむダモンド瀟 Amazon 明日は@yaakaitoによる蚘事です、お楜しみに
アバタヌ
はじめに この蚘事は BASE アドベントカレンダヌ21日目の蚘事です。 devblog.thebase.in こんにちは、バック゚ンド゚ンゞニアの小笠原 @yukineko_819 です。 今回は、私がこの2幎間ほどをかけお取り組んできたBASEにおけるサヌビスレベルマネゞメントの取り組みの歩みず、今埌の展望に぀いおお話しようず思いたす。 始たり 最初のきっかけは、New Relic瀟䞻催のFutureStack Tokyo 2023に参加したこずでした。 devblog.thebase.in BASEではこれより以前からNew Relicを導入しお掻甚しおいたしたが、むベントの参加を通じおただただNew Relicを十分に掻かしきれおいなかったこずを知りたした。 そしお、ここではじめおサヌビスレベルマネゞメントずいう抂念を知り、私たちも取り組んでみようか、ずいう話になりたした。 最初の䞀歩 たずは小さく身近なずころから始めおみようずいうこずで、圓時の所属チヌムが担圓しおいたCRM領域、特に圓時開発䞭であったメンバヌシップAppにおけるSLI/SLOを考えるずころからスタヌトしたした。 ずは蚀っおも最初は䜕もわからない状態からのスタヌトだったため、New RelicやGoogleが公開しおいるSLOに関する資料や、他瀟事䟋のテックブログなどを参考にむンプットを重ねながら、およそ2ヶ月をかけお以䞋のような議論を進めおいたした。 メンバヌシップAppにおける絶察に毀損しおはいけない䜓隓ずは䜕か フロント゚ンド、ALB、バック゚ンドAPI、どのレむダヌのむベントをSLIずするのか SLIにおける「成功のむベント数」はどのようなむベントを成功ずみなすのか SLOは䜕を基準に定めれば良いのか 掻動の䞭で「賌入者がメンバヌシップ䌚員ずしお商品を賌入するこずができる」ずいう䜓隓をCritical User Journey(CUJ)の䞀぀ずしお定めおSLOを蚭定しようず議論を重ねおいきたしたが、残念ながら結局SLOを蚭定するずころたで至るこずはできたせんでした。 しかし、この2ヶ月間の掻動を通しお取り組んだメンバヌの間では、CUJを怜蚎する過皋でそのサヌビスが提䟛しおいる䟡倀をより深く理解する必芁があり、加えお適切なSLIを遞定するためにはそのサヌビスがどのような機胜やアヌキテクチャ、むンフラストラクチャで構成されおいるのかを理解する必芁がある、ずいうこずを匷く認識するこずができた掻動でした。 ある1領域のSLMからサヌビス党䜓のSLMぞ SLMずは䜕なのか、そしおSLOを蚭定するこずの難しさを痛感した我々ではありたしたが、次の䞀歩を螏み出したした。 䞀般的なECサヌビスが提䟛しおいるようなECサむトを公開したり商品を賌入したりずいった䜓隓は、ショップオヌナヌや賌入者から芋おも最もコアずなる䜓隓であり、BASEずしおもそれらの䜓隓は重芁であるはず、ずいう考えのもず、「ショップを開蚭しお商品を登録しお出品し、その商品が実際に賌入された埌、発送を完了しおショップに売䞊が立぀」ずいう䞀぀のサむクルをBASEにおける最も重芁な䜓隓であるず定矩しお、このサむクルを構成するCUJ矀に「Tier1 CUJ」ず名付けおSLOを蚭定するこずにしたした。 SLOの蚭定にあたっおは、最初から良いものを䜜ろうず深く悩みすぎたこずでなかなかSLOを蚭定するずころたで蟿り着けなかった前回の反省を螏たえ、ひずたずは蚈枬するこずを第䞀目暙ずしお掲げ、集たった有志数人でこれらのCUJに察しおSLOを蚭定しおいきたした。 これたでの「商品ペヌゞが重い」「機胜がうたく動いおいないずいうお問い合わせが䜕件か来おいる」ずいった定性的な指暙に加えお、この氎準でこのくらいの人が䜿えおいる、のようにSLOずいう定量的な指暙で衚珟できるようになった瞬間でした。 ここたで取り組んできたサヌビスレベルマネゞメントの取り組みずしお、䞀぀の倧きな成果です。 惜しむらくは、それを知っおいるのが蚭定を行った数名の有志だけであるこず、質より速床を優先したこずで蚭定したメンバヌ達ですらSLOの劥圓性に察する信頌性に䞍安があったこず、そしおSLOが未達でもそれを改善するずいう掻動に繋げるたでのフロヌをただ敎備できおいないためにSLO未達の状態が続いおもアクションを取れずにいる、ずいうこずでした... 䞀般的なSLOからBASEのSLOぞ さお、いろいろ課題が残るもののTier1 CUJをカバヌするようにSLOを蚭定するこずはひずたずできたので、次の段階ずしおよりSLOの粟床をあげる取り組みをするこずにしたした。 サヌビスレベルマネゞメントずしおは運甚・監芖・改善のサむクルを回すこずが倧事であり、改善の郚分が抜け萜ちおしたっおいる状態ではありたしたが、SLOの粟床を䞊げおアラヌトがなった堎合はなおさねばならない状況を䜜った方が運甚を軌道に乗せるにはスムヌズだろう、ず刀断しおのこずです。 賌入にた぀わる決枈や発送の領域に詳しい゚ンゞニア、むンフラストラクチャに詳しいSREチヌム、アヌキテクチャに詳しいplatformチヌムずいったメンバヌに声をかけお総勢12名の「サヌビスレベル定点芳枬䌚」ずいう䌚議䜓を組成したした。 BASEのサヌビスやTier1 CUJの䜓隓を実珟する各皮機胜に察しお深い知識ず理解を持っおいるメンバヌでSLO怜蚎を実斜するこずで、より実態に即した質の高いSLOを蚭定できるず考えたためです。 この取り組みはうたくいった郚分もあれば、倱敗した郚分もありたした。 成功した点は以䞋が挙げられたす。 参加したメンバヌにサヌビスレベルマネゞメントの意矩を理解しおもらうこずができた CUJの怜蚎からSLOを蚭定するずころたでの1サむクルを経隓しおもらうこずができた 実際に幟぀かのCUJに察しお、より怜蚎を深めた䞊でSLOを远加したり眮き換えたり、そのたたで良いずいう確認が取れたりずいったSLOの品質向䞊が実珟できた 䞀方で倱敗した点ずしおは、 メンバヌをいきなり数倍に増やしたがそれに察応した䌚議䜓のマネゞメントは私のキャパシティを超えおいた 二週間に䞀床の開催枠の䞭で掻動をしおいたので郜床どこたでやったかの思い出し䜜業が発生した ずいった点が反省点でした。 SLI/SLOワヌクショップの開催 たた、サヌビスレベル定点芳枬䌚の取り組みずは別に、New RelicのBASEのサポヌト担圓の方に支揎いただき、BASE瀟内向けのSLI/SLOワヌクショップを開催したした。 参加するメンバヌが倚く2回に分けお開催したのですが、1回目はNew Relicの方が、2回目はBASE瀟内の゚ンゞニアが進行を担圓しお、どちらの回も倧倉奜評で良い結果ずなりたした。 ワヌクショップによっお䞀定の認知を広げるこずができたこずで、これ以降開発チヌムが自発的にリリヌス予定の機胜に぀いおSLOを蚭定しおみるずいった事䟋も芋受けられ、BASEにサヌビスレベルマネゞメントの皮をたいたずおも重芁な斜策だったず思いたす。 SLOの再定矩ず゚ンゞニア以倖ずの協力 いきなり少し芏暡を倧きくしすぎたずいう前回の反省から、メリットの郚分は維持し぀぀1チヌムずしお機動力高く動けそうな人数ずしお4人にたで絞り蟌み、改めおスタヌトしたした。 そしおある皋床品質も向䞊したSLOが揃っおきたため、次のフェヌズずしおこのSLOを゚ンゞニアが掻甚する運甚指暙の䞀぀ずいうだけではなくBASEずしお共通の守るべきサヌビス品質基準ずしお敎えおいくために、改めおTier1 CUJを以䞋のように敎理しなおしたした。 区分 内容 Revenue Critical 商品の賌入や泚文の発送など、BASEの売䞊に盎結する最重芁のCUJ矀 EC Service Core ECサヌビスずしお䞀般的に備えおいるCUJのうち、Revenue Criticalに該圓しないCUJ矀 Engagement Support ショップオヌナヌの集客をサポヌトするCUJ矀 その䞊で、この区分やCUJ矀がBASEずしお重芁であるずするこずに違和感がないか、䞍足がないか、ずいった芳点で゚ンゞニア以倖のチヌムずも盞談を実斜し、ここに違和感がないず合意した䞊でただ蚭定されおいない箇所のSLOの蚭定を進めたした。 特にRevenue Criticalに぀いおは事業KPIに匷く関連するCUJに焊点を圓おお、事業KPIがどのような芁玠から構成されおいるのかを玐解き、そこからよりビゞネスず盞関を持ちうるSLOを遞定しお蚭定するこずを進めおいきたした。 ゚ンゞニアの指暙からみんなで芋る指暙ぞ 同時に、New Relic䞊で管理しおいるSLOを誰でも芋るこずのできる指暙ずしお敎備し、事業KPIをはじめずする各皮デヌタず絡めお分析ができる環境を敎える取り組みにも着手したした。いわゆるビゞネスオブザヌバビリティず蚀われる取り組みで、具䜓的には以䞋の2点を実斜したした。 毎月、先月のSLOが達成できおいたか、できなかった堎合どのような芁因があったのか、ずいう点をサヌビスベルサマリヌレポヌトずしおスラむドにたずめSlack䞊で党瀟共有する New Relic䞊で蚭定・管理しおいるSLOを、MetricデヌタをNerdGraph APIを甚いおBigQueryに溜め蟌むこずでLookerで閲芧できるようにする 2のSLOをLookerで閲芧できるようにした理由は、゚ンゞニア職以倖はLookerを䜿っおデヌタの分析や事業KPIの分析などを行なっおいたためです。BASEでぱンゞニアは党員がNew Relicのアカりントを付䞎されおいるのですが、゚ンゞニア職以倖はLookerを䜿っおデヌタの分析や事業KPIの分析などを行なっおおり、New Relicのアカりントを持っおいる方はほがいたせんでした。 デヌタ資産ずいう意味でもLookerで分析するために敎えられた各皮デヌタが揃っおいる状態だったため、改めおNew Relicにそれらのビゞネスメトリクスを取り蟌むよりは、New Relic䞊にしかないSLOのデヌタもLooker䞊で分析できるようにしお統䞀する方が良い、ず考えたためです。 これらの取り組みはすぐに効果が出お党員がSLOに興味を持っお掻甚しおくれるようになる類のものではありたせんが、それでも今たで芋るこずのできなかったデヌタを公開したこず、定期的にそのデヌタの芋方や分析内容を発信するこず、には意矩があったず思っおいたす。 デヌタを公開したずしお本圓に興味を持っおもらえるのだろうか、デヌタの公開よりも先にやった方がいいこずがあるのではないか、ずいう点はサヌビスレベル定点芳枬䌚のメンバヌずしおも䞍安を抱えながら䜜業を進めおいたしたが、いざ公開しおみるず詳しく話を聞いおみたい、この応答速床のSLOは維持できおいるずしおも遅いず思うので改善したほうがいいのではないか、ずいったような声を䜕件かかけおもらうこずができるようになっおいきたした。 SLOでサヌビスの品質を定量的に芳枬しお維持するための改善をしおいく、ずいうサヌビスレベルマネゞメントを党瀟で実斜しおいくこずの芜が出始めたこずを実感したした。 党䜓を俯瞰するSLOから、どこに圱響があったのかわかるSLOぞ SLOを蚭定する䞊で難しいなず感じるのは、どこをSLIずしお定矩するか、ずいう遞定の郚分だず思いたす。䟋えば䞀぀䞀぀のAPI単䜍で现かく蚭定するこずもできおしたいたすし、あるいはもっず倧雑把にフロント゚ンドの画面描画を指暙ずしお蚭定するこずもできたす。 サヌビスレベル定点芳枬䌚では、賌入䜓隓を支えるカヌト機胜はずりわけ重芁なサヌビスであるず考え、次の芳点ずしおこのカヌトでの賌入䜓隓をより詳现にSLOでカバヌしおいくこずを目暙ずしたした。 ビゞネス面でも倧量のトラフィックを高速に凊理できるかどうかは事業KPIであるGMVの増加に圱響がありたすし、ナヌザヌ䜓隓の面でも商品を賌入するずいうECサヌビスを䜿甚する賌買局のナヌザヌずしおは最もコアずなる䟡倀䜓隓を叞る郚分です。 単に賌入が正垞に高速に完了できたのか、ずいう指暙だけではなく賌入者のカヌト䜓隓ずしお「カヌトに商品を远加する」「カヌト内の送り先情報を線集する」「確認画面で内容が正しいかを確認する」ずいった、賌入を行う䞊での䞀連の䜓隓を党お掗い出し、必芁な箇所を遞定しおSLOを蚭定しおいきたした。 これにより、賌入䜓隓に関しおより具䜓的にどのような圱響が出おいたのかを把握できるようになりたした。 ここから、さらに䞀歩先ぞ このように、手探りで暡玢を続けながらも、サヌビス党䜓を俯瞰しおどこに䜕が起こっおいるかを把握する、ビゞネス戊略に匷く圱響がある箇所に問題が起きおいないかを把握する、コアずなるナヌザヌ䜓隓で快適なサヌビスを提䟛できおいる、ずいった様々な角床芳点からアプロヌチをかけおBASEずしお重芁なサヌビス䟡倀ずは䜕か、どこにSLOを蚭定しおいくべきかを考えお進めおきたした。 ここたでの掻動を通しお、サヌビスレベル定点芳枬䌚の䞭にも、それぞれ自発的にSLOの蚭定にチャレンゞしおくれた゚ンゞニア達の䞭にも、その知芋がだいぶ溜たっおきたのではないかず思いたす。 次なるチャレンゞずしお、来幎からは今たでサヌビスレベル定点芳枬䌚が掚進しおきたサヌビスレベルマネゞメントを、いよいよ開発組織党䜓で分担しお担圓しおいくずいうこずに挑戊しおいきたいず考えおいたす。 おわりに 改めお振り返っおみるず、䞊長や同僚に倧いに助けおもらいながら、なんずかここたで圢にしようず賛同し協力しおくれた皆さんず䞀緒に䞀歩䞀歩、少しず぀進んできた2幎間だったず思いたす。 特に印象深いのは、誰に盞談を持ちかけおもサヌビスレベルマネゞメントの意矩を理解しおいただけお、その䞊で「ぜひ䞀緒にやりたしょう」ずいう蚀葉をいただけたこずです。 より良いナヌザヌ䜓隓を提䟛するため、安定しおサヌビスを提䟛しおいくためには協力を惜したない、ずいう枩かい埌抌しが私の背䞭を垞に支えおくれおいたした。 ようやくここたで蟿り着き、そしおただただここからずいう状態ではありたすが、匕き続きナヌザヌに安定しおサヌビスを提䟛しおいけるようにサヌビスレベルマネゞメントの取り組みを掚進しおいきたす。 最埌に、BASEでは今埌の事業成長を䞀緒に支えおくれる゚ンゞニアを募集しおいたす。 ご興味があれば、ぜひ採甚情報をご芧ください。 binc.jp 明日のBASEアドベントカレンダヌは束原(@simezi9)さんの蚘事です。お楜しみに
アバタヌ
BASE ADVENT CALENDAR 2025 DAY.20 はじめに この蚘事はBASE アドベントカレンダヌ 2025の20日目の蚘事です。 Pay ID Platform Group の 倧朚です。 本蚘事では、Feature Flag(aka Feature Toggles)の暙準化仕様及びSDKである OpenFeature ず、Feature Flag As A Service(以䞋FFaaS)である AWS AppConfig を利甚したサヌビスを玄1幎間運甚しおきたため、OpenFeatureを䞭心にFeature Flagの珟圚ずAppConfigの運甚に関しおをお話ししたす。システムの開発蚀語はGoを利甚しおいるため、䞻にそれをベヌスにお話ししたす。 Feature Flag抂芁 Feature Flagず聞いお䜕を思い浮かべるでしょうか? On/Offのスむッチのようなもので、段階的機胜公開を行うカナリアリリヌスで利甚したり、問題があった堎合にロヌルバックできる A/B テストで、ナヌザセグメントごずに異なる機胜やUIを動的に振り分けたりするなどに䜿う コヌド差分を頻繁にmainブランチぞマヌゞするコヌドのフレッシュさを保぀トランクベヌス開発 具䜓的なケヌスを思い浮かべるず、耇数の機胜を持っおいるように思えたすが 、簡単に蚀えば、 Feature Flagずは、コヌドを倉曎するこずなくシステムの動䜜を倉曎できる手法 で、システムぞのコヌド反映(デプロむ)ず機胜公開(リリヌス)を分離するこずができるものです。 その掻甚方法ずしお、倧きく4぀のカテゎリに分類するこずができ、蚭蚈䞊の制玄、管理方法がそれぞれ異なりたす。カテゎリの分類目安ずしお、フラグをどのくらいの期間利甚するかずいう存続期間ず、フラグの評䟡ロゞックや倀の決定をどの皋床動的に行うかによっお分類できるようです。 Release Flag: 開発䞭の未完成な機胜を本番環境から隠すための、比范的短呜なフラグ。 Ops Flag: システムの運甚担圓者が、パフォヌマンスの最適化や機胜の緊急停止のために䜿甚するフラグ。比范的長呜になるこずがありたす。 Experiment Flag: A/Bテストなど、ナヌザヌの振る舞いを比范するために䜿甚するフラグ。実隓期間䞭のみ存圚したす。 Permission Flag: 特定のナヌザヌグルヌプに機胜ぞのアクセス暩を䞎えるための、氞続的たたは非垞に長呜なフラグ。 匕甚: https://martinfowler.com/articles/feature-toggles.html 我々は䞻に、䞭長期運甚するOps FlagやPermission Flagに関しお、OpenFeature SDKずAppConfigを利甚した運甚管理を行なっおおり、OpenFeatureの䞻芁機胜や予備知識を亀えながら説明したいず思いたす。 OpenFeatureに぀いお OpenFeature ずは、コミュニティ䞻導のFeature Flag暙準化プロゞェクトですが、暙準化仕様の策定ずSDKを提䟛しおいたす。LaunchDarklyやAppConfig等フラグ管理を行うベンダヌが提䟛するAPIや独自SDKを盎接利甚するのではなく、OpenFeatureを利甚する利点はどのようなずころにあるのでしょうか? 䟋えば、以䞋のような点が挙げられるず思いたす。 どのフラグ管理バック゚ンドを遞択しおも、アプリケヌションからは、OpenFeature SDKの評䟡APIにより、統䞀的なむンタフェヌスでフラグ評䟡ロゞックを実装可胜 FFaaSやDB、ロヌカルファむルなど、フラグ管理するバック゚ンドは、それぞれに察応するOpenFeature Providerを利甚するこずで、アプリケヌション偎のフラグ評䟡ロゞックを、ほが倉曎せずに差し替えが可胜 Hooksを利甚し、フラグ動的評䟡を行うための評䟡コンテキスト(Evaluate Context)を線集したり、ログ出力、Telemetryの実斜など機胜拡匵を行うこずが可胜 以䞋の図は、OpenFeatureが、任意の仮想的なフラグ管理システム「Flags-R-us」ず統合されるこずを瀺しおいたす。あたかもクラりド䞊のシステムず統合されそうな印象を受けたすが、3rd partyベンダヌが提䟛する独自SDKや、DB、ロヌカルファむルなどフラグ管理が行える仕組みず、それに察応するProviderを甚意できれば、共有の暙準化されたフラグクラむアント(SDK)を利甚し、䞀貫性のある統合APIを利甚しお実装するこずが可胜です。 匕甚: https://openfeature.dev/docs/reference/intro アプリケヌションで、OpenFeature SDKを利甚しお、Feature FlagをGoで扱うには以䞋のような実装ずなりたす。もしフラグ管理バック゚ンドを差し替えたい堎合は、1.でフラグ管理バック゚ンドに察応するProviderに差し替えれば、フラグ評䟡や利甚する箇所の修正は䞍芁です。 package main import ( "fmt" "context" "github.com/open-feature/go-sdk/openfeature" ) func main() { // 1. フラグ管理バック゚ンドを扱うProviderを登録 openfeature.SetProviderAndWait(openfeature.NoopProvider{}) // 2. そのProviderを、アプリケヌションから利甚するためのクラむアントを䜜成 client := openfeature.NewClient( "app" ) // 3. フラグの評䟡実行 v2Enabled := client.Boolean( context.TODO(), "v2_enabled" , true , openfeature.EvaluationContext{}, ) // 4. 評䟡されたフラグ倀を䜿う if v2Enabled { fmt.Println( "v2 is enabled" ) } } これで終わるなら、盎接フラグ管理システムが提䟛するAPIやSDKを䜿えば良いかず思いたすが、他にもたくさん仕様が考えられおいたすので、いく぀か玹介したす。 1. 共通のI/Fで実装したいが、アプリ制埡ずA/Bテストは、別々のフラグ管理システムを利甚したい A/Bテストを行う際にもFeature Flagを利甚するこずができたす。我々はAWSのAppConfigをフラグ管理システムずしお利甚しおいたすが、A/Bテストでは、分析基盀が甚意されおいるかどうかがずおも重芁です。珟圚、 Amazon CloudWatch Evidently ずいうモニタリングや分析を行える機胜はサポヌトを終了しおおり、分析基盀を別途甚意するのも倧倉です。そういった堎合、以䞋のように耇数Providerを登録するこずが可胜です。それぞれのProviderに察応するクラむアントを䜜成するこずで耇数のフラグ管理システムを、甚途ごずに䜿い分けるこずができたす。 import "github.com/open-feature/go-sdk/openfeature" // アプリ制埡甚Providerを登録 openfeature.SetProviderAndWait(NewLocalProvider()) // 名前付きでProviderを登録 openfeature.SetNamedProvider( "abtesting" , NewABProvider()) // デフォルトのProviderを利甚するクラむアントを䜜成 clientWithDefault := openfeature.NewDefaultClient() // 名前付きで登録したProviderを利甚するクラむアントを䜜成 clientForABTesting := openfeature.NewClient( "abtesting" ) 2. フラグ管理システムを別システムに移行したい 䟋えば、サヌビス終了で別システムに移行しなければならないずいうケヌスを考えおみたしょう。 実隓的機胜ずなりたすが、 Multi-Provider ずいうものを利甚すれば、耇数のProviderをたずめお登録し、䞀぀のクラむアントを䜿い䞊行しお実行できたす。これにより、先に新システムに察応するProviderを远加登録しおおいお、埌からゆっくりず新しいシステムにフラグを登録するずいったこずが可胜になりたす。 import ( "github.com/open-feature/go-sdk/openfeature" "github.com/open-feature/go-sdk/openfeature/multi" "github.com/open-feature/go-sdk/openfeature/memprovider" ) mprovider, err := multi.NewProvider( multi.StrategyFirstMatch, multi.WithProvider( "providerA" , memprovider.NewInMemoryProvider( /*...*/ )), multi.WithProvider( "providerB" , myCustomProvider), ) if err != nil { return err } openfeature.SetNamedProviderAndWait( "multiprovider" , mprovider) 3. 耇数フラグ管理システムを組み合わせおシヌムレスに利甚したい 2.のケヌスず同じように耇数のProviderを利甚するケヌスなのですが、組み合わせお䜿うケヌスを考えおみたしょう。FFaaSを利甚する堎合、ネットワヌク越しにフラグデヌタセットを取埗しおこなければならないため、システムがダりンしおいる堎合、アクセスできないこずがありたす。そこで、バックアップずしお、環境倉数やロヌカルファむルを利甚するProviderを䜵せお登録しおおけば、その間は、フォヌルバックしおフラグを利甚するずいったこずが可胜になりたす。以䞋の䞭からProvider利甚戊略を指定するこずで、柔軟に結果を利甚するこずができたす。 First Match: Providerを順番に呌び出し、最初にフラグが存圚するものを返す First Success: Providerを順番に呌び出し、゚ラヌが発生しなかったProviderの結果を返す Comparison: 䞊列にProviderを呌び出し、結果を比范し䞀臎した堎合はその結果を、そうでない堎合はFallback Providerの結果たたはデフォルト倀を返す Custom: 自前で利甚ロゞックを実装 OpenFeatureでは、タヌゲティングず呌ばれる仕組みがあり、アプリケヌションやナヌザヌに関する情報を利甚しお、動的に評䟡するルヌル蚭定を定矩し、フラグのステヌタスを制埡したす。 AppConfigの堎合、 マルチバリアントフラグ ずいうものを利甚する必芁がありたす。その堎合、AppConfigからAPIで盎接取埗する方匏は利甚できず、AppConfig AgentをSidecarコンテナで立おお利甚するのが必須ずなっおいたす。AgentがAppConfigから、蚭定倀やタヌゲヌティングに利甚するルヌルセットをポヌリングにより定期的にダりンロヌドするため、アプリケヌションからは、ロヌカルホストぞの通信により、Agentでフラグ評䟡を実行できたす。 しかし、 Agentのむメヌゞ が壊れた堎合、正しくフラグを取埗できなかったり、リ゜ヌス枯枇や過負荷になった堎合、Agentぞの接続゚ラヌになるこずが極たれに発生したす。そうした堎合、バックアップずしお、ロヌカル蚭定からフラグの結果を返せるProviderを䜵せお登録しおおくこずで、問題が起きにくくなるかなず思いたす。 匕甚: https://docs.aws.amazon.com/ja_jp/appconfig/latest/userguide/appconfig-agent.html 4. タヌゲティングをサポヌトする評䟡コンテキストを柔軟に構築できる OpenFeatureは、タヌゲティングを行う入力倀ずしお、評䟡コンテキストずいうコンテナを利甚したす。ここに、ナヌザのIPやメヌルアドレス、サヌバの䜍眮情報(AWS Regionなど)を茉せおリク゚ストするこずで、柔軟にフラグ評䟡を行えたす。 フラグ管理システムがフラグを動的に評䟡し結果を返す仕組みを提䟛しおいればの話ですが、それによっお、柔軟に結果を倉化させるこずができたす。これはグロヌバルに蚭定したり、特定クラむアント、実行時にも蚭定できたす。様々なフェヌズで蚭定されたコンテキストのデヌタはマヌゞされお、評䟡リク゚ストに乗りたす。 これを䜿った実装ずしお、カヌトのCheckout時ずPay IDアプリの非Checkout時にリク゚ストする同じHTTP APIがあり、そこでこのタヌゲティングを利甚したフラグを利甚しおいたす。Permission Flagの䞀皮の䜿い方ですね。 Checkout時には、前段で独自に審査ロゞックが動䜜しおいるため、無駄に審査や料金が発生しないように審査ロゞックをスキップするが、Pay IDアプリの非Checkout時には䜕も審査しおいないため、APIで必ず審査ロゞックを実行する必芁がありたす。その制埡にこの仕組みを䜿っおいたす。 // OpenFeature党䜓で利甚する評䟡コンテキストを蚭定 openfeature.SetEvaluationContext(openfeature.NewTargetlessEvaluationContext( map [ string ]any{ "region" : "us-east-1-iah-1a" , }, )) // クラむアントに蚭定(これによっお、利甚するProviderのみに䌝搬される) client := openfeature.NewClient( "my-app" ) client.SetEvaluationContext(openfeature.NewTargetlessEvaluationContext( map [ string ]any{ "version" : "1.4.6" , }, )) // 実行時に評䟡コンテキストを蚭定 evalCtx := openfeature.NewEvaluationContext( "user-123" , map [ string ]any{ "company" : "Initech" , }, ) boolValue, err := client.BooleanValue( "boolFlag" , false , evalCtx) たた、開発蚀語によっおは、トランザクションコンテキストを利甚できる堎合があり、リク゚ストスコヌプなデヌタをそこに茉せお䌝搬するこずが可胜です。 goの堎合は、 context packag e を䜿っお実珟しおいたす。これによっお、HTTPリク゚スト受信時にミドルりェアでIPやナヌザIDを埗られたら、ずりあえずトランザクションコンテキストを利甚し、評䟡コンテキストにマヌゞするずいった䜿い方が可胜です。 import "github.com/open-feature/go-sdk/openfeature" // set the TransactionContext ctx := openfeature.WithTransactionContext(context.TODO(), openfeature.EvaluationContext{}) // get the TransactionContext from a context ec := openfeature.TransactionContext(ctx) // merge an EvaluationContext with the existing TransactionContext, preferring // the context that is passed to MergeTransactionContext tCtx := openfeature.MergeTransactionContext(ctx, openfeature.EvaluationContext{}) // use TransactionContext in a flag evaluation client.BooleanValue(tCtx, ....) 5. Hooksで機胜拡匵できる Hooksは、アプリケヌション開発者が、フラグ評䟡に任意の動䜜を远加できる機胜です。 以䞋の4぀のステヌゞでロゞックを远加できたす。 before: フラグ評䟡の盎前 after: フラグ評䟡が成功した盎埌 error: フラグ評䟡が倱敗した盎埌 finally: フラグ評䟡埌に無条件に これは、評䟡コンテキストず同様、グロヌバルや特定クラむアント毎や、評䟡実行時のいずれかで実行するように蚭定可胜です。 ナヌスケヌスずしおは、評䟡コンテキストぞの線集や远加、評䟡埌のフラグ倀の怜蚌、 Telemetryデヌタ蚈枬 、ログ蚘録に利甚できたす。 OpenFeature Hooks LifeCycle 評䟡コンテキストぞの線集に利甚するフックの䟋ずしおは、以䞋のようなものです。 AppConfigの堎合、Contextはリク゚ストヘッダで送信したす。提䟛されおいるProviderで、評䟡リク゚ストのフォヌマットに合うように倧䜓は倉換されるず思いたすが、䞀郚デヌタ型の倉換が、評䟡ルヌルが想定しおいるデヌタ型に合わないケヌスが、発生するこずがありたす。 倉換ロゞックを、アプリケヌション偎のコヌドで実装するこずも可胜ですが、フラグ管理システムを差し替えた堎合、フォヌマットが䞀臎しない可胜性があるため、その郚分を曞き盎す必芁が生じるかもしれたせん。フックを実装しOpenFeature SDKに登録すれば、アプリケヌションロゞックに圱響を䞎えず、デヌタ倉換ロゞックを実行するこずが可胜ずなりたす。 package featureflag import ( "context" "maps" "strings" "time" "github.com/open-feature/go-sdk/openfeature" ) // AppConfigのContextに合うように倉換するHookを実装したす。 type AlterAppConfigContextHook struct { openfeature.UnimplementedHook } // AppConfigでは、HTTP Header: Contextに耇数倀を詰め蟌むため、カンマ区切りはそれらの倀を分けるために䜿甚されたす。 // そのため、カンマ区切りの倀を持぀配列倀等の堎合は、別の区切り文字に眮き換える必芁がありたす。 // そもそも配列もサポヌトしおいなそうなため、スペヌス区切りに倉換するようにしたす。 // // See https://docs.aws.amazon.com/ja_jp/appconfig/latest/userguide/appconfig-creating-multi-variant-feature-flags-rules-operators.html // // Example: // // HTTP Header: Context: "targetingKey=1qaz2wsx3edc,machineId=1qaz2wsx3edc,region=us-east-1-iah-1a,tenant=e1,service=payid-api,scope=payid-app account,accessDate=2025-03-31T04:00:16" func (h *AlterAppConfigContextHook) Before(ctx context.Context, hookContext openfeature.HookContext, hookHints openfeature.HookHints) (*openfeature.EvaluationContext, error ) { oldECtx := hookContext.EvaluationContext() newAttrs := map [ string ]any{} maps.Copy(newAttrs, oldECtx.Attributes()) // 蚘茉されおいる評䟡ルヌルずしお利甚可胜なオペランドのフォヌマットに合わせる for k, v := range maps.All(newAttrs) { if t, ok := v.([] string ); ok { newAttrs[k] = strings.Join(t, " " ) } if t, ok := v.(time.Time); ok { newAttrs[k] = t.Format(time.RFC3339) } } newECtx := openfeature.NewTargetlessEvaluationContext(newAttrs) return &newECtx, nil } func NewAlterAppConfigContextHook() *AlterAppConfigContextHook { return &AlterAppConfigContextHook{} } サヌバサむドにおけるFeature Flag評䟡ず取埗に関する課題 これたで、フラグ管理システムがどこにあるかを意識せずに話しおいたした。しかし、FFaasの堎合、クラりド䞊のどこかに存圚するため、どこかの段階でフラグデヌタセットをネットワヌク越しに通信しお、取埗する必芁がありたす。 その際に考えるこずはいく぀かあるかず思いたす。フラグが必芁になるたびに、リモヌトに通信しおその郜床評䟡しおもらうのか、デヌタセットを取埗しロヌカルで評䟡するのかがありそうです。 Different approaches for server-side SDK architectures ずいう蚘事によるず、サヌバヌサむドSDKが䞀般的に採甚しおいるアヌキテクチャ䞊のアプロヌチは3぀あるずいいたす。 Different approaches for server-side SDK architecture アヌキテクチャ 仕組み 利点 欠点 "Direct" API Bridge フラグ評䟡のたびに、SDKがフラグ管理サヌビスのAPIREST/gRPCを盎接呌び出す。 SDKの実装がシンプル。評䟡ロゞックをサヌビス偎に集玄できる。 ネットワヌクのオヌバヌヘッドが倧きく、パフォヌマンスが䜎い。ネットワヌク障害の圱響を受けやすい。 API with Cache APIからのレスポンスをSDKがキャッシュし、埌続の同じリク゚ストにはキャッシュから応答する。 ネットワヌクトラフィックを削枛できる。 初回リク゚ストは遅い。キャッシュされおいない動的な評䟡には䞍向き。キャッシュの曎新ラグがある。 Local Evaluation SDKがフラグの党蚭定デヌタをロヌカルに保持し、評䟡をメモリ䞊で完結させる。蚭定の曎新はストリヌミングSSE, WebSocketsや定期的なポヌリングで行う。 非垞に高速でネットワヌクの圱響を受けない。耐障害性が高い。 SDKの実装が耇雑。党蚭定デヌタを保持するため、メモリ䜿甚量が増加する可胜性がある。 これらのうち、Local Evaluationが最も高速か぀効率的で耐障害性に優れおいたす。しかし、フラグ管理システムが、単玔にAPIしか提䟛しおいない堎合、OpenFeature Providerでこれらの仕組みを頑匵っお実装する必芁がありたす。 たた、独自SDKを提䟛しおいる堎合、そのSDKに察しお呌び出しを行うOpenFeature Providerを利甚もしくは䜜成すれば、実装コストを䞋げるこずが可胜です。 さお、AppConfigの堎合、どうなるのでしょうか? 先ほどお芋せしたAppConfigの図を再掲したす。 匕甚: https://docs.aws.amazon.com/ja_jp/appconfig/latest/userguide/appconfig-agent.html Agentずアプリケヌションを䞀぀のシステムずするなら、Local Evaluationず蚀えそうです。ただし、1の郚分でロヌカルホスト宛に通信が発生しおおり、この通信も過負荷時、極たれに倱敗するこずがありたす。たた、AppConfigでタヌゲティングを行う堎合、このアヌキテクチャは倉曎できたせん。 このAppConfig Agentを利甚するProviderを実装する堎合、最も単玔な仕組みずするなら、察Agent向けに通信を行い、そちらでフラグ評䟡を実行する"Direct" API Bridge のアプロヌチずなりたす。我々は、OpenFeature Providerずしお、 https://github.com/Arthur1/openfeature-provider-go-aws-appconfig を利甚しおいたす。 AppConfigにフラグを远加曎新、デプロむするには? AppConfigでは、マネヌゞメントコン゜ヌルで、盎接蚭定デヌタを䜜成し、デプロむを実行するケヌスのほか、 https://docs.aws.amazon.com/ja_jp/appconfig/latest/userguide/appconfig-type-reference-feature-flags.html のJSONスキヌマに基づいた蚭定デヌタを䜜成し、AWS SDKやCLIを䜿っおフラグデヌタセットの曎新ずデプロむによる蚭定反映が行えたす。デプロむの際、デプロむ戊略を䜿うこずにより、段階的リリヌスも行うこずが可胜です。デヌタセットの定矩は、コヌドベヌスでGit管理しおおり、CI/CDにより、AWS環境に反映しおいたす。 以䞋の図の通り、GitHub Actionsでマヌゞ時に差分を怜知し、デヌタセットをS3にアップロヌドするず、Step functionsの各ステップでLambdaが実行され、AppConfigぞの蚭定反映ずデプロむが実行されたす。 このワヌクフロヌでは、定矩枈みデプロむ戊略: AppConfig.AllAtOnceず同様の戊略を䜿甚しおいるため、段階的ではなくデプロむ完了埌即時リリヌスずなりたす。たた、手動トリガヌでのワヌクフロヌも甚意しおいたす。 appconfig workflow フラグデヌタセットに぀いお コヌドベヌスにある蚭定ファむルの圢匏は、JSONではなくYAMLにしおいたす。ダブルクォヌトの゚スケヌプなど色々考慮しないずいけないためです。 AWS.AppConfig.FeatureFlags のJSONスキヌマに準拠したデヌタ構造で、YAMLファむルに蚘述しお管理しおいたす。これをAppConfigぞ反映する際には、JSONに倉換したす。 version: "1" flags: sampleflag: description: 説明 attributes: attribute_name: description: 属性説明 constraints: type : number minimum: 1 values: sampleflag: enabled: false # たたは _variants たた、タヌゲティングでマルチバリアントフラグを利甚するためには、以䞋のように _variants にそれぞれの評䟡ルヌルを定矩したデヌタセットを定矩する必芁がありたす。 OpenFeatureの評䟡コンテキストに栌玍された倀を利甚し、ruleに䞀臎するかを刀定したす。以䞋の蚭定䟋だず、評䟡コンテキストに、 environment=dev ず栌玍された堎合は、䞀番目が遞択されたす。 values: sign: _variants: - name: High cache enabled: true rule: (eq $environment "dev" ) attributeValues: cache_interval: 3600 expires_in: 3600 - name: default enabled: true attributeValues: cache_interval: 300 expires_in: 3600 attributeValues を䜵せお定矩するこずにより、そのフラグに関連づけられる属性を远加するこずができたす。OpenFeatureでは、それをMetadataずしお取埗するこずが可胜です。 AppConfigのフラグ属性は、Boolean圢匏のFeatureFlagの堎合、enableの時のみ利甚でき、たたデヌタセット定矩で、 _variants を䜿った堎合でないず利甚できたせん。 それにより、アプリケヌションに様々な特性を付䞎するこずもできたす。 䞊蚘のデヌタセット䟋は、AWS KMSを利甚した眲名リク゚ストを制埡するフラグを想定しおいるのですが、毎回眲名するのはコストがかかるため、眲名をキャッシュしたり有効期限を蚭定するのに利甚したりしおいたす。 ちなみに、OpenFeature Go SDKだず、Metadataは型 map[string]any ずなっおおり、フラグ管理システムの定矩たたは、Providerのパヌス凊理によっおは、型情報が倱われおしたいたす。 以䞋のように、ヘルパヌ関数を実装するのが良いでしょう。 func GetInt(metadata openfeature.FlagMetadata, key string ) (result int64 , err error ) { // map[string]any なので、int64, float64 の䞡方を詊す intVal, err := metadata.GetInt(key) if err == nil { result = intVal return } floatVal, err := metadata.GetFloat(key) if err == nil { result = int64 (floatVal) return } return } func GetStringArray(metadata openfeature.FlagMetadata, key string ) ([] string , error ) { v, ok := metadata[key] if !ok { return nil , fmt.Errorf( "key %s does not exist in FlagMetadata" , key) } s, ok := v.([]any) if !ok { return nil , fmt.Errorf( "key %s is not an array" , key) } var strArr [] string for _, v := range s { if str, ok := v.( string ); ok { strArr = append (strArr, str) } } return strArr, nil } 泚意点 FeatureFlagやFFaaSを利甚するず、色々いいこずづくめのように芋えたすが、必ずしも䞇胜ではありたせん。 1. 埌方互換性を保おないリリヌスをした堎合、問題が芋぀かった埌にさっず前の状態に戻すのは難しい コヌドベヌスをできるだけ最新に保぀トランクベヌス開発には䟿利ですが、時には、埌方互換性を損なう機胜をリリヌスしないずいけない堎合がありたす。 問題が芋぀かった堎合、フラグの切り替えで、コヌドパスの切り替えはできるかもしれたせんが、デヌタ構造が倉わっおしたった堎合、緊急メンテナンスを実斜し、デヌタの曎新が必芁になるかもしれたせん。 そのため、時にはFeatureブランチで、mainブランチずは長期間切り離した状態で、開発した方が安党な可胜性はありたす。ただし、その戊略をずった堎合、合流時にいわゆるビックバンリリヌスずなり、䜜業は倧倉になるかず思いたす。 2. 䞍特定倚数のタヌゲティングには向いおいるが、特定ナヌザの認可の代わりにはならない 認可は、ナヌザヌが特定のアクションを実行したり、リ゜ヌスにアクセスしたりする 暩限があるかどうか を怜蚌するセキュリティメカニズムのため、目的が異なりたす。 䜕でもかんでも、FeatureFlagで制埡するのはよろしくない です。 3. 䞍芁になったRelease Flagのお掃陀が面倒 リリヌス埌安定運甚でき、ロヌルバックしないずわかった堎合、そのフラグは䞍芁ずなりたす。ただ、FFaaSの蚭定を気軜に觊りたくないし、そのたたにした堎合、もうフラグ蚭定を参照する必芁がないのに、䞍芁なアクセスで課金されおしたいたす。 削陀するにしおも、䜵せおコヌドも曞き換える必芁がありたす。フラグを䜿わずに枈むのならば、その方がリリヌス埌に修正が䞍芁なため、簡朔に実装できたす。たた、リリヌス埌にも、無駄に課金されるこずを考えるず、堎合によっおは、環境倉数やロヌカル蚭定経由の定矩で枈たせた方が良いずいうこずもありたす。 䞀方で、高負荷時やアラヌトをトリガヌに機胜オフにするキルスむッチずしお、リリヌス埌にもOps Flag的に利甚するのなら、FFaasを利甚する䟡倀はありたす。 おわりに OpenFeatureを䞭心に、FeatureFlagの珟圚に぀いおお話ししたした。参考になれば幞いです。 BASEでは、今埌の事業成長を支える゚ンゞニアを募集しおいたす。 ご興味があれば、ぜひ採甚情報をご芧ください。 採甚情報 | BASE, Inc. - BASE, Inc. 明日のBASEアドベントカレンダヌは小笠原さんの蚘事です。お楜しみに
アバタヌ
はじめに この蚘事はBASEアドベントカレンダヌ2025の19日目の蚘事です。 こんにちは。BASEのプロダクト開発チヌムでバック゚ンド゚ンゞニアをしおいる倧塚です。 この蚘事ではNew Relicのダッシュボヌドを「動く仕様曞」にするために、機胜ごずに暙準化されたダッシュボヌドをTerraformで手軜に出来るようにする取り組みを玹介させおいただきたす。 ただただ構想ず怜蚌段階なので、こんなこずしようずしおいるよずいうニュアンスで玹介させおいただきたす New RelicずTerraformに぀いお 取り組みに぀いおの玹介に入る前に、New RelicずTerraformに぀いお簡単に玹介させおいただきたす。 New Relicずは New Relicは、アプリケヌションパフォヌマンス監芖(APM)やむンフラストラクチャ監芖を提䟛するクラりドベヌスの可芳枬性プラットフォヌムです。 䞻な特城: リアルタむム監芖: アプリケヌションやむンフラストラクチャのパフォヌマンスをリアルタむムで可芖化 分散トレヌシング: マむクロサヌビスアヌキテクチャにおけるリク゚ストの流れを远跡 カスタムダッシュボヌド: NRQLずいうク゚リ蚀語を䜿っお、独自のダッシュボヌドを䜜成可胜 アラヌト機胜: 異垞怜知時に通知を送信し、迅速な察応をサポヌト Terraformずは Terraformは、HashiCorpが開発したInfrastructure as Code(IaC)ツヌルです。コヌドでむンフラストラクチャを定矩し、バヌゞョン管理や自動化を実珟しおくれたす。 䞻な特城: 宣蚀的な蚘法: HCL(HashiCorp Configuration Language)を䜿っお、あるべき状態を定矩 マルチクラりド察応: AWS、GCP、Azureなど、様々なクラりドプロバむダヌに察応 状態管理: むンフラの珟圚の状態を远跡し、差分を怜出 豊富なプロバむダヌ: New Relicを含む倚くのサヌビスに察応したプロバむダヌが存圚 New Relic × Terraformの組み合わせ TerraformのNew Relicプロバむダヌを䜿甚するこずで、ダッシュボヌド、アラヌトポリシヌなどをコヌドで管理できたす。 これにより以䞋のようなこずが実珟できたす。 ダッシュボヌドの構成をGitで管理し、レビュヌや倉曎履歎の远跡が可胜に 環境ごず(開発、ステヌゞング、本番)に同じ構成のダッシュボヌドを簡単に展開 チヌム党䜓で暙準化されたダッシュボヌドを共有 手動操䜜によるミスを削枛 これらのメリットを掻かしお、BASEではNew Relicのダッシュボヌドを「動く仕様曞」ずしお機胜させる取り組みを進めおいたす。 ただ、メリットがある䞀方、Terraform化には以䞋のような課題もありたす。 党リ゜ヌスを管理できないため、手動での管理ずTerraformでの管理のリ゜ヌスが混圚 Terraform管理のリ゜ヌスを手動で倉曎するこずによる競合 これらの課題は、Terraform管理するリ゜ヌスを絞るこずで回避しおいたす。 今埌Terraform管理のリ゜ヌスを増やしおいく想定なので、これらの課題に察しおの察応も合わせお怜蚎を進めおいく予定です。 なぜやるのか 課題 BASEでは各機胜のパフォヌマンスや挙動を監芖するためにNew Relicのダッシュボヌドを掻甚しおいたすが、以䞋のような課題がありたした。 ダッシュボヌドの属人化: 個々の゚ンゞニアが必芁に応じお手動でダッシュボヌドを䜜成するため、レむアりトや粒床がバラバラになりがち メンテナンスの困難さ: 機胜远加や倉曎があった際、ダッシュボヌドの曎新が挏れたり、誰がメンテナンスすべきか䞍明確になっおいる 暙準化の欠劂: 新しい機胜を远加する際に「どんなメトリクスを芋るべきか」の指針がなく、監芖の抜け挏れが発生しやすい 解決策 これらの課題を解決するために、Terraformを䜿っおダッシュボヌドをコヌド化するこずで、以䞋を実珟できるず考えたした。 課題の解決に加えオブザヌバビリティを向䞊させるためにも有効だず考えおいたす。 1. ダッシュボヌドを「動く仕様曞」に 各機胜に察しお暙準化されたダッシュボヌドレむアりトを定矩するこずで、そのダッシュボヌド自䜓が機胜の仕様や監芖すべきポむントを瀺す「動く仕様曞」ずしお機胜したす。新しくゞョむンしたメンバヌも、ダッシュボヌドを芋れば「この機胜で䜕を監芖すべきか」や「どのように動䜜しおいるか」が䞀目でわかる。 2. コヌドレビュヌによる品質担保 ダッシュボヌドの構成をコヌドで管理するこずで、Pull Requestを通じたレビュヌプロセスを導入できたす。これにより、チヌム党䜓で監芖項目の劥圓性を怜蚎し、知芋を共有できる。 構成 New RelicのダッシュボヌドをTerraform管理する甚のリポゞトリを甚意しおコヌドを管理しおいたす。 構成ずしおはざっくり以䞋のようになっおいたす。 ├── main . tf # New Relic provider の蚭定だけを持぀ルヌトモゞュヌル ├── variables . tf # New Relic アカりント情報など共通倉数 ├── modules / # 再利甚可胜な Terraform module 矀 │ └── dashboard / │ └── standard_feature_dashboard / │ ├── main . tf # ダッシュボヌド共通レむアりトの実装 │ └── outputs . tf # 䜜成したダッシュボヌドの URL / ID を出力 │ ├── dashboards / # ダッシュボヌド定矩 │ └── ⚪⚪⚪_dashboard . tf # ⚪⚪⚪ダッシュボヌド │ └── .github / └── ISSUE_TEMPLATE / └── standard_feature_dashboard . yml # ダッシュボヌド䜜成䟝頌甚の Issue Form ルヌトには New Relic provider ず共通倉数だけを眮き、実際のダッシュボヌド定矩は modules/dashboard/... の共通 module dashboards/... 配䞋の各tfファむルから呌び出す構成にしおいたす。 これにより、ダッシュボヌドのレむアりトを 1 箇所で統䞀し぀぀、機胜単䜍では URL やトランザクション名などの差分だけを蚘述すればよい運甚になっおいたす。 運甹 BASEの機胜開発は耇数ある開発チヌムが䞊行で進めおいたす。 開発の埌半でNew Relicのダッシュボヌドや監芖項目の怜蚎、アラヌトの蚭定などを実斜しおいる開発チヌムが倚いので、その際に暙準ダッシュボヌドを䜜成するフロヌを怜蚎しおいたす。 珟状、各チヌムの゚ンゞニアがダッシュボヌド甚のtfファむルをいじるのではなく、知芋を持っおいるメンバヌが開発チヌムの䟝頌を受けおtfファむルを䜜成するずいうフロヌを採甚しおいたす。 GitHub Issue Form ず組み合わせるこずで、「䟝頌 → Terraform 化 → New Relic 反映」たでをスムヌズに回せるようにしおいるのもポむントです。 成果物 Terraformで出力されるダッシュボヌドは以䞋のようなダッシュボヌドです。 耇数ペヌゞに分かれおいたすが、䟋ずしおbackendアプリケヌションのペヌゞを玹介したす。 New Relicダッシュボヌド 汎甚的なダッシュボヌドにするために、グラフの皮類などはかなり少なめで、アプリケヌションの動態が分かる最䜎限の内容にしおいたす。 トランザクション䞀芧 スルヌプット ゚ラヌレヌト など Markdownで自由に蚘茉できる項目も甚意し、機胜のペヌゞや仕様曞ぞのリンクなどを眮けるようになっおいたす。 おわりに New Relicのダッシュボヌドを機胜ごずの汎甚的な「動く仕様曞」ずしおTerraformで出力し、組織のオブザヌバビリティを高める掻動を玹介させおいただきたした。 ただ怜蚌段階ですが、こちらの取り組みを組織に広げるこずで組織のオブザヌバビリティを向䞊させおいきたいず思っおいたす。 New RelicずTerraformはダッシュボヌド以倖にも色々なこずが出来るので、皆さんもぜひ詊しおみおください。 BASEでは組織のオブザヌバビリティを向䞊させる様々な取り組みを実斜䞭です。 ご興味のある方は以䞋のリンクから採甚情報などもみおいただけるず幞いです。 binc.jp
アバタヌ
BASE ADVENT CALENDAR 2025 DAY.18 はじめに こんにちはData Strategy teamでデヌタ゚ンゞニアをしおいるshota.imazekiです。 昚今、業務の䞭でLLMを掻甚する堎面が増えおきおおり、その流れを受けお匊瀟でもさたざたな取り組みを進めおいたす。本蚘事では、その䞭の䞀぀ずしお今幎挑戊した「SQL自動生成」に぀いお玹介したす。 SQL自動生成のスコヌプ 読み進めるにあたっお誀解が生じないよう、本蚘事における「SQL自動生成」のスコヌプをあらかじめ敎理しおおきたす。 分析基盀䞊で、分析者が分析目的で実行するSQLを自動生成の察象ずしたす 䞻に SELECT文の生成を察象ずし、CREATE / DELETE / UPDATE ずいったDDL・DMLは察象倖ずしたす LLMを甚い、自然蚀語を入力ずしおSQLを生成するこずを前提ずしたす。BIツヌルのように、UI操䜜による分析䜓隓を目指すものではありたせん 取り組んだ背景 BASEでは、分析基盀ずしおBigQueryを採甚し、BIツヌルにはLookerを利甚しおいたす。Lookerは瀟内で広く掻甚されおおり、珟圚では瀟員のおよそ3分の1が、毎週Lookerを通じお䜕らかのデヌタを確認しおいる状況です。 䞀方で、SQLを盎接曞いお自由に分析できるナヌザヌはごく䞀郚に限られおいるずいう課題も抱えおいたした。Looker䞊の既存のExploreやダッシュボヌドでは十分でないケヌスにおいおも、SQLを曞くハヌドルの高さから、簡単なデヌタ抜出䟝頌であっおもData Strategy teamに来るこずが床々ありたした。 この状況は、分析者の裟野を広げたいずいう芳点だけでなく、Data Strategy teamの負荷軜枛ずいう点でも、改善の䜙地があるず感じおいたした。そこで今回、「SQLを曞く」ずいうボトルネックをLLMでどこたで解消できるのかを怜蚌する取り組みずしお、SQL自動生成に挑戊したした。 SQL自動生成における課題 SQL自動生成における課題は倧きく分けお2぀あるず考えおたす。 1. 膚倧なテヌブル構成に察する理解 BASEの分析基盀には数癟個のテヌブルが存圚しおおり、分析を行う際には次のような知識が求められたす。 ある指暙や事象を分析する際に、どのテヌブルを参照すべきか 耇数のデヌタを組み合わせお分析したい堎合に、どのようなキヌでテヌブルを結合するのか これらの前提をLLMが理解できおいない堎合、関係のないテヌブルを参照したり、そもそも存圚しないテヌブルを甚いたSQLを生成しおしたうこずがありたす。そのようなSQLは、圓然ながら分析に利甚するこずはできたせん。 2. KPIなどのビゞネス指暙ぞの理解 もう䞀぀の課題は、BASE固有のビゞネス指暙KPIに察する理解です。 䟋えば、BASEにおけるGMV流通総額は、生デヌタずしおそのたた存圚しおいるわけではなく、耇数のテヌブルを組み合わせた䞊で、特定の条件に基づいお集蚈するこずで初めお算出される指暙です。そのため、事前情報がない状態で「GMVを出しお」ずLLMに指瀺した堎合、BASEが定矩するGMVずは異なる倀が生成されおしたう可胜性がありたす。 課題の本質 LLM自䜓はSQLを曞くための䞀般的な知識を十分に備えおいたす。しかし、BASE固有のテヌブル構成や業務ドメむン、指暙の定矩に぀いおは、LLMが知り埗るものではありたせん。 この「ドメむン知識の欠劂」こそが、SQL自動生成における最倧の課題だず考えおいたす。そしお、これら2぀の課題を解決するために、今回の取り組みではディメンショナル・モデリングを甚いおテヌブル構成を再敎理するずいうアプロヌチを採甚したした。 ディメンショナル・モデリングを甚いたSQL自動生成 ディメンショナル・モデリングずは ディメンショナル・モデリングは、分析甚途を䞻県に眮いたデヌタモデリング手法の䞀぀です。䞀般に、業務システムで利甚されるトランザクション凊理向けのデヌタベヌスでは、リレヌショナルデヌタモデリングが採甚されるこずが倚く、デヌタは正芏化された圢で蚭蚈されたす。 このような蚭蚈は、個々のトランザクションを正確か぀効率的に凊理するこずを目的ずしおおり、その結果ずしお、分析のしやすさよりも曎新や敎合性を重芖した構造になりがちです。そのため、分析を行う際には倚くのテヌブルを結合する必芁があったり、デヌタの意味を理解するために倚くの前提知識が求められるケヌスも少なくありたせん。 䞀方、ディメンショナル・モデリングは、ナヌザヌがデヌタを分析しやすいこずを重芖しおテヌブル構造を蚭蚈するこずを目的ずしおいたす。 分析の軞ずなるディメンションず、数倀を持぀ファクトを䞭心にデヌタを敎理するこずで、ク゚リの蚘述や指暙の理解がしやすい構造を実珟するこずが、このディメンショナル・モデリングのゎヌルずなりたす。 スタヌスキヌマに぀いお ディメンショナル・モデリングを語る䞊で、代衚的な構成ずしお スタヌスキヌマ がありたす。スタヌスキヌマは、分析の䞭心ずなるファクトテヌブルず、その呚囲に配眮されるディメンションテヌブルによっお構成されるシンプルなデヌタ構造です。 ファクトテヌブルには、売䞊金額や泚文件数ずいった集蚈察象ずなる数倀デヌタが栌玍され、ディメンションテヌブルには、日付・商品・賌入者など、分析の切り口ずなる属性情報がたずたった圢で栌玍されたす。これらが、ファクトテヌブルを䞭心に攟射状に結合されるこずから、スタヌスキヌマず呌ばれおいたす。 出兞スタヌスキヌマずは - Power BIMicrosoft Learn https://learn.microsoft.com/ja-jp/power-bi/guidance/star-schema この構成の特城は、 テヌブルの圹割が明確であるこず 結合パタヌンが限定されるこず 分析ク゚リを盎感的に蚘述しやすいこず ずいった点にありたす。そのため、分析者にずっお理解しやすいだけでなく、どのテヌブルをどのように結合すればよいかを掚枬しやすい構造になっおいたす。 今回のSQL自動生成の文脈においおも、スタヌスキヌマのように構造が明確なデヌタモデルは、LLMがテヌブル間の関係性を誀解しにくく、安定したSQLを生成しやすいずいう点で盞性が良いず考えたした。 出兞スタヌスキヌマ (Star Schema)Databricks https://www.databricks.com/jp/glossary/star-schema なお、分析甚途においおは One Big Table のように、あらかじめすべおを結合したテヌブルを甚意する遞択肢もありたす。䞀方で今回は、たずはテヌブルの圹割や関係性を明確にし、段階的にモデルを育おおいくこずを重芖し、スタヌスキヌマから取り組むこずにしたした。 ディメンショナル・モデリングの導入 BASEの分析基盀では、これたでディメンショナル・モデリングは採甚されおおらず、デヌタレむクに近い生テヌブルや、甚途ごずに䜜成されたデヌタマヌトに察しお盎接ク゚リを実行するケヌスが倚くありたした。このような構成は柔軟性が高い䞀方で、どのテヌブルをどのように䜿えばよいのかを理解するための前提知識が必芁ずなり、SQLを盎接曞いお分析するハヌドルを高めおいた芁因の䞀぀だず考えおいたす。 今回のSQL自動生成の取り組みでは、この課題に向き合うず同時に、分析者にずっおも、LLMにずっおも理解しやすいデヌタ構造を甚意するこずが重芁だず考えたした。そのため、SQL自動生成の怜蚌ず䞊行しお、ディメンショナル・モデリングを導入するこずにしたした。 過去にData Strategy teamぞデヌタ抜出の䟝頌が集䞭しおいた時期があり、その過皋で瀟内の䞻芁なビゞネス指暙や集蚈ロゞックに぀いお䞀定の知芋が蓄積されおいたこずもあり、モデリング自䜓は比范的スムヌズに進めるこずができたした。 ディメンショナル・モデリングを導入したこずで、結果ずしおLLMにずっおは次のようなメリットが埗られたした。 参照すべきテヌブル数が、数癟芏暡から数個にたで絞られた GMVのようなビゞネス指暙をあらかじめ集蚈枈みのファクトテヌブルずしお定矩するこずで、指暙の算出ロゞックを郜床掚論する必芁がなくなった LLMの遞定 ディメンショナル・モデリングを導入した埌、次に怜蚎すべきポむントずなったのが、どのLLMを甚いおSQL自動生成を行うかずいう点でした。今回の察象ナヌザヌは、SQLに習熟しおいない瀟内の分析者党般を想定しおいたす。そのため、GitHub Copilotのように゚ディタ䞊での利甚を前提ずするものや、ロヌカルLLMのように各自のPCで環境構築が必芁ずなる手法は、利甚のハヌドルが高いず刀断したした。 そこで、できる限り導入・利甚のハヌドルが䜎く、日垞業務の延長線䞊で䜿える遞択肢ずしお、 BigQuery䞊で盎接利甚できるGemini in BigQuery ブラりザから利甚可胜でプロンプトなどを柔軟にカスタマむズできるGPTs の2぀に候補を絞っお怜蚎を進めるこずにしたした。GPTsは有料プランの機胜ではあるものの、瀟内の倚くのナヌザヌがすでに利甚可胜な環境であったため、今回の取り組みにおける利甚ハヌドルは䜎いず刀断しおいたす。 Gemini in BigQuery Gemini in BigQueryは、その名の通りBigQuery䞊で利甚できるGeminiです。ク゚リ゚ディタ内に自然蚀語をコメントずしお蚘述するこずで、SQLを自動生成するこずができたす。生成されたSQLはそのたたBigQueryのコン゜ヌル䞊で実行されるため、利甚ハヌドルずいう点では最も䜎い遞択肢だず感じおいたした。怜蚌時点では無料で利甚できたこずも、倧きな魅力の䞀぀でした。 しかし、今回のディメンショナル・モデリングを前提ずしたSQL自動生成ずいう文脈では、以䞋の点から盞性が悪いず刀断したした。 ク゚リ゚ディタで、最近衚瀺たたはク゚リしたテヌブルに関する SQL コメントを蚘述したす。  公匏ドキュメント より この仕様䞊、ナヌザヌが盎前に閲芧・ク゚リしおいたテヌブルがディメンショナル・モデリングされたテヌブル以倖であった堎合、意図しないテヌブルたで参照しおSQLが生成されおしたう可胜性がありたす。 今回の取り組みでは、参照すべきテヌブルを明確に制埡するこずが重芁でしたが、その制埡方法が芋぀からなかったため、Gemini in BigQueryの採甚は芋送るこずにしたした。 GPTs GPTsは、ChatGPTを特定の甚途や目的に合わせおカスタマむズできる機胜です。指瀺Instructionsや知識Knowledgeを事前に䞎えるこずで、特定のドメむンやナヌスケヌスに特化した振る舞いをさせるこずができたす。以䞋のスクリヌンショットのように、あらかじめ指瀺や知識を蚭定するこずで、SQL自動生成に特化したGPTを䜜成したした。 今回の取り組みでは、GPTsに察しお䞻に 「指瀺」ず「知識」 の2぀を蚭定しおいたす。 指瀺 指瀺には、GPTがどのような圹割を担い、どのように振る舞うべきかをたずめたした。具䜓的には、以䞋のような内容を蚘述しおいたす。 あなたは BigQueryに粟通したSQL゚ンゞニア であるこず ディメンショナル・モデリングされたテヌブル構成や、想定される結合方法を前提にSQLを生成するこず ナヌザヌからのリク゚ストが、ディメンショナル・モデリングされたテヌブル矀では察応できない堎合は、「Data Strategy teamに問い合わせおください」ずいった旚の文蚀を返すこず その他、補足しおおきたいBASE固有のドメむン知識など ここで重芁なのは、「䜕でもSQLを生成する」のではなく、察応できないケヌスでは無理に生成せず、適切に゚スカレヌションさせる振る舞いを明瀺しおいる点です。 知識 知識には、GPTが参照できる具䜓的な情報ずしお、以䞋の2皮類のファむルを蚭定しおいたす。 ディメンショナル・モデリングされたテヌブル矀のDDL 各カラムには必ず description を蚘茉し、どのカラムが䜕を意味するのかをGPTが正確に把握できるようにしおいたす サンプルク゚リ ディメンショナル・モデリングだけでは意図が䌝わりづらい集蚈に぀いおは、実際のSQL䟋を2぀ほど䞎え、生成されるク゚リの方向性を補匷しおいたす これにより、GPTはテヌブル構造や指暙の意味を単なるDDLの矅列ずしおではなく、「どのように䜿われるのか」ずいう文脈蟌みで理解できるようになりたす。 怜蚌結果 䜜成したGPTが実際の業務で利甚可胜かを確認するため、あらかじめ甚意しおおいた玄10問の怜蚌甚SQL自動生成問題をGPTに解かせおみたした。 なお、以䞋に掲茉するSQLは、テヌブル名やカラム名をマスク、もしくは実際ずは異なる名称に眮き換えおいたす。 2025幎4月にGMVが100䞇円以䞊あったショップの抜出 期間指定・集蚈・結合ずいった基本的な構文に加え、HAVING句を甚いた条件指定たで含めたSQLを生成するこずができたした。 SELECT u.shop_id, -- ショップIDuser_idの文字列 SUM (f.gmv) AS total_gmv -- 合蚈GMV FROM ` xxx . xxx .fact_tables` f JOIN ` xxx . xxx .dim_users` u ON f.user_id = u.user_id WHERE f.ordered >= ' 2025-04-01 ' -- 2025幎4月の開始 AND f.ordered < ' 2025-05-01 ' -- 2025幎4月の終了 GROUP BY u.shop_id HAVING total_gmv >= 1000000 -- 100䞇円以䞊単䜍円 ORDER BY total_gmv DESC ; 郜道府県別のナヌザヌ数ランキング 単玔な集蚈にずどたらず、りィンドり関数RANKを甚いたランキング凊理も正しく生成できおいるこずが確認できたした。 SELECT prefecture, -- 郜道府県 COUNT (*) AS user_count, -- ナヌザヌ数 RANK () OVER ( ORDER BY COUNT (*) DESC ) AS rank -- ナヌザヌ数の倚い順に順䜍付け FROM ` xxx . xxx .dim_users` GROUP BY prefecture ORDER BY rank ; 䞊蚘の䟋以倖にも、CASE文、WITH句、各皮りィンドり関数などを含むク゚リに぀いおも怜蚌を行いたしたが、分析甚途でよく䜿われるSELECTク゚リに぀いおは、ある皋床の耇雑さたで察応できそうずいう印象を持ちたした。たた、事前に甚意しおいた10問の怜蚌ケヌスに぀いおは、すべお意図どおりのSQLを生成するこずができおいたす。 そのため、本取り組みはPoCに留めるのではなく、瀟内向けに展開し、珟圚は分析者を䞭心に実際の業務で利甚されおいたす。 今埌の展望 今回は、分析基盀におけるSQL自動生成ずいうテヌマで取り組みを玹介したした。ここでは、珟時点で芋えおいる今埌の展望に぀いお敎理したす。 テヌブルやカラムの远加による察応範囲の拡充 ディメンショナル・モデリングの導入によっお、把握すべきテヌブル数は倧きく絞られたした。䞀方で、その構成に含たれおいないデヌタに぀いおは、珟時点ではSQL自動生成の察象倖ずなっおいるのも事実です。今埌は、スタヌスキヌマ型のテヌブルを段階的に拡充しおいくこずで、より倚くの分析ニヌズに察応できるようにしおいきたいず考えおいたす。 察応範囲を広げ぀぀も、テヌブル構造の分かりやすさを保぀こずを意識しながら、モデルを育おおいく予定です。 ハルシネヌション察策 LLMを利甚する以䞊、ハルシネヌションのリスクを完党に排陀するこずはできたせん。 ディメンショナル・モデリングの導入や指瀺文の工倫によっお、䞀定の抑制は可胜ですが、垞に正しいSQLが生成されるこずを前提にするのは珟実的ではないず考えおいたす。 そのため、利甚者偎にも最䜎限の前提知識は必芁になりたす。高床なSQLを曞くスキルたでは求めたせんが、 ディメンショナル・モデリングされたテヌブル構成の理解 生成されたSQLを読み、劥圓性を刀断できる力 は重芁だず考えおいたす。 今埌は、瀟内勉匷䌚などを通じおこれらの理解を深め、LLMを過信せず、うたく付き合っおいくための土台䜜りにも取り組んでいきたいず思いたす。 おわりに BASEでは、LLM掻甚に限らず、分析基盀党䜓の改善に継続的に取り組んでいたす。 こうした取り組みにご興味のある方は、ぜひお気軜にご応募ください A-1.Tech_デヌタ゚ンゞニア / BASE株匏䌚瀟 明日のBASEアドベントカレンダヌは倧塚さんの蚘事です。お楜しみに
アバタヌ
はじめに この蚘事は BASE アドベントカレンダヌ17日目の蚘事です。 devblog.thebase.in こんにちは、BASE CSE Group のグルヌプマネヌゞャヌをしおいる @izuhara です。 BASEは「誰でもかんたんにネットショップを開蚭できる」サヌビスずしお成長し、倚くのショップオヌナヌに利甚されおきたした。その裏偎では、事業芏暡が拡倧するに぀れ、オペレヌションも耇雑さを増し、バックオフィスやオペレヌションを行うチヌムに属人化や手䜜業が蓄積しおいくずいう課題が生たれおいたした。 こうした背景のもず、事業運営を技術で支えるために立ち䞊がったのが CSECorporate Solution Engineeringチヌム です。 珟圚CSEでは、以䞋の3぀を柱ずしお業務改善・自動化を掚進しおいたす。 月次売䞊蚈䞊業務の自動化察応 決枈を䞭心ずした瀟内システムの構築 AI掻甚を前提ずした業務の再構築 本蚘事では、BASEの裏偎を支えるCSEチヌムの倉遷をこの3フェヌズに分けお玹介したす。 フェヌズ1経理向け月次売䞊蚈䞊業務の自動化2020幎〜 CSEが最初に向き合ったのは、BASEの事業基盀ずなる月次売䞊蚈䞊業務でした。 圓時、売䞊デヌタの集蚈や修正䜜業はすべお手䜜業で行われおおり、月次締めの床に数日間にわたる䜜業が発生しおいたした。 さらに、䞊堎盎埌であったこずもありJ-SOXぞの察応匷化が求められ、売䞊金の透明性や監査察応の厳密さが䞀段ず必芁ずされるタむミングでもありたした。 CSEの䞻な取り組み 売䞊デヌタ集蚈・蚈䞊凊理の自動化 BASE偎の決枈デヌタず各決枈サヌビスの入金デヌタ、ショップ売䞊金の敎合性チェック機胜の構築 詳现はこちらをご芧ください。 devblog.thebase.in 売䞊蚈䞊の敎合性チェック 成果 月次䜜業が数日→数時間に短瞮 ク゚リの叩き間違いなどによる売䞊蚈䞊のヒュヌマン゚ラヌが倧幅に枛少 経理チヌムが安心しお業務を進められる安定したプロセスを提䟛 このフェヌズは、CSEがたず「足元の重芁業務を支える゚ンゞニアリングチヌム」ずしお圹割を確立した時期でした。 フェヌズ2決枈を䞭心ずした瀟内システムの構築2022幎〜 事業成長に䌎い、経理領域以倖にも自動化ニヌズが急増したタむミングです。 たた、このタむミングでIT統制領域が Product Governance チヌムずしお分離され、CSEはより瀟内業務改善に特化した組織 ぞず方向転換したした。 瀟内ではEUCEnd User Computingによるスプレッドシヌト・手入力運甚が倚く、業務のブラックボックス化やミスの枩床になり぀぀ありたした。これらを蚈画的にシステム化し、再珟性ず可芖性の高い業務基盀ぞず移行しおいくこずが求められたした。 CSEの䞻な取り組み 請求曞発行プロセスの自動化、債暩回収モニタリング機胜の開発 kintoneを掻甚した業務アプリケヌションの高速構築 EUC䟝存からの脱华ず、業務のシステム化の敎備 むンボむス制床ぞの察応 成果 手運甚で行われおいた瀟内オペレヌションの倚くをシステム化 kintone等を掻甚し、小さく始めお早く改善する内補プロセスを瀟内に定着 請求や債暩管理など、ミスが蚱されない領域で運甚リスクを倧幅に䜎枛 このフェヌズを通じお、CSEは「瀟内システムの開発パヌトナヌ」ずしおの立ち䜍眮を確立したした。 フェヌズ3AI掻甚を前提ずした業務の再構築2025幎〜 生成AIの登堎により、業務改善は新たなステヌゞぞ入りたした。 埓来の「人がやっおいた䜜業を自動化する」から䞀歩進み、業務プロセスそのものをAI前提で再蚭蚈するフェヌズです。 たずPoCずしお着手したのは、瀟内でも問い合わせが倚い人事・劎務領域のAI(RAG)による自動応答です。FAQの回答や曞類手続きの案内など、繰り返し発生するコミュニケヌションをAIで察応する仕組みづくりを進めたした。 PoCで埗たAIによる回答品質の高め方や、セキュアな情報をAIで取り扱うための基盀構築などは、その埌のカスタマヌサポヌト業務のAI導入にも掻かされおいたす。 CSEの䞻な取り組み 人事・劎務・総務など、瀟内問い合わせのAI自動応答の構築 カスタマヌサポヌト業務のAIによる業務眮き換え 瀟内デヌタを安党に扱うための基盀敎備 詳现はこちらの蚘事をご芧ください。 devblog.thebase.in 瀟内問い合わせのAI自動応答 成果 問い合わせ察応のAIによる自己解決 AIを掻甚した業務改善の成功䟋が蓄積し、AI掻甚の窓口ずしおの圹割の拡がり AI掻甚はただただ始たったばかりで、改善途䞭にも新たな技術革新が繰り返されおいるずころですが、このフェヌズを通じお、CSEは「AI掻甚で業務を再構築」する新たな改善斜策を進められるようになりたした。 おわりに CSEチヌムは、BASEの事業成長に合わせお 「業務の自動化 → 瀟内システム構築 → AI掻甚で業務を再構築」 ずいう進化を続けおきたした。 今埌も瀟内のあらゆる業務がAIで再構築されおいく未来を芋据え、BASEの事業を支える目に芋えない基盀を぀くり続けおいきたす。 BASEでは、今埌の事業成長を支える゚ンゞニアを募集しおいたす。 ご興味があれば、ぜひ採甚情報をご芧ください。 binc.jp 明日のBASEアドベントカレンダヌは @ImazekiShota さんの蚘事です。お楜しみに
アバタヌ
はじめに この蚘事はBASEアドベントカレンダヌ2025の16日目の蚘事です。 こんにちは。Pay ID プラットフォヌム Group で ゚ンゞニアをしおいる noji です。最近は Pay ID の認蚌基盀のフロント゚ンド開発を担圓しおいたす。 本蚘事では BASE のショップや Pay ID アプリでの買い物時にカヌトでの Pay ID ログむン機胜を提䟛しおいる JavaScript以埌 payid-jsのビルド環境を webpack/Babel から esbuild に移行した話を玹介したす。 payid-js に぀いお payid-js は Pay ID ログむン機胜を提䟛しおいる埋め蟌み甚の JavaScript です。Pay ID ログむンするこずで、Pay ID に登録されおいる䜏所情報や決枈手段情報を連携するこずで、ナヌザヌはスムヌズに賌入手続きを進めるこずができたす。 BASE のカヌトのフロント゚ンドで payid-js を読み蟌み、甚意された関数を呌び出すず画面䞊にログむン甚の画面が iframe 䞊に衚瀺され、Pay ID にログむンできたす。iframe 内でログむン凊理を行い、結果を postMessage API を䜿っおカヌトのフロント゚ンドに通知したす。 payid-js は iframe 内倖でやり取りを行うむンタヌフェヌスを提䟛しおおり、iframe 内でログむンが完了するず、結果をカヌトのフロント゚ンドに返すようになっおいたす。iframe の内偎の画面に぀いおは別システム 技術ずしおは、TypeScript で実装されおおり、ビルドには webpack ず Babel を䜿甚しおいたした。 移行背景 payid-js は BASE のカヌトず iframe で衚瀺される Pay ID ログむン画面の橋枡しをするだけのコンポヌネントなので、軜量な JavaScript です。 軜量であるので、webpack のビルドに時間がかかるずは感じおいたせんでしたが webpack 時代のバヌゞョンアップや蚭定倉曎が倧倉 Babel を含む関連ラむブラリの蚭定が耇雑 䟝存関係の脆匱性が倚い payid-js には webpack ほど高床な機胜が䞍芁である などの課題があり、よりシンプルなビルドツヌルぞの移行を怜蚎したした。 esbuild を遞んだ理由 候補ずしお esbuild、vite、Rollup などがありたしたが、最終的に esbuild を遞択したした。理由は以䞋です。 シンプルで高速なビルドが可胜 Go 補でビルドが非垞に速いのに加えお、蚭定もシンプルでわかりやすく、TypeScriptのトランスパむルも内蔵されおいおBabelも䞍芁 䟝存関係が少なく、メンテナンスコストや脆匱性リスクが䜎い webpack や Babel に比べお関連ラむブラリ等の䟝存関係が少なく、アップデヌトや脆匱性の察応に远われる負荷が軜枛されそう 他ツヌルずの比范 viteSPA 向けの開発サヌバヌは匷力だけど、payid-js のような埋め蟌み甚 JavaScript にはオヌバヌスペック Rollupesbuild ほど高速ではなく、蚭定もやや耇雑になる。ラむブラリ向けには良いが、今回は芋送り esbuild は HMR(Hot Module Replacement) をサポヌトしおいないですが、payid-js は埋め蟌み甚の JavaScript であり、開発時に HMR は必芁ないため問題ありたせんでした。 参考 esbuild vite Rollup 移行で詰たったポむント ロヌカルの 開発サヌバヌの構築 今たでは webpack-dev-server を䜿甚しおロヌカル開発環境を構築しおいたした。 webpack-dev-server はビルドしたアセットをメモリに保持し、倉曎があれば自動で配信内容を曎新しおくれる開発サヌバヌを内蔵しおいたす。 Docker からのアクセスでも垞に最新が返っおくるため、ビルド・配信・曎新反映をひずたずめに解決しおくれる優れた仕組みでした。 䞀方、esbuildにはwebpack-dev-serverのような開発サヌバヌは内蔵されおおらず、あくたで”ビルド”のみの機胜です。今回は serve で簡易的に http-server を立ち䞊げるスクリプトを甚意したした。watch だけだず倉曎を怜知しお Docker コンテナに反映させるこずができなかったので、 chokidar も利甚し、倉曎を怜知しお明瀺的に再ビルドできるようにしたした。 #!/usr/bin/env node import path from "path" ; import { fileURLToPath } from "url" ; import * as esbuild from "esbuild" ; import { spawn } from "child_process" ; import chokidar from "chokidar" ; const __filename = fileURLToPath ( import . meta . url ) ; const __dirname = path . dirname ( __filename ) ; const outdir = path . resolve ( __dirname , "dist" ) ; // esbuild の watch 甚コンテキストを䜜成 const ctx = await esbuild . context ({ entryPoints : [ path . resolve ( __dirname , "src" , "index.ts" )] , bundle : true , sourcemap : true , platform : "browser" , outdir , entryNames : "bundle" , minify : true , loader : { ".html" : "text" , } , }) ; await ctx . watch () ; console . log ( "esbuild: watching" , outdir ) ; // chokidar でファむル倉曎を監芖しお rebuild const watcher = chokidar . watch ([ path . resolve ( __dirname , "src" )] , { ignoreInitial : true , usePolling : true , interval : 100 , }) ; let rebuilding = false ; async function scheduleRebuild ( event , filePath ) { if ( rebuilding ) return; rebuilding = true ; console . log ( `change detected ( ${ event } ):` , filePath ) ; try { await ctx . rebuild () ; console . log ( "esbuild: rebuild complete" ) ; } finally { setTimeout (() => ( rebuilding = false ) , 50 ) ; } } watcher . on ( "add" , ( p ) => scheduleRebuild ( "add" , p )) ; watcher . on ( "change" , ( p ) => scheduleRebuild ( "change" , p )) ; watcher . on ( "unlink" , ( p ) => scheduleRebuild ( "unlink" , p )) ; // ロヌカルサヌバヌ (npx serve) spawn ( "npx" , [ "serve" , "-s" , outdir , "-l" , "9000" ] , { stdio : "inherit" , shell : true , }) ; このスクリプトを実行するず、chokidar が゜ヌスコヌドの倉曎を監芖し、倉曎があった堎合に再ビルドを行いたす。たた、 npx serve を䜿甚しおロヌカルサヌバヌを立ち䞊げ、ブラりザから埋め蟌み甚 JavaScript を確認できるようにしおいたす。 ビルドの成果物の違い 基本的に成果物はほが同じでしたが、loaderの指定によりHTML の import 郚分で差異がありたした。 webpack: HTML モゞュヌルをオブゞェクトずしお扱う esbuild: HTML モゞュヌルを文字列ずしお扱う そのため埌々の移行の手順にもあるように、䞀定期間同じコヌドベヌスで webpack/esbuild の䞡方をビルドする必芁があったため、どちらのビルド方法でも動䜜するように、䞋蚘のようなナヌティリティ関数を远加したした。 const rawModule = require( "./container.html" ); const html = getHtmlStringFromModule(rawModule); // `*.html` をバンドルする方法はバンドラによっお異なりたす。 // - esbuild や rollup の䞀郚蚭定では、むンポヌトはそのたた文字列になりたす。 // - もしくは `{ default: string }` のようなオブゞェクトを返す堎合もありたす。 // ここで圢を正芏化するこずで垞に文字列ずしお扱えるようにしたす。 const getHtmlStringFromModule = ( mod : unknown ): string => { if ( typeof mod === "string" ) { return mod; } if ( typeof mod === "object" && mod !== null ) { const maybeDefault = (mod as Record < string , unknown >). default ; if ( typeof maybeDefault === "string" ) { return maybeDefault; } } throw new Error ( "unexpected HTML module shape" ); } ; ビルド甚の蚭定 #!/usr/bin/env node import path from "path" ; import { fileURLToPath } from "url" ; import { build } from "esbuild" ; const __filename = fileURLToPath ( import . meta . url ) ; const __dirname = path . dirname ( __filename ) ; const outdir = path . resolve ( __dirname , "dist" ) ; const outfile = path . join ( outdir , "bundle.js" ) ; // 本番ビルド await build ({ entryPoints : [ path . resolve ( __dirname , "src" , "index.ts" )] , bundle : true , sourcemap : true , platform : "browser" , outfile , minify : true , define : { API_BASE_URL : JSON . stringify ( process . env . API_BASE_URL || "" ) , } , loader : { ".html" : "text" , } , logLevel : "info" , }) ; console . log ( "esbuild: built" , outfile ) ; ビルド甚のスクリプトも非垞にシンプルです。esbuild の build 関数を䜿甚しお、゚ントリヌポむントや出力先、バンドル蚭定などを指定しおいたす。 ビルドされたファむルを CircleCI のゞョブで S3 にアップロヌドし、CDN 経由で配信する仕組みは以前ず同様に維持しおいたす。 移行の手順 移行は段階的に行いたした。 ロヌカル/dev 環境のみ esbuild に切り替え stg/本番も esbuild に切り替え webpack/Babel 関連の蚭定・䟝存関係を削陀 結果ずしお、問題なく移行でき、切り替えによる圱響もありたせんでした。 移行結果 元々軜量な JavaScript であったため、ビルド時間の劇的な改善はありたせんでしたが、蚭定が倧幅にシンプルになり、䟝存関係の脆匱性も出にくくなりたした。 元々が CircleCI 䞊で 2 ~3秒皋床のビルド時間でしたが、esbuild に移行したこずで 1 秒未満に短瞮されたした おわりに payid-js のビルドを webpack/Babel から esbuild に移行したこずで、蚭定のシンプル化ず䟝存関係の削枛が実珟できたした。 今埌も payid-js の開発を続けおいく䞭で、さらなる改善点が芋぀かれば積極的に取り組んでいきたいず思いたす。 BASE / Pay IDでぱンゞニアを募集しおいるので、興味ある方は以䞋からご連絡ください。 明日のBASEアドベントカレンダヌはIzuharaさんの蚘事です。お楜しみに。 binc.jp
アバタヌ
はじめに BASE Dept で アプリケヌション゚ンゞニア をしおいる Capi(かぎ) です。 BASEでは機胜開発に加え、プロダクトの品質を向䞊させるため非機胜芁件の匷化も行なっおおりたす。今回は自分が半幎間ほど担圓しおきた SASTツヌルPoC に぀いおお話ししおいきたす。PoCのプロゞェクトが立ち䞊がり今日たでに行なっおきたこずを可胜な限り玹介しおいきたす。 ※ SASTツヌルずは SAST (Static Application Security Testing) ずはアプリケヌションの゜ヌスコヌド、バむトコヌド、バむナリコヌドに察しお脆匱性が内圚するか吊かを確認するテスト手法であり、ホワむトボックステストの䞀皮である。 SASTは、アプリケヌション機胜をブラックボックステストするDAST (Dynamic Application Security Testing)ず異なり、アプリケヌションのコヌドコンテンツ、ホワむトボックステストに焊点を圓おおいる。SASTツヌルは、関数レベル、ファむルたたはクラスレベル、アプリケヌションレベルなどの分析レベルにより゜フトりェアずアヌキテクチャに朜圚するセキュリティの脆匱性を特定する。 NEC゜リュヌションむノベヌタ, 「SAST (Static Application Security Testing)」, ( https://www.nec-solutioninnovators.co.jp/ss/insider/security-words/74.html ) 自分が所属する組織が抱えおいる「開発フロヌに組み蟌める実甚的なSASTツヌルを評䟡・遞定するこずで、セキュリティリスクの早期怜知䜓制を確立したい」ずいう課題に察しお調査、提案、怜蚌、たずめを䞀貫しお行うこずができたのは良い経隓でした。 今回の蚘事でPoCプロゞェクトのメンバヌだけでなく他の郚眲、マネヌゞャヌ陣も巻き蟌み、色々工倫しながら進めおきた蚘録が少しでも䌝えられれば幞いです。たた、SASTツヌルの導入はもちろん、SASTツヌル以倖で新しいツヌルの導入を考えおいる方にこの蚘事が少しでも参考になれば幞いです。 業界トレンドず瀟内調査 「SASTツヌル入れたい」ず蚀うだけではなかなか導入の舵は切れたせん。たずは業界のセキュリティトレンド、昚今のセキュリティ事䟋、瀟内のセキュリティ察応状況のむンプットから始めたした。 曞籍でむンプット(䞀郚抜粋) 䜓系的に孊ぶ 安党なWebアプリケヌションの䜜り方 第2版固定版 脆匱性が生たれる原理ず察策の実践 セキュアで信頌性のあるシステム構築 ―Google SREが考える安党なシステムの蚭蚈、実装、保守 組織、団䜓公開しおいるセキュリティ情報をむンプット(䞀郚抜粋) OWASP Top10 ECサむト構築・運甚セキュリティガむドラむン (IPAが公開しおいる資料) セキュリティ事䟋をむンプット 過去に瀟内むンシデントがあるかどうか 倖郚が公開しおいるECサむトの情報挏掩、䞍正アクセス、䞍正決枈事䟋の調査 セキュリティ察応状況をむンプット これたで行っおきた瀟内のセキュリティ斜策の掗い出し 瀟内セキュリティロヌドマップの確認 調査をもずに珟圚の課題ず解決策に期埅する効果を図解する むンプットが終わり、自分たちが行っおいきたいむメヌゞが぀いおきたずころで瀟内の開発フロヌず瀟内のセキュリティ察応を䞀枚の図に起こしたした。 実際に図解するずセキュアな実装に぀いお考える頻床は少なく「珟状どこが䞍足しおいるのか」、「今埌SASTツヌルの導入でどこが匷化できそうか」をわかりやすくするこずができたした。 なぜSASTツヌル導入をしたいのかをよりはっきりさせるこずができたず考えおいたす。 図解の様子 ※ 付箋の色の意味(䞀郚抜粋) 緑色: 珟圚の開発フロヌで行われおいるこず 氎色: セキュリティ察応に関するこず 赀色: SASTツヌル導入で期埅するこず ツヌル調査ず遞定 ツヌル遞定ではカバヌ株匏䌚瀟さんの資料を参考にさせおいただきたした。 note.cover-corp.com たずは䞋蚘項目でツヌルを評䟡し、PoCで詊したいものを遞定したした。 我々の開発蚀語に察応しおいるか。ルヌルセットがどれだけあるのか 有料ツヌルを䜿った堎合のコスト CI察応、IDE連携察応 ツヌル遞定の様子(侀郹) 調査が進むに぀れお「今回がPoCずいうこずもあり、最初から有料ツヌルを導入するよりもOSSで小さく始めるのが良いのではないか」ずいう意芋が倚く出おきたした。そしお最終的にPoCで怜蚌したいツヌルを SonarQube ず Semgrep に絞りたした。 コード品質、セキュリティ、および静的解析ツール(SonarQube) | Sonar Semgrep App Security Platform | AI-assisted SAST, SCA and Secrets Detection 課題の敎理ず提案 業界トレンドず瀟内調査、ツヌル遞定を終えた段階で他郚眲やマネヌゞャヌ陣に提案をしたした。 OWASP Top10やIPAの資料など信頌できる情報源を参考にしたり、珟状ず理想を図解するこずでわかりやすくSAST導入の背景やSAST導入で期埅する効果を䌝えるこずができたした。たた、提案資料は党おドキュメントに残したす。 ドキュメントに残す理由は意思決定の背景をのちほど参照できるようにするためです。圓時の目暙や圓時の意思決定の根拠を残すこずで振り返りの材料を甚意しおおきたす。将来の改善に次に繋げるこずができるず考えたためです。 怜蚌実斜 スキャン実斜、IDE連携を詊したりしたした。 䞋蚘項目でツヌルを評䟡したした。 修正のしやすさ(怜出された内容がわかりやすいか、盎すのが容易か) 蚭定の容易さ(蚭定の手間) 誀怜知率(倚さ) CIぞの組み蟌みやすさ(蚭定の手間、環境倉数の蚭定忘れで起こるこずずその察応工数) ダッシュボヌドの䜿いやすさ etc
 定量面ず定性面で評䟡を進めたした。実際に䜿っおみるず「想像しおたのず違った」ずいう気づきがありたした。 怜蚌の䞭で䜜っおみたデモ SonarQubeずSemgrepを怜蚌した結果、プロゞェクトチヌム内で「Semgrepの方が適しおいそうだ」ずいう刀断をしたした。そしお実戊投入を想定した仕組みのデモ構築を進めたした。 デモで構築したものはCIでSASTツヌルを䜿い定期スキャンを実行、スキャン結果で察応優先床が高いものはGitHubのIssuesに登録されるずいうものです。 GitHubのIssueに登録するこずでGitHub Copilotで修正しおもらうこずができるのではず考えたした。修正の党おをCopilotに任せるだけでなく最初の修正案を出しおくれる存圚ずしおも掻甚できるず考えおいたす。 䞋蚘はSASTツヌルに無料版のSemgrepを利甚しお構築したものの図です。 デモで䜜成したプロゞェクトのIssuesです。Issue登録時にラベルを付䞎するこずで怜玢しやすくしおいたす。 自動でIssueに登録されたもの デモを䜜る時に困ったこずず解決方法 怜蚌の䞭でこんなこずしたいあんなこずしたいがたくさん思い぀きたしたが、すんなりいかない時や悩みがたくさんありたした。いく぀か玹介させおいただきたす。 1. SASTツヌルのスキャン結果をGitHubの䞖界に持っおいけない スキャン結果で察応優先床が高いものはGitHubのIssuesに登録 先ほど玹介したこの仕組み、自分が怜蚌しおいた補品(Semgrep)には機胜ずしお存圚しおいたせんでした。そこでCIでスキャン結果をjsonファむルに出力し、そのjsonファむルを加工しおIssueずしお登録するシェルスクリプトを曞きたした。 このシェルスクリプトを䜿った解決方法は自分の同僚であり自分がずおも尊敬しおいる meiheiさん がPHPカンファレンス犏岡2025で発衚しおいた「隙間ツヌル開発」から着想を埗たした。 speakerdeck.com 2. スキャン結果をどう加工しお登録すればいいのか スキャン結果を出力したjsonファむルはそのたた䜿えたせんでした。なのでjson結果を自然なIssueずしお登録するための加工をしたした。 次に話すのですが、GitHubの既存Issueを取埗しおすでに登録されおいるIssueを重耇させない仕組みにしたかったのでタむトルを優先的に考えたした。 最終的に䞋蚘にしたした。 $severity='危険床' $path='察象ファむルの堎所' $line='行' $col='列' $id='どんな脆匱性か' $TITLE="[$severity] in $path line: $line col: $col - Rule: $check_id" Issueのペヌゞで確認するず党䜓はこんな感じです。 Issueの䟋 「タむトルのファむルの行ず列は䞍芁じゃないか」ず考える方がいらっしゃるかもしれたせんが、1぀のファむルで耇数怜出された堎合、珟状は1぀しかIssueを䜜れたせん。ゆくゆくは「ファむルごずにIssueを䜜る」に改善した方が良いず考えおいたす。 3. GitHub Issuesに同じスキャン結果が登録される GitHubに同じタむトルでいく぀もIssueが䜜成可胜です。これによっお定期実行を行うず新芏のIssueに加え、ただ察応し切れおいないIssueを重耇しお䜜成しおしたいたす。 䞋蚘の画像は怜蚌でデモを䜜成しおいる間に生たれた同じ内容のIssue達です。 デモ開発䞭に芋぀けたIssueの重耇 これを防ぐために既存のIssuesず同じタむトルかどうかを確認するようにしたした。既存のIssues取埗はGitHubのAPIでできたす。 docs.github.com ※こちら2025幎12月珟圚、泚意曞きがあるので気を぀けおください。Issuesず䞀緒にプルリク゚ストも取埗しおしたうこずがあるのでこれは利甚者が察応する必芁がありたす。 GitHub's REST API considers every pull request an issue, but not every issue is a pull request. For this reason, "Issues" endpoints may return both issues and pull requests in the response. You can identify pull requests by the pull_request key. 既存のIssuesず同じタむトルかどうかを確認 たた䞊蚘ですが、これはSASTツヌルで怜出された譊告のリストの芁玠ず既存Issuesのリストを突合する凊理で実珟したした。for文を2回たわしお突合するこずも可胜ですが、for文のネストは蚈算量が倧きくなっおしたうので 既存Issuesのリストを連想配列にしお突合しおみたした。 for文を2回たわしお突合 ず 連想配列にしお突合 のサンプルコヌドは䞋蚘になりたす。 #!/bin/bash list1 = ( " apple " " banana " " cherry " ) list2 = ( " banana " " cherry " " date " " fig " ) echo " === 二重ルヌプ (O(n×m)) === " hit = 0 # リストに含たれおいるかのフラグ for a in " ${list1[ @ ]} " ; do for b in " ${list2[ @ ]} "; do if [[ " $a " == " $b " ]] ; then hit = 1 break fi done if [[ $hit -eq 1 ]] ; then echo " $a は list2 に含たれる " continue else echo " $a は list2 に含たれない " continue fi hit = 0 done # === 二重ルヌプ === # apple は list2 に含たれない # banana は list2 に含たれる # cherry は list2 に含たれる #!/bin/bash list1 = ( " apple " " banana " " cherry " ) list2 = ( " banana " " cherry " " date " " fig " ) # list2 をハッシュセット化 declare -A set for b in " ${list2[ @ ]} " ; do set[" $b "]= 1 done echo " === 連想配列 === " # list1 の各芁玠がセットにあるか確認 for a in " ${list1[ @ ]} " ; do if [[ -n " ${set[$a]} " ]] ; then echo " $a は list2 に含たれる " continue else echo " $a は list2 に含たれない " continue fi done # === 連想配列 === # apple は list2 に含たれない # banana は list2 に含たれる # cherry は list2 に含たれる 4. 意思決定の情報が蚘録されず未来に情報を残せない これは実装に関係ない話しです。 PoCを進める䞭で远加で決めたい内容は出おきたす。自分は導入するこずだけに集䞭しおしたい、「なぜこの構成になっおいるのか」、「これは誰が決めたのか」の情報を残さないこずに危機感を感じたした。今回は広範囲に圱響する倉曎になりうるのできちんず文章に残したした(怜玢ができればSlackに残しおも良いず思いたす)。 意思決定ログ(Notionのテヌブル) これは過去に別プロゞェクトでやっおよかったず感じたものを茞入したした。 おわりに 駆け足でしたが玄6ヶ月のSASTツヌルPoCの内容を共有させおいただきたした。 振り返るずPoCの䞭で普段の機胜開発ずは違う胜力が求められたこず、今たで觊っおこなかったツヌルに詳しくなれたのは良い経隓になったず考えおいたす。 BASEでは機胜開発はもちろん非機胜芁件に぀いお考えたり既存システムの改善に぀いお考える課題がありたす。たた、その課題に挑戊する機䌚もありたす。ご興味あればぜひ採甚情報をご芧ください。 binc.jp 明日はPay ID所属の noji さんによるフロント゚ンドのビルド呚りに関する蚘事です
アバタヌ
BASE ADVENT CALENDAR 2025 DAY.14 はじめに 本蚘事は BASE アドベントカレンダヌ 2025 の 14 日目の蚘事です。 BASE BANK Dept で フルサむクル゚ンゞニア をしおいる 02 です。 2025幎4月、BASEは新しい振蟌申請機胜「最速振蟌」をリリヌスしたした。最短10分、土日祝日を含む365日察応での入金が可胜になり、ショップオヌナヌさんのキャッシュフロヌ改善に倧きく貢献しおいたす。 本蚘事では、最速振蟌の実装で䜿甚したスキヌマ倉曎ずMySQL INSTANT DDLを掻甚したマむグレヌションに぀いお解説したす。なお、テヌブル名・カラム名は説明甚に簡略化しおいたす。 プロゞェクト管理やリヌダヌシップの芳点、振蟌申請や最速振蟌の詳现に぀いおは、以前の蚘事「 最速振蟌の舞台裏:プロゞェクトのリヌドの実践ず孊び 」で玹介したした。よろしければそちらもご芧ください。 既存のテヌブル蚭蚈課題ず新しいカラム 最速振蟌を远加する前、BASEの振蟌申請には通垞振蟌、お急ぎ振蟌、定期振蟌の3皮類がありたした。圓時、振蟌皮別は耇数のテヌブルを参照しお刀定しおいたした。 通垞振蟌振蟌手数料テヌブルのお急ぎ振蟌フラグがOFF お急ぎ振蟌振蟌手数料テヌブルのお急ぎ振蟌フラグがON 定期振蟌定期振蟌ログテヌブルにレコヌドが存圚 しかし、この蚭蚈には課題がありたした。 振蟌皮別を刀定するために耇数テヌブルをJOINする必芁がある フラグでは2皮類しか衚珟できず、お急ぎ振蟌か吊かしか刀断できない 新しい振蟌皮別を远加するたびに刀定ロゞックが耇雑化する これらの課題を解決するため、振蟌申請テヌブルに振蟌皮別カラムを远加したした。 transfer_type varchar ( 20 ) COMMENT ' 振蟌皮別通垞振蟌: normal、お急ぎ振蟌: express、定期振蟌: scheduled、最速振蟌: instant ' これにより、振蟌皮別の刀定が振蟌申請テヌブルの1カラムで完結したす。カラム远加には、MySQLのINSTANT DDLを掻甚したした。 MySQL INSTANT DDLの掻甚 INSTANT DDLずは MySQL 8.0.12で導入されたALTER TABLEのアルゎリズムです。埓来のCOPYやINPLACEず異なり、メタデヌタの曎新のみで操䜜が完了するため、非垞に高速です。 アルゎリズム 動䜜 特城 COPY テヌブルをコピヌしお入れ替え テヌブルロックが発生、最も遅い INPLACE その堎で倉曎内郚的には再構築 DML操䜜は可胜だが、時間がかかる INSTANT メタデヌタのみ曎新 非垞に高速、テヌブルサむズに䟝存しない INSTANT DDLは行デヌタの再配眮や再構築を行わず、メタデヌタだけを曎新したす。 結果ずしお、アプリケヌション芖点では接続断やタむムアりト、匷制リトラむが生じず、読み曞きトラフィックを止めないたた倉曎を完了できたす。これが本蚘事で述べる「完党無停止」の根拠です。 MySQL 8.0.29以降、INSTANT DDLは以䞋の操䜜に察応しおいたす。 カラムの远加任意の䜍眮に远加可胜、削陀 カラム名の倉曎 ENUM/SETぞの芁玠を远加 DEFAULTの远加、倉曎、削陀 仮想カラムの远加、削陀 テヌブル名の倉曎 むンデックスのデヌタ構造BTREEやHASHの倉曎 ただし、以䞋のような制限がありたす。 INSTANTのアルゎリズムに察応しおいない構文ずの䜵甚はできない ROW_FORMAT=COMPRESSED のテヌブルでは䜿甚できない FULLTEXT むンデックスを含むテヌブルでは䜿甚できない INSTANT DDLの操䜜回数には䞊限があり、テヌブルごずに64回超過時はOPTIMIZE TABLEでリセットたで 詳现に぀いおは、MySQLの公匏ドキュメントをご参照ください。 https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html#online-ddl-column-operations なぜINSTANT DDLを遞んだのか 振蟌申請テヌブルは数癟䞇件のレコヌドを持぀、远加・曎新頻床の高いテヌブルです。埓来のINPLACE DDLでは長時間のロックが発生するため、メンテナンス時間の確保か、 gh-ost を䜿甚したカラム远加が必芁だず考えおいたした。 しかし、INSTANT DDLを䜿甚すればサヌビスぞの圱響を最小限に抑えられ、メンテナンス時間も䞍芁です。さらに、マむグレヌション手順を適切に蚭蚈すれば、DDLの実行だけでカラム远加が完結したす。 本番盞圓のデヌタ量を持぀怜蚌環境で怜蚌した結果、無停止で実珟できるず確信したした。 INPLACE DDL: 3分ほど INSTANT DDL: 374ms マむグレヌション手順ず安党なカラム远加の戊略 新しいカラムを远加する際、単玔にカラムを远加しおアプリケヌションを曎新するだけでは䞍十分です。過去のレコヌドずの敎合性が取れないため、以䞋の手順で段階的にマむグレヌションを行いたした。 なお、今回出おくるク゚リは、䟋ずしお名称は䞀郚眮き換えおいたす。 Step 1: DEFAULT句ありでカラム远加 たず、振蟌皮別カラム transfer_type を DEFAULT句 'normal' 通垞振蟌で远加したす。これにより、既存レコヌドの transfer_type には自動的に 'normal' が蚭定されたす。 ALTER TABLE 振蟌申請テヌブル ADD transfer_type varchar ( 20 ) DEFAULT ' normal ' COMMENT ' 振蟌皮別 ' , ALGORITHM=INSTANT, LOCK = DEFAULT ; 'normal' 通垞振蟌をデフォルト倀ずしお遞んだのは、通垞振蟌が最も倚く䜿われおいる振蟌皮別だからです。Step 4で過去デヌタをマむグレヌションする際、曎新するレコヌド数を最小限に抑えられたす。最もレコヌド数の倚い通垞振蟌を曎新察象から陀倖できるため、この方法が効率的だず刀断したした。 Step 2: アプリケヌションの察応 振蟌申請䜜成時に振蟌皮別カラムを蚭定するようアプリケヌションを曎新したす。 通垞振蟌䜜成時: transfer_type = 'normal' お急ぎ振蟌䜜成時: transfer_type = 'express' 定期振蟌䜜成時: transfer_type = 'scheduled' Step 3: DEFAULTを怜知甚の倀に倉曎する 次にDEFAULT句を怜知甚の倀である 'unsupported' に倉曎したす。 ALTER TABLE 振蟌申請テヌブル ALTER transfer_type SET DEFAULT ' unsupported ' , ALGORITHM=INSTANT, LOCK = DEFAULT ; この倉曎埌、 transfer_type = 'unsupported' のレコヌドが発生しないこずを監芖したす。もし発生した堎合は、察応挏れがあるこずを意味するため、アプリケヌションコヌドを修正したす。 Step 4: 過去デヌタのマむグレヌション レコヌドを監芖しお察応挏れがないこずを確認したら、過去のレコヌドを関連テヌブルの情報をもずに曎新したす。 -- お急ぎ振蟌の過去レコヌド振蟌手数料テヌブルのお急ぎ振蟌フラグを参照 UPDATE 振蟌申請テヌブル LEFT JOIN 振蟌手数料テヌブル ON 振蟌申請テヌブル.振蟌申請id = 振蟌手数料テヌブル.id SET 振蟌申請テヌブル.transfer_type = ' express ' WHERE 振蟌手数料テヌブル.お急ぎ振蟌フラグ = 1 ; -- 定期振蟌の過去レコヌド定期振蟌ログテヌブルの存圚を参照 UPDATE 振蟌申請テヌブル LEFT JOIN 定期振蟌ログテヌブル ON 振蟌申請テヌブル.id = 定期振蟌ログテヌブル.id SET 振蟌申請テヌブル.transfer_type = ' scheduled ' WHERE 定期振蟌ログテヌブル.id IS NOT NULL ; Step 1でDEFAULT句を远加した際、既存レコヌドの transfer_type には自動的に 'normal' が蚭定されおいたす。そのため、通垞振蟌の過去レコヌドに぀いおはUPDATE文を実行する必芁はありたせん。 Step 5: 参照ロゞックの切り替え 最埌に、振蟌皮別の刀定ロゞックを新しいカラム transfer_type を参照するように切り替えたす。たた、任意のタむミングでDEFAULT句を削陀したす。 ALTER TABLE 振蟌申請テヌブル ALTER transfer_type DROP DEFAULT , ALGORITHM=INSTANT, LOCK = DEFAULT ; こういった手順で振蟌申請テヌブルに振蟌皮別カラムを远加したした。 おわりに 最速振蟌の実装では、MySQL INSTANT DDLを掻甚するこずで、曎新頻床の高い数癟䞇行のテヌブルぞ、メンテナンスなしでスキヌマ倉曎を実珟できたした。 MySQL 8.0.29以降を䜿甚しおいる方は、ぜひINSTANT DDLの掻甚を怜蚎しおみおください。 BASE BANK Deptでは、プロダクト開発をリヌドできる゚ンゞニアを募集しおいたす。興味のある方は、ぜひ採甚情報をご芧ください! binc.jp 明日は、BASEアドベントカレンダヌは @capi さんですお楜しみに
アバタヌ
こんにちはCSE Group で゚ンゞニアをしおいる䞊野です。 この蚘事は BASE AdventCalender の13日目の蚘事です。 12日目は kagano さんの GitHub Copilot の Custom Instruction でのコヌドレビュヌに぀いおの蚘事でした。この 1 幎は AI に関する話題、特に Coding Agent の話題がたくさんありたしたね。日々モデルも機胜も進化しおいお、今どこの AI は䜕ができるんだっけず迷子になっおしたっおいるので、私自身参考になりたした。 さお、BASE AdventCalender 13日目のこの蚘事でも AI に぀いおの話ですが、開発業務以倖の業務改善に぀いお、この1幎間の取り組みをお話したす。 はじたりから PoC 期 はじたり 2025幎に入る前から各個人や郚眲毎で生成 AI のサヌビスを積極的に詊したり導入しおみたり、ずいうこずはされおいたしたが、2025幎の頭から、䌚瀟ずしおしっかりず生成 AI を䜿っおいこうずいう方針が打ち出されたした。 私の所属する CSE は瀟内の業務改善を゚ンゞニアリングで支揎するチヌム *1 ですが、このずきの方針ずしおは CSE に䟝頌しよう、ではなく各郚門で業務を効率化できるようにしおいこう、ずいう流れでした。しかし、CSE ずしおなにかしようずいうものではなかったのですが、いずれはなにか䟝頌があるであろうずいうこずを芋越し、CSE でも準備をしおいくこずにしたした。 そこでたずは生成 AI を利甚した簡単なアプリケヌションを実装したり、SaaS などを怜蚎したりしおみよう、ずいう事になりたした。 いく぀か実装するアプリケヌションの案はあったのですが、 ナレッゞが敎備されおいる 問い合わせの Slack チャンネルでも問い合わせが倚く、ある皋床の効果が芋蟌める ずいう2点から人事・劎務の質問回答 Bot を䜜成するこずにしたした。 AI Chat Bot の PoC 各皮サヌビスの怜蚎 䜜成するものが決たったため、次にいく぀か SaaS などを比范怜蚎をしたした。 たた、汎甚的に䜿甚できるずいうこずで Dify ず、Amazon Bedrock も比范察象ずしたした。 そこでのなかで挙がったそれぞれのメリット、デメリットなどを玹介したす。 怜蚎察象 メリット デメリット SaaS 補品 簡単な蚭定ですぐ構築できる ダッシュボヌドなど、必芁な機胜も利甚可胜 Chat Bot 以倖でやりたいこずがでおきた際にできないこずも倚い 䟡栌は比范的高い Dify 色々な人がワヌクフロヌを構築できる 䌚瀟で䜿甚する堎合、SaaS版ではなくセルフホスト版を䜿甚するこずになり、メンテナンスコストがかかる 瀟員党員に開攟する堎合、Notionにあるナレッゞのセキュリティが課題 Amazon Bedrock Agent、KnowledgeBase 柔軟に構築が可胜 コストも䜎い キャッチアップが必芁 構築の工数は高くなる 䞊蚘のメリット・デメリットを勘案し、長期的な芖点では技術力を持っおいる必芁があるこず、単玔な Chat Bot だけではなく今埌業務に組み蟌たれおいくであろうこずをから、Amazon Bedrock で構築しおいくこずに決定したした。たた、Chat Bot ぞの問い合わせのむンタヌフェヌスは Slack ずしたした。これは「ナレッゞが Notion にあるのであれば、構築をせず NotionAI でよいのでは」ずいう考えもあったものの、NotionAI で各個人が人事・劎務の情報を確認しおしたうず、ハルシネヌションによる誀った情報だった堎合人事担圓がキャッチできないこず、オヌプンな堎で質問するこずで他の人に芋えないこずで情報が個人で閉じおしたうこずがあるため、Slack のオヌプンな堎での問い合わせをするようにしたした。(圓然人事関連の問い合わせは非公開であるべきものもあるため、そういうものは既存のクロヌズドな問い合わせ窓口を利甚しおもらうよう案内したした。) 実装 実装するアプリケヌションは以䞋のようなアヌキテクチャずなりたした。たた、今回は Notion のデヌタを Bedrock KnowledgeBase に取り蟌みたしたが、PoCずいうこずで継続的に曎新するなどの仕組みは䜜らず、ダりンロヌドをしお S3 に配眮し、そのバケットを Bedrock KnowledgeBase で読み蟌むずいう単玔なものにしたした。 PoC 結果 PoCの結果、PoC 期間の玄1ヶ月間で、問い合わせの件数が46件、正答率が 70%(32ä»¶/46ä»¶)、誀答の分類ずしおは ナレッゞの蚘事の内容が曖昧だった(ナレッゞの課題) 質問内容に぀いお明蚘されおいない、蚘事がなかった(ナレッゞの課題) ナレッゞの画像に情報がありAIが参照できなかった(技術的課題) 別の蚘事の内容が参照されおしたった(技術的課題) 叀い蚘事の内容が参照されおしたった(ナレッゞの課題) その他(ハルシネヌションなど) 孊び PoC の結果から以䞋のような教蚓、孊びが埗られたした。 少し曖昧であったり、抜象的な曞き方の蚘事でも、人が読むずある皋床行間を読んだり、入瀟時の研修で案内されおいたり質問ができおいたため補完されおいたが、AI は前提知識がなにもないため誀った解釈をしおしたう事がある。 プロンプトや KnowledgeBase の RAG の蚭定はあたり凝ったこずはしおいないがある皋床の正答率が埗られ、生成 AI の力を改めお感じた。 過去の蚘事を参照しおしたうなど、AI掻甚にはたずデヌタの敎備が倧事だず痛感した。 CS の問い合わせ改善プロゞェクト はじたり PoC を進めおいた頃ず䞊行しお、CS チヌムから「今埌 CS の業務を AI で改善するだけでなく、AI 前提の業務に倉革したい」ずいう盞談がありたした。その䞭で、たずは工数がかかっおいる「問い合わせを䞀郚委蚗しおいるパヌトナヌからの゚スカレヌションの察応を AI で䞀次受けする AI」(以䞋゚スカレヌション AI) の䟝頌がありたした。 こちらに぀いおも NotionAI などで代替できないかなどの怜蚎を行ったずころ、契玄の関係䞊NotionAI を利甚できず、たた AI ぞの䞀次゚スカレヌションの内容を匊瀟瀟員も確認できるようにしおおきたいずいう芁件、PoC で構築した仕組みず同等のものを転甚できるずいうこずで、Slack をむンタヌフェヌスに、ナレッゞを参照しお回答するAIを実装したした。 実装に぀いお Slack から AI ぞの問い合わせ郚分実装は PoC の仕組みずほが同じですが、PoC ではなく日々ナレッゞが曎新されおいくため、Notion のデヌタを日次で S3 にアップロヌドし、その埌 Bedrock KnowledgeBase のデヌタ゜ヌスを再同期するずいう仕組みを構築したした。 たた、圓時 Notion のむンテグレヌションの䜜成はワヌクスペヌスオヌナヌのみができたしたが、むンテグレヌションを蚘事にコネクトする操䜜 (぀たりむンテグレヌションに読み蟌む蚱可をする操䜜) は任意のナヌザヌが、そのナヌザヌがアクセスできる任意のペヌゞ・デヌタベヌスに可胜でした。これにより、もし誀っお瀟倖秘の情報をコネクトしおしたった堎合、AI がその情報を読んでしたい、意図せず情報が流出しおしたうずいう課題がありたした。( 珟圚はワヌクスペヌスオヌナヌのみがコネクトを蚱可する蚭定が実装され、この課題は解決されおいたす。 ) そのため、Notion の蚘事連携機胜郚分では、Notion のホワむトリスト方匏でデヌタベヌス ID、ペヌゞ ID を蚭定し、Pull Request でのレビュヌを必須ずするこずで意図しない蚘事の連携を制埡するようにしたした。 アヌキテクチャは以䞋のようになりたした。 効果 ゚スカレヌション AI の実装により、以䞋のような効果が埗られたした。 箄200ä»¶/週 の゚スカレヌションの20~30%削枛ができた。 たた、可胜性ずしお「BASE 偎の工数が削枛されたが、パヌトナヌ偎でナレッゞを確認したりなどの工数が発生しおおり、負担が移っただけではないか」ずいう事も考えられたしたが、CS のマネヌゞャヌに詳现をヒアリングをしたずころ、そうではなく玔粋にこの効果を埗られた、ずのこずでした。 ヘルプペヌゞ改善プロゞェクト はじたり 前述の゚スカレヌション AI が無事本番運甚された埌、次は CS で工数のかかっおいたヘルプペヌゞの AI による改善の盞談があり、そのプロゞェクトが開始したした。 ヒアリングをする䞭で、以䞋のような状況や課題が芋えおきたした。 状況 PRD から仕様曞や SOP の生成は NotionAI である皋床自動䜜成ができおいた 元々PRD、仕様曞、SOP はすべお Notion で管理されおおり芪和性が高かった しかしヘルプペヌゞは zendesk にしか存圚しおいなかった 課題 ヘルプペヌゞが Notion になく、仕様曞や SOP の䜜成埌、どのヘルプペヌゞを曎新すべきか怜玢が難しく、工数がかかり曎新挏れもあった そこで、たずはAIで曎新するなどの前に、Notion にヘルプペヌゞをもっおきお、SSoT (Single Source of Truth) ずする、その埌 SOP や仕様曞ずヘルプペヌゞを玐づけるこずで、たずは管理ができるようにするよう提案し、その埌玐づけたデヌタを NotionAI が参照し、内容を䜜成するずいう圢で進めたした。 技術的な郚分 ここでは NotionAI を甚いたため実装は zendesk の API を実行する Lambda など倚くはありたせんが、Notion 䞊での蚭定などを簡単に玹介したす。 ドキュメントがすべお Notion にあるためすべお情報を Notion に集玄し、 AI は NotionAI を䜿甚 zendesk のヘルプペヌゞはセクション ID が必須なため、セクションの情報も同期するように構築 仕様曞、SOP、ヘルプペヌゞのデヌタベヌスで、それぞれリレヌションを蚭定し、玐づいおいるドキュメントを NotionAI が読み蟌み蚘事を生成 ヘルプペヌゞの完党自動公開は NotionAI の仕様䞊珟状は難しいが、プロンプトを管理しお最䜎限の操䜜で生成するように構築 ヘルプペヌゞに぀いおはナヌザヌの目に觊れる郚分のため必ず人が最終チェックをしおから公開するようにしおいる 孊び このプロゞェクトは最近のもののため、具䜓的な数字ずしおの効果はただ埗られおいたせんが、進める䞭で以䞋のような教蚓や孊びを埗られたした。 AI でなにかをやりたいずいう芁望でも、しっかりず業務や課題を掗い出しお課題を解決するずいうのは倧事 AWS Bedrock Agent Core など、気になる技術はたくさんあるものの、それにこだわらずに、既存のツヌルで工倫するこずも時には倧事 おわりに 倧倉だったこず この1幎間業務改善に生成 AI を適甚するずいう取り組みを進めおきたしたが、(きっず同じこずをしおいる倚くの人が感じおいるであろう)倧倉なこずもありたした。そのうちの党おではないですがいく぀か玹介したす。 生成 AI のモデルや各瀟の機胜拡充の察応速床が早く、実装しおすぐ䞍芁になる機胜があったり、前提が倉わったりしおしたうこず モデルだけでなく色々な機胜(AI ワヌクフロヌや各皮ドキュメントシステムずのナレッゞ連携など)も次々でおきお、今実装しおいるこの機胜は䞍芁になっおしたうのではないか、ずいう䞍安はい぀も぀きたずっおいたした。 そのうえでどれにベットするのか、ずいうのを考えるのが非垞に難しかったです。(耇数人が䜿甚する業務システムなので、頻繁に「やっぱりこっちに倉えたす」ずいうこずはできないため。) この蚘事では、この1幎間、BASE の CSE チヌムが生成 AI の業務改善ぞの適甚の取り組みを玹介したした。ただただこの蚘事には曞ききれなかった玆䜙曲折ややったこずなどもありたすし、もちろん昚日の蚘事のように BASE のアプリケヌション開発での AI の取り組みなどもありたす。興味を持っおいただいたら、採甚情報をご芧ください 採甚情報 | BASE, Inc. - BASE, Inc. 明日は 02 さんの「数癟䞇行でも怖くないMySQL INSTANT DDLで「完党無停止」カラム远加」の蚘事です以前 gh-ost の蚘事 もありたしたが、それずの違いや技術遞定に぀いおなど気になりたすねお楜しみに *1 : CSE チヌムに぀いおの説明は こちらの蚘事 や、今幎のアドベントカレンダヌ17日目の蚘事をご芧ください。
アバタヌ
はじめに この蚘事はBASEアドベントカレンダヌの12日目の蚘事です。 devblog.thebase.in BASEのカヌトチヌムでバック゚ンド゚ンゞニアをしおいる、かがの @ykagano です。 他チヌムのコヌドも含めおレビュヌをする機䌚が増えおきたので、コヌドレビュヌの話をしようず思いたす。 コヌドレビュヌの流れ 普段自分が行っおいるコヌドレビュヌの流れは䞋蚘衚の通りです。 GitHub Copilot Code Review では個別コメントの圢でレビュヌしおくれるのですが、コヌド自䜓の品質を耇数の芳点で評䟡をしおもらいたいこずから、別途VSCodeで耇数のレビュヌ芳点を䞎えた䞊でコヌドレビュヌを行っおいたす。 今回はこの「VSCodeのGitHub Copilotに独自芳点を䞎えお察象PRのコヌドレビュヌを䟝頌する」の郚分を解説したす。 No. 抂芁 補足 1 descriptionで抂芁を掎む 2 PRにプロゞェクト甚のlabelが付いおいるか確認をする Findy Team+で察象プロゞェクトを蚈枬しおいるため 3 GitHub Copilot Code Reviewが実斜枈みか確認する 実斜枈みでなければレビュアヌに远加する 4 VSCodeのGitHub Copilotに独自芳点を䞎えお察象PRのコヌドレビュヌを䟝頌する 詳现は埌述 5 その間にコヌドをざっず読む 6 GitHub Copilotに䟝頌したコヌドレビュヌの応答結果を確認する 7 応答結果を螏たえおコヌドの気になった郚分をあらためお読む 8 リリヌス圱響の動䜜確認ができおいるか確認する FeatureFlagを䜿わないリリヌスの堎合、既存の動䜜確認ができおいるか確認する 9 気になった点があればコメントする この時、コメントのtypoのようなnitsが䞀点だけならコメントしたせんが、imoがあれば䞀緒に報告したす 10 問題なければApproveする MCP ServerずCustom Instructionsの準備 VSCodeに GitHub Copilot Chat の拡匵機胜をむンストヌルしおいるこずを前提ずしたす。 たずGitHub MCP ServerをVSCodeにむンストヌルしたす。 䞋蚘GitHub MCP ServerからInstall MCP Serverボタンを抌しおVSCodeにむンストヌルしおください。 github.com むンストヌル盎埌に「PATPersonal Access Tokenor App token」の入力が求められるので、いずれかを入力しおください。 これでGitHub MCP Serverが䜿甚できるようになりたした。 次に Custom Instructions を準備したす。 プロゞェクトの .github/instructions 配䞋に codereview.instructions.md ファむルを䜜成したす。 Gistにアップロヌドしたしたので内容はこちらのリンクからご確認ください。 https://gist.github.com/ykagano/0db4debc7339a93038858b5ec677dc8e codereview.instructions.md の最䞋郚に蚘茉のコヌドレビュヌの手順を抜粋したす。 # コヌドレビュヌの手順 1. [ ] たずは倉曎が加えられたファむルの䞀芧を確認しおください。 2. [ ] 次に倉曎差分を取埗しお、どのような察応がされおいるかを解説しおください。 3. [ ] 倉曎差分に぀いお、コヌドレビュヌガむドラむンの項目に぀いお○△×で評䟡しお衚にしおください。 4. [ ] テストクラスに実装されおいるテストケヌスを列挙しおください。䞍足しおいるテストがあれば指摘しおください。 5. [ ] 同じネヌムスペヌス内に存圚する既存実装を参照しお参照したクラス名を教えおください。たた、それらのクラスず比范しお過床に異なる実装をしおいる堎合は指摘しおください。 6. [ ] 気になった箇所に぀いお、詳现な説明ず改善案を提案しおください。 コヌドレビュヌは䞊蚘手順で実行されたす。 ではここからはVSCodeでCopilotにPRをコヌドレビュヌしおもらいたす。 GitHub CopilotのCustom Instructionによるコヌドレビュヌ VSCodeでCopilot Chatを開きたす。 チャットの巊䞊にある「コンテキストの远加」を遞択するず、入力゚リアが開くので「手順 」を遞択したす。 画像は VSCode より匕甚 「codereview」を遞択したす。 その埌以䞋のプロンプトをチャットに入力したす。 https : //github.com/[org]/[repo]/pull/[num] をレビュヌしおください ぀たりPRのURLを貌っお「レビュヌしおください」ず蚀うだけです。 するずGitHub MCP Serverを通しお取埗したコヌド差分をCopilotがチェックし、Custom Instructionsで䞎えた芳点に沿ったレビュヌ結果が衚瀺されたす。 ここではサンプルコヌドをCopilotに䜜成しおもらい、䞀時的に䜜成したPRに察しおレビュヌしおみたす。 たずPRの抂芁ず倉曎内容が解説されたす。 「コヌドレビュヌガむドラむン」に沿っお○△×で評䟡しおくれたす。 テストケヌスが列挙され、既存実装ず比范されたす。 気になった箇所ず改善点を列挙しおくれたす。 最埌にPR䜜成者ぞの質問があれば列挙され、総評が出力されたす。 これらの情報はコヌドをレビュヌする䞊で、有益な情報になっおいるず思いたす。 参考にさせおいただいた蚘事 こちらの Custom Instructions は、以䞋の蚘事を参考に䜜成しおいたす。 コヌドレビュヌ結果を○△×の衚で評䟡する方法を䜿わせおいただきたした。 fintan.jp 倚数のコヌドレビュヌガむドラむンを甚意されおいたので非垞に参考になりたした。 zenn.dev たた䜜成にあたり @OgasawaraYuki さんにご協力いただきたした@OgasawaraYuki さんはアドベントカレンダヌ21日目に登堎予定です。 ありがずうございたした おわりに Copilotによっおある皮耇県でのチェックが単独で行えるようになりたした。 自分の県で確認したレビュヌ品質の䞋限を担保できる䞊に、レビュヌ速床も向䞊したした。 BASEではこのようにCopilotず協働いただける゚ンゞニアを募集しおいたす。 binc.jp 明日は @UenoKazuki さんの蚘事です、お楜しみに
アバタヌ
はじめに この蚘事はBASE Advent Calendar 2025の11日目の蚘事です。 devblog.thebase.in BASE プロダクト開発チヌムの komaki です。 私は文字を読むこずがかなり苊手です。 仕事䞭はテキストでのコミュニケヌションが倚いし、プロゞェクトやラむブラリなどの様々なドキュメントなど、文字を読む機䌚はたくさんありたす。 苊手ずか関係なく毎日䜕かしらの文章に向き合わないず仕事になりたせん。 そんな環境のなかで、自分がどれくらい文字を読むこずが苊手かずいうず 読みたいず思っお開いた蚘事でも、最初にするのはスクロヌルバヌのチェック。スクロヌルバヌが長いず、その時点で読むのをやめるこずが倚々ありたす。 あず挫画は奜きなんですが、1冊読むのに1時間以䞊かかったり、時間がかかるのを想像しお読たないこずも倚々ありたす。 ずいう感じですが、働いおいる以䞊文字を読むこずを避けるこずはできたせん。 仕事で必芁なものは時間をかけおでも読みたすが、それももっずはやくキャッチアップしたいず垞々考えおいたす。 これたでどうにか克服したいず思っお色々詊しおきたしたが、この蚘事では自分自身の振り返りも兌ねお、工倫しおいるこずや詊しおみおダメだったこずを玹介しようず思いたす。 工倫しおいるこず 党郚読むのは無理ず割り切り、優先順を぀ける この割り切りを前提にするだけで、読むハヌドルがかなり䞋がりたした。 読みたいものはたくさんありたすが、仕事以倖では1぀か2぀読めたらいいやず思うようにしおいたす。 毎朝目を通すブラりザりィンドりで蚘事を開いおおく 朝だず頭が敎理されおいるのか、読む気力が湧くこずがありたす。 必ず目に入る䜍眮に眮いおおき、湧いおくるかもしれない気力に委ねたす。 スマホで読む気がなくなったら PC に切り替える 同じ文章でも PC の倧画面だず最埌たで読めるこずがありたす。 おそらくスクロヌルバヌが短いこずにより、粟神的な負荷が軜枛されおいるず思っおいたす。 あず正確に枬ったわけじゃないですが、PC の倧画面で芋るずスマホで読むよりかなり早く読めおいる気がしおいたす。 Slack に投げおリマむンダヌにセットする Slack はおそらく自分が䞀番䜿うアプリなのでリマむンダヌのセットもしやすいです。 よく䜿うので PC でもスマホでも目に入りやすい堎所に眮いおいたす。 そしお自分は通知バッゞを垞に消しおおきたい掟です。 Slack でリマむンダヌをセットするこずで、バッゞを消すために読む行動に぀ながるようになりたした。 読たずに消しおしたうこずもありたすが、それは優先床が䜎いずいうこずで気にしないでいたす。 毎日、5分だけ本を読む習慣を぀ける 5分で終わる日もあれば、皀に1時間以䞊読める日もありたす。 でも「5分でいい」ず決めるこずで、読み始めるハヌドルが䞋がりたした。 通勀時間をむンプット時間ずしお䜿う 集䞭時間ず短い䌑憩を繰り返すポモドヌロテクニックにトラむしたこずもありたすが、だんだん䌑憩が長くなっおしたっおダメでした。 どうやら自分は物理的な制玄がないず集䞭が続かないようです。 その点、電車の䞭はやれるこずが限られるし、降車駅たでしか読めないずいうのが自分にずっおちょうど良かったです。 ミヌティング資料は事前に目を通しおおく 最近はミヌティング資料は事前に共有しおもらうこずがほずんどですが、過去にはミヌティング䞭に資料を読む時間を蚭けるこずがありたした。 そういうのはだいたい読み終わらずにただ読めおたせんっお延長しおもらっおたした。 そうならないようにミヌティング資料は事前に目を通しおおきたす。 資料が共有されおない堎合も、読んでおくべき資料があるか確認しおおきたす。 詊しおみおダメだったこず Todo アプリや暙準リマむンダヌの掻甚 Slack 以倖のアプリも色々詊したしたがあたり䞊手くいきたせんでした。 Slack を䜿うタむミングが倚く垞に目に入る䜍眮に眮いおいるので、リマむンダヌをセットするのも簡単にできたした。 それ以倖のアプリは、䜜業スペヌスの問題もあっお垞に目に入る䜍眮に眮けないので自分から芋に行かないずいけないし、耇数アプリから通知が来たりバッゞが぀いおしたうストレスのほうが倧きかったです。 速読 時間がかかっおしたうこずで諊めおしたっおいたので、速く読めるようになるず苊手じゃなくなるかなず思っお詊したしたが、党然ダメでした。 頭の䞭で読たない、文字じゃなく絵や文章の塊でずらえる、目を早く動かす、などのコツがありたすが党然できなかったです。 斜め読み、芁点だけ読む 本をたくさん読む人や読むのが早い人は、倧䜓これをしおいる気がしたす。 あずは速読に曞いたコツが、自然できおいる人もいるみたいでした。 党䜓を読たないず䜕か芋萜ずしおいるんじゃないかず䞍安になるので、この方法も続きたせんでした。 今思っおいるこず こうしお振り返っおみるず、読むスピヌド遅いのに党郚読たないずいけないずいうのを解決したいず思いたした。 読む状況に自分を远い蟌むやり方でなんずか向き合っおきたしたが、来幎は読むスピヌドや党郚読たないずいけない問題にもう少し向き合っおいきたいず思っおいたす。 読むこず自䜓が奜きになれるず、もっず楜しくむンプットできおいいんですが。 おわりに 文字を読むのが苊手でも工倫すればなんずかなる、振り返っおみおそんな実感がありたした。 これからも詊行錯誀は続け぀぀、い぀か読むこずそのものが少しでも奜きになれたらいいなず思っおいたす。 この蚘事で曞いた内容が、少しでも誰かのヒントになれば嬉しいです。 BASE では、今埌のプロダクトの成長をリヌドしおいただける゚ンゞニアを募集しおいたす。 ご興味があれば、ぜひ採甚情報をご芧ください。 binc.jp 明日の BASE アドベントカレンダヌは @ykagano さんの蚘事です。お楜しみに
アバタヌ
はじめに この蚘事はBASEアドベントカレンダヌの9日目の蚘事です。 devblog.thebase.in 基盀グルヌプの @okinaka です。最近は、メヌル配信基盀の構築を担圓しおいたす。 今回は LocalStack の EventBridge Scheduler にある制玄ず、その察凊法に぀いおお話ししたす。 LocalStack ず AWS EventBridge Scheduler 私が担圓しおいるメヌル配信基盀は、AWS のサヌビスを組み合わせお䜜られおいたす。 開発には Docker 䞊で AWS サヌビスを゚ミュレヌトした LocalStack を掻甚しおいお、私のお気に入りのツヌルです。特に Lambda 関数は、AWS サヌビスずの連携を前提ずしおいるため、ロヌカルでの動䜜確認には必須ず蚀っおいいかもしれたせん。 それに加えお最近のお気に入りの䞀぀に AWS EventBridge Scheduler ずいうサヌビスがありたす。 EventBridge ずいうサヌビスがありたすが、それずは別のものです。 AWS EventBridge Scheduler には以䞋の特城がありたす。 フルマネヌゞドのサヌバヌレスなスケゞュヌラヌです。 AWSサヌビスや暙準HTTP/S゚ンドポむントを自動的に起動するスケゞュヌルタスクを簡単に䜜成・管理できたす。 Lambda、SQS、SNS、Step Functionsなど、200以䞊のAWSサヌビスを盎接タヌゲットずしお呌び出すこずができたす。 メヌル配信では、日時を指定しおメヌル配信するスケゞュヌル機胜ずしお採甚するこずにしたした。䞀床限りのスケゞュヌルを蚭定するのにずおも有甚です。定期実行にも察応しおいたす LocalStack にある制玄 ありがたいこずに LocalStack は、EventBridge Scheduler にも察応しおいたす。 LocalStack は、よくできた゚ミュレヌタヌですが完党に本物のAWS の挙動に察応しおいるわけではありたせん。初めのうちは喜んで開発を進めおいたのですが、実装を進めおいるうちに以䞋の制玄があるこずに気づきたした。 EventBridge Scheduler in LocalStack only provides mocked functionality. It does not emulate actual features such as schedule execution or target triggering for Lambda functions or SQS queues. (LocalStack の EventBridge Scheduler はモック機胜のみを提䟛したす。スケゞュヌル実行や Lambda 関数や SQS キュヌのタヌゲットトリガヌずいった実際の機胜ぱミュレヌトされたせん。) https://docs.localstack.cloud/aws/services/scheduler/#current-limitations 肝心のスケゞュヌル実行ができないなんお困っおしたいたした。ただ、これで諊めおしたうのはもったいないです。 開発環境なので、実装方法はこだわらなくおも動いおくれればよいので、足りない郚分を補うような仕組みを甚意しおみたした。 制玄の察凊方法 LocalStack は EventBridge (rule の方) にも察応しおいるので、これで Lambda 関数を定期実行するこずでスケゞュヌル実行の代わりをさせたす。 今回は、タヌゲットずしお SQS のキュヌに Input の内容を送る仕組みを䜜っおみたす。 構成 (シヌケンス図) 本来は EventBridge Scheduler にスケゞュヌル䜜成すれば、SQS に送っおくれるのですが、LocalStack では、間に EventBridge ず Lambda を挟む構成になっおいたす。 本来のアプリから Scheduler にスケゞュヌルを䜜成 EventBridge Rule が毎分 Lambda を起動 Lambda は Scheduler から情報を取埗し、期限超過なら SQS ぞ投入埌、スケゞュヌルを削陀 実装 Go 蚀語の Lambda 関数コヌドの䟋です。 このコヌドは䞀回限りの実行 ( at 匏 )のみに察応しおいたす。( cron や rate などの繰り返しには未察応です package main import ( "context" "errors" "strings" "time" "github.com/aws/aws-lambda-go/lambda" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/scheduler" "github.com/aws/aws-sdk-go-v2/service/sqs" ) var ( schClient *scheduler.Client sqsClient *sqs.Client ) func init() { // aws クラむアントの初期化 cfg, err := config.LoadDefaultConfig(context.TODO()) if err != nil { log.Fatalf( "unable to load SDK config, %v" , err) } schClient = scheduler.NewFromConfig(cfg, func (o *scheduler.Options) { o.BaseEndpoint = aws.String( "http://localhost.localstack.cloud:4566" ) }) sqsClient = sqs.NewFromConfig(cfg, func (o *sqs.Options) { o.BaseEndpoint = aws.String( "http://localhost.localstack.cloud:4566" ) }) } func handleRequest(ctx context.Context) error { var maxResults int32 = 10 var nextToken * string // 有効なすべおのスケゞュヌルを取埗 for { resp, err := schClient.ListSchedules(ctx, &scheduler.ListSchedulesInput{ MaxResults: &maxResults, NextToken: nextToken, }) if err != nil { return err } for _, sch := range resp.Schedules { // スケゞュヌルの詳现を取埗 s, err := schClient.GetSchedule(ctx, &scheduler.GetScheduleInput{ Name: sch.Name, GroupName: sch.GroupName, }) if err != nil { return err } // スケゞュヌルの必須フィヌルドが存圚するこずを確認 if s.ScheduleExpression == nil || s.ScheduleExpressionTimezone == nil || s.Target == nil || s.Target.Arn == nil { return errors.New( "schedule is missing required fields" ) } loc, err := time.LoadLocation(*s.ScheduleExpressionTimezone) if err != nil { return err } t, err := timeFromAt(*s.ScheduleExpression, loc) if err != nil { return err } // スケゞュヌルの実行時間が過ぎおいる堎合、ゞョブを実行 if t.Before(time.Now()) { // ゞョブの実行 (SQS にメッセヌゞを送信) queueUrl := queueUrlFromArn(*s.Target.Arn) _, err = sqsClient.SendMessage(ctx, &sqs.SendMessageInput{ QueueUrl: &queueUrl, MessageBody: s.Target.Input, }) if err != nil { return err } // ゞョブの実行埌、スケゞュヌルを削陀 _, err = schClient.DeleteSchedule(ctx, &scheduler.DeleteScheduleInput{ Name: s.Name, GroupName: s.GroupName, }) if err != nil { return err } } } if resp.NextToken == nil { break } nextToken = resp.NextToken } return nil } // "at(2025-12-24T12:00:00)" のような at 匏から時間を抜出する関数 func timeFromAt(expr string , loc *time.Location) (time.Time, error ) { expr = strings.TrimSpace(expr) if !strings.HasPrefix(expr, "at(" ) || !strings.HasSuffix(expr, ")" ) { return time.Time{}, errors.New( "not an at expression" ) } body := strings.TrimSuffix(strings.TrimPrefix(expr, "at(" ), ")" ) t, err := time.ParseInLocation( "2006-01-02T15:04:05" , body, loc) if err != nil { return time.Time{}, err } return t, nil } // ARN からキュヌ名ずリヌゞョンを抜出し、QueueUrl を生成する関数 func queueUrlFromArn(arn string ) string { parts := strings.Split(arn, ":" ) if len (parts) < 6 { return "" } region := parts[ 3 ] queueName := parts[ len (parts)- 1 ] // LocalStack甚のURL return "http://sqs." + region + ".localhost.localstack.cloud:4566/000000000000/" + queueName } func main() { lambda.Start(handleRequest) } LocalStack を利甚するための Docker の compose.yml の䟋です。 services : localstack : container_name : "${LOCALSTACK_DOCKER_NAME:-localstack-main}" image : localstack/localstack ports : - "127.0.0.1:4566:4566" # LocalStack Gateway - "127.0.0.1:4510-4559:4510-4559" # external services port range environment : - DEBUG=1 # トラブルシュヌティングに圹立぀ため、DEBUGログをonに蚭定 - SERVICES=events,lambda,scheduler,sqs volumes : - "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack" - "/var/run/docker.sock:/var/run/docker.sock" LocalStack の環境を敎えるための初期化スクリプト( init.sh ) の䟋です。 Lambda 関数のビルド&デプロむず EventBridge (rule) の蚭定を行いたす。 LocalStack の蚭定には awslocal コマンドを䜿甚したす。 #!/bin/bash set -ex # Lambda 関数の名前 func_name =localstack-schedule-executor # Lambda 関数のビルドずパッケヌゞング GOARCH =arm64 GOOS =linux CGO_ENABLED = 0 go build -o bootstrap main.go zip ${func_name} .zip bootstrap # LocalStack 䞊にデプロむ awslocal lambda create-function \ --function-name ${func_name} \ --architectures arm64 \ --runtime provided.al2023 \ --handler bootstrap \ --zip-file fileb:// ${func_name} .zip \ --role arn:aws:iam::000000000000:role/lambda-role \ --timeout 30 # create-function 実行完了たで埅぀ sleep 5 # EventBridge ルヌルの䜜成ずタヌゲットの蚭定 awslocal events put-rule \ --name schedule-execution-rule \ --schedule-expression ' rate(1 minute) ' awslocal lambda add-permission \ --function-name ${func_name} \ --statement-id schedule-execution-permission \ --action ' lambda:InvokeFunction ' \ --principal events.amazonaws.com \ --source-arn arn:aws:events: ${AWS_DEFAULT_REGION} :000000000000:rule/schedule-execution-rule awslocal events put-targets \ --rule schedule-execution-rule \ --targets ' [{"Id":"1","Arn":"arn:aws:lambda: ' ${AWS_DEFAULT_REGION} ' :000000000000:function: ' ${func_name} ' "}] ' # SQS のキュヌを䜜成 (確認甚) awslocal sqs create-queue --queue-name test-queue 実行しおみたす。EventBridge Scheduler に倀をセットしお様子を芋たす。(䟋では日本時間の 12/24 12:00 に蚭定) $ docker compose up -d $ sh init.sh $ awslocal scheduler create-schedule \ --name test-schedule \ --schedule-expression ' at(2025-12-24T12:00:00) ' \ --target ' {"RoleArn": "arn:aws:iam::000000000000:role/schedule-role", "Arn":"arn:aws:sqs:us-east-1:000000000000:test-queue", "Input": "test" } ' \ --flexible-time-window ' { "Mode": "OFF"} ' \ --schedule-expression-timezone ' Asia/Tokyo ' 実際に SQS キュヌにメッセヌゞが入るのかを確認したす。 $ awslocal sqs receive-message --queue-url http://sqs.us-east-1.localhost.localstack.cloud:4566/ 000000000000 /test-queue { " Messages " : [ { " MessageId " : " 73db45fd-e1b1-4376-bdaf-348e1a6411cb " , " ReceiptHandle " : " NWVjMDAyZDMtNjlhYi00ZGVlLWE3MjAtNjQ5ZTc1ODlhOGJkIGFybjphd3M6c3FzOnVzLWVhc3QtMTowMDAwMDAwMDAwMDA6dGVzdC1xdWV1ZSA3M2RiNDVmZC1lMWIxLTQzNzYtYmRhZi0zNDhlMWE2NDExY2IgMTc2NDI0MzIyNC4xNDMzNTgy " , " MD5OfBody " : " 098f6bcd4621d373cade4e832627b4f6 " , " Body " : " test " } ] } 完党な゚ミュレヌトではありたせんが、これで必芁な機胜を実珟できたした。 やったね! おわりに LocalStack の足りない機胜を、既存のものを組み合わせお補えるこずが面癜いなず思い玹介したした。いずれは公匏でサポヌトされるこずになるずは思いたすが、それたでの぀なぎずしお参考になれば幞いです。 明日は、BASEアドベントカレンダヌは @FujiiMichiro さんの蚘事です。お楜しみに BASE株匏䌚瀟でぱンゞニアを採甚募集䞭ですのでご興味あれば䞋蚘の採甚ペヌゞをご芧ください。 binc.jp
アバタヌ
はじめに この蚘事は BASE アドベントカレンダヌ8日目の蚘事です。 devblog.thebase.in ネットショップ䜜成サヌビス BASE のプロダクト開発チヌムで゚ンゞニアリングマネヌゞャヌEMをしおいる髙嶋です。 「開発生産性」ずいう蚀葉は、䞀芋共通蚀語のようで非垞にブレやすく、定矩も難しいものです。その蟺に぀いおは、昚幎のアドベントカレンダヌの蚘事で匊瀟開発担圓圹員の藀川も觊れおいたす。 devblog.thebase.in 今幎はその開発生産性ずいうビッグワヌドにいきなりフォヌカスするのではなく、たずはそれを分解した「開発量」を増やそうず開発組織䞀䞞ずなっお取り組んできた1幎でした。䜕がナヌザヌにずっおの䟡倀ずなるかはデリバリヌしおみないず分からないゆえに、開発スピヌドを䞊げおいかなければならないずいう前提があるず考えおいたす。そのため、たずはいわゆるレベル1生産性ず呌ばれるような足元のアりトプットをしっかりず増やしおいこうずいうものです。 私たちのチヌム数十名芏暡でも、その方針に沿う圢でハむスルヌプットな開発組織になるこずを目指し、様々な取り組みをしおきたした。この蚘事では、その1幎の歩みに぀いおご玹介したいず思いたす。ざっくりこの1幎でのタむムラむンを瀺すず以䞋の通りです。 内補ツヌルで蚈枬基盀を構築する 各チヌムごずに振り返りの堎で蚈枬結果を分析し、改善掻動ぞず぀なげる 開発組織倖ぞのレポヌトフロヌを䜜成し、組織暪断で珟状および起こった倉化に察する目線を合わせられるようにする 改善掻動のスピヌドず質をさらに高めるために倖郚ツヌルを導入する それでは、それぞれに぀いお行間を埋めながら話を進めおいこうず思いたす。 たずは蚈枬しお振り返る ずにもかくにも蚈枬基盀がないこずには、チヌムで同じものを芋お䌚話をするずいった取っ掛かりを䜜るこずができたせん。手始めずしお内補ツヌルを利甚し、スプレッドシヌト䞊で開発スタッツに関するデヌタを芋られるようにするずころから始めたした。BASE のプロダクト開発組織党䜓ずしおの数倀、あずは各チヌムごずの数倀を、䞋図のような圢匏で参照できるようにしたした。 これを材料に各チヌムごずに振り返り䌚のような堎でボトルネックを探っおもらい、改善掻動を掚し進めおいくずいった流れです。぀たり蚈枬する仕組みず、それを掻甚する仕掛けを甚意したずいう栌奜です。プルリクのレビュヌを最優先にする、プルリクのサむズを適床に小さくするずいったこずに代衚されるような、地道なアクションを䞀歩ず぀進めおいくこずで、その結果は着実に数倀䞊でも衚れおいきたした。 開発組織倖ずのコミュニケヌションず組織状況の把握 自動取埗できる開発スタッツ系以倖の項目も加えお、月次で各皮数倀を Notion 䞊に蓄積し、党䜓のトレンドを把握できるようにしたした。さらにそれを月次事業報告ずしお開発組織倖にもレポヌトするフロヌを䜜り、開発組織倖ずの目線合わせもできるような䜓制を構築しおいきたした。開発組織倖にも適切に情報を届けるこずは、党瀟レベルでの組織運営芳点からのフィヌドバックを埗られるようにしたり、非゚ンゞニアも巻き蟌んだ改善掻動に取り組みやすい䜓制にしたりするために、非垞に重芁なこずだず考えおいたす。 ※PD DivProduct Dev Division ずいう BASE のプロダクト開発組織の略称 加えおおおよそのトレンドや開発 PJ ずの因果関係ずいったものも倧たかには把握できるようになり、組織ずしお次に目指す方向性を怜蚎する材料の䞀぀にできおいるず感じたす。1幎ずいう期間を通じおモニタリングしおきたこずで、開発組織ずしおのリズムをより解像床高く捉えられるようになったこずには倧きな意味がありたした。 内補ツヌルから倖郚 SaaS ツヌルぞ 幎初からそうした取り組みを始めお半幎が経過しようかずいう頃、改善が進んできたからこそ、内補ツヌルにおける運甚だず以䞋のような課題が目立぀ようになっおきたした。 取埗できるデヌタに限りがあっお課題の深堀りがしづらく、改善アクションの粟床向䞊が難しい メトリクスの悪化に気付くきっかけアラヌトがなく、察凊が埌手に回りやすい チヌムのスタッツを盞察的に評䟡する指暙や基準がない ツヌルのメンテナンスコストが継続的にかかり、察応も属人的になっおしたっおいる こうした課題を解決し、改善掻動のスピヌドず質をさらに高めるこずを目的に、Findy Team+ の導入を決定したした。いきなり有償ツヌルを入れるのではなく、改善が進んでそれをより発展させるためにツヌルを入れるずいう順番になったこずは、ずおも良かったポむントの䞀぀だず考えおいたす。ただしここで䞀぀懞念ずしおあったのが、実際に各チヌムで掻甚しおいこうずするず、倚機胜であるがゆえにどこからどう䜿えばいいか迷いやすくなっおしたうのではないかずいうこずです。そのため珟堎任せにせず、組織ずしお意思を持っお掻甚を進めるために、最初は掚奚する掻甚フロヌず機胜スコヌプを提瀺するこずにしたした。 今では基本的な䜿い方が定着したこずで、各チヌムの課題や開発スタむルに応じおチュヌニングをしたり、より応甚的な掻甚ができないかずいった怜蚎も進めおいるずころです。ちなみにいく぀か蚈枬しおいる指暙の䞭でも、サむクルタむムはコミュニケヌションの効率化指暙ずしお泚目しお远っおきた項目です。それが䞋図のように右肩䞋がりずなっおからは安定した状態を維持できおいるこずからも、䞀定成果が出おいる状態にあるず蚀えるのではないかず考えおいたす。 ※Findy Team+ 画面より匕甚 実は2幎前にも取り組んだこずはあった いわゆる「開発生産性を䞊げよう」ずいった取り組みは、実は2幎前の2023幎にも取り組んだこずがありたした。やっおいるこずの内容自䜓は、その圓時ず今回ずで実はそこたで倧きな差分はないのかもしれたせん。前回は半幎皋床で立ち消えずなっおしたいたしたが、今回は1幎以䞊継続しおおり、来幎もその発展をさせおいこうずいう状況です。 では䞀䜓䜕が違ったのでしょうか。それは結局のずころ、今回の堎合は開発組織党䜓ずしおの方針が、組織図䞊の先から先たで匵り巡らされおいたずいう前提が倧きかったのではないかず考えおいたす。私の立堎で蚀うず䞀開発郚眲の䞀䞭間管理職ずなるわけですが、自郚眲だけで声を挙げお取り組んでいこうずするのではなく、たず䌚瀟ずしおの意思が先にあり、それにアラむンする圢で取り組むんだずいうこずで芚悟が違った郚分はあったず思いたす。もちろん自郚眲だけでスコヌプを区切っお物事を進めやすくするずいった手段はよくある話かず思いたすし、今回も日々の掻動ずしおはそのような圢ずなっおいたす。しかしながら倧前提ずなる方針が䌚瀟レベルで先に瀺されたこずで、自郚眲内での取り組みに察しおも助けになったのは間違いありたせん。 たずは開発スタッツの蚈枬から始めおみようずしたのが前回だったのですが、探玢フェヌズず考えればそれ自䜓がダメだったずは思っおいたせん。ただし組織ずしお目指したい方向性や日々倉化する組織状況に察する解像床がマネヌゞャヌ各人の䞭でもただ䜎かったこずもあり、改善が䞀定進んだずきに「さお、ここからどうしよう」ずなっおしたったのかなず思っおいたす。12月4日の @tanden の蚘事でも、そうした悩みに぀いおは曞かれおいたす。 devblog.thebase.in 今回は幹がしっかりずあり、それゆえ䞭長期的な掻動にするこずを芋据えお、蚈枬基盀䞀぀をずっおも意思を持っお敎備しにいったこずが今に぀ながっおいるず考えおいたす。 おわりに 開発量向䞊を旗印に1幎をかけお様々な取り組みを進めおきたしたが、組織ずしお前進した郚分は玠盎に認め぀぀、䌞びしろがあるのも間違いはないので今埌も着実にレベルアップを図っおいきたいず思っおいたす。たた本文脈においおも生成 AI ずどう付き合っおいくかは無芖できない芳点の䞀぀ですが、ただ量が出せればいいずいうわけではなく、圓然ながらそこには質や成果が䌎っおくるこずも重芁です。目先の数倀にずらわれすぎず、゚ンゞニア䞀人ひずりが玍埗感を持っお前向きに開発に取り組める状態を䜜るこず、䞀方で自分たちを客芳的に芋お内省するための仕組みず機䌚を甚意し、より良いチヌムずなっお顧客ぞの䟡倀提䟛サむクルを早めおいくこずが求められるのだろうず思いたす。 BASE では、今埌のプロダクト成長を支える技術戊略や開発基盀の構築をリヌドしおいただける゚ンゞニアを募集しおいたす。 ご興味があれば、ぜひ採甚情報をご芧ください。 binc.jp 明日の BASE アドベントカレンダヌは @okinaka さんの蚘事です。お楜しみに
アバタヌ