Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ビジネスモデルから紐解く、AI+型駆動開発

 ビジネスモデルから紐解く、AI+型駆動開発

Avatar for Hiroki Omote

Hiroki Omote

May 22, 2026

More Decks by Hiroki Omote

Other Decks in Programming

Transcript

  1. / TSKaigi 2026 / 02 / 50 S P EAK

    ER estie, inc. S K I L L S D O M A I N I N T E R E S T L I N K
  2. / TSKaigi 2026 / 07 / 50 H Y P

    O T H E S I S 0 1 0 2
  3. / TSKaigi 2026 / 10 / 50 A GEND A

    PA R T 0 1 01 PA R T 0 2 02 PA R T 0 3 03 PA R T 0 4 04 Part 01 —
  4. / TSKaigi 2026 / 13 / 50 01 C O

    N V E N T I O N A L T H I S TA L K
  5. / TSKaigi 2026 / 14 / 50 01 01 Interaction-centric

    SaaS 02 Data-dependent 03 API-centric microservice 04 Marketplace
  6. / TSKaigi 2026 / 15 / 50 01 : 02

    Data-dependent 03 API-centric 01 Interaction-centric SaaS 04 Marketplace : TS
  7. / TSKaigi 2026 / 16 / 50 01 C ONCE

    PT-L EV EL C OMPAR ISON VALUE CENTER ORIGIN EXAMPLES
  8. / TSKaigi 2026 / 17 / 50 01 C ODE

    -PAT TE R N CO MPARIS ON TYPE // type S = | {k:'a'} | {k:'b'}; // type PropertyId = Brand<string, 'PropertyId'>; // type Out = z.infer< typeof schema>; // → type BuyerView = Pick<Tx, 'id'|'price'>; PROMPT
  9. / TSKaigi 2026 / 18 / 50 A GEND A

    PA R T 0 1 01 PA R T 0 2 02 PA R T 0 3 03 PA R T 0 4 04 Part 02 — 4
  10. / TSKaigi 2026 / 20 / 50 02 — 4

    01 02 03 04 VALUE CENTER ORIGIN EXAMPLES
  11. / TSKaigi 2026 / 21 / 50 C AT E

    G O RY 01 / 04 Interaction-centric SaaS 01 02 03 — E X A M P L E S
  12. / TSKaigi 2026 / 22 / 50 01 — S

    a a S CL IENT API DATA UI · STATE
  13. / TSKaigi 2026 / 23 / 50 C AT E

    G O RY 02 / 04 Data-dependent 01 02 03 — E X A M P L E S
  14. / TSKaigi 2026 / 25 / 50 C AT E

    G O RY 03 / 04 API-centric microservice 01 02 03 — E X A M P L E S
  15. / TSKaigi 2026 / 26 / 50 03 — A

    PI CL IENT API DATA API / CONTRACT
  16. / TSKaigi 2026 / 27 / 50 C AT E

    G O RY 04 / 04 Marketplace 01 02 03 — E X A M P L E S
  17. / TSKaigi 2026 / 29 / 50 A GEND A

    PA R T 0 1 01 PA R T 0 2 02 PA R T 0 3 03 PA R T 0 4 04 Part 03 — Origin
  18. / TSKaigi 2026 / 31 / 50 03 .proto g

    R P C schema.graphql G r a p h Q L openapi.yaml O p e n A P I schema.prisma D B S C H E M A tokens.json D E S I G N T O K E N S type / interface T S D E S T I N AT I O N
  19. / TSKaigi 2026 / 32 / 50 03 — Orig

    in 01 02 03 04 ORIGIN schema.prisma .proto openapi.yaml HOW
  20. / TSKaigi 2026 / 33 / 50 03 — T

    S D E F I N E TS is the definer · 01 · INTERACTION UI 04 · MARKETPLACE R E C E I V E TS is the receiver · AI 02 · DATA DB Schema 03 · API .proto / OpenAPI
  21. / TSKaigi 2026 / 34 / 50 03 — 01

    02 03 04 VALUE CENTER ORIGIN ROLE EXAMPLES
  22. / TSKaigi 2026 / 35 / 50 03 04 —

    O P T I O N A — O P T I O N B .proto schema.prisma openapi.yaml
  23. / TSKaigi 2026 / 36 / 50 A GEND A

    PA R T 0 1 01 PA R T 0 2 02 PA R T 0 3 03 PA R T 0 4 04 Part 04 — AI
  24. / TSKaigi 2026 / 38 / 50 04 — W

    ORK FL OW S T E P 0 1 · 01 D E FI NE T HE O R IG IN type FormState = | { status: 'editing' } | { status: 'submitting' } | { status: 'done' }; S T E P 0 2 · 02 PA SS A S CONT E XT + prompt: S T E P 0 3 · A I 03 GE NER AT E function Form(...) { switch (s.status) { case 'editing': ... } } S T E P 0 4 · Ty p e S c r i p t 04 GU AR D AT C O MPI LE // // //
  25. / TSKaigi 2026 / 39 / 50 04 — P

    RO M PT DE PT H L E V E L 01 > — O U T P U T L E V E L 02 > type FormState = { ... } + — O U T P U T L E V E L 03 > schema.prisma / .proto — O U T P U T
  26. / TSKaigi 2026 / 40 / 50 04 — C

    OM P ON EN T TRE E 01 02 03 04 Pick infer type interface B A C K E N D F R O N T E N D A P I API B L 1 Page L 2 Domain Component L 4 · D O M A I N - F R E E Input L 4 · D O M A I N - F R E E Button L 3 Composite UI A P I · API A
  27. / TSKaigi 2026 / 41 / 50 04 — S

    a a S · 01 invite-member.ts P R O M P T I N P U T type InviteMemberFormState = | { status: 'editing'; email: string; role: Role; errors: ValidationError[] } | { status: 'confirming'; email: string; role: Role } | { status: 'submitting'; email: string; role: Role } | { status: 'succeeded'; invitedEmail: string } | { status: 'failed'; email: string; role: Role; error: SubmitError }; type SubmitError = | { code: 'already_invited'; existingMemberEmail: string } | { code: 'quota_exceeded'; currentCount: number; limit: number } | { code: 'network_error' }; type Role = 'admin' | 'editor' | 'viewer'; Y O U InviteMemberFormState
  28. / TSKaigi 2026 / 42 / 50 04 — S

    a a S · 02 FailedView.tsx C L A U D E O U T P U T function FailedView({ error, onRetry, onCancel }: FailedViewProps) { switch (error.code) { case 'already_invited': return <p> {error.existingMemberEmail} </p>; case 'quota_exceeded': return <p> ( {error.limit} ) ( {error.currentCount} )</p>; case 'network_error': return <p> </p>; } // ↑ 'code' } O B S E R V E existingMemberEmail limit currentCount
  29. / TSKaigi 2026 / 43 / 50 04 — S

    a a S · 03 W H AT A I C A N D O W H AT A I C A N N O T D O
  30. / TSKaigi 2026 / 44 / 50 04 — ·

    0 1 transaction.ts P R O M P T I N P U T // type Transaction = { id: TransactionId; sellerId: UserId; // buyerId: UserId; // price: number; platformFee: number; // shippingAddress: Address; // trackingNumber: string | null; status: TransactionStatus; // Discriminated Union ( ) // ... }; Y O U SellerTransactionView BuyerTransactionView
  31. / TSKaigi 2026 / 45 / 50 04 — ·

    0 2 SellerView.ts S E L L E R // type SellerTransactionView = Pick < Transaction, | 'id' | 'itemId' | 'buyerId' | 'price' | 'platformFee' | 'shippingFee' | 'trackingNumber' | 'status' | 'buyerRating' > & { netRevenue: number; }; // : shippingAddress, sellerRating BuyerView.ts B U Y E R // type BuyerTransactionView = Pick < Transaction, | 'id' | 'itemId' | 'sellerId' | 'price' | 'shippingFee' | 'shippingAddress' | 'trackingNumber' | 'status' | 'sellerRating' > & { totalPaid: number; }; // : platformFee, buyerRating
  32. / TSKaigi 2026 / 46 / 50 04 — ·

    0 3 W H AT A I C A N D O W H AT A I C A N N O T D O
  33. / TSKaigi 2026 / 47 / 50 04 — S

    UM M ARY 01 · 02 03 04 · ORIGIN HOW AI · OK HUMAN · KEEP
  34. TSKaigi 2026 · 2026/05/22 50 / 50 F I N

    S P E A K E R omote estie, inc. F I N D M E X / @HirokiOmote S L I D E S W E A R E H I R I N G estie.jp/careers