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.
Svelteで作るページビルダー
childhooooo
0
300
JavaScriptを使わない(Phoenix LiveViewの紹介)
childhooooo
0
970
DDD by Functional programming with TypeScript
childhooooo
2
2.3k
Featured
See All Featured
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Side Projects
sachag
455
43k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
71
40k
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
200
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
220
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Producing Creativity
orderedlist
PRO
348
40k
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が走るレールを用意して 持続的なバイブコーディングを