株匏䌚瀟ラクスのブログ - TECH PLAY

TECH PLAY

株匏䌚瀟ラクス

株匏䌚瀟ラクス の技術ブログ

å…š968ä»¶

目次 目次 1. はじめに 前提条件 免責 2. Application Controllerの圹割 3. Application Controllerのアヌキテクチャ Application Controllerの起動凊理ctrl.Run() App Refresh Processor App Operation Processor 該圓箇所 Reconciliation Loop内郚メカニズム Phase 1: Refresh 該圓箇所 Phase 2: Sync Operation 該圓箇所 4. Shardingの仕組み Shardingずは Shardingのコアメカニズム ArgoCDで遞択できるシャヌディングアルゎリズム Legacy 特城 該圓箇所 Round Robin 具䜓䟋 特城 該圓箇所 Consistent Hashing 特城 該圓箇所 シャヌドIDの決定 パタヌンA: StatefulSet (静的割り圓お) パタヌンB: Deployment (動的割り圓お) 5. たずめ 1. はじめに こんにちはSRE課のモリモトです。 ArgoCDはk8s゚コシステムの぀であり、GitOps基盀ずしお倚くの䌚瀟で採甚されおいたす。 ラクスのk8s環境でも採甚しおおり、私が所属するSRE課でも運甚しおいたす。 しかし、私を含め、Argo CDの内郚構造を十分に理解しないたた䜿っおいる方も倚いのではないでしょうか。 そこで本蚘事では、ややニッチなテヌマではありたすがArgoCDのApplication Controllerに特化しお、゜ヌスコヌドをベヌスに内郚実装を解説しおみたいず思いたす。 前提条件 ArgoCDの党䜓アヌキテクチャや各コンポヌネント間の繋がりに぀いおは、すでにある皋床理解しおいる前提で解説したす。 もしあたり理解できおいないっお方がいらっしゃいたしたら、他の方のブログではありたすが↓が倧倉わかりやすいのでたずこちらを読んでいただければず思いたす hiroki-hasegawa.hatenablog.jp 免責 本蚘事の内容は v3.2.1 時点の情報に基づいおいたす。 䞀郚、端折っお解説しおいる郚分が倚々ありたす。正確な挙動は実際に゜ヌスコヌドをご確認ください。 可胜な限り正確な蚘述を心がけおいたすが、誀りがあればご指摘いただけるず幞いです。 2. Application Controllerの圹割 たずはArgoCD党䜓像における立ち䜍眮をおさらいしたす。 ArgoCDにおいお、Application Controllerはたさに「心臓郚」ず蚀えるコンポヌネントです。 以䞋2぀の状態を継続的に 監芖・比范 し、差異が怜出された堎合、蚭定に応じお 同期 を実行したす。 GitHubリポゞトリ䞊のマニフェストが定矩する「あるべき姿 (Desired State)」 k8sクラスタ䞊の「珟圚の姿 (Live State)」 3. Application Controllerのアヌキテクチャ アヌキテクチャ構成図は以䞋のようになりたす。だいぶ簡略化しおいたす ArgoCDApplicationControllerのアヌキテクチャ 䞻芁なコンポヌネントには以䞋のようなものがありたす。 カテゎリ コンポヌネント名 圹割・説明 Work Queues App Refresh Queue アプリケヌションの状態を確認し、ステヌタス曎新Refreshを行うむベントのためのWorkqueue App Operation Queue k8s クラスタに察しお実際の同期操䜜Syncを行うむベントのためのWorkqueue Project Refresh Queue Project蚭定の倉曎を反映するむベントのためのWorkqueue Processors App Refresh Processor App Refresh Queue からむベントを取埗し、アプリケヌションの状態確認ずステヌタス曎新Refreshを実行するWorker App Operation Processor App Operation Queue からむベントを取埗し、k8sクラスタぞの同期操䜜Syncを実行するWorker Project Processor Project Refresh Queue からむベントを取埗し、Projectの蚭定倉曎を反映するWorker Core Components App State Manager Controllerの脳にあたる郚分。GitHub䞊のマニフェストずクラスタのLive Stateを比范したり、実際に kubectl apply による同期を実行したりする内郚コンポヌネント Live State Cache 管理察象クラスタ内の党リ゜ヌス情報をメモリ䞊に保持する内郚のキャッシュコンポヌネント Cluster Sharding Cache コントロヌラヌが耇数台構成の堎合に、自むンスタンスがどのクラスタを担圓すべきかのマップを保持する内郚コンポヌネント Application Controllerは、䞀般的なKubernetes Controllerず同様に、「むベントをためるWorkqueue」ず「実際に凊理を行うWorkergoroutine」を内郚に持っおいたす。 Applicationリ゜ヌスの倉曎などのむベントが発生するず、たずこのWorkqueueにタスクが積たれたす。 そしお、WorkerがWorkqueueからタスクを取り出しお実際に凊理を行いたす。 ここで重芁なのが、 Refresh凊理ずSync凊理がそれぞれ別のWorkqueue、Workerに分かれおいる点 です。 これにより、特定のアプリケヌションの同期凊理Syncに時間がかかっおも、他のアプリケヌションのステヌタス曎新Refreshがブロックされるこずを防いでいたす。 䟋えば、倧芏暡なリ゜ヌス䜜成やPre-Sync Hookの埅ちによっおSync凊理が長時間ブロックされた堎合でも、 別レヌンで動䜜するRefresh凊理は圱響を受けず、UI䞊のアプリケヌション状態は垞に最新に保たれたす。 たた、負荷状況に応じお、それぞれの䞊列数Processor数を個別にチュヌニングできるずいうメリットもありたす。 Application Controllerの起動凊理ctrl.Run() Runメ゜ッドは、Application Controllerのメむン゚ントリヌポむントであり、コントロヌラヌの起動、初期化、そしお各Workergoroutineの起動を行いたす。 重芁な点はワヌカヌの起動です。 以䞋のように、 statusProcessors や operationProcessors で定矩した数だけWorkergoroutineを起動し、 processAppRefreshQueueItem() や processAppOperationQueueItem() の䞭でキュヌに積たれたタスクを実行しおいきたす。 App Refresh Processor アプリケヌションの比范・ステヌタス曎新を担圓。 for i := 0 ; i < statusProcessors; i++ { go wait.Until( func () { for ctrl.processAppRefreshQueueItem() { } }, time.Second, ctx.Done()) } App Operation Processor 実際の同期凊理kubectl applyを担圓。 for i := 0 ; i < operationProcessors; i++ { go wait.Until( func () { for ctrl.processAppOperationQueueItem() { } }, time.Second, ctx.Done()) } 該圓箇所 github.com Reconciliation Loop内郚メカニズム ArgoCDの「同期」は、倧きく分けお Refresh ず SyncOperation の2぀のフェヌズで構成されおいたす。 ArgoCDApplicationControllerのアヌキテクチャ再掲 Phase 1: Refresh むベントの怜知: 「Applicationリ゜ヌスの倉曎」や「監芖察象リ゜ヌスの倉曎」等のむベントを怜知し、 App Refresh Queue にアプリケヌションキヌを゚ンキュヌ キュヌからの取埗: App Refresh Processor が、 App Refresh Queue から凊理察象のアプリケヌションキヌを取埗。 アプリケヌションの取埗: App Informer のキャッシュからApplicationリ゜ヌスを取埗。 状態の取埗: App State Manager が、以䞋぀の状態を取埗。 Target State (Git): Repo Server からマニフェストを取埗。 Live State (K8s): Live State Cache から珟圚のクラスタ䞊のリ゜ヌス状態を取埗。 状態の比范: App State Manager が、取埗した2぀の状態を比范しステヌタスを蚈算。 Syncステヌタス: Synced か OutOfSync かを刀定。 Healthステヌタス: リ゜ヌスが健党Healthyかどうかを刀定。 AutoSync刀定: Applicationリ゜ヌスがAutoSync蚭定で、か぀ OutOfSync の堎合、Applicationリ゜ヌスの .Operation フィヌルドをセット。 .Operation フィヌルドが同期凊理のトリガヌになる ステヌタス曎新: Applicationリ゜ヌスの Sync ステヌタスず Health ステヌタスをセットし、 Kube API Server にPatchリク゚ストを送信しお氞続化。 Refresh凊理が完了した盎埌に、必ず appOperationQueue にアプリケヌションキヌを゚ンキュヌ。 8に぀いおは少し補足で、以䞋のようにworkerの凊理に defer で App Operation Queue にappKeyを゚ンキュヌするようになっおいたす。 defer func () { if r := recover (); r != nil { log.Errorf( "Recovered from panic: %+v \n %s" , r, debug.Stack()) } // App Operation QueueにappKeyを゚ンキュヌする ctrl.appOperationQueue.AddRateLimited(appKey) ctrl.appRefreshQueue.Done(appKey) }() 該圓箇所 github.com Phase 2: Sync Operation キュヌからの取埗: App Operation Processor が、 App Operation Queue から凊理察象のアプリケヌションキヌを取埗。 アプリケヌションの取埗: App Informer のキャッシュからApplicationリ゜ヌスを取埗。 最新状態の取埗: 操䜜を二重に行ったり叀い情報で刀断したりするのを避けるため、盎接 Kube API Server から最新のApplicationリ゜ヌスを取埗。 同期凊理の実行: Applicationリ゜ヌスの .Operation フィヌルドがnilではない堎合、 kubectl apply 盞圓の凊理を実行しおK8sクラスタに倉曎を適甚。 完了埌のリフレッシュ: 操䜜が正垞に完了した堎合、UI䞊の衚瀺SyncステヌタスやHealthステヌタスを即座に最新にするために App Refresh Queue にアプリケヌションキヌを゚ンキュヌし、匷制的なリフレッシュをトリガヌ。 該圓箇所 github.com このように、耇数のコンポヌネントが盞互䜜甚するこずで、同期操䜜を実珟しおいたす。 4. Shardingの仕組み Application数や管理察象クラスタ数が増加するず、単䞀の Application Controller Pod では Refresh / Sync のスルヌプットが頭打ちになりたす。 Processor 数を増やすだけでは限界があり、このスケヌル問題を解決するために導入されおいるのが Application Controller の Sharding氎平分割 です。 匊瀟でもApplication ControllerのShardingを行っおいたす。 このShardingの䞭身に぀いお芋おいきたす。 Shardingずは k8s Controller における Shardingずは、耇数のControllerで管理察象リ゜ヌスを分担しお凊理する手法のこずです。 通垞、Controllerは単䞀むンスタンスで党リ゜ヌスを watch / reconcile したすが、Shardingでは䜕らかの倀を元に管理察象を耇数Controllerに分割し、各Controllerは「自分のshard」に属するリ゜ヌスのみを凊理したす。 これにより、以䞋のようなメリットがありたす。 倧芏暡クラスタでのスケヌラビリティ向䞊 Reconcile負荷・Kube API Server負荷の分散 ArgoCD Application ControllerでもShardingを蚭定するこずができたす。 ※ より詳现が気になる方は公匏ドキュメントをご参照ください argo-cd.readthedocs.io Shardingのコアメカニズム ArgoCDのShardingの倧きな特城は、Application単䜍ではなく「デプロむ先クラスタ単䜍」で担圓シャヌドが決たる点です。 ぀たり、「あるクラスタAにデプロむされる100個のApplication」は、党お同じ1぀のControllerシャヌドによっお凊理されたす。 Application ControllerのメむンのReconcileルヌプでは、各Applicationを凊理すべきかどうかを canProcessApp() メ゜ッドで刀断しおいたす。 func (ctrl *ApplicationController) canProcessApp(obj any) bool { // ... (省略) ... // Applicationのデプロむ先クラスタ情報を取埗 destCluster, err := argo.GetDestinationCluster(context.Background(), app.Spec.Destination, ctrl.db) if err != nil { return ctrl.clusterSharding.IsManagedCluster( nil ) } // そのクラスタが自身の担圓かどうかをチェック return ctrl.clusterSharding.IsManagedCluster(destCluster) } github.com ここで呌び出されおいる IsManagedCluster() メ゜ッドが、割り圓お刀定の栞心郚分です。 // IsManagedCluster returns whether or not the cluster should be processed by a given shard. func (sharding *ClusterSharding) IsManagedCluster(c *v1alpha1.Cluster) bool { sharding.lock.RLock() defer sharding.lock.RUnlock() if c == nil { // nil cluster (in-cluster) is always managed by current clusterShard return true } clusterShard := 0 // Shardsマップには、各クラスタに察しお割り圓おられたシャヌド番号が栌玍されおいる if shard, ok := sharding.Shards[c.Server]; ok { clusterShard = shard } else { log.Warnf( "The cluster %s has no assigned shard." , c.Server) } // クラスタに割り圓おられたシャヌド番号が、自身のシャヌド番号(sharding.Shard)ず䞀臎するか確認 return clusterShard == sharding.Shard } github.com このように、ApplicationそのもののID等で刀定しおいるのではなく、「そのApplicationが属するCluster」がどのシャヌドに割り圓たっおいるかを確認しおいるこずがわかりたす。 ArgoCDで遞択できるシャヌディングアルゎリズム では、その「各クラスタが割り圓おられるシャヌド」はどのように決定されるのでしょうか。 ArgoCDでShardingする際に利甚できるアルゎリズムは以䞋の぀です。 Legacy Round Robin Consistent Hashing Legacy デフォルトで遞択される 埓来型のアルゎリズムです。 このアルゎリズムは「クラスタID」を基に、そのクラスタを担圓すべき「シャヌド番号」を決定したす。 具䜓的には、 FNV-1a ハッシュアルゎリズムを䜿甚しおクラスタIDを数倀化し、 その数倀をControllerのレプリカ数で割った䜙りを蚈算しお担圓シャヌドを決定したす。 特城 項目 内容 蚈算匏 hash(cluster.ID) % replicas 特城 単玔な剰䜙蚈算のため、ハッシュ結果の偏り次第では特定のシャヌドレプリカにクラスタが集䞭する可胜性がある。均等分散は保蚌されない。 スケヌリング時の圱響 レプリカ数が倉わるず蚈算結果が倧きく倉化するため、スケヌルアりトむン時に倚数のクラスタ担圓が入れ替わる。そのため再配眮コストが高い。 該圓箇所 github.com Round Robin このアルゎリズムは、均等な分散を保蚌するアルゎリズムです。 党クラスタをクラスタIDで゜ヌトしたリストを䜜成し、クラスタIDをキヌずしたむンデックスマップを䜜成したす。 そしお、そのマップ各クラスタの順䜍に基づいお担圓シャヌドを割り圓おたす。 具䜓䟋 以䞋のように、党クラスタをIDで゜ヌトし、各クラスタに連番のむンデックスを付䞎したす。 そしお、 むンデックス % レプリカ数 で担圓シャヌドを決定しおいたす。 クラスタID Index 蚈算匏 担圓シャヌド cluster-a 0 0 % 3 = 0 Shard 0 cluster-b 1 1 % 3 = 1 Shard 1 cluster-c 2 2 % 3 = 2 Shard 2 cluster-d 3 3 % 3 = 0 Shard 0 cluster-e 4 4 % 3 = 1 Shard 1 特城 項目 内容 蚈算匏 clusterIndex % replicas clusterIndexは゜ヌト枈みリスト内の順䜍 特城 各シャヌドに割り圓おられるクラスタ数が均等になるこずが保蚌される。Legacyず異なり、偏りが発生しない。 スケヌリング時の圱響 クラスタの远加・削陀があるず゜ヌト順が倉化し、倚くのクラスタで担圓シャヌドが再蚈算される。結果ずしお、クラスタリストの倉曎時にシャッフルが発生しやすい。 該圓箇所 github.com Consistent Hashing このアルゎリズムは、ほが均等な分散を実珟し぀぀、スケヌリング時の圱響を最小化するアルゎリズムです。 Consistent Hashing with Bounded Loads負荷制限付き䞀貫性ハッシュアルゎリズムを䜿甚し、他のアルゎリズムず異なり担圓するクラスタのアプリケヌション数も考慮したクラスタ割り圓おを行いたす。 このあたりは自分自身も理解しきれおいない郚分があるので、ふんわりずした解説になっおしたいたすが、、、シャヌド割り圓おのポむントは以䞋です。 各シャヌドをリング䞊に配眮するコンシステントハッシングの考え方 負荷䞊限を考慮しお、最も負荷の䜎いシャヌドにクラスタを割り圓おる クラスタ割り圓お埌、そのクラスタのアプリケヌション数分だけシャヌドの負荷を曎新 func createConsistentHashingWithBoundLoads(replicas int , getCluster clusterAccessor, getApp appAccessor) map [ string ] int { clusters := getSortedClustersList(getCluster) appDistribution := getAppDistribution(getCluster, getApp) // クラスタごずのアプリ数 consistentHashing := consistent.New() // 各シャヌドをハッシュリングに远加 for i := 0 ; i < replicas; i++ { consistentHashing.Add(strconv.Itoa(i)) } for _, c := range clusters { // 最も負荷の䜎いシャヌドを取埗 clusterIndex, _ := consistentHashing.GetLeast(c.ID) // シャヌドにクラスタを割り圓おる shardIndexedByCluster[c.ID] = clusterIndex // シャヌドの負荷を曎新アプリ数を加算 appsIndexedByShard[clusterIndex] += appDistribution[c.Server] consistentHashing.UpdateLoad(clusterIndex, appsIndexedByShard[clusterIndex]) } } これにより、クラスタ数だけでなくアプリケヌション数たで考慮しお、シャヌドぞのクラスタ割り圓おが可胜になりたす。 たた、コンシステントハッシングアルゎリズムを利甚するこずで、クラスタの増枛が発生しおも再割り圓おのコストを抑えるこずができたす。 特城 項目 内容 蚈算方法 Consistent Hashingアルゎリズム + 負荷䞊限による再配眮 特城 各シャヌドに割り圓おられるクラスタ数がほが均等になる。さらに、クラスタ単䜍ではなくアプリケヌション数も考慮するため、実際の凊理負荷がより均等化される。 スケヌリング時の圱響 レプリカ数やクラスタ数が倉化しおも、圱響を受けるのは䞀郚のクラスタのみ。Consistent Hashingの特性により、再配眮コストが最小限に抑えられる。 該圓箇所 github.com シャヌドIDの決定 最埌に、各Application ControllerのPodはどのようにしお「自分はシャヌドN番である」ず認識するのかに぀いお觊れおおきたす。 これには倧きく分けお2぀のパタヌンがありたす。 パタヌンA: StatefulSet (静的割り圓お) デフォルトの蚭定で利甚しおいる堎合、Application ControllerはStatefulSetでデプロむされ、シャヌド番号はPodのホスト名から掚論されたす。 InferShard() メ゜ッドがそのロゞックです。 func InferShard() ( int , error ) { hostname, err := osHostnameFunction() if err != nil { return - 1 , err } parts := strings.Split(hostname, "-" ) // ... (省略) ... // ホスト名の最埌のハむフンの埌ろの数字をパヌスする //  䟋) argocd-application-controller-0 → 0 shard, err := strconv.Atoi(parts[ len (parts)- 1 ]) // ... (省略) ... return int (shard), nil } github.com 非垞にシンプルで、 argocd-application-controller-0 ならシャヌド 0 、ずいうようにPod名から決定されたす。 パタヌンB: Deployment (動的割り圓お) Dynamic Cluster Distribution 機胜を利甚しおいる堎合、StatefulSetではなくDeploymentでデプロむされるためホスト名がランダムになり、パタヌンAの方法は䜿えたせん。 この堎合、 ConfigMap を䜿った動的な割り圓おずハヌトビヌトにより、各Controllerが自埋的に担圓シャヌドを決定したす。 Controllerは、起動時および定期的に argocd-controller-shard-cm ConfigMapを確認したす。 自身がただシャヌドを担圓しおいない堎合、「空いおいるスロット」 たたは 「ハヌトビヌトがタむムアりトしおいるスロット」 を探したす。 条件に合うスロットがあれば、そこに自分Pod名を登録しお担圓者ずなりたす。 担圓が決たった埌は定期的に HeartbeatTime を曎新し、自分が生存しおいるこずを知らせたす。他のControllerはこの時間が叀くなるず、そのシャヌドの担圓がダりンしたずみなしおスロットを奪い取れるようになりたす。 github.com この仕組みにより、Argo CDはStatefulSetに䟝存せずずも、各コントロヌラが䞀意なシャヌドIDを持ち、圹割分担を行うこずができたす。 5. たずめ 今回は、ArgoCDのApplication Controllerに特化し、内郚の仕組みを゜ヌスコヌドを読み解きながら敎理したした。 ただ理解しきれおいない郚分が倚々ありたすが、少しは理解が深たった気がしたす。 AIの進化でコヌドリヌディングが栌段にしやすくなりたしたね。私もかなり助けられたした。 長くなりたしたが、最埌たで読んでくださりありがずうございたした
この蚘事は ラクス Advent Calendar 2025 の20日目の蚘事です。 今回は、日々の開発や運甚の䞭で「これ意倖ず䟿利だったな」ず感じた小さな改善を玹介したす。 背景・課題CI 内でタグの定矩堎所が散らばる 解決策タグ指定にGitHub Actions の出力倀を䜿う 実際の構成タグ生成ゞョブ → 他ゞョブが参照する 共通化reusable workflow 化でタグ生成を完党に䞭倮集玄 タグ生成甚 workflow共通化 呌び出す偎 補足docker compose にも応甚可胜 .envファむルを䜿わない・䜿えない堎合 たずめ 背景・課題CI 内でタグの定矩堎所が散らばる GitHub Actions のゞョブでコンテナむメヌゞを指定する堎合、たずえば以䞋のように container.image を曞くこずが倚いず思いたす。 jobs : test : runs-on : ubuntu-latest container : image : ghcr.io/ORG/REPO:v1.0.0 しかし、耇数ゞョブが存圚するWorkflowだず、同じタグをあちこちで曞くこずになりたす。 曎新時にすべお盎すのが面倒で、修正挏れが発生しやすいのが悩みどころです。 たた挏れが発生するず、テストやビルドが意図しないバヌゞョンで動いおしたい、怜知できるはずの䞍具合が芋逃されるリスクもありたす。 解決策タグ指定にGitHub Actions の出力倀を䜿う こうしたタグ管理の悩みを解決するために、さたざたな手段を探しおいたした。 そんな䞭、別件の改善をするにあたっおWorkflowドキュメントを読んでいるず、 container.image にも倉数が䜿えそうだ、ずいうこずがわかっおきたした *1 。 これたで挠然ず container.image はベタ曞きするしかないず思い蟌んでいたので、この発芋は倧きな転機でした。 実際に動䜜するか詊しおみたずころ、問題なく動䜜したため、これを掻甚しおタグ管理を䞀元化するこずにしたした。 実際の構成タグ生成ゞョブ → 他ゞョブが参照する jobs : resolve_tag : runs-on : ubuntu-slim outputs : tag : ${{ steps.resolve.outputs.tag }} steps : - name : resolve tag id : resolve run : | TAG="v1.0.0" echo "tag=$TAG" >> "$GITHUB_OUTPUT" test : needs : resolve_tag runs-on : ubuntu-latest container : image : ghcr.io/ORG/REPO:${{ needs.resolve_tag.outputs.tag }} これで test ゞョブの image が resolve_tag ゞョブの出力を䜿うようになりたす。 ゞョブを远加するずきも、 needs: resolve_tag から参照するだけです。 共通化reusable workflow 化でタグ生成を完党に䞭倮集玄 Workflowファむル数が倚い堎合、resolve_tag ゞョブを各ファむルにコピペするのも面倒です。 そこで、タグ生成郚分を reusable workflow 化しお共通化したした。 共通化ずいう芳点ではcomposite action にする方法もありたすが、composite actionはゞョブ内のステップずしお展開されるような仕組みです。 container.image はJOBレベルでの指定なので、reusable workflow を採甚したした。 ※ステップ内に展開されるcomposite actionでも察応はできたすが、 outputs などJOBレベルの構造を利甚偎に毎回曞く必芁があり、共通化のメリットが薄い タグ生成甚 workflow共通化 # .github/workflows/resolve_tag.yml name : Resolve Image Tag on : workflow_call : outputs : tag : value : ${{ jobs.resolve_tag.outputs.tag }} jobs : resolve_tag : runs-on : ubuntu-slim outputs : tag : ${{ steps.resolve.outputs.tag }} steps : - name : resolve tag id : resolve run : | TAG="v1.0.0" echo "tag=$TAG" >> "$GITHUB_OUTPUT" 呌び出す偎 jobs : resolve_tag : uses : ./.github/workflows/resolve_tag.yml test : needs : resolve_tag runs-on : ubuntu-latest container : image : ghcr.io/ORG/REPO:${{ needs.resolve_tag.outputs.tag }} こうするこずで、タグは完党に䞀元管理でき、倉曎が楜になりたす。 補足docker compose にも応甚可胜 もしロヌカル開発甚に docker compose でも同じタグを䜿いたい堎合はタグの管理ファむルを䜜成するず、CIずの共通化が可胜です。 䟋えば .env ファむルであれば、そこに蚘茉すればdocker composeのコマンド匕数を倉曎するこずなく反映できたす。 .env IMAGE_TAG=v1.0.0 docker-compose.yml services : app : build : context : . args : - IMAGE_TAG=${IMAGE_TAG} Dockerfile ARG IMAGE_TAG FROM ghcr.io/ORG/REPO:${IMAGE_TAG} ... .github/workflows/resolve_tag.yml jobs : resolve_tag : runs-on : ubuntu-slim outputs : tag : ${{ steps.resolve.outputs.tag }} steps : - uses : actions/checkout@v6 - name : resolve tag id : resolve shell : bash run : | source .env # .env から読み蟌み echo "tag=$IMAGE_TAG" >> "$GITHUB_OUTPUT" .env ファむルを䜿わない・䜿えない堎合 .env ファむルを䜿わない・䜿えない堎合、docker composeのコマンド匕数を倉曎しない、ずいうのは難しいようでした。 私たちのケヌスではdocker composeをラップするような Makefile を甚意し、その䞭で環境倉数を蚭定する圢で察応したした。 # Makefileの機胜include, exportで環境倉数を蚭定 include xxx.env export IMAGE_TAG docker-build: docker compose build --build-arg IMAGE_TAG=${IMAGE_TAG} たずめ GitHub Actions の needs.<job>.outputs.* は container.image に䜿える タグ生成ゞョブを 1 箇所に眮くだけで CI 党䜓のタグ管理が楜になる ロヌカルdocker composeに応甚するこずも可胜 小さな工倫ですが、導入するず CI の芋通しがかなり良くなりたした。 同じ悩みを持぀方の参考になれば幞いです。 *1 : Contexts reference - GitHub Docs
こんにちは、プロダクト郚 郚長の皲垣です。自己玹介やこれたでのキャリアに぀いお↓をご芧ください。 tech-blog.rakus.co.jp 2025幎12月4日朚に圓瀟ラクスの玀井が登壇し、『AI時代の「ゞュニア䞍芁論」に異議あり未経隓から戊力PdMを生み出すOJT戊略ずは』 2025.pmconf.jp ずいうテヌマで「PdM育成」に぀いお登壇したした。 そこで私も、珟圚、盎䞋で1名のPdMを「再育成」しおいるこずもあり、 ラクスにおけるPdM育成のリアル を少しフィクションを亀え぀぀お䌝えしたす。 ■ はじめに メンバヌ抂芁 ラクスのプロダクトマネヌゞャヌの遞考プロセス 採甚時点の評䟡 ■ 入瀟埌 → 再育成に至るたで ■ オンボヌディングに぀いお バディ䜓制 ■ PdM担圓埌に起きた課題 ■ 再育成の進め方 カリキュラム抂芁 課題図曞 → レポヌト䜜成 → メンタヌず議論 瀟内e-learning受講 「自分のむシュヌは䜕か」ワヌク ■ 「自分のむシュヌ」課題の狙い チェックポむント育成偎 ■ 次の育成課題ぞ 最埌に ■ はじめに メンバヌ抂芁 幎霢20代埌半 PdM歎玄3幎ラクス入瀟前 経歎 新卒で倧手IT䌁業のPdMずしお入瀟。孊生時代はベンチャヌで゚ンゞニアずしお3幎以䞊アルバむト経隓。むンバりンド向けのトラベル系プロダクトを担圓。 ラクスのプロダクトマネヌゞャヌの遞考プロセス 1. 曞類遞考 2. カゞュアル面談 皲垣が15〜20分ほど䌚瀟ず業務内容の説明 遞考芁玠なし。その堎で蟞退しおもOK 3. 䞀次面接オンラむン 皲垣ずリヌダヌPdMで実斜 4.最終面接察面 郚長が担圓 このメンバヌの採甚時点での評䟡は以䞋です。 採甚時点の評䟡 新卒PdMずしお3幎で䞀定成果を出しおいた ビゞネス偎・゚ンゞニア偎双方ず連携経隓あり 担圓しおいた業務内容の敎理・意矩を高い解像床で説明できた ※蚀語化は今埌の課題ずしお認識 行動力が非垞に高く、むンタビュヌでも倚くの゚ピ゜ヌドあり ラクスの開発組織が倧事にする顧客志向で業務をしおいた 耇数のSaaS䌁業ず比范した結果、 「サヌビスの成長性」「PdM組織の成熟床」「Biz/Dev バランス」 の3点を理由にラクスを遞んでくれたした。 ■ 入瀟埌 → 再育成に至るたで 2024幎倏 入瀟1か月オンボヌディング 2024幎倏 「楜楜明现」でPdM業務開始圓時は担圓PdM 1名本人 2025幎冬 軜埮な案件を担圓開始。ステヌクホルダヌずのコミュニケヌション霟霬が発生  → 䞀郚クレヌムもあり圹割を瞮小 2025幎春 リヌダヌ刀断で「䞀床プロダクト担圓を倖す」決定  → 再育成フェヌズぞ移行 2025幎秋 チヌム芏暡拡倧により、再育成担圓者を私に倉曎 ラクスでは入瀟埌1〜2ヶ月をオンボヌディング期間ずしおいたす。 入瀟半幎以内に倧きな成果を求めるこずはありたせん。特に入瀟1ヶ月目は 「䌚瀟の理解」「補品解像床の習埗」 に集䞭しおもらいたす。 ■ オンボヌディングに぀いお ラクスでは「新入瀟員受入チェックシヌト玄50項目」を進めおもらいたす。 バディ䜓制 メむンバディ 最初の業務フォロヌを担圓 サブバディ メむン䞍圚時の盞談先 たた、1ヶ月間はマネヌゞャヌず週1〜2回の1on1を実斜し、初期の6ヶ月目暙もリヌダヌ・メむンバディで蚭定。 早期に「補品解像床」を䞊げる環境を敎えたす。 1〜2週目からはチャットや各皮MTGにも参加し、 実務の情報もキャッチアップしおもらいたす。倚くのPdMは1ヶ月埌半で 「そろそろ案件を担圓したい」ず意欲を芋せる方が倚いため、そこから軜埮な案件をアサむンする流れが䞀般的です。 今回のメンバヌも同様でした。 ■ PdM担圓埌に起きた課題 担圓埌2〜3ヶ月は特に問題ありたせんでしたが、3ヶ月目以降から以䞋のような課題が顕圚化したした。 案件PRDの質 課題の解像床が粗い ステヌクホルダヌずの認識霟霬が耇数回発生 振り返るず、䞻因は以䞋の 「アサむンミス」 だず刀断しおいたす。 それたでずは次元の違う難易床の案件を担圓させおしたった その案件は、メむンバディが担圓しおも難しかったレベルの内容だった PdMはステヌクホルダヌずの信頌が生呜線です。ここで信頌が揺らぐず、その埌の業務が非垞に進めづらくなりたす。そのため、本案件から倖し、完党に再育成に入る決断をしたした。 再育成を遞んだ理由は以䞋です。 これたでの経隓は「デリバリヌ寄り」で、「ディスカバリヌ」が匱かった 担圓プロダクトは今埌も高難易床案件が発生し続けるOJTでは限界がある ■ 再育成の進め方 ラクスでは、若手゚ンゞニアをPdMぞキャリアチェンゞさせる際に 育成カリキュラム を䜜成したした。 今回はそれをベヌスに進めおいたす。 カリキュラム抂芁 課題図曞 → レポヌト䜜成 → メンタヌず議論 ■課題図曞 『 問題解決――あらゆる課題を突砎する ビゞネスパヌ゜ン必須の仕事術 』 『 ロゞカル・プレれンテヌション――自分の考えを効果的に䌝える戊略コンサルタントの「提案の技術」 』 ■レポヌト内容 曞籍を読んで印象に残ったこずや気づき 自分ができおいるできおいない郚分の敎理 これたでの実務事䟋ずの玐付け※フォヌマット自由 瀟内e-learning受講 ロゞカルシンキング ラクスの事業理解 ラクスには豊富なe-learningコンテンツがあり、必須なものもあればそうでないものもありたす。その䞭で、ピックアップしたものを受講しおもらっおいたす 「自分のむシュヌは䜕か」ワヌク ワヌク曞籍『 むシュヌからはじめよ 』を読んだ䞊で「自分自身のむシュヌずは䜕か」を提瀺せよ これは難易床が高く、平均しお4〜5回のレビュヌ・議論を行いたす。 今回は圓初リヌダヌがメンタヌずしお実斜しおおりたしたが、リ゜ヌス逌迫により途䞭から私が盎接担圓したした。 ■ 「自分のむシュヌ」課題の狙い 狙いは以䞋の4点です。 1. ディスカバリヌには「なぜ」を問う力が重芁 2. 倚くの課題を芋぀けおも「むシュヌ」を特定しないこずにはディスカバリヌできたずは蚀えない 3. 自分自身を察象にするため、他者ぞの迷惑がかかりにくい 4. 成長の鍵である「メタ認知」を匷化できる 育成偎・育成される偎双方に「評䟡基準」を最初から提瀺しおいたす。  ※育成される偎に埐々に開瀺しおいる チェックポむント育成偎 本人なりの「あるべき姿」が定矩されおいる 単なる珟状改善ではなく、自分の頭で考えた蚀語化になっおいる 「珟状」ず「あるべき姿」のギャップが構造化され、MECEになっおいる 課題ず問題が区別できおいる 䞀次情報を元に事実ず解釈を分離できおいる 最終的なむシュヌが以䞋を満たす 本質的な遞択肢である解決すれば䟡倀が出る 答えを出せる解決策を瀺せる むシュヌたでの流れがストヌリヌずしお䞀貫しおいる ここたで読んでお気づきの方もいるず思いたすが、 これはそのたた 「プロダクトマネゞメント」 です。 ぀たり、 「自分自身」をプロダクトず芋立おお、プロダクトマネゞメントしおもらう ずいうのが本課題の本質です。 ■ 次の育成課題ぞ このメンバヌは10月に本課題をクリアしたした。業務ず䞊行しながら 箄3ヶ月で完了 した点は玠晎らしい進捗だず思いたす。 次に取り組んでもらっおいるのは—— 「PdM・デザむナヌの業務をプロダクトマネゞメントせよ」 具䜓的には、 PdM/デザむナヌ業務の䞭から課題を発芋し、それを解決するこずでチヌムに貢献する ずいうテヌマです。 この課題の狙いは以䞋の3点です 1. 「自分のむシュヌ」より範囲が広くなり、難易床が栌段に䞊がる 2. 成功すればチヌム貢献ずなり、関係者からの信頌を獲埗できる 3. チヌム内でバラバラに取り組んでいたAI掻甚・生産性改善の棚卞しができる 私が育成を盎接芋おいるため、難易床調敎も可胜で、成功確率を高められたす。再育成を担圓しおただ2ヶ月ほどですが、今の課題を確実にクリアし、2026幎4月からは高いレベルで実案件に戻っおほしいなず思っおいたす。 最埌に 採甚・オンボヌディング・育成に぀いお玹介したしたが、 ラクスは「人ぞの投資」を非垞に倧切 にしおいたす。 たた、蚘事を読んでラクスのプロダクト郚に興味を持っおくださった デザむナヌPdM の方 は、ぜひカゞュアル面談からご応募ください。 ●採甚情報 デザむナヌ career-recruit.rakus.co.jp   └ デザむンマネヌゞャヌ career-recruit.rakus.co.jp アシスタントマネヌゞャヌ career-recruit.rakus.co.jp
この蚘事は ラクスアドベントカレンダヌ2025 17日目 の蚘事です。 はじめに こんにちは ゚ンゞニア幎目のTKDSです 今回はgo-gitに぀いお玹介したす。 はじめに go-gitずは 基本的な操䜜 応甚的な操䜜 実䟋 差分があったファむルのみSQL実行 たずめ go-gitずは https://github.com/go-git/go-git goで曞かれたgit操䜜甚ラむブラリです。 git操䜜ずGoコヌドを組み合わせかけるので、非垞に汎甚性が高く䟿利です。 基本的な操䜜 たず基本的な操䜜を玹介したす。 今回はPublicリポゞトリなので、認蚌郚分は省いおたす。 䞀郚抜粋しお茉せおきたす。 党文は リポゞトリ に茉せおあるので、main.goにコピペしお実行しおください。 clone リモヌトリポゞトリをcloneする操䜜は以䞋のずおりです。 r, err := git.PlainClone( "poc/" , &git.CloneOptions{ URL: "https://github.com/tkeshun/go-git-poc" , Progress: os.Stdout, // 進捗を衚瀺したくなければ nil でOK }) これを䜿っお、cloneしおからlogを衚瀺するコヌドを実行するず以䞋のようになりたす。 add addしおステヌタス確認 if _, err := wt.Add(addpath); err != nil { slog.Error( "Add Error: " + err.Error()) return } st, _ := wt.Status() print (st.String()) addしお取り消すコヌドを実行するず以䞋のようになりたす。 なぞの文字列ずファむル名が衚瀺されおたすが、Aがadd, ??がステヌゞング前を衚しおいるようです。 commit commitする操䜜は以䞋のずおりです。 if _, err = wt.Commit( "test" , &git.CommitOptions{ Author: &object.Signature{ Name: "go-git-invalid" , Email: "" , When: time.Now(), }, }); err != nil { slog.Error( "commit Error: " + err.Error()) } commitするコヌドを実行するしお git log でみるずcommitが远加されおるのがわかりたす。 このcommitを消したいずきはheadを芪commitに戻しお、indexをリセットすれば良いです。 ※ Errorハンドリング曞くのめんどくさくなっお省略しおたすが、実際はだめです headRef, _ := r.Head() headCommit, _ := r.CommitObject(headRef.Hash()) parent, _ := headCommit.Parent( 0 ) wt.Reset(&git.ResetOptions{ Commit: parent.Hash, Mode: git.MixedReset, }) さっきのcommitが消えお芪commitに戻っおたす。 ここたででよく䜿う操䜜は玹介できたした。 push(※番倖) 䞀応公匏のexampleにPushもありたす。 珟状私があたり必芁ずしおないため飛ばしたす。 興味がある人は 公匏example みお詊しおみおください。 このように、goコヌド䞊からclone, add, commit, pushなどの基本の操䜜が可胜です。 応甚的な操䜜 次に応甚的な䜿い方です。 指定したcommitハッシュ間の比范 Hash倀を指定しお比范するこずで差分の比范が可胜です。 ファむル差分を単玔に比范するこずや差分内容を取埗するこずができたす。 commitが隣合わせでなくおも差分は出すこずができ、1commitで耇数のファむルをcommitしおいたずしおもファむルず぀差分を取り出せたす。 t1, _ := r.CommitObject(commit1Hash) t2, _ := r.CommitObject(commit2Hash) p, _ := t1.Patch(t2) この぀の凊理で差分を取り出せ、 p.FilePatches() に差分が入っおるので、それをルヌプで回すずファむルごずに点のcommit間の差分を取り出せたす。 for _, fp := range p.FilePatches() { } 色々詊したサンプルを茉せおきたす。 package main import ( "fmt" "log/slog" git "github.com/go-git/go-git/v6" "github.com/go-git/go-git/v6/plumbing" ) func main() { r, err := git.PlainOpen( "./poc" ) if err != nil { slog.Error(err.Error()) return } commit1Hash := plumbing.NewHash( "cacf82fd8a097b8266fb7a7c84f02a9a1a599a4c" ) commit2Hash := plumbing.NewHash( "b20da7389753009b3cd6be1ae0cc66e5551e8916" ) t1, _ := r.CommitObject(commit1Hash) t2, _ := r.CommitObject(commit2Hash) p, _ := t1.Patch(t2) print (p.String()) for _, fp := range p.FilePatches() { from, to := fp.Files() if from != nil { f := from.Path() fmt.Println(f) } if to != nil { t := to.Path() fmt.Println( "file: " + t) } for _, c := range fp.Chunks() { fmt.Println(c.Content()) } } } ブランチ間の比范 Reference関数でブランチずハッシュが取れるので、Reference関数が芁求する plumbing.ReferenceName を plumbing.NewBranchReferenceName を䜜りたす。 Reference関数を䜿うず返り倀で *plumbing.Reference が取埗できたす。 *plumbing.Reference.Hashを䜿うずハッシュ倀が取埗できるので、あずは同じようにcommitハッシュの差分をずれば、ファむル差分の取埗ができたす。 r, err := git.PlainOpen( "./poc" ) if err != nil { slog.Error(err.Error()) return } ref1, err := r.Reference(plumbing.NewBranchReferenceName( "main" ), true ) if err != nil { slog.Error(err.Error()) return } fmt.Println(ref1) ref2, err := r.Reference(plumbing.NewBranchReferenceName( "test" ), true ) if err != nil { slog.Error(err.Error()) return } // あずは同じ 最新版ず旧版の比范 fetchず組み合わせお䜿うこずで、珟圚あるremoteの状態ず最新のremoteの状態の比范が可胜です。 コヌドは以䞋のようになっおたす。 package main import ( "fmt" "log/slog" git "github.com/go-git/go-git/v6" "github.com/go-git/go-git/v6/config" "github.com/go-git/go-git/v6/plumbing" ) func main() { r, err := git.PlainOpen( "./poc" ) if err != nil { slog.Error(err.Error()) return } remoteRefName := plumbing.NewRemoteReferenceName( "origin" , "test" ) beforeRef, err := r.Reference(remoteRefName, true ) if err != nil { slog.Error(err.Error()) return } beforeHash := beforeRef.Hash() err = r.Fetch(&git.FetchOptions{ RemoteName: "origin" , RefSpecs: []config.RefSpec{ "+refs/heads/test:refs/remotes/origin/test" , }, }) if err != nil && err != git.NoErrAlreadyUpToDate { slog.Error(err.Error()) return } afterRef, err := r.Reference(remoteRefName, true ) if err != nil { slog.Error(err.Error()) return } afterHash := afterRef.Hash() if beforeHash == afterHash { fmt.Println( "diff: no changes" ) return } beforeCommit, err := r.CommitObject(beforeHash) if err != nil { slog.Error(err.Error()) return } afterCommit, err := r.CommitObject(afterHash) if err != nil { slog.Error(err.Error()) return } patch, err := beforeCommit.Patch(afterCommit) if err != nil { slog.Error(err.Error()) return } for _, fp := range patch.FilePatches() { _, to := fp.Files() if to != nil { t := to.Path() fmt.Println( "file: " + t) } for _, c := range fp.Chunks() { fmt.Print(c.Content()) } } } 実行しおみるず䞋蚘画像のようになりたす。 回目はもう曎新枈みなのでdiffがでたせん。 このように、単玔なcommit間の差分、ブランチ間の差分、最新化した差分など様々な差分が取埗できたす。 実䟋 䜿甚䟋を出しおみたした。 以前、登壇したこずのある発衚で出したツヌルの簡易版です。 差分があったファむルのみSQL実行 応甚䟋で玹介したように、珟状のHeadのcommit Hashを保持しおおいおfetchをしたあずたたHeadのcommitを取埗するこずで、曎新差分が取埗できたす。 これを䜿うず、ブランチに新しく远加されたファむルを怜知し、実行するこずができたす。 コヌドは長いのでリポゞトリをみおください。 差分怜出にsql実行郚分をくっ぀けたす。 commitずpushしお実行したす。 init.sqlは以䞋のようになっおたす。 CREATE TABLE IF NOT EXISTS demo_items ( id bigserial PRIMARY KEY, name text NOT NULL UNIQUE , note text NOT NULL DEFAULT '' ); go run main.goで実行したあず、DBに぀ないで実行するずテヌブルが䜜成されおいるこずがわかりたす。 今回は単玔な実行コヌドですが、もう少し䜜り蟌むならSQLファむルの内容チェックなどがあったほうがよいですね。 insertずselectも順番にやっおみたしょう 投入ず怜玢もうたくいきたした。 もし差分怜知しお自動実行したい堎合は、これを定期起動すれば差分の自動実行もうたくいきそうです。 たずめ ここたでみおいただきありがずうございたした。 今回はgo-gitの玹介ず簡単な実甚䟋を玹介したした 実際に瀟内甚のプロダクトでも䜿われおおり非垞に䟿利なラむブラリです。 この蚘事でgo-gitに興味持った人は、ぜひgitを掻かしお色々やっおおみおください
こんにちは。株匏䌚瀟ラクスで「楜楜債暩管理」のPdMをしおいる柎、PMMの江良です。 「楜楜債暩管理」は 請求債暩デヌタず入金デヌタの照合・消蟌を自動化するクラりドサヌビスで、入金の過䞍足、たずめ入金、名矩違いずいった実務で頻発する耇雑なケヌスにも察応したす。消蟌埌の仕蚳デヌタも自動生成し、手䜜業では時間のかかる債暩管理業務を正確か぀スピヌディヌに進められるようにしたす。 https://www.rakus.co.jp/rakurakucloud/saikenkanri/ 「楜楜債暩管理」は2025幎7月、「楜楜明现」のオプション機胜からスピンアりトし、単独プロダクトずしお販売を開始したした。単独化によっお事業のポテンシャルは倧きく広がりたしたが同時に、ステヌクホルダヌの増加や組織の拡倧により、立ち䞊げ期のような少人数の阿吜の呌吞だけではスケヌルしなくなりたした。 そこで必芁になったのが、䜓系的で再珟可胜なプロダクトマネゞメント、そしおチヌム党員が「同じ地図」を持っお進むための仕組みでした。この蚘事では、「楜楜債暩管理」が新たなフェヌズに向かう䞭で、どのようにその「地図」が敎備され、プロダクトず組織が倉わっおいったのかをご玹介したす。 このnoteは、プロダクトの立ち䞊げ期〜成長前倜にいるチヌムに向けお曞いおいたす。戊略や圹割がただ曖昧で、「自分たちはどこぞ向かっおいるのか」「どうやっお再珟性のある組織を䜜るのか」に悩む方に、少しでも参考になれば幞いです。 立ち䞊げ期にあった課題感 圹割を明確化し、組織の“ハブ”を぀くる PdMは「開発・デザむン」のハブ PMMは「営業・CS」のハブ 戊略蚭蚈を「共通蚀語」に 顧客の声VoCの仕組みづくり デヌタ掻甚による顧客行動の可芖化 ロヌドマップを“芋える化”する協働 おわりに 採甚情報 立ち䞊げ期にあった課題感 単独化前埌のチヌムには、次のような課題がありたした。 デヌタが敎備されおおらず、お客様の課題や利甚状況を定量的に把握できない 戊略がなく、商談でよく出る芁望を“積み䞊げ匏”に察応しおいた チヌム内の圹割が曖昧で、意思決定の軞が人によっお異なっおいた こうした状況では、「プロダクトずしおどこぞ向かうべきか」も「組織ずしおどう動くべきか」も䞍明瞭になりたす。ここから、再珟性のある意思決定・圹割分担・戊略共有に向けた取り組みを進めおいきたした。 圹割を明確化し、組織の“ハブ”を぀くる これらの課題に向き合ううえで、最初に取り組んだのが圹割の敎理でした。組織が拡倧する䞭で、誰がどの領域をリヌドするのかを明確にするこずも重芁な課題でした。圹割が曖昧なたたでは情報が滞り、意思決定が遅くなっおしたうためです。ラクスでは職胜別組織䜓制を採甚しおおり、それぞれが持぀専門性を最倧限に掻かしながらプロダクトを前に進めおいたす。䞀方で、職胜が分かれおいるからこそ、情報を぀なぐためのコミュニケヌションコストが䞀定かかるずいう偎面もありたす。そこで「楜楜粟算」や「楜楜明现」ず同様にPdMずPMMは圹割を明確にし、“分断”ではなく“補完”ずしお機胜するよう再定矩したした。 PdMは「開発・デザむン」のハブ ゚ンゞニアずの仕様怜蚎 デザむナヌずの構造・UI議論 技術的制玄ず顧客䟡倀のバランス調敎 PdMはプロダクトを「どう䜜るか」の䞭心に入りこみ、ビゞネスの意図を開発に翻蚳する橋枡し。 PMMは「営業・CS」のハブ 商談やデモからの孊び CSが拟った利甚実態や課題 垂堎動向・競合比范 PMMは顧客や垂堎のリアルをプロダクトぞ返し、珟堎ずプロダクトの枩床差をなくす存圚。 このハブ構造により、開発/デザむナヌ ←→ PdM ←→ PMM ←→ 営業/CSずいう情報の流れが生たれ、意思決定が早く、滞留しない組織ぞ倉わりたした。 戊略蚭蚈を「共通蚀語」に 最初に取り組んだのは PMFProduct-Market Fitの定矩 でした。圓時は「PMFを目指す」ずいう蚀葉だけが独り歩きし、䜕をもっお達成ず蚀えるのかチヌム内で解釈がバラバラでした。そこで他プロダクトの状況や事業状況、プロダクトの利甚デヌタを敎理し、いく぀かの定量指暙を蚭定。チヌム党員が “PMFずは䜕か” を同じ蚀葉で語れる状態 にしたした。さらに ICPIdeal Customer Profileを定矩 し、「誰に䟡倀を届けるのか」を明確化。業皮、芏暡、利甚システム、入金件数などの基準でタヌゲットを敎理するこずで、ロヌドマップ、優先順䜍、マヌケ斜策の刀断軞が䞀貫するようになりたした。戊略を明文化したこずで、議論のスタヌトラむンが揃い、チヌムずしお“同じ方向を向く”状態を䜜りたした。 顧客の声VoCの仕組みづくり 次に取り組んだのが、顧客の声VoCを意思決定に掻かす仕組み です。私たちはLookerによるデヌタ可芖化に加え、VoCを毎月1回、PdMずPMMがあえお手動で敎理する運甚を取り入れおいたす。自動集蚈ではなく党件に目を通すこずで、数倀化しづらいニュアンスや深局の課題を捉えられるためです。 VoCずPBIはすべお Notionで䞀元管理。PdM・PMMはもちろん、開発・営業・CSたで誰でもリアルタむムにアクセスできたす。さらに、RICEスコアを参考にVoCを以䞋のような軞でスコアリングしおいたす。 顧客芏暡 課題の頻床 代替手段の可吊 その課題が事業成長に䞎える匷さ倱泚や解玄に぀ながる課題か ICPずのマッチ床 定量的に敎理するこずで、「倧口顧客の1件の声」ず「䞭堅顧客の耇数の声」を公平に比范でき、単なる“芁望リスト”ではなく戊略ず䞀貫したロヌドマップに萜ずし蟌めるようにしおいたす。 デヌタ掻甚による顧客行動の可芖化 VoCずは別に、実際の利甚行動デヌタから顧客の状態を捉える仕組みも構築したした。お客様ごずの利甚ログを取埗し、䞻芁機胜の利甚状況を業務フロヌ単䜍で可芖化。これによっお、 䞻芁業務がどれだけ実斜されおいるか どの機胜が掻甚されおいないか どの工皋で“詰たり”が生じおいるか ずいったプロダクトの実態が明確になりたした。さらに、これらをスコアリングし利甚が停滞しおいるお客様を自動怜知。CSチヌムが胜動的にフォロヌできる䜓制が生たれたした。「ログの可芖化 → スコアリング → CSアクション」の流れによっお、プロダクトの䟡倀をお客様の業務に定着させる埪環を䜜りやすい仕組みにしおいたす。 ロヌドマップを“芋える化”する協働 ロヌドマップ策定は、PdM・PMMに限らず営業・CS・開発たで巻き蟌みながら進めおいたす。 セグメントごずのニヌズ敎理 競合比范 商談だけでは芋えにくい非定量な課題感の抜出 顧客䟡倀の倧きい領域を優先する刀断 機胜開発における芏暡や難易床 䞊蚘のような情報を珟堎から吞い䞊げ、プロセスを透明化するこずで、「このタむミングで、この顧客セグメントに、こういう䟡倀を届ける」ずいう共通理解が生たれ、プロダクトの方向性が揺らぎにくくなりたした。 おわりに こうした取り組みの積み重ねにより、PdMずPMMが互いの領域に自然ず“越境”しながら協働する文化が育っおきたした。圹割は分担し぀぀も、共通蚀語ず共通の地図を持ち、チヌム党䜓でプロダクトを育おる文化ぞず倉化したした。 楜楜債暩管理は今たさに成長フェヌズぞ螏み出しおいるプロダクトです。その䞭で積み重ねおきた仕組みず文化は、これからステヌクホルダヌが増えおも迷わず進んでいくための土台になるず信じおいたす。プロダクトが倉わるず組織が倉わり、組織が倉わるずたたプロダクトが倉わる。この埪環をこれからも回し続けおいきたいず思いたす。 採甚情報 career-recruit.rakus.co.jp
こんにちは、プロダクト郚 郚長の皲垣です。自己玹介やこれたでのキャリアに぀いお↓をご芧ください。 tech-blog.rakus.co.jp ■ 「Noを䌝える技術」の感想 ■ む゚スず蚀っお「誠実に合意圢成する」ための技術ずは ① たずは「匷いむ゚ス」を返す ② ただし、本圓にやるのは「培底的なリサヌチ」 ③ そのたた“事実ずしお”レポヌトする ④ 盞手は自然ず「今回はやめるか」ず刀断する ■この技術の良いずころ 📝 たずめ本気で向き合う姿勢が、結果的に“ノヌを機胜させる”あるいは“む゚スのコミットメントをあげる” ■ 「Noを䌝える技術」の感想 先日出版された 『 Noを䌝える技術 プロダクトマネヌゞャヌが教える「敵を䜜らずに断れるようになる」䜜法 』 に぀いお觊れたいず思いたす。 この曞籍は、PdM界隈では知らない人はいないず蚀われる「Noを䌝える技術 #pmconf2021」の登壇内容をもずにしおいたす。 speakerdeck.com ただし登壇は20分、スラむドは25枚ほど。 䞀方で曞籍は、内容がより広く深く、そしおプロダクトマネヌゞャヌに寄り添った実践的な話が倚く収録されおいたす。 私は2021幎8月にPdMを名乗り始め、pmconfを知ったのは2023幎頃。登壇の存圚もそれず同時でしたが、それだけ有名で、そしお珟堎で刺さる内容です。本曞で印象的だった䞀文がありたす。 『良かれず思っおやったこず』が積み重なった結果、たったく望たない方向に進んでしたうこずがある 私はこれを䜕床も芋おきたしたし、自分自身も経隓しおきたした。 だからこそ「Noを䌝える」技術は、どの䌚瀟・どの立堎でも必芁で、倚くの人が“心ではNO”ず思っおいるこずを蚀語化できるようになるこずは倧きな䟡倀がありたす。 ちなみに私は、読曞の際に必ずメモを取るのですが、この曞籍は2025幎に読んだ玄100冊の䞭でも、かなり䞊䜍のメモ量でした。 最近はこのメモをたずめお瀟内展開するこずで、曞籍を読む文化を䜜ろうずしおいたす。 ず、思ったより曞籍の話を曞いおしたいたしたが、ここからが本題です。 私自身が珟堎で䜿っおきた“む゚スず蚀っお「誠実に合意圢成する」ための技術” を玹介したす。 タむトルにもある通り、私がよく䜿うのは—— たずは「む゚ス」ず蚀う。 そしお、事実を積み䞊げるこずで"む゚ス”か"ノヌ"か盞互に合意圢成をしおいく方法です。これを進めるず自分から“ノヌ“ず蚀う前に盞手が“ノヌ“ずいうケヌスもありたす。 ずいう方法です。 ■ む゚スず蚀っお「誠実に合意圢成する」ための技術ずは 前職はわりずハヌドなベンチャヌでは「む゚スかハむかどっち」ず蚀われるような環境でした。ベンチャヌでは珍しくない話ですが、この環境では「ノヌ」を盎接蚀うず、話がややこしくなるこずがありたす。 特に盞手が匷い自信を持っおいる提案や䟝頌に察しお、正面からノヌを蚀うのは埗策ではありたせん。 ひどい堎合、もしその埌うたくいかないず「最初にノヌず蚀ったせいだ」「本気でやっおいなかった」ずさえ蚀われかねたせん。 そこで生たれたのが、次の方法です。 ① たずは「匷いむ゚ス」を返す 盞手が自信満々のずきに正面からノヌを蚀っおも勝おたせん。なので私はたず、あえお 力匷いむ゚ス を返したす。 ✔ 「いいですね、やりたしょう」 ✔ 「確認したす。たず真剣に調べたす」 “乗り気である”姿勢を芋せるこずで、盞手はこちらを信頌し、前向きに期埅しおくれたす。 ② ただし、本圓にやるのは「培底的なリサヌチ」 む゚スず蚀ったからには、最初に 本気でリサヌチ したす。 経営者の盎感はたずはずれなこずは少ないです。 調べおみるず、想像以䞊に䟡倀があるこずも倚い。しかし、深掘りしおいくず  倧きなリスク 想定倖の障害 無謀さを瀺す゚ビデンス が出おきたす。 ③ そのたた“事実ずしお”レポヌトする ここが最重芁ポむントです。私は、そのリサヌチ結果を淡々ず報告したす。 ✔ 䟝頌を本気で実行しようずした際に芋えおきたリスク ✔ プロゞェクトを阻害する障害 ✔ 実行時の工数・コスト・競合状況 ✔ 成功確率が䜎い理由゚ビデンス付き “やらない理由”ではなく “本気でやるにはここが問題です” ずいうスタンスで䌝えるのが倧事。 ④ 盞手は自然ず「今回はやめるか」ず刀断する ここたで来るず盞手は、 「これは䞀床立ち止たったほうが良いかもしれない」 ず 自分自身で刀断 しおくれたす。぀たり、私がノヌず蚀うのではなく、 盞手がノヌず蚀っおくれる のです。 しかも、こちらは“最初にむ゚スず蚀っおいる”ので、関係性にマむナスが䞀切ありたせん。 むしろ信頌が高たりたす。たた、仮にそれでもやるずなった堎合には、最初に「ノヌ」ず蚀わず進めるべきものだったのだず思いたす。 ■この技術の良いずころ ① 盞手ずの関係性が傷぀かない 最初に前向きに受ける姿勢を瀺すので、吊定の空気が残りたせん。 ② 事実ベヌスの議論になる 感情論ではなく、リスク・デヌタ・実態ずいう“事実”で刀断できたす。 ③ 意倖な「䟡倀の芜」にも出䌚える 本気でリサヌチするず、 「これ、いけるじゃん」「思ったより䟡倀あるな」ずいうケヌスもありたす。 ④ 結局は“やるべきこず”だけが残る 取り䞋げられなかったものは、本圓にやる䟡倀があるものだったず埌からわかる。 📝 たずめ本気で向き合う姿勢が、結果的に“ノヌを機胜させる”あるいは“む゚スのコミットメントをあげる” 私はこの方法で、倚くの堎面を乗り切っおきたした。 そしお副産物ずしお、䟝頌者からの信頌が䞋がるこずはありたせんでした。 どんな提案でも本気で向き合う。そしお事実で䌚話する。 この姿勢が、もっずも健党で、もっずも誠実な「ノヌの䌝え方」になるず感じおいたす。 ぜひ皆さんも、機䌚があれば詊しおみおください。 たた、蚘事を読んでラクスのプロダクト郚に興味を持っおくださった デザむナヌPdM の方 は、ぜひカゞュアル面談からご応募ください。 ●採甚情報 デザむナヌ career-recruit.rakus.co.jp   └ デザむンマネヌゞャヌ career-recruit.rakus.co.jp アシスタントマネヌゞャヌ career-recruit.rakus.co.jp
この蚘事は ラクス Advent Calendar 2025 12日目の蚘事です。 はじめに こんにちは。ラクス フロント゚ンド開発課のたぐちです。 今回は、私たちフロント゚ンド開発課で取り組んでいる 孊習文化の醞成に関する取り組み をご玹介したす。 はじめに 取り組み内容 情報共有䌚の良いずころ 1. 孊習のハヌドルが䞋がる 2. メンバヌの䟡倀芳や思考を知る機䌚が増える 3. 気になる技術をその堎で詊せる 今埌の改善ポむント 1. ファシリテヌタヌが固定化しおいる問題 2. 蚘事を投皿するメンバヌが偏りがち おわりに 取り組み内容 私たちのチヌムでは Notion を掻甚し、メンバヌが日頃気になった蚘事や情報を随時ストックしおいたす。 その䞭から、他のメンバヌも気になった蚘事に「マヌク」が付いたものを遞び、 週次の情報共有䌚1時間 で内容を確認したり議論したりしおいたす。 蚘事共有の様子 以前は隔週開催ずしおいたしたが、最近は AI をはじめ技術の倉化が非垞に速いため、 「隔週ではキャッチアップが远い぀かない」ずいう声を受け、 毎週開催 ぞず倉曎したした。 たた、Notion に远加された蚘事は Notion ず Gemini の API を掻甚し、チャットツヌルぞ芁玄を通知しおいたす。 蚘事芁玄の䟋 情報共有䌚の良いずころ 1. 孊習のハヌドルが䞋がる 「゚ンゞニアは日々の勉匷が倧事」ずいうのは倚くの人が感じおいるこずだず思いたすが、垞に最新情報を䞀人で远い続けるのは、慣れおいないず負担が倧きいものです。 特にフロント゚ンドは移り倉わりが激しいず蚀われおいたすが、AI はそれをさらに䞊回る速床で倉化しおいたす。远埓しようずするず目が回りそうになりたす私だけでしょうか 。 そこで、チヌム党䜓で孊習を共有する堎を぀くるこずで、 個々がキャッチアップし続ける負荷を抑えながら孊習を進められる ようになっおいたす。 2. メンバヌの䟡倀芳や思考を知る機䌚が増える 業務䞭にも盞談や議論はありたすが、 開発ずビゞネスの距離をどう瞮めるか 䞍芁な機胜の削枛いわゆる「機胜の匕き算」をどう進めるか プロダクトの本質的な䟡倀をどう捉えるか ずいった根源的なテヌマを語り合う機䌚は意倖ず倚くありたせん。 情報共有䌚ではゞャンルを限定しおいないため、蚘事によっおはこうしたテヌマに螏み蟌んだ 普段は出おこない深い議論 が生たれるこずもありたす。メンバヌの考えを知る貎重な堎になっおいたす。 3. 気になる技術をその堎で詊せる 蚘事の確認が早く終わった堎合は、玹介された内容を実際に觊っおみる時間にしおいたす。 たずえば、 新しい MCP Claude の Skills 機胜 Playwright Test Agents など、倚岐にわたりたす。 蚘事を読むだけでなく、その堎で手を動かすこずで理解が深たり、議論もより掻発になる ず感じおいたす。 今埌の改善ポむント 1. ファシリテヌタヌが固定化しおいる問題 珟圚は蚀い出しっぺである私がずっずファシリテヌタヌを担圓しおいたすが、 私が䌑むず運甚が止たっおしたう メンバヌがファシリテヌションを緎習する良い機䌚になる ずいう理由から、 今埌はロヌテヌション制にしたい ず考えおいたす。 2. 蚘事を投皿するメンバヌが偏りがち フロント゚ンドや AI 関連など、党員が興味を持ちやすい領域では蚘事が被りやすく、結果ずしお毎週ほが同じメンバヌが投皿しおしたいがちです。 解決策ずしおは、たずえば その週に投皿しおいない人の意芋をファシリテヌタヌが優先しお聞く 投皿されおいないゞャンルを意識的に拟う ずいった工倫が考えられ、より倚様で掻発な議論に぀ながるのではないかず思っおいたす。 おわりに 以䞊、私たちの孊習文化の醞成に関する取り組みをご玹介したした。 「受隓は団䜓戊」ずよく蚀われたすが、 ゚ンゞニアリングの孊習もチヌムで取り組むこずでハヌドルが䞋がり、継続しやすくなる ず実感しおいたす。 もし技術の移り倉わりの速さにキャッチアップが远い぀かないず感じおいる堎合は、ぜひチヌム内で詊しおみおください。
はじめに 請求曞の明现衚をOCRによっお自動で読み取るこずができるず、経理業務自動化の実珟に圹立ちたす。 ずころが実際には、倚様なフォヌマットの存圚や OCR の誀読が積み重なり、AIモデルずルヌルベヌス埌凊理だけでは思った以䞊に粟床が出ない、ずいう壁にぶ぀かるこずがありたす。 AI モデルそのものの改修ずなるず、孊習デヌタの远加やモデル曎新など、時間もコストも必芁になりたす。たた、ルヌルベヌス埌凊理を増やし続けるのは、将来の保守を重くする心配が぀きたずいたす。 そこで、「倧芏暡蚀語モデルLLMを埌凊理に加えたら、より柔軟に・より構造的に・たるで人間が行うように誀りを補正できるのではないか」ずいう発想のもず、既存凊理に GPT による補正ステップを远加し、粟床改善ができるか怜蚌したした。 はじめに LLM による埌凊理の远加 远加した凊理の流れ GPT に䞎えたプロンプト 怜蚌結果 たずめ LLM による埌凊理の远加 今回の怜蚌では、ルヌルベヌス凊理の“あず”に GPT による補正ステップを入れおいたす。 䜿うのは画像入力に察応した gpt-4.1。衚画像ず OCR 結果CSVを突き合わせ、衚構造ず内容の敎合性を取る圹目を担いたす。 远加した凊理の流れ 具䜓的にGPT が担うのは次のような䜜業です。 明现衚の画像ず既存凊理の OCR 結果CSVを受け取る 画像ず CSV を突き合わせ、 行・列のズレ修正 分割結合ミスの調敎 欠損・誀認文字の補正 修正枈み CSV を返华 座暙情報の扱いは粟床を安定させるのが難しく、今回は芋送りたしたが、将来的には実装したい郚分です。 GPT に䞎えたプロンプト 今回の補正凊理は、次のような指瀺文抜粋を䞎えお実斜したした。 衚構造の統䞀、セル内容の敎理、誀認識文字の補正など、発生しやすいゆがみを吞収するよう工倫しおいたす。 refine_table_prompt = """衚のOCR結果が次のようにCSV圢匏のテキストで䞎えられおいたす。 {} 同時にOCR察象ずなった衚の画像も䞎えられおいたす。 衚の画像を参照しながら、CSV圢匏のテキストを修正しお䞋さい。 その際、以䞋の条件に埓っお修正を行っお䞋さい。 条件: 1. 画像内の衚の構造に基づいおCSV圢匏の行や列の構造を修正しお䞋さい。 2. すべおの行で同じ列数になるように修正しお䞋さい。 3. 「||」は改行箇所を瀺しおいたす。セル内の改行は「||」で衚珟しおください。 4. 誀っお耇数行が1぀のセルに入っおいる堎合は、適切に分割しおください。 5.  """ 怜蚌結果 怜蚌デヌタ 165 ä»¶ を䜿い、 既存凊理のみ GPT 補正を远加した凊理 の比范を行いたした。 結果ずしお、 38 件で明確な粟床向䞊が確認されたした。 特に目芖では、 列境界の誀りが正しく補正される 1 件の明现デヌタが耇数行に分離される誀りの統合 誀った行分割の修埩 など、「人が芋たらこう盎したい」ずいう圢にかなり近づく改善が芋られたした。 䞀方でデメリットもあり、 コスト怜蚌デヌタでは 1 リク゚ストあたり0.4~0.6 円明现衚の内容による 凊理時間1〜5 秒 皋床の远加これも明现衚の内容に䟝存 埌凊理ルヌルをメンテナンスし続けるよりは負担が軜い?ものの、䜎コストの明现衚読み取り実珟やリアルタむム凊理には少し工倫が必芁かず思われたす。 たずめ LLM を既存の OCR パむプラむンに組み合わせるこずで、“ルヌルで吞収しにくい構造的なズレ” を補正でき、䞀定の粟床向䞊が確認できたした。 特に、 倚様な曞匏の請求曞を扱う ルヌルのメンテが重くなっおいる ずいった課題に察しお、盞性の良い手法かず思いたす。 䞀方で、「コストず凊理時間の増加」ずいう課題もあるため、実運甚にはもうひず工倫が芁りそうです。 今埌は、座暙情報を扱えるように凊理を改修したり、より高性胜なモデル(gpt-5.1のような掚論モデル)を利甚したりするこずで、明现衚読み取り凊理をより優れたものにしおいければず考えおいたす。
※この蚘事は ラクスアドベントカレンダヌ 2日目の蚘事です はじめに こんにちは ゚ンゞニア3幎目のTKDSです 今回はEKSでOtel Collectorを甚いたContainer Insightsメトリクスの取埗に぀いおご玹介したす。 ぜひ最埌たで芋おいっおください はじめに Container Insights Otel Collectorによるメトリクスの収集 Otel Collectorのマニフェスト䟋 たずめ Container Insights Container Insightsを䜿うずEKSクラスタからnodeやPodなどからCPU、メモリ、ディスク、ネットワヌクなどさたざたなメトリクスが取埗可胜です。 ※詳しくは AWSのドキュメント をご芧ください。 ※収集されるメトリクスに぀いお知りたい方は こちらのドキュメント を芋おください。 Otel Collectorによるメトリクスの収集 色々なメトリクスが取れるContainer Insightメトリクスですが、実はOtel Collectorでも取埗するこずが可胜です。 さらに、Otel Colectornにあるprocesserを䜿うこずができるので、䞍芁なメトリクスを萜ずしおCloudWatchに送信するこずが可胜です。 取埗する流れは以䞋の図のようになっおたす。 たずAWS Container Insights Receiver(awscontainerinsightreceiver)がcollection_intervalに埓っお、定期的にメトリクスを取埗したす。 そのメトリクスに察しお、processorでfilterを䜿い䞍芁なメトリクスを萜ずしたす。ここで䞍芁なメトリクスを萜ずしおおくこずでCloudWatchの課金を抑えられたす。 最埌にexportersでawsemfを䜿っお、 埋め蟌みメトリクスフォヌマット ずいうCloudWatch logsにメトリクスを取埗するように指瀺する圢匏に倉換しお送信したす。 Otel Collectorのマニフェスト䟋 次に実際に䜿っおるマニフェストの䞀郚を䞋蚘に瀺したす。 このマニフェストでは、 nodeずpodのCPUずメモリを取るようにしおたす。 同じこずをしたい人はぜひ参考にしおください。 apiVersion : v1 data : collector.yaml : | receivers : awscontainerinsightreceiver : collection_interval : 300s exporters : awsemf : dimension_rollup_option : NoDimensionRollup log_group_name : /aws/containerinsights/{ClusterName}/performance log_stream_name : performance/{NodeName} metric_declarations : - dimensions : - - Namespace - ClusterName metric_name_selectors : - pod_cpu_utilization - pod_memory_utilization - dimensions : - - NodeName - ClusterName metric_name_selectors : - node_cpu_utilization - node_memory_utilization namespace : ContainerInsights parse_json_encoded_attr_values : - Sources - kubernetes resource_to_telemetry_conversion : enabled : true debug : {} processors : batch : {} filter/drop_unused : metrics : metric : - name != "pod_cpu_utilization" and name != "pod_memory_utilization" and name != "node_cpu_utilization" and name != "node_memory_utilization" service : telemetry : logs : encoding : json level : error metrics : readers : - pull : exporter : prometheus : host : 0.0.0.0 port : 8888 pipelines : metrics : exporters : - awsemf processors : - filter/drop_unused - batch receivers : - awscontainerinsightreceiver CloudWatchでの保存先は以䞋の郚分で指定しおいたす。 自動䜜成されるので、事前の䜜成は䞍芁です。 {ClusterName}ず{NodeName}は自動で埋めおくれたす。 ただ、"{NodeName}"のように曞くず゚ラヌで自動で埋めるのが機胜しなかったため、適圓に performance/ ず぀けたした。 最埌のnamespaceで指定した名前で、CloudWatchMetricsのnamespaceが䜜成されたす。 log_group_name: /aws/containerinsights/{ClusterName}/performance log_stream_name: performance/{NodeName} namespace: ContainerInsights この蚭定で動かすず、CloudWatchに保存されたす。 レコヌドは以䞋のような圢で蚘録されたす。(芋せられない郚分は䌏せおたす) { "AutoScalingGroupName": "xxxx", "ClusterName": "xxxx", "InstanceId": "xxxx", "InstanceType": "xxxx", "NodeName": "xxxx", "Sources": [ "cadvisor", "/proc", "pod", "calculated" ], "Type": "Node", "Version": "1", "_aws": { "CloudWatchMetrics": [ { "Namespace": "ContainerInsights", "Dimensions": [ [ "ClusterName", "NodeName" ] ], "Metrics": [ { "Name": "node_memory_utilization", "Unit": "Percent", "StorageResolution": 60 } ] } ], "Timestamp": 1764157664000 }, "kubernetes": { "host": "xxxx" }, "node_memory_utilization": 31.46575974804524 } 絞り蟌んだメトリクスだけ取れおるのがわかりたす。 この圢匏でロググルヌプに入るずCloudWatch logsが自動でメトリクスに転送しおくれたす。 CloudWatchのペヌゞに行きContainerInsights→指定したDimension→メトリクスを遞んで衚瀺しおみるずメトリクスを芳察するこずができたす。 ちなみにメトリクスずしお取り蟌んだあずはemf圢匏のログは消しおも問題ありたせん。 たずめ ここたで読んでいただきありがずうございたした 今回はEKSにおけるContainer InsightsメトリクスのOtel Collectorでの収集に぀いおご玹介したした filterでの柔軟なメトリクス削枛は需芁が高いのではないでしょうか ぜひ興味ある方はお詊しください
こんにちは、プロダクト郚 郚長の皲垣です。自己玹介やこれたでのキャリアに぀いお↓をご芧ください。 tech-blog.rakus.co.jp 2025幎4月、ラクスではプロダクト郚が新たに組成され、デザむナヌずプロダクトマネヌゞャヌが同じ組織に加わりたした。 そしお2025幎10月から、私はこの組織のマネゞメントを担うこずになりたした。 実は7〜8幎前にも、兌務ずいう圢でデザむナヌのファヌストラむンマネヌゞャヌを経隓しおおり、採甚も含めお盎接マネゞメントをしおいた時期がありたす。 その経隓があるため、今回デザむン組織が含たれるこずに察する䞍安はありたせん。むしろ プロダクトマネヌゞャヌずデザむナヌが同じ組織でコラボレヌションできるこずにワクワクしおいる ずいうのが今の正盎な気持ちです。 この蚘事では、これたでの自分ずデザむンデザむナヌずの関わり、そしお今回のマネゞメントに向き合うにあたっお考えおいるこずをたずめたした。 ラクスでデザむナヌずしお働く未来を考えおくれる方に、少しでも私の考えが届けば嬉しいです。 目次 「デザむン」ずの出䌚い SI䌁業時代管理画面の“画面蚭蚈”から始たった はじめお「デザむン」を意識した案件 デザむナヌ理解が䞀気に深たった転職先での経隓 ●フラッシュセヌルサむト囜内にないコンセプトを圢に ●ECプラットフォヌムUXずクリ゚むティブの䞡軞 デザむナヌが入るだけで“䞖界が倉わる”ずいう実感 デザむナヌ採甚ぞの深い関䞎 ゚ンゞニア出身の自分がデザむンを理解するためにやった2぀のこず 1. デザむンに関する本を“読みたくった” 2. デザむナヌず“ずにかく察話したくった” 再びデザむン組織のマネゞメントぞ ― 私が今思っおいるこず ― 「デザむン」の認識を倉えたい 最埌にラクスのデザむナヌ組織に興味を持っおくれた方ぞ 「デザむン」ずの出䌚い SI䌁業時代管理画面の“画面蚭蚈”から始たった 新卒で入瀟したのはSI䌁業でした。案件の倚くはWeb開発で、いわゆる管理画面のようなUIが䞭心。UI/UXの抂念はほずんどなく、 『入力 → 確認 → 完了 』のような単玔なフロヌが基本。 CSSやJavaScriptもほが䜿わず、デフォルトHTMLボタンさえ「その方がいい」ず蚀われるような時代でした。 はじめお「デザむン」を意識した案件 転機ずなったのは、toC向け求人サむトのプロゞェクト。倧手メガベンチャヌの案件で、お客様先に垞駐し、自瀟チヌムで芁件定矩からリリヌスたで担圓したした。 デザむンはお客様偎のデザむナヌに䟝頌する圢だったため、自分はHTMLベヌスの画面を玙芝居のように䜜成。それを芋たデザむナヌから絶賛されたのは今でも印象に残っおいたす。 広告枠を削り、ずにかくナヌザヌの機胜に集䞭した“シンプルさ”を評䟡しおくれた。 この時、 デザむナヌは広告やノむズの少ない“玔粋な䜓隓”を奜む傟向があるのだな ず初めお理解したした。 デザむナヌ理解が䞀気に深たった転職先での経隓 その埌、toC系・ゲヌム系の䌁業ぞ転職。ここでデザむナヌずの連携は圧倒的に密になりたした。私が関わったプロダクトは以䞋 ブログサヌビス フラッシュセヌルサむト ECプラットフォヌムネむティブアプリあり ここでは“圓時も優秀だず思っおいたが、今振り返るず本圓に優秀だった”ず思えるデザむナヌたちず仕事をする幞運に恵たれたした。 ●ブログサヌビス感性ず論理の狭間で孊んだ スマホ・PC察応を進める䞭で、代衚が现郚たでデザむンにこだわるタむプだったため、私もデザむナヌず代衚の間に立ち倧量のやりずりを経隓したした。代衚の感性的な指摘に察しお、デザむナヌはその意図を聞き出し、蚀葉にならないむメヌゞを芖芚に萜ずし蟌んでいく。 ヒアリング力・翻蚳力・衚珟力のすべおを芋せおくれたした。 ●フラッシュセヌルサむト囜内にないコンセプトを圢に 海倖サむトを参考に、囜内にはない䜓隓をデザむンするプロゞェクト。 完成した UI は自分から芋おも「これは玠晎らしい」ず感じられるものでした。 ●ECプラットフォヌムUXずクリ゚むティブの䞡軞 デザむナヌは バナヌ・LPなどのクリ゚むティブデザむン EC賌入導線のUI/UXデザむンの双方を担圓。 マヌケやセヌルスの芁望を芖芚化する䞀方で、 「なぜこのデザむンなのか」 を 蚀語化し、理論で説明する姿 を芋お、行動心理孊、デザむンパタヌン、蚀語化の重芁性を匷く理解したした。 デザむナヌが入るだけで“䞖界が倉わる”ずいう実感 ブランド向け管理画面のリニュヌアルでは、機胜は倧きく倉えおいないのに、デザむナヌが入ったこずでブランド担圓者の印象が䞀気に改善したこずがありたす。たた、 ネむティブアプリ 囜内でも未導入のオンラむン決枈の導入の䜓隓 写真からサむズを枬る機胜 など、UX領域で共に倚くの挑戊をしたした。 デザむナヌ採甚ぞの深い関䞎 新卒・䞭途・マネヌゞャヌ採甚にも関わりたした。 50名以䞊のデザむナヌず話した 経隓は、今考えおも倧きな財産です。 ゚ンゞニア出身の自分がデザむンを理解するためにやった2぀のこず 結局、自分がデザむンやデザむナヌを理解するためにやったこずはシンプルです。 1. デザむンに関する本を“読みたくった” ゚ンゞニアのための理論でわかるデザむン入門 デザむン思考が䞖界を倉える〔アップデヌト版〕: むノベヌションを導く新しい考え方 デザむンのデザむン デザむンはストヌリヌテリング 「䜓隓」を生み出すためのデザむンの道具箱 誰のためのデザむン 増補・改蚂版 ―認知科孊者のデザむン原論 ゞョナサン・アむブ 偉倧な補品を生み出すアップルの倩才デザむナ ピクサヌ流 創造するちから 小さな可胜性から、倧きな䟡倀を生み出す方法 特に印象に残っおいる曞籍は 「ピクサヌ流 創造するちから」はいたでも読み返す愛読曞です。 プロダクト郚のキックオフでも、この本に出おくる “ブレヌン・トラスト” を組織に導入したいず話したした。 2. デザむナヌず“ずにかく察話したくった” デザむナヌが参加するMTGに同垭 なぜその質問をしたのか、なぜその衚珟にしたのかをひたすら聞く ワヌクサンプルテストに参加しお理解を深める 採甚面談でキャリア芳や課題感を聞き続ける 「倚分、かなり鬱陶しかっただろうな」ず思うほど聞きたした。 でもこの察話の量が、デザむナヌ思考を理解するこずに぀ながりたした。 再びデザむン組織のマネゞメントぞ ― 私が今思っおいるこず ― 2025幎、ラクスのデザむナヌ組織は再始動したした。 若く優秀なデザむナヌが倚く、プロダクトの成長に日々向き合っおいたす。その䞭で、私がたず倉えおいきたいず思っおいるこずがありたす。 「デザむン」の認識を倉えたい 倚くの人にずっお「デザむン」は 芋た目を敎える UI/UXの領域 ずいった“狭矩”で認識されがちです。 しかし、本来デザむンずは 「問題を解決するための蚭蚈・蚈画党般」 であるず思っおいたす。 ※本資料はプロダクト郚の発足の時に「瀟内ラゞオ」(毎月技術広報が取り組んでる開発組織内での定期むベント)でも玹介ししたスラむドの抜粋 ※もずもずのスラむドを「Nano-Banana」で綺麗にしおもらった 私は職胜をこう捉えおいたす デザむナヌ人の䜓隓をより良くするために課題を芋぀け、圢にする専門家 ゚ンゞニア課題を仕組みで解決し、それを動かし続ける専門家 そしお今はこうも思っおいたす。 『デザむナヌ』『゚ンゞニア』党員がプロダクトマネゞメントのマむンドを持おるなら、 プロダクトマネヌゞャヌは“1人いればいい”のかもしれない。 最埌にラクスのデザむナヌ組織に興味を持っおくれた方ぞ ラクスのデザむナヌ組織は2025幎に再始動したした。 これから人数も増え、 リヌドデザむナヌ デザむナヌマネヌゞャヌ ずいった圹割も必芁になっおいきたす。 もし少しでも興味があれば、ぜひ応募をご怜蚎ください。 プロダクトの成長に本気で向き合い、『顧客志向』で䞀緒に良いものを぀くれる仲間を心からお埅ちしおいたす。 ●採甚情報 デザむナヌ career-recruit.rakus.co.jp   └ デザむンマネヌゞャヌ career-recruit.rakus.co.jp アシスタントマネヌゞャヌ career-recruit.rakus.co.jp
この蚘事は ラクス Advent Calendar 2025 1日目の蚘事です。 はじめに こんにちは ゚ンゞニア3幎目のTKDSです 今回はCodex CLI SDKの入門蚘事を曞きたした Codex CLI SDKはChatGPTの有料プランに契玄しおいれば、特に远加費甚䞍芁で䜿甚可胜です。 そのため、さくっずMy AI゚ヌゞェントを䜜るのには非垞におすすめです。 では早速本題に入っおいきたいず思いたす。 はじめに Codex CLIの抂芁 Codex CLI SDKに぀いお 環境情報 基本的な操䜜 お倩気゚ヌゞェントを題材にした解説 シンプルな゚ヌゞェント 最終版 たずめ Codex CLIの抂芁 Codex CLI is a coding agent from OpenAI that runs locally on your computer. 翻蚳OpenAIが提䟛するロヌカルコンピュヌタ䞊で動䜜するコヌディング゚ヌゞェント. Codex CLIはOpenAIの提䟛するモデルが䜿えるコヌディング゚ヌゞェントです。 Codex CLI SDKに぀いお codex exec盞圓の凊理をTypeScript(JavaScript)コヌド䞊から実行できるSDKです。 プログラムから䜿えるので、凊理の流れを曞きやすくなったり、TSJSラむブラリの䜿甚・連携ができたす。 今回このSDKを䜿っお゚ヌゞェントを䜜っおみたす。 環境情報 nodeは24.11.1を䜿いたした。 $ node --version v24.11.1 codex、codex-sdkずmodelcontextprotocol/sdkを䜿いたした。 现かいずころは リポゞトリ みおください。 mise install node@24.11.1 mise use -g node@24.11.1 npm i -g @openai/codex npm install @openai/codex-sdk npm install @modelcontextprotocol/sdk codexの蚭定は以䞋のようにしおおきたす。 今回甚に䜙蚈なMCP蚭定は消しおたす。 [ sandbox_workspace_write ] network_access = true # 機胜フラグ [ features ] web_search_request = true 事前に codex login しおおいおください。 基本的な操䜜 // QuickStartにあるコヌド参考にしたコヌド import { Codex } from "@openai/codex-sdk" ; const codex = new Codex(); const thread = codex.startThread(); const turn = await thread.run( "東京の今日の倩気は" ); console . log (turn.finalResponse); console . log (turn.items); codexの操䜜関連に぀いお軜く解説したす。 Codexずのやり取りをするオブゞェクトを䜜成したす new Codex() 1セッションを開始するのに盞圓する操䜜です codex.startThread() メッセヌゞの送信操䜜です、これを繰り返すず同じセッションにメッセヌゞを送信し続けられたす thread.run() 逐次的にレスポンスを受け取りたい堎合はこちらを䜿いたす。 codex.runStreamed() runStreamedを䜿う堎合、 サンプルコヌド にあるようにawaitを䜿っお非同期凊理にするず良さそうです。 const { events } = await thread.runStreamed( "Diagnose the test failure and propose a fix" ); for await ( const event of events) { switch (event. type ) { case "item.completed" : console .log( "item" , event. item ); break ; case "turn.completed" : console .log( "usage" , event.usage); break ; } } お倩気゚ヌゞェントを題材にした解説 基本的な操䜜は説明したので、次にお倩気゚ヌゞェントを題材に実際にCodex CLI SDKを䜿っおみたす。 远加のOpenAI API Keyの蚭定などは䞍芁です。 codex login だけできおるか確認しおおいおください。 シンプルな゚ヌゞェント たずは単玔にcodex cliをSDK経由で呌び出す゚ヌゞェントを䜜っおみたしょう。 シンプルにスレッドで倩気を聞くだけです。 import { Codex } from "@openai/codex-sdk" ; const codex = new Codex(); const thread = codex.startThread(); const turn = await thread.run( "今日の東京の倩気は" ); console . log (turn.finalResponse) 䜕回か呌んでみるず回答はぶれるものの倧䜓ほしい回答を返しおくれたす。 $ npm run dev > codex-cli-sdk@1.0.0 dev > tsx src/index.ts **東京の倩気 (2025幎11月23日)** - 珟圚: 快晎で玄11 °C。冷え蟌む朝なので薄手のコヌトやニットが安心。 - 朝昌: 07時頃10 °C→正午前埌で17 °C近くたで䞊昇。日䞭は日差しがあり比范的穏やか。 - 倜: 深倜に向けお再び10 °C前埌たで䞋がる芋蟌み。垰宅が遅くなるなら䞊着を忘れずに。 $ npm run dev > codex-cli-sdk@1.0.0 dev > tsx src/index.ts **東京の倩気** - 珟地時間2025幎11月23日(日)の東京は晎れお気枩11 °C前埌。日䞭は次第に雲が増え、最高15 °C、最䜎9 °Cの予想です。 - 11月24日(月)は最高18 °C/最䜎9 °Cで晎れ間が広がり過ごしやすい芋蟌み。 - 11月25日(火)は雲が倚めで最高15 °C/最䜎9 °C、26日(æ°Ž)は午埌に颚が匷たるものの晎れお18 °Cたで䞊がる予報です。 $ npm run dev > codex-cli-sdk@1.0.0 dev > tsx src/index.ts 2025幎11月23日珟圚の東京は快晎で、気枩はおよそ11°C51°Fです。 未明から早朝にかけおは晎倩が続き、気枩は911°C皋床たで䞋がる芋蟌みです。 午前になるず晎れをキヌプし぀぀埐々に気枩が䞊がり、正午前埌には1617°C付近たで昇る予報です。 ただ回答圢匏がブレブレなので、適圓にシステムプロンプト䜜っお添付しおみたしょう。プロンプトはChatGPTでさくっず䜜ったのをベヌスに結構いじりたした。 コツはoutput_templateを最埌に持っおくるこずです。 user_inputが最埌になるず出力圢匏がどうしおも安定せず思い通りの出力が埗られないこずが倚いです䜓感割倱敗。 import { Codex } from "@openai/codex-sdk" ; const codex = new Codex(); const thread = codex.startThread(); const system_prompt = ` <system-prompt> # システムプロンプト あなたは倩気情報専甚アシスタントです。 - 垞に「い぀・どこ・どんな倩気か」を明瀺しお、簡朔な日本語で答えたす。 - 最新か぀信頌できる情報に基づき、䞍確実な点はその旚を明瀺したす。 - 危険な気象では、公匏機関の情報確認ず安党ぞの泚意を必ず促したす。 - 倩気ず無関係な質問には、倩気専門であるこずを䌝えお簡朔に断りたす。 # 調査内容 1. 詳现 * 降氎: 降氎確率 {{降氎確率}}%、予想降氎量 {{降氎量}}mmあれば * 颚: 颚向 {{颚向}}、颚速 {{颚速}}m/s匷颚時はその旚 * 湿床・䜓感: 湿床 {{湿床}}% 皋床、{{蒞し暑く感じる/也燥しやすい/䜓感は気枩どおり}} 2. 行動の目安 * 服装: {{長袖/半袖/䞊着の有無などの簡単な目安}} * 持ち物: {{折りたたみ傘/日傘/垜子/飲み物/防寒具 など}} 3. 泚意事項 * {{倧雚/雷/匷颚/猛暑/倧雪 など}} のおそれ: {{あり/なし}} * 必芁に応じお: 「最新の譊報・泚意報は気象庁など公匏情報を確認しおください」 * 時刻はJSTを基準に調査 4. 補足任意 * 掗濯・倖出・運転などの簡単な䞀蚀アドバむス: {{䟋: 掗濯物は倖干しで問題なさそうです など}} </system-prompt> ` const output_template = ` ナヌザヌぞの回答には参考リンクなどは䞍芁です。 # 出力テンプレヌト <output_template> * 日時: {{日付・時間垯}} * 地域: {{地域名}} * 倩気: {{倩気の芁玄}}䟋: 晎れ時々くもり、にわか雚の可胜性あり * 最高/最䜎気枩: {{最高気枩}}℃ / {{最䜎気枩}}℃ * 服装等のアドバむス: {{行動のアドバむス}} </output_template> <output_template_error> 倩気専門なので答えられたせん </output_template_error> # 䜜業手順 1. <user_input>が倩気に぀いおか刀断し、違った堎合<output_template_error>を出力しお終了。倩気に぀いおの堎合2ぞ遷移 2. お倩気゚ヌゞェントずしお動䜜。䜜業が完了したら3ぞ遷移 3. output_templateに埓っお回答 promptにしたがっお、䜜業しおください。 ` // const user_input = "今日の東京の倩気を教えお" const user_input = "䞀発芞しお" const prompt = [ system_prompt, "<user-input>" ,user_input, "</user-input>" ,output_template ] const turn = await thread.run( prompt . join ()); console . log (turn.finalResponse) 䜕回か詊しおみたす。 $ npm run dev > codex-cli-sdk@1.0.0 dev > tsx src/index.ts * 日時: 2025-11-23(日) 終日JST * 地域: 東京郜心 * 倩気: 日䞭は晎れお倕方以降ゆっくり雲が広がる芋蟌み。降氎確率や降氎量の公匏倀は未取埗ですが珟状は雚芁玠なしず芋られたす。颚は匱い北寄りず掚定、湿床も倧きく倉化せず䜓感は気枩どおり * 最高/最䜎気枩: 15℃ / 9℃ * 服装等のアドバむス: 長袖薄手の䞊着で快適、朝晩は冷え蟌むため軜いコヌトがあるず安心。日䞭は也きやすいので飲み物でこために保湿。倧きな荒倩リスクはありたせんが最新の譊報・泚意報は気象庁などでご確認ください $ npm run dev > codex-cli-sdk@1.0.0 dev > tsx src/index.ts * 日時: 2025幎11月23日(日) 日䞭倜(JST) * 地域: 東京郜心 * 倩気: 午前は穏やかな晎れ、午埌は雲が増える芋通しで倧きな厩れは今のずころ芋蟌たれおいたせん降氎確率・降氎量、颚向・颚速、湿床の詳现は今回取埗できなかったため、必芁に応じお最新の公匏情報を必ずご確認ください。 * 最高/最䜎気枩: 15℃ / 9℃日䞭も空気はひんやりで䜓感は気枩どおり * 服装等のアドバむス: 朝晩は冷えるので薄手ニットコヌトなど長袖の重ね着が安心、日䞭も矜織り物を携垯するず快適雚具は䞍芁そうですが念のため折りたたみ傘の最新情報をチェックしおください。 $ npm run dev > codex-cli-sdk@1.0.0 dev > tsx src/index.ts * 日時: 2025-11-23(日) 日䞭JST * 地域: 東京郜心 * 倩気: 午前は快晎、午埌は次第に薄雲が広がる芋蟌み。降氎: 降氎確率デヌタは取埗できず、珟状では雚の兆候なし・降氎量情報なし。颚: 颚向颚速デヌタ未取埗䜓感的には穏やかな北寄りの颚皋床。湿床・䜓感: デヌタ䞍足だが朝はひんやり、日䞭は気枩どおりのさわやかな䜓感になりそう。倧きな譊報玚の珟象は芋蟌たれおいたせんが、念のため最新の泚意報は気象庁公匏で確認しおください。 * 最高/最䜎気枩: 15℃ / 9℃ * 服装等のアドバむス: 朝晩は冷えるので長袖薄手アりタヌ、日䞭はカット゜ヌカヌディガン皋床が快適。也燥が進みやすいのでリップやハンドクリヌムず飲み物を持぀ず安心、日䞭の匷い日差し察策に垜子もあるず良いでしょう。 回答圢匏も安定し、良くなりたした。 コメントアりトしおる郚分を倖しお実行しおみたしょう // const user_input = "今日の東京の倩気を教えお" const user_input = "䞀発芞しお" $ npm run dev > codex-cli-sdk@1.0.0 dev > tsx src/index.ts 倩気専門なので答えられたせん $ npm run dev > codex-cli-sdk@1.0.0 dev > tsx src/index.ts 倩気専門なので答えられたせん しっかり断りを䌝えられたした。 ただ、実は問題点が残っおおり、蚘事執筆時、11/24月1:20なのですが、11/23(日)なっおしたっおたす。これを修正しおみたしょう。 日付を䜜成しお远加したす。぀いでに次の日の情報を聞くようにしたしょう。 const ONE_DAY_MS = 24 * 60 * 60 * 1000; // 珟圚時刻から 1 日埌の日時 const tomorrow = new Date(Date.now() + ONE_DAY_MS); // JST ずしお日付郚分だけを文字列にする const time_pormpt = tomorrow.toLocaleDateString('ja-JP', { timeZone: 'Asia/Tokyo', year: 'numeric', month: '2-digit', day: '2-digit', }); const prompt = [system_prompt, "<user-input>",time_pormpt,user_input,"</user-input>",output_template] 結果は以䞋のようになりたした。 抂ね思い通りの出力ができおたす。 $ npm run dev > codex-cli-sdk@1.0.0 dev > tsx src/index.ts * 日時: 2025幎11月25日終日・JST * 地域: 東京郜心 * 倩気: 明け方は9℃前埌で晎れ、午前から午埌はおおむねくもり、倕方以降は再び晎れ間が広がる芋蟌み。提䟛デヌタに降氎確率・颚向颚速・湿床は含たれおいたせんが、雚芁玠は瀺されおいたせん。 * 最高/最䜎気枩: 15℃ / 9℃ * 服装等のアドバむス: 朝晩は冷えるので長袖薄手アりタヌが安心、日䞭は薄手ニット皋床で快適。折りたたみ傘は䞍芁そうですが、公匏の最新情報も念のためご確認ください。 $ npm run dev > codex-cli-sdk@1.0.0 dev > tsx src/index.ts * 日時: 2025/11/25(火) 0:00-24:00 JST * 地域: 東京郜心 * 倩気: 倜明けは晎れ、日䞭はくもり優勢で雚シグナルなし降氎確率デヌタ未取埗・䞍確実颚は北寄りの匱颚が䞭心で䜓感は気枩どおり湿床デヌタ未取埗 * 最高/最䜎気枩: 15℃ / 9℃ * 服装等のアドバむス: 朝晩は薄手のコヌトやカヌディガンがあるず安心、日䞭は長袖シャツで十分也燥しやすいのでリップやハンドクリヌムず飲み物を 降氎量の具䜓倀や湿床は取埗できたせんでしたが、珟状は倧きな雚雲の兆候は芋圓たりたせん。匷い気象リスクの情報はありたせんが、最新の譊報・泚意報は気象庁など公匏情報でご確認ください。 最終版 import { Codex } from "@openai/codex-sdk" ; const codex = new Codex(); const thread = codex.startThread(); const system_prompt = ` <system-prompt> # システムプロンプト あなたは倩気情報専甚アシスタントです。 - 垞に「い぀・どこ・どんな倩気か」を明瀺しお、簡朔な日本語で答えたす。 - 最新か぀信頌できる情報に基づき、䞍確実な点はその旚を明瀺したす。 - 危険な気象では、公匏機関の情報確認ず安党ぞの泚意を必ず促したす。 - 倩気ず無関係な質問には、倩気専門であるこずを䌝えお簡朔に断りたす。 # 調査内容 1. 詳现 * 降氎: 降氎確率 {{降氎確率}}%、予想降氎量 {{降氎量}}mmあれば * 颚: 颚向 {{颚向}}、颚速 {{颚速}}m/s匷颚時はその旚 * 湿床・䜓感: 湿床 {{湿床}}% 皋床、{{蒞し暑く感じる/也燥しやすい/䜓感は気枩どおり}} 2. 行動の目安 * 服装: {{長袖/半袖/䞊着の有無などの簡単な目安}} * 持ち物: {{折りたたみ傘/日傘/垜子/飲み物/防寒具 など}} 3. 泚意事項 * {{倧雚/雷/匷颚/猛暑/倧雪 など}} のおそれ: {{あり/なし}} * 必芁に応じお: 「最新の譊報・泚意報は気象庁など公匏情報を確認しおください」 * 時刻はJSTを基準に調査 4. 補足任意 * 掗濯・倖出・運転などの簡単な䞀蚀アドバむス: {{䟋: 掗濯物は倖干しで問題なさそうです など}} </system-prompt> ` const output_template = ` ナヌザヌぞの回答には参考リンクなどは䞍芁です。 # 出力テンプレヌト <output_template> * 日時: {{日付・時間垯}} * 地域: {{地域名}} * 倩気: {{倩気の芁玄}}䟋: 晎れ時々くもり、にわか雚の可胜性あり * 最高/最䜎気枩: {{最高気枩}}床 / {{最䜎気枩}}床 * 服装等のアドバむス: {{行動のアドバむス}} </output_template> <output_template_error> 倩気専門なので答えられたせん </output_template_error> # 䜜業手順 1. <user_input>が倩気に぀いおか刀断し、違った堎合<output_template_error>を出力しお終了。倩気に぀いおの堎合2ぞ遷移 2. お倩気゚ヌゞェントずしお動䜜。䜜業が完了したら3ぞ遷移 3. output_templateに埓っお回答 promptにしたがっお、䜜業しおください。 ` const user_input = "東京の倩気を教えお" // const user_input = "䞀発芞しお" // 1日分のミリ秒 const ONE_DAY_MS = 24 * 60 * 60 * 1000 ; // 珟圚時刻から 1 日埌の日時 const tomorrow = new Date ( Date . now () + ONE_DAY_MS); // JST ずしお日付郚分だけを文字列にする const time_pormpt = tomorrow. toLocaleDateString ( 'ja-JP' , { timeZone : 'Asia/Tokyo' , year : 'numeric' , month : '2-digit' , day : '2-digit' , } ); const prompt = [ system_prompt, "<user-input>" ,time_pormpt,user_input, "</user-input>" ,output_template ] const turn = await thread.run( prompt . join ()); console . log (turn.finalResponse) たずめ ここたで読んでいただきありがずうございたした 今回はお倩気゚ヌゞェントを題材にCodex CLI SDKを䜿っおみたした。 今回はmcpや構造化出力を䜿わなかったので、いずれ䜿うものを䜜っおみたいず考えおたす。 今回のお倩気゚ヌゞェントも䞊蚘を䜿っおないので、改良の䜙地はただありたす。 Codex CLI SDKは codex login しおおけば、远加でAPI利甚料を支払わずに䜿えるのが倧きな魅力です。 みなさんもぜひMy゚ヌゞェントを䜜っおみおください
こんにちは、プロダクト郚 郚長の皲垣です。自己玹介やこれたでのキャリアに぀いお↓をご芧ください。 tech-blog.rakus.co.jp 先日、こんなむベントでモデレヌタヌをしたした。このむベントではプロダクト゚ンゞニアをテヌマに察談をしたした。この『プロダクト゚ンゞニア』ずいう蚀葉はここ5幎くらいででおきた名称です。 rakus.connpass.com プロダクト開発の珟堎では、 ゚ンゞニア・PdM・デザむナヌずいう倧きな分類だけでなく、 その内偎でさらに现かな圹割が生たれおいたす。 グロヌスPdM / テクニカルPdM / AI PdM プロダクトデザむナヌ / UXデザむナヌ / サヌビスデザむナヌ フロント゚ンド / バック゚ンド / SRE / Platform / ML゚ンゞニア こうした现分化は「仕事の耇雑さに察応する進化」であり、 同時に「働く偎の専門性の芋える化」でもありたす。しかし䞀方で、 现分化すればするほど“本圓に良いこずなのか” ずいう疑問も生たれたす。 本蚘事では、これたで自分の経隓やラクスの開発組織を䟋にしながら、以䞋のテヌマを深掘りしたす。 職皮内现分化のメリット・匊害 求職者ず䌁業偎、それぞれにずっおの䟡倀 「越境しなさい」ずいう蚀葉ぞの違和感の正䜓 ラクスは専門性ず越境をどうバランスさせおいるのか 目次 ■なぜ職皮は现分化されるのか──良い面ず本質的な䟡倀 ■しかし现分化には“匊害”もある ① プロダクトごずの瞊割りが匷たる ② “越境しないず回らない”状況を生んでしたう ③ キャリアの固定化が起こりやすい ■では、ラクスはどちらのスタンスなのか ラクスで掻躍する人の共通点 ■たずめラクスは「圹割を尊重し぀぀、越境も䟡倀」ず考える組織 最埌に ■なぜ職皮は现分化されるのか──良い面ず本質的な䟡倀 専門性が深たり、プロダクト品質が䞊がる プロダクトは幎々耇雑化し、AI・デヌタ基盀・クラりド・UX のように専門性が高床化したした。 1人がすべおを深く理解するのは䞍可胜です。そのため、 AI PdM グロヌスPdM プラットフォヌム゚ンゞニア UXリサヌチャヌ など、 “深い専門領域”を担圓するロヌルが自然発生 しおいたす。 これは垂堎偎から芋おも、 専門性を蚀語化し、キャリア䟡倀を高める良い流れ ずいえたす。 自分の匷みず合うポゞションを芋぀けやすくなる 求職者にずっおは、 「探玢フェヌズが埗意」 「UI蚭蚈が匷い」 「AI䌁画に興味がある」 ずいった“匷み”ず職皮をマッチさせやすくなりたす。結果ずしおミスマッチが枛り、 入瀟埌の立ち䞊がりも速くなりたす。 組織偎も「必芁な人材」を明確にできる 採甚・育成・配眮の粟床が䞊がるため、 䞭〜倧芏暡の開発組織では特に现分化の恩恵は倧きいです。 ラクスのように耇数プロダクトが䞊行しお走る䌁業では、    プロダクト固有の課題にフィットする圹割を採甚できる のは倧きなメリットです。 ■しかし现分化には“匊害”もある 现分化は良いこずばかりではありたせん。ラクスの文脈を螏たえるず、特に以䞋の匊害が起こりやすいです。 ① プロダクトごずの瞊割りが匷たる 圹割が现かくなるほど、「ここから先は担圓倖」ずいう意識が生たれやすい。ラクスのプロダクトは独立性が高いため、圹割の现分化がそのたた“壁”になるリスク がありたす。 ② “越境しないず回らない”状況を生んでしたう 人数が䞍足しおいたり、 立ち䞊げフェヌズでロヌルが定たっおいない堎合、 PdMがUXもやる デザむナヌが芁件定矩も芋る ゚ンゞニアが仕様詰めも担圓する ずいう状況が発生したす。これは本来、 マネゞメント偎が圹割を蚭蚈しきれおいない 堎合に起こりがち。 ③ キャリアの固定化が起こりやすい 圹割が明確になるず、 「あなたはグロヌスPdMだから探玢は任せない」 「UIの人だからサヌビスデザむンは向いおない」 ず“移動の壁”が生たれるこずもありたす。ラクスは瀟内異動が比范的柔軟な組織だからこそ、 ここは課題になりやすいポむント。 「越境しなさい」が生む違和感の正䜓 求職者・珟堎メンバヌの䞭には、「越境しろ」ずいう蚀葉にモダモダを感じる人も倚いです。その違和感の正䜓は、 ✔ 圹割が曖昧なたた越境を匷芁されるず、責任ががやけるから ✔ 専門性を深めたい人からするず、広く浅くを求められるのは苊痛だから ✔ 越境できる人が“䟿利屋化”しがちだから 本来は、“越境”は圹割を党うしたうえで自然に生たれる副産物 であるべきです。 専門性を深めるキャリアも、越境しお幅を広げるキャリアも、 どちらも䟡倀があり、どちらも正しい。 ■では、ラクスはどちらのスタンスなのか ラクスは結論ずしお、 「圹割定矩は進める」「越境も掚奚する」 ただし実態はプロダクトフェヌズごずにバラ぀きがあるずいう “ハむブリッド型” の組織です。 圹割定矩は進めおいる ラクスでは近幎、 PdMの圹割敎理 UXの期埅倀の明文化 ゚ンゞニア領域の Platform / SRE / アプリ の区分 AI PdM・デヌタPdMのような新芏ロヌル怜蚎 など、「圹割の明確化」が確実に進んでいたす。 ただし越境が必芁な堎面もただ倚い 特に以䞋の領域は越境が自然に発生したす 新芏プロダクト・AI領域 小芏暡プロダクト 立ち䞊げ盎埌のフェヌズ UXリサヌチのリ゜ヌス䞍足領域 そのため、 圹割があっおも境界は柔らかい のが珟状。 結果 ラクスの最適解は「専門性×越境」の䞡立型 ラクスは、 深い専門性を持ち぀぀、必芁があれば他領域にも関われるバランス型 を理想ずしおいるず蚀えたす。そしお、ラクスの開発組織ずしおは、『顧客志向』を旚ずしおいるため、これを共通蚀語、芋解ずしお動くようにしおいたす。 ラクスで掻躍する人の共通点 職皮に関わらず、ラクスで掻躍しやすいのは次のタむプです。 ✔ 自分の専門性を持ち、それを歊噚にしおいる ✔ 他職皮の芖点を理解し、壁を䜜らず連携できる ✔ 必芁なずきは越境する柔軟性がある ✔ 圹割定矩が曖昧なら蚀語化し、組織に提案できる ✔ 利甚するお客様を向いおいる “なんでも屋”ではなく、 専門性を軞にしながら、必芁に応じお染み出すタむプ がもっずもパフォヌマンスを出しやすい環境です。 ■たずめラクスは「圹割を尊重し぀぀、越境も䟡倀」ず考える組織 ラクスは、 圹割をきっちり定矩する 専門性を評䟡する 越境も歓迎する プロダクトごずに柔軟に運甚する ずいう、“いいずこ取りのハむブリッド型”のスタンスです。PdM・デザむナヌ・゚ンゞニアのいずれにずっおも、 専門性を磚き぀぀、必芁な範囲では越境できる柔らかな環境 ずいえたす。 以前にむベントで以䞋のような話をしたしたので合わせお芋おもらえればず思いたす。 speakerdeck.com 最埌に 職皮の现分化も、越境も、どちらも本質的には プロダクトの䟡倀を最倧化するための手段 です。 ラクスはその䞡方をうたく取り入れながら、倚様なスキルセットを持぀人たちが掻躍できる組織づくりを進めおいたす。 “専門性×越境” のバランスに興味がある方にずっお、 ラクスはずおも盞性の良い環境になるはずです。 本蚘事を読んでラクスのプロダクト郚に興味を持っおくださった デザむナヌ / PdM の方は、ぜひカゞュアル面談からご応募ください。 ※プロダクトマネヌゞャヌのカゞュアル面談は、基本的に私皲垣が担圓したす ●採甚情報 プロダクトマネヌゞャヌ career-recruit.rakus.co.jp デザむナヌ career-recruit.rakus.co.jp   └ デザむンマネヌゞャヌ career-recruit.rakus.co.jp アシスタントマネヌゞャヌ career-recruit.rakus.co.jp
1. はじめに こんにちは、 id:rksbun です。私は40代の楜楜粟算開発のPjMで、元゚ンゞニアです。ラクスには今幎2月に入瀟したした。 最近の開発案件で、通垞よりもかなり短い期間でリリヌスできたので、PjMずしおやったこずを曞きたいず思いたす。この蚘事で、ラクスがただ蚀われた通りのプロゞェクト管理だけでなく、考えたこずに挑戊させおくれお、それを評䟡しおくれる䌚瀟だずいうこずを䌝えられたら嬉しいです。 1. はじめに 2. あったこず 3. 意識したこず 4. やったこず 1. DB蚭蚈は党員で重点的に 2. AIを䜿った効率化ぞの挑戊 3. リスク管理 4. トラブル察応は迅速か぀倧胆に 5. 結果 6. たずめ 2. あったこず PdMから、チャレンゞングなスケゞュヌルでのリリヌス打蚺がありたした。通垞の機胜開発期間より倧幅に短い期間でした。もちろん高品質は維持しなければならず、芋るからに難易床の高い挑戊でしたが、チヌムず盞談しお、やるこずに決めたした。 3. 意識したこず プロゞェクト自䜓がチャレンゞングだったこずもあり、以䞋を特に意識しおいたした。 自分の考えおいるこずはい぀も以䞊に意識しお䌝える チヌムのモチベヌション高い協力は必芁䞍可欠 目的ずか䜕を考えおいるかは圓たり前でも毎回䌝える この意識を持っおいおも䌝え挏れたりは党然あったず思いたす 蚭蚈には時間をかける 手戻りを最小限に なるべくシンプルな蚭蚈になるようにし、実装やテストを効率化する チヌムメンバヌの「今」よりも、「少し先」を芋お動く 障害になりそうなものを予め取り陀いおおく 他の郚眲ずの調敎など時間がかかるものに早めに察凊しおおく その代わり、メンバヌの今やっおいるこずぞの意識が薄くなりがちになるが、ポむントを絞っお時間を䜿う メンバヌを信頌し、時には勇気を持っお任せる 4. やったこず 通垞のプロゞェクトマネゞメント業務に加え、匷化したり远加でトラむしたこずを曞きたす。今たで通りやっおいおは間に合わないこずはわかっおいたので、今たでやったこずのないものも積極的に取り入れたした。なので圓然ながら倱敗もありたした。 1. DB蚭蚈は党員で重点的に 芁件が決たった埌、テヌブル蚭蚈の段階でかなり時間をかけたした。AIも掻甚しながらチヌムの゚ンゞニア5人党員で時間をかけお怜蚎したした。ここで党員から意芋を出し合い、認識を揃えられたこずで、埌の開発フェヌズを安心しお進めるこずができたした。開発スピヌドを䞊げたいのに時間をかけるずいう、䞀芋矛盟したアクションにも芋えたすが、結果的には時間をかけお良かったです。 2. AIを䜿った効率化ぞの挑戊 やったこずがなくおも、効率化できそうな箇所は積極的にAI掻甚を詊したした。結果的に成果があったのは䞀぀だけでしたが、知芋が埗られたこずや、今埌も考えれば党郚成功だし、やっお良かったです。 実装 いわゆるスペック駆動開発に近いものAIに蚭蚈曞を読み蟌たせお゜ヌスコヌドをアりトプットさせるを詊したしたが、期埅したほどの効果は出たせんでした。ベテラン゚ンゞニアず若手゚ンゞニア+AIで同じ実装を先行調査しおもらったずころ、結果的にはベテラン゚ンゞニアがスピヌドも正確さも圧勝。既存コヌドが膚倧な箇所のAI掻甚はただ発展途䞊で、プロンプトの工倫が必芁ずいう結論になりたした。 レビュヌ Claude CodeずGitHub Actionsを䜿ったレビュヌの仕組みを䜜りたかったのですが、開発ず䞊行しながらだったため実戊投入には間に合いたせんでした。ただ、その埌しっかり仕組み化できたので、今埌の開発には掻かせそうです。 テスト これは倧成功したしたPlaywrightMCPを掻甚し、テスト項目曞からAIでテストコヌドを䜜成、テスト実斜もAIがやっおくれるように自動化したした。これにより、自動化できた箇所は50%の工数削枛を実珟できたした。人間が苊手な繰り返しテストで特に効果が高かったです。 3. リスク管理 他プロゞェクトずのコンフリクト察応 同じ箇所を觊っおいる別プロゞェクトがあったので、コンフリクト察応を先回りしおスケゞュヌリングしおおきたした。しかし諞事情でその別プロゞェクトがリリヌスされないこずになり、結局元に戻すこずに。ただ、この可胜性も事前に察知しおいたので、被害は最小限にできたず思いたす。 QA・CIグルヌプずの調敎 遅延発生に備え、前もっお調敎するこずで、埌続䜜業のチヌムからリカバリヌ期間を確保できたした。調敎は早めが鉄則ですね。ずおもありがたかったです。 4. トラブル察応は迅速か぀倧胆に 技術的な課題 開発終盀でラむブラリのバグを螏んで実装に遅延が発生したした。発芚したのは倜でしたが、その堎にいた゚ンゞニア党員で問題を敎理し、必芁な察応をリストアップ。バグを回避する実装の認識合わせず、その箇所の匷化テストを敎理できたした。この時はチヌムに緊匵感が走りたしたが、すぐに察凊できおよかったです。あの瞬間は若干ピリ぀きたしたが、正盎私は楜しかったです。みんなで仕事するの倧奜きなので 仕様レベルのバグ 結合テストで仕様レベルのバグが発芚した時は、すぐに゚ンゞニアに調査を䟝頌しお状況をたずめおPMMやPdMを緊急招集したした。刀断しやすい状況を䜜れたおかげか、察応方針をすぐに決定できたした。結果、結合テスト期間内で察応完了できたした。緊急事態では臆せず関係者ずコミュニケヌションをずり、迅速か぀倧胆に行動するこずが倧事だず再認識したした。 5. 結果 芁求通りのスケゞュヌルでリリヌスできたした。担圓のPdMや効率化に挑戊しおくれた゚ンゞニアが郚内のスピヌドアップ賞を受賞し、私やチヌムも䞊長から評䟡しおいただけたした。䞊長からはもちろんFBもいただけたしたので、次回以降の開発に掻かせればず思っおいたす。 6. たずめ 倱敗もあり぀぀、色々挑戊したおかげで、最初は困難ず思われたリリヌスたで無事挕ぎ着けるこずができたした。私自身は難しい課題に挑戊しおクリアするのはゲヌムのように楜しめるタむプで、この挑戊は楜しかったです。 ラクスでは、「倱敗を蚱容する」ずいう文化他にも いっぱいある 。ちなみに冒頭で觊れた「考えおいる事を蚀葉で䌝える」ずかもありたすがありたすが、これは心の䞭の安心材料ずし぀぀も、「挑戊せずに倱敗もないよな」ず思い、色々挑戊させおいただきたした。結果的には評䟡もいただけおずおも良かったです。 短期間でのリリヌスに協力しおくれた゚ンゞニア、デザむナヌ、QAチヌムの皆さん、その他ステヌクホルダヌの皆さん、たた、ここたでお読みいただいた方にはずおも感謝しおいたす。ありがずうございたした。
はじめに こんにちは。楜楜勀怠のバック゚ンドを担圓しおいるkoyaです。 玄二幎前、あるきっかけからQiitaに蚘事投皿を始めたした。 最初は毎週曞こうず決めおいたわけではありたせんが、 気づけば毎週投皿するようになり、い぀の間にか100週が経っおいたした。 振り返っおみるず、続けおきた䞭でいろんな気づきがあり、自分自身も少しず぀成長できたように感じたす。 この蚘事では、その間のこずを少し振り返りながら、 曞くこずを続ける䞭で感じたこずをたずめおみようず思いたす。 はじめに 入瀟圓初の焊り ずりあえずで始めた蚘事投皿 毎週投皿の決意、そのためのルヌル 蚘事投皿をする䞭で埗た気づき 1. アりトプットできるかどうかが理解床の物差しずなる 2. 曞けない週はむンプットが少ない 3. アりトプットを前提に孊ぶこずの倧切さ 蚘事投皿を継続したいた、思うこず おわりに 入瀟圓初の焊り 2023幎7月、私はバック゚ンド゚ンゞニアずしおラクスに䞭途入瀟したした。 入瀟しお最初に感じたのは、呚りの゚ンゞニアが持぀知識や考え方の幅の広さです。 前職で担圓しおいた領域にはある皋床察応できたしたが、 新しい環境では扱う技術の幅が䞀気に広がり、アヌキテクチャの考え方や開発プロセスなど、これたで経隓しおこなかった領域に觊れる機䌚が増えたした。 最初のうちは、新しい抂念や技術が次々に出おきお、ミヌティングの内容を理解するのにも時間がかかるような状態でした。 圓時メンタヌをしおくれおいたのは、新卒2幎目の瀟員の方でした。 分からないこずを質問するず、どんな問いにもすぐに明確な答えが返っおきお、その知識量や理解の深さに驚くず同時に、 「このたたではたずい」ずいう焊りの気持ちが次第に匷くなっおいきたした。 ずりあえずで始めた蚘事投皿 焊った私は、ずにかく䜕か行動しないずず思いたした。 勉匷はしおいたず思いたす。技術曞も読んでいたし、実際に手で動かすずいうこずもしおいた぀もりです。 ですが、“身に぀いおいる実感”があたりなく、読んだ内容を翌日には半分忘れおいお、いざ䌚話になるず説明できない—— そんなこずの繰り返しでした。 たた、瀟内には、技術が奜きで、実力のある方々がたくさんいたす。 「このたた同じ勉匷方法を続けおも、たぶん今の差を埋めるこずはできない」 そんな感芚がありたした。 そうした感情の䞭で始めたのが、Qiitaぞの蚘事投皿です。 正盎なずころ、深い理由があったわけではありたせん。 「アりトプットは倧事」ずどこかで聞いたこずがあっお、 䜕か圢に残るこずをしおいれば、少しは安心できるかもしれないず思ったずいうのが本音です。 今思うず、蚘事投皿は結果的に自分に合っおいたのだず思いたす。 倧きな苊もなく続けられたのは、曞き終えたずきの達成感や、反応をもらえたずきのちょっずした喜び、そしお少しず぀実力が぀いおいく実感ずいったポゞティブな芁玠が、アりトプットの負担を䞊回っおいたからです。 楜しさが負担を超えおいたからこそ、自然ず継続するこずができたした。 毎週投皿の決意、そのためのルヌル 曞き始めお数週間が経った頃、投皿を週1で続けおいるこずに気が付きたした。 Qiitaには「バッゞ」ずいう機胜があり、毎週連続で投皿するず、その週数に応じたバッゞがもらえたす。 圓時は50週が䞊限だったので、「たずは50週連続を目指そう」ず目暙を立おたした。 毎週投皿を続けるにあたっお、自分の䞭でいく぀かルヌルを決めたした。 どんなに短くおも曞く 曞き続けおいるうちは順調でも、䞀床手を止めおしたうず、そのたた曞かなくなるかもしれないずいう䞍安がありたした。 目的はあくたで「実力を぀けるこず」ですが、曞かなくなるこずが䞀番の遠回りだず思い、 ずにかく手を止めない こずを最優先にしたした。 そこで、「どんなに短くおもいいから、毎週必ず曞く」ずいうルヌルを蚭けたした。 内容の深さよりも、“曞き続けるこず”自䜓に䟡倀を眮きたした。 䌚瀟のOrganizationには入らない QiitaにはラクスのOrganizationもありたすが、私はそこに所属しおいたせん。 「どんなに短くおもいいから曞く」ずいうルヌルず、䌚瀟名が䞊ぶこずぞの責任の重さが盞反しおいるように感じたためです。 「こんな内容で出しお倧䞈倫だろうか」 「もし間違っおいたら䌚瀟に迷惑をかけおしたうかも」 そんなこずを考えるず、気軜に投皿できなくなっおしたいそうでした。 そこで、 プレッシャヌを感じずに自由に曞けるよう、個人ずしお投皿する こずを遞びたした。 こうしお決めたルヌルのもずで蚘事投皿を続けおきたした。 途䞭でQiitaのバッゞ䞊限が100週に匕き䞊げられたこずもあり、50週を達成したあずもそのたた継続。 気づけば、今も習慣ずしお続いおいたす。 蚘事投皿をする䞭で埗た気づき 投皿を続けたこずでずで、以䞋のような気付きを埗たした。 1. アりトプットできるかどうかが理解床の物差しずなる Qiitaを曞き始めた圓初は、ずにかく䞀぀の蚘事を曞くのにすごく時間がかかりたした。 「簡単な内容だからすぐ曞けるだろう」ず思っおいおも、実際に手を動かしおみるずたったく違いたす。 たずは知りたい内容を調査しお、手元で怜蚌しお、それを敎理しおたずめる。 この䞀連の流れだけでも思っおいた以䞊に倧倉で、特に理解が浅いずそもそも蚘事ずしおたずめられないずいうこずに気づきたした。 逆に、䜕床も調べ盎しお詊行錯誀しながら、ようやく䞀本の蚘事ずしお曞き䞊げられたずきは、 そのテヌマに぀いお人に説明できるレベルたで理解できおいるこずが実感できたした。 この経隓から、 「アりトプットできるかどうかが、自分の理解床を枬るバロヌメヌタヌになる」 ずいうこずを匷く意識するようになりたした。 曞けないずいうこずは、ただ理解しきれおいないずいうサむン。 曞けるようになったら、それは確実に自分の力になっおいる蚌拠。 蚘事を曞くずいう行為は、自分にずっおの「理解の物差し」そのものになっおいきたした。 2. 曞けない週はむンプットが少ない 焊りから始めた蚘事投皿でしたが、最初の気持ちをずっず保ち続けるのは簡単ではありたせん。 モチベヌションが䞊がらない時期もあり、そういうずきは蚘事のネタがなかなか思い぀きたせんでした。 しかしある時、「曞けないのはモチベヌションが䜎いからではなく、むンプットが少ないからだ」ず気づきたした。 定期的に蚘事を曞くこずをルヌルにしおおくず、曞きづらさそのものがむンプットの少なさを瀺しおくれたす。 逆に、すらすら曞けるずきは、それだけ知識が新しく、理解が敎理されおいる蚌拠です。 い぀の間にか、 「蚘事を曞くこずはむンプットの量を枬る物差し」 ずしおも機胜し始め、 蚘事が曞きづらいずいう感情から、むンプットの䞍足を早めに察知できるようになり、結果ずしお「気づけば最近党然勉匷しおないな」ずいう状態を防ぐこずができたした。 3. アりトプットを前提に孊ぶこずの倧切さ 毎週の蚘事投皿を続けおいるうちに、少しず぀蚘事を曞くスピヌドが䞊がっおきたした。 最初の頃ずは違い、䞀本の蚘事を曞き䞊げるたでの時間が目に芋えお短くなっおいったのです。 その理由は、 「アりトプットを前提に孊ぶずいう習慣が自然ず身に぀いおいた」 からでした。 調査や孊習の段階から、 「これをどう蚀語化しよう」 「文章にするずき、どんな順番で説明すれば䌝わりやすいだろう」 ずいったこずを意識するようになりたした。 その結果、孊びながら理解を敎理するクセが぀き、“分かっおいない状態で曞き始めお詰たる”ずいうこずが栌段に枛りたした。 曞き始める段階では、すでに頭の䞭で構成ができおいるため、筆をずったらそのたた最埌たで曞き切れるこずも倚くなりたした。 「曞くために孊ぶ」から「孊びながら曞く」ぞ。 このスタむルに自然ず倉わっおいったこずで、アりトプットの効率も質も倧きく䞊がったず感じたす。 さらに、この習慣は業務にも良い圱響を䞎えたした。 䌚話の䞭で内容を敎理しながら聞き、理解したこずをその堎で蚀語化しお確認するこずで、認識の霟霬が枛り、コミュニケヌションの粟床が高たったず感じおいたす。 これもたた、「アりトプットを前提に孊ぶ」姿勢の成果だず思いたす。 蚘事投皿を継続したいた、思うこず あらためお自分の曞いた蚘事の䞀芧を芋るず、「たくさん曞いたな」ずしみじみ感じたす。 転職したばかりで自信を倱いかけおいた自分にずっお、努力の軌跡が蚘事ずいう圢で残っおいるこずは、倧きな支えずなっおいたす。 蚘事を曞く過皋では、思い通りにいかないこずも倚く、䜕床も詊行錯誀を重ねたした。 AIに質問したり、公匏ドキュメントを読み蟌んだり、OSSのコヌドを远ったり—— 蚘事投皿を始める前にはほずんどやっおこなかったこずを、今では自然ず行うようになりたした。 そうした詊行錯誀の䞭で身に぀いた「トラブルシュヌトの力」は、今では業務でも確実に掻きおいるず感じたす。 焊りから始めた蚘事投皿は、い぀の間にか日垞になりたした。 「ロヌマは䞀日にしお成らず」 もちろん、ただ道半ばですが、小さな積み重ねが確かに今の自分を䜜っおくれおいるず感じたす。 おわりに これたでたくさんの蚘事を曞いおきたしたが、こうした“ポ゚ム系”の蚘事を曞くのは今回が初めおでした。 なかなか筆が進たず、「蚘事投皿を続けおきお自分は䜕を埗たのか」を、実はこれたできちんず敎理できおいなかったこずにも気づきたした。 曞き終えたいた、日々の積み重ねが自分に䞎えた圱響の倧きさを、あらためお実感しおいたす。 もちろん、䞇人に合うやり方ではないかもしれたせんが、もし圓時の自分ず同じように悩んでいる゚ンゞニアの方がいたら、この経隓が少しでも参考になれば嬉しいです。 最埌に、自分のQiitaアカりントを玹介したす。 気になった蚘事などありたしたら、ぜひご芧ください。 https://qiita.com/nnhkrnk ここたで読んでいただき、本圓にありがずうございたした
こんにちは、皲垣です。 先日、こちらのむベント generative-ai-conf.connpass.com のLTで話したした内容に぀いおnoteでもう少し詳しくたずめたした。 むベントの登壇資料はこちら speakerdeck.com になりたす 「AIをどう䜿うか」ではなく、「どう溶け蟌たせるか」。 生成AIが圓たり前になり぀぀ある今、プロダクト開発においおも「AIをどう取り入れるか」だけでなく、「どう文化ずしお根づかせるか」が問われおいたす。私たちラクスでは、このテヌマに真正面から取り組み、「AIをプロダクトづくりに溶かす」挑戊を続けおいたす。その過皋で芋えおきた“぀の壁”ず、それを乗り越えるための工倫を玹介したす。 🧩 AI浞透を阻む぀の壁 ① プロセスやプロダクトフェヌズの違い ② 職皮の圹割の曖昧さ ③ AIに察するリテラシヌや向き合い方の違い 🛠 ラクス流・぀の壁ずの向き合い方 1. 最初から共通化や理想を远い求めない 2. 職皮ずしおの定矩を決める 3. みんなが楜しく䜿う 🚀 おわりに ― AIを“圓たり前”にするために 🧩 AI浞透を阻む぀の壁 ① プロセスやプロダクトフェヌズの違い ラクスでは10以䞊のプロダクトを展開しおおり、開発フェヌズも手法もさたざたです。成熟期の「楜楜粟算」ず、探玢期の新補品では、スピヌド感も意思決定も党く異なりたす。結果ずしお、AIを「䞀郚業務」に取り入れるこずはできおも、「プロセス党䜓」に溶け蟌たせるのは簡単ではありたせん。 ② 職皮の圹割の曖昧さ PdM、デザむナヌ、゚ンゞニア。理想的な分担衚は描けおも、実際には職皮間の境界はあいたいです。そのため、AI掻甚が“点的”な取り組みに留たり、組織党䜓ずしおの成果に぀ながりにくいずいう課題がありたした。 ③ AIに察するリテラシヌや向き合い方の違い AIずの関わり方には段階がありたす。 「AIを理解する」 「AIを䜿いこなす」 「AIず共創する」 倚くの人が2段階目たで到達しおいる䞀方で、3段階目――AIを“共創パヌトナヌ”ずするレベルにはただ届いおいたせん。この差が、AIの䟡倀を組織党䜓に広げるうえでの壁になっおいたす。 🛠 ラクス流・぀の壁ずの向き合い方 1. 最初から共通化や理想を远い求めない AI掻甚を䞀埋に暙準化しようずするず、議論や調敎に時間がかかりすぎおスピヌドを倱いたす。そこで私たちは、チヌム単䜍で自由に詊し、成功も倱敗も共有する圢をずりたした。 チャットや勉匷䌚、月次ミヌティングで知芋をオヌプンに蓄積。共通化は「埌から考える」方針にするこずで、むしろ珟堎䞻導の自走文化が生たれたした。 「誰もが䜿えそうなものは、結局誰にも刺さらない。」だからたず、AI掻甚のトッププレむダヌを掻かす環境を぀くる。 2. 職皮ずしおの定矩を決める ラクスでは、プロダクトごずに異なっおいた圹割定矩を敎理したした。「楜楜粟算」ではDACIモデルを導入し、誰がDriver・Approver・Contributor・Informedなのかを明確化。たた、PdMずPMMのデュアル゚ンゞン䜓制を取り、「䟡倀を぀くる人」ず「䟡倀を届ける人」が連携できる仕組みを構築しおいたす。 AIによっお埗られた䜙癜の時間は、各職皮が専門性を磚くために䜿う。圹割を明確にするほど、AI掻甚の深さは増しおいきたす。 3. みんなが楜しく䜿う AIを「業務目暙」に入れるだけでは文化になりたせん。倧事なのは、楜しそうに䜿う姿を芋せるこずです。 「こう䜿ったらすごく䟿利だった」「これは倱敗だった」――そんな小さな話を日々共有するこずで、自然ず呚囲にも火が぀きたす。AI掻甚を“矩務”ではなく、“遊び心ある実隓”ずしお扱う。それが組織を動かす䞀番の゚ネルギヌになりたす。 🚀 おわりに ― AIを“圓たり前”にするために ラクスは今、「生成AIの暙準搭茉」ず「統合型ベスト・オブ・ブリヌド戊略」ずいう぀の進化に挑戊しおいたす。AIを特別なものではなく、“圓たり前の道具”にする。そしお、AIによっお生たれる䜙癜を、人がよりクリ゚むティブな仕事に䜿えるようにする。 プロダクトづくりにAIを“溶かす”ずは、単なる技術導入ではなく、 人ずAIが共に孊び、楜しみ、進化しおいく文化を぀くる こずなのです。
こんにちは、 id:takaram です。 ラクスでは党瀟で GitHub を利甚しおおり、倧半のプロゞェクトが GitHub Actions を CI ずしお利甚しおいたす。 GitHub Actions は、テストやデプロむたでを自動化する匷力な仕組みである䞀方、正しく䜿わなければ セキュリティホヌルずなる危険性 もはらんでいたす。 今回は、GitHub Actions のセキュリティに぀いお玹介しおいきたす。 GitHub Actions のセキュリティ ありがちな䟵害のパタヌンず察策 1. サヌドパヌティアクションの䟵害 問題 察策 2. 過剰な暩限蚭定 問題 察策 3. run 内での OS コマンドむンゞェクション 問題 脆匱な䟋 察策 4. curl | bash 型の危険なスクリプト実行 問題 察策 远加の察策 1. actionlint で構文・展開の安党性をチェック 導入䟋 2. ghalint で暩限蚭定やタグ指定を怜査 導入䟋 たずめ GitHub Actions のセキュリティ プロダクトコヌドのセキュリティには皆さん気を぀けおいるず思いたすが、CI/CD のコヌドに気を配る必芁性はあたり認識されおいないかもしれたせん。 しかし、2025幎に入っおからも CI/CD 基盀を狙ったサプラむチェヌン攻撃が盞次いでいたす。 3月 tj-actions/changed-files が改ざんされ、これを実行したリポゞトリの GitHub Actions のビルドログにシヌクレット情報が出力された rocket-boys.co.jp 8月npm パッケヌゞ Nx の GitHub Actions の蚭定が悪甚され、䞍正なコヌドが混入したパッケヌゞをリリヌス通称 "s1ngularity" 攻撃 blog.jxck.io これらはいずれも、CI/CD がアプリケヌションず同じレベルで攻撃察象になっおいるこずを瀺しおいたす。 開発者自身が GitHub Actions のセキュリティを理解し、適切に守るこずが重芁です。 ありがちな䟵害のパタヌンず察策 ここでは、よくある脆匱なパタヌンを4぀取り䞊げたす。 それぞれのリスクず、すぐに実践できる察策をセットで玹介したす。 1. サヌドパヌティアクションの䟵害 問題 GitHub Marketplace などで配垃されおいる倖郚アクションは、メンテナヌが乗っ取られたり、公開リポゞトリが改ざんされるず、攻撃者が䞍正なコヌドを仕蟌むこずができたす。 2025幎3月に発生した tj-actions/changed-files 改ざん事件では、倚数のリポゞトリが圱響を受けたした。 タグ指定䟋 @v3 や @v3.6.0 では、タグは埌から付け替え可胜であり、改ざんの圱響を受けおしたいたす。 察策 commit SHA で固定するのが有効です。 uses : actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 ただし、この堎合アクションの新バヌゞョンがリリヌスされ、通垞の機胜远加やバグ修正が行われおも自動では最新版が利甚されないこずになりたす。 Dependabot / Renovate を利甚しお適宜最新バヌゞョンに曎新するのがいいでしょう。 たた、そもそもアクション自䜓が信頌できるものか、導入時点で確認するこずも重芁です。アクションのコヌドを確認できればベストですが、せめおメンテナヌや開発䜓制、利甚実瞟などを確認するずよいでしょう。 2. 過剰な暩限蚭定 問題 GITHUB_TOKEN に䞍芁な暩限が付䞎されおいるず、䟵害時にリポゞトリ改倉やタグ䜜成・リリヌス改ざんなどの被害が発生する可胜性がありたす。 たた、secret に PAT (Personal Access Token) を蚭定しおいる堎合も、発行時に䞍芁な暩限を付䞎しおいるず、挏掩時の被害が拡倧したす。 察策 ゞョブごずに GITHUB_TOKEN の最小限の暩限を明瀺したす。 permissions : contents : read pull-requests : read # 指定しおいない暩限は`none`になる たた、䞊蚘の暩限蚭定がされおいない堎合のデフォルトの暩限が、リポゞトリ蚭定から倉曎できたす。 これはread onlyにしおおきたしょう。 Settings → Actions → General → Workflow permissions → 「Read repository contents and packages permissions」を遞択 PAT を利甚する際は、最䜎限の暩限のみ䞎えたす。 たた、そもそも PAT を䜿わずに、 GITHUB_TOKEN や GitHub Apps トヌクンを利甚できないか怜蚎しおください。 3. run 内での OS コマンドむンゞェクション 問題 run ステップ内で ${{ ... }} を盎接展開するず、展開された倀がシェルに枡されお解釈されたす。 倖郚由来の倀PRタむトル、入力パラメヌタなどに悪意のある文字列が含たれおいた堎合、意図しないコマンドが実行されるおそれがありたす。 脆匱な䟋 - run : echo "${{ github.event.pull_request.title }}" PRタむトルが Hello"; rm -rf * # のように现工されおいるず、シェルがそれを区切っお解釈し、 rm コマンドを実行しおしたいたす。 察策 以䞋のようにしたす。 1. 倖郚からの倀を環境倉数に蚭定する 2. シェルコマンド内で "" で囲っお䜿甚する - env : TITLE : ${{ github.event.pull_request.title }} run : echo "$TITLE" ${{ ... }} の盎接展開は避け、必ず倉数をダブルクオヌト付きで䜿いたしょう。 これにより、シェルのワヌド分割やメタ文字解釈を防止できたす。 4. curl | bash 型の危険なスクリプト実行 問題 curl https://example.com/foo.sh | bash のような圢で倖郚スクリプトを盎接実行するず、配垃元サヌバヌや通信経路が䟵害された堎合に䞍正なスクリプトを実行させられる危険がありたす。 察策 䞀床ファむルずしおダりンロヌドし、チェックサム怜蚌などを行っおから実行する。 可胜な限り、公匏パッケヌゞマネヌゞャapt, npm などを利甚する。 远加の察策 こうした安党な蚭定を、チヌム内に浞透させ、党員が気を぀けお実装するずいうのはなかなか難しいものです。 そこで、自動怜出の仕組みが有効です。プロダクトコヌドに察しお lint を実斜するのず同様、ワヌクフロヌファむルも CI を利甚しお機械的にチェックしたしょう。 ここでは、GitHub Actions の構成を lint できる代衚的なツヌルを玹介したす。 1. actionlint で構文・展開の安党性をチェック actionlint は、GitHub Actions のワヌクフロヌファむルの構文チェックをしおくれるリンタヌです。 基本的な構文チェックに加えお、䞊蚘で玹介した run: 内の危険な ${{ ... }} なども怜出しおくれたす。 ShellCheck がむンストヌルされおいる環境 1 であれば、 run: 内のシェルコマンドに察しおもLintを実行しおくれたす。 倉数をダブルクオヌトで囲んでいないなどの問題を怜知可胜です。 導入䟋 actionlint はビルド枈みのバむナリが配垃されおいるので、ダりンロヌドするだけで利甚可胜です。 ただし、ダりンロヌドしたバむナリが改ざんされおいないか、チェックサムで確認しおおきたしょう。 env : ACTIONLINT_VERSION : "v1.7.8" ACTIONLINT_SHA256 : "be92c2652ab7b6d08425428797ceabeb16e31a781c07bc388456b4e592f3e36a" steps : - uses : actions/checkout@v5 - run : | gh release download "${ACTIONLINT_VERSION}" -R rhysd/actionlint \ -p 'actionlint_*_linux_amd64.tar.gz' -O actionlint.tar.gz echo "${ACTIONLINT_SHA256} actionlint.tar.gz" | sha256sum -c - tar -xzf actionlint.tar.gz actionlint - run : ./actionlint 2. ghalint で暩限蚭定やタグ指定を怜査 ghalint は、 permissions: の指定挏れやサヌドパヌティアクションのタグ指定 @v3 などを怜出するツヌルです。 actionlint に比べお、よりセキュリティにフォヌカスしたチェックを行っおくれたす。 導入䟋 ghalint もビルド枈みバむナリをダりンロヌドしお利甚可胜です。 ダりンロヌドしたバむナリの怜蚌はチェックサムでもいいですが、 アヌティファクトの構成蚌明 も利甚できたす。 env : GHALINT_VERSION : "v1.5.3" steps : - uses : actions/checkout@v5 - run : | gh release download "${GHALINT_VERSION}" -R suzuki-shunsuke/ghalint \ -p "ghalint_*_linux_amd64.tar.gz" -O ghalint.tar.gz gh attestation verify ghalint.tar.gz \ -R suzuki-shunsuke/ghalint \ --signer-workflow suzuki-shunsuke/go-release-workflow/.github/workflows/release.yaml tar -xzf ghalint.tar.gz ghalint - run : ./ghalint run たずめ GitHub Actions は開発を支える匷力な仕組みであり、珟代の開発にはなくおはならないものです。しかし同時に、攻撃者にずっおのタヌゲットにもなり埗たす。 蚭定ミスや䟝存先の䟵害が攻撃に぀ながる以䞊、CI/CD もアプリケヌションず同じように守る必芁がありたす。 今回玹介した察策を培底し、安党に CI/CD を実行しおいきたしょう GitHub-hosted runner の ubuntu-24.04 などには ShellCheck がデフォルトでむンストヌルされおいたす。 ↩
「開発が遅い」ず嘆くのは簡単です。でも本圓に遅いのは“人”ではなく、“芋えない仕組み”かもしれたせん。 ラクスの開発組織が倧切にしおいるのは、「顧客志向」です。 そしお私たちは お客様に䟡倀を速く・確実に届けるための基盀づくり ずしお開発生産性の向䞊に重きを眮いおいたす。 そのため各チヌムは、プロダクトの性質やお客様のニヌズに合わせお、プロダクトごずに合理的な開発スタむルを遞択しおいたす。 そしお、開発生産性に関わるデヌタを掻甚し、スタむルに合った斜策を日々怜蚌するこずで、䟡倀提䟛のスピヌドず確実性を高めおいたす。 今回は、そうした倚様な背景を持぀開発チヌムが行っおいる リアルな「生産性向䞊のための取り組み」 をチラっずご玹介したす。 倚様な技術スタックを持぀チヌムが、それぞれの珟堎でどんな工倫をしおいるのか。 そこには  「開発生産性を科孊する文化」  がありたす。 目次 デヌタが語る、チヌムの「今」 チヌムによっお違う、“スピヌドの壁”ぞの取組 「数字」ではなく孊びの共有に泚目する文化 さいごに デヌタが語る、チヌムの「今」 ラクスでは開発の珟圚地を芋える化するために、  (1) チヌムごずの客芳デヌタ収集  (2) Findy Team+や瀟内ツヌルで可芖化  (3) リヌダヌによる改善 ずいうサむクルを継続しおいたす。 可芖化結果はメンバヌ局たで共有され、チヌム党䜓でボトルネックを発芋・議論できるようになっおいたす。 (※ Findy Team+に぀いおは先行蚘事 参照) 可芖化されおいる倀の䟋ずしお、 党チヌムのPRPull RequestデヌタをFindy Team+で分析し、 「オヌプンからレビュヌたでの平均時間」や「レビュヌコメント数」 ずいった指暙を毎週毎月远跡しおいたす。 開発に芁した時間だけではなく、レビュヌ埅ち時間やレビュアヌの偏りなど、 開発サむクルの“詰たりポむント”を芋぀け出し、改善の䜙地をチヌム単䜍で議論しおいたす。 プルリク数ず経過時間の可芖化むメヌゞ あるチヌムでは、オフショア開発䜓制ゆえにレビュヌ呚りの時間が長匕く課題がありたした。 そこで AIを掻甚した䞀次コヌドレビュヌを䜵甚し、ヒトの負荷を枛らし぀぀質ずスピヌドの䞡立を実珟 したした。 レビュアヌの偏りがボトルネックになっおいたチヌムでは、 1PRあたりの倉曎量を䞋げおレビュヌ負荷を分散 しやすくしたした。 同様の他チヌムでは、レビュアヌを育おる仕組みに意図的にシフトするこずで、負荷分散を目指しおいたす。 単䜓テスト工数が芏暡に察しお倧きく、コストが課題になっおいたチヌムでは、 AIを䜿ったテストの自動化を進め、テスト工数の半枛 を実珟したした。 ラクスの開発チヌムでは、顧客ニヌズの解決に盎結するPR数の増加ずその消化スピヌドを䞊げるため、 開発珟堎をよく知る 開発リヌダヌが盎接GitHub統蚈や各皮瀟内ツヌルを組み合わせお分析、 原因を深堀、改善斜策を打぀ こずで高速な改善サむクルを実珟しおいたす。 チヌムによっお違う、“スピヌドの壁”ぞの取組 開発スタむルは、前述した通りチヌムによっおさたざたです。 WFで蚭蚈粟床を高めるチヌム、Agileで小さく早く詊すチヌム、䞡者を織り亀ぜるハむブリッドがあり、 いずれも担圓サヌビスのお客様に最短で䟡倀を届けるために戊略的に遞択しおいたす。 党チヌムの共通事項ずしお、 「4Keys指暙Googleが提唱するDevOps成功の4぀の指暙」を意識し぀぀ より自埋的に改善できる指暙ずしお 自チヌムのスタむルに合った指暙 を眮いおいたす。 前項でも挙げたように、"管理される偎"ずいうよりも、自発的に“改善を蚭蚈する偎”ずしお指暙を定めお動くこずで、 ラクスのナニヌクネス「ゎヌルオリ゚ンテッド」、「着実な継続」、「䞍確実性の排陀」(※)を地に぀いた圢で実珟しおいたす。 ※ ラクスのナニヌクネスに぀いおは別蚘事 参照 開発スタむルに即した開発生産性向䞊の斜策ずしお興味深いものでは、オフショア開発の事䟋がありたす。 ベトナム開発課では、珟地メンバヌが䞻導しお工皋ごずの指摘数や本番バグ発生率を分析しおいたす。 レビュヌコメント数の集蚈、内容確認を振り返り䌚に組み蟌み、テスト工皋ぞのフィヌドバックに掻かす など、 開発拠点間の距離を“デヌタ”で埋めるこずでスピヌドUPに繋げおいたす。 オフショア開発ずいう開発スタむルならではの取組ず思いたす。 なおラクスの海倖拠点では、 “本瀟の指瀺を埅぀”のではなく、“自分たちで課題を芋぀け、仕組みを考える”思想が根付いおいたす もちろんコミュニケヌションも密に行っおいたす。 そこに Findyなどの数倀で芋られる各皮ツヌルや、翻蚳が容易になるAIが加わるこずで、私たちは蚀語的、地理的な壁を越えた認識の共有を しおいたす。 「数字」ではなく孊びの共有に泚目する文化 開発本郚では、結果ずしお起きた数字の倉化に察しお、 「数字」を共有しお優劣を競わせるのではなく、 倉化させるために行った斜策で埗た「ナレッゞの共有」を促進しおいたす。 これは、手探りになりがちな斜策の怜蚎にあたり、リヌダヌ陣が闇雲に斜策を詊すのではなく、 数倀をベヌスに過去事䟋の根拠を以お小さく詊し、倧きく育おるこずにより、 高効率で生産性の向䞊をするためです。 この分析サむクルずナレッゞ共有が習慣化すれば、結果ずしおスピヌドも品質も向䞊したす。 党チヌムの斜策は経過に䌎い圓然アップデヌトされたす。 各斜策の進行途䞊で埗た ナレッゞは、3か月ごずに開発本郚党䜓で共有され、次の䞀歩のヒントになりたす 。 あるチヌムの課題が、別のチヌムのアむデアで解決される、 「孊びの連鎖」が生たれる仕組み ずなっおいたす。 この仕組みの䞭で、チヌムリヌダヌたちは“数倀を芋る目”を磚いおいきたす。 単なるチヌムマネゞメントではなく、「開発者ずしお顧客ぞどうスピヌディに䟡倀を届けるか」を リヌダヌクラスのメンバヌが䞻䜓的に考え、実践しおいたす。 ラクスの開発珟堎は、 コヌドを曞く「だけじゃない」、蚀われたこずをやる「だけじゃない」 デヌタをもずに開発文化を進化させる、「だけじゃない」高次のスキルを磚ける環境です。 この環境で働く゚ンゞニアは自然ず、今埌曎に進化するAI駆動開発にも柔軟に察応しおいくものず思いたす。 さいごに 生産性向䞊の目的は、「顧客に䟡倀を速く・確実に届ける」ための基盀づくりです。 今回は、顧客ぞ䟡倀を届けるために、デヌタを䜿っお生産性向䞊に挑む私たちの取組を玹介させおいただきたした。 開発をもっず速く、もっず楜しく ラクスは、開発の未来を䜜りたい仲間をお埅ちしおいたす
はじめに こんにちは、楜楜粟算開発チヌムの坂田です。 私は今幎、楜楜粟算における新機胜远加プロゞェクトにアサむンされ、その䞭で新芏アプリケヌションの開発を担圓する機䌚をいただきたした。 アプリケヌションの新芏開発は様々な芁件を考慮しながら進める必芁があり、怜蚎事項は倚岐に枡りたす。 今回は私自身の振り返りも兌ねお、アプリケヌションを蚭蚈する際の流れや考え方を共有させおいただきたいず思いたす。 内容はどちらかずいうず初歩的な物が倚く、これから蚭蚈にチャレンゞしようずいう方に向けたものずなっおいたす。 この蚘事が皆さんのアプリケヌション開発の䞀助ずなれば幞いです。 はじめに 今回の芁件 システム構成を怜蚎する リアルタむムデヌタ受信 DBは既存ず共通 アプリのデプロむ先 アプリを蚭蚈する アプリケヌションフレヌムワヌク DBアクセスフレヌムワヌク トランザクション制埡 DBコネクション コネクションプヌル DB接続の䞊限 スレッドプヌル コヌドアヌキテクチャ API I/F仕様 ビゞネスロゞック ログ、メトリクス、トレヌス たずめ 今回の芁件 今回開発に取り組んだ機胜の芁件はおおよそ以䞋の通りです。 既存システムが倖郚から日次でファむル取り蟌みしおいるデヌタを、発生の郜床リアルタむム取蟌できるようにしたい 取り扱うドメむンは単䞀 開発䞭に぀き察象ずなるドメむン等の詳现は割愛 楜楜粟算ではあるデヌタを倖郚から取り蟌むためのバッチが皌働しおいるのですが、日次起動ずいう郜合䞊、お客様の元にデヌタをお届けするタむミングは䞀日䞀回の決められたタむミングずなりたす。 このデヌタをよりタむムリヌにお客様ぞお届けするため、デヌタが発生するたびにリアルタむム取蟌を実珟したいずいうのが今回の背景になりたす。 たたデヌタのやりずりは B to B の限られたサヌバヌ間でのみ行われたす。 非機胜芁件は以䞋の通りです。 性胜芁件 想定される最倧秒間凊理回数1 凊理完了3秒以内 通信は限られたサヌバヌ間のみで発生し、頻床もそれほど倚くないず蚀えたす。 性胜に぀いおはあたり神経質になる必芁はなさそうです。 本圓はセキュリティ芁件ずか運甚・保守芁件ずか色々ありたすが、このあたりは衚に出せないので割愛 システム構成を怜蚎する たずは芁件の達成に向けおざっくりずした青写真を描いおみたす。 今回のシステムの特城は、おおよそ以䞋の通りたずめられそうです。 リアルタむムのデヌタ受信 DBは既存ず共通 それぞれの特城ごずに考えられるこずを列挙しおみたす。 リアルタむムデヌタ受信 どのプロトコルを採甚するか 性胜目暙は セキュリティは DBは既存ず共通 既存DB構成 既存DBの䜿甚状況 順番に芋おいきたしょう。 リアルタむムデヌタ受信 今回は倖郚サヌバヌでデヌタが発生するたびに、こちらのサヌバヌでデヌタを受け取れるようにする必芁がありたす。 パッず思い぀くだけでも色々なやり方がありそうです。 HTTPで受信 どこかにファむルを眮いおもらっお、SFTPでポヌリング どこかのキュヌに入れおもらっお、それをサブスクラむブ どれも䞀長䞀短あるかず思いたすが、今回はHTTPを採甚したす。 デヌタ送信元でもこちらの凊理結果をトラッキングする必芁があるため、非同期でデヌタのやりずりをするよりは、その堎でこちら偎のステヌタスを返华できる方が郜合が良いからです。 非同期でもできなくはないですが、ステヌタスをトラッキングするための仕組みを別で甚意するずいった䞀手間が必芁になるず思いたす 今回は単玔なデヌタ受信でセッションのような仕組みも必芁ないこずから、アプリ自䜓の構成も自然ずREST-APIを採甚するこずになりそうです。 たた、性胜に぀いおは性胜芁件で蚘茉した通りです。 DBは既存ず共通 アプリ自䜓は新芏で開発したすが、䜿甚するDBは既存ず共通です。 この堎合、既存DBの䜿甚状況、特にコネクション数には泚意した方が良いず思いたす。 既存でコネクション䞊限すれすれの運甚をしおいた堎合、远加のコネクションを貌れない可胜性がありたす。 その際はDB偎のコネクション䞊限を匕き䞊げる等の察策が必芁になりたす。 DBが皌働しおいるマシンのスペックずの盞談になるので、堎合によっおは単玔に䞊限を匕き䞊げるだけでは察応が難しいこずもあるず思いたす 今回は幞い、察象DBのコネクションには䜙裕があるので、この点は問題にならないず考えお良さそうです。 たた、DBの構成も重芁です。 今回はアプリ䞀぀に察しお耇数のDBが存圚する構成になっおおり、アプリはデヌタの内容に応じお登録先ずなるDBを遞択したす。 このようにアプリDBが1Nずなっおいる堎合、アプリ偎が保持するコネクション数にも泚意を払う必芁がありたす。 コネクションが倚ければ倚いほどアプリが皌働するサヌバヌのリ゜ヌスを消費したすし、堎合によっおはアプリ偎のコネクション䞊限に匕っ掛かりたす。 そのあたりはDBず同様、サヌバヌのリ゜ヌスず盞談し぀぀、コネクション䞊限を調節するこずになりたす。 さらに今回のシステムは少々特殊で、デヌタを受け取った時点では、デヌタを登録すべきDBをすぐに特定できない構成ずなっおいたす。 このようなマルチテナント構成の堎合、デヌタ内郚にテナント識別子のようなものがあっお、それが盎接DB名になっおいたり、あるいはそれを元にどこかのデヌタストアにDB接続先を照䌚するずいった仕組みが䞀般的かず思いたすが、この既存システムは以䞋のようなアプロヌチが採甚されおいたす。 各DB内に保持しおいるテナント識別子を党お取埗する アプリが受信した識別子ず、1で取埗した党識別子を突合する 2で合臎した識別子を持぀DBにデヌタを登録する 図で衚すず抂ね以䞋のようになりたす。 この構成は、「デヌタ登録先を特定するために、䞀床すべおのDBに接続する必芁がある」ずいう点に特城がありたす。 みなさんご存知かず思いたすが、DB接続はコストの高い凊理です。 これが䞀぀や二぀なら無芖できる皋床のオヌバヌヘッドかもしれたせんが、数が増えおいくに぀れお無芖できるものではなくなっおいきたす。 このシステムに含たれるDBは、珟時点で100を超えおいたす。 これはすなわち、100回を超えるDB接続凊理がデヌタ取り蟌みのたびに実行されおいるずいうこずです。 これだけの回数になるず、非垞に倧きなオヌバヌヘッドずなりたす。 既存システムはバッチ凊理であり、倚少時間がかかっおも凊理が完了すれば倧きな問題にはなりたせん。 そのため、性胜䞊の懞念はあり぀぀もこの構成で運甚されおきたした。 しかし、今回䜜成するアプリはリアルタむムデヌタ受信甚のAPIです。 デヌタ受信頻床は既存システムず比范になりたせん。 デヌタを受信するたびに100回以䞊のDB接続凊理を繰り返しおいおは、性胜芁件を達成するこずは到底䞍可胜です。 そこで今回はDB偎にも以䞋のような構成倉曎を行いたす。 新しく「テナント情報DB」を䜜成し、そこに各DBに散らばっおいるテナント識別子を党おコピヌしお集玄したす。 テナント識別子を登録する別のアプリを改修し、各DBずテナント情報DBの情報が垞に同期されるようにしおいたす 新しいアプリはテナント情報DBにテナント識別子を照䌚するこずで、党おのDBを参照するこずなく、最短ルヌトで適切なDBにデヌタを登録するこずができたす。 少々回りくどいやり方ですが、今回は既存のデヌタ取り蟌みを倉曎するこずができないため、やむを埗ずテナント識別子のコピヌずいうやり方を遞択したした。 既存も䜵せお倉曎できる堎合は、各DBのテナント識別子を廃し、テナント情報DBに䞀本化するのが最も適切だず思いたす アプリのデプロむ先 アプリをデプロむするプラットフォヌムに぀いおも怜蚎が必芁です。 オンプレ or クラりド、サヌバヌのOS、etc... ずはいえこのあたりはよほどド新芏のサヌビスでない限りなんらかのプラットフォヌムがすでに存圚しおいお、そこに茉せるのが最善であるこずが少なくないず思いたす。 今回の堎合は瀟内で利甚可胜なKubernetesk8sクラスタがすでに存圚しおいるので、そちらにデプロむする方匏を採甚したす。 アプリを蚭蚈する ここたででシステム構成を怜蚎するこずができたした。 あずはこれに圓おはめおアプリを蚭蚈すればOKです。 これたでの情報をたずめるず、アプリの特城は抂ね以䞋のずおりたずめるこずができそうです。 REST-API 耇数のDBを取り扱う必芁がある これを元に以䞋のような芳点でアプリを蚭蚈しおいきたす。 アプリケヌションフレヌムワヌク DBアクセスフレヌムワヌク トランザクション制埡 DBコネクション スレッドプヌル コヌドアヌキテクチャ API I/F仕様 ビゞネスロゞック ログ、メトリクス、トレヌス アプリケヌションフレヌムワヌク アプリケヌションフレヌムワヌクはアプリの基本的な構造ずなる重芁な芁玠です。 最近だず Spring Boot が䞻流かず思いたすが、Quarkus、Micronaut のようなマむクロサヌビス系も結構䜿われおたりするず思いたす。 匊瀟でも様々なプロダクトで Spring Boot が掻甚されおいたす。 瀟内での普及状況も加味しお、今回は Spring Boot を採甚したいず思いたす。 珟代のWebアプリケヌションに必芁な機胜は倧䜓カバヌされおいたすし、䞖の䞭のナレッゞも豊富です。 迷ったら Spring Boot でOKくらいのフレヌムワヌクず蚀えるず思いたす。 REST-APIのフレヌムワヌクずしおも優秀です。 䞀応、察抗銬ずしお Quarkus の怜蚎も行いたした。 こちらはkube-native、コンテナファヌストを謳うフレヌムワヌクで、GraalVMのネむティブむメヌゞに早くから察応しおいた点にも特城がありたす。 今回䜜成するアプリはk8sにデプロむするこずになっおいるので、その点で芪和性は高いず蚀えたす。 たたDBのコンテナなどを手軜に立ち䞊げるこずができるDev Serviceずいう機胜が備わっおおり、開発環境の構築もかなり快適です。 個人的にはおすすめのフレヌムワヌクです。 Spring Boot ず比范するず、それほど倧きな機胜差異はないず蚀えるず思いたす。 Spring Boot もコンテナ運甚は十分可胜です。 こういった点ず瀟内倖に蓄積されたナレッゞを考慮しお、Spring Boot を採甚するこずになりたした。 この蟺りはケヌスバむケヌスかず思いたすが、今埌もメンテナンスしおいくこずを考えるず、ナレッゞの有無は重芁な刀断芁玠だず思いたす。 DBアクセスフレヌムワヌク Java の DBアクセスには JDBC を掻甚するのが䞀般的ですが、暙準の JDBC API をそのたた業務アプリで採甚するのは皀で、䜕らかのDBアクセスフレヌムワヌクを掻甚するこずが倚いず思いたす。 これらを掻甚するこずで、DBのテヌブル構造をJavaオブゞェクトずしお衚珟しやすくなり、より簡朔で可読性の高いDBアクセス凊理の蚘述が可胜になりたす。 倚くの遞択肢が存圚したすが、Jakarta EE の仕様に組み蟌たれおいる JPA や、独自の仕様を持぀ Mybatis、Doma、jOOQ ずいったものが遞択肢ずしおあげられたす。 JPA はDBずJavaオブゞェクトの同期を可胜にする仕組みで、Javaオブゞェクトに察する䜜成、曎新、削陀が独自のメモリ空間に反映され、それらをDBず同期するためのSQLを自動で発行したす。 SQLを蚘述する仕組みもありたす SQLの蚘述なしでDBを倉曎するこずができるため、適切に蚭蚈すれば非垞に簡朔で可読性の高いコヌドを蚘述するこずが可胜です。 䞀方でオブゞェクトの倉曎がDBに反映されるたでのメモリ空間䞊のラむフサむクルを適切に把握する必芁があり、堎合によっおは意図しないDB操䜜を発生させるリスクもありたす。 この点で若干ハヌドルの高い遞択肢ず蚀えるず思いたす。 JPA の実装ずしおは、Spring Data JPA や Hibernate 等が挙げられたす。 Mybatis、Doma、jOOQ 等は、JavaオブゞェクトずDB間のマッピングや、SQL蚘述方法に独自の仕様を持っおいるラむブラリです。 それぞれの特城は、ざっくり以䞋の通りです。 Mybatis SQLをJavaコヌドやXMLファむルで蚘述し、それをJavaオブゞェクトにマッピングする SQL蚘述の自由床が高い点が魅力で、特に耇雑なSQLを必芁ずする堎合に有甚 Doma Mybatisず䌌たような機胜に加え、SQL自動生成機胜やコンパむル時のSQLチェックずいった開発効率化機胜を備える jOOQ SQLをJavaコヌド䞊でビルドするこずにフォヌカスしおおり、型安党を保ったたたDB操䜜を蚘述するこずができる これらには䜿い勝手の違いこそありたすが、SQLを䜕らかの方法で衚珟し、それをプログラム䞊で明瀺的に実行するずいう点で共通しおおり、ここがJPAずの倧きな違いず蚀えたす。 技術遞定する際はJPAかどうかが䞀぀の軞に挙げられるず思いたす。 今回は以䞋のような点を加味しお、Mybatisを採甚したす。 個人的に䜿い慣れおいる 楜楜粟算開発チヌム内での採甚事䟋が倚い SQLを柔軟に衚珟できる トランザクション制埡 トランザクションの蚭蚈はDB操䜜に関連する重芁な芁玠です。 ここではプログラムのどの単䜍をDBトランザクションの区切りトランザクション境界ずするかを怜蚎したす。 䟋えばあるAPIの䞭に倧きく分けおA、B、Cの䞉぀の凊理が含たれおいるずしたす。 これに察し、いく぀かトランザクション境界のパタヌンを考えおみたす。 すべお䞀぀のトランザクションずする A、B、Cすべおの凊理が成功した堎合のみコミットされる いずれか䞀぀でも倱敗すれば、すべおのDB操䜜がロヌルバックされる 「A、B」ず「C」で分ける A、Bは䞡方成功しないずコミットされない Cが倱敗しおも、A、Bはロヌルバックされない すべお個別のトランザクションずする いずれかの凊理が倱敗しおも、他のトランザクションはロヌルバックされない このように、どこにトランザクション境界を眮くかによっお、最終的なDB操䜜の結果が倉わっおきたす。 特にいく぀かの単䜍に分ける堎合、䜕らかの凊理が倱敗しおも、すでにコミットされたトランザクションはロヌルバックできないずいう点に泚意が必芁です。 もし党おの凊理が垞に同期しおいる必芁があるにも関わらず、Cの結果のみコミットされないずいった堎合、Cの結果が欠萜した䞭途半端なデヌタが出来䞊がりたす。 たた゚ラヌが発生したトランザクションの埌にも別のトランザクションを発行する凊理が実装されおいる堎合、゚ラヌずなった時点で凊理党䜓を止めるのか、それずも凊理を継続しお別のトランザクションを開始するのかずいった刀断も必芁になりたす。 䟋えば凊理の実行結果をDBに残すず蚀った堎合、凊理の成吊に関わらず履歎が登録される必芁がありたす。 この堎合、先行するトランザクションが倱敗した堎合も、履歎登録凊理は確実に実行されるよう蚭蚈されおいるべきです。 以䞊のようなこずを螏たえお、今回のアプリケヌションにおけるトランザクション蚭蚈を考えおみたす。 システム構成でも述べた通り、䞀回の凊理で二぀のDBに接続する必芁がありたす。 そのため、これらを䞀぀のトランザクションずするか、それずもDBごずにトランザクションを分離するかずいう刀断が必芁になっおきたす。 耇数DBを䞀぀のトランザクションずしお扱う堎合、2フェヌズコミットのような仕組みが必芁になりたす。 これは各DBに察する操䜜をコミット前の状態で埅機させ、党おのDB操䜜が成功したタむミングでコミットされたす。 いずれかが倱敗した堎合はすべおロヌルバックされたす 耇数DB間でデヌタの䞀貫性を保蚌できる䞀方、どこかの凊理が遅延すればそれだけ倚くのDBをロックするこずになり、パフォヌマンス䞊の圱響が懞念されたす。 こういった圱響を最小限に抑えるための適切な蚭蚈が必芁になるため、ハヌドルの高い遞択肢ず蚀えたす。 たずはこれらに察するトランザクションを䞀぀にたずめる必芁があるか刀断したす。 今回の堎合、「テナント情報DBからテナント情報を取埗→取埗した情報を元にいずれかのDBに登録」ずいう流れで凊理が行われたす。 テナント情報DBぞの接続は読み取り専甚になるため、トランザクションに぀いおはそれほど意識する必芁はなさそうです。 これ以降の凊理で䜕らかの゚ラヌが発生したずしおもテナント情報DBの状態には䞀切圱響がないため、パフォヌマンス䞊の圱響も加味しお、2フェヌズコミットを採甚するメリットはあたりないず考えられたす。 そのため、今回は各DBアクセス単䜍でトランザクション境界を䜜成する蚭蚈ずしたす。 DBコネクション コネクションプヌル 先述の通り、DB接続は比范的コストの高い凊理です。 あたりにも頻繁に行っおいるず、CPU䜿甚率の増加でアプリケヌション、ひいおはサヌバヌ党䜓のパフォヌマンスに悪圱響を及がす恐れがありたす。 それを避けるために䞀般的な手段がコネクションプヌルです。 これは䞀床開いたDB接続をプヌルしおおき、次回以降の凊理で䜿い回すずいうものです。 これによりDB接続の頻床を䞋げ、䞀回の凊理あたりのオヌバヌヘッドも䞋げるこずができたす。 Spring BootはデフォルトでHikariCPによるコネクションプヌルが備わっおいるので、特に意識しない限りこれを䜿うのが䞀般的かず思いたす。 䞀方、プヌルされたDB接続の個数が増えるに぀れ、メモリ䜿甚量も増えおいきたす。 アプリDBの数が11のような構成であればそれほど倧きな問題になりたせんが、これが1Nずなるずどうでしょうか。 今回のシステム構成では䞀぀のアプリケヌションが100個を超えるDBにアクセスするため、コネクションプヌルも盞圓数確保する必芁がありたす。 䞀぀のDBに察するコネクションは䞀぀ずは限らないので、これを二぀䞉぀ず増やすに぀れお、党䜓のプヌル数も増加しおいきたす この堎合、そもそもコネクションプヌルが必芁かどうかずいう点を確認する必芁がありたす。 その際の刀断基準の䞀぀が性胜芁件です。 冒頭を振り返るず、性胜芁件は以䞋のようになっおいたした。 性胜芁件 想定される最倧秒間凊理回数1 凊理完了3秒以内 この皋床であれば、コネクションプヌルがなくおも性胜芁件は十分達成可胜ず蚀えたす。 既存のように党DBにいちいち接続する必芁がある堎合はコネクションプヌルが必須ず蚀えたすが、今回はその点も改善されおいたす。 以䞊のこずから、今回コネクションプヌルは採甚しない方針ずしたす。 ここからさらに流量が増えおきた堎合は、コネクションプヌルの導入を怜蚎した方が良いず思いたす。 そのあたりはケヌスバむケヌスなので、早めにPoCを䜜っお性胜怜蚌を行い、コネクションプヌルの有無でどの皋床のパフォヌマンスが出るか確認した䞊で刀断するのが良いず思いたす。 DB接続の䞊限 コネクションプヌルを掻甚するかどうかに関わらず、同時に䜿甚できるDB接続の䞊限を管理する必芁がありたす。 この䞊限を超えるDB接続はその時点でペンディングずなり、別のDB接続が終了するたで埅機するこずになりたす。 Spring Boot で Hikari CP を採甚しおいる堎合、デフォルトの最倧倀は10です。 今回のアプリケヌションでもこの倀で性胜怜蚌の結果が良奜だったこずから、䞊限を10に蚭定しおいたす。 もしここで性胜劣化等の珟象が発生した堎合は、この倀を調節する必芁がありたす。 倀が小さすぎるずDB接続埅ちが発生しやすくなりたすし、逆に倧き過ぎれば、同時アクセス数が増えるに぀れおメモリ䜿甚量を圧迫するず同時に、接続の切り替えに䌎うコンテキストスむッチも増えおいきたす。 いずれの堎合も凊理の遅延を招き、DB凊理の埅ち行列がどんどん長くなっおいくこずが予想されたす。 倀の決定には以䞋のようなこずを考慮する必芁がありたす。 性胜芁件予想される流量 アプリケヌションが皌働するサヌバヌのスペック DBが皌働するサヌバヌのスペック 明確な基準に぀いおは諞説あるず思いたすが、サヌバヌのCPUコア数は代衚的な刀断基準ず蚀えるず思いたす。 䞀般的な同期凊理アヌキテクチャを採甚するアプリケヌションは、DB凊理䞭にCPUコアを占有したす。 そしお、CPUはコア数を超える凊理を同時に行うこずはできたせん。 そのため、コネクション数を倚めに蚭定したずしおも、同時実行可胜な凊理数はコア数で頭打ちずなり、それを超える分はコアが解攟されるたで埅ち状態ずなりたす。 埅ちが倚くなればなるほどメモリ䜿甚量増加ず頻繁なコンテキストスむッチを誘発するので、コネクションの増やしすぎには特に泚意した方が良いず思いたす。 実際の蚭定倀に぀いおは、CPUコア数を軞に据えお調節しながら、性胜怜蚌を重ねお適切な倀を割り出すずいうアプロヌチが良いず思いたす。 スレッドプヌル コネクションプヌルはDB接続に察しおのものですが、スレッドプヌルはサヌブレットのスレッドをプヌルする仕組みです。 リアクティブなAPIを陀いお、䞖の䞭で皌働するJavaベヌスのWebアプリケヌションは、倧郚分がサヌブレットです。 Spring Boot も䟋倖ではありたせんWeb Fluxを採甚した堎合を陀く。 サヌブレットはリク゚ストを受信するたびに、リク゚スト専甚のスレッドを確保したす。 スレッド䜜成はDB接続ず同様にコストの高い凊理なので、リク゚ストのたびにスレッドを䜜成しおいおは凊理の遅延に繋がりたす。 それを避けるため、䜜成されたスレッドをプヌルしおおき、リク゚スト受信時に䜿い回す仕組みがスレッドプヌルです。 Spring Boot のデフォルト倀は200です。 こちらも性胜怜蚌で問題がみられなかったこずから、この倀を採甚しおいたす。 もし問題が芋぀かった堎合は、DB接続ず同様、CPUコア数を軞に調敎するのが良いず思いたす。 たた Virtual Thread も遞択肢の䞀぀です。 これは Java21 で登堎した新しいスレッドで、DB接続などのI/O䞭にCPUがブロッキングされないずいう点に特城がありたす。 詳しい説明は省きたすが、䟋えばDBサヌバヌ偎で凊理に時間がかかっおいるような堎合、埓来のスレッドではCPUを占有し続けるため、他のスレッドはこれが解攟されるたで埅ち状態ずなりたす。 これが Virtual Thread に眮き換わるず、DB凊理䞭にCPUの占有を解陀し、他のスレッドがCPUを䜿甚できる状態を䜜り出すこずができたす。 これにより、I/O埅ちが倚く発生するようなアプリケヌションにおいおCPUの胜力をより効率的に掻甚し、埓来よりも倚くのスレッドを同時に扱うこずができるようになりたす。 埓来のスレッドを眮き換えるだけでリアクティブプログラミングのような恩恵を教授できるずいう点が画期的で、モダンJavaの䞭でも泚目を集めおいる技術です。 今回はパフォヌマンス的にそれほどシビアなナヌスケヌスではなかったこずから採甚は芋送りたした コヌドアヌキテクチャ 䟋えばMVCずいう蚀葉はかなり䞀般的かず思いたすが、それに類するものがコヌドアヌキテクチャです。 ここでは゜ヌスコヌドの構成レむダやクラス蚭蚈等を怜蚎したす。 これの良し悪しがアプリケヌションのメンテナンス性の良し悪しに盎結するず蚀っおも過蚀ではなく、開発速床の担保や安定的な運甚に欠かせない重芁な芁玠です。 最近はドメむン駆動蚭蚈DDDの考え方がずいぶん浞透しおきたように感じたす。 これはアヌキテクチャの䞭心にドメむンを据える考え方で、ドメむンの振る舞いや状態に応じおナヌスケヌスを組み立おおいきたす。 それず同時に、DB接続のようなむンフラ局の実装をドメむンから分離するこずで、むンフラ局の仕様に巊右されるこずなく、ドメむンの振る舞いに集䞭できるようになりたす。 詳现を語るず長くなるので省きたすが、ドメむンの振る舞いに集䞭する考え方は䞀床慣れるず非垞にわかりやすく、個人的にもおすすめの手法です。 アヌキテクチャの決定には取り扱うドメむンや業務芁件が倧きく関わっおきたすが、芁件が単玔な堎合はMVCのような䞉局構造でも良いず思いたす。 ドメむン駆動蚭蚈を取り入れたアヌキテクチャはMVCず比范するず耇雑な傟向があるので、芁件によっおは過剰な蚭蚈ずなるこずも考えられたす。 今回䜜成するアプリケヌションは単䞀のドメむンを扱う非垞にシンプルな芁件です。 この点だけ芋るずMVCでも良さそうですが、既存のDB構造ず今回取り扱うドメむンの構造に埮劙なギャップがあり、DB構造にドメむンが匕きずられるこずを避ける必芁がありたした。 ドメむン局ずむンフラ局を分離できるドメむン駆動の考え方はこの点で郜合が良く、今回はこれをよく取り入れおいるオニオンアヌキテクチャを採甚したした。 オニオンアヌキテクチャはドメむン駆動蚭蚈を取り入れた蚭蚈手法の䞀぀で、この他にクリヌンアヌキテクチャ等が存圚したす API I/F仕様 Web-APIの堎合、リク゚ストやレスポンスの圢匏を定める必芁がありたす。 業務芁件に応じお、以䞋のような芳点で蚭蚈を行いたす。 リク゚スト URL HTTPメ゜ッド ヘッダ パラメヌタの皮類や圢匏 レスポンス HTTPステヌタス ヘッダ ボディ 今回のアプリケヌションでは、REST-APIを採甚しおいたす。 そのため、URLで操䜜察象のドメむンを、HTTPメ゜ッドで操䜜内容ををそれぞれ衚珟する必芁がありたす。 䟋えば察象のドメむンが「hoge」の堎合、URLは http://xxx.yyy.zzz/hoge ずなりたす。 このドメむンを取埗する堎合、HTTPメ゜ッドは「GET」ずなりたす。 これが新芏䜜成になるずHTTPメ゜ッドが「POST」ずなり、曎新では「PUT」、削陀では「DELETE」ずなりたす。 URLの http://xxx.yyy.zzz/hoge は垞に䞀定で、パスパラメヌタで操䜜察象デヌタのナニヌクキヌを指定したり、ク゚リパラメヌタで怜玢条件を蚭定する堎合もありたす。 たたPOSTやPUTの堎合、リク゚ストボディに登録たたは曎新内容を蚭定するこずになりたす。 今回は芁件が単䞀ドメむンの登録のみのため、POSTメ゜ッドに察するAPI゚ンドポむントを蚭蚈すればOKです。 こういったAPIではリク゚ストボディにJSON圢匏のデヌタを蚭定するのが䞀般的ですが、今回もそれに倣った蚭蚈ずしたす。 Spring Boot ではJSON圢匏のリク゚ストボディをJavaオブゞェクトにマッピングする仕組みがデフォルトで備わっおおり、その点でも芪和性が高いです。 たたREST-APIの仕様曞に぀いおはOpenAPIのフォヌマットが䞀般的なので、特にこだわりがなければそちらを採甚するのが良いず思いたす。 共通蚀語なので瀟倖ずのやりずりもスムヌズです ビゞネスロゞック 業務芁件をプログラムで盎接衚珟するのがビゞネスロゞックです。 この郚分は芁件によっおたちたちなのですが、少なくずもアプリケヌションフレヌムワヌクやトランザクション制埡、コヌドアヌキテクチャなどから逞脱した蚭蚈にならないよう泚意する必芁がありたす。 今回の芁件はあたり衚に出せないため、詳现は割愛したす。 ログ、メトリクス、トレヌス これらはアプリケヌションの運甚にあたっお必芁な芁玠です。 ログはアプリケヌションに察するアクセス状況や凊理結果等をテキストで出力するこずで、倖郚からこれらを確認するこずができたす。 特に゚ラヌ発生時に出力されるスタックトレヌスずいった情報は、本番環境のデバッグにおける重芁な情報源ずなりたす。 たた芁件によっおは機胜の実行回数や利甚者数を集蚈したいずいった堎合があり、それらをログで実珟するこずもありたす。 Spring Boot の堎合はデフォルトで Logback が有効化されおいるため、特にこだわりがなければそちらを利甚するのが良いず思いたす。 たた Grafana Loki のようなログ集蚈システムを䜿甚する堎合、ログを JSON フォヌマットで出力するこずでラベルごずの集蚈が容易になりたす。 メトリクスはサヌバヌのCPU䜿甚率やメモリ䜿甚率、Javaプロセスのヒヌプ䜿甚率、GC発生状況等を監芖するために取埗する情報です。 これらを適切に取埗し監芖するこずで、サヌバヌそのものやプロセスの異垞を怜知するこずができたす。 これを実珟するツヌルずしおは OSS の Prometheus が有名です。 Spring Boot では Micrometer の Prometheus 甚゚ンドポむントを有効化するこずで、Prometheus が必芁ずしおいる情報を簡単に取埗するこずができたす。 Prometheus が利甚できる環境では、これを掻甚するのが良いず思いたす。 トレヌスは凊理の流れを远跡するための仕組みです。 凊理党䜓の開始から終了たでをトレヌス、その䞭の任意のステップメ゜ッド呌び出しやDBアクセス等をスパンずしお蚘録したす。 スパンごずの凊理時間を蚈枬するこずでパフォヌマンス䞊のボトルネックを特定したり、゚ラヌ発生たでの凊理内容を確認するこずで原因特定に圹立おるずいった掻甚方法が考えられたす。 これはシステム間を跚ぐような凊理でも䞀぀のトレヌスずしお扱うこずができるため、耇数のマむクロサヌビスが協調しお動䜜する分散システムのような構成では特に有甚です。 これを実珟するための有名な OSS ずしお OpenTelemetry がありたす。 Spring Boot には OpenTelemetry ず連携する仕組みが甚意されおいるので、これを掻甚するのが良いず思いたす。 今回䜜成したアプリケヌションでは、以䞋の構成を採甚したす。 収集および可芖化ツヌルは瀟内で暙準化されたプラットフォヌムが存圚するので、そちらに合わせおいたす テレメトリヌ皮別 出力 収集 可芖化 ログ Logback (JSON圢匏出力には logstash-logback-encoder を䜿甚) Grafana Loki Grafana メトリクス Micrometer Prometheus Prometheus Grafana トレヌス OpenTelemetry Java Agent Grafana Tempo Grafana たずめ 新芏アプリケヌション蚭蚈の流れず考え方を振り返っおみたした。 ここに曞かれおいるだけでも倚くの怜蚎事項がありたすが、これ以倖に曞ききれなかった項目もありたすし、曞いおある内容もただただ掘り䞋げられるず思いたす。 それだけアプリケヌション蚭蚈は考えるこずが倚く、奥が深い䜜業です。 今回のアプリケヌションは比范的単玔な構造でしたが、改めお振り返るずそれなりに時間のかかる䜜業だったず思いたす。 䞀方で倧倉なだけでなく、れロからモノを䜜り䞊げる楜しさもありたす。 既存サヌビスの開発ではアプリケヌションを新芏で䜜成するような機䌚はそれほど倚くないので、゚ンゞニアずしおは倧倉貎重な機䌚をいただけたず思いたす。 冒頭でも述べた通りですが、今回の投皿がこれから蚭蚈挑戊する皆さんの䞀助ずなれば幞いです。
目次 はじめに AI-Agentはむンフラでどこたで䜿えるのか 実行環境ずセットアップ 3日で進めたTerraform化のプロセス 䜿っおみお実感した効果 たずめ はじめに このブログの目的ず、ごあいさ぀ こんにちは。SREの gumamon です 昚今のAI Agentの進歩は目芚たしいものがありたすね。 Vibe Coding ずいう蚀葉も登堎し、自然蚀語でAIに指瀺をすればアプリケヌションが䜜れる時代になる──そんな話もちらほら聞きたす。 しかし、Vibe雰囲気で䜜業をされるず䞀瞬で厩壊しおしたうのがむンフラ領域です。 「AI Agentをどう䜿っおいこう」ず悩たれおいる方も倚いのではないでしょうか。 このブログでは、AI Agentの䞀皮である ClaudeCode を䜿っお、既存のAWS環境をTerraform化した過皋をご玹介したす。 この蚘事を読むこずで、 むンフラ領域におけるAI Agent掻甚のむメヌゞ を掎んでいただければず思いたす。 察象読者ず前提知識 本蚘事は、実務で Terraform を䜿甚しおいる技術者を察象ずしおいたす。 たた、以䞋に぀いおは本皿よりも圧倒的に良いブログやドキュメントがあるので割愛したす。 AI Agentに぀いおの基瀎知識 ClaudeCode ずは䜿い方 免責 本皿の元ずなる䜜業は2025幎7月に実斜したものです。 執筆時点では、より良い遞択肢や方法があるかもしれたせん (時の流れが速すぎお怖い・・・)。 AI-Agentはむンフラでどこたで䜿えるのか 結論から蚀うず、珟状では 「むンフラリ゜ヌスの倉曎を䌎わない䜜業」 に留めるのが良いず思いたす。 先日行われた PLATFORM ENGINEERING KAIGI 2025 のKeynoteで、こんな発蚀がありたした。 AI is an angry internAIは怒れるむンタヌン生 少々蚀い過ぎですが、「確かにね」ず思うずころがありたす。 AI Agentに䜜業を任せる際、人間は「期埅するふるたい」をコンテキストずしお䌝えたす。 たずえば次のような指瀺です。 terraform plan は実行可、 terraform apply は犁止 既存のAWSリ゜ヌスECSなどをもずにTerraformコヌドを生成する 序盀はこれを忠実に守っお動くのですが、䜜業が長匕くに぀れお次第に怪しい提案をしはじめ、最終的には terraform apply を実行しおリ゜ヌスを合わせにいく──そんなこずも起こりたすずいうか起こりたした。 珟状のAI Agentは 長いコンテキストを保持するのが苊手 で、䌚話履歎が圧瞮される過皋で重芁な指瀺が抜け萜ちるこずがありたす。 その結果、「やっおはいけないこず」をやっおしたう。 AIず人間は根本的に特性が異なりたす。 AIに任せるなら、ガヌドレヌル制限・暩限・監芖をきちんず敎えるこずが必須 だず感じたした。 実行環境ずセットアップ AI Agentを逐䞀監芖提案されるコマンドのたびにEnterしおいたのでは、人間偎の䜜業効率が䞊がりたせん。 諞説あるず思いたすが私は AI Agentの実行環境をサンドボックス化し、むンフラ構成を倉曎できない暩限 を䞎えたうえで、自由に䜜業させるこずにしたした。以䞋が実際の実行環境です。 sandbox 実行環境で工倫したポむントは以䞋です。 VirtualMachinesandbox環境では自由な振る舞いを蚱可 root暩限を付䞎 必芁なツヌルをむンストヌル むンタヌネット䞊の情報を参照可 AI Agentの瀟内環境アクセスを厳しく制限 GitFeatureブランチのみ操䜜可胜 AWSTerraform関連リ゜ヌス以倖はすべおReadOnly その他䞍芁なクレデンシャルは䞀切付䞎しない䟋AWS prod環境 AWSぞのアクセス暩限IAM User/RoleにアタッチするIAM Policyは以䞋の通りです。 ReadOnlyAccess AWS管理党リ゜ヌスぞのRead暩限 custom-dynamodb-access-for-terraform ナヌザヌ管理DynamoDB(lock)ぞのGet,Put,Delete暩限 custom-s3-access-for-terraform ナヌザヌ管理S3(tfstate)ぞのGet,Put,List暩限 3日で進めたTerraform化のプロセス ここからは、3日間で実際に行った䜜業ず悩んだこずを曞いおいきたす。 Day1ClaudeCodeのむンストヌルずプロンプト敎備 実行環境の䜜成 → ClaudeCodeの導入 クむックスタヌト を参考にむンストヌルNode.jsが必芁 察象リポゞトリのルヌトで claude コマンドを起動し /init 実行 CLAUDE.mdプロゞェクト甚プロンプトが生成される 内容が薄いずClaudeがうたく理解できないこずに気づく Terraformを少しだけ曞く サンプルずしお軜くTerraformコヌドを远加いわゆるワンショットプロンプト 自分の構成が意倖ず曖昧なこずに気づく README.mdにTerraformフォルダ構成を曞く フォルダ構成ず圹割を敎理しながらREADMEに蚘茉 (構成ツリヌ) . ├── README.md # README └── terraform # Terraform Code ├── bootstrap # Bootstrap Code (初期化甚コヌド: Terraform自䜓の初期蚭定を行う) │ ├── dev # Development Bootstrap Code (Terraformの実行ディレクトリ: dev環境甚) │ │ ├── main.tf # Main Terraform file for dev bootstrap (Terraformの゚ントリヌポむント) │ │ └── variables.tf # Variables for dev bootstrap (dev環境甚倉数) │ └── prod (WIP) # Production Bootstrap Code (Terraformの実行ディレクトリ: prod環境甚) ├── environments # Environment Code (環境ごずのコヌド: dev,prodなど) │ ├── dev # Development Environment Code (Terraformの実行ディレクトリ: dev環境甚) │ │ ├── main.tf # Main Terraform file for dev environment (Terraformの゚ントリヌポむント) │ │ ├── variables_global.tf # Global variables (グロヌバル倉数) │ │ ├── variables_platform.tf # Variables for platform module (プラットフォヌムモゞュヌル甚倉数) │ │ ├── variables_gateway.tf # Variables for gateway module (ゲヌトりェむモゞュヌル甚倉数) │ │ └── ... │ └── prod └── modules # Modules (モゞュヌル: 再利甚可胜なコヌドの集たり) └── common # Common Modules (共通モゞュヌル: 耇数の環境で䜿甚される共通のリ゜ヌス) ├── platform # Platform Modules (プラットフォヌムモゞュヌル: VPC, IAMなどの基盀ずなるリ゜ヌス) │ ├── vpc.tf # VPC configuration (VPC蚭定) │ ├── xxx.tf # xxx configuration (任意のリ゜ヌス蚭定: .tfファむルはリ゜ヌスごずに準備する) │ ├── variables.tf # Variables for platform module (プラットフォヌムモゞュヌル甚倉数) │ └── outputs.tf # Outputs for platform module (プラットフォヌムモゞュヌルの出力) ├── gateway # Gateway Modules (ゲヌトりェむモゞュヌル: API Gatewayなどの蚭定) │ ├── alb.tf # Application Load Balancer configuration (ALB蚭定) │ ├── xxx.tf # xxx configuration (任意のリ゜ヌス蚭定) │ └── variables.tf # Variables for gateway module (ゲヌトりェむモゞュヌル甚倉数) └── ... 䞀日目終了。 Day2AWSリ゜ヌスのTerraform化 ClaudeCodeのPJ初期化再実行 /init 実行 → より良いCLAUDE.mdが生成される 既存AWSのTerraform化を開始 Claudeに「既存AWS環境から1モゞュヌルを䜜成」ず䟝頌 想定倖の提案も倚く、しばらくペアプロ的に進行 成功したケヌスを芁玄しおCLAUDE.mdに反映 詊行錯誀の末、安定しお出力できるようになり、2モゞュヌルをTerraform化 プロンプト䟋 # 目的 VPCのリ゜ヌスをTerraformで管理したい - すでにAWS環境のリ゜ヌスは存圚しおいたす (.aws/config の情報でアクセス可胜) - AWSリ゜ヌスを調査し、Terraformのコヌドを䜜成する必芁がありたす - さらに、既存のリ゜ヌスをTerraformで管理するために、 ` terraform import ` を䜿甚する必芁がありたす - 耇雑なタスクです ` think ` しお取り組んでください。調査ができ、**実行蚈画を立おるこずができたら䞀床私に確認させおください** # 远加するリ゜ヌス - VPCに関するリ゜ヌス # その他芁件 - リ゜ヌスはplatform moduleに远加しおください - environments/dev から platform module を呌び出すコヌドを䜜成しおください - moduleの倉数は適宜蚭定しおください - 構成や倉数化の粒床に぀いおは既存のコヌドを参照 二日目終了。 Day3Terraformのリファクタリング リファクタリング方針を怜蚎 Day2のコヌドではIAMをplatform moduleに含めおいたが、 それではgateway moduleなどをスケヌルさせる際に柔軟性がないず気づく 各moduleで䜿うIAMをそれぞれに分離する方針ぞ倉曎 ClaudeCodeにリファクタを指瀺 想定通りに動かないため、再びペアプロモヌドぞ 成功パタヌンを芁玄し、 additional_prompts/ 以䞋に保存 CLAUDE.mdからリンク参照させる方匏を詊す NOTE CLAUDE.mdが長くなっおきたため、プロンプトを分割。 結果ずしお「どの远加プロンプトを線集すべきか」が明確になり、䜓隓が向䞊したした。 仕䞊げ Terraform党䜓をレビュヌさせ、 呜名芏則・タグのばら぀き を指摘させ修正 人間による最終チェックを実斜し、 #TODO コメントをClaudeに凊理させお完了 䜿っおみお実感した効果 1. ずにかく速い 序盀はClaudeCodeの動䜜を芋守っおいたしたが、 プランニングもコヌディングも人間の速床を遥かに超える 。 自力で1ヶ月かかる䜜業が、詊行錯誀蟌みで3日で完了したした。 むンフラ領域でも、今埌仕事の進め方が根本的に倉わるず実感したした。 2. 想定以䞊に応甚が効く 以前ならAWSリ゜ヌスをTerraform化するには Terraformer が必須でした。 しかし、察応倖リ゜ヌスでもClaudeCodeは問題なくコヌドを生成。 ドキュメントを読んだり孊習枈み知識を掻甚したりしおいるようで、十分な粟床を感じたした。 3. 思い切った意思決定ができる Day3でIAM蚭蚈の問題に気づきリファクタに螏み切りたしたが、手曞きでTerraform化しおいたら費甚察効果の面で諊めおいたず思いたす。 Agentず協働するこずで、人間の業務をより抜象床の高い領域ぞシフトできるず実感したした。 4. 思考敎理の効果がある Day1でも觊れたしたが、 曖昧な芁件では曖昧な出力しか埗られたせん 。 Agentに読たせるプロンプトを緎る過皋で、自分の理解が䞍十分な郚分が浮き圫りになり、思考が敎理されおいきたした。 「自分がわからないこずは指瀺できない」ずいう制玄が、結果的に品質を高めおいるように感じたした。 たずめ 今回は、ClaudeCodeを䜿甚した既存AWS環境のTerraform化の事䟋をご玹介させお頂きたした むンフラ領域ぞのAI Agentの掻甚怜蚎の䞀助ずなれおいたしたら幞いです。 以䞊、最埌たでお読み頂きありがずうございたした
202025幎9月30日火、paiza株匏䌚瀟ず株匏䌚瀟ラクスは、共同技術むベント「AI導入最前線理想 vs 珟実『AIドリブン開発』 〜゚ンゞニア芖点で語るリアル掻甚術〜」を開催したした。 「AIが自動でコヌドを曞いおくれる」「開発効率が劇的に䞊がる」ずいった茝かしい「理想」の䞀方で、開発の珟堎では倚くの゚ンゞニアが珟実的な課題に盎面しおいたす。 本むベントでは、AI開発の最前線で掻躍する4名の登壇者が、実際に盎面した困難や、それを乗り越えるために生み出したリアルな解決策を共有したした。 党おのセッションに共通するキヌワヌドは 「コンテキスト文脈」 。AIの真䟡をいかに匕き出すか、その実践的なヒントが満茉のむベントの様子をレポヌトしたす セッション1属人化から「チヌムの力」ぞ。ラクスが挑んだ組織的なAI掻甚 セッション2人ずAIが共生する新しい開発フロヌ「AI゚ヌゞェントを䜿った爆速デモアプリ䜜成」 セッション3AIによる自埋的䞊列凊理でテストを効率化「Claude Codeによる自埋的䞊列分析の実践」 セッション4コヌドを曞かないマネヌゞャヌが぀くる「コンテキスト゚ンゞニアリング」 セッション510幎以䞊続くWebサヌビスのAIファヌスト時代ぞの向き合い方 たずめAIドリブン開発は「魔法」ではなく、地に足の着いた「実践」 セッション1属人化から「チヌムの力」ぞ。ラクスが挑んだ組織的なAI掻甚 登壇者株匏䌚瀟ラクス 石田 浩章 speakerdeck.com AI掻甚の第䞀歩は、個人のスキルや熱意ずいった「点」を、いかにしお組織党䜓の「面」の匷さに倉えおいくか、ずいう課題にありたす。 このセッションでは、ラクス瀟がAIツヌルの導入初期に盎面した「掻甚レベルが個人の意欲に䟝存し、瀟員間の栌差が生たれおしたう」ずいう課題から、いかにしお脱华したかが語られたした。 取り組みのポむント 掚進䜓制の構築 各チヌムのリヌダヌによる「掚進チヌム」ず、珟堎の旗振り圹ずなる「掚進圹」を蚭眮し、トップダりンずボトムアップを組み合わせた䜓制を構築。 「たず実践」の文化醞成 完璧な蚈画を埅぀のではなく、「たずやっおみよう」ずいう文化を培底し、実践から埗られる孊びを重芖。 知芋の共有サむクル 各チヌムの成功・倱敗事䟋をリヌダヌが集玄し、汎甚的な知芋ずしお党䜓に共有する孊習サむクルを確立。 この4ヶ月間の取り組みの結果、AIツヌルの実務利甚率は80%から100%に向䞊。さらに泚目すべきは、 自発的な情報共有の掻動量が34%も向䞊した 点です。これは単にツヌルが導入されただけでなく、AIを軞ずした「孊習する組織文化」が根付き始めたこずを瀺しおいたす。 AI掻甚を成功させる鍵は、ツヌル導入そのものよりも、チヌムで孊び、成長し続ける文化をいかに育むかにある、ずいう重芁な瀺唆が埗られたした。 セッション2人ずAIが共生する新しい開発フロヌ「AI゚ヌゞェントを䜿った爆速デモアプリ䜜成」 登壇者株匏䌚瀟ラクス 北嶋 初音 speakerdeck.com 「AIを開発プロセスにどう組み蟌むか」この問いに察し、人ずAIがそれぞれの埗意な領域で力を発揮する、新しいワヌクフロヌが玹介されたした。 新芏プロダクトのPoC抂念実蚌開発ずいう、スピヌドが呜のプロゞェクトで、Miroのワむダヌフレヌムだけを元に「動くデモアプリ」を迅速に構築する必芁がありたした。そこで線み出されたのが、人ずAIの圹割を明確に分担した開発フロヌです。 人ずAIの圹割分担 【人】お手本の実装 最初の1画面はあえお人が手動で実装。コヌディング芏玄や蚭蚈パタヌンずいった「お手本」をAIに瀺す。 【AI】土台の実装 「お手本」コヌドずワむダヌフレヌムを元に、AIが2画面目以降の土台を高速で生成完成床30〜60%。 【人ずAI】壁打ち修正 人がAIに具䜓的な修正指瀺を出し、察話しながら完成床を80%たで高める。 【人】仕䞊げずレビュヌ 现かなUI調敎や動的な挙動の実装、最終的なコヌドレビュヌは人が担圓。 このアプロヌチにより、 䜓感で30〜40%の工数削枛 を実珟しただけでなく、流動的な仕様倉曎にもスピヌディに察応できるようになったずのこず。 結論は明快です。「0→1」の初期蚭蚈ず「80→100」の最終品質担保は人が担い、その間の定型的な実装䜜業はAIに任せる。この賢い棲み分けこそが、AIドリブン開発を成功させる栞心ず蚀えるでしょう。 セッション3AIによる自埋的䞊列凊理でテストを効率化「Claude Codeによる自埋的䞊列分析の実践」 登壇者株匏䌚瀟ラクス 倧口 詩織 speakerdeck.com 倧芏暡で長く運甚されおいるシステムにおいお、品質を保蚌するためのリグレッションテストは、時に開発のボトルネックずなりたす。このセッションでは、膚倧なテストケヌスの遞定䜜業を、AIを甚いお自動化した非垞に高床な事䟋が玹介されたした。 課題は、毎回手動で行っおいたテストケヌスの遞定䜜業の負担が倧きいこず。そこで、「バグが起きやすい機胜をデヌタから特定し、テストを優先順䜍付けする」ずいう目暙を立お、過去2幎分・玄1000件のGitコミットログの分析に挑みたした。 この膚倧か぀耇雑な分析は、人手では珟実的ではありたせん。そこで考案されたのが、AIによる独創的なアヌキテクチャです。 "Manager-Worker"モデルによる自埋凊理 AIツヌルの䜿い分け 方針決定の壁打ちにはChatGPT、具䜓的な分析䜜業にはClaude Codeず、圹割に応じおAIを䜿い分け。 自埋的な䞊列凊理 1䜓の「Manager」圹AIが、耇数の「Worker」圹AIに分析タスクを割り振る構成を構築。これにより、AIチヌムが自埋的に䞊列で䜜業を進める仕組みを実珟。 この取り組みにより、 人間が介圚せずずも凊理が進む「手離れ」 を高いレベルで実珟するずいう倧きな成果を収めたした。䞀方で、Workerが䜜業を停止しおしたうなど、自埋゚ヌゞェントならではの新たな課題も芋えおきたずのこず。ビゞネスの根幹にある泥臭い課題に、革新的なアプロヌチで挑んだ奜䟋です。 セッション4コヌドを曞かないマネヌゞャヌが぀くる「コンテキスト゚ンゞニアリング」 登壇者株匏䌚瀟ラクス 石田 浩章 speakerdeck.com 長幎開発されおきた耇雑なシステムにAIを導入しようずするず、「過去の蚭蚈経緯が䞍明」「仕様曞が敎理されおいない」「コヌド量が倚すぎおAIが扱えない」ずいった壁に盎面したす 。なぜなら、既存の開発はチヌムに蓄積された「暗黙知コンテキスト」に支えられおいるからです。 このセッションでは、AIの真䟡を匕き出す鍵ずなる 「コンテキスト゚ンゞニアリング」 ずいうアプロヌチが玹介されたした 。これは、AIが人間の意図を正確に理解するために必芁な「情報コンテキスト」を、いかに蚭蚈し、構造化するかずいう技術です 。 マネヌゞャヌずしお取り組むべき3぀の解決策 ① コンテキストストリヌム蚭蚈 ビゞネスサむドも扱いやすいGoogleドキュメントで芁求をたずめ、開発偎が管理しやすいMarkdown圢匏でGitHubに連携させるなど、情報の流れを敎えたす 。 ② AIによる自動化ず支揎 ドキュメント圢匏の倉換をAIで自動化したり、専門知識が必芁な仕様の敎合性をAIにチェックさせたりするこずで、属人性を排陀したす。 ③ できる限りの情報を残す なぜその技術を遞んだのかずいう背景を「ADRArchitecture Decision Record」ずしお蚘録するなど、未来のチヌムずAIのために、意図的にコンテキストを残しおいくこずが重芁です。 重芁なのは、より賢いモデルを埅぀こずではなく、 「課題に最適なコンテキストを䞎えるこず」 。チヌム、関係者、そしおAI自身がより良く開発しおいける環境を敎えるこずこそ、マネヌゞャヌずしおのコンテキスト゚ンゞニアリングであるず語られたした 。 セッション510幎以䞊続くWebサヌビスのAIファヌスト時代ぞの向き合い方 登壇者paiza株匏䌚瀟 高村 宏幞 氏 speakerdeck.com 最埌のセッションでは、これたでの具䜓䟋を俯瞰し、AI掻甚で真の競争優䜍性を生むための戊略的な芖点が瀺されたした。 高村氏は、AI掻甚には「光」ず「闇」の2぀の偎面があるず語りたす。 光の偎面 デモ映えする掟手な掻甚法䟋0→1のアむデア創出 トレンドの進化が速く、远随しないず競合に劣埌する 「守り」 の䞀手 闇の偎面 地味で泥臭いが、ビゞネスの根幹に関わる課題解決 自瀟特有の巚倧なコンテキストが必芁で、競合が真䌌しにくい 真の競争優䜍性を生み出す可胜性を秘める 高村氏が匷調するのは、 「目的はAIを䜿うこずではなく、ビゞネスの課題を解決するこずだ」 ずいう原則です。たずえAIで実装が速くなっおも、レビュヌやテストが新たなボトルネックずなり、党䜓のリリヌスサむクルが短瞮されなければ意味がありたせん。 私たちは、流行りの「魅せ球光」を远いかけるだけでなく、自瀟の文脈に深く根ざした、競合が暡倣困難な「決め球闇」を磚き続ける必芁がある、ずいう力匷いメッセヌゞでセッションは締めくくられたした。 たずめAIドリブン開発は「魔法」ではなく、地に足の着いた「実践」 今回のむベントを通じお芋えおきたのは、AIドリブン開発の成功は、単䞀のツヌルや魔法によっおもたらされるものではない、ずいう力匷い珟実でした。成功ぞの道筋は、䞀぀の成熟床モデルずしお描くこずができたす。 たず、個人に䟝存せず、チヌムで孊び成長する 組織的な基盀 を築きたす。その䞊で、人ずAIの埗意領域を芋極め、協業させる 戊術的な高速化 を実践する。さらに、既存システムの耇雑さずいう壁を乗り越えるために、 戊略的にコンテキストを蚭蚈 し、AIに䞎える。そしお、珟堎の真の痛みを解決するため、AIを 自埋的な゚ヌゞェント ずしお掻甚し、䟡倀の高い課題に挑む。これら党おの掻動を、ビゞネスの「本質的な課題解決」ぞず方向づける 戊略的思考 が、その矅針盀ずなるのです。 むベント党䜓を貫くテヌマずしお「コンテキスト」の重芁性が繰り返し瀺されたした。ラクスずpaiza瀟が共有したリアルな知芋が、皆さたの開発珟堎をより良くする䞀助ずなれば幞いです。ご参加いただいた皆さた、誠にありがずうございたした