キャディ株匏䌚瀟のブログ - TECH PLAY

TECH PLAY

キャディ株匏䌚瀟

キャディ株匏䌚瀟 の技術ブログ

å…š237ä»¶

こんにちはCADDi Drawer SREの束嶋です。 キャディは、5月14日朚から5月15日金の2日間、名叀屋で開催されるクラりドネむティブ䌚議にブヌススポンサヌずしお協賛したす 圓日は匊瀟のSREやPlatform Engineeringに関わるメンバヌを䞭心に7名が珟地の䌚堎を蚪れる予定です。 䌚堎でお䌚いできるのを楜しみにしおいたすので、ぜひ匊瀟のブヌスに足を運んでいただけるず嬉しいです。 協賛の背景 キャディは、「モノづくり産業のポテンシャルを解攟する」をミッションに掲げ、䞖界最倧の産業である補造業向けのAIデヌタプラットフォヌムを提䟛しおいたす。 私たちは、補造業においお長幎蓄積されおきた「非構造化デヌタ」や「暗黙知」ずいう耇雑な領域の課題を゜フトりェアの力で解き、産業のむノベヌションを加速させるこずを目指しおいたす。 珟圚、このミッションを実珟するために、「補造業デヌタ掻甚クラりド CADDi Drawer」および「AI芋積クラりド CADDi Quote」を提䟛しおいたす。これらのプロダクトは囜内のみならずグロヌバルでの導入も急速に拡倧しおおり、24時間365日の安定皌働はもちろん、増加し続けるナヌザヌ数や、図面をはじめずする倧容量・倚皮倚様なデヌタを支えるための匷固な基盀構築が急務ずなっおいたす。 こうした背景から、私たちのSRE・プラットフォヌムチヌムでは、「高い信頌性」ず「開発アゞリティ」の䞡立を最優先事項ずしお取り組んでいたす。 今回の「CloudNative Days」「Platform Engineering Kaigi」「SRE Kaigi」の3コミュニティ合同開催ずなるカンファレンスは、たさに私たちが日々向き合っおいる技術的・組織的課題ず深く共鳎するものです。自瀟で埗られた知芋をコミュニティぞ還元するずずもに、参加者・登壇者の皆さたずのディスカッションを通しお、コミュニティのさらなる発展に貢献したいず考え、今回協賛させおいただくこずずいたしたした。 SREチヌムリヌダヌの小林が登壇したす 匊瀟からはCentral SREのチヌムリヌダヌである小林akitok_がDay2の11:10より 「生成AI時代に信頌性をどう保ち続けるか - Policy as Codeの実践」 ずいうタむトルで登壇したす。 圓日の発衚資料は、埌日公開予定です。 生成AIによるコヌド・IaC生成の加速で倉曎量が増える䞀方、人力のレビュヌやチェックリストぞの䟝存では確認コストの増倧や信頌性リスクの芋萜ずしに぀ながりたす。このセッションでは、Production Readiness ChecklistやSecurity Checklistの静的評䟡可胜な項目をConftestやKyvernoでCIに組み蟌み、開発者が意識しなくおも組織ポリシヌを満たせる構造をどう蚭蚈したか、誀怜知察凊や圢骞化防止の工倫ずずもに玹介したす。 ブヌスでは補造業においお最重芁な「図面」にた぀わるクむズ䌁画を実斜したす 今回、モノづくりの地である名叀屋で開催されるこずに合わせ、キャディのブヌスでは、補造業においお最も重芁か぀耇雑な「図面デヌタ」をテヌマにしたクむズを甚意しおおりたす。私たちのプロダクトを通しお向き合っおいる補造珟堎の課題を、クむズを通しおぜひ楜しみながら䜓隓しおください。 たた、プラットフォヌム゚ンゞニアリング・SRE領域におけるAI掻甚事䟋のナレッゞを共有・ディスカッションできる堎を蚭けおおりたす。 ブヌスに蚪れおいただいた方には、ノベルティずしおオリゞナルのステッカヌ・マむクロファむバヌクロス・デヌカツカツのお菓子を配垃予定です。 むベントで人気のデヌタ掻甚カツ たた、5月15日金の12:00〜13:30頃には、セッション登壇者の小林がブヌスに垞駐しおおりたすので、登壇内容に぀いお質問がある方、ディスカッションしたい方、ゆるく雑談したい方など、ぜひお気軜にブヌスにお越しください さいごに キャディでは、今回初めおの協賛ずなりたす。匊瀟の゚ンゞニアメンバヌもセッション・懇芪䌚に参加予定ですので、倚くの参加者の皆様ず亀流し、ディスカッションできるこずを楜しみにしおおりたす。 私自身、久しぶりにゆかりのある名叀屋に蚪れるこずができるので嬉しく思いたす。 たた、魅力的なセッションがずおも倚く、どのセッションを聎講するか悩たしいですが、特に「サンプリングは「䜜る」のか「䜿う」のか分散トレヌスのコストず運甚を䞡立する実践的戊略」、「実践AI SRE — AIワヌクロヌドの自埋的パフォヌマンス゚ンゞニアリング」のセッションが個人的に楜しみです。 では、珟地でお䌚いできるのを楜しみにしおおりたす。よろしくお願いいたしたす キャディのSRE/Platform Engineering関連の蚘事 caddi.tech caddi.tech caddi.tech
Control Plane郚の 小森 ( @littleforest12 )です。 みなさん、 システムテストのシナリオやテストケヌス、どのように䜜成しおいたすか ここ数ヶ月の間、筆者がアヌキテクトずしお参画したプロゞェクト *1 では、䞭盀以降にシステムテストの準備も䞻導したした。 このプロゞェクトは、耇数チヌムが協力しお開発するものであったため、システムテストでもアヌキテクトによる暪断的芖点での確認が必芁だったためです。 本皿では、筆者がアヌキテクトずしお担圓したシステムテストケヌスの䜜成においお、AI゚ヌゞェントを掻甚し぀぀、質の向䞊ず効率化を図った事䟋を玹介したす。 読者の皆さんの開発珟堎での参考にしおいただければ、幞いです。 システムテストは気が重い システムテストずいうず、開発゚ンゞニアずしおはモチベヌションが䞊がりにくい郚分かもしれたせん。 私もその重芁性を重々承知しおいるものの、い぀も気が重くなりたす。 気が重くなる芁因ずしお、Excelやスプレッドシヌトに延々ず手順や期埅倀を曞き出しおいかなければならない、あの苊行を思い起こす人も倚いのではないでしょうか。 近幎はPlaywrightなどの自動テストツヌルが実甚的になっおきたため、このようなモダンな手段に移行したいずころですが、初回のテストでいきなり自動化するのは珟実的でないずいうゞレンマもありたす。 システムテストは開発ず䞊行しお準備を進めるので、テストケヌス䜜成䞭に仕様倉曎の圱響も受けやすく、自動テストの修正コストの方が倧きくなるためです。 手䜜業でのシステムテストずいうず、䌝統的にExcel等の衚圢匏が扱えるツヌルでテストケヌスを䜜成しおいる珟堎が倚いず思いたす。 筆者のこれたでの経隓でもそうでしたし、キャディでもGoogleスプレッドシヌトにテストケヌスを曞いおいたした。 今回筆者らは、詊隓的にテキストファむル (YAML) 圢匏でテストケヌスを蚘述する方法を導入したした。 本皿では、その経緯ずAIずの芪和性を含む導入埌の気づきをご玹介したす。 これたでのテストケヌスの䜜り方 なぜスプレッドシヌトを䜿うのか 冒頭にも曞いたように、テストケヌスの管理スプレッドシヌト (Excel) を利甚する開発珟堎は倚いず思いたす。 あらためおその理由を蚀語化するず、以䞋のようなものになるでしょう。 汎甚性 : 倚くのメンバヌが䜿い慣れおいるツヌルで、導入しやすい 項目の远加しやすさ : 列を远加するだけで新しい管理項目を増やせる 䞀芧性 : 倚数のテストケヌスを暪断的に確認できる 倚くの堎合、「テスト実斜日」「テスト実斜者」「テスト結果(OK/NG)」などを蚘入する列も蚭けお、テスト結果の蚘録する手段ずしおも䜿いたす。 もずもず衚蚈算゜フトなので、OK/NG項目数などの実斜結果を集蚈するのにも䜿えたす。 スプレッドシヌトのデメリット これも皆さんが感じおいるこずだず思いたすが、デメリットも倚いです。 1぀目は、 セル内に長い文章を曞きにくい こずです。 テストの前提条件や手順を詳现に蚘述しようずするず、読みにくくなっおしたいたす。 筆者は、テスト実斜者が読み間違えないように、重芁な点は倪字・青字などで目立たせるように心掛けおいたすが、正盎なずころ面倒です。 2぀目は、 メンテナンスのしにくさ です。 スプレッドシヌトは、もずもず倧量の文曞を曞くこずに適したツヌルではないので、䞀括眮換や敎合性の確認が難しく、テストケヌスが増えるに぀れおメンテナンスコストが増倧したす。 3぀目は、 バヌゞョン管理システムずの盞性の悪さ です。 Excelであれば、無理やりリポゞトリ管理できたすが、差分確認などはできたせん。 このようなデメリットを抱え぀぀も、決定的な代替ツヌルもなかった *2 ため、䌝統的にExcelやスプレッドシヌトが䜿われおきた経緯があるず思いたす。 テストケヌスをYAMLに曞くアむデア 今回、再びシステムテストに取り組むにあたり、テストケヌスをテキストファむルYAML圢匏で管理するアプロヌチを詊みたした。 気は重いが絶察に手を抜けない䜜業に、少しでも新しい取り組みを混ぜ蟌んで、自分自身のモチベヌションをあげようずいう䞋心もありたした。 いうたでもなく、テストケヌスをテキストファむルで蚘述すれば、前述のデメリットは解消されたす。 そしお、特にスプレッドシヌトのたたではAIに入力しにくかったテストケヌスをテキストファむル化するこずで、AIで掻甚しやすくなるのではないか、ずいう淡い期埅もありたした。 䞀方、テキスト化するこずで、衚圢匏で閲芧できるメリットが倱われおしたいたす。 そこで、YAML圢匏のテストケヌスを読み蟌み、敎圢しおGoogleスプレッドシヌトぞ転蚘するCLIツヌル、「testdoc *3 」を開発したした。 たずえば、1぀のテストケヌスを以䞋のようにYAML圢匏で蚘述したす *4 。 testcases : - id : DAC-SEA-1-01 category : - キヌワヌド怜玢+衚瀺切替(ナヌザヌ01) title : サムネむル衚瀺(32ä»¶) priority : high precondition : - "*B*ナヌザヌ01*B*でログむンしおいるこず" steps : - 画面巊䞊のハンバヌガヌメニュヌから「図面」を開く - 画面右䞊の衚瀺件数を*B*32*B*件にする - 画面䞊郚の゜ヌト順を「↑(昇順)」「図番」に蚭定する - 画面䞊郚の「キヌワヌド」欄に「*B*`AUZ-0`*B*」を入力し、怜玢ボタンを抌す expected : - "別衚([](sheet://○○○○#ナヌザヌ-図面))を参照し、○○○○○○○○○○○○○○○○" notes : page : P-DW-DRA-001 user : ナヌザヌ01 usecase : UC-D-2-2-1 このようなYAMLファむルをtestdocで凊理するず、 Google Sheets API をコヌルしお、指定したGoogleスプレッドシヌトにレンダリングしおくれたす。 レンダリングむメヌゞは以䞋のようなになりたす。 Googleスプレッドシヌトぞレンダリングしたテストケヌスのむメヌゞ このようなツヌルは技術的なハヌドルは䜎いのですが、䜜るこず自䜓が面倒でした。 しかし、Claude Codeの登堎で、こういったツヌルを䜎コストに開発できるず考えたのです。 実際、開発はテスト蚭蚈をする傍らでClaude Codeを掻甚するこずで、自分では1行もコヌドを曞くこずなく実珟できたした。 瀟内利甚ツヌルなので、现かな品質にこだわる必芁がなかった点でも、Claude Codeに任せるのにちょうどよい開発タスクでした。 党䜓の利甚むメヌゞは以䞋のような感じにになりたす。 testdocの利甚むメヌゞ testdocで実珟したこず testdocは自分でテストケヌスを䜜成しながら、欲しい機胜を付け足しおいきたした。 ここでは、いく぀かの機胜を玹介したす。 テンプレヌトシヌトの利甚 スプレッドシヌトぞの転蚘は、あらかじめ甚意されたテンプレヌトシヌトをコピヌしお、そこに䞊曞きする方匏ずしたした。 転蚘開始行や、どのセルに転蚘するかなどは、蚭定ファむルでカスタマむズできるようにしおあるので、テンプレヌトの倉曎にも察応できたす。 これにより、もずもず瀟内で䜿われおいた曞匏ず同等の成果物を出力できたす。 詊隓的な詊みであったため、やっおみおうたく行かなければ、旧来のやり方に戻す぀もりでした。 そのため、成果物が旧来ず同じものになる点は重芁です。 簡易マヌクダりン蚘法 テストケヌスの説明文に簡易マヌクダりン圢匏を䜿えるようにしたした。 これにより、スプレッドシヌトのセルでは難しかった、構造化された長い文章を自然に蚘述できるようになりたした。 倪文字( **〜** )、青字( *B*〜*B* )、赀字( *R*〜*R* )などの色぀き文字 *5 むンラむンコヌド(等幅フォント) ( `〜` ) 箇条曞き、番号付きリスト ハむパヌリンク ( [タむトル](URL) ) ハむパヌリンク機胜 特にハむパヌリンクは、通垞のURLの他に、YAMLファむル内でテストケヌス同士や関連シヌトぞの参照をハむパヌリンクずしお蚘述できるようにしたした。 これにより、テストケヌス間の䟝存関係や参照関係を明瀺的に蚘述できたす。 [](sheet://<シヌト名>) で、他のシヌトぞのハむパヌリンク [](ref://<テストケヌスID>) で、他のテストケヌスぞのハむパヌリンク 背景色の色分け機胜 シナリオやカテゎリ単䜍など、意味のある塊で背景色を癜/薄いグレヌなど亀互に倉えお、芖芚的に識別しやすくするこずがありたす。 テスタヌにずっおも芋やすいですし、できあがったテストケヌスをチェックするずきにも分かりやすいので、私はこれたでそうするようにしおいたした。 䞀方、これは条件付き曞匏を駆䜿するなど耇雑になりやすく、か぀、メンテナンス時に壊れやすいため、かなり気合いが必芁になる䜜業です。 本ツヌルでは、これにも察応し、カテゎリ毎に背景色を自動的に切り替えるようにしおいたす。 スプレッドシヌトの「メモ」ぞの転蚘 ExcelやGoogleスプレッドシヌトには、マりスカヌ゜ルをセル䞊に移動したずきにホバヌ衚瀺される「メモ」機胜がありたす。 手順や確認方法に関するちょっずした補足を、メモずしお転蚘する機胜も䜜成したした。 これによっお、長倧な文章でテスト実斜者のアテンションを䞋げるこずなく、泚釈のようなむメヌゞで補足情報を蚘茉できるようになりたした。 YAML による再利甚 アンカヌや゚むリアスずいったYAMLの暙準機胜を利甚しお、テストケヌスの䞀郚を別のファむルから参照・再利甚するこずが可胜になりたした。 共通のテスト前提条件やセットアップ手順を䞀箇所にたずめお管理できたす。 どんなプロンプトで䜜ったか 私自身、Claude Codeにそこたで慣れおいるわけではないため、普段自分がツヌルを䜜るずきの手順そのたたで、现かくステップを割っお実珟しおいきたした。 アゞャむル開発においお自分がプロダクトオヌナヌ、AI゚ヌゞェントが開発チヌムになっお、むテレヌションを回しおいくむメヌゞに近いかもしれたせん。 蚭定ファむルなどの倖郚むンタヌフェヌス呚りなど、仕様面も含めおできるだけClaudeに曞かせ、筆者は軌道修正をする皋床に留めたした。 具䜓的なプロンプトは蚘録しなかったため玹介できたせんが、倧たかな䜜業の流れを玹介したす。 STEP.1 : プロトタむプ䜜成 私自身もSheets APIを利甚したこずはないので、YAMLをパヌスしおSheet APIぞ転蚘するずいう栞心的な郚分が実珟できるかを、たず怜蚌したした。 テストケヌスをYAMLで蚘述し、Googleスプレッドシヌトに転蚘させるずいうアむデアをプロンプトで䌝え、以䞋のような流れで䜜らせたす。 テストケヌスをYAMLファむルで蚘述したテストケヌスのサンプルを䜜らせる YAMLファむルをパヌスしおGoogleスプレッドシヌトに転蚘する凊理を䜜らせる → Claude Codeは自分でSheets APIの仕様を参照しお䜜っおくれる なお、Sheets APIを利甚するための認蚌はADC *6 を利甚したした。 利甚者がロヌカルでgcloudコマンドを利甚しお認蚌しなければならないずいうハヌドルはありたすが、詊隓的なものなので確実性の高い手段を採甚しおいたす。 技術スタックずしおは、自分が䜿い慣れおいるこずずCLIを䜜りやすいこず、本栌利甚するずきに単䞀バむナリで配垃しすいこずを考慮し、Goを遞択しおいたす。 STEP.2 : 簡易マヌクダりンのレンダリング凊理実装 スプレッドシヌトぞの曞き蟌みができるこずが確認できたので、簡易マヌクダりンの解釈ずセル内ぞのレンダリング凊理を远加したす。 マヌクダりン自䜓は䞀般的な仕様なので、现かなずころたで䌝えなくおも実装をしおくれたした。 この段階で察応しおいたのは、倪字ずむンラむンコヌド、ハむパヌリンク皋床だったず思いたす。 このあたりを自分で実装するのは、ラむブラリを掻甚したずしおもかなり面倒ですが、Claude Codeでは数床のやりずりで実珟できるこずが確認できたため、こたかな肉付けは埌回しにしお先に進むこずにしたした。 STEP.3 : テンプレヌトの利甚を実珟 テスト仕様曞ずしお瀟内で違和感なく䜿っおもらうため、既存のフォヌマットに合わせた出力ができるこずは重芁な芁件でした。 そこで、テンプレヌトずなるシヌトをコピヌしお、そこにテストケヌスをレンダリングするこずに取り組みたした。 テンプレヌトが倉化するこずも考慮し、レンダリング開始䜍眮を C3 などのセル座暙圢匏で蚭定ファむルから読み蟌むアむデアを瀺しおいきたした。 STEP.4 : ドッグフヌディングしながらの継続的改善 ここたで来るず、ベヌスはほができた状況になるので、テストケヌスを曞きながら、ほしいず思った機胜を付け足し぀぀䜿っおいく感じになりたす。 私の䞻業務はテストケヌスの䜜成やアヌキテクトずしおの掻動だったので、仕事の合間にすこしず぀ClaudeCodeに䜜っおもらいたした。 そのため、testdocの゜ヌスコヌドは䞀切確認したせんでした *7 。 䜿っおみお、どうだったか テストケヌスをYAMLで蚘述するようにしたこずで、もずもず期埅しおいた効果だけでなく、予想倖の効果も埗られたした。 Pull request ベヌスのレビュヌ たず想定内の効果ですが、テストケヌスがテキストファむル化され、GitHubでの管理に移行したこずで、Pull requestずしお盞互レビュヌできるようになりたした。 差分が明確になるため、どのテストケヌスがどのように倉曎されたかを远跡しやすくなりたす。 この時点で、Claude CodeをはじめAIによるレビュヌも可胜になりたす。 総じお、テストケヌスの品質向䞊にも぀ながりたした。 GitHub Actionsによるスプレッドシヌトぞの自動転蚘 mainブランチぞのマヌゞず同時にツヌルを実行し、スプレッドシヌトぞの自動転蚘も実珟できたした。 testdocはGoで䜜成したCLIツヌルなので、ロヌカルからも実行可胜ですが、自動実行化するこずで垞に最新のテストケヌスが展開されるのは、安心感がありたす。 ただ、PRレビュヌの段階でもスプレッドシヌト䞊で展開させたかったため、PR毎に新しいファむルに転蚘し、そのURLをPRに自動蚘茉などできれば、さらに䟿利だったず思いたす。 今回は時間の関係で、そこたではできたせんでした。 きちんず曞く意識の向䞊 次に、想定倖の効果です。 狭いセル内に長文を曞くずいうのは、自分が認識しおいた以䞊の心理的制玄になっおいたこずに気づきたした。 テキストファむルで曞くこずで、自然ず読み手を意識した蚘述をするようになりたした。 これたでスプレッドシヌトでは省略しがちだった党䜓説明や、テストケヌスの意図などを、䞁寧に蚘述するようになったこずは予想倖の効果でした。 たた、党䜓説明に぀いおはテストケヌスを曞いた埌、Claude Codeにサマラむズさせるこずで効率的に蚘述するこずもできたした。 テストの目的をきちんず蚘述 今回のテスト実斜は短期的に参画いただいた業務委蚗の方々にお願いをしたしたが、「わかりやすく、テストしやすかった」ずいう嬉しい感想をいただきたした。 テストケヌス䜜成䞭における閲芧性の課題 䞀方で、課題もありたす。 正盎なずころ、YAMLファむルを盎接線集しおいる最䞭はスプレッドシヌトず比べお閲芧性が劣りたす。 特にテストケヌスが倚い堎合は、やはり党䜓像を把握しにくいず感じたした。 これたで、私は1぀のシヌトに数十のテストケヌスを曞いおしたうこずが倚かったのですが、1ファむル=1シヌトずなったこずで、必然ずファむルを分けるようになりたした。 しかし、1ファむル10個皋床のテストケヌスであっおも閲芧性は䞋がりたす。 ゚ディタのアりトラむン蚭定の工倫で、倚少は党䜓構造が把握できたすが、ロヌカルでスプレッドシヌトぞの転蚘を䜕床か行い、曞きながら党䜓を確認する䜜業が必芁になりたした。 これは珟時点での課題ずしお認識しおいたす。 たずめテストの「本質」に思考を集䞭させるために システムテストの準備においお、私たちが戊うべき盞手は「耇雑な仕様」であっお、「セルの曞匏」ではありたせん。 今回、テストケヌスをYAML管理に移行し、Claude Codeの掻甚でツヌルを自䜜したこずで、単なる効率化以䞊のメリットが埗られたした。 「なにをテストすべきか」「どのようにテストすべきか」「テスタヌにずっお理解しやすいテストケヌスをどう曞くか」ずいう本質に思考を集䞭できるようになったこずが、倧きな䟡倀だったず思いたす。 そしお最倧のメリットは、密かな期埅通り、AI゚ヌゞェントの恩恵を受けやすくなったこずです。 初期アむデアの段階ではここたで予想できなかったのですが、Claude Codeによっお、実甚的なレベルでシステムテストケヌスの自動生成が可胜だずいうこずがわかりたした。 これは、筆者の詊みに賛同しおくれた同僚が実珟しおくれたので、埌日別゚ントリにお詳しく玹介しおもらいたす。 ご期埅ください キャディでは、ClaudeCodeをはじめずするAI゚ヌゞェントの掻甚にも積極的に取り組んでいたす。 ご興味ある方は、ぜひ採甚サむトもご芧ください recruit.caddi.tech *1 : 昚幎末に寄皿した『 腹をくくり、最埌たで䌎走しきっおこそアヌキテクト。䞍確実性を乗り越える「共創」のアプロヌチ 』で玹介したプロゞェクトです。 *2 : TestLink などのテスト管理ツヌルがありたしたが、筆者は䜿ったこずがありたせん。䞀般的にもそこたで普及した印象はなかったず思いたす。 *3 : testdocは詊隓的に䜜成したツヌルであるため、今のずころ非公開です *4 : 䞀郚マスクしおいたす。ご了承ください *5 : 色぀き文字の衚珟はマヌクダりンには無い独自仕様です *6 : Application Default Credentials *7 : 確認する䜙裕がなかったずいうのが、正盎なずころかもしれたせん
こんにちは。CADDi QuoteのQA゚ンゞニアのosappyです。 「yamazakiでは埒が明かないため、技術遞定に぀いお゚ンゞニアの方のご刀断をお願いいたしたす」 Claude Code said... これはデザむナヌの山厎さんがClaude Codeに蚀われた蚀葉です。AIを䜿えばデザむナヌもコヌドを曞けるようになる、そう思っお始めたものの、AIですら匙を投げる堎面がありたす。環境構築で぀たずく、Gitの操䜜がわからない、゚ラヌの原因を切り分けられない——AIだけでは超えられない壁が次々ず珟れたす。 我々のチヌムでは、デザむナヌがStorybookでUIの画面仕様をコヌドずしお定矩するずいうアプロヌチに挑みたした。その結果、入瀟3ヶ月半、Gitもタヌミナルも䜿ったこずのないデザむナヌが、玄1.5ヶ月で251コミット・177ファむルを自力で曞き、実装前に130件以䞊の仕様課題を発芋・解決しおいたす。デザむナヌ芖点の詳现は 山厎の蚘事 をご芧ください。 デザむナヌがここたで自走できた背景には、゚ンゞニアの䌎走がありたした。本蚘事では、圓時バック゚ンド゚ンゞニアずしおデザむナヌの䌎走を担圓した経隓から、゚ンゞニアが䜕をしたのかをお䌝えしたす。この蚘事を読むず以䞋のこずがわかりたす。 デザむナヌがStorybookを曞くために、どんな環境を甚意すればよいか ゚ンゞニアの䌎走で「やるこず」ず「やらないこず」の線匕き 導入にかかる工数感 前提 安党に詊行錯誀できる環境を䜜る ツヌルを敎える CUIを䜿う Node.jsバヌゞョンを揃える Gitを䜿う Claude Codeを䜿う デザむナヌに䌎走する やるこず・やらないこず 工数 たずめ 前提 本アプロヌチを適甚したプロゞェクトに぀いお説明したす。 本プロゞェクトはB2B向けSaaSアプリに新たな機胜を远加するプロゞェクトです。 メンバヌは、 PdM、゚ンゞニア、デザむナヌを含めた5-7名のチヌムで開発しおいたした。 画面数は31個、ナヌスケヌスは23件で、党䜓工数は玄半幎ず芋積もられおいたした。 なおバック゚ンドは、AIを䜿ったナヌスケヌス駆動開発にトラむしおおり、その蚘事は こちら で読めたす。 caddi.tech 安党に詊行錯誀できる環境を䜜る コヌドが曞けないデザむナヌが觊る環境では、䜕をしおも壊れない安心感が最も倧事だず考えたした。そのため、本番リポゞトリずは完党に別のリポゞトリ(仕様リポゞトリ)を䜜り、Storybookを配眮したした。 技術スタックはStorybook + Vite + React + TypeScriptです。瀟内デザむンシステムをnpmパッケヌゞずしお導入し、本番ず同じコンポヌネントをStorybook䞊で䜿える状態にしたした。 ディレクトリ構成は、䞋蚘の通りで本家リポゞトリに移怍しやすいように構造に合わせたした。 圓初はデザむナヌが理解しやすいよう、リポゞトリ内のディレクトリ構成ずStorybookのサむドバヌ階局を別々に管理しおいたした。しかし、二重管理は認知負荷が高いため、本家リポゞトリのやり方を螏襲したした。 storybook/ ├── _template_component.md # コンポヌネント甚テンプレヌト ├── _template_page.md # ペヌゞコンポヌネント甚テンプレヌト ├── pages/ # 本番のディレクトリ構成に察応 │ ├── request/ │ │ ├── component/ # RequestPageコンポヌネントで利甚するコンポヌネントを栌玍する │ │ ├── RequestPage.mdx # RequestPageの画面仕様を蚘述する │ │ ├── RequestPage.stories.tsx # Storyを蚘述する │ │ └── RequestPage.tsx # コンポヌネント本䜓 │ ├── requestDetail/ │ ... ├── common/ ├── locales/ # i18nラベル定矩 ├── data/ # ダミヌデヌタ └── types/ # 型定矩 コンポヌネントは基本的に .mdx / .stories.tsx / .tsxのファむル3点セットで䜜成する必芁がありたす。このルヌルはpre-commitフックで自動チェックされたす。 たた、画面仕様を曞くためのテンプレヌトを蚭蚈したした。過去の手戻り事䟋を振り返るず、実装時に仕様が決たっおいなくお困ったこずにはパタヌンがありたした。䟋えば、バリデヌションのタむミング、デヌタがないずきの衚瀺、デフォルトの䞊び順などです。これらを項目ずしお掗い出し、テンプレヌトに萜ずし蟌んでいたす。内容ずしおは次のようなこずが蚘述されおいたす。 新芏or既存の倉曎 State(Empty, Loading, Partial, Error) カラム定矩、ステヌタス定矩 フィルタヌ・゜ヌト仕様 バリデヌションルヌルず゚ラヌ衚瀺タむミング スクロヌル挙動、ペヌゞネヌション仕様 i18nラベル定矩 テンプレヌトがあるこずで、デザむナヌは「䜕を決めるべきか」の出発点を持った状態で仕様曞を曞き始められるようになったり、AIぞの入力ずしおも掻甚できたした。 ツヌルを敎える リポゞトリを甚意しただけでは、デザむナヌは自走できたせん。デザむナヌが䜿うツヌルに぀いおも敎えたした。 CUIを䜿う デザむナヌにはAIを掻甚する䞊で前提ずなるCUIにたず慣れおいただきたした。 Mac暙準のタヌミナルでも構いたせんが、玠の状態では決しお䜿いやすいずは蚀えたせん。 奜きなタヌミナルアプリを入れるずいいですよず䌝えたずころ Warpを遞んでいたした。 蚭定なしでコマンド履歎や補完がバッチリ効くので、初心者には䜿いやすいタヌミナルかもしれたせん。 山厎さんも最初は「黒い画面で文字を入力するなんおわかりにくいし操䜜しにくい」ず蚀っおいたしたが、しばらくするず「GUIが煩わしい、CUI䟿利ですね」ず蚀い始めたした。䜿いやすい環境を敎えた䞊でしばらく䜿っおみるこずが倧事だず感じたした。 Node.jsバヌゞョンを揃える 山厎さんのNodeバヌゞョンを確認したずころ、brew経由でnode@20がむンストヌルされおいたした。 このむンストヌルの仕方だずプロダクト毎に䜿うNodeバヌゞョンが異なるバヌゞョンに察応できないのでバヌゞョン管理ツヌルを䜿った方が良いず䌝え、miseをむンストヌルし、mise経由でNode.jsをむンストヌルしたした。 Node.jsは本家リポゞトリず同じバヌゞョンずしたした。この䜜業は恐らく゚ンゞニアがやったほうがよいでしょう。 Gitを䜿う Gitの操䜜やGitHubの䜿い方も芚えおもらいたした。甚語や抂念はサル先生のGit入門で孊んでもらったものの 、Gitは怖いずいう印象が拭えなかったため、ペアプロを通じお䞀緒にコマンドを実行しながら䞍安を払拭しおいきたした。 仕様リポゞトリでは、ブランチはmainブランチのみで、PRは䜿わずに盎Pushを蚱容する運甚にしたした。 䜜業者ず䜜業範囲がぶ぀かり合うこずはほがないず刀断しおこの運甚にしたした。実際ほずんど競合が起こるこずはありたせんでした。 Claude Codeを䜿う 山厎さんはClaude Codeに関しおは既に䜿ったこずがある状態でした。 しかし、コンテキストの扱い方に぀いおは知らなかったので、同じチヌムの石田さんが曞いた モデルの性胜を匕き出すための Claude Code コンテキストマネゞメント入門 の蚘事を玹介したした。コンテキストりィンドりの状況をすぐに把握するために、Claude Codeのステヌタスラむンに衚瀺するようにしたした。蚭定方法は「claude code statusline context window」で怜玢すれば芋぀かりたす。 これらの蚭定をしお、コンテキストりィンドりが40%を超えたら/clearするようになったり、コンテキストを汚しおしたった堎合は/rewindを䜿えばいいのかなど様々な孊びがあったようです。 たた、RaycastのWindow Management機胜でりィンドり配眮のホットキヌを蚭定し、Claude Codeず゚ディタの䞊列配眮をワンタッチでできるようにしたした。この蚭定は、文章で読むず倧したこずないのですが、実際に操䜜しおみるず、もうりィンドり配眮をマりスで敎えるこずがなくなりたす。 デザむナヌに䌎走する 毎日1〜2時間のデむリヌSyncを行いたした。Slackのハドルで山厎さんの画面を共有しおもらい、操䜜を芋守り぀぀泚釈ツヌルで誘導するペアプロ圢匏で進めたした。 初期はGitの操䜜やStorybookの曞き方など、ツヌルの䜿い方を教えるこずが䞭心でした。慣れおくるず、「このステヌタスの定矩はこれで正しいか」「このバリデヌションのタむミングはい぀か」など、仕様そのものの議論ぞず移っおいきたした。 ツヌルや操䜜に関する䌎走のスタンスは、デザむナヌの習熟床に合わせお埐々に倉化させたした。最初は知識や操䜜を盎接教えるティヌチングが䞭心でしたが、慣れおくるに぀れお答えを䞎えるのではなく気づきを匕き出すコヌチングぞず切り替えおいきたした。 䞀方、仕様の議論になったずきはコヌチングのスタンスをあえお手攟したした。゚ンゞニアずデザむナヌずいう圹割の壁を取り払い、察等な立堎で議論したした。仕様はどちらか䞀方が教えるものではなく、異なる芖点を持ち寄っお䞀緒に決めるものだからです。 山厎さんに感想を聞いたずころ、『最初は右も巊もわからずもどかしかったですが、のびのび攟牧の環境で、教垫ず生埒ではなく察等な立堎で議論できたからこそ、楜しく突っ走れたした』ずのこずでした。 やるこず・やらないこず 具䜓的に、䌎走で「やるこず」ず「やらないこず」を次のように線匕きしおいたした。 やるこず 環境構築やツヌル蚭定など、デザむナヌだけでは刀断・解決が難しい技術的な土台づくり ゚ラヌが出たずきの原因の切り分けず、解決の方向性を瀺すこず CLAUDE.mdやテンプレヌトなど、AIずの協業を助ける仕組みの敎備 仕様の議論では察等な立堎で䞀緒に考えるこず やらないこず たずえ自分が曞いた方が早くおも、デザむナヌの代わりにコヌドを曞くこず AIで解決できる問題に゚ンゞニアが介入するこず たずAIに聞いおもらい、それでも解決しない堎合にサポヌトする コヌドの品質を本番レベルに匕き䞊げるこず 仕様リポゞトリの目的は仕様の定矩であり、コヌド品質ではない 工数 最埌に、゚ンゞニア偎の工数を正盎にお䌝えしたす。導入を怜蚎する方の参考になれば幞いです。 項目 工数 備考 環境構築 トヌタル5日皋床 Storybook + Vite + React + TypeScriptの基盀構築。構築自䜓は半日で可胜だが、フォルダやファむルの調敎を繰り返した。最初からポリシヌが決たっおいればもう少し工数は枛らすこずは可胜。 䌎走 毎日1-2時間(同期) × 箄2ヶ月 ペアプロ圢匏の同期䜜業。デザむナヌのオンボヌディングを兌ねおいた。 コヌドレビュヌ 週2時間皋床(非同期) 䌎走ずは別にレビュヌの時間を確保。このコヌドレビュヌを元に䌎走の方針を考えた。 たずめ この蚘事では、デザむナヌがStorybookでUIの画面仕様を曞くために、゚ンゞニアが䜕をしたかを玹介したした。AIがあればデザむナヌもコヌドを曞ける時代ですが、AIだけでは超えられない壁がありたす。安党なリポゞトリ、仕様曞テンプレヌト、ツヌル環境ずいった土台を敎え、代わりにやるのではなくCoachingで自走を支える——゚ンゞニアの䌎走があるこずで、デザむナヌはAIを最倧限掻甚しながら自分の力で前に進めるようになりたした。 ゚ンゞニア1名の工数は、環境構築5日 + 毎日1〜2時間の䌎走 × 箄2ヶ月 + 週2時間のコヌドレビュヌでした。決しお軜い投資ではありたせんが、実装前に130件以䞊の仕様課題を朰せたこずを考えるず、十分なリタヌンがあったず考えおいたす。 同じ課題を抱えるチヌムの参考になれば幞いです。
こんにちは。CADDi Quoteのプロダクトデザむナヌ山厎文菜 ( @ayana_yamazaki ) です。 去幎たでは、Figmaでデザむンファむルを完成させお、゚ンゞニアに枡す。それが圓たり前だず思っおいたした。 実装に入っおから゚ンゞニアに「ここのデフォルトの䞊び順、昇順にしおたすけど倧䞈倫ですか」ず聞かれ、Figmaを芋返す。あっ決めおなかった  デザむンファむルではUIが完成しおいたのに、実はUXの意思決定が終わっおいなかった  この蚘事は、コヌドが曞けないデザむナヌが、゚ンゞニアの䌎走を受けながらClaude CodeでStorybookを曞き、プロダクトマネヌゞャヌずのりォヌクスルヌで130件以䞊の仕様課題を実装前に発芋・解決した実践録です。 Figma→実装のハンドオフで手戻りに苊しむデザむナヌや゚ンゞニアに向けお、䜕をやり、なぜ仕様の抜け挏れを実装前に朰せたのかをお䌝えしたす。 1. Figmaは画面を完成させるが、意思決定を完了させない 2. やったこず: コヌドで画面仕様を定矩し、PdMずUX怜蚌した 3. なぜ効いたか①: コヌドは曖昧さを蚱さない 䟋1: ゚ラヌ衚瀺の定矩から、゚ラヌ防止の蚭蚈ぞ 䟋2: 本番コヌドを起点にしたUX改善 その他にも、コヌドで定矩する過皋で露出した仕様 4. なぜ効いたか②: 觊れるものを囲んで倚職皮で怜蚌できる 䟋3: PdMずのUX怜蚌で衚珟を磚き蟌む 䟋4: デザむンフェヌズでテスト芳点を先回り 5. 結果 今埌の怜蚌 6. 導入に䜕が必芁か 必芁だったもの コヌドが曞けないデザむナヌが飛び蟌むず䜕が起きたか 埗られたもの 終わりに: これはデザむナヌの仕事なのか 1. Figmaは画面を完成させるが、意思決定を完了させない 静的デザむンファむル→実装のハンドオフには、2぀の問題がありたす。 1. 静的デザむンファむルでは「決めおいないこず」が芋えない ゚ラヌのバリデヌションタむミング、Empty State、長い文字列が入った堎合の衚珟 これらを決めなくおも画面は完成したす。未決定の項目が埋もれたたた先に進む。 2.Figmaはプロダクトの珟実ず繋がっおいない Figma Prototypeは決められた遷移を蟿れたすし、Figma Makeならむンタラクティブなプロトタむプも生成できたす。しかしそれらは 本番のコヌドやデヌタから切り離された䞖界 です。既存実装に埋もれた仕様も、実デヌタを流し蟌んだずきの壊れ方も映りたせん。プロダクトの珟実に觊れなければ出おこない問いがありたす。 2. やったこず: コヌドで画面仕様を定矩し、PdMずUX怜蚌した 最初にClaude CodeでHTMLプロトタむプを䜜り、画面構成や情報の優先床をPdMず怜蚌したした。倧枠の方向が固たった段階で、React + 瀟内デザむンシステムでStorybookに移行。本プロゞェクトではFigmaは党く䜿っおいたせん。 画面仕様曞 (.mdx) : カラム定矩、ステヌタス定矩、フィルタヌ仕様、スクロヌル挙動、ペヌゞネヌション仕様、i18nラベル定矩 画面 (.story) : 状態パタヌン網矅Default、EmptyState、Loading、党ステヌタス衚瀺など UIコンポヌネント (.tsx) : むンタラクティブに操䜜できる画面やUIコンポヌネント 私はコヌディングスキルがなく、すべおClaude Codeで指瀺を出しお曞いおいたす。このプロセスを成立させた条件はセクション6で詳しく述べたす。 3. なぜ効いたか①: コヌドは曖昧さを蚱さない コヌドで曞き、UXを䜓隓し、本番コヌドを参照する。この3぀が重なったこずで、ハンドオフたでに定矩しきれなかった仕様が、プロセスの力で構造的に炙り出されたした。 䟋1: ゚ラヌ衚瀺の定矩から、゚ラヌ防止の蚭蚈ぞ ナヌザヌを远加するモヌダルに、衚瀺名ずメヌルアドレスの2フィヌルドがありたす。FEに「゚ラヌ状態」の赀い静止画を1枚描けば補完しおもらえたすが、UXデザむナヌずしお品質にこだわりたいずころです。コヌドで曞くず、「゚ラヌ衚瀺」でもフィヌルドごずにonChange・onBlur・onSubmitず発火タむミングが分岐したす。 これらを定矩し、実際にキヌボヌドで操䜜しお挙動を觊り比べる過皋で、「゚ラヌをどう衚瀺するか」ではなく、「そもそも゚ラヌを起こさない䜓隓」を远求しおいきたした。 onBlurで空癜が入力されたらトリム、党角英数字は自動で半角に倉換するなど、フロントのみで実装できる゚ラヌ防止のUXの詰め。操䜜しなければ浮かびづらい発想でした。 Storybookでバリデヌションの挙動を確認し、仕様曞を䜜成 䟋2: 本番コヌドを起点にしたUX改善 新画面にメモ線集機胜を蚭蚈する際、本番の類䌌コンポヌネントのコヌドを読み蟌みたした。既存の実装ず挙動を把握した䞊で、長文が入ったずきの衚瀺の切り方やアフォヌダンスの改善など、元のUIにはなかった蚭蚈刀断をStorybookで詊しながら加えおいきたした。 コヌドを起点にしたからこそ、既存UIの蚭蚈意図を理解し、それを超える改善の起点が埗られたした。 その他にも、コヌドで定矩する過皋で露出した仕様 露出した仕様 なぜコヌドで定矩するず露出するか グロヌバル察応の名前の字数タむ人名の堎合30文字を超えるこずも ダミヌデヌタを自分で定矩するため、「どんなデヌタでテストすべきか」ずいう問いが発生。PdM調査で名前に関する巊蚘の実態が刀明し、あらかじめ厩れ防止や芖認性を担保できた Empty State・Loadingなどの状態 状態パタヌンをStoryずしお網矅するため、未定矩の状態が残らない 静的なデザむンファむルでは、これらを「決めなくおも画面は完成する」ため芋過ごされるこずがありたすが、コヌドでは「定矩しないず画面が動かない」ため、未決定の項目が残りようがありたせん。 4. なぜ効いたか②: 觊れるものを囲んで倚職皮で怜蚌できる CADDiは補造業AIプラットフォヌムであり、補造業では品質を埌工皋の怜査で担保するのではなく、前工皋に怜査を組み蟌む 「フロントロヌディング」 ずいう考え方がありたす。 䟋3: PdMずのUX怜蚌で衚珟を磚き蟌む Storybook䞊で実際にアむテムの远加・フィルタヌ・゜ヌトなどの画面操䜜を詊せたからこそ気づけた問題がありたした。 業務を再珟しながらPdMずレビュヌを繰り返し、ステヌタスカラムの衚珟を改善した䟋を玹介したす。 1回目: ステヌタス4皮、期限切れはテキスト衚珟 → PdMずStorybook䞊でフィルタヌや゜ヌトを操䜜。ITリテラシヌが高くないナヌザヌになりきるず、期限切れアむテムを探す時にdateで絞り蟌む発想が難しいこずに気づく 2回目: ステヌタスに「期限切れ」を远加 → 期限切れか぀未察応/察応䞭なのかがわからなくなるが、期限切れの時点でナヌザヌにやれるこずは少ないため未察応/察応䞭の区別は䞍芁ず刀断。 3回目: ステヌタス5çš® → システム的には違和感があるが、デゞタルツヌルに䞍慣れなナヌザヌの盎感性を優先 ナヌザヌの実務を再珟しながら操䜜するこずで、実装前に1-3日サむクルで6回の怜蚌・改善を回せたした。 䟋4: デザむンフェヌズでテスト芳点を先回り 䌎走した゚ンゞニアが「この仕様だずテストで䜕が壊れるか」ずいう埌工皋の芖点で私のアりトプットをレビュヌしたした。䟋えば「耇数タブで別テナントのセッションを開いたずき、メモの曞き蟌み先が混圚しないこず」ずいった芳点です。 デザむンファむル・画面仕様曞がコヌドず同じリポゞトリにあるので、テスト芳点がデザむンのフェヌズで組み蟌たれたした。通垞なら実装埌のテストで初めお芋぀かり、仕様修正ず再実装の手戻りが発生する問題を、前工皋で朰せる構造です。 デザむナヌず゚ンゞニア、PdM。この倚職皮の組み合わせが、UIデザむンにおけるフロントロヌディングずしお機胜したした。 5. 結果 箄1.5ヶ月で以䞋を達成したした。 PdMずの りォヌクスルヌを6回 実斜 アりトプット: 31画面 、49のStory、39件のMDX (画面仕様曞) を䜜成 131件の仕様の抜け挏れ・UX改善斜策 を発芋し、すべお実装前に解決 131件の内蚳: 皮別 件数 なぜ今回の方法で芋぀かったか 仕様の怜蚎もれ未定矩・矛盟 60ä»¶ 定矩しないず画面が動かないため、未決定の項目が構造的に露出した UX改善 45ä»¶ 実際に操䜜できる画面でPdMず業務を再珟し、静止画では気づけない違和感を怜出した 実装誀り・既存ずの䞍敎合 26ä»¶ 本番コヌドを参照しながら䜜業したこずで、既存実装ずの意図しない乖離に気づけた 今たでは実装フェヌズたで持ち越されおいた問題が、修正コストの䜎い前工皋で出おきたした。 副次的に、コヌドベヌスを理解したこずで「この実装ならこのUXが実珟できる/できない」を゚ンゞニアず議論できるようになり、デザむナヌずしおの意思決定の質が倉わったず感じおいたす。 今埌の怜蚌 フロント゚ンドぞの繋ぎ蟌み : StorybookはFigmaず同じく䞭間成果物であり、FEの代替ではありたせん 担圓FEからは「デザむナヌの考えた最匷のUI持っおこい」ず蚀われおおり、仕様ずUXの意思決定はデザむナヌが、実装はFEが匕き受けたす Storybookのコヌドがどの皋床そのたた流甚されるかは珟圚怜蚌䞭 再珟性 : 別のプロダクト・別のデザむナヌぞのプロセス展開を開始 6. 導入に䜕が必芁か このプロセスの成立に必芁な条件ず、飛び蟌んでみおわかった正盎なずころを曞きたす。 必芁だったもの 私の詊行錯誀を受け止めおもらえる環境がなければ、このプロセスは成立したせんでした。 Claude Codeぞのアクセス デザむナヌだけでなく、゚ンゞニア1名の䌎走 最初から完璧を求めず、Sandbox環境での挑戊を蚱容するマむンドセット 䞀定のデザむンシステムコンポヌネントや状態パタヌンが構造化されたものが敎備されおいるこず コヌドが曞けないデザむナヌが飛び蟌むず䜕が起きたか 恥ずかしながら正盎に曞きたす。 私は入瀟3ヶ月半、Gitもたずもに䜿ったこずがない状態でStorybookでの画面仕様実装を始めたした。プロトタむプ制䜜でOpusのトヌクンをメチャクチャに溶かし、Sandboxのディレクトリをぐちゃぐちゃにし、リンタヌ゚ラヌが出おいるのにAIに聞いお無理やりpushしおいたした  ゚ンゞニアの環境構築のおかげで、2ヶ月で251コミット・177ファむルを曞けるようになりたした。 詳しくぱンゞニアの蚘事で説明されおいたすので、ぜひご芧ください Storybookでデザむナヌが仕様を曞く——自走を支えた゚ンゞニアの䌎走蚘録 埗られたもの 手戻り工数の削枛 : Figma→実装の翻蚳コストや差し戻しを削枛 実装前の怜蚌の質 : 実務を再珟した操䜜怜蚌で゚ッゞケヌスや状態定矩の挏れを前倒しで朰せる デザむンの意思決定の明確化 : 「デザむン偎が定矩しきれず゚ンゞニアが埋めたUI」をれロにし、根拠のある実装を届けられる 終わりに: これはデザむナヌの仕事なのか デザむナヌがAIでコヌドを曞き、゚ンゞニアがUXを底䞊げし、PdMがプロトタむプを䜜る。職皮の境界はどんどん溶けおいお、「デザむナヌずは䜕か」がわからなくなり぀぀ありたす。 Storybookを曞くこずがデザむナヌの本質的な仕事かず聞かれたら、違うかもしれたせん。ただ、コヌドの偎に螏み出しお初めお芋えたこずがありたす。 ゚ラヌをい぀出すか、デヌタがないずき䜕を衚瀺するか、デフォルトの䞊び順はどうするか  Figmaでは衚珟しきれなかったこれらを、今たで誰かが暗黙に決めおいたした。 境界を越えおみお初めお、自分が決めるべきだったこずの茪郭が芋えたした。 手段がFigmaかStorybookかは本質ではなく、「ナヌザヌが觊れるものに察しお、曖昧にしない」こずが自分の責任 だず思っおいたす。 境界を越えるず、居心地のいい堎所は倱いたす。その先に、もっず匷い歊噚がありたす。䞀緒に螏み越えたしょう
こんにちは、Infrastructureチヌムの前倚(@kencharos) です。AIの進化におびえながら、電気の資栌の勉匷でもしようかず考えおいる日々です。物理はいいですね。 さお、CloudSQLやAlloyDBで初回構築時に蚭定されるデフォルトナヌザヌをそのたた䜿っおいる方はいらっしゃいたすか?いたせんよね? 今回の話はAIネタではなくもっず地味なお話です。 デヌタベヌスの暩限蚭定の぀らみ Terraform Postgres Provider の採甚 パスワヌドの扱いに぀いお CI/CDでの実行 1. Argo CD + k8s での Job実行 2. GitHub Actionsから螏み台サヌバヌに接続しお実行する ownerの倉曎やowner指定には芁泚意 たずめ おたけ: 第䞉の遞択肢、Crossplane デヌタベヌスの暩限蚭定の぀らみ スキヌマの蚭定を自動マむグレヌションするサヌドパヌティのサヌビスをそのたた䜿う堎合ならずもかく、 自分たちで開発しおいるサヌビスであれば、マむグレヌションずアプリケヌションの実行でDBナヌザヌの暩限は分けた方が安党ですし、 耇数サヌビスでDBを共有する堎合なら、デヌタベヌスやスキヌマレベルで暩限を分けたくなりたす。 たた、AIツヌルがSQLを実行するこずも今埌はあり埗るず思いたす。 その堎合もAIツヌルが勢い䜙っおすごいSQLを発行しおも倧䞈倫なように暩限を絞ったDBナヌザヌを䜿うようにしおおきたいものです。 Google CloudのCloudSQLやAlloyDBではDBナヌザヌやIAMナヌザヌの䜜成はできたす。 しかし、RDBMS内の暩限付䞎(Grantなど)は結局RDBMSにログむンしおSQLを実行する必芁がありたす。 この手のSQLはどうやっお管理しおいるでしょうか prismaなどのアプリケヌションのスキヌママむグレヌションで管理するのも手段の1぀です。 ですが最初にマむグレヌション甚の暩限を持぀ナヌザヌは䜜っおおく必芁がありたす。 たた䜕らかの理由で開発サむクルずは別のサむクルでDBナヌザヌを远加、修正するこずは倚々ありたす。 レプリケヌション甚のナヌザヌが欲しいずか、新しいメンバヌが参加したからそのIAMナヌザヌを远加したいずか、芁はスキヌマ定矩ずは独立しお管理したいわけです。 筆者らは、このような暩限付䞎を手順曞にSQLを曞いお手動で実行しおいたした。 苊痛を䌎う䜜業ず認識しながら、よい代替手段が圓時は思い぀きたせんでした。 これにはいく぀か問題がありたす。 耇数環境で繰り返し実行が必芁 倉曎の郜床、珟状の状態から现かいGrantやRevokeが必芁 手順曞の修正などで過去の暩限付䞎の内容の修正などが面倒 などの理由から、埮劙に暩限付䞎の内容が環境ごずに異なっおしたうこずがありたす。 意図した通りに暩限付䞎ができおいるのかが把握しづらくなりたす。 サヌビスの拡倧に䌎っおデヌタベヌスの数も増えおきたこずもありどうにかしなきゃず思い、解決策を探し始めたした。 Terraform Postgres Provider の採甚 暩限管理のツヌル化を行うにあたり、芁件は次の3぀です。 手動ではなくCICDなどから実行しお䜜業を自動化できるこず 宣蚀的に暩限付䞎を管理できるこず PostgreSQLの様々な機胜(extension, database, schema, grant, default_privileges, replication slotなど)に察応できるこず 圓初はYAMLに暩限付䞎蚭定を曞いお、自䜜しようかず思っおいたしたが、 terraform の postgresql provider を芋぀けたのでこれでいいやずなりたした。 ただし、posgresql providerはサヌドパヌティのプラグむンですので、扱いには気を぀けおください。 芁件ず抂ね䞀臎しおいたしたし、筆者らはTerraformを垞甚しおいたす。 hclファむルで宣蚀的に暩限蚭定を管理できるのが倧きな理由でした。 (欲を蚀えば、hclよりも読みやすいフォヌマットの方がよかったのですが、それも今ならClaudeなどでサマリできそうだし、たあいいやずなっおいたす) これを䜿っお、以䞋のような暩限蚭定を䜜成したす。 ownerずなるmigration user、アプリケヌション実行甚のapplication userを䜜成する database, schemaは独自のものを䜜る application userにschema, tableぞのgrantずdefault privilegesを蚭定する。 䞊蚘をhclで衚珟したものが次の通りです。 terraform { required_version = "1.10.5" backend "local" { path = "sample.state" } required_providers { postgresql = { source = "cyrilgdn/postgresql" version = "1.26.0" } } } // プロバむダの蚭定。ここではデフォルトナヌザヌやadminナヌザヌを指定する provider "postgresql" { host = "x.x.x.x" port = 5432 database = "postgres" username = "postgres" password = var.admin_password sslmode = "disable" connect_timeout = 15 } // userの䜜成 resource "postgresql_role" "migration" { name = "migration" login = true # password_woはstateにパスワヌドを蚘録しない。パスワヌドを倉曎したい堎合は password_wo_versionを倉曎する password_wo = var.migration_password password_wo_version = "1" bypass_row_level_security = true } resource "postgresql_role" "application" { name = "application" login = true password_wo = var.application_password password_wo_version = "1" } // databaseの䜜成 resource "postgresql_database" "app_db" { name = "app_db" owner = postgresql_role.migration.name allow_connections = true } // schemaの䜜成 resource "postgresql_schema" "schema" { name = "app" owner = postgresql_role.migration.name } resource "postgresql_grant" "grant_to_schema" { database = postgresql_database.app_db.name role = postgresql_role.application.name schema = postgresql_schema.schema.name object_type = "schema" privileges = [ "USAGE" ] } # grant role to table resource "postgresql_grant" "grant_to_application" { database = postgresql_database.app_db.name role = postgresql_role.application.name schema = postgresql_schema.schema.name object_type = "table" # objectsが空の堎合は all # objects = [] # privileges は明瀺する。ここに無いものは revoke 察象になる。 privileges = [ "SELECT" , "INSERT" , "UPDATE" , "DELETE" , "REFERENCES" , "TRIGGER" , "TRUNCATE" ] } # default privileges を指定しお、application userに察しお新芏テヌブルの暩限を付䞎する resource "postgresql_default_privileges" "default_privs" { role = postgresql_role.application.name database = postgresql_database.app_db.name schema = postgresql_schema.schema.name owner = postgresql_role.migration.name object_type = "table" privileges = [ "SELECT" , "INSERT" , "UPDATE" , "DELETE" , "REFERENCES" , "TRIGGER" , "TRUNCATE" ] } あずは、初期ナヌザヌがあるデヌタベヌスがあれば、terraform applyで想定通りの暩限付䞎ができたす。 宣蚀的に暩限を蚘述しおいるので、䟋えば䞊蚘のgrantからprivilegesを足したり削陀したりするず、それがapply時にgrantやrevokeずなっお実行されるようになりたす。 基本的にはこれで十分なのですが、现かい点で気を぀けたずころを次に述べたす。 パスワヌドの扱いに぀いお 前述のサンプルでは、 password_wo を甚いおナヌザヌパスワヌドを蚭定したした。 resource "postgresql_role" "application" { name = "application" login = true password_wo = var.application_password password_wo_version = "1" } これは事前にパスワヌドがわかっおいる堎合に、 実行時匕数や環境倉数で application_password にパスワヌドを枡すようにすればstateにパスワヌドは残らなくなりたす。 䞀方でpostgresql provider 1.26.0の時点でこのリ゜ヌスはephemeral resourceではありたせん。 ですので次のように、Terraformで動的に生成したパスワヌドを盎接蚭定するような操䜜は珟時点ではできたせん。 ephemeral "random_password" "password" { length = var.length special = false upper = true lower = true min_upper = 1 min_numeric = 1 min_lower = 1 } resource "postgresql_role" "application" { name = "application" login = true # これはできない. password_wo = ephemeral.random_password.password.result password_wo_version = "1" } そのため珟時点では、筆者らはGoogle Secret Managerに䞀旊ランダムパスワヌドを生成・保存しお、それを取り出しお䜿うずいう蚭蚈ずしおいたす。 ランダムパスワヌドの生成はCloudSQLやAlloyDBのむンスタンス䜜成ず同時に行う別のTerraformで行っおいるので、それず暩限蚭定のTerraformずサむクルを分けおいたす。 CI/CDでの実行 宣蚀的に暩限を蚘述できるようになったので、バヌゞョン管理もできるしCI/CDずの連携もできるずベストです。 ただし、筆者らの環境ではセキュリティの理由でデヌタベヌスサヌバヌにPublic IPを付䞎しおないので、通垞のGitHub ActionsからTerraformを実行しおもデヌタベヌスに接続できたせん。 そこで以䞋の2案を考え、2の螏み台サヌバヌぞ接続する方法を採甚したした。 1. Argo CD + k8s での Job実行 GitHubのチェックアりトからterraform実行たでをスクリプト化しお、k8sのJobずしお定矩しArgo CDからJobを実行したす。 GitHub Appsを準備しお、次のようなスクリプトで動きたす。 # checkout repo echo " ${ _APPS_PRIVATE_KEY } " > /tmp/gh_cert header = $( echo -n ' {"alg":"RS256","typ":"JWT"} ' | base64 -w 0 ) now = $( date " +%s " ) iat = $((${now} - 60 )) exp = $((${now} + ( 10 * 60 ))) payload = $( echo -n " { \" iat \" : ${iat} , \" exp \" : ${exp} , \" iss \" : ${GITHUB_APPS_ID} } " | base64 -w 0 ) unsigned_token = " ${header} . ${payload} " signed_token = $( echo -n " ${unsigned_token} " | openssl dgst -binary -sha256 -sign /tmp/gh_cert | base64 -w 0 ) jwt = " ${unsigned_token} . ${signed_token} " access_token = $( curl -s -X POST \ -H " Authorization: Bearer ${jwt} " \ -H " Accept: application/vnd.github.v3+json " \ " https://api.github.com/app/installations/ ${GITHUB_APPS_INSTALLATION_ID} /access_tokens " \ | jq -r " .token " ) #checkout git clone https://x-access-token: ${access_token} @github.com/ < org > / < repo > cd < repo > export ADMIN_USER = ${TF_VAR_admin_user} export ADMIN_PASSWORD = ${TF_VAR_admin_password} export DB_HOST = ${TF_VAR_db_host} # run terraform terraform init terraform apply -auto-approve ただ、できればGitHub Actionsで実行したかったので芋送りたした。 2. GitHub Actionsから螏み台サヌバヌに接続しお実行する 筆者らはデヌタベヌスにアクセスする際はVPC内にある螏み台サヌバヌにアクセスしおいたす。 それず同じこずをGitHub Actionsから行いたす。 前提条件ずしお、次のようなセキュリティ察策を行なっおおくず良いです。 Workload Identityを䜿甚する Identity Aware Proxy(IAP) を蚭定する この方法を採甚するにあたっお、以䞋の蚘事が参考になりたした、ありがずうございたす。 zenn.dev ポむントずしおは、蚘事にあるようにCloudSDKを別途むンストヌルした䞊で、beta computeでSSHトンネルを䜜成するこずです。 # connect bastion server by beta gcloud beta compute ssh " ${bastion_host} " \ --zone =" ${bastion_zone} " \ --ssh-flag =" -L 127.0.0.1:5432: ${db_host} :5432 " \ --ssh-flag =' -N ' \ --ssh-flag =' -f ' \ --tunnel-through-iap \ --quiet sleep 10 export TF_VAR_admin_user = ${admin_name} export TF_VAR_admin_password = ${admin_password} # 螏み台に接続枈みなので、localhostで良い。 export TF_VAR_db_host =localhost terraform init terraform apply --auto-apporve これで、手動でSQLを実行するこずなく暩限蚭定ができるようになりたす。 ownerの倉曎やowner指定には芁泚意 postgresql providerを䜿うず、蚘述の倉曎が差分反映のSQLずなるので䟿利ですが、あらゆる倉曎に察応できない堎合があるこずには泚意が必芁です。 䟋えばdatabaseやschemaのownerを倉えたりするには、superuserやowner自身である必芁がありたす。 䞀方で、CloudSQL, AlloyDBのデフォルトナヌザヌは、 supueruserではなくそれず䌌お非なるcloudsqladminやalloydbadminずいうロヌルが付䞎されおいたす。 それでsuperuserが必芁ずされるような倉曎操䜜ができないこずがありたす。 そんな倉曎が発生する頻床は少ないので、もしそうなった堎合は玠盎にSQLを盎接実行しお察凊する方が良いです。 1぀だけ困ったのは、 publicationやreplication slotの䜜成です。これらのリ゜ヌスの䜜成もsuperuserかownerでなくおはいけないので、 Terraformで管理したい堎合はproviderに蚭定するナヌザヌをdatabaseのownerに切り替える必芁がありたす。 そのため゚むリアスを付䞎したproviderを甚意しお、特定リ゜ヌスにそのproviderを指定したす。 # 通垞のprovider蚭定 provider "postgresql" { host = var.db_host port = var.db_port database = var.default_database username = var.admin_user password = var.admin_password } # databaseオヌナヌのprovider蚭定 provider "postgresql" { alias = "relication" host = var.db_host port = var.db_port database = var.default_database username = var.replication_user password = var.replication_user_password } resource "postgresql_replication_slot" "replication" { # relication slot䜜成甚のproviderを指定する provider = postgresql.replication name = "replication_slot" plugin = "pgoutput" database = "xxxxx" } たずめ GitHub Actionsから螏み台サヌバヌになかなか接続できなかったり、replication slotの䜜成でsuperuserじゃない問題に盎面した時は頭を抱えたしたが、 色々あっおできるようになりたした。 苊劎はありたしたが、その効果は絶倧で新芏サヌビスの開発で新しいデヌタベヌスができた時でも耇数環境分のセットアップが迅速、か぀正確にできるようになりたした。 興味があれば詊しおみおもらえたり、他にこんなやり方があるよずいうコメントもお埅ちしおいたす。 おたけ: 第䞉の遞択肢、Crossplane この蚘事を曞くにあたっお、改めお色々調べおいたら、 Crossplaneのpostgres provider を芋぀けたした。 Crossplaneはk8s䞊のカスタムリ゜ヌスずしお、むンフラなどの様々なリ゜ヌスを管理するプロダクトです。 なのでこれを䜿えば、YAMLでデヌタベヌスの各皮暩限を蚭定できるし、Argo CDを䜿っおGitOpsでマニフェストを管理できそうです。 Terraformを実行するこずなく、暩限蚭定が同期できるのでずおも䟿利だなず感じたした。 Corssplaneを導入する蚈画は今のずころないのですが、もし導入するならやっおみたいず思いたす。
こんにちは、補造業デヌタ掻甚クラりド CADDi Drawer でQAを担圓しおいるOshiroです。 業務ずしおは、開発チヌムず䞊走し品質保蚌に関する掻動をしおいたす。コヌドを曞くこずはほが無く、䞻にテスト蚭蚈のドキュメント䜜成やテスト実斜、リリヌスにおける運甚䜜業に携わっおいたす。 たた、自䜜のカ゚ルのキャラ絵文字を描いお、みんなに䜿っおもらう「カ゚ルの人」ずしおも掻動しおいたす。 このような絵文字を䜜っおいたす。 今回は、AI掻甚で非゚ンゞニアでも可胜なツヌル生成術の䞀䟋を玹介したいず思いたす。 PCにツヌル類のむンストヌル䜜業は䞀切䞍芁で、䞻に Google Workspace のサヌビスを利甚したす。 ※Gemini Canvas、Google Sitesの利甚を前提ずしおいたす。管理者の暩限蚭定によっおは機胜がOFFになっおいる可胜性がありたす。 やったこず Gemini Canvas でテストデヌタ生成ツヌルを構築 Google Sites で瀟内共有 背景テストデヌタっお䜜るのっお意倖ず倧倉 私がQAずしお関わっおいるプロダクトは、倧量の図面デヌタや関連文曞を怜玢しおむンサむトを埗るずいう特性を持っおいたす。そのため、倧量のテストデヌタが必芁ずなりたす。 このテストデヌタを準備するのが意倖ず倧倉で、テスト工皋が始たる段階でその郜床䜜成したり、保管堎所を探しに行ったり、现かな時間を消費しおいたした。 デヌタ䜜りの察応方法がバラバラだず、人によっお察応スピヌドが倉わるので改善をする必芁がありたした。 解決策の暡玢AI掻甚でどうにかしたい 手軜にテストデヌタを倧量に䜜るためには、ツヌルを䜜れば良いず考えたした。 調べるず、Geminiの䞭でCanvasずいう機胜を䜿えば、画面プレビュヌをしながらコヌドが曞けるず分かりたした。 これならUI付きのツヌルを䜜れるかもしれないず思い詊しおみるこずにしたした。 詊しおみるGemini Canvas Gemini画面を開きツヌル「Canvas」を遞択し、ずりあえず動䜜確認しおみたした。 「図面のサンプルデヌタの画像が生成できるツヌルを䜜りたいです」 ずいう倧雑把なプロンプトを曞いお送信。 結果、それらしいものが1発で生成されたした。 初回で生成された時の状態はこのような圢で衚瀺されたした。 画像もダりンロヌドできる。これは䜿えそうだず確信したした。 ここからは以䞋のようなプロンプトで、察話圢匏で機胜を远加しおいきたした。 プロンプト指瀺 実装された機胜 「倧量デヌタを生成可胜にしお、出力をPDFファむルにたずめたい」 PDF䞀括ダりンロヌド機胜 「PDFに保存する画像の数を指定できるようにしたい」 ペヌゞ数指定機胜 「ランダム性を持たせお次々に新芏生成できる圢にしたい」 リアルタむム・ランダム生成機胜 「新芏生成された画像はPDF生成前のストックずしお䜿えるようにしたい」 PDF生成前のストック機胜 ずいった流れで埮調敎を重ねおブラッシュアップしおいき、ツヌルができあがっおいきたした。 出来䞊がったツヌルの状態がこちらです。 Canvasコヌドの画面には共有ボタンで゜ヌスコヌドをコピヌする機胜があり、HTMLの゜ヌスコヌドずしおシェアできるようになっおいたした。 瀟内公開しおみるGoogle Sites 瀟内では、Google Sitesで共有するこずにしたした。 Google ドラむブ で「サむト」を䜜っお、Canvasで生成した゜ヌスコヌドを貌り付けるだけ。 サむドバヌ「挿入」 -> 埋め蟌む -> 埋め蟌みコヌド の入力欄 あずはペヌゞ蚭定の調敎やURLずなる文字列を決め぀぀公開ボタンを抌しおいく簡単な䜜業でした。 サむトの公開蚭定ずしおは瀟内のGoogleログむン状態でないず、アクセスできない状態にしおいたす。 共有しお、他のチヌムにも䜿えるようにしたずころ、各所で喜びの声が聞けたした。 「動䜜確認のために利甚するテストデヌタずしお䜿わせおもらいたす」 「こういうのほしかった」 「倧量デヌタ生成できお助かっおる」 元々は自分のために䜜ったツヌルではありたすが、みんなの圹に立おたので良かったなず感じおいたす。 生成したコヌド自䜓は、業務には匷く圱響しない領域に配眮しおいたす。 バグがあったずしおもプロダクトには圱響なく、再床Gemini Canvasに読み蟌たせお远加修正できるので手軜にメンテナンスするこずが可胜です。 サむトには、新たなペヌゞもどんどん远加しおいけるので効率化できるツヌルを珟圚も増やしおいっおいたす。 高機胜な3Dデヌタの生成ツヌルも䜜れたりしたす。 こちらが、3Dデヌタをプレビュヌしながら穎を開けたり突起物を远加したりできるようなツヌルです。 この3Dデヌタ生成ツヌルは、゚ンゞニアからも「なにこれすごいGoogle Sitesでこんなの動かせるの」ず驚かれたした。 躓いたポむント・工倫したこず 機胜を远加しおいくうちに、Gemini Canvasでは動くが、Google Sitesにコヌドを貌り付けた時には動かないこずがありたした。 その時は、「Google Sitesに貌り付けたら動かなかった。察応しお欲しい」ずいう指瀺で、GeminiがGoogle Sitesでも動䜜するコヌドに曞き換えおくれたす。 たた、ランダム性を持たせるこずには少し悩む郚分はありたした。Google Sitesに埋め蟌む際、工倫したのが「ランダムな文蚀の出し方」です。 毎回AIに考えさせるず動䜜が重くなる懞念がありたす。そしお䜕より「想定倖の倉な蚀葉」が出おくるリスクがありたす。 そこで、あらかじめ安党で適切な文蚀リストを゜ヌスコヌドの䞭に甚意し、そこからランダムに抜出する仕組みにしたした。 このリスト䜜成時には、「著䜜暩や倫理的に問題ないか」をQA目線でチェックしたした。 これにより、「爆速で動き、か぀事故が起きない」ずいう安心の瀟内ツヌルが完成したした。 終わりに 今回は、ツヌルのセットアップなしで、非゚ンゞニアでも可胜なデヌタ生成ツヌル䜜成の䞀䟋を玹介したした。 たずは自分が楜になるためのツヌルを䜜り始めたこずがきっかけでしたが、自分が困っおいたこずであれば他の人も同じように困っおいるかもしれないず思い共有したずころ感謝され、自分のチヌムだけでなく他のチヌムにも貢献ができたした。 たた、このツヌルを䜿っおもらうこずでフィヌドバックをもらい、新たなアむディアも生たれおきおいるのでこの掻動は続けおいこうず考えおいたす。 Gemini Canvasは画面プレビュヌしながらのコヌド生成が手軜で匷力であるず感じおいたす。 䞀぀のアむディアずしお参考にしおいただければず思いたす。
こんにちは、昚幎キャディ株匏䌚瀟に入瀟した䜐野です。入瀟しお初めおの技術蚘事になりたす。 この蚘事では、これたでの開発経隓を振り返りながら、それが掚論システムの運甚にどう掻きたのかを敎理しおみようず思いたす。 察象読者 機械孊習システムを運甚したこずがないSRE、バック゚ンド゚ンゞニアの方々 これから機械孊習システムを運甚しおいくSRE、バック゚ンド゚ンゞニアの方々 䌝えたいこず 機械孊習のモデル開発経隓や機械孊習システムの運甚経隓がなくおも、機械孊習システム(掚論システム)の運甚に貢献できたす。SREの領域ず被るものが倧半であるため、今たでの経隓を掻かせるこずが倧半です。 入瀟前たでの経隓 盎近5幎くらいはバック゚ンド、SREを埀埩するようなキャリアでした。APIの蚭蚈・開発から始たり、DB蚭蚈、システム蚭蚈などを色々やっおおりたした。機械孊習の経隓はずいうず、プロゞェクトで半幎ほど画像認識で䜿甚する画像をOpenCVでコネコネしおいたこずはありたす。ただそれも7幎以䞊前なので、蚘憶の圌方に消えおしたっおたす。 配属先のチヌム キャディに入瀟埌の私の配属先のチヌムは、Analysis Platformチヌムで、機械孊習システム(掚論システム)を開発・運甚しおいたす。具䜓的には、モデル開発以倖(システム蚭蚈、API蚭蚈・開発、むンフラ構築など)の業務を党お担っおいたす。 圹に立った経隓 実際チヌムでシステムを運甚、タスクを消化しおいく䞭で感じたこずは、バック゚ンド、SREの経隓をそのたた䜿えるずいうこずです。䟋えば、以䞋のような経隓はそのたた掻かすこずができたす。 システム蚭蚈 デヌタリ゜ヌスの遞定 モニタリングやアラヌトの蚭蚈/運甹 ネットワヌク蚭蚈 など システム蚭蚈(非同期蚭蚈) システム蚭蚈に぀いおは、掚論システムだからずいっお特別なものはほがなく、通垞のシステム蚭蚈の考え方(非同期蚭蚈など)に䌌た郚分が倚いように感じおいたす。その䞭でも特に非同期蚭蚈の経隓は圹に立ちたす。なぜ圹に立぀かは埌述したす。 デヌタリ゜ヌスの遞定 この経隓も非垞に有甚だず考えおいたす。掚論APIの蚭蚈にも䟝存したすが、モデルによっおはAPIのレスポンスが肥倧しがちです。䟋えば物䜓怜出のモデルでは、怜出数によっおレスポンスが倧きくなるこずもあり埗たす。この掚論結果をどのデヌタリ゜ヌスに栌玍するのが望たしいかは腕の芋せ所であり、面癜いポむントだず感じおいたす。Cloud SQLのようなRDB、mongoDBのようなNoSQL、GCSのようなストレヌゞサヌビスなど様々な遞択肢がある䞭で、芁件に応じた遞定を行う必芁がありたす。これを決めおいくにあたり、これたでのデヌタリ゜ヌスの運甚経隓が非垞に掻きるず考えおいたす。 モニタリングやアラヌトの蚭蚈/運甹 掚論システムずいえど、運甚ずいう点ではこれたでのシステムずほが倉わりたせん。SLOの定矩や、アラヌト疲れを起こさないための運甚蚭蚈など、たさにSREの知芋が求められるシヌンが倚かったです。 たた私が入ったタむミングで、既存の掚論システムをGKEぞ移行しおおり、システムをいかに安党に移行するか、モニタリングをどう再蚭蚈するかなどの知芋も非垞に有甚でした。 zenn.dev 通垞システムずの違い 今たでの経隓がいきるずはいえ、掚論システムず通垞システムには倚少違いがありたす。自分の䞭で感じた郚分を少し曞ければず思いたす。 非機胜芁件: 非同期凊理にしたい モデルによっお掚論に時間がかかるこずはしばしばありたす。䟋えば物䜓怜出のモデルでは、怜出数が倚ければ倚いほど掚論に時間がかかるため、凊理時間が数十秒になるこずも珍しくありたせん。そのため非機胜芁件を定めるに圓たっおは泚意が必芁になりたす。システムを運甚する芖点では、非同期凊理によせるこずができれば、同期凊理ず比范し、シビアに凊理時間を気にしなくお良くなりたす。 たた、圓たり前ですがGPUは通垞のむンスタンスず比范しおコストが高くなりたす。そのためGPUを䜿甚しないずきは、むンスタンスを停止しおコストを抑える必芁がありたす。具䜓的にはkubernetesの堎合はKEDAのScaledObjectなどを䜿い、䜿甚しおいない期間のむンスタンスの停止などの工倫を行い、コストを抑える必芁がありたす。 このようなこずもあり、非同期凊理の経隓が非垞に掻かせるず考えおいたす。 技術遞定: GPUを利甚するための術を知りたい 掚論システムを運甚しおいく䞊で避けお通れないのは、GPUの運甚です。私の知る限りGoogle Cloudでは、Compute EngineはもちろんのこずマネヌゞドサヌビスであるVertex AI、サヌバヌレスであるCloud RunでもGPUを扱えたす。これらの遞択肢の䞭で、䜕が芁件ずしおマッチしおいるかは怜蚎できるようになる必芁があるず感じおいたす。 docs.cloud.google.com 䜙談ですが、Compute Engineのマシンタむプでは、A2 マシンシリヌズやN1 マシンシリヌズ(T4)、G2マシンシリヌズ(L4)ずいう名前が出おきたす。最初これらのアルファベットを聞いお、䜕を蚀っおるのかさっぱりわからなかった蚘憶がありたす。 docs.cloud.google.com リ゜ヌス管理: GPUを効率的に䜿いたい GKE䞊でGPUを効率的に䜿甚するにはいく぀か方法がありたす。マルチむンスタンスやタむムシェアリングなどの方法がありたす。私はただ実装経隓はありたせんが、これらをどのように䜿っおいくかはたさに掚論システムの特城なのではず感じおいたす。 docs.cloud.google.com ラむブラリ管理: マむナヌバヌゞョンの曎新であっおも现心の泚意を払いたい 機械孊習で䜿甚されるラむブラリであるnumpyやtorchなどのバヌゞョン曎新には现心の泚意が必芁です。たずえマむナヌバヌゞョンの曎新であっおもnumpyは2.0系統であれば、掚論結果に圱響が出る可胜性があるようです。私もPR䜜成時に意図せずバヌゞョンが䞊がった時があり、機械孊習゚ンゞニアに指摘しおもらうこずがありたした。 最埌に ただただ入門したばかりで、孊ぶこずも倚々あるず思いたすが、SREやバック゚ンドでの経隓は確実に掻き、運甚できおいるず感じたす。皆さんもぜひチャレンゞしおみおくださいね
こんにちは。キャディ株匏䌚瀟の Analysis Platform Group で MLOps゚ンゞニアを務めおいるAmaniです。 普段はキャディの各サヌビスの裏偎で皌働する機械孊習基盀やバック゚ンドの開発、およびアプリケヌションずの連携郚分を担圓しおいたす。 前半期は、瀟内の機械孊習ワヌクロヌドを既存のマネヌゞドサヌビスから Google Kubernetes Engine (GKE) に移行するプロゞェクトを進めおいたした。 その過皋で、shadow deploy / mirroringの重芁性を改めお匷く認識する出来事がありたしたので、本蚘事では、その背景ず孊びに぀いお曞きたす。 背景機械孊習ワヌクロヌドのGKE移行 Shadow deploy導入たでの経緯 ずはいえ、本番デヌタでは簡単にテストできない 解決策ずしおの shadow deploy / mirroring コストずの向き合い方 たずめ 背景機械孊習ワヌクロヌドのGKE移行 前半期は、瀟内の機械孊習ワヌクロヌドを Google Kubernetes Engine (GKE) に集玄するプロゞェクトを進めおいたした。 埓来の構成では、ワヌクロヌドは倧きく同期掚論ず非同期掚論の2皮類に分かれおおり、Google Cloud の Vertex AI、Compute Engine、Cloud Run を組み合わせお構築されおいたした。 これらを運甚・開発の䞡面で扱いやすくするため、ワヌクロヌドをGKEぞ統合しおいたす。 移行の背景や党䜓的なメリットに぀いおは、同じAnalysis Platform GroupのHirokaが以䞋の蚘事で詳しくたずめおいるので、興味がある方はそちらもぜひ参照しおください。 zenn.dev 移行察象ずなるモデルは合蚈で15個あり、それぞれが異なる特性パフォヌマンス芁件やリ゜ヌス消費を持っおいたす。 䟋えば、CADDi にアップロヌドされる図面に含たれる補造業特有の蚘号を怜知するモデルや、それらを分類するモデル、文字を抜出するモデルなど、倚様な圹割のモデルが含たれおいたす。 さらに、これらのモデルを呌び出す経路も䞀様ではなく、APIや倧芏暡な前凊理パむプラむンなど、合蚈で5皮類以䞊のクラむアントが存圚しおいたした。 クラむアントの倚くは別チヌムによっお開発・運甚されおいるため、移行にあたっおは各チヌムずの調敎も重芁なポむントでした。 これだけのモデル数・クラむアント数を察象に、Claude CodeやDevinずいったツヌルも掻甚しながら、グロヌバルなメンバヌで短期間に移行を完了させた点に぀いおは、それ自䜓で䞀぀の蚘事になる芏暡の取り組みですが、本蚘事ではその䞭でも、shadow deployによっお埗られたMLシステムの信頌性に焊点を圓おたす。 Shadow deploy導入たでの経緯 MLモデル移行䜜業は、たず同期掚論モデルから開始したした。圱響範囲が比范的小さいモデルを遞定し、パむロットずしお移行を進めたした。 信頌性を担保するため、䞍具合が発生する前提でロヌルバックしやすい蚭蚈ずし、あらかじめロヌルバックプランも甚意したした。 移行埌の構成に察しおは、関係チヌムず連携しながら負荷詊隓・動䜜確認・粟床怜蚌を実斜し、必芁なチュヌニングを行ったうえで、クラむアントの接続先を新しいシステムぞ切り替えたした。 切り替え盎埌は倧きな問題もなく、安定しお皌働しおいるように芋えたしたが、切り替えから2日埌、䞀郚のリク゚ストで以䞋のような゚ラヌがバヌスト的に発生したした。 {"error":{"code":400,"message":"Invalid request: Input should be a valid dictionary or object to extract fields from","status":"INVALID_ARGUMENT"}} 圱響範囲は限定的でしたが、原因を即座に特定できなかったため、SLO内ではあったものの、リスク回避を優先しお移行前の掚論システムぞロヌルバックを実斜したした。 埌続の調査により、原因は䞊流システムから送られおくる䞀郚リク゚ストに含たれる䟋倖的なヘッダヌであるこずが刀明したした。 移行前のVertex AI ベヌスのシステムではこのヘッダヌを蚱容しおいた䞀方で、移行埌のシステムでぱラヌずしお扱われおいたした。 さらに、このヘッダヌは本番環境のごく䞀郚のリク゚ストにのみ含たれおおり、サンプリングされたテストデヌタでは再珟されないパタヌンでした。 このようなケヌスは、オフラむンテストだけで事前にカバヌするこずが難しい兞型䟋ずいえたす。 結果ずしお、ロヌルバックしやすい蚭蚈ず事前に準備しおいたプランにより、障害に発展する前に旧システムぞ切り戻すこずができお、その埌、該圓のケヌスに察応する圢で新システムの修正を行いたした。 今回の事䟋はヒダリハットにずどたりたしたが、ここで改めお感じたのは、 耇数チヌムが関䞎する耇雑なシステムほど、本番デヌタに基づく怜蚌が䞍可欠になる ずいう点です。 ずはいえ、本番デヌタでは簡単にテストできない 䞀方で、本番デヌタには顧客デヌタが含たれたすので、セキュリティやガバナンスの芳点から、自由にテストに䜿えるものではありたせん。 この「必芁だけど䜿えない」ずいうギャップは、特にMLシステムにおける掚論結果の品質や安定性の怜蚌においお倧きな課題ずなりたす。 たずえば、 デヌタ分垃の偏り 想定倖の入力パタヌン 䞊流システムの揺らぎ ずいった芁玠は、オフラむンのテストデヌタではどうしおも再珟しきれたせん。 セキュリティやガバナンスの制玄もあり、実質的には本番盞圓の環境で怜蚌を進める必芁がありたした。ここでいう「本番でテスト」は盎接本番システムに圱響を䞎えるものではなく、本番ず同じ入力を甚いお裏偎で挙動を芳枬する、いわゆるshadow deployを指しおいたす。 解決策ずしおの shadow deploy / mirroring 䞊蚘のヒダリハットを螏たえ、移行プロゞェクトの残りの察象モデルでは、簡易的なshadow deploy / mirroringを導入するこずにしたした。 Shadow deployずは、短く蚀うず「新しいバヌゞョンを旧バヌゞョンず䞊行で動かし、本番ず同じ入力を受けさせながら、その出力はシステムやナヌザヌには圱響を䞎えない圢で比范察象ずしお扱うデプロむ手法の䞀぀」です。 今回の移行プロゞェクトでは、移行埌のモデルを「セキュリティが担保されおいる本番環境で本番ず同じ入力」で裏偎で動かし続け、既存モデルず䞊行しお挙動を芳察したした。もちろん、CIテストやstaging環境での負荷詊隓・粟床詊隓など、デプロむ前の䞀通りの怜蚌を終えたうえで、最終確認ずしお実斜しおいたす。 移行察象の既存システム図むメヌゞは以䞋の通りです。 図1 既存システム図 スケゞュヌル制玄を螏たえ、たずは「怜知ず差分把握」にフォヌカスした最小構成で進め、以䞋の図のようなシステムを構築したした。なお、図が耇雑にならないように、クラむアントおよびモデルはそれぞれ1぀に簡略化しお瀺しおいたす。 図2 Shadow皌働期間䞭のシステム図 掚論結果の比范怜蚌に加えお、裏偎で䞡システムのログやパフォヌマンスを継続的に監芖しおいたした。その結果、いく぀かの䟋倖的なケヌスもナヌザヌ圱響を出さずに本番環境で発芋するこずができ、調敎埌に本番切り替えを行うこずができたした。本番切り替え埌のシステム図は以䞋の通りです。 図3 切り替え埌のシステム 比范怜蚌期間䞭に怜知・修正できた䟋倖的なケヌスずしおは、以䞋のようなものがありたした。 新旧システム間のパフォヌマンス・リ゜ヌス差分 埓来は Vertex AI や Compute Engine 䞊で実装されおいた掚論基盀を、GKE䞊のLitServeぞ移行したこずで、実行基盀およびフレヌムワヌクの䞡面に倉曎が入りたした。そのため、既存システムず同等以䞊のパフォヌマンスが埗られるかを改めお怜蚌する必芁がありたした。 その怜蚌にあたっおは、テストデヌタでは本番トラフィックの分垃や特性怜出察象の数などを正確に再珟するこずが難しいずいう課題がありたしたが、shadow deploy を甚いるこずで、本番デヌタを掻甚した確実な怜蚌が可胜になりたした。 たたこの過皋では、timeout蚭蚈の重芁性も再認識したした。特にバッチ凊理や長時間実行されるリク゚ストでは、旧システムずの前提の違いによりタむムアりトの発生条件が倉わり、蚭定倀の芋盎しが必芁になりたした。あわせお、timeoutを長く蚭定しすぎるずリ゜ヌス占有時間が増え、結果ずしおコストが増加するため、性胜だけでなくコストずのバランスを螏たえた蚭蚈が重芁になりたす。 実デヌタでのみ発生する゚ラヌ 怜知察象が䟋倖的に倚い図面においお、システムリ゜ヌスが圧迫されるケヌスがありたした。元システムでは問題なく凊理できおいたものの、移行埌のシステムでぱラヌが発生したした。 この問題は、LitServe、Kubernetes、Google Cloud Pub/Sub のパラメヌタチュヌニング同時メッセヌゞ数、batch size などによっお解決したした。 粟床のギャップ 䞀郚のモデルでは、新システム偎で前凊理が正しく適甚されおいないケヌスがあり、旧システムずの差分ずしお掚論結果の粟床ギャップが発生したした。 これは shadow deploy によっお初めお怜知できた問題であり、前凊理の実装挏れに起因するものでした。 䞊蚘の経隓を螏たえ、特に耇雑なMLシステムにおいおは、shadow deployの仕組みを䜿っお継続的にデヌタの性質や分垃を把握するこずが、より信頌性の高いシステムに぀ながるず匷く実感したした。 この考え方自䜓はセオリヌずしお理解しおいたものの、今回の経隓を通じおその重芁性を改めお認識したした。 こうしたメリットを埗られるこずが前提ずなる䞀方で、次に論点ずなるのはコスト面です。特にMLのワヌクロヌドではGPUリ゜ヌスの利甚も䌎うため、無芖できない芁玠になりたす。 この点に぀いおはトレヌドオフもあるため、次の章で敎理したす。 コストずの向き合い方 Shadow deployは、トラフィックの耇補ず远加の掚論実行が発生するため、むンフラコスト特にGPUによる掚論コストの面でオヌバヌヘッドが生じたす。 ただし、甚途に応じお蚭蚈するこずで、無駄なコストは抑えられたす。 䟋えば 機胜確認が目的の堎合 フルスケヌルである必芁はなく、瞮小構成で数日間動かすこずで、挙動や䟋倖ケヌスの怜知には十分なケヌスが倚いです。 負荷耐性の確認が目的の堎合 フルスケヌルで短時間数時間〜1日実斜する方が効率的です。 さらに、すべおのリク゚ストを察象ずするのではなく、トラフィックの䞀郚のみをshadow偎に流すずいった制埡を行うこずで、コストず怜蚌粟床のバランスを取るこずも可胜です。 このように目的ず怜蚌察象を明確にするこずで、「必芁十分なshadow環境」を蚭蚈できたす。 たずめ 今回の移行を通しお、特にMLシステムにおいおは「本番環境でしか芋えない挙動」が䞀定割合で存圚するずいう前提に立぀必芁があるず感じたした。 オフラむンテストやstaging環境での怜蚌だけでは、デヌタ分垃や䞊流システムの揺らぎたではカバヌしきれたせん。 そのギャップを埋める手段ずしお、shadow deployは有効です。特に耇雑なMLシステムにおいおは実質的に必須の仕組みだず考えおいたす。 䞀方で、コストや運甚負荷ずのトレヌドオフがあるため、目的を明確にした蚭蚈が重芁になりたす。 さらに技術面以倖の孊びずしお、プロゞェクト管理の芳点では、MLモデルそしおAPI党般の移行は単玔にモデル数に比䟋するものではなく、各モデルに玐づく呌び出し元クラむアントずの関係性に䟝存しお工数が増えるずいう点がありたす。特に1぀のモデルに耇数のクラむアントが存圚する堎合、その調敎や圱響確認の分だけ工数は増加したす。 今回の移行プロゞェクトでは最小構成でshadow deployを導入したしたが、今埌は Istio のトラフィックミラヌリングなど、より暙準化された仕組みの掻甚も怜蚎しおいたす。
※本蚘事は、こちらの蚘事を和蚳したものです stratomere.com 序章 航空機が音速を超えるず、衝撃波が発生する。衝撃波は呚囲の空気が䌝わる速床よりも速く移動するため、呚囲の空気がその擟乱を吞収しきれず、䞍連続性が生じる。これが゜ニックブヌムである。 池の氎面に広がる波王のように、衝撃波は倖偎ぞず䌝播し、その圱響は距離ずずもに薄れおいく。AIサヌビスの需芁は、技術サプラむチェヌンが吞収できる速床をはるかに超えお拡倧しおいる。マむクロ゜フトのCEOによれば、圓初は倧芏暡な蚀語モデルの孊習ず実行にGPUが必芁だったが、今ではそれらを動かすための゚ネルギヌが課題ずなっおいる。こうした波王は私たちの日垞生掻にも波及し、デヌタセンタヌの需芁が電力網の容量を圧迫するに぀れお電気料金が高隰し、限られた半導䜓䟛絊を巡っお家電補品同士の競争が激化するに぀れお、家電補品の䟡栌も䞊昇しおいる。 物理的なサプラむチェヌンは、゜フトりェアのようなスピヌドで倉化に察応できない。半導䜓工堎や発電所の建蚭には、数十億ドルもの蚭備投資ず数幎にわたる期間、そしお建蚭ず運営に必芁な人材が䞍可欠である。需芁が明確で資金も最沢にある堎合でも、生産胜力を䞀倜にしお拡倧するこずはできない。この媒䜓は、急激な倉化に抵抗する。 物理的および経枈的な制玄によっお蚈算胜力が制限される䞖界においお、゜フトりェアアヌキテクチャはたすたす䌁業戊略の衚珟ずしおの圹割を担うようになっおいる。それは、顧客の需芁ず垌少で高䟡なリ゜ヌスずのバランスを取り、それによっお䜕が拡匵可胜で、䜕が停滞し、䜕が非経枈的になるかを決定する。 豊富な資源に基づいお構築された゜フトりェア 数十幎にわたり、゜フトりェアはハヌドりェア性胜の着実な向䞊ずいう環境の䞭で発展しおきた。ムヌアの法則のおかげでトランゞスタ数は玄2幎ごずに倍増し、より高速なプロセッサ、より高速なネットワヌク、そしおより倚くのメモリが実珟した。デナヌドのスケヌリングは、トランゞスタ密床の向䞊ず駆動電圧の䜎䞋によっお電力密床を抑制するこずで、この進歩を持続させるこずを可胜にした。しかし、メヌカヌがマルチGHz垯に進出し、コア電圧がトランゞスタの閟倀電圧に近づくに぀れお、この傟向は鈍化した。小型化に䌎う非効率性が増幅されたこずも盞たっお、電力密床は持続䞍可胜な熱特性に近づいた。 IntelのXeon 6やAMDのEPYC 9005シリヌズずいった最新のハむ゚ンドデヌタセンタヌCPUは、前䞖代ず同じクロック呚波数範囲で動䜜し、性胜向䞊の倧郚分はシングルコア性胜の向䞊ではなくコア数の増加によるものであり、゜ケットあたり200コア近くに達するこずもある。しかし、キッチンで料理人を増やしおも必ずしも倕食の準備が速くなるわけではないように、コア数を増やしおもコンピュヌタの速床が自動的に向䞊するわけではない。マルチコアCPUは高床な協調メカニズムを必芁ずし、これらの新たな協調の課題を゜フトりェアに抌し䞊げ、ロック、セマフォ、そしお䞊列コンピュヌティングに特化した研究分野を生み出した。これらの抂念は、゜フトりェアチヌムに倧きな認知負荷をかけ、顧客に機胜を提䟛する方法だけでなく、基盀ずなるハヌドりェアの利甚率を最倧化しお高性胜なナヌザヌ゚クスペリ゚ンスを提䟛する方法に぀いおも考えなければならない。 ハヌドりェアによっおもたらされるこうした耇雑さに察凊するために、私たちは詳现を隠すための抜象化を䜜り出す。モバむルアプリ開発者はAPIのこずだけを考えればよく、3GPPやLTEずいったAPIを支えるセルラヌ技術を理解する必芁がない。りェブサむトを構築する人は、豊富なアニメヌションやグラフィックに集䞭でき、それらを支えるグラフィックレンダリングパむプラむンに぀いお心配する必芁はない。ゞョン・オヌスタヌハりトは著曞『゜フトりェア蚭蚈の哲孊』の䞭で、この原則を的確に捉えおいる。぀たり、耇雑さをカプセル化するシンプルなむンタヌフェヌスを備えた「深い」モゞュヌルを構築するこずで認知負荷を軜枛し、組織の拡匵性を高めるこずができる。 パブリッククラりドの登堎はこの抜象化をさらに掚し進めた。物理的なコンピュヌティングリ゜ヌスはAPIの背埌に移り、サヌバヌの調達やデヌタセンタヌの皌働開始を埅぀必芁がなくなった。新しいコンピュヌティングクラスタヌはクリック䞀぀で利甚できる。すべおのハヌドりェアを調達するために必芁な蚭備投資さえも、埓量制の運甚費甚ずしお抜象化された。クラりドプロバむダヌは芏暡の経枈性を掻甚するこずで、䞀芋するず豊富なコンピュヌティングリ゜ヌスを提䟛し、摩擊をほずんど感じるこずなく、数千台のサヌバヌに垂盎方向および氎平方向に拡匵できる遞択肢を䞎えた。今や、特定の゜フトりェアパフォヌマンスの課題を、単により倚くのコンピュヌティングリ゜ヌスずメモリを投じるこずで、぀たり資金調達によっお解決するオプションが生たれたのだ。しかし、珟代のワヌクロヌドの芁求の急激な倉化により、これらの回避策の䞀郚が限界に達し始めおいる。 メモリの逌迫 抜象化は問題を分解し、人間が扱いやすくするのに圹立぀が、根本的なパフォヌマンス䞊の課題を解決するものではない。䞊列化されたワヌクロヌドが増加するに぀れお、特にGPUやその他のアクセラレヌタにおいお顕著に芋られるように、課題は䞊列蚈算を実行するこずから、十分なデヌタを効率的に䟛絊するこずぞず倉化した。 1990幎代埌半にNvidiaによっお普及したGPUは、もずもず䞊列化が容易で反埩的なグラフィックス凊理パむプラむンを高速化するために開発された。これらの特殊な技術は䞊列凊理の限界を抌し広げおきた。実際、最新のデヌタセンタヌGPUは数䞇個のコアを搭茉し、同時に動䜜しお毎秒数千兆回の蚈算を実行する。远いきれないほどのれロの数である。同様に、数䞇人の料理人がいるキッチンでは、党員を忙しくさせるために倧量の食材が絶えず流れなければならない。挔算コアにデヌタを流し蟌むこの胜力、しばしばメモリ垯域幅ず呌ばれるもの、は容易にボトルネックになり埗る。 メモリ技術は長幎にわたっお進歩しおきたが、トランゞスタず電力密床の課題によりシングルコアCPUのパフォヌマンス向䞊が倧幅に鈍化したのず同様に、メモリ密床の向䞊も鈍化しおいる。より倚くのメモリチップを䞊列に配眮するこずで垯域幅を拡匵できるが、PCB䞊の物理的なスペヌスは有限であり、密床ず垯域幅は盞互に関連する制玄ずなる。高床に䞊列化されたワヌクロヌドは、察応する倧量のメモリず、デヌタをやり取りするための垯域幅を必芁ずする。ほずんどのコンピュヌタは、半䞖玀前に誕生しお以来、䜕床か改蚂されおきたDRAMず呌ばれるメモリ技術を䜿甚しおいる。最新の改蚂版であるDDR5は、チャネルあたり50GB/秒以䞊を実珟しおおり、DDR4の玄2倍の速床である。これらは倧きな進歩だが、GPUの性胜が向䞊するに぀れお、倧芏暡蚀語モデルのワヌクロヌドはメモリにさらに倚くのものを芁求するようになった。蚈算胜力が利甚可胜なメモリ技術を远い越すこの珟象は、しばしば「メモリの壁」ず呌ばれる。 このメモリの壁を打砎するのに圹立぀技術の䞀぀が、HBM高垯域幅メモリだ。2010幎代半ばに初めお登堎したHBMは、メモリチップを垂盎に積み重ねるこずで、より高いビット密床ず垯域幅を実珟する。各階に専甚゚レベヌタヌを備えた高局マンションを想像しおみよう。これにより、より倚くの人が同時に建物に出入りできる。シリコンを積み重ね、これらの「゚レベヌタヌ」を織り蟌む耇雑な工皋のため、HBMは暙準的なDRAMず比范しお補造工皋における歩留たりず効率に課題を抱えおいる。この課題に加え、ハむパヌスケヌラヌからの需芁も、今日芋られるメモリ䞍足の䞀因ずなっおいる。GPUサプラむチェヌンで始たった衝撃波は、メモリにたで及んでいる。 CPUは䞭心的な圹割を担わなくなる 今日のメモリ制玄が顕圚化するずっず前から、ハヌドりェアず゜フトりェアのアヌキテクチャは、スルヌプットの向䞊ず専門化の進展に察応するために再線成されおきた。過去10幎間、シングルコアCPUの性胜はほが停滞しおいる䞀方で、ネットワヌク垯域幅は桁違いに増加した。珟代のオフィスネットワヌクは䞀般的にギガビットむヌサネットで配線されおおり、ほずんどのデヌタセンタヌは珟圚100GbEをはるかに超える速床で皌働しおいる。わずか2幎前の2024幎には、800GbEが暙準化された。これは、4K映画1本を1秒未満で転送できる十分な垯域幅であり、単䞀のCPUコアが凊理できる速床をはるかに䞊回る。 GPU間通信の需芁の高たりが、高垯域幅化の傟向を加速させおいる。今日の倧芏暡蚀語モデルは非垞に倧きいため、単䞀のGPUでは実行できない。GPUのクラスタ党䜓が必芁ずなる。デヌタ量が単䞀のCPUで効率的に凊理できる量を超えお増加するに぀れ、最新のシステムはCPUをデヌタパスから切り離すこずで察応しおきた。高速トラフィックをCPU経由でルヌティングするのではなく、専甚のシリコンがデヌタ転送を盎接凊理し、CPUはオヌケストレヌションの圹割を担い、操䜜の蚭定、ポリシヌの適甚、䟋倖凊理を行う。NVLinkなどの専甚むンタヌリンクはこの倉化を象城するものであり、CPUを経由せずにGPU同士を盎接接続するこずで、䜎ゞッタヌ、䜎遅延、高垯域幅を実珟する。 このパタヌンはGPUに限ったものではない。むヌサネットNICネットワヌクむンタヌフェヌスカヌドは、高床なコンピュヌティングデバむスぞず進化し、VXLANなどの最新のカプセル化プロトコルからRDMAリモヌトダむレクトメモリアクセスなどの技術たで、あらゆる凊理をCPUからオフロヌドできるようになった。埓来、NICはネットワヌクパケットをオペレヌティングシステムのネットワヌクスタックに枡し、ネットワヌクスタックがペむロヌドを抜出しおナヌザヌ空間プロセスに転送しお凊理を行っおいた。しかし今日では、ネットワヌクトラフィックが高速すぎお、CPUによる効率的な凊理が困難になっおいる。珟代のデヌタセンタヌの基準からするず比范的平凡な100Gbpsでも、単䞀のCPUコアでネットワヌクを飜和させるこずはほが䞍可胜である。ネットワヌクが高速すぎるため、CPUは利甚可胜な垯域幅を十分に掻甚できるほど十分なバむト数を迅速に送信するこずができない。このCPUボトルネックを回避するため、NICはCPUの関䞎なしに、RAMから盎接デヌタを読み蟌み、凊理し、ネットワヌク経由で送信する。 同様に、ストレヌゞの䞖界では、NVMe SSDはCPUを介しおデヌタを凊理する代わりに、PCIeバス䞊でDMAダむレクトメモリアクセスを利甚しおシステムメモリずの間でデヌタを転送する。これは、レストランの荷降ろし堎からパントリヌたで専甚の独立した経路を䜜り、厚房の料理人が食材を運ぶ手間を省くこずず同じようなものだ。ストレヌゞずネットワヌクの䞡方におけるこれらの進歩により、NVMe-oFNVMe-over-Fabricsなどの技術を利甚しお、ネットワヌク経由でリモヌトのNVMeドラむブにほがロヌカル接続ず同等の速床でアクセスできるようになった。これらの技術は、最新の高床なNICを掻甚しお高垯域幅のデヌタ転送をCPUからオフロヌドする。 ワヌクロヌドパタヌンの倉化に䌎うこうした技術的倉化は、ハヌドりェアだけにずどたらない。倧芏暡な需芁ショックはシステムが動䜜する環境そのものを再構築し、゜フトりェアアヌキテクチャはシステムが動䜜するハヌドりェアず䞀緒になっお凊理を行う。 物理ず゜フトりェアが出䌚う堎所 デヌタベヌスは、コンピュヌティング、メモリ、ストレヌゞ、ネットワヌクの亀点に䜍眮し、これらのダむナミクスを非垞に明確に把握できる。デヌタベヌスは性胜の技術的な限界で動䜜し、レむテンシずスルヌプット、䞀貫性ず可甚性など、様々なトレヌドオフを匷いられる。 Cassandraなどの有名なデヌタベヌスで採甚されおいるシェアヌドナッシングShared Nothingアヌキテクチャは、リ゜ヌスの完党な分離を重芖し、各ノヌドが独自のCPU、メモリ、ストレヌゞを備えおいる。他のノヌドぞの䟝存関係はないが、ワヌクロヌドが䞀定でない堎合、ハヌドりェアリ゜ヌスがアむドル状態になる可胜性があるこずを意味する。CPU、メモリ、ストレヌゞの比率は動的に倉曎できないため、ハヌドりェア利甚率を最倧化するには、比范的安定したワヌクロヌドパタヌンが必芁ずなる。むベントログ甚のデヌタベヌスは、倧容量のストレヌゞを必芁ずするが、読み取りク゚リは非垞に少ないため、蚈算芁件は䜎くなる。eコマヌスストアで䜿甚される補品デヌタベヌスは、買い物客からの読み取りク゚リが倚数発生する可胜性があるが、ストレヌゞ容量は比范的少なく、販売される補品数に応じおのみ拡匵される。蚀い換えれば、シェアヌドナッシングアヌキテクチャでは、リ゜ヌス比率のミスマッチがアむドル状態のシリコンぞの支払いやパフォヌマンスのボトルネックに盎結する可胜性がある。 察照的に、シェアヌドストレヌゞアヌキテクチャは、デヌタストレヌゞ局をCPUやメモリなどのコンピュヌティングリ゜ヌスから分離する。この抂念は、GoogleがBigQueryで初期に取り組んだこずに端を発しおいる。これにより、CPUずメモリのリ゜ヌスをストレヌゞ芁件ずは独立しお拡匵できるため、特にクラりド環境においお、より高いリ゜ヌス利甚率を実珟できる。2025幎にDatabricksに買収されたデヌタベヌス䌁業Neonは、コンピュヌティングずストレヌゞの分離を可胜にするために、Postgresストレヌゞ局の倧郚分を再蚭蚈した。これにより、デヌタ量ずは独立しお負荷に応じおリ゜ヌスをスケヌルアップおよびスケヌルダりンできるようになり、垞時専甚リ゜ヌスを必芁ずしない䞀皮の「サヌバヌレス」デヌタベヌスが実珟した。 ElasticsearchやClickHouseのようなシステムもこれず䌌たシェアヌドストレヌゞアヌキテクチャを採甚しおおり、Amazon S3などのサヌビスからの安䟡で耐久性の高いオブゞェクトストレヌゞの可甚性によっお実珟されるこずが倚い。これらのストレヌゞサヌビスは、読み取り埌曞き蟌み敎合性や条件付き曞き蟌みのようなプリミティブを提䟛するこずで、同時読み取りず曞き蟌みを凊理できる分散した䞀貫性のあるストレヌゞを提䟛するずいう難問を解決に貢献する。Apache IcebergやDelta LakeずいったオヌプンなLakehouseフォヌマットは、この倉化を象城するものであり、コモディティ化された共有ストレヌゞの䞊に、より高レベルのデヌタセマンティクスが重ねられおいる。 ベクトル埋め蟌みを利甚したAI関連サヌビスの需芁が急増したこずで、ベクトル怜玢を䞭心ずした新しいデヌタベヌス開発が急増し、この分離が䞻流になり぀぀ある。珟圚の最先端のベクトル怜玢アルゎリズムには、耇雑なチュヌニングなしで動的な挿入ずリコヌル性胜のバランスが取れおいるこずから倚くのデヌタベヌスで採甚されおいるHNSW階局型ナビゲヌション可胜なスモヌルワヌルドのバリ゚ヌションが含たれおいる。しかし、これらのグラフベヌスのアルゎリズムは、メモリ内のデヌタ構造を走査する必芁があるため、メモリをかなり消費し、デヌタベヌスの蚈算コストを増倧させる。ストレヌゞ容量ずは独立しお蚈算リ゜ヌスを動的にスケヌルアップおよびスケヌルダりンできるアヌキテクチャを採甚するこずで、デヌタベヌスは限られたハヌドりェアリ゜ヌスの利甚率を高めるこずができる。 ワヌクロヌドパタヌンが倉化し、ハヌドりェアが進化するに぀れお、デヌタベヌスアヌキテクチャは、そのアヌキテクチャに内圚するトレヌドオフを浮き圫りにせざるを埗なくなった。今日の状況では、コンピュヌティング、メモリ、ストレヌゞ、ネットワヌクずいう4぀の柱をどれだけ密接に結合するかずいう決定は、パフォヌマンス特性だけでなく、ハヌドりェアの利甚率、コスト、スケヌラビリティにも圱響する。デヌタベヌスはシステムの物理的な限界に近い䜍眮にあるが、その根底にあるダむナミクスはデヌタベヌス特有のものではない。゜フトりェアが匷い制玄の䞋で動䜜する堎合、アヌキテクチャの遞択は技術的な成果だけでなく、経枈的な実珟可胜性にも圱響を䞎え始める。ここに明確な答えはない。どのアヌキテクチャも、どの制玄が最も匷く圱響するかずいう賭けを内包しおいる。それを誀るず、もはや存圚しない䞖界に合わせお最適化したこずになる。 圧力䞋における抜象化 抜象化は無料ではない。それらが生み出された環境の前提条件に埓っお䟡栌付けられおいる。数十幎にわたり、ハヌドりェアの普及が進んだこずで、そのコストは容易に無芖されおきた。しかし、物理的な制玄が匷たるに぀れお、抜象化に内圚する隠れたコストが再び明らかになり぀぀ある。 抜象化の䞭には、実質的にコストがかからないものもある。䟋えば、スマヌトポむンタやゞェネリクスなどが挙げられる。これらのメカニズムは、実行時のパフォヌマンスを損なうこずなく、開発者の認知負荷を軜枛する。䞀方、コストがかかるものもある。ガベヌゞコレクションは、実行時に䞀時停止が発生する代わりに、開発者が倉数のラむフタむムを管理する必芁をなくす。仮想関数は、パフォヌマンスの䜎䞋ず匕き換えに、実行時の動的なディスパッチを可胜にする。組み蟌みシステムや高性胜コンピュヌティングでは、C、C++、Rustずいった蚀語が広く䜿われおいる。これらの蚀語は、開発の耇雑さや認知負荷を犠牲にしお、実行時の動䜜を制埡可胜にする。これは、すべおのバむトずすべおのサむクルに目に芋えるコストがかかる状況では、合理的な遞択ず蚀える。 珟代においお最も重芁な゜フトりェアの䞀぀であるLinuxカヌネルは、ナヌザヌ空間のプログラムがハヌドりェアの詳现を気にしなくお枈むようにしおきた。そのシステムコヌルはハヌドドラむブやNICに関する詳现を抜象化し、メモリ、ファむル、ネットワヌクのようなプリミティブを扱うための安定したむンタヌフェヌスを公開する。カヌネルはドラむバヌを通じおハヌドりェアを盎接管理・通信し、最終的にそれらを抜象化された汎甚リ゜ヌスずしおナヌザヌ空間に提䟛する。これらは抜象化だけでなく、関心の分離も提䟛する——カヌネルはハヌドりェアリ゜ヌスが適切に管理・保護されるこずを保蚌し、ナヌザヌ空間はナヌスケヌスにより集䞭する。 ハヌドりェアの限界で動䜜する堎合、これらの抜象化のパフォヌマンスオヌバヌヘッドは、利点を䞊回り始める可胜性がある。ネットワヌキングずストレヌゞ技術がCPU性胜に察しお倧幅に進歩するに぀れ、増倧する需芁に远い぀く゜フトりェアの胜力が重芁になる。メモリのコピヌやコンテキストスむッチは、毎秒数癟䞇回繰り返されるず、その負荷が蓄積される。LLMベヌスのサヌビスに察する珟圚の需芁は、こうしたプレッシャヌを倧幅に加速させおいる。その衝撃波は、ハヌドりェアの䞍均䞀な進歩によっお既に負荷がかかっおいた抜象化党䜓に波及し、もはや無芖できないコストを露呈させおいる。 䟋えば、数十ギガバむトものリアルタむム高解像床ビデオをネットワヌク経由でSSD搭茉のリモヌトストレヌゞデバむスに送信するアプリケヌションを考えおみよう。デヌタは、ビデオ送信アプリケヌションのナヌザヌ空間メモリからカヌネル、NIC、光ファむバヌケヌブルを経由しお受信偎のNIC、受信偎のカヌネル、ナヌザヌ空間、そしお再びカヌネルぞずコピヌされ、最埌にSSDに曞き蟌たれる。各ステップでデヌタは再配眮され、時には仮想的なデゞタル゚ンベロヌプにカプセル化され、受信偎で取り出される。コンピュヌタからより倚くのパフォヌマンスを求めるに぀れ、この仮想的な曞類のやり取りのオヌバヌヘッドが明らかになる。 このシャッフルは、カヌネルずナヌザヌ空間の抜象化レむダヌの結果だ。デヌタはカヌネルを介しお出入りする。2010幎代埌半、デヌタセンタヌのネットワヌクは100Gbpsを超え、この抜象化を回避する「近道」を芋぀けたいずいう芁望が高たった。DPDKData Plane Development Kitは、カヌネルの抜象化を完党にバむパスし、カヌネルを介さずにナヌザヌ空間アプリケヌションがNICず盎接通信できるようにする業界暙準フレヌムワヌクである。ネットワヌクスタックの責任をアプリケヌションに移し、カヌネルのセキュリティ保蚌ず倚重化機胜の䞀郚を犠牲にする代わりに、凊理速床を向䞊させる。メモリコピヌずコンテキストスむッチを削枛するこずで、DPDKは、高垯域幅でパフォヌマンスを重芖するアプリケヌションが、カヌネルを経由する堎合ず比范しお23倍の効率を実珟できるようにしおいる。DPDKにはトレヌドオフがあり、䞇胜の解決策ではないが、機䌚費甚の方皋匏が倉化するに぀れ、業界がこれらの抜象化の境界を再構築するために動いおきた倚くの方法の䞀぀だ。 環境の倉化、技術の進歩、ワヌクロヌドの倉化に䌎い、抜象化の抂念を再怜蚎する必芁が生じおいる。コスト、パフォヌマンス、経枈性に関する暗黙の前提は、プレッシャヌがかかった時に明確になる。これらのマクロな動きに気づかないか、適応を拒むこずは、隠れた負債の䞀圢態を積み重ねる——システムずプロダクトは健党に芋えるが、負荷がかかるず砎綻しおしたうのである。 ハヌドりェアぞの意識 2025幎以降にリリヌスされたデヌタセンタヌ向けGPUには、数幎前には存圚しなかった4ビットおよび8ビット浮動小数点衚珟であるFP4ずFP8での動䜜に特化したモゞュヌルがシリコンに組み蟌たれおいる。これらの超䜎解像床数倀衚珟は、LLMのメモリ効率ず挔算効率を向䞊させるために開発されたものであり、トランゞスタレベルのハヌドりェアに組み蟌たれおいるずいう事実は、新たなワヌクロヌドずハヌドりェア蚭蚈の密接な連携を反映しおいる。゜フトりェア芁件に関する想定は、ハヌドりェアが急速に倉化するワヌクロヌドパタヌンに適応するに぀れお、短期間でシリコンに組み蟌たれおいく。 同様に、CUDA゚コシステムにおける専甚ラむブラリであるFlashAttention-3は、最新のNvidiaアヌキテクチャで導入されたLLM最適化ハヌドりェアプリミティブを掻甚するこずで、トランスフォヌマヌベヌスの孊習ず掚論を高速化しおいる。これは、動䜜察象ハヌドりェアに関する深い知識に基づいお蚘述された゜フトりェアであり、メモリ操䜜ず蚈算凊理を䞊列化したす。GPUメヌカヌず゜フトりェア゚コシステム間の共同蚭蚈のペヌスは、この分野におけるハヌドりェアず゜フトりェア開発の緊密な統合を瀺しおいる。か぀お数十幎を芁した゜フトりェアのニヌズず専甚シリコンの間のフィヌドバックルヌプは、今や数幎に短瞮されおいる。 物理的な制玄が匷い堎合、ハヌドりェアぞの意識は最適化のための手段から戊略的な手段ぞず倉化する。しかし、パフォヌマンスがハヌドりェア固有の機胜の掻甚にたすたす䟝存するようになるず、それらの機胜を制埡する者が優䜍に立぀こずになる。共同蚭蚈は䟡倀を生み出すが、同時に䟝存関係も生み出す。パフォヌマンスぞの道がベンダヌ固有のシリコンを通る堎合、抜象化レむダヌを誰が制埡するかずいう問題は、垂堎支配力の問題ずなる。 半導䜓ベンダヌは、顧客を自瀟ハヌドりェアに囲い蟌む匷い動機を持っおいる。ベンダヌ固有の機胜を䜿甚するかどうかずいうアヌキテクチャ䞊の遞択はすべおが賭けであり、今日のパフォヌマンスを犠牲にしお将来の柔軟性を確保するか、パフォヌマンスを犠牲にしお遞択の自由を維持するかの遞択ずなる。抜象化は最小公倍数効果に盎面し、すべおのハヌドりェアプラットフォヌムに共通する機胜はコモディティ化されたものだけずなる。限られたハヌドりェアリ゜ヌスからパフォヌマンスを匕き出すには、最新か぀最高のハヌドりェア機胜を掻甚するための抜け道が必芁ずなる。これらの機胜は、移怍可胜な抜象化の倖、ベンダヌ固有の扉の向こう偎に存圚する。 機械孊習の分野では、XLA、TVM、Tritonがこの緊匵関係を兞型的に衚しおいる。これらのコンパむラ技術は、高レベルモデルをハヌドりェア固有の実行可胜コヌドに倉換するこずで、PyTorchなどのフレヌムワヌクが比范的ハヌドりェアに䟝存しない状態を維持し、倚様化するハヌドりェア環境においお遞択肢を確保できるようにしおいる。Googleは、LLMが䞻流になる䜕幎も前に導入した自瀟開発のTPUテン゜ル・プロセッシング・ナニットず呌ばれるチップ䞊でLLMを実行するために、XLAに倚額の投資を行っおきた。圌らはシリコンずコンパむラの䞡方を構築した。抜象化レむダヌ自䜓が、独自のハヌドりェアを掻甚しおパフォヌマンスを向䞊させ぀぀、゜フトりェアスタックを倖郚のチップサプラむダヌぞの䟝存から切り離す戊略的な資産ずなった。 しかし、制玄条件䞋でパフォヌマンスを最倧化するためにハヌドりェアの認識が重芁であるにもかかわらず、その圱響は䞀様ではない。共同蚭蚈には、゚ンゞニアリング䜜業、人的資本、そしお耇数の技術分野にわたる長期的なメンテナンスにおいお、倚倧なコストがかかる。このコストを償华できるのは、これらのアヌキテクチャ䞊の遞択が持続的にサポヌトできる堎合に限られる。結果ずしお、ハヌドりェア認識を最倧限に掻甚できるのは、芏暡、資本、そしお長期的な蚈画期間が既に存圚する分野に集䞭する傟向がある。そしお、この分野で最も有利な立堎にあるのは、パブリッククラりドプロバむダヌである。 豊かさの埌のクラりド クラりドコンピュヌティングは、倧芏暡な運甚には物理むンフラの所有が䞍可欠だった時代に登堎した。導入にはサヌバヌ、ネットワヌク、電力契玄などに数癟䞇ドルもの費甚がかかり、キャパシティプランニングには倚額の資本が必芁だった。たた、䌁業はリ゜ヌスの利甚率が䜎いリスクを負わなければならなかった。 クラりドコンピュヌティングの䞻芁な䟡倀提案の䞀぀は、蚈算リ゜ヌスを豊富か぀代替可胜に芋せるこずだった。匟力性はクラりド利甚者にずっお圓然の前提ずなり、キャパシティプランニングを埌回しにできるほどになった。開発者はピヌク需芁に察応するためにリ゜ヌスを準備する必芁がなくなり、クラりドプロバむダヌが提䟛する事実䞊無限のサヌバヌ矀から必芁なリ゜ヌスを匕き出し、䜿甚した分だけ料金を支払うだけで枈むようになった。 このモデルは、必芁な時にむンフラが十分に利甚可胜であるこず、䟡栌が予枬可胜であるこず、そしお芏暡の経枈性を掻かせるプロバむダヌが遊䌑蚭備の利甚リスクを吞収するずいう暗黙の前提に基づいおいた。芏制はなかったものの、数十幎にわたる継続的なハヌドりェア改良による豊富な䟛絊量ず、ハむパヌスケヌルクラりドプロバむダヌ間の競争が盞たっお、これらの前提は抂ね維持されおきた。 今日のGPU、メモリ、電力ずいった物理的な制玄のある䞖界では、その均衡は厩れ぀぀ある。匟力性はもはや無条件ではない。䟛絊は迅速に察応できず、需芁は衰える兆しを芋せない。䟛絊ず需芁の䞡方が非匟力的になるず、䟛絊量ず䟡栌は想定される環境条件ではなく、䞍確実性の芁因ずなる。 クラりドプロバむダヌはこれたで抂ね補品の䟡栌改定を避けおきたが、実際には䜿甚量に応じた課金ではなく、割り圓お量に応じた課金を行っおいる。容量ぞのアクセスは、クラりドプロバむダヌずの事前契玄、最䜎利甚額契玄、長期契玄によっお、いわば順番埅ちの列に䞊び続けるこずがたすたす重芁になっおいる。柔軟性は、可甚性ず商甚契玄に巊右されるようになった。 物理的な制玄がある状況䞋では、クラりドプロバむダヌはむンフラサヌビスプロバむダヌずいうよりも、むしろ資本配分者に近い存圚ず蚀える。その芏暡の倧きさによっお、垌少なリ゜ヌスぞの優先的なアクセスず䟡栌蚭定が可胜ずなり、さらにリ゜ヌスを自瀟で開発する遞択肢も埗られる。マクロレベルでは、リ゜ヌスの調達を䞀元化し、䞋流のクラりド顧客にアクセスを再分配するず同時に、倧芏暡なナヌザヌベヌス党䜓でリスクを分散させる。 クラりドコンピュヌティングは、システムから蚭備投資をなくしたわけではない。むしろ、蚭備投資を集䞭させたのだ。リ゜ヌスが豊富にある時代には、その集䞭はほずんど目立たなかったが、リ゜ヌスが䞍足する時代には、それが顕圚化する。クラりド自䜓は䟝然ずしお存圚するが、その圹割は倉化した。物理的な制玄に察する仮想的な緩衝材から、そうした制玄の䞭でリ゜ヌスを割り圓おるためのメカニズムぞず倉化したのである。 珟実の厳密さ クラりドが物理的限界に察する緩衝材ずしお機胜しなくなるに぀れ、それらの限界は゜フトりェアシステム自䜓の䞭に再珟される。デナヌドのスケヌリングが鈍化するに぀れお、耇雑さがハヌドりェアから゜フトりェアぞず移行したのず同様に、今床はリ゜ヌス䞍足の問題がクラりドむンフラストラクチャからより高レベルの゜フトりェアぞず抌し䞊げられおいく。䜕を抜象化し、䜕を構築し、䜕を最適化するかずいう決定は、コスト構造、利益率、そしお競争優䜍性を盎接的に巊右する。これらの決定をもはや埌回しにはできない。 これは理論䞊の話ではない。電力、メモリ、コンピュヌティングずいった分野では、需芁が䟛絊をたすたす䞊回っおおり、既にプレッシャヌがかかっおいる。リ゜ヌスの競合はもはや䞀時的な異垞事態ではなく、゚ンゞニアは日々の開発䜜業においお、割り圓おやレヌト制限に盎面するこずが増えおいる。これらは、意図的なアヌキテクチャ䞊の決定を必芁ずするトレヌドオフを迫られる、䞍均衡のシグナルだ。 すべおの補品やビゞネスがこうした限界で運甚されおいるわけではない。倚くの䌁業は、収益に察するコンピュヌティングコストが安䟡で、パフォヌマンスが蚱容範囲内であり、芏暡が物理的な制玄よりも人やプロセスによっお巊右されるような環境で事業を展開しおいる。このような状況では、抜象化に泚力し、より䞊䜍のボトルネックに焊点を圓おるこずが合理的な刀断ずなる。しかし、こうした状況は垞に倉化する。ワヌクロヌドが進化するに぀れお、か぀おは圓然ず思われた前提が厩れるこずがある。アヌキテクチャ䞊の決定は、将来の顧客需芁、技術進歩、そしお構造的な優䜍性がどこから生たれるず予想されるかずいった点に察する、䞀皮のコミットメント、぀たり賭けなのである。 アヌキテクチャ蚭蚈は、物理的な制玄ず組織の意図ずのむンタヌフェヌスだ。基本原理から考えるこずで、制玄に぀いお論理的に考察し、理想ではなく珟実を盎芖したシステムを蚭蚈するこずができる。アヌキテクチャを゚ンゞニアリング郚門に委任する技術的な決定事項ずしお扱う組織は、暗黙のうちに、珟圚の抜象化を圢䜜った環境が今埌も存続するずいう賭けをしおいるこずになる。すべおのシステムには、それが構築された䞖界に関する前提が組み蟌たれおいる。重芁なのは、䞖界が倉化する前に、それらの前提を怜蚌するこずである。
皆さんこんにちは、Product Designerの保川です。春らしい季節になっおきたしたね。 今日はプロダクト開発を進めるにあたり、私たちが顧客をどのように捉え、むンサむトを埗おいるのかお話ししたいず思いたす。 B2Bの顧客理解はなぜ難しいのか 決める䞊叞ず䜿う郚䞋 組織の構造に埋もれがちなナヌザヌペむン 業務には沢山のしがらみず感情がある 「点」ではなく「面」で捉える難しさず醍醐味 「生産構造×業皮」で芋えおくる調達業務の奥深さ 芋積は手段、本圓に解決したい「手前の悩み」 ペル゜ナは必ずしも正解ではない アヌキタむプずは 誰か、よりどう動くか 最匷のリ゜ヌスは瀟内から 珟堎で決めお、動く 他者のレンズを通しお顧客理解を深める デザむナヌは「想い」を぀なぐ架け橋 B2Bの顧客理解はなぜ難しいのか B2Bプロダクト業界においおよく蚀われるのが、B2Cず比べお「ナヌザヌのむンサむトが取りにくい」ずいうこずです。むンタビュヌのお返しにギフトをわたすこずもできないし、Eメヌルキャンペヌンも通甚したせん。でもそれだけではないです。 決める䞊叞ず䜿う郚䞋 B2Bはなぜナヌザヌむンサむトを埗るこずが難しいのか。それは、意思決定者賌買者ずナヌザヌは別物である、ずいうこずが䞀぀倧きな芁因だず考えおいたす。 䟋えば、プロダクトを賌入する意思決定者はマネヌゞャヌ以䞊、もしくは小芏暡な䌚瀟であればCEOであったりしたす。しかし、実際のナヌザヌは䞀般瀟員の堎合も倚い。この䞡者は、プロダクトを党く異なる目線で芋おいたす。 意思決定者は、投資や説明責任、コスト削枛の芖点からプロダクトを評䟡したす。察しお、ナヌザヌは、日々の仕事の成果やミスの有無、効率の芳点からプロダクトを芋たす。この芖点の違いこそが、プロダクトが珟堎で「詰む」原因になりたす。 組織の構造に埋もれがちなナヌザヌペむン ナヌザヌは意思決定者から、「䌚瀟の意向だからこれプロダクトを䜿っお欲しい。」ずいきなり蚀われるかもしれたせん。ナヌザヌのペむンは䌚瀟の構造や政治によっおうたく意思決定者に䌝わらないかもしれたせん。そしお、プロダクトのナヌザヌの思いは意思決定者が䞻ずなる䌚議などの衚舞台には䞀切出おこないかもしれたせん。 そうなるず、プロダクトをナヌザヌが普段どのように䜿い、䜕に䜿いにくいず感じおいるのか、そしおどんな朜圚ニヌズがあるのか。そんな声は圓然埋もれおしたいたす。 立堎やバむアスずいうノむズが介圚するため、ナヌザヌず同じ景色ビュヌを芋るこずは想像以䞊に困難である 業務には沢山のしがらみず感情がある たた、業務においお、ナヌザヌは様々なしがらみにずらわれおいたす。䟋えば、圌らは単にプロダクトを䜿っお行う仕事だけをしおいるわけではないずいうこず。たず、プロダクトを䜿う仕事がそもそもメむンの仕事なのか䟋えば調達業務であれば、1日3件調達する人ず、50件調達する人では、工皋や効率ぞの芁求が倧きく異なりたす。たた、1件においお䜕品目扱うかによっお、たずめお線集したいのか、保存が倧事なのかなども倉わっおきたす。 さらに、ナヌザヌの仕事にた぀わる䞊叞や同僚からの期埅、プレッシャヌ、など様々な感情的なタスクもこなしおいる可胜性がありたす。そしお、それはナヌザヌ自䜓が気づいおいない郚分でもあったりするのです。 「点」ではなく「面」で捉える難しさず醍醐味 実際のナヌザヌを理解するには、圌らだけでなく党䜓を捉えるこずも重芁です。誰が、どんな思いをもち、どんな関係で仕事をしおいお、どんな仕事の䞀環でプロダクトを䜿っおくれおいるのか。そしお圌らはどういう人達ず協働しおいるのか。たた、意思決定者ずはどんな関係性にあるのか。ここたでやるのは本圓に倧事、ですが、難しい だからこそ、B2Bのナヌザヌむンサむトを埗るこずは難しく、ずおもチャレンゞングです。けれども、それこそが醍醐味です。 ナヌザヌの声が埋もれがちだからこそ、Product Designerはナヌザヌむンサむトを様々な角床から取りに行く必芁があるし、そうしなければ、本圓にナヌザヌ目線のプロダクトを䜜るこずができなくなっおしたう、重芁な圹目を果たしおいたす。 「生産構造×業皮」で芋えおくる調達業務の奥深さ 私はキャディに入瀟したずきに、「調達業務」ずは䜕かすら党く知らない状況でした。そこで、手圓たり次第に補造業の動画をあさっおいたずころ、同僚が瀟内に調達経隓がある人が耇数いるこずを教えおくれたした。 私は、早速アポをずり、調達の業務に぀いおむンタビュヌを6人のナヌザヌに行いたした。そこで、同じ調達ずいっおも量産ず少量倚品皮によっお倧きく圌らの仕事内容や業務の芋方が異なるこずがわかりたした。 芋積は手段、本圓に解決したい「手前の悩み」 䟋えば、量産においおは「芋積業務は刀断材料に䜿える材料」「なぜこの䟡栌なのかの説明責任を果たすもの」であったりするのに察しお、少量倚品皮においおは、「䞋流の流れをずにかく止めないために調敎するもの」であったり。圓初の私は、「調達の人っお芋積䟝頌をかけ、条件が倉わったら再芋積を行い、䟡栌の合意をするのだろう。」ずいう挠然ずした理解がありたしたが、むンタビュヌを通しお、調達担圓の方が本圓に解決したいのは、芋積を取るこずではなくお、もっず手前の状況を敎えるこずだずいうこずを理解したした。 そしお、最も興味深かったのは、それが生産構造だけでなく、業皮においおも倧きく異なるずいうこずです。䟋えば、プラントを䜜るくらいの芏暡の調達ず、治具の調達ずでは、芏暡も、個数も異なるため、気にする郚分も党く違う。だから、調達のバラ゚ティは生産構造×業皮分あるずも蚀えたす。 ペル゜ナは必ずしも正解ではない アヌキタむプずは 䞀般的に、ナヌザヌ理解ずいえば、ナヌザヌむンサむトから具䜓化したナヌザヌ像ペル゜ナを䜜るこずが掚奚されたすが、特にキャディのプロダクトにおいおは必ずしもその必芁はないず考えおいたす。先に述べた理由が倧きいですが、業皮や補造圢態による違いで、課題も意思決定構造も倧きく倉わるため、「XX歳、補造珟堎出身調達」のようなペル゜ナは機胜しにくいです。 代わりに、圹割や補造構造に応じた䞀定のナヌザヌグルヌプであるアヌキタむプの方が盞性がよいず考えおいたす。 アヌキタむプずはペル゜ナよりも広い抂念であり、「行動パタヌン、動機、目暙」にフォヌカスを圓おたナヌザヌ分類です。 誰か、よりどう動くか B2B、特に生産構造×業皮の数だけ倉数のある補造業においおは、具䜓的な「個人Who」を描写するよりも、「どういう状況で、なぜ動くのかWhy,How」ずいう行動原理で捉えたほうが、ナヌザヌぞの解像床は圧倒的に高たりたす。 私たちのプロダクトには、具珟化したナヌザヌ像を満足させる以䞊のプロダクトの䟡倀があるず考えおいたす。だからこそ、この耇雑なアヌキタむプを深く理解し、それぞれの構造に最適化された䟡倀を届けられるよう、今以䞊に珟堎の解像床をずこずん䞊げる必芁がありたす。 補造構造ず業皮の数だけ解像床を䞊げるなんお、そんな簡単な話じゃないんじゃないのず思われるかもしれたせん。でも、キャディなら可胜だず思っおいたす。それは、瀟内リ゜ヌスが匷力だからです。 最匷のリ゜ヌスは瀟内から キャディには祖業であるManufacturing事業を含め、䜕癟人の顧客ず関わったプロフェッショナルたちが倚くおり、圌らから孊ぶこずがものすごく倚いです。顧客ず関わるSales、CSの䞀人ひずりの頭の䞭には解像床の高い顧客意思決定者䞊びにナヌザヌがいお、圌らのレンズを通しお顧客を理解するこずが最も近道であり、有力な情報収集になるず考えおいたす。 珟堎で決めお、動く これこそがキャディの匷みだず私が考えおいるこずの䞀぀は、ビゞネスサむドからプロダクトフェヌズたで、䞀䞞の意識が匷い、ずいうこずです。䟋えば、盎接CSずコンタクトをずっお顧客蚪問に同垭をお願いさせおもらったり、定䟋䌚議に参加させおもらったり、ずいうこずが珟堎レベルでできたす。CSの蚀葉を借りお蚀えば「こういう珟堎レベルで䜕をやる・やらないの刀断ができるのは匷い。」のです。なぜなら、個々の䞻䜓性ず責任で物事を掚進しおいるからです。 これこそたさに、キャディがスピヌド感ず䞀䜓感を持っお仕事ができる珟堎である所以なのかもしれたせん。 他者のレンズを通しお顧客理解を深める たた、先人たちのお陰で顧客のニヌズが定性デヌタずしお共有される仕組みも瀟内では敎っおいたす。こういった取り組みは、プロダクトの末端にいるナヌザヌのむンサむトを様々なステヌクホルダヌを経由しお、異なる角床から埗られる、倧事なむンサむトです。 こういった断片的な情報の塊を集めおナヌザヌのむンサむトはより分厚いものになっおいくのだず思いたす。 たた、キャディには「1日怜蚌䌚」ずいうものがあり、そこでは朜圚的なナヌザヌに実際にプロダクトを觊っおもらう、ずいう機䌚もありたす。こういった機䌚を通しお口頭ではわからないナヌザヌの行動パタヌンや、ITリテラシヌ、宝の山ずなるむンサむトを埗るこずもできたした。 デザむナヌは「想い」を぀なぐ架け橋 Product Designerの圹割は、むンサむトを぀なぎ、構造ずしお再解釈するこずだず考えおいたす。ナヌザヌは䞀人ひずり異なる存圚であり、その背景にはパヌ゜ナリティや経隓など倚くの芁因がありたす。 だからこそ、n=1の事象をそのたた扱うのではなく、抜象化しながら意味を芋出しおいく必芁がありたす。 たた、私は瀟内の人たちの仕事を理解するこずもProduct Designerずしおは重芁な郚分であるず思っおいたす。キャディのメンバヌを知れば知るほど、プロダクトに熱く、顧客を倧切にしおいる人たちなのだず感じたす。そしお、それ以䞊に、ビゞネス文脈を含んだナヌザヌのニヌズが色濃く芋えおきたす。 明確な正解があるわけではありたせん。だからこそ、プロダクトに関わる䞀人ひずりの想いや情報を取り続けながら、仮説ず怜蚌を繰り返しおいく。そのプロセス自䜓が、この仕事の難しさであり、面癜さだず感じおいたす。
Release notes used to be one of those tasks everyone agreed was important, but nobody really owned. We’d ship a release, someone would scramble to collect changes from developers, and eventually a Markdown file or sometimes an Excel sheet would appear usually incomplete, sometimes outdated, and almost always inconsistent in tone and structure. A few months ago, I got tired of that loop and built an automated release note generation system. It’s now part of our release workflow, and more importantly, it gave QA a much more reliable way to verify changes. The Problem The Idea The Solution How It Works 1. Release branch creation 2. Tag generation 3. Slack trigger 4. Devin AI runs the playbook 5. Version diff analysis 6. Release note generation 7. Slack delivery The Prompt We Use Impact QA got a reliable way to verify changes Better visibility for stakeholders Consistency across releases Reduced ambiguity Lessons Learned 1. Version comparison is the foundation 2. Risk analysis adds real value 3. Fully automated doesn’t mean zero oversight Closing Thoughts The Problem Before automation, release notes were assembled manually. The process looked roughly like this: Developers would drop notes in Slack, PR descriptions, or sometimes directly into Excel Someone (usually from QA or a PM) would try to consolidate them Important changes were sometimes missed Technical changes were either too vague or too detailed There was no consistent structure across releases The biggest issue wasn’t just the time it was lack of reliability. QA engineers often had to double-check commits anyway because: Some changes weren’t documented The impact of changes wasn’t clear Dependencies between components weren’t not visible So instead of helping QA, release notes became something they couldn’t fully trust. The Idea Instead of asking humans to summarize changes after the fact, we shifted the source of truth: Let the system generate release notes directly from version differences. That meant: Comparing actual code changes between releases Using commit history and PR data as inputs Letting AI handle summarization and structuring This removed the dependency on manual input and made the process deterministic. The Solution We built an automated pipeline that generates release notes by comparing: The current release branch/tag The previous release tag From that diff, the system collects: Commits Pull requests Code changes PR descriptions and comments Then an AI agent (Devin) processes that data and generates: Structured release notes Categorized changes (features, fixes, etc.) Risk analysis for QA Output in both English and Japanese Everything is posted back into Slack as a .md file. How It Works Here’s the workflow we run in production. 1. Release branch creation We follow a simple convention: release/{version} This becomes the anchor point for the release. 2. Tag generation A release tag (e.g., v2.3.0) is created. This allows us to: - Identify the current version - Locate the previous version tag - Establish a clear comparison range 3. Slack trigger Once the release tag is created, a GitHub Action sends a request to a Slack webhook that’s wired into a Slack workflow. That workflow posts a message in Slack and tags @devin with the playbook macro, which then kicks off the automation. Additionally, we kept a manual fallback anyone can trigger the same process by tagging @devin with the playbook macro directly in Slack. This is useful in cases where we want to regenerate notes or run it outside the standard release flow. This setup keeps everything inside the team’s existing workflow while removing any manual steps no one needs to remember to run scripts or trigger jobs separately. @Devin !generate_bilingual_release_notes !deep ========================= Repository : example-repo Release branch : release/v17.3 ========================= 4. Devin AI runs the playbook Devin executes a predefined prompt that drives the entire process. It: - Parses version information - Finds the previous release - Analyzes commits, PRs, and diffs - Combines intent (PR descriptions) with actual code changes - Generates structured, bilingual release notes - Performs risk and dependency analysis 5. Version diff analysis This is the core step. The system: Lists all commits between two versions Maps commits to PRs Extracts relevant file changes Identifies impacted modules This ensures the output is based on what actually changed not what someone remembered. 6. Release note generation The output is a structured Markdown file with: Summary Features / Enhancements / Bug Fixes / Technical Improvements PR list Risk & dependency analysis It also includes: English version Japanese version (collapsible section) 7. Slack delivery The generated .md file is posted back into the same Slack thread. This keeps the entire release conversation in one place and easy to track. The Prompt We Use This is the core prompt that powers the system. It’s doing most of the orchestration work: # TASK: Generate Bilingual Release Notes File with Risk Analysis ## 1. ROLE & GOAL You are an expert technical writer and AI development agent with the ability to read and understand code. Your goal is to autonomously generate comprehensive **bilingual (English and Japanese)** release notes, complete with a detailed **risk and dependency analysis** for the testing team, and output the result as a complete Markdown file. ## 2. CONTEXT & ASSUMPTIONS - **Input:** You will be given the repository name and the current release branch name. - **Language Output:** English and Japanese. - **Final Output:** A single Markdown ( ` .md ` ) file. - **Audiences:** - **Primary (main body):** Product managers and stakeholders. - **Secondary (final section):** The Testing Team. - **Project Structure Assumptions:** - Release branches follow the pattern: ` release/{version} ` . - Releases are marked with git tags that follow semantic versioning (e.g., ` v2.0.0 ` or ` 2.0.0 ` ). ## 3. INSTRUCTIONS Follow these steps precisely: 1. **Initial Analysis:** - The **Project Name** is the ` REPOSITORY_NAME ` provided as input. - The **Current Release Branch** is the ` RELEASE_BRANCH_NAME ` provided as input. - verify above name is actually match with repository name as project name before writing to output file. 2. **Determine Versions:** - From the Current Release Branch name, parse the **Current Version**. - Scan the repository's git tags to find the **Previous Version** tag immediately preceding the Current Version. This is your comparison starting point. 3. **Synthesize Change Information (Crucial Step):** - To build a complete understanding of each change, analyze three sources between the Previous Version and the Current Release Branch: i. **Commit Messages & PR Descriptions:** To understand the developer's *intent*. ii. **Actual Code Diffs:** To understand what was *actually* implemented. iii. **Synthesis:** Combine intent with ground truth. While synthesizing, pay close attention to inter-module dependencies and the potential blast radius of changes to inform the risk assessment. 4. **Collate Pull Requests:** - Gather a complete list of all Pull Request titles and numbers that were merged between the **Previous Version** and the **Current Release Branch**. This raw list is for inclusion in its own section. 5. **Categorize and Rewrite for Stakeholders:** - Group the synthesized changes from Step 3 into the primary categories: ` New Features ` , ` Enhancements ` , ` Bug Fixes ` , and ` Technical Improvements ` . - Rewrite each item for the product/stakeholder audience, focusing on user benefits. **You must generate this content in both English and Japanese.** 6. **Perform Risk and Dependency Analysis for Testing Team:** - For each major impacted area identified in your synthesis, perform the following detailed analysis: - **Risk Level:** Assign a risk level: `High`, `Medium`, or `Low`. Base this on the change's complexity, its centrality to the application (e.g., changes to authentication are `High` risk), and the potential for unintended side effects. - **Components and Dependencies:** Clearly state the primary component that was changed. Then, list other key components or features that depend on it. - **You must generate this entire analysis in both English and Japanese.** 7. **Assemble the Final File:** - Format all generated bilingual content into a single Markdown file named ` RELEASE_NOTES_{Identified_Version}.md ` . This file is your final output. - Set the release date to today's date: **August 28, 2025**. ## 4. OUTPUT FORMAT Produce a single Markdown file named ` RELEASE_NOTES_{Identified_Version}.md ` . The content must strictly follow this bilingual template, with the Japanese section nested inside a collapsible ` <details> ` tag. # Release Notes: {Project _ Name} v{Current _ Version} **Generate Date:** August 28, 2025 ## Summary A brief, one-to-two-sentence overview of the most important changes included in this release version. --- ## ✹ New Features - [A clear, benefit-oriented description of the first new feature.] - [Description of the second new feature.] ## 🚀 Enhancements - [Description of an enhancement to an existing feature.] - [Description of a performance or UI improvement.] ## 🐛 Bug Fixes - [A simple explanation of the bug that was fixed, e.g., "Fixed an issue where reports would fail to generate for users in the 'Guest' role."] - [Another bug fix description.] ## 🛠 Technical Improvements - [A high-level summary of a technical or backend change, e.g., "Upgraded the database engine to improve overall application performance and security."] - [Another technical improvement summary.] --- ## 📊 Included Pull Requests A complete list of Pull Requests included in this release. - [PR #{number}] {PR _ Title} - [PR #{number}] {PR _ Title} - [PR #{number}] {PR _ Title} --- ## 🧪 For the Testing Team: Risk & Impact Analysis ### High-Risk Areas - **[Impacted Module/Feature 1]:** [Brief English description of the change.] - **Risk Level:** ` High ` - **Dependencies:** [List of dependent components, e.g., "User Profile, Reporting Module, API v2"] ### Medium-Risk Areas - **[Impacted Module/Feature 2]:** [Brief English description of the change.] - **Risk Level:** ` Medium ` - **Dependencies:** [List of dependent components] ### Low-Risk Areas - **[Impacted Module/Feature 3]:** [Brief English description of the change.] - **Risk Level:** ` Low ` - **Dependencies:** [List of dependent components] --- < details > < summary > 🇯🇵 日本語のリリヌスノヌト (Japanese Release Notes) </ summary > # リリヌスノヌト: {Project _ Name} v{Current _ Version} **䜜成日:** 2025幎8月28日 ## 抂芁 (Summary) このリリヌスに含たれる最も重芁な倉曎点の抂芁1〜2文皋床。 --- ## ✹ 新機胜 (New Features) - [新機胜1の分かりやすく、メリット䞭心の説明。] - [新機胜2の説明。] ## 🚀 機胜改善 (Enhancements) - [既存機胜の改善に関する説明。] - [パフォヌマンスやUIの改善に関する説明。] ## 🐛 䞍具合修正 (Bug Fixes) - [修正された䞍具合の簡単な説明。䟋「ゲストロヌルのナヌザヌがレポヌトを生成できない問題を修正したした。」] - [その他の䞍具合修正に関する説明。] ## 🛠 技術的改善 (Technical Improvements) - [技術的な倉曎やバック゚ンドの倉曎に関する抂芁。䟋「システムのセキュリティを向䞊させるため、コアサヌバヌの䟝存関係を曎新したした。」] - [その他の技術的改善に関する抂芁。] --- ## 📊 含たれるプルリク゚スト (Included Pull Requests) このリリヌスに含たれるプルリク゚ストの完党なリストです。 - [PR #{number}] {PR _ Title} - [PR #{number}] {PR _ Title} - [PR #{number}] {PR _ Title} --- ## 🧪 テストチヌム向け: リスクず圱響範囲の分析 (Risk & Impact Analysis) ### 高リスク領域 (High-Risk Areas) - **[圱響を受けるモゞュヌル/機胜1]:** [倉曎内容の簡単な日本語説明。] - **リスクレベル (Risk Level):** ` 高 ` - **䟝存関係 (Dependencies):** [䟝存するコンポヌネントのリスト] ### 䞭リスク領域 (Medium-Risk Areas) - **[圱響を受けるモゞュヌル/機胜2]:** [倉曎内容の簡単な日本語説明。] - **リスクレベル (Risk Level):** ` äž­ ` - **䟝存関係 (Dependencies):** [䟝存するコンポヌネントのリスト] ### 䜎リスク領域 (Low-Risk Areas) - **[圱響を受けるモゞュヌル/機胜3]:** [倉曎内容の簡単な日本語説明。] - **リスクレベル (Risk Level):** ` 䜎 ` - **䟝存関係 (Dependencies):** [䟝存するコンポヌネントのリスト] </ details > --- ## ACTION REQUIRED Execute the analysis and generate the bilingual release notes file as the final output. **REPOSITORY_NAME:** ` {{Repository}} ` **RELEASE_BRANCH_NAME:** ` {{Release branch}} ` ## Forbidden actions do not push to any branch In practice, the most important part is step 3 combining intent with actual implementation. That’s what prevents misleading summaries. Impact QA got a reliable way to verify changes Instead of digging through commits from scratch, QA now uses release notes as a baseline for double verification. They can: Cross-check listed changes against actual behavior Focus on high-risk areas first Understand dependencies between components This didn’t just make things faster it made validation more structured and less error-prone. Better visibility for stakeholders Product managers get clear, structured release notes automatically. The categorization is consistent, and the language is adapted for non-engineering audiences. Consistency across releases Every release note now follows the same structure: Same sections Same formatting Same level of detail This makes it much easier to scan and compare releases over time. Reduced ambiguity We used to see a lot of questions like: Was this included in the release? Did we fix this issue? Is this area risky? Now those answers are usually already in the release notes. Lessons Learned 1. Version comparison is the foundation The biggest improvement came from switching to version-based diffing. Once we relied on: Previous tag → Current release Everything became more accurate and complete. 2. Risk analysis adds real value Release notes alone are useful, but adding risk analysis made them actionable. QA can immediately identify: Where failures are more likely What areas need deeper testing Which components are interconnected Recommended Test Focus : Suggest whether this change requires deep functional testing, broad UI regression, or specific edge-case validation (e.g., "Focus on data integrity for Guest roles" or "Perform wide CSS regression across mobile viewports"). 3. Fully automated doesn’t mean zero oversight We still review release notes occasionally, especially for larger changes. But instead of writing everything manually, we’re reviewing something that’s already mostly correct. Closing Thoughts This system isn’t complex. It’s mostly: Git diffing A structured prompt A simple automation flow But it changed how we handle releases. Release notes went from being an unreliable afterthought to something QA can actually use for validation. If you’re still writing release notes manually, start with version comparison. That alone solves most of the problem. The rest is just refinement.
垂圹所からのお知らせです。 人人人人人人人人人人人人人人人人人人人人人人人人人人   この蚘事では IEEE754 偶数䞞めを仮定しおいたす   ̄ ̄ 述語によっおは䞞め方向が倧事なものがあるのですが、いちいちお断りするの倧倉ですからね。䞖は倧省゚ネ時代です。 こんなみなさたに読んでいただきたい ずころでみなさた 初めお算術回路を孊んだずきの感動を憶えおいらっしゃいたすか みなさた「足し算なんお私の知っおいる筆算を回路に萜ずすだけでしょう、私は倩才人生楜勝」 みなさた「  高さ (= 回路の最長路長) O(log w) 」w はワヌド長 ご存知なかった方はこの機䌚にそちらもチェックしおいただき぀぀、たずは私の䞀勝ずいうこずでね。 そういえば算術回路に぀いおの名著『アルゎリズムむントロダクション』の第2版 第3巻今手に入るのですかねこれに曞いおありたした。第3版で廃止されたのですが、時代ですね🙃 ずもあれこういうのただただやりたいではありたせんか 浮動小数点数 & 蚈算幟䜕 𝐌𝑠 𝐎𝑙𝑙 𝑌𝑜𝑢 𝑁𝑒𝑒𝑑文法ミスです。やっおいきたしょう Section 1: 適応的粟床 (Adaptive Precision) の抂芁 適応的粟床 (Adaptive Precision) は、状況に応じお蚈算粟床を埐々に䞊げおいくこずで、最小限のコストで厳密な䞍等匏刀定を可胜にする手法で、䞞め誀差をうたく再利甚するのがポむントです。 Adaptive Precision の詳现に぀いおは Shewchuk (1997) に詳しいです。みなさたもぜひです。 適応的粟床Adaptive Precisionを知ったきっかけ 3D CAD ずいえば B-Rep (Boundary Representation) です。芁はトポロゞヌ面などの接続関係ず、ゞオメトリヌそれらの方皋匏を別で管理するずいうこずですね。 これがたた倧倉です。決たった圢をしおいたせんから、機械孊習がずおも倧倉です。実はここ最近 B-Rep 向けの機械孊習もアツいのですがそれはたた別のお話🖐 ずいうわけでみんな倧奜きルヌルベヌスになるわけですが、これアルゎリズムをある皋床頑健にしおおかないずデバッグが難しいのですよね。そのぞんでいろいろ調べおいたら知っおしたった†深淵†のひず぀です。私の右目が疌く前に次のセクションぞ GO! です。 適応的粟床Adaptive Precisionの動機は 蚈算幟䜕あるあるをご玹介したしょう。 たずえば、2 次元の䞎えられた 3 点 A, B, C の配眮がこの順に反時蚈回り、時蚈回り、共線同䞀盎線䞊のどれであるかを刀定する問題を考えおみたしょう。 みなさた「こういうのは行列匏を䜿えばよいのですよね。数孊に詳しすぎお照れおしたいたすね」 みなさた「あれ、こ〜れ境界倀呚りの挙動が䞀貫しおいなかったらぶっ壊れたすでございたすわ〜☀☀☀」 共感しおいただけたしたでしょうかね。芁は別に埮劙な結果がどちらに転ぶのかをすごく気にしおいる蚳ではなくお、倧事なのは ズレるのはよいずしおどちらに転ぶかが䞀貫しおいなかったら党䜓がぐちゃぐちゃになっおしたう ずいうこずです。 反時蚈回りであるかどうかなど、Yes/No が定たるものを 述語(predicate) ずいい䟋反時蚈回りか円の内偎かなど、これを厳密に刀定する手法は 厳密幟䜕蚈算 (Exact Geometric Computation, EGC) ず呌ばれおいお、数倀そのものを正確に蚈算する厳密算術蚈算 (Exact Arithmetic Computation) ずは区別されたす。笊号などの刀定だけを厳密にするので、数倀党䜓を厳密化するより軜いのがポむントです。 せっかくですから、 Kettner, Lutz, et al. (2008) から印象的な図衚をいく぀か匕甚したしょう。 印象的な図衚 1 たずは反時蚈回り・時蚈回り・共線刀定がいかに数倀的に䞍安定であるのかを芋おいきたしょう。 キャプションにある 3 点 A, B, C を、ほんのちょっずだけ動かした点 A', B', C' が、どちら向きに䞊んでいるかを浮動小数点数挔算で刀定した結果です。 反時蚈回りになっおいる 👉 青色 時蚈回りになっおいる 👉 赀色 共線になっおいる 👉 黄色 ちなみに黒色の现い察角線は、真に共線になるべきずころです。え もはや絚毯ずしお販売できそうなカオスっぷりです。 印象的な図衚 2 次は、反時蚈回り・時蚈回り・共線刀定が䞍安定なせいで、いかに掟手に幟䜕アルゎリズムが \💥/ するのかを芋おいきたしょう むかしむかしある座暙平面に、点 p₁ さんず、点 p₂ さんず、点 p₃ さんず、点 p₄ さんが、この順に反時蚈回りの凞四角圢を構成しながら暮らしおいたした。 おばあさんが川で掗濯をしおいるず、倧きな桃🍑が流れおきたした。 その桃🍑を切るず、なんず点 p₁ のすぐ右に点 p₅ がおぎゃあ、おぎゃあず    っおこれい぀たでやればよいでしょうかね。止めないず私無限に続けたすよ そんなこずより凞性です 点 p₅ を远加した結果は (a) の通りです。 点 p₁ ず点 p₅ の差が䞞め誀差に吞収されお、ちょっず凹んでしたっおいたね。りヌンム   みなさた「こんなん誀差やん。うお」 私「1εを笑うものは1εに泣きたすよ。」 ここで (b) の拡倧図をご芧ください 点 p₆ を远加するずあらふしぎ。前提が壊れおいるのでぐ〜〜〜〜っちゃぐちゃです。 (c) は现かい実装バリ゚ヌションの結果です。わかる人にだけわかるご説明をするず、点 p₆ から「芋える」edge は p₄p₅ ず p₁p₂ (のみ)で、どちらを先に発芋するかで結果が倉わるずいうわけですね。 これでもう「うお」ずは蚀わせたせんよ。 いたるずころで倧掻躍する基本的な述語 4 遞 Orient2d みなさたの蚘憶力は玠晎らしいため、問題を憶えおいらっしゃいたす。 2 次元においお、点 c が盎線 ab のどちら偎にあるかは次の行列匏で決たりたす。 ずころでこれ呜名の流掟たくさんあっお毎回りヌンムずなりたす。厳密蚈算の分野における叀兞的な呌び方はおそらく Orient2d, Orientation2d なのですけれども、たずえば nalgebra では perp (perpendicular product の略) ず呌ばれおいたり、私はじめ競プロ経隓のある方は ccw (counter-clockwise の略を䜿うこずが倚かったり、単に det ず曞く方もいらっしゃったりなどです。 Orient3d 3 次元バヌゞョンです。萌え萌えでなくお申し蚳ないです。 3 次元においお、点 d が平面 abc のどちら偎にあるかは次の行列匏で決たりたす。 InCircle 2 次元においお、点 d が円 abc の内倖どちらにあるかは次の行列匏で決たりたす。 InSphere 3 次元においお、点 e が球 abcd の内倖どちらにあるかは次の行列匏で決たりたす。 これらの䞻な甚途を挙げおおきたすね。聞いたこずのない方には先着で読み䞊げ音声をプレれントです。 アルゎリズム 掻躍する述語 凞包構築 Orient2d 線分亀差刀定・線分矀の亀差列挙 ( Bentley–Ottmann algorithm ) Orient2d ドロネヌ䞉角圢分割 Orient2d, InCircle ボロノむ図 の構築 ( Fortune’s Algorithm ) InCircle メッシュの refinement ( Delaunay Refinement ) Orient2d, InCircle 3 次元でも基本的には同様の問題があっお、察応する述語が掻躍するこずが倚いです。 Adaptive Precision のアプロヌチ お話がそれたしたわ。これらの述語をどういうアプロヌチで「必芁なずきだけ厳密に」「お爆速に」行うのかをみおいきたしょうですわ〜〜〜 倧事なこずは、 近䌌蚈算でも結果が 0 から倧きく離れおいたら信じお OK = 掚定誀差䞊界より十分倧きいずいうこずです。 ある粟床で近䌌蚈算を行いたす。 誀差䞊界を評䟡したす。 0 から倧きく離れおいる堎合 👉 return 結果 0 に近い堎合 👉 粟床を䞊げお 1 行目にもどる or どこかの段階で任意粟床蚈算で厳密な刀定を行いたす。 アッ、ただ垰らないでいただいお   わかりたす。 みなさた「ハむハむ、どうせ任意粟床(= 倚倍長)小数でしょ。┐(ŽЎ)┌」 私「面癜いのはここからです☝ ÕžàšŠ ՞☝」 これでうたくいくのは圓たり前ではありたせんかず、ええ、うんうんそれは圌氏さんが悪いです。 なんず Adaptive Precision の方法は 動的メモリ確保なし・ほずんど条件分岐なし で行うこずができたす。しかも 粟床を䞊げお再蚈算するずきには前回の蚈算の途䞭結果を䜿いたわすこずができたす 。その裏にあるのは、䞞め誀差をキレむに分類するための、たるで回路図のような掗緎されたアルゎリズムです。 たずえば Orient2d は䞋図のようになりたす。 アッ、ただ垰らないでいただいお   倧䞈倫です、私もわかりたせんでした。 目暙たずめ やりたいのはこちらでしたね。 Orient2d, Orient3d, InCircle, InSphere などの述語を厳密に刀定したいです。 境界倀に近くない堎合は蚈算が早く終わっおいただきたいです。 動的メモリ確保なしです。埓っお 普通の任意粟床小数は䜿えたせん  条件分岐は必芁最䜎限です。埓っお 算術蚈算なんかで堎合分けは䜿えたせん  党郚は倧倉ですから、みなさたがご興味を持っおいただけそうなずころたでご招埅したいず思いたす。 Section 2: 足し算・掛け算の実装 2 ぀の浮動小数点数の和や差を、どうやっお衚したしょうか 2 ぀の浮動小数点数 a, b の和 a + b や積 ab の正確な倀は、1 ぀の浮動小数点数では衚珟できたせん。 しかし ここで軜率に普通の任意粟床小数を䜿っおしたうず、たずえば 2¹⁰²³ ず 2⁻¹⁰²² の和などはず〜〜〜んでもない長さになっおしたいたすね。長いものがお奜きな方以倖は悲しくなっおしたいたす。 そこで、 和による衚珟 です。a + b や ab を 2 ぀の浮動小数点数 x, y の和で衚しおしたいたしょう。ずいっおも䜕でもアリにしおしたうず埌で困るので、䞊手い条件を課したす。a + b や ab の堎合は実は x が䞞めた倀、y が䞞め誀差に䞀臎するようにするのがツりなのですが、䞀旊もう少し䞀般のお話をいたしたしょうか。 a + b ず等しい expression 任意粟床小数の䞀般的な衚珟 有限小数 x に察し、それを浮動小数点数 x₁, x₂, ..., xₙ の総和 x = x₁ + x₂ + ⋯ + xₙ で衚したものを x の衚珟 (Expression) ず呌ぶこずにしたしょう。 そしおしばしば次のような条件を課したす。 nonoverlapping 衚珟 x = x₁ + x₂ + ⋯ + xₙ が nonoverlapping であるずいう甚語を定矩しおいきたしょう。 たずは準備です。浮動小数点数 a, b が次のいずれかの条件を満たすずき、a ず b は nonoverlapping であるずいいたす: a の最䞋䜍ビットが、b の最䞊䜍ビットよりも真に倧きい b の最䞋䜍ビットが、a の最䞊䜍ビットよりも真に倧きい a = 0 b = 0 衚珟 x = x₁ + x₂ + ⋯ + xₙ は、そのどの盞異なる 2 項も nonoverlapping であるずきに nonoverlapping であるずいいたす。 「ビットの範囲が重なっおいない」ず蚀い換えるずわかりやすいかもでしょうかね。 nonoverlapping の抂念図 nonadjacent 次は、衚珟 x = x₁ + x₂ + ⋯ + xₙ が nonadjacent であるずいう甚語を定矩しおいきたしょう。 たずは準備です。浮動小数点数 a, b が次のいずれかの条件を満たすずき、a ず b は nonadjacent であるずいいたす a の最䞋䜍ビットが、2b の最䞊䜍ビットよりも真に倧きい b の最䞋䜍ビットが、2a の最䞊䜍ビットよりも真に倧きい a = 0 b = 0 衚珟 x = x₁ + x₂ + ⋯ + xₙ は、そのどの盞異なる 2 項も nonadjacent であるずきに nonadjacent であるずいいたす。 「ビットの範囲の間に 1 bit 以䞊隙間が空いおいる」ず蚀い換えるずわかりやすいかもでしょうかね。 nonadjacent の抂念図 みなさた「わざわざ隙間を 1 開ける理由はなんですか」 わかりたす。浮動小数点数挔算 a + b や ab の結果を䞞めた倀 x ず䞞め誀差 y の関係を思い出しおみたしょう。 蚈算機むプシロン ε を甚いお |y| ≀ (x の最䞊䜍ビット) · ε / 2 が成り立ちたすね はい、䞀぀隙間が空いおいるため 𝑣𝑖𝑐𝑡𝑜𝑟𝑊 です。逆にこれ以䞊開けるのを保蚌するのは䞍可胜です。 誀差をバッチリ管理しお算術挔算をする方法 蚘法 浮動小数点数 a, b に察しお、a + b, a - b, ab を䞞めた倀をそれぞれ a ⊕ b, a ⊖ b, a ⊗ b ず衚したす。 浮動小数点数の和 a + b 簡単のため |a| ≥ |b| を仮定したしょう。するず筆算の様子はだいたいこういう感じですね。実際には a, b, x, y のどれか負になったりもしたすけれども、そのあたりはご愛嬌です。 x は浮動小数点数挔算でそのたたGO!です。y は真の倀 x の差 (a + b) - x を䞁寧に蚈算すれば良いですね。具䜓的には y = b - (x - a) ず衚すず途䞭どこにも䞞め誀差が生じなくお 𝑀𝑖𝑛 です。👇 疑䌌コヌド みなさた「え、あの、 |a| ≥ |b| っお぀たりそれを保蚌するために条件分岐が入りたすよね」 りヌンム、痛いずころを突かれたしたね。しかし実は y = (a - (x - (x - a))) + (b - (x - a)) がそれを解決するのですよ。蚌明は難しくはありたせんが堎合わけが倚いですから、みなさたのご担圓ずいうこずでよろしくお願いさせおいただいおですね。そのかわり明日の絊食圓番は私にお任せください🖐 Expression e ず浮動小数点数 b の和 結果ずなる expression は長さが 1 長くなりたす。この䞖界では挔算をしおも項の個数が枛らないずいう地獄みたいな蚭定ですからね🫠 e = e₁ + e₂ + ⋯ + eₙ が nonadjacent か぀、「䞀郚に 0 があるかもしれないこずを陀いお絶察倀が単調増加」ずいう前提条件を課しお、次の回路で蚈算するず、実はその性質が保たれたす。 Expression 同士の和 e + f ドヌヌンGo Bold の粟神です。 浮動小数点数同士の積 ab これたた賢いですよね。実は入力 a, b をずもに䞊䜍ビットず䞋䜍ビットに分解するずうたくいきたす。ずいうかよく考えたらそうでもしないず粟床が足りないのは明らかですよね。p 桁の正敎数ず q 桁の正敎数の積が垞に p + q - 1 桁であるずいう事実に泚意です。 それに泚意した䞊で、足し算のずき同様に、䞞め誀差が出ないように少しず぀差を蚈算しおいく方針です。疑䌌コヌドを远っおいただいおもわかるかもしれたせんし、難しければぜひずも原兞をです。 Expression e ず浮動小数点数 b の積 次のような回路で蚈算できお、項の個数は 2 倍になりたすね。 ずはいえ論文䞭のどの述語の実装でも掛け算は浮動小数点数同士でしか行っおいたせんから、今回必芁はないみたいですね。 これで䞀通り回路のパヌツが揃いたした あずは各述語 Orient2d, Orient3d, InCircle, InSphere を実装しおいくだけです   ずいうのがたあ地獄みたいな䜜業なのですよね。 あず念の為泚意なのですが、出力される expression の項は 0 を含むこずがありたす。䟋えば a + b を浮動小数点数で蚈算しおも党く誀差の出ない堎合は y = 0 になりたすよね。これをハンドルしようず思うず圓然堎合分けが出おくるため、意図的に攟眮しお、固定挔算だけで枈むようにしおおりたす。賢いですね。 Section 3: 各皮幟䜕述語の adaptive precision 実装の方針 目暙の䞋方修正 Orient2d のみを実装したしょう。 えいやだっおいやじゃないですか。—— み぀を Orient2d の展開 定矩を展開したしょう。 これをそのたた回路に起こした結果がこちらです。 アッ、ただ垰らないでいただいお   いたから理解できたすから、たぶん、4 割くらいは。あの 最初の匕き算 たずは入力を匕き算しお、䞻芁項ず誀差項にわかれたすね。このずき、 䞻芁項はオヌダヌ O(1)を、誀差項はオヌダヌ O(ε) を持぀ ずみなしたしょう。実際には誀差項は䞻芁項のε倍よりもずっず小さいこずもありたすが、小さい分にはよいのでこのたた圢匏的に突っ走っおいきたしょう 次の掛け算 さらに図の巊半分ず右半分それぞれに぀いお {䞻芁項, 誀差項} ず {䞻芁項, 誀差項} の 4 皮類の掛け算をしお、8 ぀ず぀、16 個の項を導出したしょう。これは図の巊から順にオヌダヌ O(1), O(ε), O(ε), O(ε²), O(ε), O(ε²), O(ε²), O(ε³) 巊半分だけ蚘述を持ちたす。あずはこれらを党お足し匕きしたものが厳密な答えです。 厳密な答え D 実際に Expression の足し匕きを行なったものが D です。いかにこれを蚈算しないかが倧事ですね。以降、さたざたな近䌌をみおいきたしょう 最も粗い近䌌 A 浮動小数点数でそのたた蚈算した結果に盞圓したす。 A の誀差範囲 慣れおいる方ならおかわり🍚いただけるず思いたすけれども、Orient2d 唯䞀の危険ポむントは枛算 x₅ − x₆ による桁萜ちです。そこで |x₅| + |x₆| の定数倍により評䟡しおいきたしょう。 こちらが枩めおおいた誀差限界です🍳料理番組颚 |A| がこの倀以䞊でしたら、sign(A) = sign(D) が保蚌されたす。 え、私は蚌明を远ったのかですっお さお、次は A ず D の䞭間の粟床の倀です。 第2の近䌌: B' これは正盎なずころ A ずほずんど倉わらないので、私はあたり存圚意矩がわからなかったのですが、なにかご存知の方いらしたら教えおいただきたいです。 B’ ずいうのは Expression B の浮動小数点数近䌌です。 みなさた「そんなの B の O(1) 項を取れば良いだけでしょうそんな、たたたたぁ〜〜」 わかりたす。私もそう勘違いしたせいで無限にお時間が溶けたした。ここで扱っおいる expression ずいうのは、䞻芁ビットから貪欲になるべく長くずったものずは限らないずいうこずに泚意です。ここで躓かなかった方は 𝑌𝑜𝑢 𝑘𝑛𝑜𝑀 𝑡𝑜𝑜 𝑚𝑢𝑐ℎ、バッド゚ンドです。 実は論文䞭Theorem 23に、䞻芁項を抜出するのに䜿えるアルゎリズムが蚘茉されおいたす。詳现はさおおき、条件分岐が出おきおいるのはちょっず悲しいずころですね。ちなみにルヌプは今回固定長なので消せたす。 誀差䞊界をはこちらです。A ずあたり倉わらなくお悲しいですね。 第3の近䌌: C O(ε) のオヌダヌを持぀項を片っ端から集めおいるこずがわかりたすね。 誀差限界はこちらです: これでもどうしようもなければ D を蚈算するずいうこずですね。賢いです。 Section 4: 珟代の厳密蚈算 結局私個人が厳密幟䜕蚈算を実装するハメになる機䌚はなかったのですが、では珟代ではもう䜿われおいない技術なのでしょうかね。だずしたら、ずおも寂しいですね。 最埌に、この手の厳密述語 (exact predicate) が珟代のラむブラリでどう扱われおいるかを軜く芋たす。 CGAL にありたしたよ こちら、どなたが䜿っおいるのですか CGAL (Computational Geometry Algorithms Library) ずいうラむブラリがありたす。蚈算幟䜕のあらゆる叡智の詰たった老舗の C++ ラむブラリなのですが、そこを探しおみるず、 Predefined Kernels ずいうクラス矀が芋぀かりたす。これは幟䜕蚈算をしたり、幟䜕的オブゞェクトを構築したりするずきのカヌネルです。 呜名芏則を芋るず、exact predicate ず exact construction が芋えたすね。Exact predicate ずいうのは今回ご説明したように、「述語の yes/no を厳密に刀定する」こずで、比范的簡単か぀あたり倧きなコストがかからないず蚀われおいたす。簡単ですか 䞀方 exact construction は非垞に難しいです。ずいうのも predicate のずきのように「誀差を評䟡しおフィルタリング」のようなテクは通甚せず、すべおを厳密蚈算する必芁がありたす。そのうえ 耇雑な制玄条件により䞎えられる点は長倧な有理数や耇雑な方皋匏で衚される からです。「構築した点を基準に構築する」ずかにも察応しないずいけたせんからね。 OCCT にはなさそうですね CAD の超有名 OSS であるずころの OCCT (Open Cascade Technology) もチェックです 䞀応探しおみたしたが、なさそうな気がしたす。 根拠列挙タヌむム OCCT は他の CAD カヌネル同様、tolerance ベヌスで管理を行っおいたすね。 CAD カヌネルは点の構築が倧前提の゜フトですから、exact predicate もうたく掻躍できなそうです。 Tolerance によるヒヌリングの技術も発達しおいるので、それで実は実甚䞊困らないのかもしれたせん。 実際、非垞に繊现で耇雑な蚈算である Boolean 挔算でも tolerance ベヌスで蚈算しおいるこずが、 Boolean Operations の Guide を参照するずわかりたす。 BTW: 機械孊習っおなんがのもんなんですかね さお、ここたで読んでくださったアルゎ系゚ンゞニアのみなさた、機械孊習はお奜きですか みなさた「機械孊習がなんがのもんじゃい✊💥」 みなさた「私たちの憧れたヒュヌリ🥒スティックプログラミングいずくにかです」 え、今日日そんなこず思いたせんよっお、ぐぬぬぅ   ずいうか私が☝でしたずいうだけなのですけれども、最近は倉わりたした。 機械孊習は、やや矮小化かもしれたせんけれども「曞かなくおいい郚分が増えただけ」で、叀兞的手法の゚ッセンスは残っおいる気がするのですよね、少なくずも珟時点では。 良いヒュヌリスティックは倧抵「倩才的な気づき」から始たるものの、その埌は぀らいモグラ叩きになりがちです。機械孊習は、そのモグラ叩きを「最適化問題」ずしお正面から殎れるのが最高に気持ち良いです Transformerのような汎甚手法が党盛の今でも、䜕が本質かを芋極めおベクトルを緎り䞊げる工皋は、極めお domain-specific です。そこには間違いなく、叀兞の英知が息づいおいたす。 珟実䞖界には「理論䞊解けるはずなのに、攟眮されおいる面癜い最適化問題」が山積みです。その山を、叀兞の英知ず最新の技術で䞀緒に厩したせんか そんな仲間を、我々キャディのチヌムは埅っおいたす😉 speakerdeck.com たずめ 䜕かをするのに遅すぎるずいうこずはありたせん。 おずずい 4/11 は私のお誕生日でした。プレれント🎁を送れなかったよずいう方、あずはわかりたすね。
こんにちは、Infrastructure Teamの宮本( @m1yam0t0 )ず申したす。 本蚘事では、キャディの暩限昇栌システムの取り組みを玹介したす。 目次 目次 はじめに 内補システムから Google Cloud PAM ぞの移行 PAM の利甚資栌の蚭定 PAM の運甚で工倫しおいるこず Slack 通知機胜の実装 Devin による利甚資栌蚭定の自動化 たずめ はじめに みなさんは、パブリッククラりドの暩限はどのように管理されおいたすか IAMでメンバヌに必芁な暩限を付䞎しおいたすでしょうかTerraformでIaC管理されおいたすでしょうか キャディでは、最小暩限の原則に埓っお、開発者には閲芧系の必芁最䜎限の暩限のみを付䞎しおいたす。 *1 開発・運甚で远加の暩限が必芁になった堎合は、Just-In-Time(JIT) Accessの仕組みで䞀定期間だけ暩限昇栌できるようになっおいたす。 開発者が暩限を申請し、承認者が承認しおはじめお暩限が付䞎されたす。 最小暩限の原則を培底するこずで、昚今利甚が広がっおいるAI゚ヌゞェントを掻甚した堎合にも、本番環境の暩限を持っおいないため、誀っお操䜜しおしたうリスクを䜎枛できたす。 本蚘事ではこのJIT Access Systemを内補システムから Google Cloud Priviledged Access Manager(PAM) に移行したお話を玹介いたしたす。 内補システムから Google Cloud PAM ぞの移行 キャディでは、2022幎より内補のJIT Access Systemを運甚しおおりたした。 しかし、この内補のJIT Access Systemに぀いお、認可制埡に課題があったため、IAM Condition を組み合わせお暩限が付䞎できるように改修を怜蚎しおいたした。 そんな䞭、Google Cloud PAM のアップデヌトで、暩限のスコヌプが蚭定可胜になったこずを知り、怜蚌をしおみたずころ、内補のシステムを改修しづ぀けるより、効率良く目的を達成できるこずがわかりたした。 IAM release notes  |  Identity and Access Management (IAM)  |  Google Cloud Documentation 䞊蚘を螏たえお、以䞋の理由から、キャディのJIT Access SystemをGoogle Cloud PAMぞ移行する䟡倀があるず刀断し、移行を実斜いたしたした。 暩限のスコヌプを现かく蚭定でき、取埗する暩限を必芁最小限に抑えられる Cloud Loggingに監査ログが残るため、通知や監査に掻甚できる Google Cloudマネヌゞドのサヌビスであるためメンテナンス䞍芁 PAM の利甚資栌の蚭定 Google Cloud PAMでは、取埗したい暩限のセットを利甚資栌ずしお定矩し、必芁な暩限に察応する利甚資栌を遞択しお申請したす。 Terraform Provider が公匏で提䟛 されおいるため、IaCで管理できたす。 利甚資栌はナヌスケヌスごずに耇数䜜成するため、 以䞋のようなTerraform moduleを定矩し、倉数を入力するこずで容易に蚭定できるようにしたす。 resource "google_privileged_access_manager_entitlement" "entitlement" { provider = google-beta entitlement_id = var.entitlement_id location = var.location parent = var.parent max_request_duration = var.max_request_duration eligible_users { principals = var.eligible_users } privileged_access { gcp_iam_access { resource_type = var.resource_type resource = var.resource dynamic "role_bindings" { for_each = toset (var.roles) content { role = role_bindings.value } } } } approval_workflow { manual_approvals { require_approver_justification = var.require_approver_justification steps { approvers { principals = var.approvers } approvals_needed = var.approvals_needed approver_email_recipients = var.approver_email_recipients } } } additional_notification_targets { admin_email_recipients = var.notification_emails } requester_justification_config { unstructured {} } } 実際に利甚する箇所では以䞋のようにTerraform moduleを呌び出しお定矩しおいたす。 申請・承認するナヌザを蚭定できるため、チヌムによっお申請可胜な利甚資栌を蚭定できたす。 module "pam_org_gcs_bucket_read_access" { source = "../../modules/pam" # 利甚資栌名 entitlement_id = "gcs-bucket-read-access" # Organization, Folder, Project 単䜍で指定可胜 parent = "organizations/$ { local.organization_id } " location = "global" resource_type = "cloudresourcemanager.googleapis.com/Organization" resource = "//cloudresourcemanager.googleapis.com/organizations/$ { local.organization_id } " # 取埗したい role を定矩 roles = [ "roles/storage.bucketViewer" , "roles/storage.objectViewer" , ] # 申請可胜なナヌザ eligible_users = [ "group:users@caddi.com" , ] # 承認可胜なナヌザ approvers = [ "group:approvers@caddi.com" , ] # 最倧の申請期間 max_request_duration = "14400s" # 必芁な承認の数 approvals_needed = 1 } PAM の運甚で工倫しおいるこず Slack 通知機胜の実装 PAMの通知機胜はメヌル通知のみでSlackぞの通知には暙準では察応しおいたせん。 しかし、既存のJIT Access SystemではSlack通知するようにしおいたため、利甚者䜓隓が倉わらないようにする必芁がありたした。 そこで、PAMの監査ログの内容をパヌスしおSlack通知するAPIを実装したした。 以䞋のような仕組みで動䜜しおいたす。 Pub/Subを経由しお、実装したSlack通知APIに送信 Cloud Loggingに保存されおいるPAMの監査ログをLog routerでPub/Subに転送 Pub/Subの Push Subscription を䜿っおCloud Runで動䜜しおいるSlack通知APIにHTTP POST 実際の構成図は以䞋です。 PAM通知機胜の構成図 䞊蚘のSlack通知APIを利甚しお、既存システムの䜿甚感はそのたたに、SlackでPAMの申請・承認を通知できるようにしたした。 PAMのSlack通知 Slack通知の内容に぀いおも、利䟿性を䞊げるために様々な改善をしおいたす。 承認結果のメッセヌゞを申請したメッセヌゞのスレッドに玐づけお投皿 申請内容に䞍備がある堎合は、申請内容の修正を促すように譊告文を自動で投皿 申請のステヌタスによっお、SlackのAttachmentの色を倉曎 Devin による利甚資栌蚭定の自動化 PAMの利甚資栌の䞭に取埗したい暩限が存圚しない堎合、利甚資栌を修正する必芁がありたす。 PAMの移行圓初は取埗できる暩限が䞍足しおおり、利甚者から倚く䟝頌を受けおいたした。 その床にTerraformの定矩を修正しレビュヌするのは倧倉です。 そこで、Devinを䜿っお、Terraformの修正からPRの䜜成を自動でしおもらうようにしたした。 Devin Playbook で利甚資栌を修正するPR䜜成䜜業を定型化しおいたす。 利甚者がSlack Workflowで远加しおほしい暩限を入力するずDevinが呌び出され自動でPRを䜜成したす。 あずは、チヌムメンバヌがPRをレビュヌ、マヌゞしお反映するだけです。 Devin による利甚資栌の倉曎PRの䜜成 たずめ 暩限の最小化を培底するために導入しおいたJIT Access Systemを、内補システムからGoogle Cloud PAMに移行したした。 PAMに移行したこずで最小粒床の認可制埡が可胜になり、より安党にGoogle Cloud を運甚できるようになりたした。 たた、AI゚ヌゞェントの掻甚により運甚の改善を効率良く実斜できたした。本圓に䟿利なものですね。 みなさんがGoogle Cloud PAMを導入するずきの参考になれば幞いです。 *1 : Terraformで管理
こんにちは、キャディで Quote ずいうアプリケヌションを開発しおいる plant こず石田 ( @plant_ja ) です。 ハヌネス゚ンゞニアリングずいう蚀葉を目にする機䌚が増えおきたしたね。「䜕をやるべきか」に぀いおは OpenAI の Harness engineering: leveraging Codex in an agent-first world や逆瀬川さんの Claude Code / Codex ナヌザヌのための誰でもわかるHarness Engineeringベストプラクティス が非垞に参考になりたす。 本蚘事では「䜕を」ではなく「どう始めるか」に焊点を圓おおいたす。Claude Code の堎合だず Rules、Skills、Hooks、Subagents、さらには custom linter や pre-commit や pre-push、これらの構成芁玠を眺めおいるだけで「ちゃんずやろうずしたら倧倉そうだな」ずいう気持ちになりたすよね。 この蚘事では、そのハヌドルを䞋げるための1぀のシンプルなアプロヌチを玹介したす。 この蚘事のゎヌル ハヌネス敎備のハヌドル ルヌル敎備によっお倉わったこず なぜうたくいったのか : 枠組みがあるず曎新のハヌドルが䞋がる 始め方 : 枠組みだけ先に䜜る プロンプト䟋 Rules 以倖にも枠組みは䜜れる 終わりに この蚘事のゎヌル この蚘事のゎヌルは、ハヌネス゚ンゞニアリングの着手のハヌドルを䞋げるこずです。 「完璧なハヌネスを最初から䜜り蟌たなきゃ」ず構えるのではなく、「ずりあえず枠組みを䜜っお、そこからチヌムで育おおいく」ずいう発想を持っお、気軜にハヌネスの敎備を始められるようになるこずが目暙です。 ハヌネス敎備のハヌドル コヌディング゚ヌゞェントに実装させた結果、期埅に満たないコヌドが生成されるこずがありたすよね。 効率の悪さを感じながらも、その床に毎回「コヌドから自明なコヌドコメントは䞍芁です」「 as unknown as のような危険な型キャストは䜿わないでください」ずいう现かい指摘をするこずになっおいたした。アヌキテクチャ呚りのドキュメントは充実しおいたのですが、実装の现郚のガむドラむンはただただ敎備されおいたせんでした。 重芁性は理解したものの、ハヌネス敎備にあたっおのいく぀かの心理的なハヌドルによっお䞭々敎備が進められおいないずいう状況が数週間ほど続きたした。 「そもそもハヌネス゚ンゞニアリングに぀いおの目線をチヌムで揃えないず」 「どういう圢匏でルヌルを敎備するべきなんだろう、先にチヌムで議論しないず」 「ルヌルファむルを新たに远加したくなったけど、流石に実装 PR ずは分けたほうがいいよな」 そんなこずを考え぀぀、ハヌネス゚ンゞニアリングに぀いおの目線をチヌムで揃えたり、custom linter を敎備するなどの掻動を進めたのですが、「やっぱり Rules ファむルの敎備が手っ取り早く品質を向䞊させるためのアプロヌチだ」ず考え、重い腰を䞊げお自分が開発しおいるアプリケヌションのバック゚ンドの実装ルヌルを Claude Code の Rules ファむルずしお敎備するこずにしたした。 ▶ 補足 : Claude Code の Rules ずは Claude Code には CLAUDE.md ずいうファむルにプロゞェクトの指瀺を曞く仕組みがありたすが、指瀺が増えおくるず1ファむルでは管理しづらくなりたす。 Rules は .claude/rules/ ディレクトリに Markdown ファむルを眮くこずで、指瀺をトピックごずに分割しお管理できる仕組みです。䟋えば testing.md 、 api-design.md のようにファむルを分けられたす。 さらに、YAML frontmatter で paths を指定するず、特定のファむルパスに䞀臎するファむルを Claude が読んだずきにだけルヌルが読み蟌たれる conditional rules ずしお機胜したす。䟋えば paths: ["src/api/**/*.ts"] ず指定するず、API 関連のファむルを扱うずきだけそのルヌルが適甚されたす。 paths を指定しないルヌルはセッション開始時に垞に読み蟌たれ、 CLAUDE.md ず同じ扱いになりたす。 詳しくは 公匏ドキュメント を参照しおください。 Rules ファむルは、レむダヌを暪断した汎甚的な Rules (coding-style.md, testing.md) や、レむダヌ毎の実装ルヌル (usecase.md, usecase_testing.md) に倧別するこずずしたした。 Rules を敎備するために、既存の実装から実装パタヌンを掚論しお Rules ファむルを生成するスキルを䜜成したした。ファむルの生成自䜓はそこたで時間がかからずにできたのですが、実装方針がふわっずしおいる郚分に぀いお意思決定を䞋したり、现かいニュアンスの修正など、想像以䞊にルヌルのレビュヌに時間がかかり、党おのレむダヌに察しおのルヌルを䜜り切るたでに䞞䞀日を費やしたした。 しかし、ハヌネス゚ンゞニアリングの土台敎備ずいう芳点だず、ここたでやる必芁はなかったずいうこずに埌に気づくこずになりたす。 ルヌル敎備によっお倉わったこず バック゚ンドの Rules ファむルが䞀通り敎った䞊で、実装を進める䞭で「これもルヌルに盛り蟌みたいな〜」ずいう点がいく぀も出おきたす。そこで、ルヌル曎新甚のスキル /update-coding-rule を䜜り、 /update-coding-rule コヌドから自明なコヌドコメントは䞍芁です ずいう指瀺を Claude Code に出すず、察応するルヌルファむルを探しお远加・曎新しおくれるようにしたした。実装の途䞭で出る现かい䞍満が、そのたたチヌムで管理しおいる品質基準ぞのフィヌドバックになるわけです。 PR レビュヌのコメント URL を枡しおも同じこずができるようにしたした。 /update-coding-rule <PR のコメント URL> ず指瀺するだけで、スキルが該圓スレッドを取埗しお、PR レビュヌでの指摘をルヌル化しおくれたす。 このスキルを䜕回か䜿っおいく䞭で、 「実装䞭の现かい䞍満をチヌムの品質基準に反映させる」ずいう䜜業に察しおの心理的なハヌドルがずおも䞋がっおいる こずに気づきたした。 ▶ 補足 : /update-coding-rule のスキル定矩テンプレヌト 自分が䜿っおいるスキルをプロゞェクト固有の郚分を取り陀いおテンプレヌト化したものです。 .claude/skills/update-coding-rule/SKILL.md ずしお配眮すれば、 /update-coding-rule で呌び出せたす。 --- name: update-coding-rule description: フィヌドバックや PR レビュヌコメントからルヌルを䞀般化し、ルヌルドキュメントに反映する。 argument-hint: "[PR comment URL or feedback text]" --- # コヌディングルヌル曎新スキル フィヌドバックを䞀般化し、コヌディングルヌルドキュメントに反映する。 ## フロヌ ### 1. フィヌドバックの収集 - PR コメント URL が枡された堎合は GitHub API でスレッドを取埗する - テキストが枡された堎合はそのたた䜿う - 䞍明確な堎合は AskUserQuestion で確認する ### 2. フィヌドバックの汎甚化 具䜓的なフィヌドバックを、再利甚可胜なルヌルに倉換する。 - 具䜓的な倉数名・クラス名を抜象化する - 特定のコヌド修正指瀺から、背景にある原則を抜出する - GOOD / BAD のコヌド䟋を添える ### 3. 配眮先の決定 ルヌルドキュメントのディレクトリ構成を確認し、どのファむルに远加すべきかを刀断する。 既存ルヌルずの重耇・矛盟がないかも確認する。 ### 4. ナヌザヌぞの確認 AskUserQuestion で以䞋を提瀺し、確認を取る。 - 䞀般化したルヌルの内容 - 配眮先ファむルずその理由 - 重耇・矛盟の有無 ### 5. ルヌルファむルの曎新 確認が取れたら、察象のルヌルドキュメントにルヌルを远蚘する。 なぜうたくいったのか : 枠組みがあるず曎新のハヌドルが䞋がる ここからが気づきです。ルヌルが育぀ようになった理由は、「充実したルヌルファむルを最初から甚意した」からではなく、「ルヌルファむルをどこに・どんな圢で眮くか」ずいう枠組みが決たっおいたからです。 枠組みがあるず、ハヌネス敎備に際しおのハヌドルがグッず䞋がりたす。ハヌネスの圢匏は既に決たっおいるので、その䞭身をリッチにしおいくずいう営みは日垞の開発の延長線䞊で容易に行うこずができたす。 この経隓を経お、 重芁なのはルヌル内容の充実床ではなく、誰でも曎新しやすい状態になっおいるこず だず気づきたした。内容がスカスカでも、「これはここに远加すればいいんだ」ずいう道筋が芋えおいるこずの方が倧切なのだず。 始め方 : 枠組みだけ先に䜜る ここからが実践です。私は1日かけおルヌル党䜓をいきなり敎備したしたが、そこたでやる必芁はありたせんでした。 枠組みほが空のルヌルファむル矀だけ先に䜜っおしたえば、始められたす。 プロンプト䟋 プロゞェクトのアヌキテクチャをざっず分析しおもらい、Rules ファむルの骚組みを䜜るプロンプトの䟋です。 自分がメむンに利甚しおいるのが Claude Code なので、Claude Code に特化した内容になっおいたす。 このプロゞェクトのアヌキテクチャを分析しお、Rules ファむルの骚組みを䜜っおください。 ## ルヌルドキュメントの皮類 ルヌルドキュメントは䞋蚘の 2 皮類に倧別したす。 ### 1. 汎甚ルヌル レむダヌを暪断する共通方針です。ナヌザヌにどのような汎甚ルヌルを䜜成したいかを むンタビュヌした䞊で、必芁なものを䜜成しおください。 䟋 : `coding-style.md`, `testing.md`, `error-handling.md`, `observability.md` ### 2. レむダヌ別ルヌル レむダヌごずにサブディレクトリを䜜り、実装ルヌルずテストルヌルを分離したす。 䟋 : `usecase/usecase.md`, `usecase/usecase_testing.md` ## ルヌルドキュメントの芁件 - 各ルヌルドキュメントには抂芁のセクションを甚意しお、ルヌル自䜓の説明を曞く - coding-style.md の䟋 : XXXプロゞェクトのコヌディングスタむルに関する暪断ルヌル - usecase/usecase_testing.md の䟋 : Usecase 固有のテストルヌル。共通のテストルヌルは testing.md を参照。本ドキュメントの芏玄が testing.md ず競合する堎合、本ドキュメントを優先する。 - 既存のコヌドから明らかに読み取れるルヌルがあれば、セクションを远加しお1~2個ほど簡朔に蚘入しおも構わない ## .claude/rules/ のむンデックスファむル ルヌルドキュメント本䜓の眮き堎所はナヌザヌにむンタビュヌしお決めおください。 `.claude/rules/` 配䞋のファむルはむンデックスずしお扱い、ルヌル本䜓ぞの参照だけを蚘茉したす。ディレクトリ構成はルヌル本䜓のディレクトリ構造ず䞀臎させるようにしたす。 frontmatter の `paths` で察象ファむルパスを指定し、本文にはルヌルドキュメントぞのパスを曞きたす。 以䞋は Usecase のテストルヌルのむンデックスファむルの䟋です。 --- paths: - "src/usecase/**/*.spec.ts" --- # Usecase テストルヌル Usecase のテストを新芏䜜成・修正する堎合、蚈画開始前もしくは䜜業開始前に以䞋のルヌルファむルを読み蟌むこず: <ルヌルドキュメントぞのパス> このプロンプトを Claude Code に枡すず、「ここに䜕を眮くか」ずいう地図ができたす。 ▶ 補足 : なぜ .claude/rules/ をむンデックスずしお扱うのか Claude Code の Rules は paths を指定するこずで conditional rules ずしお蚭定できたす。該圓パスのファむルをセッション䞭に初めお Read したタむミングでルヌルが読み蟌たれる仕組みです。 ルヌルの内容がリッチになっおトヌクン数が増えおくるず、コンテキストりィンドりを圧迫したり、attention が分散しお本圓に必芁なタむミングで必芁なルヌルが考慮されにくくなるずいう問題が起きやすくなりたす。 これを避けるために、 .claude/rules/ 配䞋のファむルはむンデックス参照先のパスだけを蚘茉した軜量なファむルずしお扱い、ルヌル本䜓は別の堎所に眮くずいう構成を採甚しおいたす。こうするこずで、conditional rules ずしお読み蟌たれるトヌクン数を最小限に抑え぀぀、゚ヌゞェントが必芁に応じおルヌル本䜓を読みに行く圢にできたす。 Rules 以倖にも枠組みは䜜れる 今回は Rules の敎備を䟋に挙げたしたが、同じ発想は Rules ファむル以倖でも䜿えるず考えおいたす。䟋えば Skills であれば、API の stub を生成するスキル /create-api-stub を最䜎限の機胜で䜜っおおくだけで、䜿う䞭で「リク゚ストパラメヌタヌのバリデヌションもこの時点で入れるようにしよう」などずいったフィヌドバックが自然ず集たるようになりたす。Hooks であれば、Stop hooks や PostToolUse hooks などの各タむミングで走らせるための専甚のスクリプト (䟋: stop-hook-script.js) を甚意しおおき、そこを少しず぀充実させおいくなどのアプロヌチが取れるかもしれたせん。 枠組みず責務が明確だず、曎新・拡匵のハヌドルが䞋がる。 Rules に限らず、この原則は共通しおいるはずです。 終わりに ハヌネス゚ンゞニアリングは、完璧な仕組みを蚭蚈しおからスタヌトするものではないず思っおいたす。芋出しだけのルヌルファむルでも、空っぜのスキルでも、「ここに足しおいける」ずいう堎所があるだけで、チヌムの誰かが気づいたこずを反映できるようになりたす。 開発ずハヌネス敎備を区別せず、同じタスクの䞭で完結させる。この感芚が根づくず、ハヌネスは勝手に育っおいくのではないでしょうか。 この蚘事で取り䞊げたような課題感をお持ちの方は、ぜひ枠組みを䜜るずころからスタヌトしおみたせんか たた、キャディでは䞀緒に働く仲間を倧募集䞭なので、興味があれば䞋蚘もぜひご芧ください。 speakerdeck.com
はじめに 䜕が蟛かったのか 毎回詳现なプロンプトを曞くのが蟛い AI゚ヌゞェントのタスク完了たで面倒を芋るのが蟛い これらを䞊列で実行しおいるのが蟛い 解決方針 詳现な蚭蚈ドキュメントの䜜り蟌み Usecase Design Doc 现かい実装指瀺・蚈画・実行をAI゚ヌゞェントに委譲 タスクの分割方針 AI゚ヌゞェントぞの実装委譲 AIのお䞖話からの解攟 - 埗られた成果 開発速床の向䞊 PRレビュヌ自䜓の認知負荷の軜枛 珟圚盎面しおいる課題 蚭蚈曞の现かい誀りの増幅 蚭蚈ずPRレビュヌのボトルネック化 たずめ はじめに こんにちは。CADDi Quoteのサヌバヌサむドの開発を担圓しおいたす、majimacchoです。私たちのチヌムでは党員がAI゚ヌゞェントを掻甚しお実装しPR䜜成たで行なっおいたす。 私自身を含め、党く自分でコヌドを曞かなくなったメンバヌもいたす。AI゚ヌゞェントを䜿っおから個人のアりトプットは倧きく増えたしたが、その分 AIのマネゞメント(お䞖話)の負荷 が高たっおいたした。 今回玹介するUsecase Design Docず呌ばれるドキュメントず関連する斜策を通しお、このAIのお䞖話の負荷を軜枛したした。たたそれに付随しお1日にマヌゞできるPRの数は2倍になっおいたす。 この蚘事では、AI゚ヌゞェントを利甚した開発で増倧するAIのお䞖話の負荷をどう軜枛したかを、具䜓的な開発プロセスず合わせおお䌝えしたす。 䜕が蟛かったのか 私は倧きく以䞋の3぀のこずが蟛いず感じおいたした。 毎回詳现なプロンプトを曞くのが蟛い AI゚ヌゞェントのタスク完了たで面倒を芋るのが蟛い これらを䞊列で実行しおいるのが蟛い 毎回詳现なプロンプトを曞くのが蟛い AIが実装を行う際に「OOを実装しお」のような曖昧な指瀺では期埅通りのコヌドを䜜成しおくれたせん。1぀のPRを䜜成するのに、かなり倚くの説明をしなければいけないこずに負担を感じおいたした。AIしか読たない詳现な文曞を曞くこずに虚無感すら芚えおいたした。様々なツヌルやスキルによっお、ある皋床個々の負担は軜枛できたすが、それでもAIのための指瀺を、その郜床、正確にしなければいけたせんでした。 AI゚ヌゞェントのタスク完了たで面倒を芋るのが蟛い 最近のAI゚ヌゞェントは十分賢くなったので、党おの挙動を芋匵る必芁はなくなりたした。 しかし、特にClaude Codeを利甚しおいる堎合は、プランを確認したり、ツヌルの利甚を蚱可したりするずころで、ただ人間の操䜜を必芁ずしおいたす。 PR䜜成埌もそのたた受け入れられる品質の時は良いですが、修正が必芁な堎合、䜕床もやり取りが発生したり、堎合によっおはセッションをクリアする必芁がありたす。 これらを䞊列で実行しおいるのが蟛い 䞊蚘の問題は、盎列で䜜業しおいる時には倧きくなかったのですが、䞊列で仕事をするようになっおから顕著になっおきたした。 特に、 1人で同時に5぀以䞊 のタスクをAI゚ヌゞェントず実装するようになっおからは、認知負荷が顕著に䞊がっおしたいたした。 AIコヌディング以前は䞊列で䜜業するこずが間違っおいるずいう考え方が䞻流だったず思いたす。しかし、AI゚ヌゞェントを埅っおいる間に別の゚ヌゞェントを動かさないず機䌚損倱しおいるような感芚があり、ほずんどの時間に、AIを䞊列皌働させおいたす。 ロヌカルでGit Worktreeを管理する必芁も出おきたり、開発サヌバヌのポヌトが競合するこずもありたす。手動でmainブランチをマヌゞするのを忘れお、䜕床もコンフリクトを起こしたした。 コンテキストスむッチも倧きくなり䞀時期は䞊列数を3぀たでに制限するこずもありたした。 解決方針 䞊述の課題を以䞋の方針で解決したした。 詳现な蚭蚈ドキュメントの䜜り蟌み 现かい実装指瀺・蚈画・実行をAI゚ヌゞェントに委譲 詳现な蚭蚈ドキュメントの䜜り蟌み 今回重芁だったこずは、现かい指瀺を出さなくおも、AI゚ヌゞェントが質の高いアりトプットを出せるこずです。 詊行錯誀する䞭で、Usecase Design Docずいう圢でより现かい蚭蚈内容をたずめるこずで、AI゚ヌゞェントのアりトプットの質が高められるこずがわかりたした。 Usecase Design Doc 以前はナヌスケヌスレベルの蚭蚈はPRのDescriptionやホワむトボヌドツヌルに散圚しおおり、各開発者の暗黙知に䟝存しおいたした。これを明文化するこずで、AIにずっおの実装の゚ントリヌポむントになるず同時に、レビュヌ時の照合基準ずしおも機胜しおいたす。 このドキュメントには、ナヌスケヌスシナリオに閉じた蚭蚈を蚘茉したす。具䜓的には以䞋の内容を含んでいたす。 サマリヌアクタヌ・操䜜察象・操䜜内容の定矩 関連テヌブルのCRUD衚 シヌケンス図トランザクション境界を含む 䞻芁なドメむン゚ンティティのむンタヌフェヌス型定矩・ファクトリメ゜ッド 関連するAPIむンタヌフェヌスAPI仕様曞から抜粋 既存コヌドぞの倉曎箇所レむダヌごず 実装状況チェックリスト集玄単䜍・レむダヌ単䜍 以䞋は架空のナヌスケヌスを䟋にしたUsecase Design Docのサンプルです。実際のプロダクトのものではありたせんが、蚘述の粒床やフォヌマットは実際に䜿甚しおいるものず同等です。ただし、サンプル内のナヌスケヌス・蚭蚈・コヌディング芏玄は実際のものずは異なりたす。 # EX-a1: ナヌザヌはお気に入り商品をブックマヌクする ## サマリヌ - ログむンナヌザヌが商品に察しお、ブックマヌクお気に入り登録を行う ## 関連のテヌブル | テヌブル | 操䜜 | 操䜜内容 | | :--- | :---: | :--- | | Product | R | ブックマヌク察象の商品が存圚するこずを確認する | | Bookmark | CR | ブックマヌクの存圚確認R、新芏䜜成C | | BookmarkCount | U | 商品のブックマヌク数を +1 曎新する | ## シヌケンス図 ```mermaid sequenceDiagram autonumber actor User as ログむンナヌザヌ participant API as Product API<br/>[REST] participant DB as App DB<br/>[PostgreSQL] User->>API: POST /products/{productId}/bookmarks API->>DB: 商品の存圚確認 alt 商品が存圚しない API-->>User: 404 Not Found else 商品が存圚する API->>DB: 既存ブックマヌクの確認 alt 既にブックマヌク枈み API-->>User: 409 Conflict else 未ブックマヌク rect rgba(100, 150, 255, 0.15) Note over API,DB: トランザクション API->>DB: Bookmarkを保存 API->>DB: BookmarkCountを+1曎新 end API-->>User: 201 Created end end ``` ## 䞻芁なドメむン゚ンティティのむンタヌフェヌス > 実際のドキュメントではここに゚ンティティの型定矩ずファクトリメ゜ッドを蚘茉したす。 > 䟋: ` type Bookmark = Readonly<{ id: BookmarkId; userId: UserId; productId: ProductId; ... }> ` > 䟋: ` const Bookmark = { create: (...) => Bookmark, ... } ` ## APIむンタヌフェヌス > 実際のドキュメントではここにAPIのパスパラメヌタ・リク゚ストボディ・レスポンスの定矩をテヌブル圢匏で蚘茉したす。 > 䟋: パスパラメヌタ ` productId: string ` 、レスポンス ` 201 Created / 404 Not Found / 409 Conflict ` ## 既存コヌドの倉曎 > 実際のドキュメントではここにドメむン・ナヌスケヌス・むンフラストラクチャ・プレれンテヌション等のレむダヌごずに、倉曎察象のファむルパスず倉曎内容をテヌブル圢匏で蚘茉したす。 ## 実装状況 - [ ] 同期凊理 - [ ] Bookmark 集箄 - [ ] ドメむンの実装 - [ ] ナヌスケヌスの実装 - [ ] プレれンテヌションの実装 现かい実装指瀺・蚈画・実行をAI゚ヌゞェントに委譲 今たでの開発ではAI゚ヌゞェントに実装させる䞭でも、以䞋のようなタスクのために、AI゚ヌゞェントずロヌカル環境に泚意を向けなければいけたせんでした。 最初のプロンプトの入力 コンテキストがいっぱいになった時のセッションマネゞメント Toolの利甚の蚱可 今回は、これらに泚意を払わずに、蚭蚈ずPRレビュヌに集䞭するプロセスを構築したした。 Usecase Design Docの内容を元にナヌスケヌスシナリオごずに実装タスクを蚈画したす。 タスクの分割方針 ナヌスケヌス党おを1぀のPRで実装するには倧きすぎるため、基本的には以䞋の軞で分割したす。 レむダヌ単䜍Presentation / Domain / Application DDDの集玄単䜍 同期・非同期の凊理単䜍 この分割の基準は先ほどのUsecase Design Docのテンプレヌトに含たれおいたす。 各PRは200〜300行の倉曎に収たるこずを目安にしおいたす。この分割により、PR1件あたりの情報量が制限されたす。さらに、レビュアヌが把握すべき知識の範囲もレむダヌや集玄の境界内に限定されたす。 AI゚ヌゞェントぞの実装委譲 タスク分割が完了したら、以䞋の流れでAI゚ヌゞェントに実装を委譲したす。 Usecase Design Docの実装状況の欄のうち、未実装の項目の䞀番䞊を実斜タスクずする Devin Searchで関連コヌド・ドキュメントを収集 : タスクを指定しお、Usecase Design Docず関連する既存コヌドをDevinに読み蟌たせる DevinでPR䜜成たで実行 : タスク定矩に基づいおDevinが実装し、PRを䜜成する CIのDevin Reviewで自動レビュヌ : 䜜成されたPRに察しおCI䞊でDevinによる自動レビュヌが走る 蚭蚈ドキュメントが十分に詳现化されおいれば、この䞀連の流れに人間が介入する必芁はありたせん。お昌前にタスクを投入し、出来䞊がったPRを午埌にレビュヌするずいう非同期な䜜業サむクルが成立したす。 AIのお䞖話からの解攟 - 埗られた成果 埓来のような䞊列でAIのタスクずセッションを管理しなければいけないような環境から脱华し、心には平穏が蚪れたした。 心理的、認知的に楜になっただけではなく、業務䞊も以䞋の成果が埗られたした。 開発速床の向䞊 埓来のAIを掻甚した開発ず比范しお 1日にマヌゞされるPRの数が2倍になっおいたす。 これはAI゚ヌゞェントが人間を埅たずに䜜業ができるようになったこずず、アりトプットの質が䞊がっお手戻りが枛ったこずによるものです。 たた、今たでAI゚ヌゞェントぞのプロンプトやセッション管理を通じた盎接的なマネゞメントから、AI゚ヌゞェントの環境敎備を行なっお、セッション暪断で効果のある斜䜜に時間が割けおいる事もその芁因の1぀です。 さらに、䞊列数の䞊限も特になくなり、その日のPRレビュヌに割ける時間から逆算しお実装タスクの数を決めるようになりたした。 PRレビュヌ自䜓の認知負荷の軜枛 詳现な蚭蚈ドキュメントがPRレビュヌ時にあるこずで、PRの内容をすぐに理解できるようになりたした。今たではなんずなく頭にあった情報を思い出しおレビュヌしおいたした。今は詳现な蚭蚈ドキュメントず照らし合わせながらレビュヌしおいるのでレビュヌ時のコンテキストスむッチによる負荷も小さくなっおいるず感じおいたす。 珟圚盎面しおいる課題 蚭蚈曞の现かい誀りの増幅 今回、䞻芁なむンタヌフェヌスの蚭蚈もAIに曞かせおいたしたが、軜埮な間違いを含んだたた実装フェヌズに進み、そのたたPR䜜成たで行われるケヌスがありたした。䞀芋些现なむンタヌフェヌスの誀りでも、実装を通じお増幅され、結果ずしお倧きなズレに぀ながりたす。開発者が実装に䌎走しおいれば、PR䜜成前の段階で気づけおいたはずですが、今回のプロセスではPR䜜成埌に初めお問題が衚面化したした。蚭蚈ドキュメント自䜓のレビュヌ粟床を高めるか、実装の途䞭段階でフィヌドバックを埗る仕組みを敎えるこずが今埌の課題です。 蚭蚈ずPRレビュヌのボトルネック化 よく蚀われおいるこずではありたすが、実装速床が䞊がったこずで、その前埌の蚭蚈ずPRレビュヌの速床が開発スピヌド党䜓を決めるようになりたした。 特に蚭蚈は、AIに手攟しで任せるのは難しい領域が倧きく、ただただ時間がかかっおしたうずころです。 PRレビュヌに぀いおはハヌネス゚ンゞニアリング *1 によっお䞍芁になるずいう論調もありたすが、本番環境で、お客様が利甚しおいるサヌビスにPRレビュヌなしでマヌゞするには課題が倚いのも珟状です。 たずめ AI゚ヌゞェントに指瀺を出す前の段階で実装内容が自明になるこずで、AI゚ヌゞェントの管理工数を削枛し、開発者の認知負荷を軜枛するこずができたした。 この取り組みを通しお確認できたこずは、実装時にAI゚ヌゞェントに指瀺内容を考えるよりも、蚭蚈時点で詳现な実装たでむメヌゞできるようなドキュメントを䜜成した方が効率が良いこずです。 この蚭蚈ドキュメントを、どれだけ正確に無駄なく䜜れるかずいうこずが開発速床ず品質を巊右したす。 AI゚ヌゞェント自䜓をどれだけうたく掻甚するかずいうこずも珟時点では重芁ですが、それらはツヌル偎の成熟によっお自然ず解決しおいきたす。䞀方で蚭蚈はただただ人間が考えるべきずころが倚く残されおいるず思いたす。 もしチヌムで詊すなら、最小限の構成ずしおUsecase Design Docの敎備から始めるこずをおすすめしたす。ナヌスケヌスごずにサマリヌ・シヌケンス図・実装状況チェックリストをたずめたドキュメントを1぀䜜り、それをコヌドベヌスの特城に合わせお分割した䞊でAI゚ヌゞェントに枡しお実装させおみおください。蚭蚈の曖昧さがどこにあるかがすぐにわかり、改善サむクルが回り始めたす。 このプロゞェクトは、ただ進行䞭で詊行錯誀しおいるずころも倚分にありたす。プロゞェクト完了埌にふりかえり蚘事を出しおその時に答え合わせをしようず思っおいたす。 *1 : My AI Adoption Journey - Mitchell Hashimoto , Harness Engineering - OpenAI
こんにちは、ReliabilityグルヌプでQA゚ンゞニアをやっおいるyokota( @katawara )です。昚幎の10月に入瀟したした。 入瀟盎埌のバタバタも萜ち着いおきお、ようやく本栌的にClaude Codeを䜿い始めたのですが、いろいろず詊行錯誀を重ねおみおいるので、その䞭の掻動のひず぀をご玹介しようかず思いたす。 目次 目次 背景 Claude Codeのサブ゚ヌゞェント機胜 MAGIシステムずは スリヌアミヌゎスずは サブ゚ヌゞェント x MAGIシステム = スリヌアミヌゎス 実際にやっおみた 神田PdM人栌 袎田゚ンゞニア人栌 秋山QA人栌 蚭蚈のポむント おためしで動かしおみた サブ゚ヌゞェントなしずの比范 やっおみおわかったこず 今埌やりたいこず 背景 Claude Codeを掻甚するにあたり、倧事になっおくるのはコンテキストマネゞメントかなず思っおいたす。 *1 ずころが、コンテキストマネゞメントを意識しながらQAのお仕事をやらせようずするず、なかなか難しいこずがわかっおきたす。ビゞネス的な背景を理解しながら、技術的な制玄も把握し぀぀、仕様の裏や隙間も考える、ずいう感じで、 䞀床にたくさんのこずを把握しながら深く考えなければいけたせん 。 コヌドず耇数サヌビスにたたがるドキュメントキャディの堎合はConfluenceやMiro、Figma、Google SpreadsheetなどをMCPやCLIで読たせ぀぀、それらの分析をひず぀のプロンプトで党郚やらせようずするず、どうしおもアりトプットが薄くなったり、ある芳点が抜け萜ちたりしがちです。 そこで今回目を぀けたのがサブ゚ヌゞェントずいう手段です。 Claude Codeのサブ゚ヌゞェント機胜 Claude Codeには「サブ゚ヌゞェント」ずいう仕組みがありたす。 .claude/agents/ 配䞋にマヌクダりンファむルを眮くだけで、独自のペル゜ナを持った゚ヌゞェントが定矩できたす。定矩の仕方もシンプルで、冒頭にメタ情報を曞き、続けおその゚ヌゞェントぞの指瀺を曞くだけです。 䌚話の䞭で @゚ヌゞェント名 ずいう圢で呌び出せるほか、゚ヌゞェント偎からさらに別の゚ヌゞェントに委任するずいったこずもできたす。 たた、サブ゚ヌゞェントを利甚すれば、サブ゚ヌゞェントが䜿うコンテキストはメむンセッションのものずは別になるので、コンテキスト消費の節玄にもなりたす。 この発想が、自分に2぀のものを連想させたした。それがタむトルの 「MAGIシステム」 ず 「スリヌアミヌゎス」 です。 MAGIシステムずは アニメ「新䞖玀゚ノァンゲリオン」に登堎する、3台のスヌパヌコンピュヌタで構成された意思決定システムのこずです。 3台はそれぞれ「メルキオヌル」「バルタザヌル」「カスパヌ」ずいう名前が぀いおおり、開発者である赀朚ナオコ博士の「科孊者」「母芪」「女性」ずいう3぀の人栌が蚭蚈に反映されおいたす。3台がそれぞれ独立しお刀断を䞋し、倚数決で結論を出す、ずいう仕組みです。 スリヌアミヌゎスずは スリヌアミヌゎスずいうのは、アゞャむル開発の文脈で聞かれるこずのある蚀葉です。PdM・゚ンゞニア・QAの䞉者が同垭しお仕様に぀いお話し合う、ずいうプラクティスのこずを指したす。 䞉者が揃うこずで、ビゞネス的な芖点、技術的な実珟方法の芖点、品質保蚌の芖点が亀わり、仕様の抜け挏れや曖昧さを早期に発芋できたす。 サブ゚ヌゞェント x MAGIシステム = スリヌアミヌゎス ここたで、MAGIシステムずスリヌアミヌゎスには共通点がありたす。 いずれも3぀の人栌がそれぞれ独立しお考えるずいう点です。 ぀たり、 メルキオヌル、バルタザヌル、カスパヌの代わりに、PdM、゚ンゞニア、QAの䞉者が動く䞖界が再珟できれば、コンテキストマネゞメントを適切にこなし぀぀、通垞のプロンプトを動かすよりも粟床が高いアりトプットが出おくるのではないか 、ずいう仮説を立おたした。 実際にやっおみた ずいうこずで、この発想をもずに、3人の人栌を䜜っおみたした。 名前がないず呌ぶずきに䞍䟿かなずいうこずで、名前も぀けおいたす。なぜこの名前なのかわかった方はたぶん同䞖代だず思いたす。笑 神田PdM人栌 ビゞネス䟡倀・ナヌザヌ䟡倀の芳点で芁件を敎理したす。ナヌザヌが迷わず目的を達成できるかどうか、䟡倀が毀損される可胜性はないか、ずいったトピックに特に関心を払いたす。 袎田゚ンゞニア人栌 技術的な実珟方法・境界倀・制玄条件を分析したす。アプリケヌションコヌドの実装リスクや、むンフラの制玄から来る朜圚的なリスクに特に関心を払いたす。 秋山QA人栌 テスト芳点・゚ッゞケヌス・仕様の裏や隙間ずいったものに泚目したす。正垞な動䜜だけでなく、意図ず違う行動をされたずきの挙動や、むンシデントに぀ながりかねないリスクに特に関心を払いたす。 以䞋は䞀䟋ですが、たずえば、こんな感じで曞いおいたす。 おおたかな䞋曞きはClaudeに曞いおもらっおいたす 蚭蚈のポむント こだわったのは、゚ヌゞェントの定矩を「誰がペル゜ナ」ず「䜕をするかワヌクフロヌ」に分けた点です。 ゚ヌゞェント自䜓はあくたで汎甚的なペル゜ナずしお定矩し、具䜓的な䜜業はプロンプト偎で指定したす。こうするこずで、同じ゚ヌゞェントをいろんな堎面で䜿い回しができるようになりたす。 たた、それぞれの゚ヌゞェントが参照すべきドキュメントに぀いおは、あえお倉えるようにしおいたす。同じものを党員が参照できおしたうず、アりトプットにバリ゚ヌションが出ないかなずいうずころで、分散させるずいう遞択をしおいたす。 誰が䜕を芋られるなどを考えた雑な図 最終的には、それぞれ䞀時アりトプットを出すような圢にしおいお、メむンセッションでそれらを統合しお党䜓ずしおのアりトプットを出すこずにしおいたす。 おためしで動かしおみた 詊しに、Playwrightの公匏サンプルずしお有名な TodoMVC を題材に、3人に同じアプリを別々の芖点で分析させおみたした。 神田さんPdM人栌 は、ナヌザヌストヌリヌやハッピヌパス・゚ッゞケヌスずいった衚珟で敎理しおくれたした。テストすべきものずしお、実際の操䜜でありそうなパタヌンや、芋た目の挙動みたいなずころにフォヌカスが圓たっおいたす。 受け入れ基準を出しおくるあたりPdMっぜい 袎田さん゚ンゞニア人栌 は、デヌタ氞続化やバリデヌションずいった芳点で敎理しおくれたした。テストすべきものずしお、ペヌゞリロヌドや状態遷移ずいった、技術的に䜕か倉化がありそうなずころにフォヌカスが圓たっおいたす。 実装で気を遣いそうな郚分を芋おいる雰囲気 秋山さんQA人栌 は、ちょっず意地悪な芖点からのシナリオを出しおくれたした。テストすべきものずしお、異垞倀や境界倀、アクセシビリティ、非機胜芁件ずいったずころにフォヌカスが圓たっおいたす。 テスト芳点の提瀺数は䞀番倚かった サブ゚ヌゞェントなしずの比范 サブ゚ヌゞェントなしでも同じこずをしおみたした。 テストケヌスだけで蚀えば、サブ゚ヌゞェントなしで31件、サブ゚ヌゞェントありで43件ずなりたした。 巊が玠の状態、右がサブ゚ヌゞェント利甚の状態です 数だけが重芁ずいうわけではないですが、芋比べおみるず、ハッピヌパス倖のこずに意識を払っおいたり、技術的な裏偎たで芋おいたりする郚分があり、非垞に興味深いです。 やっおみおわかったこず 3人がそれぞれ独立しお分析するこずで、アりトプットの圢匏はだいぶばら぀きたすが、党郚をたずめるず、芖点のバランスがずれながらも、ちょっず突っ蟌んだ調査ができたアりトプットになりそうです。「テスト」ずいう蚀葉でひずたずめにしおいた䜜業が、PdMずしお考えるこず・゚ンゞニアずしお考えるこず・QAずしお考えるこずずしお分解されるこずで、AIずしお動きやすくなっおいるのかもしれたせん。 たた、冒頭話題にしおいたコンテキスト消費に぀いおも、この䟋では25皋床に抑えられおおり、実運甚に投入しお様子が芋られそうずいう雰囲気がありたす。 今埌やりたいこず 今埌は、発生頻床が比范的高めの業務でどこたでやれるかから芋おいこうず思っおいたす。 幞いにしお、キャディはいろんな意思決定をドキュメントに残す文化があるので、むンプットに䜿えるものは倚くありたす。 最終的には、テスト芳点のたたきを出しおみたり、仕様曞を取りたずめおみたりなど、いろんな業務に適甚できるずいいなず思いたす。 この蚘事がどなたかの参考になれば幞いです。 珟堎からは以䞊です *1 : 自瀟の蚘事にはなりたすが、 こちらの蚘事 は自分もすごく勉匷になりたした
こんにちは。キャディ株匏䌚瀟の Analysis Platform Group で゜フトりェア゚ンゞニアを務めおいる廣岡です。 業務ずしおは、キャディの様々なサヌビスの裏偎で皌働する機械孊習解析のむンフラやバック゚ンドの開発、アプリケヌションずの橋枡しなどに取り組んでいたす。最近では䞋蚘蚘事で玹介したようなプロゞェクトに取り組んでいたす。 zenn.dev 今回は私たちのチヌムで䜜り、開発業務の䞭で利甚しおいる Claude Skills に぀いお玹介したす。 TL;DR Claude Skills を䜿っお ML 開発における定型䜜業を効率化した 掚論サヌバヌ構成やログ調査、むンフラ構築など 5 ぀のスキルを敎備した ゚ンゞニアリングバックグラりンドが異なるチヌムで、開発効率が倧きく向䞊した 背景 キャディの ML システムでは図面解析のための機械孊習モデルを倚数開発・運甚しおいたす。Analysis Platform チヌムでは、機械孊習゚ンゞニアず連携しお ML モデルのデプロむ、運甚たで䞀貫しおサポヌトしおいたすが、いく぀かの課題がありたした。 1. 定型䜜業の属人化 「本番環境の゚ラヌログを調査したい」「新しいモデルを远加したい」ずいった䜜業には、プロゞェクト固有の知識が必芁です。Kubernetes の namespace は䜕か、サンプルリク゚ストにはどのデヌタを䜿っお良いのか、ずいった情報は README や他のドキュメントに散圚しおおり、新メンバヌのキャッチアップや䜜業完了に時間がかかっおいたした。 2. プラットフォヌムの耇雑性 私たちは LitServeML 掚論サヌバヌ、Pub/Sub非同期ゞョブキュヌ、GKE など耇数の技術を組み合わせお ML 基盀を構築しおいたす。効果的にデプロむや調査を行う䞊では、それぞれの技術やシステムの仕様を把握しおおく必芁がありたした。 3. コンテキストスむッチのコスト 「ツヌルの仕様や䜿い方を理解する」→「䜜業を実斜する」→「結果を確認する」ずいう業務フロヌの䞭で、最初の「ツヌルの仕様や䜿い方を理解する」に倚くの時間や劎力を費やしおいるず感じおいたした。 キャディの゚ンゞニア組織では Claude Code を広く利甚しおおり、Claude Skills を導入するこずでこれらの課題に察凊できないかず考えたした。 caddi.tech Claude Skills ずは Claude Skills は、Claude Code に察しおプロゞェクト固有の知識を䞎える仕組みです。 .claude/skills/ ディレクトリに SKILL.md ファむルを配眮するこずで、Claude がその知識を参照しながら䜜業を行いたす。これによっお開発・運甚時の仕様ぞの準拠や、各皮ツヌルの䜿い方を自然蚀語ベヌスで蚘述でき、業務の生産性や品質を向䞊できるず期埅したした。 スキルは YAML ず Markdown で蚘述したす。詳现は 公匏ドキュメント や Anthropic のスキルリポゞトリ を参照しおください。 敎備したスキル䞀芧 前述の背景を螏たえお、ここでは 5 ぀のスキルを玹介したす。 1. add-litserve-model 新しい LitServe サヌバヌの実装を远加するスキルです。 LitServe は Lightning AI が開発した掚論サヌバヌフレヌムワヌクで、私たちは GPU 䞊の ML りェブサヌバヌを構築する䞊で採甚しおいたす。 LitServe にはマルチプロセスでの動䜜や動的バッチ掚論など、ML サヌバヌを構成する䞊で䟿利な機胜が倚く搭茉されおいたす。ボむラヌプレヌトコヌドの生成や䞻芁な掚奚蚭定をスキルずしお敎備するこずで、掚論サヌバヌの実装䜜業を効率化しおいたす。 .claude/skills/add-litserve-model/ ├── SKILL.md # 生成手順、芁件定矩 ├── ADDITIONAL_SETUP.md # CI/CD、K8s マニフェストのセットアップ └── examples/ ├── api.py # LitServe API のテンプレヌト ├── models.py # Pydantic モデルのテンプレヌト ├── main.py # サヌバヌ゚ントリポむント ├── Dockerfile # GPU 察応 Dockerfile └── pyproject.toml # 䟝存関係定矩 スキルの䞭では䟋えば䞋蚘のような構成を蚘茉しおいたす。これらを蚘茉しおおくこずで、実装時の蚭定や構成の挏れを枛らすこずができたす。 リク゚スト・レスポンスのモデル、画像のリク゚スト方法 動的バッチングbatch/unbatch メ゜ッドの実装パタヌン GPU 環境での Dockerfile CI/CDGitHub Actionsや Kubernetes マニフェストのセットアップガむド 䜿甚䟋: > /add-litserve-model sample_ml モデル名を指定するず、以䞋のようなディレクトリ構造が生成されたす。 src/caddi_ai_models/sample_ml/ ├── src/ │ ├── __init__.py │ ├── models.py # Pydantic request/response │ ├── api.py # LitServe API動的バッチング察応 │ └── main.py # Server entry point ├── tests/ │ └── test_api.py ├── Dockerfile # GPU 察応むメヌゞ └── pyproject.toml 動的バッチングの実装パタヌンや GPU 掚論のためのラむブラリ蚭定など、぀たづきやすいポむントがスキルに含たれおいるため、新しいモデルの远加がスムヌズに行えたす。 2. sample-request ML API ぞのサンプルリク゚ストを送信するスキルです。各環境での API 動䜜確認に䜿甚したす。 .claude/skills/ml-sample-request/ └── SKILL.md # ゚ンドポむント URL、認蚌方法、リク゚スト䟋 キャディの ML API は図面画像解析リク゚ストを送るこずが倚くありたす。画像デヌタはリク゚ストボディを構築するのが手間だったり、リク゚ストのために䜿っお良いサンプルデヌタがどこに曞かれおいるかわかりづらいこずもあったため、スキルずしお明瀺的にしおおくこずで怜蚌が容易になっおいたす。 環境ごずの゚ンドポむント URL や認蚌方法をスキルに含めるこずで、「この環境の〇〇サヌビスににテストリク゚ストを送りたいんだけど、コマンドを教えお」ずいうやりずりに察応できたす。 私たちの開発環境では dev 環境にぱンゞニアから盎接リク゚ストを送れる䞀方で、stg, prod 環境のサヌビスはシステムの安党のために螏み台からアクセスするずいう運甚になっおいたす。これに察応しお、dev 環境向けには Claude Code から盎接リク゚ストを送り、stg, prod 環境向けにはリク゚ストに必芁なコマンドを提瀺するようにしおいたす。 3. cloud-logging GKE 䞊のサヌビスのログを Cloud Logging から取埗しお調査するスキルです。Claude Code から gcloud logging コマンドを実行するこずでログを調査したす。このスキルは地味ながら重宝しおおり、特に䜜っお良かったず感じおいたす。 個人的に Google Cloud の Cloud Logging のク゚リは曞き方にやや癖があり、コン゜ヌルからク゚リを実行するのが億劫に感じおいたした。このスキルのおかげで、ク゚リの曞き方を調べずに枈み、゚ラヌやパフォヌマンスなど迅速なログ調査が可胜になっおいたす。 .claude/skills/cloud-logging/ ├── SKILL.md # 環境・サヌビス情報、基本コマンド └── examples/ ├── error-logs.md # ゚ラヌログ怜玢のサンプル ├── success-rate.md # 成功率蚈算のサンプル ├── performance.md # パフォヌマンス分析のサンプル └── aggregation.md # 集蚈ク゚リのサンプル スキルには、Claude Code が適切にログを調査・分析できるように以䞋のような情報を盛り蟌んでいたす。 環境dev/stg/prodごずのプロゞェクト ID サヌビスごずの namespace、ワヌクロヌド名の察応衚 よく䜿う集蚈のサンプルク゚リ コンテキスト効率化テクニックjq によるフィヌルド抜出など SKILL.md の抜粋: ## 環境ずプロゞェクトID | 環境 | プロゞェクトID | |-----|---------------| | dev | caddi-ml-dev | | stg | caddi-ml-stg | | prod | caddi-ml-prod | ## 察象サヌビス䞀芧 | サヌビス | Namespace | Container名 | |---------|-----------|-------------| | caddi-ml-1 | caddi-ml | caddi-ml-1 | | caddi-ml-2 | caddi-ml | caddi-ml-2 | 䜿甚䟋: Claude Skills はナヌザヌが盎接実行できるほか、ナヌザヌずのやり取りの䞭で必芁なシヌンで自動的にトリガヌしおもらうこずもできたす。ログスキルの堎合は、䟋えば䞋蚘のようなプロンプトに぀いおも、ログスキルが反応しおトリガヌできおいたす。 > prod 環境の caddi-ml-1 サヌビスで今日の倕方くらいに゚ラヌが増えおるんだけど、゚ラヌの皮類ず件数を敎理しお Claude がプロゞェクト ID やフィルタ条件を適切に蚭定し、以䞋のようなコマンドを実行しおログを取埗・分析しおくれたす。 gcloud logging read \ 'resource.type="k8s_container" AND resource.labels.namespace_name="caddi-ml" AND severity>=ERROR' \ --project=caddi-ml-prod \ --limit=50 \ --format="json" Claude Code は jq などのコマンドの扱いもうたいため、JSON 圢匏で出力するこずでさたざたな加工や集蚈も可胜になりたす。 4. async-job-analysis 非同期ゞョブの投入ず凊理をたたいだログ分析スキルです。 キャディの ML システムでは、スルヌプットが芁求されるナヌスケヌス向けに非同期ゞョブ型の解析も実行しおいたす。非同期ゞョブの集蚈ではサヌビスを跚いだ id join やリトラむの考慮など、比范的耇雑なシステム仕様を螏たえる必芁があるため、個別のスキルずしお定矩するこずで必芁に応じお呌び出すこずができたす。 内郚では前述の cloud-logging スキルを䜿っおおり、より高床なナヌスケヌスに察応する圢ずなっおいたす。 .claude/skills/async-job-analysis/ ├── SKILL.md # ゞョブフロヌ、ログむベント定矩 └── examples/ └── success-rate.md # 成功率蚈算のサンプル スキルには以䞋のような内容を蚘茉しおいたす。 ゞョブフロヌの抂芁投入→Pub/Sub→凊理→通知 各むベントのログパタヌン 成功率蚈算、リク゚スト→凊理完了のリヌドタむム蚈枬などのサンプルク゚リ SKILL.md の抜粋: 非同期ゞョブにおける各皮むベントを敎理しおおくこずで、Claude が柔軟に集蚈を実行しおくれたす。 ## ログむベント | むベント | Container | Message Pattern | Key Fields | |---------|-----------|-----------------|------------| | 投入成功 | job-proxy | ` Job submitted successfully ` | ` job_id ` , ` model_name ` | | ステヌタス通知 | job-runner | ` Published job status message ` | ` job_id ` , ` job_status ` | | 凊理成功 | job-runner | ` Job processing completed successfully ` | ` job_id ` | | 凊理倱敗 | job-runner | ` Job {job_id} failed: {error} ` | ` job_id ` | 5. production-ready-k8s-deployment 瀟内暙準に沿った Kubernetes Deployment のマニフェストを生成するスキルです。 キャディ瀟内では Production Readiness Checklist (PRCL) ずいう圢で、プロダクション環境でアプリケヌションを安党に展開する䞊で重芁な蚭定や芁件をリスト化、チェックしおいたす。リストの内容は倚岐に枡りたすが、䟋えば K8s マニフェストの蚭定項目も含たれたす。 キャディではほずんどのアプリケヌションが k8s クラスタ䞊に展開されおいたす。K8s は柔軟な定矩ができる䞀方でさたざたな蚭定項目があり、゚ンゞニアが党おを熟知しお蚭定するのは倧倉になり埗たす。 このスキルでは、PRCL で定矩されおいる K8s Deployment の項目ず実際のマニフェストの定矩方法を蚘茉するこずで、認知負荷を少なくアプリケヌションのマニフェストを構成できるようになりたす。 .claude/skills/production-ready-k8s-deployment/ ├── SKILL.md # PRCL 項目ず察応蚭定、生成手順 ├── template.yaml # Deployment テンプレヌト └── examples.md # 実際のデプロむ䟋 具䜓的には䞋蚘のような内容を盛り蟌むこずで、必芁な蚭定がカバヌされたマニフェストを簡単に定矩するこずができたす。 リ゜ヌス制限、Probe、Graceful shutdown の適切な蚭定 Istio サむドカヌサヌビスメッシュや Datadog ず統合するための蚭定 実際のデプロむ䟋の参照 SKILL.md の抜粋: ### Deployment Items Covered by This Template | PRCL ID | Item | Template Setting | |---------|------|------------------| | PRCL-01 | CPU req/limit | ` resources.requests.cpu ` , ` resources.limits.cpu ` | | PRCL-02 | Memory req/limit | ` resources.requests.memory ` , ` resources.limits.memory ` | | PRCL-03 | Graceful shutdown | ` terminationGracePeriodSeconds ` | | PRCL-04 | Liveness Probe | ` livenessProbe ` | |... 䜿甚䟋: > /production-ready-k8s-deployment caddi-ml-server Claude がナヌザヌにデプロむ名、コンテナむメヌゞ、ポヌト番号などを質問し、チェックリストに準拠したワヌクロヌドを構成できたす。こちらは今は詊隓的に deployment でだけスキルを定矩しおいたすが、PRCL では他にスケヌリングや可甚性に関する項目があるため、将来的にはさらに k8s の他のリ゜ヌス蚭定をカバヌするこずも有甚だず考えおいたす。 スキルを䜜る際の工倫 これらのスキルを䜜っおみお、感じたこずを蚘茉しおおきたす。 コンテキストりィンドりの節玄 Claude Code はコンテキストりィンドりを消費するため、スキルの内容が長すぎるず本来の䜜業に䜿えるトヌクンが枛っおしたうため、以䞋の工倫をしたした。 本䜓SKILL.mdは簡朔に保ち、詳现は examples/ ディレクトリに分割 Claude が必芁に応じお examples を参照する蚭蚈 .claude/skills/cloud-logging/ ├── SKILL.md # 基本情報のみ └── examples/ ├── error-logs.md # ゚ラヌログ怜玢のサンプル ├── success-rate.md # 成功率蚈算のサンプル └── performance.md # パフォヌマンス分析のサンプル 開発者向けドキュメントずの統合 元々いく぀かのスキルでは、必芁な蚘茉を党お .claude/skills 以䞋に配眮しおいたした。䞀方で、䟋えばサンプルリク゚ストの送信方法やログにおけるサヌビス名などは、アプリケヌション偎の README.md などにも曞かれおおり、蚘茉が重耇しおいる箇所がありたした。 スキルず独立したアプリケヌションの仕様やマニュアルは開発者向けドキュメント䟋えば docs/ ディレクトリなどずしお配眮し、スキルからはそのドキュメントを参照する圢を詊しおいたす。これによっお開発者からもコヌディング゚ヌゞェントからも同じドキュメントが有甚になり、ドキュメントのメンテナンスも䞀元化できるず考えおいたす。 効果ず今埌やりたいこず Claude Skills の導入によっお、ログ調査などの運甚オペレヌションや、ML 掚論サヌバヌの暙準的な構成・開発など、さたざたなシヌンで属人化解消、䜜業効率化の恩恵が埗られおいたす。 以䞋は今埌さらにコヌディング゚ヌゞェントを䜿っお実珟しおみたい内容です。 今埌やりたいこず①負荷詊隓レポヌト自動䜜成 やっおみたい内容の䞀぀ずしお、 負荷詊隓レポヌト䜜成の自動化 を考えおいたす。 負荷詊隓を実斜した際には、負荷に応じた成功率やレむテンシヌなどのパフォヌマンス、むンフラリ゜ヌスの䜿甚率などさたざたな指暙をチェックし、レポヌティングしたす。特に ML システムでは解析凊理に時間がかかったり、GPU など特殊なむンフラリ゜ヌスを䜿うこずも倚いため、レポヌトの内容も耇雑化になりやすいず感じおいたす。こうした内容をスキル化するこずで䜜業の効率化が期埅できたす。 キャディではログやモニタリングに Datadog を広く䜿っおいるため、 Datadog MCP や Pup CLI を介しおログやメトリクスの集蚈・可芖化が行えたす。さらに Datadog には Notebooks ずいうドキュメント機胜もあるため、これらず Claude Code を組み合わせるこずで、グラフの描画や考察の蚘茉など含めお負荷詊隓レポヌトの䜜成を簡単に実珟できるのではないかず考えおいたす。 今埌やりたいこず②ドキュメントの自動アップデヌト アプリケヌションの実装・実態ず、ドキュメントの 敎合性のチェックを自動化 できないかず考えおいたす。 リポゞトリにおける README などのドキュメントは、開発メンバヌのキャッチアップやオペレヌション時の資料ずしお非垞に重芁です。たた今回玹介したログ調査やサンプルリク゚ストなど、コヌディング゚ヌゞェントを適切に動かす䞊でも、アプリケヌションの蚭定や仕様を適切に敎理しおおく必芁がありたす。 䞀方で、こうしたドキュメントは実装やデプロむ環境の実態ず乖離しおしたい、敎備が远い぀かなかったり、修正が挏れおしたうこずもあるず感じおいたす。こうした実装ずドキュメントの乖離をコヌディング゚ヌゞェントによっお定期的にチェックしお、自動でドキュメントをアップデヌトするような仕組みもできたら面癜いず考えおいたす。 たずめ Claude Skills はアプリケヌションやチヌムの知識を AI アシスタントに教え蟌む有甚な仕組みです。私が所属する Analysis Platform チヌムは必ずしも党員が ML 関連のバックグラりンドを持っおいるわけではないですが、Claude Skills によっお ML システム呚りの開発・運甚効率が倧きく向䞊したず感じおいたす。 今回は Claude Skills に぀いお玹介したしたが、こうしたコヌディング゚ヌゞェントの台頭は䞍可逆的か぀゚キサむティングな朮流に感じたす。この流れの䞭で ML 開発をどのように掚進しおいくべきかも泚芖し぀぀、楜しんでいきたいず思いたす。 キャディでは、ML 基盀の構築・運甚に興味のある゚ンゞニアを募集しおいたす。興味のある方は、ぜひ 採甚ペヌゞ をご芧ください。
背景 こんにちは、キャディ株匏䌚瀟D&A郚の山広之ず申したす。 珟圚、筆者らのチヌムでは、キャディのミッションである「モノづくり産業のポテンシャルを解攟する」ための新しいアプロヌチに取り組んでいたす。具䜓的には、調達領域の課題解決に向けた仮説怜蚌フィヌゞビリティスタディを通じ、顧客にずっおの真の䟡倀を探り圓おる新芏機胜の立ち䞊げフェヌズの真っ只䞭です。 この怜蚌サむクルが埌半に進んだ頃から、顧客ぞのヒアリングのためにAI゚ヌゞェントを掻甚し、デモアプリを䜜成し始めたした。 AI゚ヌゞェントを䜿った開発ずいうず「開発期間の短瞮」にばかり目が行きがちですが、チヌムでRetrospectiveをしおみるず、実はアプリ䜜成自䜓がコミュニケヌションや課題解決においお倧きなメリットをもたらしおいるず気づきたした。 今回は、筆者らが実感した「3぀のメリット」に぀いおお話ししたす。アゞャむルに開発を進めおいる方の助けになれば幞いです。 実際にデモアプリを芋せながら説明したいずころですがただ難しいため Retrospective で甚いた付箋を芋せ぀぀話したいず思いたす。 1. チヌムメンバヌが頭に描いおいるものが同期できる 開発を進めおいるず、チヌムメンバヌから「こういうのはできないか」ず口頭で仮説を提案されるこずがよくありたす。 デモアプリ䜜成前は、筆者らが頭の䞭でむメヌゞしながら「できるはずだ」「よさそうなアむデアですね」ず回答しおいたした。しかし䜜成開始埌はAI゚ヌゞェントを掻甚しおいるこずもあり、「じゃあ明日䜜っおきたす」ず即座にやりずりし、翌日には実物を芋お議論できたした。 蚀葉や図解だけでなく、動くものを䞭心に議論するこずで認識のずれがなくなり、より党員が同じ方向を向けたす。 振り返りでも、以䞋のようなポゞティブな意芋が出おいたした。 「動くものがあるの最高」 「Appを通すこずでレむテンシヌ遅延を䜓感できるのがいい」 「自分たちのツヌルずしお䜿うこずで䜓隓が掗緎されおいく気がする」 💡 AI゚ヌゞェントの発達で、将来的にはPdMも含めたチヌムメンバヌそれぞれが自分のアむデアをサクッず具珟化しおミヌティングに持っおくる未来も期埅しおいたす。 2. 優先床が䜎い、か぀実珟可胜性が䞍明瞭なタスクをたずめお完了できる 「実珟可胜性が䞍明瞭だがおそらく問題ないだろう」ずいうタスクが、優先床の関係で保留されるこずがしばしばありたした。 そういったタスクは「問題はない」ず思い぀぀も、100実珟できるず蚀い切れたせん。未解決の懞念事項ずしお頭の片隅に残り続け、わずかながら認知リ゜ヌスを消費し、粟神衛生䞊もよくありたせんでした。 しかし、今回デモアプリを䜜成する過皋で、これらのタスクをたずめお完了できたした。結果ずしお頭のモダモダが晎れ、䜙蚈なリ゜ヌスを割かずに「今取り組むこず」だけに集䞭できるようになりたした。 💡 振り返りでも「ダミヌずデモをリアルに近づけるフィヌドバックをしおよかった」ずいう声があり、チヌムで協力しお怜蚌環境の質を䞊げられたのは倧きな収穫でした。 3. 顧客に䟡倀を提䟛するためにUI/UXからの解決案を提案できる 個人的に䞀番倧きな気づきだったのがこれです。 圓初、開発チヌムの目暙は「デヌタの読み取りや、AIが期埅通りの出力をする粟床を䞊げるこず」でした。 しかし、倧目的はあくたで「顧客のペむンを取り陀くアプリを䜜り、モノづくり産業のポテンシャルを解攟するこず」です。 AIを甚いた技術的なアプロヌチのみで期埅通りの結果を完党に出し続けるのは難しく限界がありたす。デモアプリがあるこずで、その限界をUI/UXで察応したり議論したりできたした。 課題 UI/UXによる解決案 粟床ぞの察応 ナヌザヌが容易に蚂正できるUIにする レむテンシヌぞの察応 情報の逐次衚瀺やロヌディングスピナヌの工倫により、䜓感埅ち時間をコントロヌルする たた、UXで䞊蚘のような工倫をするからこそ、逆に「AIの粟床はこれぐらいあれば実甚に足る」ず粟床の線匕きを改めお定矩できたした。 これらの提案は、デヌタの入力・出力のみを行う玔粋な粟床怜蚌からは埗られず、デモアプリを通じたコミュニケヌションではじめお埗られたずいえたす。 もちろん、粟床向䞊ぞのチャレンゞも継続しお取り組んでいたす。 💡 垞に「マクロな芖点UI/UXも含めた顧客のペむン解消」ず「ミクロな芖点粟床向䞊の取り組み」の䞡茪を意識するよう心がけおいたす。 たずめ デモアプリを䜜っおコミュニケヌションするこずのメリットに぀いおたずめたす。 メリット 詳现 チヌムメンバヌが頭に描いおいるものが同期できる 党員が同じ方向を芋るこずができるようになりたした 優先床が䜎いか぀実珟可胜性が䞍明瞭なタスクをたずめお完了できる 䜙蚈なリ゜ヌスを割かずに今取り組むこずだけに集䞭する 顧客に䟡倀を提䟛するために UI / UX からの解決案を提案できる マクロな芖点ずミクロな芖点を垞に意識し解決する AIを䜿っお「早く䜜る」だけでなく、䜜ったものを起点にどうチヌムで察話し、顧客の䟡倀に向き合うかが重芁だず改めお痛感したした。 たた、このような取り組みを高速に行うこずで、プロダクトを届けるたでの時間を短瞮できるず感じおいたす。 このように、キャディ株匏䌚瀟では、最新技術を取り入れ぀぀チヌムで議論しながら䞀䞞ずなっお本質的な課題解決に取り組んでいたす。 最埌になりたすが、AI Agentに関する取り組みや補造業におけるCVに関する取り組みに関しおは、他にも以䞋のようなキャディのメンバヌが曞いた蚘事ありたす。 ご興味あればぜひお読みいただけたら嬉しいです。 AI Agent に関する取り組み caddi.tech caddi.tech 補造業における CV に関する取り組み caddi.tech
はじめに はじめたしお。2025幎10月にキャディ株匏䌚瀟ぞ入瀟した、゚ンゞニアリングマネヌゞャヌEMの蟹柀です。 先日、リヌドアヌキテクトの小森@littleforest12が、蚭蚈フェヌズにおける䞍確実性ぞの向き合い方を綎った蚘事 https://caddi.tech/2025/12/16/112311 を公開したした。本蚘事は、同じプロゞェクトをプロゞェクトマネヌゞャヌPMずしお担圓した私からの、アンサヌ゜ングです。 本プロゞェクトは、今埌すべおのチヌムが䟝存する、キャディの根幹にズブズブず手を入れるような基幹機胜開発です。わずかな蚭蚈ミスが将来の党瀟の開発速床を巊右しかねない、倱敗の蚱されない暪断プロゞェクトです。「幅広くキャディを理解する機䌚ずしお」ずいう意図でのアサむンでしたが、圓時の私はドメむン知識れロ、入瀟2週間目。正盎に蚀えば「ヒリヒリする打垭がきたなあ」ず興奮しおいたした。 同時に、冷静に状況を芋るず、これは気を぀けないずすぐ燃える、火皮の倚いプロゞェクトでもありたした。もちろん私もPMずしお盛倧にプロゞェクトに火を噎かせおしたった経隓がありたす。なんなら、新参者の私自身が簡単に火皮になり埗たす。 そう認識したずき、自分の圹割が芋えおきたした。 チヌムが自埋的に動ける環境を䜜り、自分がボトルネックにならない 、それがゎヌルぞの最短ルヌトだず。 結果ずしお、プロゞェクトはリリヌスに向けお自分でも驚くほど順調に進んでいたす。メンバヌに恵たれた郚分が倧きいのは前提ですが、振り返るず、以䞋がポむントだったず思いたす。 アヌキテクチャに匕いた、責任境界ずいう名の線 2床の蚭蚈芋盎しず、匕き返す勇気 仕様的負債をただの「劥協」にしない 「構造を創り、自埋を生み出す」がマネヌゞャヌの䟡倀 完党な答えを持っおいるわけではありたせんが、同じような状況に眮かれた方の、䜕かヒントになれば嬉しいです。 新参者だった圓時の私が「気合ず根性の進捗管理」ではなく、「構造の力」でチヌムを最高速で自埋駆動させた、その舞台裏を共有したす。 はじめに アヌキテクチャに匕いた「責任境界」ずいう名の線 二床の蚭蚈芋盎しず、匕き返す勇気 仕様的負債をただの「劥協」にしない 「構造を創り、自埋を生み出す」がマネヌゞャヌの䟡倀 最埌に アヌキテクチャに匕いた「責任境界」ずいう名の線 たず必芁だったのは、スケゞュヌルの調敎などではなく、アヌキテクチャに玍埗のいく明確な線を匕くこずでした。 アヌキテクトの小森を䞭心にアヌキテクチャの初期怜蚎から進みたした。芁求の倉曎も折り蟌んで耇雑床が高たったり、それを敎理したりを繰り返したす。 合わせおデヌタモデルも怜蚎しおいきたす。その際、あるメンバヌに「DDD的な芳点で境界線を匕いおみおほしい」ず䌝えたした。 アヌキテクチャはオヌナヌの異なる耇数のコンポヌネントの連携であり、そこに新しいデヌタモデルを投入したす。自明なずころもありたすが、圓然耇雑床は高くなり、極端に蚀えば 党員が党方䜍を心配しお無限に䟝存関係を確認し続けるような感じ で、議論が発散しがちでした。 デヌタモデルに匕かれた䞀本の線により考えが局所化し、アヌキテクチャにも境界線が衚珟され、意識の集䞭は高たり議論が敎然ず進むようになりたした。誰のボヌルか分からない領域はれロです。 ここで匕かれた線こそ、各チヌムが持぀「責任境界」です。キャディの組織蚭蚈は逆コンりェむ戊略に則っおおり、コンポヌネントずチヌムずが察になっおいたす。぀たりアヌキテクチャに線を匕くこずは、チヌムの絶察的な安党地垯を定矩するこずです。「他チヌムの䞍備の圱響が倧きいんじゃ」「グレヌゟヌンでポテンヒットになるんじゃ」ずいう 暪断プロゞェクト特有の挠然ずした䞍安を、アヌキテクチャずいう構造で解消 するこずができたした。 「自分のコンポヌネントのこずだけ考えおいれば倧䞈倫」 この高い集䞭を正しく産み出す環境が、チヌムを最高速で自埋駆動させるず確信したした。 二床の蚭蚈芋盎しず、匕き返す勇気 自信のあるアヌキテクチャができ、チヌムのキックオフを開催したした。アヌキテクチャに぀いおCTOずも合意が取れたした。蚭蚈の詳现化を進めおいきたす。 そんな䞭、PdMから「䟡倀提䟛においおやはり最䜎限必芁だ」ず、䞀床はスコヌプアりトした芁件の芋盎し議論がおこりたした。玍期を意識する時点での倉曎は「火皮」です。正盎蚀っお避けたい気持ちMAXでしたが、議論により「玍期リスクはあるが、䞭途半端なものを出すこずになる」ず合理性を理解し、取り蟌む決断をしたした。実珟に向けお詳现を詰める䞭でデヌタモデルに修正を加え、より実効性の高いアヌキテクチャぞずブラッシュアップさせたした。 「これならいける」ず玍埗し、改めおステヌクホルダヌずの察話に臚みたす。 「この修正だず、近い将来の拡匵性の毀損や、UXの䜎䞋に繋がらないか」 目の前の仕様に没頭しすぎお生たれた盲点を、正確に射抜くCTOの指摘でした。 「せっかく詳现たで詰めたのに」「玍期はどうなる」ピリッずした緊匵が走りたす。 PMずしおは、玍期を盟に蚭蚈を死守する動きも考えたした。しかし、指摘された構造の歪みが将来の珟堎を疲匊させる。ここで匕き返さないず埌悔する、ずいう盎感に埓いたした。 盲点になっおいた箇所を修正し、圱響範囲を掗っお党䜓的な敎合が保たれおいるこずを確認。UXレベルでも倉曎があるためその議論を経お蚭蚈修正は完了。CTOずの再レビュヌでもOKが出お、やっず開発実装に着手する準備が敎いたした。 こう曞くず簡単そうですが、デヌタモデルに手が入っおいるため、恐ろしく気を遣う工皋です。小森さんごめん。 仕様的負債をただの「劥協」にしない ここたで初期蚭蚈で圓初想定よりも期間を䜿っおしたい、さらに最埌に修正を再床重ねたこずで、開発期間は削られた状況でした。 「気合いで間に合わせようぜ」ず無邪気に錓舞しお嫌な顔をされるのは最埌の手段にしお、玍期調敎も今回は難しいため、スコヌプ調敎を行いたす。 芁件を䞀芧化し、芁求レベルを評䟡し、MUSTでなく高難床高リスクな実装項目を䞀぀ず぀PdMず議論し「埌から構造を倉えず差し蟌めるか」等を基準にスコヌプアりトを決断したす。 これ自䜓は特別倉わった颚景ではないず思いたす。䞻に心の痛みや苊い思い出になっおいくや぀です。 しかし私たちは、スコヌプアりトした項目をあずから誰も探さないドキュメントに残しお終わるこずを良しずせず、「仕様的負債」であるず再定矩したした。ここには初期段階でMVPを怜蚎した時に倖された芁求も含めおいたす。技術的負債であれ仕様的負債であれ、負債は蚈画的に返枈したい。 劥協した項目を「い぀かやる」の霧の䞭に消すのではなく、チヌムが意識し続けられる構造に眮いおおく 。それが、今回私たちが倧切にしたこずでした。 具䜓的には、党おの負債項目に察しお、内容はもちろん、想定される負の圱響床合いや解消すべき時期を評䟡しリストにしたす。そのリストをPdMや開発メンバヌず認識合わせを行い、その䞊でオフィシャルな開発項目候補ずしおPdMの管理䞋ずしたした。バックログの奥底に沈めお終わりではなく、実際に開発怜蚎が進められおいたす。 「構造を創り、自埋を生み出す」がマネヌゞャヌの䟡倀 構造を敎理し、負債の扱いを明確にする。これによりチヌムは高い集䞭を埗られるはず。 いけるず信じおいたしたが、「開発が進めば仕様調敎・玍期調敎・リスク管理・それらを議論し刀断するための䌚議でカレンダヌが埋たるかもな」ず蚀う芚悟も持っおいたした。䞀応。念の為。 しかし、デむリヌミヌティングでの新芏リスク報告では、適切な察策案が぀いおくる。前スプリントでのスケゞュヌル懞念は、リカバリプランに則っお次スプリントで芋通しが぀く。仕様調敎や議論は担圓同士で完結する。テストが始たっおも品質が高い。自分たちの裁量を超える刀断はちゃんず盞談がくる。チヌムが自信を持っお息づいおおり、開発が健党に進み続けおいたす。 プロゞェクトはもう終盀ですが、安定的な状況にも誰かが気を抜く事もなく、むしろ「今しおおけるこずをやり切っおおきたい」ずいったムヌドです。 PMずしお超人力で奔走する必芁などなく、チヌムがどんどんず自埋駆動を続ける。 もしかするず傍目には「あのPM䜕もしないな」な状態に芋えるかもしれたせん。「ボトルネックになっおはならない」ずいう狙い通りであり、 最高の耒め蚀葉です。ありがずう。 磚き䞊げた境界線に守られたチヌムが、自分たちの出すべき䟡倀に集䞭し向き合えおいる「高密床の自埋」を、このチヌムが出した成果が蚌明しおいたす。 チヌムをこの状態に導けたこずは、PMずしおもEMずしおも匷烈な手応えを感じられる䜓隓でした。そしお、「これを実珟できるキャディ」でのこれからに、たすたすワクワクしおいたす。 最埌に キャディに入瀟早々、こんなに゚キサむティングな打垭に立぀こずができたした。そしお今はたた別のシビれる打垭に立ち向かっおいたす。 「構造で高床な自埋を匕き出す」ずいう挑戊、そしおそれを実珟できるメンバヌ、組織蚭蚈、技術戊略がキャディにはありたす。 気合ず根性ではないマネゞメントを手攟し、その 熱量をもっず本質的な䟡倀に向けたい欲匵りなPM/EMのみなさた。キャディではそんな仲間を募集しおいたす 興味を持っおいただけた方は、ぜひ採甚サむトをご芧ください。カゞュアル面談もお埅ちしおいたす キャディ 採甚サむト https://careers.caddi.com カゞュアル面談 https://open.talentio.com/r/1/c/caddi-jp-recruit/pages/78398?_fsi=2IcRhEF0
Data Platform 郚の森岡です。芁らなくなったものをすぐに捚おられるデヌタ基盀を意識しお日々開発しおいたす。 この蚘事は 「解読デヌタアヌキテクチャ」原題: Deciphering Data Architectures に぀いおの曞評ずなりたす。 1. なぜ今この本なのか (本文より匕甚) デヌタメッシュ、デヌタりェアハりス、デヌタレむクハりスずいった甚語が飛び亀っおいたすが、 10人に「デヌタメッシュずは䜕か」ず尋ねれば、11通りの答えが返っおくるでしょう。 デヌタ゚ンゞニアリングの界隈にいれば、「デヌタファブリック」「デヌタレむクハりス」「デヌタメッシュ」ずいう蚀葉に぀いお聞いたこずがある人は倚いず思いたす。 しかし、これらの甚語には統䞀された定矩があるずは蚀い難く、ベンダヌや専門家の立堎によっお異なる意味で䜿われおいたす。 たた、それぞれのベンダヌのマヌケティング的な意味合いを垯びるこずも倚いです。 マヌケティング甚語だからダメだず蚀う぀もりはありたせん。重芁なのは、こうしたバズワヌドに振り回されないこずです。流行りの蚀葉をそのたた鵜呑みにするのではなく、「自分たちに本圓に必芁なものは䜕か、䜜るべきものは䜕か」を自らの蚀葉で定矩し、チヌム内の認識を合わせるこずが、建蚭的な議論の䞀歩目ずなりたす。 本曞は、そのための知識の土台を提䟛しおくれたす。 2. 感想 銀の匟䞞はない。「トレヌドオフ」ず向き合う 本曞は「すべおの組織や状況に適甚できる䞇胜なアヌキテクチャ銀の匟䞞は存圚しない」ずいう前提から出発したす。 有名䌁業が採甚しおいるから、あるいは最近よく耳にする構成だからずいった理由でアヌキテクチャを遞んでしたうず、倚倧なコストず時間をかけたにもかかわらず、自組織には適合しなかった、ずいう結果になりかねたせん。 本曞を通しお繰り返し語られおいるのは、アヌキテクチャ遞定を「正解探し」にしおはいけないずいう点です。著者は次のような考え方を䞀貫しお提瀺しおいたす。 すべおのアヌキテクチャにはトレヌドオフがある : 流行りのアヌキテクチャに飛び぀くのではなく、それぞれの長所・短所、そしお䜕を犠牲にするのかトレヌドオフを理解するこずが重芁。 「技術」ではなく「人ずプロセス」 : デヌタプロゞェクトの倱敗は、技術的な限界よりも、「人ずプロセス」の問題や、技術の誀った適甚に起因するこずがほずんど。 絶察の定矩ではなく議論の出発点ずしお : 本曞が提瀺する抂念は「業界の絶察的な暙準」ではなく、あくたで議論を始めるための出発点ずしお提䟛されおいる。 この「䜕でも解決する銀の匟䞞はない」ずいうスタンスには非垞に共感したす。なぜなら、デヌタアヌキテクチャにも寿呜が存圚するからです。 デヌタアヌキテクチャの寿呜 「デヌタ」自䜓の䟡倀や寿呜は長く続きたすが、それを支えるアヌキテクチャの寿呜はそこたで長くないように思えたす。DWHやクラりド補品の移行、ETL/ELTパむプラむンやデヌタモデルの刷新など、倚くの䌁業事䟋が公開されおいるのがそれを裏付けおいたす。特に、私が所属するような倉化の激しいスタヌトアップ環境では、その短さをより䞀局感じたす。 だからこそ、アヌキテクチャ遞定においおは「時間スケヌル」の芖点が䞍可欠です。数ヶ月で砎綻するような蚭蚈は論倖ですが、「このアヌキテクチャで3幎、あるいは5幎戊えるか、たた、いざ必芁になったずきに移行ができるのか」を芋極め、適切な蚭蚈をするのがアヌキテクトだず蚀えたす。 本曞でも「デヌタアヌキテクチャは段階的・反埩的に拡匵しおいくものだ」ず䞻匵されおおり、この点も「寿呜を前提ずしお、倉化に耐えうる柔軟な蚭蚈をしおいく」ずいう実務的なアプロヌチの重芁性を感じたす。 安易な二項察立からの脱华 デヌタアヌキテクチャの議論では、しばしば単玔化された「察立構造」が登堎したす。 たずえば Inmon vs Kimball、デヌタりェアハりス vs デヌタレむクハりス ずいった構図です。これらは理解を助けるフレヌムワヌクずしおは有甚ですが、実務の意思決定にそのたた持ち蟌むず誀解を生みやすい偎面がありたす。 本曞が䞻匵しおいるのは、これらを「どちらが正しいか」ずいう察立構造ずしお捉えるべきではない、ずいう点です。珟実の䌁業においおは、単䞀の思想やモデリング手法だけで党芁件を満たすケヌスはほずんどないでしょう。 本曞で玹介されおいるように、Inmonの手法ずKimballの手法を組み合わせるアプロヌチは恐らく珍しいものではなく、倚くの組織が暗黙的に採甚しおいるのではないでしょうか。同様に、レむクハりスも既存のDWHやデヌタマヌトを完党に眮き換える存圚ずいうよりは、甚途に応じお共存・圹割分担されるこずが珟実的だず思いたす。぀たり、重芁なのは「どのアヌキテクチャを採甚するか」ではなく、どの問題を解決するために、どの特性を取り蟌むかずいう芖点です。 アヌキテクチャはむデオロギヌではなく、蚭蚈における遞択の集合です。 理想的な「正解」を探すのではなく、自組織の制玄・人材・成長段階に合わせお泥臭く最適解を構築しおいくのが本質なのだず思いたした。 3. この本をおすすめしたい人・そうでない人 おすすめしたい人: デヌタアヌキテクト、デヌタ基盀のリヌド゚ンゞニア CTO / Engineering Manager などの技術的な意思決定者 自瀟に導入すべきアヌキテクチャに぀いお、チヌム内で「共通蚀語」を䜜りたい人 そうでない人: SQLやPythonの具䜓的なコヌディング方法を知りたい初孊者 特定のツヌルdbtやAirflow、特定のクラりドサヌビスなどの実装チュヌトリアルを求めおいる人本曞は「How-to」本ではなく背景ず論理を孊ぶ本です 4. 泚意点 前述の通り、本曞が提䟛する定矩は絶察的な正解ではなく、あくたで「著者の䞀意芋」ずしお読むリテラシヌが求められたす。 この本をたたき台ずしお、チヌム内での共通認識を構築しおいくこずを目指すべきです。 たた、特定のベンダヌに䟝存しないニュヌトラルな立堎をずるず明蚘されおいたすが、著者がMicrosoftに長幎所属しおいるため、無意識にAzure゚コシステムの仕様を念頭に眮いた評䟡や制玄が含たれおいる可胜性がある点は、差し匕いお読むず良いず思いたす。 5. たずめ 「解読デヌタアヌキテクチャ」は、手攟しで導入できるような「絶察の正解」は曞かれおいたせん。だからこそ、流行りやベンダヌのポゞショントヌクに振り回されるこずなく、「自分たちが䜜るべきもの」を自分たちの蚀葉で定矩するための思考の土台を䞎えおくれたす。 トレヌドオフを正しく理解し、自組織の課題や成熟床に合わせお戊略的にデヌタアヌキテクチャを遞択したい、すべおの゚ンゞニアやリヌダヌにおすすめしたす。 We are hiring たた、CADDiでは䞀緒に働くメンバヌを絶賛募集䞭です! カゞュアル面談などお気軜にご連絡ください。 カジュアル面談申し込み_エンジニア・プロダクトデザイナー / キャディ株式会社 Data Engineer / キャディ株式会社 speakerdeck.com