Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Agent on Rails - AIをDDDのレールの上で制御する
Search
maku.
June 07, 2025
210
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Agent on Rails - AIをDDDのレールの上で制御する
maku.
June 07, 2025
More Decks by maku.
See All by maku.
Agent-First Toolchain — ツールから選び直すハーネスエンジニアリング
childhooooo
1
92
Svelteで作るページビルダー
childhooooo
0
300
JavaScriptを使わない(Phoenix LiveViewの紹介)
childhooooo
0
970
DDD by Functional programming with TypeScript
childhooooo
2
2.3k
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
100
6.2k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
250
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.5k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.1k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.7k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
119
120k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
390
Darren the Foodie - Storyboard
khoart
PRO
3
3.6k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Transcript
Gunma.web AIをDDDのレールの上で制御する @tuanemuy Hikaru Otabe Agent on Rails
自己紹介 @tuanemuy Hikaru Otabe 大田部 晃 Freelance Web Developer
6〜7年前の技術トレンド 覚えていますか?
Gunma.web #30 DDD / ドメイン駆動設計 2018.01.20 7年前のGunma.web
最近は誰も設計の話をせず、 バイブコーディングばかり...
Claude Codeで バイブコーディングやってみた
できた!
AIの生成したコード、 読みたいですか?
AIの生成したコード export await if return state pending result result result
function const async => const () TaskForm onTaskCreated : formAction = useActionState ( : : ) { = onTaskCreated } { } ( ) { { } [ ] ( TaskFormProps unknown FormData createTaskAction , , , ; . ; ; , : _prevState formData formData success error ( ) ( ) { } null
AIの生成したコード export as as as try await as async function
const const const const createTaskAction : = get = get = get = ( ) ( | | ( ) { formData formData formData formData db tasks userId id title priority title priority dueDate newTask user priority FormData string string string insert values ( ) . " " ; . " " ; . " " ; . . : . , , : " " " " " " ( ) ( ) ( ) { title priority dueDate { low medium high
DDDの考え方を取り入れて AIをうまく制御する
" 技術的 ドメイン " ビジネス 技術 " ユビキタス言語 " モデルを明示的に表現
な課題ではなく、 において価値のある部分や 複雑な部分にフォーカスしよF 側と 側が協調してモデリングしよF そのために共通の を話そF するソフトウェアを書こう DDDの考え方(ざっくり)
$ 技術的 ドメイン $ ビジネス 技術 $ ユビキタス言語 $ モデルを明示的に表現する
な課題ではなく、 において価値のある部分や 複雑な部分にフォーカスしよG 側と 側が協調してモデリングしよG そのために共通の を話そG ソフトウェアを書こう $ $ $ $ モデルを明示的に表現 するソフトウェアを書こう DDDの考え方(ざっくり)
$ 技術的 ドメイン $ ビジネス 技術 $ ユビキタス言語 $ モデルを明示的に表現する
な課題ではなく、 において価値のある部分や 複雑な部分にフォーカスしよG 側と 側が協調してモデリングしよG そのために共通の を話そG ソフトウェアを書こう $ l $ $ l $ モデルを明示的に表現 → ORM等の具体的な実装よりも、モデルを優先する l するソフトウェアを書こう DDDの考え方(ざっくり)
バイブコーディングでよくあるSupabaseクライアントを UIコンポーネントから直接呼び出すみたいなのはNV インターフェースを最初に定義し、例えばDB操作の具体実 装はSupabaseクライアントにも各種ORMにも切り替えら れるようなイメージ DDDの考え方(ざっくり)
ヘキサゴナルアーキテクチャ (Ports and Adapters) データベース Adapters 外部のAPI Adapters Port Port
Application Service
ヘキサゴナルアーキテクチャ (Ports and Adapters) Port 外部サービスを利用するモジュールのインターフェース Application Service ユースケースの実装 依存
依存 依存 Adapters 外部サービスを利用するモジュールの実装 データベース 外部API etc...
設計を `CLAUDE.md`に書いて 実装させてみる
Entity, Value Object, DTO export export TaskSchema TaskIdSchema UserIdSchema TaskStatusSchema
TaskPrioritySchema TaskSchema const type = object string() min( ) max( ) date() optional() date() date() = typeof z id userId title z status priority dueDate z createdAt z updatedAt z . : , : , : . . . , : , : , : . . , : . , : . , ; . ; ( ) < > { } 1 200 Task z infer
Port export interface TaskRepository CreateTaskParams Promise Result Task RepositoryError TaskId
Promise Result Task null RepositoryError UserId TaskFilter TaskSort Promise Result Task RepositoryError UpdateTaskParams Promise Result Task RepositoryError { create : : < > getById : : < | > getByUserId : ?: ?: : < > update : : < > ( ) < > ( ) < > ( ) < > ( ) < > params id userId filter sort params , ; , ; , , , , ; , ; []
Adapter export await result tasks class implements constructor private readonly
async const this DrizzleSqliteTaskRepository TaskRepository Database CreateTaskParams Promise Result Task RepositoryError { { ( ) {} ( ) < > { db params db userId params userId title params title status : create : : < > = insert values , . . . : . , : . , : " ", ( ) ( pending
Application Service export await if return paramsResult CreateTaskParamsSchema createResult paramsResult
createResult async function const const createTask : : : = parse = create isErr() err( ( ) < > { context params params context taskRepository data Context CreateTaskParams Promise Result Task ApplicationError , , , . ; . . . ; . < > ( ) ( ) ( ) {
生成されたコード / CLAUDE.md https://github.com/tuanemuy/agent-on-rails tuanemuy/agent-on-rails
AIが走るレールを用意して 持続的なバイブコーディングを