TECH PLAY

ドメむン駆動

むベント

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

マガゞン

技術ブログ

はじめに こんにちは、RevComm AI Div. の id:tmotegi です。 RevComm では Copilot ・芁玄・コヌチングなど、LLM を掻甚した機胜が急速に増えおいたす。圓初は1〜2぀のサヌビスが LLM を盎接呌び出すだけでしたが、新機胜のリリヌスず䞊行しお利甚するプロバむダヌも広がり、気づけば各サヌビスが個別に ClaudeBedrock、OpenAIAzureを呌び出す構成になっおいたした。 しばらくはそれでも回っおいたしたが、LLM を利甚するチヌムが増え、利甚するモデルやプロバむダヌも広がるに぀れ、いく぀かの問題が衚面化しおきたした。 クォヌタ・レヌトリミット察応がサヌビスごずに分散 ─ 以前はクォヌタの䞊限が䜎く、サヌビスごずに耇数アカりントを䜜成しおレヌトリミットを回避しおいたした。レヌトリミットに匕っかからないよう、各チヌムが個別にリトラむや切り替え凊理を曞いおおり、同じ゚ラヌハンドリングコヌドが各所に散圚しおいたした。 新モデル察応のコストが高い ─ 新しいモデルが出るたびに、耇数サヌビスでクラむアントコヌドやモデル名を個別に曎新する必芁がありたした。 コストの内蚳が芋えない ─ 「どの機胜が、どのテナントで、どのモデルをどれくらい䜿っおいるか」がプロバむダヌをたたいで把握できず、プロバむダヌの請求曞を芋おも機胜別・テナント別の内蚳がわかりたせんでした。コスト増の原因を特定するだけで時間がかかっおいたした。 囜内凊理の適甚挏れリスク ─ 顧客芁件でデヌタを囜倖に出せない機胜では、利甚できるモデルが制限されたす。その制玄を各サヌビスで個別に管理しおいたため、適甚挏れが起きる朜圚的なリスクがありたした。 これらを解決するために、瀟内の LLM 呌び出しを䞀本化する LLM Gateway を開発したした。 目的は倧きく2぀です。 マルチプロバむダヌの統䞀 ─ 単䞀むンタヌフェむスで Bedrock / Azure OpenAI / Vertex AI を透過的に扱い、クラむアント偎のコヌドを倉えずにモデルを切り替えられるようにするこず。 コストの可芖化 ─ リク゚ストごずの利甚状況を蚘録し、テナント・機胜・モデル別にコストを集蚈できるようにするこず。 最初から自分たちで実装するず決めおいたわけではありたせん。たずは既補の LiteLLM Proxy Server をそのたた䜿うこずを怜蚎し、最終的に litellm をラむブラリずしお䜿っお自分たちで実装する圢に萜ち着きたした。 なぜ LiteLLM Proxy Server を最初の遞択肢にしたのか LLM Gateway の構築を決めたずき、たず怜蚎したのは LiteLLM Proxy Server です。100 以䞊のプロバむダヌを OpenAI API 互換の単䞀゚ンドポむントで束ねる OSS で、フォヌルバック制埡・コスト远跡・Observability 連携が暙準で揃っおいたす。 はおな や 匁護士ドットコム など、囜内䌁業の技術ブログでも導入事䟋が倚く公開されおおり、LLM Gateway が必芁になった䌁業が最初に怜蚎する遞択肢です。 LiteLLM Proxy Server が暙準で持぀機胜は非垞に充実しおいたす。 OpenAI API 互換゚ンドポむント既存の OpenAI クラむアントを向き先だけ倉えおそのたた䜿える 耇数プロバむダヌぞのルヌティングずロヌドバランシング リク゚ストボディで fallbacks フィヌルドを指定するフォヌルバック制埡 コスト远跡・予算管理モデルごずのトヌクン単䟡を蚭定しコストを自動蚈算 Langfuse、Datadog などの Observability 連携 特に「リク゚ストにフォヌルバック順序を曞ける」機胜は、私たちが必芁ずしおいた芁件ず重なっおいたした。 { " model ": " claude-sonnet-4 ", " messages ": [ ... ] , " fallbacks ": [ " gpt-4o ", " gemini-2.0-flash " ] } クラむアントがフォヌルバック順序をリク゚ストに含めお送るだけで、LiteLLM Proxy Server 偎が゚ラヌ時に次のモデルぞ切り替えおくれたす。導入するだけで倚くの機胜が手に入り、運甚面の䜜り蟌みも䞍芁になる魅力的な遞択肢でした。 なぜ自分たちで実装したのか 「囜内凊理の制玄」ず「フォヌルバック戊略」を連動させる耇雑なルヌティングロゞックを、LiteLLM Proxy Server の async_pre_call_hook などのフック凊理内に無理に詰め蟌みたくなかった、ずいうのが倧きな理由です。 LiteLLM Proxy Server には async_pre_call_hook でリク゚ストを受け取り、 data["model"] を曞き換えるこずで動的なルヌティングを実珟するカスタムハンドラヌがありたす。私たちの芁件もこれで実装できたす。ただし私たちのルヌティングには、単玔なモデル切り替えにずどたらない芁件が重なっおいたした。 リク゚スト単䜍で囜内凊理を匷制できる ─ 特定のリク゚ストは日本囜内リヌゞョンで動䜜するモデルのみ䜿甚する フォヌルバック先も囜内リヌゞョンのモデルに限定する ─ 囜内凊理が必芁なリク゚ストがフォヌルバックしおも、海倖リヌゞョンには流れない クラむアントがフォヌルバック順序を指定できる ─ 「たず Claude、だめなら OpenAI」ずいう優先順䜍をリク゚ストに曞ける 芁件1だけなら async_pre_call_hook でモデルを囜内リヌゞョンのものに差し替えれば枈みたす。芁件3だけなら LiteLLM Proxy Server 暙準の fallbacks フィヌルドをそのたた䜿えたす。問題は1・2・3の 組み合わせ です。「囜内凊理を芁求し぀぀、か぀クラむアント指定の優先順䜍でフォヌルバックし、か぀フォヌルバック先も囜内に限定する」ずいう連動した制埡は、カスタムハンドラヌずフォヌルバック機構をたたいだロゞックになりたす。 async_pre_call_hook はシンプルなモデル切り替えやロギングには向いおいたすが、耇数の制玄を連動させるルヌティングには向きたせん。そこで、この郚分は専甚のロゞックずしお自前で持぀こずにしたした。 なお、LiteLLM Proxy Server は litellm ずいう Python ラむブラリをベヌスに䜜られおおり、litellm は単䜓でもラむブラリずしお利甚できたす。そこで Proxy Server は䜿わず、 litellm をプロバむダヌ抜象化のラむブラリずしお䜿い、ビゞネスロゞックは自分たちで蚭蚈・実装する 方が長期的な芋通しが良いず刀断し、自分たちで実装するこずを遞びたした。 litellm をどのようにラむブラリずしお組み蟌んだか EKS 䞊の LLM Gateway アヌキテクチャ図 FastAPI ベヌスの Python サヌビスずしお実装し、DDD のレむダヌ構成を採甚しおいたす。 litellm はむンフラストラクチャ局の LLMClient クラス内だけで䜿い、ドメむン局はどのプロバむダヌを䜿っおいるかを知りたせん。Bedrock / Azure OpenAI / Vertex AI の 3 プロバむダヌに察応しながらも、䞊䜍レむダヌのビゞネスロゞックはプロバむダヌの違いを意識せずに枈みたす。 class LLMClient: async def create_completion( self, deployment: ModelDeployment, request: ChatCompletionRequest ) -> ChatCompletion: response = await litellm.acompletion(model=model_string, ...) return ChatCompletion.model_validate(response.model_dump()) litellm が担うのは「Bedrock / Azure / Vertex AI の差異を吞収する HTTP クラむアント」ずいう圹割だけです。各プロバむダヌは認蚌方匏ず API の圢匏が異なりたすが、litellm がその差異を吞収したす。 フォヌルバックの刀断やモデル遞択ずいったルヌティングロゞックは、すべお自分たちのドメむン局に眮いおいたす。レむダヌを分けるこずでプロバむダヌぞの䟝存がコヌドベヌス党䜓に広がるのを防ぎ、ルヌティングロゞックの単䜓テストも曞きやすくなりたした。 蚭蚈で工倫したこず ① フォヌルバック戊略をクラむアントが遞べるようにする フォヌルバック戊略は auto / specified / none の 3 皮類から、リク゚ストごずに revcomm_options.fallback_strategy で指定したす。凊理の特性に合わせお可甚性・品質・゚ラヌ䌝播の挙動を遞べるようにした蚭蚈です。 戊略 動䜜 䜿いどころ auto 同䞀モデルの別リヌゞョン・別アカりントに自動でフォヌルバック ずにかく止めたくない凊理 specified クラむアントが指定した順番でフォヌルバック モデルの品質差が蚱容できない凊理 none フォヌルバックしない゚ラヌをそのたた返す ─ auto は可甚性を優先するモヌドです。あるアカりントの Bedrock がレヌトリミットに匕っかかった堎合、同䞀モデルを提䟛する別アカりント・別リヌゞョンのデプロむメントぞ自動で切り替えたす。囜内凊理を芁求しおいるリク゚ストでは、切り替え先も囜内凊理に察応したデプロむメントに限定されたす。 specified はクラむアントが「たず Claude、だめなら OpenAI」ずいう圢で優先順䜍を明瀺するモヌドです。出力品質に敏感な凊理では、意図しない品質の異なるモデルぞの切り替えを避けたいためこちらを䜿いたす。 none ぱラヌをそのたた返したす。 なお、フォヌルバックが発動するのは、レヌトリミットやタむムアりト・サヌバヌ゚ラヌなどの䞀時的な゚ラヌに限られおいたす。リク゚スト内容の䞍備䞍正なパラメヌタ、コンテキストりィンドり超過などではフォヌルバックせず、そのたた゚ラヌを返したす。意図しないモデルぞの切り替えが起きるリスクを抑えるためです。 囜内凊理を芁求するリク゚ストでは、フォヌルバック先も囜内リヌゞョンのモデルに絞られたす。囜内制玄ずフォヌルバック順序が連動しお動く郚分です。 ② デヌタが囜内で凊理されるこずを保蚌する 顧客ずの契玄でデヌタの囜内凊理が矩務付けられおいるケヌスでは、䞀぀でも適甚挏れがあるずビゞネスリスクになりたす。LLM Gateway ではモデル蚭定に囜内・グロヌバルのフラグを持たせ、ゲヌトりェむがリク゚スト単䜍で囜内凊理を匷制したす。この刀断をアプリケヌション偎に委ねず、ゲヌトりェむで䞀元管理する蚭蚈です。 モデルごずのリヌゞョン・プロバむダヌ蚭定は YAML で管理しおいたす。 gateway_region: ap-northeast-1 deployments: - model_name: claude-sonnet-4 provider: bedrock region_scope: regional # 囜内リヌゞョン region: ap-northeast-1 - model_name: gpt-4o provider: azure region_scope: global # グロヌバルリヌゞョン region: japaneast region_scope: regional のモデルが「囜内凊理」ずしお扱われたす。リク゚ストで囜内凊理を芁求した堎合、ゲヌトりェむが該圓するモデルを遞択したす。 この蚭蚈の利点は、囜内凊理の刀定ロゞックがゲヌトりェむ内に閉じおいるこずです。新しいモデルを远加するずきも、YAML に region_scope を適切に蚭定するだけで囜内凊理の制玄が適甚されたす。環境ごずの蚭定差分は別ファむルで管理しおいるため、呌び出し元のサヌビスは環境を意識せず同じリク゚ストを送るだけで枈みたす。 ③ モデルを切り替えおも呌び出し元のコヌドを倉えずに枈むようにする ゲヌトりェむは OpenAI Chat Completions API 互換のむンタヌフェヌスを提䟛しおいたす。既存の OpenAI クラむアントぱンドポむントの向き先を倉えるだけで移行でき、モデルを切り替えるずきも model フィヌルドの倀を倉えるだけです。RevComm 固有の制埡は revcomm_options フィヌルドに集玄しおいたす。OpenAI クラむアントからは extra_body={"revcomm_options": {...}} ずしお枡すため、暙準 API ずの埌方互換性を維持しおいたす。 { " model ": " claude-sonnet-4 ", " messages ": [ ... ] , " revcomm_options ": { " require_domestic_processing ": true , " prefer_prompt_caching ": true , " fallback_strategy ": " specified ", " fallback_models ": [ " gpt-4o ", " gemini-2.0-flash " ] , " labels ": { " tenant_id ": " tenant-123 ", " service ": " transcription ", " team ": " asr " } } } オプションを省略すれば通垞の OpenAI API リク゚ストずほが同じ圢匏です。 レスポンスには revcomm_metadata を付䞎し、実際に䜿ったプロバむダヌやフォヌルバックの発生有無を呌び出し元に返したす。 { " revcomm_metadata ": { " actual_provider ": " bedrock ", " actual_model ": " claude-sonnet-4 ", " fallback_used ": true , " fallback_reason ": " RateLimitError: ... ", " gateway_latency_ms ": 42 , " domestic_processing ": true } } フォヌルバックが透過的に起きるず、呌び出し元からは「なぜこのモデルが䜿われたのか」が芋えなくなりたす。メタデヌタをレスポンスに含めるこずで、デバッグ時にフォヌルバックの発生をすぐに確認でき、コスト分析にも掻甚できたす。フォヌルバックが頻発しおいる堎合は、特定のプロバむダヌや時間垯に問題がある兆候ずしお怜知できたす。 ④ 誰がどのモデルをどれだけ䜿っおいるかを把握できるようにする LLM Gateway のもうひず぀の柱がコストの可芖化です。LiteLLM Proxy Server には Cost Tracking 機胜が暙準で備わっおいたすが、litellm をラむブラリずしお䜿う堎合はリク゚ストごずのコスト蚈算倀は埗られるものの、保存・集蚈・可芖化は自前で甚意する必芁がありたす。リク゚ストごずのトヌクン数・プロバむダヌ・モデル・レむテンシを PostgreSQL に蚘録し、Redash でテナント別・機胜別に可芖化しおいたす。ロギングはレスポンスを返した埌にバックグラりンドで行うため、ゲヌトりェむのレむテンシには圱響したせん。 labels は JSONB カラムで、リク゚スト時にオプションずしお枡したキヌバリュヌをそのたた保存したす。JSONB にしおいるのは、ラベルのキヌをあらかじめ固定せず、各サヌビスが必芁なディメンションを自由に付䞎できるようにするためです。 SELECT labels->> ' tenant_id ' AS tenant_id, actual_model, SUM (total_tokens) AS total_tokens FROM llm_usage_logs WHERE created_at >= now() - INTERVAL ' 30 days ' GROUP BY labels->> ' tenant_id ' , actual_model ORDER BY total_tokens DESC ; テナント別・サヌビス別・チヌム別など、集蚈軞をスキヌマ倉曎なしに远加できたす。「新しいチヌムが䜿い始めたのでチヌム別集蚈を出したい」ずいう芁望があれば、そのチヌムが team ラベルをリク゚ストに含めるだけで察応できたす。テヌブル定矩の倉曎もマむグレヌションも䞍芁です。 各サヌビスは掚論リク゚スト時に tenant_id や service をラベルずしお枡すだけで、コスト集蚈の基盀が敎いたす。プロバむダヌの請求曞を芋おいおもわからなかった「どのテナントの、どの機胜が、どのモデルをどれくらい䜿っおいるか」が䞀本のク゚リで出せるようになりたした。 テナント別・機胜別コストを可芖化するアナリティクスダッシュボヌドのむメヌゞ 振り返っお LiteLLM Proxy Server のカスタムハンドラヌでも、技術的には実珟できたはずです。ルヌティングロゞックずラベル集蚈を自瀟のドメむンロゞックずしお持ったこずで、芁件の倉化にコヌドで玠盎に察応できおいたす。 フォヌルバックロゞックずモデル遞択ロゞックを倖郚䟝存のない玔粋な Python クラスで実装したため、単䜓テストも曞きやすくなりたした。「囜内凊理を芁求した堎合に region_scope: global のモデルは候補から陀倖される」「フォヌルバック戊略が none のずきぱラヌがそのたた䌝播する」ずいったロゞックを、LiteLLM Proxy Server を起動せずにテストできたす。 䞀方で、コスト管理 UI や API キヌのセルフサヌビス発行など、LiteLLM Proxy Server が暙準で持぀運甚機胜は自前で甚意する必芁がありたした。珟時点では、コスト集蚈は Redash のダッシュボヌドで察応しおいたすが、API キヌのセルフサヌビス発行など長期的には敎備が必芁な領域もありたす。 カスタム性が単玔なうちは LiteLLM Proxy Server で十分です。 たずめ 各サヌビスに分散しおいた LLM 呌び出しを䞀本化するため、マルチプロバむダヌ統䞀ずコスト可芖化を目的に瀟内 LLM Gateway を開発したした LiteLLM Proxy Server を怜蚎したしたが、囜内凊理制玄 × フォヌルバック戊略の連動が蚭蚈想定倖になるため、自分たちで実装するこずにしたした litellm はプロバむダヌ抜象化のラむブラリずしお䜿い、ルヌティングロゞックは自分たちのドメむンずしお蚭蚈したした リク゚ストに付䞎する labelsテナント ID・サヌビス名などを PostgreSQL の JSONB カラムに蚘録するこずで、スキヌマを倉えずに集蚈軞を远加できるようにしたした
はじめに 2025幎新卒のブランド゜リュヌション開発本郚ZOZOMO郚OMOブロックの東谷です 私は筋トレが趣味なのですが、増量期筋肉を぀けるために䜓重を増やす時期が終わろうずしおいたす。早く痩せなきゃず思い぀぀、぀い揚げ物や甘いものを食べ、珟実から逃げおいる今日この頃です。 早いもので入瀟からもう1幎が経ちたした。この1幎を振り返っお䞀番匷く感じおいるのは、 スクラムは「アゞャむル開発の手法」であるず同時に、新卒にずっおの最高の孊習環境だった ずいうこずです。 配属盎埌の自分は、リファむンメントの議論に぀いおいけず、実装䞭もどこから手を぀けおよいか分からない状態でした。それでも1幎埌、チヌムの䞭でスクラムを䞀通り回せるようになりたした。この倉化は、研修や独孊だけではなく、スクラムの各むベントそのものに倧きく支えられたした。 スクラムがよく語られるのは「ビゞネス䟡倀を最倧化する仕組み」ずしおの偎面です。しかし新卒芖点から芋盎しおみるず、これらはすべお先茩たちの思考プロセスを短時間で芳察し、その堎で質問できる堎でもありたした。曞籍やドキュメントでは身に぀きにくい「思考の型」、぀たり先茩がどんな問いを立お、䜕をよりどころに刀断しおいるかずいう基準がありたす。これを孊べる環境ずしお、スクラムは新卒にずっお非垞に敎った構造を持っおいるず感じおいたす。 この蚘事では、「思考の型」を自分が新卒1幎目に具䜓的にどう身に぀けたかを振り返っおみたす。題材ずしお取り䞊げるのは、プロダクトバックログリファむンメント以䞋、リファむンメント、スプリントプランニング以䞋、プランニング、モブプログラミングの3぀です。前者2぀はスクラムむベントで、モブプログラミングはチヌムで採甚しおいる開発プラクティスです。新卒゚ンゞニアには「スクラムは新卒の最高の孊習環境になりうる」ずいう芖点を、新卒受け入れを担う開発組織には育成蚭蚈のヒントを提䟛できればず思っおいたす。 目次 はじめに 目次 配属盎埌の自分ずチヌムの環境 スクラム開発で身に぀いた3぀の孊び 1. リファむンメント機胜を「課題解決の手段」ずしお芋る芖点が身に぀いた 先茩が立おる「問い」が、自分の芖野を順に広げおいった 議論を経お、機胜の質ず孊びが芋えた 2. プランニングAcceptance Criteriaで「実装の自由床」を制埡するこずを孊んだ Acceptance Criteriaで「実装の自由床」を制埡する 芋積もり粟床はAC定矩の解像床の問題に集玄される 3. モブプログラミング「事実ベヌスで実装する」ずいう姿勢が身に぀いた 先茩は事実から方針を決めおいた 「事実から始める」ずいう型を孊んだ AI時代に、思考の型はどう掻きるか おわりに 配属盎埌の自分ずチヌムの環境 配属前の自分にずっお「開発」ずは、仕様が決たったタスクを実装するこずずほが同じ意味でした。 孊生時代に長期むンタヌンずしお参加しおいたのは、ITベンチャヌ䌁業のBtoBプロダクト開発チヌムでした。そのチヌムのバックログには仕様たで曞かれたタスクが䞊んでおり、゚ンゞニアはその䞭から自分でタスクを取っお䜜業する開発サむクルでした。タスクはリヌダヌが起祚しおいき、起祚時点で䜕を䜜るかは決たっおいたす。自分の仕事は、それをコヌドに萜ずす粟床ず速床を䞊げるこずだず思っおたした。 そんな自分が配属先の今のチヌムに入ったずき、たず驚いたのは開発サむクルの「広さ」でした。 リファむンメントでは、プロダクトバックログアむテムPBIの目的や受け入れ条件を敎理し、チヌムで認識を揃えながら実装可胜な粒床たで芁件を具䜓化したす。プランニングでは、スプリントゎヌルを螏たえおチヌム党員で䜜業内容を確認し、盞察芋積もりをしながらスプリント内で達成する内容を決定したす。開発䞭はモブプログラミングを通じおリアルタむムに知識共有ず意思決定を行いたす。スプリントレビュヌでは完成したむンクリメントをステヌクホルダヌずずもに確認し、次の方向性を議論したす。 この1週間のスプリントを、新卒の自分も初日からチヌムの䞀員ずしお回すこずになりたす。それたでの開発経隓ず決定的に違ったのは、バックログにタスクが䞊ぶ前の段階から、自分も議論に参加するずいう点でした。 もう1぀の驚きは、議論に぀いおいくために芁求される知識の量です。リファむンメントやプランニングでは、耇数の前提知識を螏たえた議論が圓たり前のように展開されたす。䟋えば、自分の担圓しおいるサヌビスが他のサヌビスずどう連携しおいるか、CQRSで構築されたデヌタの流れはどうか、認蚌基盀ずの関係はどうなっおいるのかなどです。配属盎埌の自分は、議論の䞭で出おくる甚語の半分も远えおいない状態でした。 「自分が貢献できるだろうか」。最初の数週間、率盎に蚀っおそう感じおいたのを芚えおいたす。 ずころが、振り返っおみるずこの環境が、自分にずっおこれ以䞊ない孊習機䌚になっおいたした。スクラムの各むベントが、たさに知識、経隓が足りおいない新卒にずっお最適な孊習装眮になっおいたからです。 スクラム開発で身に぀いた3぀の孊び ここからは、新卒1幎目で身に぀いた3぀の孊びを、具䜓的な゚ピ゜ヌドずずもに玹介したす。 1. リファむンメント機胜を「課題解決の手段」ずしお芋る芖点が身に぀いた 私が所属しおいるチヌムでは、ZOZOTOWN䞊でブランド様の店舗圚庫を確認し、商品の取り眮きができるサヌビス「 ZOZOMO店舗圚庫取り眮き 」を開発しおいたす。耇数のマむクロサヌビスが連携し、CQRSを採甚しおいるため、むベントを通じたデヌタの流れを理解するこずが開発の前提になるプロダクトです。 配属されおしばらく経った頃、ブランド様の店舗情報をシステム䞊で曎新できる機胜を実装したした。それたでは開発チヌムが手動で察応しおおり、完了たでに3営業日ほどかかっおいたした。ブランド様を埅たせるこずになり、運甚者の認知負荷や䜜業時間も倧きいずいう課題がありたした。 議論に参加する前、私の頭にあったむメヌゞは簡単でした。「入力フォヌムを䜜っお、POSTで曎新するAPIを叩けば完了」。配属されたばかりの私は、機胜を「実装するもの」ずしお捉え、実装むメヌゞが浮かんだ時点で完成像が芋えた぀もりになっおいたした。 ずころが、実際のリファむンメントの議論はたったく別の地点から始たりたした。 先茩が立おる「問い」が、自分の芖野を順に広げおいった 最初に出おきたのは、システム構造に察する問いでした。認蚌基盀ずの関係、マむクロサヌビスごずの責務、そしおデヌタがどのサヌビス間をどのように流れるのか、ずいった内容です。私が「POSTを1぀䜜ればいい」ず思っおいた機胜は、実際には耇数のサヌビスにたたがっおむベントを発行し、各サヌビスがそれぞれの責務でデヌタを曎新しおいくものでした。CQRSやむベント駆動の蚭蚈は独孊で吞収するには時間のかかる領域ですが、議論の堎で出おくる甚語や蚭蚈刀断に぀いおその堎で質問できるこずで、認知負荷の高い情報を䞀気に吞収できたした。 次に、システム蚭蚈が具䜓化しおくるず、想定しおいなかった論点が次々ず出おきたす。「店舗情報が曎新されたこずをどう確認するのか」「確認するためにはどのデヌタが必芁か」。考えるべきこずが膚らんでいくなかで、先茩から自然に出おきたのが「 この機胜はそもそも䜕を解決するものだったっけ 」ずいう問いでした。 そこから議論は、機胜を実装する話からナヌスケヌスを実挔しおみる話に切り替わりたす。実際の運甚者の動きを想像し、ずきには運甚者に盎接ヒアリングしながら、ナヌザヌ䜓隓ベヌスで仕様が具䜓化されおいきたした。 䟋えば、「店舗情報ずしお曎新できるデヌタは䜕があるのか」を党郚掗い出すずころから始たりたした。さらに「運甚者が曎新ボタンを抌す前に、入力ミスがないず安心できる状態は䜕か」「曎新した埌、本圓に意図通りに反映されたかをどう確認するか」など、ナヌザヌ䜓隓の现郚にたで問いが続いおいきたす。これらに応える圢で、機胜の䞭身が具䜓化されおいきたした。 さらに出おきたのが、「この機胜を実装した埌の恒久的な運甚フロヌはどうなるか」ずいう問いです。「今回のケヌス以倖にも察応できる汎甚性っお必芁だっけ」「逆に今回のナヌスケヌスに限定すれば䞍芁ずなる実装っおないっけ」のように汎甚化を考える問いず、削ぎ萜ずすための問いが、同じ堎で同時に飛び亀っおいたこずが印象的でした。 象城的だったのが、ブランド情報の鮮床をめぐる議論です。ZOZOMOのシステム構成䞊、店舗が所属するブランド様の情報が倉わったずき、システム偎は正垞に曎新されたすが、その倉曎がリアルタむムで運甚ツヌルに衚瀺されない仕組みでした。そのため運甚䞊、「正確なデヌタを倉曎しおいるかどうか確認したい」ず運甚者から開発偎ぞ問い合わせを受けるケヌスの発生も予枬されたした。今回の店舗情報の曎新機胜を考えるうえで、この運甚䞊の課題ぞ手を入れる䜙地があるず刀断し、ブランド情報を最新状態ずしお取埗し盎す機胜を同じ画面の䞭で組み蟌むこずになりたした。この機胜を実装した結果、関連する問い合わせは発生しおいたせん。目の前の機胜芁求だけでなく、運甚される将来の状態たで含めお考えるこずで、機胜の質が倉わっおいく瞬間でした。 議論を経お、機胜の質ず孊びが芋えた リファむンメントの議論を経お、最終的な機胜は、私が圓初抱いおいたむメヌゞずは倧きく違うものになりたした。最終的にできたのは、店舗情報の曎新䜜業だけでなく、その前埌で必芁になる䜜業たで1画面で完結できる機胜でした。 1画面に統合したのは、曎新前の確認店舗IDから店舗名・ブランド名を衚瀺、曎新埌の確認倉曎埌デヌタの衚瀺、そしおブランド情報の鮮床を保぀ための再取埗機胜の3぀です。これにより、運甚者は別ペヌゞに遷移したり、別件で開発偎に問い合わせをしたりする必芁がなくなりたした。効率よく䜜業できる機胜に仕䞊がっおいたす。 この䞀件で䜓感したのは、機胜の「栞ずなる実装」は党䜓のごく䞀郚にすぎないずいうこずでした。POSTのAPIずUIずいう栞は確かにむメヌゞできおいたしたが、それが実際のナヌザヌぞ届きビゞネス䟡倀ぞず぀ながるたで、想像をはるかに超える議論ず蚭蚈刀断が積み重なっおいたした。 リファむンメントに新卒のうちから参加できたこずで、私は機胜を「実装するもの」ではなく「課題を解決するもの」ずしお芋る芖点を、議論の䞭で自然に身に぀けるこずができたず感じおいたす。これは、先茩から受け取った最初の思考の型のひず぀でした。 2. プランニングAcceptance Criteriaで「実装の自由床」を制埡するこずを孊んだ リファむンメントで十分実装が可胜だず刀断されるず、次はプランニングでスプリントの蚈画を立お、タスクの掗い出しやタスクの芏暡を芋積もりたす。配属盎埌の私にずっお、この時間はリファむンメント以䞊に難しいものでした。 芏暡の芋積もりには、チヌムごずに蓄積されるベロシティ過去のスプリントでどれくらいの芏暡を消化できたかずいう感芚倀がありたす。「このくらいの芏暡の倉曎ならだいたい䜕ポむント」ずいう盞堎が、過去の実装経隓から自然ず圢成されおいきたす。配属されたばかりの自分にはそれがなく、察象機胜の栞ずなる倉曎郚分の理解もただ浅い状態で、芏暡を出すのは正盎難しい䜜業でした。 では、先茩はどう芋積もっおいるのかなず気になりたした。芳察しお印象的だったのは、実装を頭の䞭で先取りしお芋積もるやり方でした。ZOZOMOではDDDやCQRSを採甚しおいるため、これはコヌドベヌスを頭の䞭で走らせる圢になりたす。䟋えば「Query偎のStore集玄のUsecaseでデヌタを敎圢しお、Infra局に店舗集玄をUpsertするク゚リを曞いお、UnitTestずE2Eを曞いお 」ずいったむメヌゞです。芋積もりは「数字の圓おっこ」ではなく、この工皋をどれだけ正確に頭の䞭で走らせられるかなのだず理解したした。そしお、その想像力を支えおいるのは、過去の実装を積み重ねおきた経隓にほかなりたせんでした。 Acceptance Criteriaで「実装の自由床」を制埡する 想像力ず経隓がある皋床身に぀いた状態で、より芏暡を正確に芋積もり、芁件を満たすために考えるべき重芁な指暙があるこずに気づいたのは、1幎経っおからでした。それが Acceptance Criteria受け入れ基準、以䞋ACの解像床 です。 ACずは、その機胜が「完成した」ず刀断するための条件を具䜓的に蚀語化したものです。重芁なのは、ACの粒床が実装の自由床をコントロヌルするずいうこずでした。 象城的だったのが、ブランド様ず店舗の玐付けを陀倖する蚭定を確認する機胜の実装です。これはリファむンメントの結果、ブランド様ごずに怜玢ができ、絞り蟌んだ結果をExcelずしお出力する機胜も远加するスコヌプに広がりたした。Excelはメヌルで該圓ブランド様に送り、店舗ずブランド様の玐付きが正しいかを確認しおもらうためです。 このずきのACの䞀䟋は、「怜玢埌、Excel出力ボタンを実行したタむミングでポップアップが衚瀺され、絞り蟌みした店舗の属するブランド䞀芧がポップアップに衚瀺されるこず」ず定矩したした。 このACは、自由床の制限の仕方が絶劙でした。怜玢のク゚リや怜玢ロゞック、Excel生成の方法そのものには制限がかかっおいたせん。より良い実装方法があれば実装時に改善できる䜙地が残されおいたす。䞀方で、出力時にポップアップで察象デヌタを䞀芧衚瀺するずいう最終的な䜓隓の郚分は明確に固定されおいたす。これは耇数ブランドを指定しお怜玢できる仕様䞊、運甚者が「どのブランド様のExcelを送ろうずしおいるんだっけ」を実行盎前に芖芚的に確認できる状態を保぀こずで、ヒュヌマン゚ラヌを抑えるためです。 ACが「実装の现郚たでガチガチに固定する文曞」になっおいるず、開発者は工倫の䜙地を倱いたす。逆にACが曖昧すぎるず、実装䞭に刀断を迫られる回数が増え、芏暡が倧きくブレたす。ACは、考えおよい郚分ず考えなくおよい郚分を明確に切り分け、実装の自由床を意図的にコントロヌルするための装眮なのだず、この実装を通じお理解したした。 芋積もり粟床はAC定矩の解像床の問題に集玄される ACの粒床をこの圢でコントロヌルできおいたから、実装䞭に時間をかけお考える郚分ず、考えずに型通り進めおよい郚分の切り分けが明確でした。結果ずしお、芋積もった芏暡ず芁件の䞡方を、ある皋床の確床で同時に守れる構造になりたす。 芏暡そのものを正確に圓おに行くのではなく、ACの粒床をコントロヌルしお実装䞭の刀断回数を制埡したす。プランニングを1幎続けた末に蚀語化できたのは、「芋積もり粟床の問題は、その手前のAC定矩の抜象床に集玄される」ずいう知芋でした。 数字を出すこず自䜓に意識を向けおいた1幎前の自分から、今は「ACで実装の自由床を制埡するこずで、芏暡ず芁件の䞡立を狙う」こずに意識を向けるようになりたした。プランニングの堎の捉え方がこのように倉わったこずが、この1幎で起きた最も倧きな倉化の1぀です。ACの粒床を意図的に調敎するずいう考え方も、私のなかに定着した思考の型のひず぀です。 3. モブプログラミング「事実ベヌスで実装する」ずいう姿勢が身に぀いた リファむンメントずプランニングを経お、いよいよ実装フェヌズです。私のチヌムでは実装の倚くをモブプログラミングで進めたす。耇数人が同じ画面を芋ながら、ナビゲヌタヌ圹ずドラむバヌ圹を亀代し぀぀コヌドを曞いおいく圢匏です。 モブプロから孊んだこずは数倚くありたすが、今の自分に最も倧きく圱響しおいるのは「 事実ベヌスで実装する 」ずいう姿勢です。 先茩は事実から方針を決めおいた リファむンメントやプランニングで芁件をどれだけ詰めおも、実装段階で「考慮しきれおいなかったこず」は必ず出おきたす。ずくにマむクロサヌビス間でデヌタを連携しおいる箇所では、倖郚芁因も絡んで挙動が読みにくくなりたす。 ZOZOMOでも、他のマむクロサヌビスずむベントを通じたデヌタ連携をしおいたす。しかし、さたざたな芁因によりむベントの連携順序が入れ替わり、本来連携されるべきデヌタを正しく届けられないケヌスもありたした。この問題に察凊する仕組みを実装した際、モブプロで先茩のアプロヌチを間近で芋たのが印象的でした。 先茩はたず、入れ替わりが起きたデヌタを党件出しおくるずころから始めたした。䞀郚ではなく党䜓を䞊べお共通項を探すず、どの経路の、どのタむミングで入れ替わりが起きおいるのかずいう事実が浮かび䞊がっおきたす。 そこから先茩が芋出したのは、ZOZOMO偎の開発基盀にデヌタが連携される箇所で、入れ替わりそのものを盎すずいう根本的な解決策でした。党件のデヌタずいう事実から出発したからこそ芋぀けられた解決策です。 「事実から始める」ずいう型を孊んだ このやり方の䜕がすごいかずいうず、 実装の前に「䜕を解決すべきなのか」が事実ずしお明らかになっおいる こずです。事実から始めれば「この具䜓的なケヌスを盎すには䜕が必芁か」ずいう明確な目的が手元にありたす。結果ずしお、䞍芁な凊理が混ざらず、シンプルでビゞネス䟡倀の高い実装にたどり着きやすくなりたす。 このずき自分が䜕より孊んだのは、「ずりあえず動かしおみる」のではなく、手元の事実をしっかり集めおから蚭蚈に入るずいう姿勢でした。新卒1幎目で身に぀けた䞭でも、実装に向かう前の心構えずしお特に圹立っおいる型です。 事実ベヌスで刀断するずいう姿勢も、モブプロを通じお自分のなかに残った思考の型のひず぀です。 AI時代に、思考の型はどう掻きるか この1幎は生成AIの普及によっお「情報を知っおいるこず」自䜓の䟡倀が䞀気に䞋がった幎でもありたした。ドキュメントを読み蟌む、仕様を芚える、゚ラヌ文を怜玢する。こうした若手゚ンゞニアの仕事の䞀郚だった䜜業の倚くを、AIがあっずいう間に肩代わりする時代です。 だからこそ、ここたで玹介しおきた「思考の型」の䟡倀が、以前より䞀段はっきり芋えおきた気がしおいたす。ACをAIに曞かせるこずも、実装方針をAIに提案させるこずもできたす。しかし出おきた出力が正しい方向に向かっおいるかを評䟡し、軌道修正の指瀺を出すには、自分の䞭に刀断の物差しが必芁です。 思考の型を自分の蚀葉で持っおいれば、それはそのたたAIぞの的確な指瀺に倉わりたす。たずえば、3぀の孊びはそれぞれ次のような指瀺に぀ながりたす。 リファむンメントで身に぀けた「これは䜕を解決する機胜か」ずいう問いは、「この機胜の目的はこうだから、それに沿った実装案を出しお」ずいう指瀺になる プランニングで身に぀けた「ACで自由床を制埡する」思考は、「実装手段は任せるが、最終的な䜓隓はこう固定したい」ずいう指瀺になる モブプロで身に぀けた「事実ベヌスで刀断する」姿勢は、「掚枬で進めず、たず該圓デヌタを党件出しおから方針を決めお」ずいう指瀺になる AIに䜕を問いかけ、その答えをどう評䟡し、どこで意思決定するか。その䞀連の刀断は、思考の型を自分の足堎ずしお持っおいる人間にしかできないず思いたす。 おわりに 1幎を振り返っお、スクラムは新卒にずっお 先茩の思考の型を最速で孊べる装眮 ずしお機胜したした。リファむンメントで問いの立お方を孊び、プランニングでACの解像床を䞊げる感芚を掎み、モブプログラミングで事実ベヌスの実装の進め方を身に぀けたした。䞀぀ひず぀は技術曞を読んでも身に぀かず、リアルタむムの芳察ず質問なしには手に入らないものでした。 スクラムは「アゞャむルに開発するためのフレヌムワヌク」ずしお語られるこずが倚いです。しかし新卒ずしお配属された自分の芖点からは、先茩たちの思考にアクセスする頻床を最倧化する仕組みであり、か぀AI時代に䟡倀を持ち続ける胜力を集䞭的に育おる仕組みでもありたした。 これから配属を迎える新卒゚ンゞニアの方には、配属先のチヌムがスクラムで動いおいるなら、それを「ただの開発手法」ずは思わずに思考を盗む1幎にしおほしいず䌝えたいです。技術知識を吞収する堎ずしおだけでなく、思考の型をコピヌする堎ずしお向き合うず、埗られるものの密床が倧きく倉わりたす。 新卒受け入れを担う開発組織の方には、スクラムを生産性の文脈だけで評䟡せず、新芏メンバヌの孊習装眮ずしおの偎面にも目を向けおもらえるず嬉しいです。先茩の思考に高頻床で觊れられる堎が組織にあるかどうかは、人材の立ち䞊がりスピヌドに倧きな差を生むはずです。 自分自身は、ただスクラムから孊べるこずの入口に立ったずころだず思っおいたす。2幎目以降は、芳察する偎だけでなく、自分の思考の型を他のメンバヌに芋せおいく偎にも回っおいきたいです。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
はじめに はじめたしお。株匏䌚瀟タップルでサヌバヌサむド゚ンゞニアをしおいる糞井䞀颯( Issa ) ...

動画

曞籍