
- TOP
- ã¿ã°äžèЧ
- TypeScript
TypeScript
ã€ãã³ã
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
ãã¬ãžã³
æè¡ããã°
AWS ã§ã¯ãAI ãæŽ»çšããæ°ãããœãããŠã§ã¢éçºææ³ã AI-DLCïŒAI-Driven Development Life CycleïŒ ããæå±ããŠããŸããAI-DLC ã¯ãAI ãåãªãè£å©ããŒã«ãšããŠã§ã¯ãªããèŠä»¶å®çŸ©ããèšèšã»å®è£
ã»ãã¹ããŸã§ã®éçºã©ã€ããµã€ã¯ã«å
šäœã«çµã¿èŸŒã¿ãªããã人éãäž»å°æš©ãæ¡ãïŒHuman-in-the-LoopïŒããšãåæãšããéçºææ³ã§ãããã® AI-DLC ãçæéã§äœéšã»å®è·µããã ãã¯ãŒã¯ã·ã§ããããAI-DLC Unicorn GymïŒä»¥äž UGïŒãã§ãã 2026 幎 6 æ 11 æ¥ã12 æ¥ãæ ªåŒäŒç€Ÿãµã³ãªãª ããžã¿ã«äºæ¥éçºéšã®çæ§ãš 2 æ¥éã®ããµã³ãªãª AI-DLC UGããéå¬ããŸãããæ¬èšäºã§ã¯ãéå¬ã¬ããŒããšãåå ã¡ã³ããŒã®çæ§ã«äœéšãèªã£ãŠããã ãã座è«äŒã®æ§åããå±ãããŸãã 1. ãµã³ãªãª AI-DLC Unicorn Gym éå¬ã¬ããŒã ãµã³ãªãª AI-DLC Unicorn Gym åå ã¡ã³ã㌠ãµã³ãªãªã®ããžã¿ã«äºæ¥éçºéšã¯ãããã£ã©ãã©ãªãªãïŒå
¬åŒãšãã¡ã³ãã€ãªããåµäœãã©ãããã©ãŒã ïŒãããªã¢ã€ããããžãïŒã€ãã³ãåå èšé²ã»ãŠãŒã¶ãŒäº€æµ SNSïŒãªã©ãããžã¿ã«ãããã¯ãã®äŒç»ã»éçºãæ
ã£ãŠããŸãã2025 幎ããéçºã®å
補åã«èµãåããå°æ°ç²Ÿéã®ããŒã ã§ Claude Code ãäžå¿ãšãã AI 掻çšéçºãå®è·µããŠããŸãããå人ã®çç£æ§åäžã®å
ã«ãããããŒã ãšããŠãäžæµå·¥çšããã©ã AI ãçµã¿èŸŒããããšãã課é¡ãžã®çããæ±ã㊠AI-DLC ã«çç®ãããããšããä»åã®éå¬ã®ãã£ããã§ãã åœæ¥ã¯ããžã¿ã«äºæ¥éçºéš ãããã¯ãéçºèª² ã·ãã¢ãããŒãžã£ãŒ åäº éŸå€ªé æ°ãã¯ãããšãã 2 ããŒã 6 åã®ãšã³ãžãã¢ãšãããã¯ããããŒãžã£ãŒãåå ããå®éã®ãããã¯ããé¡æã« AI-DLC ã®å
šãã§ãŒãºãäœéšããŸãããããŒã«ã«ã¯ Kiro ãå©çšããAI ãšãŒãžã§ã³ããäžå¿ã«æ®ããéçºã¯ãŒã¯ãããŒãå®è·µããŠããŸããAWS åŽã¯ã¢ã«ãŠã³ããããŒãžã£ãŒã®è»å 賢倧ããœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ãã®å±±æŸ€ è¯ä»ã»ç§ç° çŽæãåããŒã ã«äŒŽèµ°ããŸããã ããŒã ããŒã æè¡æ§æ ææ ããŒã A ïŒãªã¢ã€ããããžïŒ ãªã¢ã€ããããž ç®¡çæ©èœæ¡åŒµ â ããã±ãŒãžè©³çްãžã® URL ãªã³ã¯èšçœ® TypeScript / Kiro inception ããæ¬çªããŒãžãŸã§ çŽ 5 æé ã§å®äºããããã€æžã¿ã ããŒã B ïŒæ°èŠã¢ããªïŒ æ°èŠã¢ããªã®ç«ã¡äžã TypeScript / Kiro 管çè
åã管çç»é¢ãŸã§æ§ç¯å®äº ããŒã A ã®ææ â ãäœããªãã倿ãšãçŽ 5 æéã§ã®æ¬çªããŒãž ããŒã A ã§ã¯ 2 ã€ã®ãŠãŒã¶ãŒã¹ããŒãªãŒãæ€èšããŸããã1 ã€ç®ã¯ãAI ãšäžç·ã«äŸ¡å€ãšå®çŸæ¹æ³ãæãäžããçµæãæ©èœãå®è£
ããªããŠãéçšã§ã«ããŒã§ããããšå€æãããããŠå®è£
ããªãããšãéžæãAI ã§å®è£
ãéããªãã»ã©ãäœãäœããªãããã®å€æã«äŸ¡å€ãçãŸããããšãç€ºãææãšãªããŸããã 2 ã€ç®ã®ã¹ããŒãªãŒãããã±ãŒãžè©³çްãžã® URL ãªã³ã¯èšçœ®ãã§ã¯ãAI-DLC ã®å
šãã§ãŒãºãäžæ°é貫ã§äœéšããŸããã æå» ãã§ãŒãº å
容 Day 2 10:59 Inception ã€ã³ã¿ãã¥ãŒåã® add-inception ã¹ãã«ãäœæ Day 2 13:59 Inception AI ã®ã€ã³ã¿ãã¥ãŒãåã㊠inception ããã¥ã¡ã³ããäœæã»ããŒãž Day 2 15:03 Construction æ¢åã®èšèšã¹ãã«ã§èšèšæžãäœæããèªåŸå®è£
ãž Day 2 15:58 ããŒãž backend / API / 管çç»é¢ / ã¢ããªã®å®è£
ãããŒãž inception éå§ããæ¬çªããŒãžãŸã§ çŽ 5 æé 2. 座è«äŒ â åå ã¡ã³ããŒã«èã è»åïŒAWSïŒ ä»åã® AI-DLC UG ãå®çŸããçµç·¯ãæããŠãã ããã åäºæ°ïŒãµã³ãªãªïŒ æ¥é ãã Claude Code ã䜿ã£ãŠéçºããŠããŸããããå人ã®çç£æ§ã¯äžãã£ãŠããããŒã ãšããŠãäžæµå·¥çšããã©ã AI ãçµã¿èŸŒãããããã£ãšèª²é¡ã§ãããAWS ã® AI-DLC ã®ããã°ãèŠã€ãããšãããŸãã«ããã ãšæã£ãŠãããã«ããŒãã£ã³ã°ã§çžè«ããŸããã è»åïŒAWSïŒ AI ã«ã€ã³ã¿ãã¥ãŒãããªãããŠãŒã¶ãŒã¹ããŒãªãŒãäœãããã»ã¹ã¯ã©ãã§ãããã ããŒã A ã¡ã³ããŒïŒãµã³ãªãªïŒ ãäœãã»èª°ã«ã»ã©ããªäŸ¡å€ãã»ã©ãæ€èšŒããããã AI ãé çªã«èããŠãããã®ã§ãæãæŒããé²ããŸããã䟡å€ã®ã³ã³ããªã¯ããæåææšãªã©ãäžäººã§ã¯é£ã°ããã¡ãªèгç¹ã確å®ã«ééã§ããã®ã倧ããã§ãããŸãã€ã³ã¿ãã¥ãŒãã¹ãã«åããæ¹åã¹ããããçµã¿èŸŒãã ã®ã§ã誰ããã£ãŠãåãå質ã®ã€ã³ã»ãã·ã§ã³ããã»ã¹ãèžããããã«ãªããŸããã è»åïŒAWSïŒ AI-DLC ãäœéšããããšã§ãä»åŸã®éçºã«ã©ã掻ãããŠããããã§ããã åäºæ°ïŒãµã³ãªãªïŒ 倧ãã 2 ã€ãããŸãã1 ã€ç®ã¯ãã€ã³ã»ãã·ã§ã³ããã»ã¹ã§èšèªåããããšã§ãäŒç»åŽã®ç®çããã£ããçè§£ããäžã§éçºãé²ããããææ»ãã倧å¹
ã«æžãããããšã2 ã€ç®ã¯ããŠãŒã¶ãŒã¹ããŒãªãŒãæžãããšã§ãããžã§ã¯ãã¡ã³ããŒå
šå¡ãåãæ
å ±ãæã£ãäžã§éçºãé²ãããšã§ããéåžžã«ã¹ã ãŒãºã§ããã ããŒã A ã¡ã³ããŒïŒãµã³ãªãªïŒ ä»åŸã¯å®éã®éçºãããŒã« PM ã®äœæ¥ãçµã¿èŸŒã¿ãããšèããŠããŸããPMã»ãšã³ãžãã¢ã®ãäœæ¥ãããšãŒãžã§ã³ãã«ä»»ããŠã人éã¯èšèšãšã¬ãã¥ãŒã«å°å¿µãã â ãããç®æãå§¿ã§ãã åäºæ°ïŒãµã³ãªãªïŒ å
補åãé²ããäžã§ãå°äººæ°ã§ããã«å€§ããªäŸ¡å€ãå±ãããããåžžã«èª²é¡ã§ããAI-DLC ã¯ãã®ããã®æ¹æ³è«ãšããŠéåžžã«æå¿ããæããŸãããAI-DLC ã®æ
ã¯ãŸã å§ãŸã£ãã°ããã§ãã 3. ä»åŸã®å±éãš AWS ã®æ¯æŽ ãµã³ãªãª ããžã¿ã«äºæ¥éçºéšã§ã¯ãä»åã® UG ã§åŸãç¥èŠãå®ãããã¯ãéçºã«æ¬æ Œå°å
¥ããŠããäºå®ã§ãã Inception ã®æšæºå â ä»åäœæããã€ã³ã¿ãã¥ãŒåã¹ãã«ãããŒã æšæºããã»ã¹ãšããŠéçšéå§ ã人éã¯èšèšãšã¬ãã¥ãŒãã¢ãã«ã®å®è·µ â AI ãå®è¡ãã人éãç£èŠã»å€æãã AI-DLC ã®æ¬è³ªãæ¥åžžã®éçºã«æµžéããã ã¯ãŒã¯ã·ã§ãããéå¶ããŠæããã®ã¯ãAI-DLC ã® Inception ãã§ãŒãºã Amazon ã® Working Backwards ïŒã客æ§ã®äœéšããéç®ããŠèããææ³ïŒãšæ¬è³ªãåããããããšããããšã§ããã誰ã«ã»ã©ããªäŸ¡å€ãã»ãªãå±ããã®ããã AI ã®ã€ã³ã¿ãã¥ãŒã«çããªããèšèªåããããŒã å
šå¡ã§åæãããAI ããåãããæããããããšã§è°è«ã®æãæŒããæ§é çã«é²ãããããçµéšã®æµ
ãããŒã ã§ã質ã®é«ãèŠä»¶å®çŸ©ãã§ããããã«ãªããŸãã AWS ã¯ããµã³ãªãªã® AI 掻çšããŒãããŒãšããŠãUG ã§äœæããã¹ãã«ã®å®ãããã¯ããžã®é©çšãš AI é§åéçºã®å®çãåŒãç¶ãæ¯æŽããŠãŸãããŸããåäºæ°ãã¯ããããåå ããã ããçæ§ãããããšãããããŸããã æ¬èšäºã¯ã2026 幎 6 æ 11 æ¥ã12 æ¥ã«éå¬ããããµã³ãªãª AI-DLC Unicorn Gymãããã³åå ã¡ã³ããŒã®çæ§ãšã®åº§è«äŒãããšã«æ§æããŸããã èè
ãããã£ãŒã« è»å 賢倧 ã¢ããŸã³ ãŠã§ã ãµãŒãã¹ ãžã£ãã³ååäŒç€Ÿ å¶æ¥éš åºåäºæ¥éšéãæ ªåŒäŒç€Ÿãµã³ãªãªãæ
åœããã¢ã«ãŠã³ããããŒãžã£ãŒãã客æ§ã®ããžãã¹å€é©ãæè¡ã§æ¯æŽããããšã«æ
ç±ã泚ãã§ããŸããæè¿ã¯ AI é§åéçºã©ã€ããµã€ã¯ã« (AI-DLC) ã®æ¥æ¬ã®ã客æ§ãžã®å±éã«ãåãçµãã§ããŸãã 山柀 è¯ä» AWS ã®ãœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ããšããŠãè£œé æ¥ãäžå¿ã«ãšã³ã¿ãŒãã©ã€ãºäŒæ¥ã®æ¯æŽãããŠããŸãããã®æŽ»åã®åããæè¿ã¯ Claude Code / Cowork ã®åœå
å±éã«åããæè¡æ¯æŽãã³ã³ãã³ãäœæã«åãçµãã§ããŸãã
ããã«ã¡ã¯ã 人æãã©ãããã©ãŒã ãžã§ãã¡ãã¬ãŒãã©ã¹éçºå®€é·ã®åŸ·æ°žã§ãã ãã®èšäºã§ã¯ã人æç޹ä»ã®æ¥ååºç€ã TypeScript ãš CQRSïŒã€ãã³ããœãŒã·ã³ã°ã§0ããæ§ç¯ããçŽ4ãæã§æ¬çªãªãªãŒã¹ãããŸã§ãæ¯ãè¿ããŸãã ç§ã¯ PdM ãšå®è£
ãå
Œããæ§æ³ã®æ€èšŒããæ¬çªçšŒåããã®åŸã®éçšãŸã§é¢ãã£ãŠããŸãã ãã¡ãã®èšäºã¯ã MEDLEY Summer Tech Blog Relay ãã®27æ¥ç®ã®èšäºã§ãã MEDLEY Summer Tech Blog Relay | MEDLEY Developer Portal ããã«ã¡ã¯ïŒDevRelã®éç°ïŒ@Shige0096ïŒã§ãã ã¡ãã¬ãŒã§ã¯å€äŒç»ãšããŠãMEDLEY Summer Tech Blog Relayããšé¡ããŠãããã°ãªã¬ãŒãéå¬ããŸãïŒ 7/13(æ)ã8/21(é)ãŸã§æ¯æ¥ç°ãªãã¡ã³ããŒã... developer.medley.jp 人æç޹ä»ãµãŒãã¹ããžã§ãã¡ãã¬ãŒãšãŒãžã§ã³ããã§ã¯ã2022幎ã®ç«ã¡äžããã3幎ããŸããæ°åè¡ã®ã¹ãã¬ããã·ãŒããè€æ°äžŠè¡ã§äœ¿ã£ãŠæ¥åãåããŠããŸããã ã·ã¹ãã åã®æ§æ³ãå§ããã®ã¯2025幎12æã§ãã ç¿æã«å
è£œãæ±ºãã2026幎4æã«æ¥åãåãæ¿ããŸããã çŸåšãéçšããŠããŸãã æ§æ³ããæ¬çªãªãªãŒã¹ãŸã§ã®ããã4ãæã§ãçŽ1,200æ¬ã® PR ãããŒãžããŠããŸãã ã¢ãŒããã¯ãã£ã«ã¯ CQRS ãšã€ãã³ããœãŒã·ã³ã°ãéžã³ãŸããã ããŒã¿ãäžæžããããèµ·ããåºæ¥äºãé ã«èšé²ããŠããäœãæ¹ã§ãã 0â1ã®ç«ã¡äžãã«ããŠã¯äœã蟌ã¿ããã§ã¯ãªããã çæåããäœåºŠãè°è«ããéçºäžã倿ãèŠçŽããŠããŸããã ãªãªãŒã¹ãã4ãæãçµã£ãããŸããã®äºæ¥ã§ã¯éå°ãªéžæã§ã¯ãªãã£ããšèããŠããŸãã ãã¡ãããå®ãäœããããã§ã¯ãããŸããã å®è£
éã¯å¢ãããªãªãŒã¹ãåªå
ããŠè² åµãšããŠæ®ãã課é¡ããããŸãã ããã§ãã仿§ã決ããããªããŸãŸéçºãšããŒã¿ç§»è¡ã䞊è¡ã§ãããªãªãŒã¹åŸã®å€æŽã«ã察å¿ã§ããŸããã ç§ãã¡ã®æ¡ä»¶ã§ã¯ããã®ããã«ãããã³ã¹ãã«èŠåã£ãŠããŸããã ã¹ãã¬ããã·ãŒãã§æ¯ããŠããæ¥å ãžã§ãã¡ãã¬ãŒãšãŒãžã§ã³ãã¯ãå»çä»è·æ±äººãµã€ãããžã§ãã¡ãã¬ãŒããéå¶ããã¡ãã¬ãŒãã2022幎ã«ç«ã¡äžãã人æç޹ä»ãµãŒãã¹ã§ãã æ±äººãµã€ããæ±è·è
ãšäºæ¥æãçŽæ¥ã€ãªãã®ã«å¯Ÿãã人æç޹ä»ã§ã¯ãã£ãªã¢ã¢ããã€ã¶ãŒãæ±è·è
ãšé¢è«ããæ±äººãæ¢ããå¿åããå
¥è·ãŸã§äŒŽèµ°ããŸãã ãã®æ¥åãæ¯ããŠããã®ããåé ã§è§Šããã¹ãã¬ããã·ãŒã矀ã§ãã æ±è·è
ã颿¥ãé¡§å®¢ãæ±äººã瀟å
ã®äŸé ŒãKPI ãªã©ãçšéããšã«ã·ãŒããåãããŠããŸããã ã·ãŒããçšéããšã«åãããŠãããããåãæ
å ±ãäœåºŠãæžãåããŠããŸããã æ±è·è
ã«ãã®å Žã§æ±äººã玹ä»ããããŠããçŸåšã®ç¶æ³ãç¥ãã«ã¯è€æ°ã®ã·ãŒããšããŒã«ãè¡ãæ¥ããªããã°ãªããŸããã ããã¥ã¢ã«ã¯ãã£ãŠããæé ãã·ãŒãã®äœ¿ãæ¹ã«ã¯äººããšã®å·®ãæ®ããæ°ããã¡ã³ããŒãæ¥åãèŠãããŸã§ã«ãæéãããã£ãŠããŸããã å®éã«äœ¿ã£ãŠãã管çã·ãŒãã®äžéšã§ããç»é¢äžéšã«ã¯ãçšéå¥ã®ã¿ãã䞊ãã§ããŸããå人æ
å ±ã«ãããå
容ã¯ãŒãããŠããŸãã ã·ã¹ãã åã§è§£æ±ºãããã£ãããšã¯ã次ã®4ã€ã§ãã æ
å ±ãã²ãšã€ã«ãŸãšããŠç¶æ³ææ¡ãéãããã æäœæ¥ã®è»¢èšããªãããŠãæ
åœè
ã®æéãæ±è·è
ãšåãåãããšã«äœ¿ããã æ¥åã®æé ã圢åŒç¥ãšããŠæ®ããæ°ããã¡ã³ããŒãããç«ã¡äžãããããã«ããã ããŒã¿ãæ§é åããAI ãæ¥åã«çµã¿èŸŒããåå°ãäœããã ç®æããŠããã®ã¯ãåã¡ã³ããŒãé¡§å®¢ãæ±è·è
ãšåãåã亀æžãææ¡ã ãã«éäžã§ããç¶æ
ã§ãã ããã«å®çŸã§ããç¶æ
ã§ã¯ãªãããããŸãã¯æ¥åãã·ã¹ãã ã«èŒããæ¥ã
èµ·ããŠããããšãæ§é åããŠèšé²ããåæãããšããããå§ããŸãã ã©ã®èª²é¡ããäºæ¥ãå°ãããã¡ã¯å¯Ÿå¿ãæ¥ããã®ã§ã¯ãããŸããã ããããæ±ãè·çš®ãšäººæ°ãå¢ããã»ã©ã圱é¿ã¯å€§ãããªããŸãã 2025幎12æããããªãèŠæš¡æ¡å€§ãšäœå¶åŒ·åãåã«ãã·ã¹ãã å°å
¥ã®èµ·æ¡ãåºãŸããã å€éšSaaSãšå
è£œãæ¯ã¹ã æåããå
è£œãæ±ºããŠããããã§ã¯ãããŸããã 人æç޹ä»ã®æ¥å管çã«ã¯å°å
¥å®çžŸã®è±å¯ãªå€éšSaaSããããããå€éšSaaSã®å°å
¥ãšå
補ã䞊è¡ããŠæ€èšããŸããã èµ·æ¡ã®çŽåŸã«ã¯ãæãäžç¢ºå®ã ã£ãæ±äººæ€çŽ¢ããæ€èšŒãå§ããŸããã ãžã§ãã¡ãã¬ãŒã®æ±äººããŒã¿ãš OpenSearch ãåãããšãåæ¥ã§æåã®ç»é¢ãã§ããŸããã äºæ¥éšã«ãã®ç»é¢ãè§Šã£ãŠããããªãããã¢ãªã³ã°ãé²ãã䞊è¡ããŠè·çš®ããšã®æ¥åãããŒãææžåããã·ã¹ãã å
ã§å®çµã§ããæ¥åã®ç¯å²ãšéçšã³ã¹ãã詊ç®ããŸããã ç¿æã«å
è£œãæ±ºããæç¹ã§ã¯ãæ¯èŒè³æã ãã§ãªããå®éã«åãã·ã¹ãã ãæå
ã«ãããŸããã ã©ã®æéãšå©çšè
æ°ã§æ¯ã¹ããã«ãã£ãŠãã³ã¹ãã®çµè«ã¯å€ãããŸããã å€éšSaaSã®è²»çšã¯å©çšã¢ã«ãŠã³ãæ°ã«å¿ããŠå¢ããŸãããå
è£œã®æ§ç¯è²»ã¯å©çšè
æ°ã§ã¯å¢ããŸããã å幎ã§ã¯å€éšSaaSãå®ããŠããåœæèŠèŸŒãã§ããå©çšè
ã®å¢å ãå«ããŠæ°å¹Žã§æ¯ã¹ããšãå·®ã¯çž®ãŸããŸãã ã©ã¡ãããæããã«å®ããšã¯å€æã§ããŸããã§ããã å
è£œã«æ±ºããçç±ã¯ã瀟å
ã®ããŒã¿ãšã®ã€ãªãæ¹ã§ããã æ±äººãäºæ¥æã®ããŒã¿ãããžã§ãã¡ãã¬ãŒåŽã®æŽæ°ã«è¿œåŸããŠåã蟌ãå¿
èŠããããŸãã ããã«ããžã§ãã¡ãã¬ãŒã«èç©ãããæ±äººãå¿åã®ããŒã¿ããªã¢ã«ã¿ã€ã ã§ã€ãªãã瀟å
ã§æŽ»çšã§ããç¯å²ãåºããããšèããŠããŸããã æ€èšããå€éšSaaSã§ã¯ããã®é£æºãéçšã§ããŸããã§ããã CQRSïŒã€ãã³ããœãŒã·ã³ã°ãéžãã çç± èµ·æ¡çŽåŸã«äœã£ãæ€èšŒçšãªããžããªã§ã¯ãCQRS ãšã€ãã³ããœãŒã·ã³ã°ïŒEvent Sourcingãä»¥äž ESïŒãåæã«ããŸããã ãã¡ã€ã³å±€ã¯é¢æ°å DDD ã§æžããŠããŸãã ç¶æ
ãæã€ãªããžã§ã¯ãã«æ¯ãèããæãããã®ã§ã¯ãªããäžå€ãªããŒã¿ãšçŽç²é¢æ°ã䜿ããç¶æ
é·ç§»ãã¹ããŒããã·ã³ãšããŠè¡šãæ¹éã§ãã ES ãéžãã çç±ã®ã²ãšã€ã¯ãããŒãã«èšèšãæ©ã
ã«åºããããªãã£ãããšã§ãã çŸå Žã§ã¯ã¹ãã¬ããã·ãŒãäžã®æ¥åãæ¯é±å€ãããè·çš®ããšã®ãã¢ãªã³ã°ãããããã§ããã ãã®æç¹ã§åŒããèšèšã3ãæåŸãŸã§ãã®ãŸãŸæ®ããšã¯æããŸããã éçºäžãäºæ¥ã®æœçã¯ç¶ããããã·ã¹ãã åãçç±ã«çŸå Žã®å€åãæ¢ããŠãããããã«ããããŸããã§ããã æ©ã決ããã»ã©ã決ãçŽãåæ°ãå¢ããŸãã ããšãã£ãŠã仿§ãåºãŸããŸã§åŸ
ãŠã°ããªãªãŒã¹ã¯é
ããŸãã å®éã«æ¥åãæŽçãããšããã§ã«åºãŸã£ãŠãããã®ãšã䜿ãå§ããŠããæ±ºããããã®ãæ··ãã£ãŠããŸããã ãã§ã«åºãŸã£ãŠããã®ã¯ãæ¥åã§äœ¿ãèšèã§ãã ããã¯ãªãçŽåŸã«5人å
šå¡ã§ãDDD ã®èšèšææ³ã§ããã€ãã³ãã¹ããŒãã³ã°ãè¡ããŸããã æ±è·è
ã®ç²åŸããååé¢è«ãæ±äººæ¢çŽ¢ãšææ¡ã颿¥ãšéžèãå
¥è·ãšè«æ±ãŸã§ã䞊ã¹ãŸããã 顧客åŽã«ã€ããŠããéæãšå¥çŽãæ±äººã®æ²èŒãšéçšãå©çšåæ¢ãšè§£çŽãŸã§ãæŽãåºããŸããã æ³äººåã®å€æŽããäºæ¥è²æž¡ã«ããéå¶æ³äººã®å€æŽãªã©ãé »åºŠã¯äœããŠãèµ·ãããšå°ãæµããä»ç®ã«ããŸããã æ°æéã§åºãŠãããã¡ã€ã³ã€ãã³ãã¯ãããã100åã§ãã ãã®ãšãã®èšèããã¹ãŠæ®ã£ãããã§ã¯ãªããéçºäžã«æŠå¿µããšæšãŠããã®ããããŸãã ä»ç®ã®åå¥å
容ã§ã¯ãªããæ±ã£ãæ¥åç¯å²ãšéã瀺ãããã®å
šæ¯ã§ãã ç»é¢ã§äœãç®ç«ãããããäœãã©ã枬ããã¯äºæ
ãéããŸããã åæããã¢ãªã³ã°ã ãã§ã¯æ±ºãããããçŸå Žã§äœ¿ãå§ããŠããåããããšãå€ãé åã§ãã ãã®éšåãŸã§å
ã«åºããŠäœãçŽããããæ¥åäžã®åºæ¥äºãå
ã«èšé²ãã衚瀺ãéèšã¯åŸããè¶³ããæ§é ã«ããã»ããéããšèããŸããã ãã®èãæ¹ã¯ç®æ°ãããã®ã§ã¯ãããŸããã ãªãŒã³éçºã®7ã€ã®ååã«ããæ±ºå®ãé
ãããïŒDefer CommitmentïŒãããããŸãã Many people like to get tough decisions out of the way, to address risks head-on, to reduce the number of unknowns. However, in the face of uncertainty especially when it is accompanied by complexity, the more successful approach is to tackle tough problems by experimenting with various solutions, leaving critical options open until a decision must be made. â Mary Poppendieck, Tom PoppendieckãImplementing Lean Software Development: From Concept to CashãïŒAddison-Wesley, 2006ãéŠèš³ã¯ããªãŒã³éçºã®æ¬è³ªãæ¥çµBPïŒ é£ããæ±ºå®ãæ©ãçä»ããæªç¥ãæžãããããªãã ããããäžç¢ºå®ããšè€éããéãªãå Žé¢ã§ã¯ãããã€ãã®è§£æ±ºçã詊ããªãããæ±ºããå¿
èŠãçãããŸã§éžæè¢ãæ®ããã»ããããããšããèãæ¹ã§ãã ç§ãã¡ã決å®ãé
ãããã®ã¯ãç»é¢ã§ã®èŠãæ¹ãšãæ¥åã®æž¬ãæ¹ã§ãã ãã®äºã€ãåŸããå€ããããããã«ãã€ãã³ããäžæ¬¡èšé²ã«ããã¢ãŒããã¯ãã£ã ãã¯å
ã«æ±ºããŸããã CRUD ã§äœãã仿§ãå€ãããã³ã« migration ãæžãé²ãæ¹ããããŸãã å®éããã®æ¹æ³ã§ããªãªãŒã¹ã¯ã§ãããšæããŸãã ãã ããç¶æ
ãäžæžãããèšèšã§ã¯ãç¶æ
ã®æã¡æ¹ãå€ãããšãããŒãã«å®çŸ©ã®å€æŽãéå»ããŒã¿ã®è£æ£ãå¿
èŠã«ãªãããšããããŸãã å€åã®å€ãç«ã¡äžãæã«ããã®äœæ¥ãäœåºŠãç¹°ãè¿ãããšãæ°ã«ãªããŸããã ES ã§ã¯ããèµ·ããäºå®ãã衚ãã€ãã³ããèšé²ããŸãã ç»é¢ãéèšãåç
§ããããŒãã«ã¯ããã®ã€ãã³ãããäœããŸãã æžã蟌ã¿ãšèªã¿åãã§ã¢ãã«ãåããèãæ¹ã CQRS ã§ãèªã¿åãåŽã®ããŒãã«ã Read ModelããããäœãåŠçã projector ãšåŒã³ãŸãã äºå®ãšèŠãæ¹ãåããŠããã°ã衚瀺ãéèšã®ä»æ§ãå€ãã£ãŠããèšé²æžã¿ã®ã€ãã³ããæžãæããå¿
èŠã¯ãããŸããã Read Model ã¯äœãçŽããŸãããå¿
èŠãªäºå®ãã€ãã³ãã«å«ãŸããŠããã°ã衚瀺ãéèšã®å€æŽãæåœ±åŽã«éããããŸãã ã€ãã³ãã¹ããŒãã³ã°ã§æŽçããæ¥åäžã®äºå®ã¯ã€ãã³ããžã䜿ãå§ããŠããæ±ºãã衚瀺ãéèšã¯æåœ±ãžçœ®ããŸããã 衚瀺ãéèšãå€ããç¶ãã0â1ã§ã¯ããã®åé¢ã«æéãããã䟡å€ããããšèããŸããã ãã®éžæãåããã©ããã¯ãåŸããæ±ºãããããšãã©ãã ãæ®ã£ãŠãããã§å€ãããŸãã 衚瀺ãéèšãŸã§ä»æ§ãåºãŸã£ãŠããå Žåãåºããæéãåããå Žåã倿Žãå°ãªãå Žåã«ã¯ãæåããããŒãã«ãèšèšããã»ããéãã¯ãã§ãã TypeScript ã§ã®å®è£
å®è£
㯠TypeScript ã®ã¢ãã¬ãã§ãã ã€ãã³ãã® payload ãšéçŽã®ç¶æ
㯠Zod ã¹ããŒããäžæ¬¡æ
å ±ãšããåã¯ããããå°åºããŸãã 以éã®ã³ãŒãäŸã¯ã説æã«å¿
èŠãªéšåã ããæ®ããŠç°¡ç¥åããŠããŸãã export const memberRegisteredPayloadSchema = z . object ({ memberId: memberIdSchema , name: z . string (). trim (). min ( 1 ), registeredAt: isoDateTimeSchema , }); export type MemberRegisteredPayload = z . infer < typeof memberRegisteredPayloadSchema >; ãã¡ã€ã³å±€ã¯ããã¡ã€ã³é§åèšèšïŒDDDïŒã®éçŽããšã«ã decide ãš evolve ã®2ã€ã®çŽç²é¢æ°ã§æ§æããŸãã éçŽãšã¯ãäžåºŠã«æŽåæ§ãä¿ã€åäœã§ãã decide(command, state) ã¯ãçŸåšã®ç¶æ
ã§ã³ãã³ããå®è¡ã§ãããå€å®ããã€ãã³ããè¿ããŸãã evolve(state, event) ã¯ãã€ãã³ããç¶æ
ã«é©çšããŸãã ã©ã¡ãã DB ãæå»ã«äŸåããªããããç¶æ
é·ç§»ã®ãã¹ãã¯å
¥åºåã ãã§æžããŸãã ãã®æ§æã¯ãDecider ãã¿ãŒã³ïŒ Functional Event Sourcing Decider ïŒãšããŠç¥ãããŠããŸãã decide ã®æ»ãå€ã«ã¯ Result ã䜿ãã倱ææã«ã¯æ¥åã«ãŒã«ã衚ã union ãè¿ããŸãã æ¿èªãæãéçŽã®äŸãšããŠãæ©æé¢è·æã®çŽ¹ä»æãæ±ãè¿éã±ãŒã¹ã®åãæããŸãã export type DecideRefundCaseError = | { kind : "refund_case_not_created" } | { kind : "refund_case_closed" } | { kind : "refund_case_cannot_update_while_approval_pending" } | { kind : "refund_case_cannot_update_refund_content_after_content_approval" } | { kind : "refund_case_cannot_update_invoice_before_content_approval" }; API å±€ã¯ãšã©ãŒã® kind ã§åå²ããç»é¢ã«åºãã¡ãã»ãŒãžã決ããããŸãã ãã¡ã€ã³å±€ã§ throw ãããšã©ãŒãããã³ãã©ãæååã§å€å¥ããå¿
èŠã¯ãããŸããã éçŽã®ç¶æ
ããã²ãšã€ã®å€§ããªãªããžã§ã¯ãã« optional ãªé
ç®ãè¶³ãã®ã§ã¯ãªããå€å¥å¯èœãª union ã§è¡šããŸãã ããšãã°ããéäŒæžã¿ãªã®ã«é¢è«äºå®ãæ®ã£ãŠããããšããççŸããç¶æ
ã¯åã®äžã§äœããŸããã optional ã¯ãããããã®ç¶æ
ã§æ¬åœã«ä»»æãªé
ç®ã«ã ã䜿ããŸãã export const memberStateSchema = z . discriminatedUnion ( "kind" , [ z . object ({ kind: z . literal ( "initial" ) }), z . object ({ kind: z . literal ( "active" ), memberId: memberIdSchema , interviewScheduledAt: isoDateTimeSchema . optional (), }), z . object ({ kind: z . literal ( "withdrawn" ), memberId: memberIdSchema , withdrawnAt: isoDateTimeSchema , }), ]); export type MemberState = z . infer < typeof memberStateSchema >; API ã«ã¯ Hono.js ãš zod-openapi ã䜿ãããªã¯ãšã¹ãã®æ€èšŒãã OpenAPI å¥çŽã®çæãŸã§ãã¹ããŒãã«å¯ããŠããŸãã ããã³ããšã³ã㯠React Router ã® SPA ã§ãå¥çŽããçæããã¯ã©ã€ã¢ã³ãã䜿ããŸãã äžè¬çãªæ§æãšç°ãªã3ã€ã®å€æ CQRSïŒã€ãã³ããœãŒã·ã³ã°ã§ã¯ãã€ãã³ãã¹ãã¢ã«è¿œèšããã€ãã³ããéåæã§æåœ±ããRead Model ãäœãæ§æãããèŠãããŸãã ç§ãã¡ã®å®è£
ã¯ããã®æ§æãš3ã€ã®ç¹ã§ç°ãªããŸãã æåœ±ãåæã«ãã Read Model ãžã®æåœ±ã¯éåæã«ãããã€ãã³ãã®è¿œèšãšåããã©ã³ã¶ã¯ã·ã§ã³ã§è¡ã£ãŠããŸãã CQRS ã®è§£èª¬ã§ã¯ãæåœ±ãéåæã«ããä¿åçŽåŸã®ç»é¢ã«å°ãåã®ç¶æ
ãèŠããããšã蚱容ããæ§æããã玹ä»ãããŸãã ãã ããCQRS ãåããã®ã¯æžã蟌ã¿ãšèªã¿åãã®ã¢ãã«ã§ãã£ãŠãæåœ±ã®ã¿ã€ãã³ã°ã§ã¯ãããŸããã ããšãã° .NET ã® Marten ã«ã¯ãæåœ±ã®å®è¡æ¹åŒãšã㊠InlineãLiveãAsync ããããŸãã Inline ãéžã¶ãšãã€ãã³ãã®è¿œèšãšåããã©ã³ã¶ã¯ã·ã§ã³ã§ Read Model ãæŽæ°ãããŸãã éåææåœ±ã§ããèªã¿åãåŽã工倫ããã°ãä¿åçŽåŸã®ç»é¢ã«ææ°ã®ç¶æ
ãèŠããããŸãã ãã®å Žåã¯ãæåœ±ã®é
å»¶ãèæ
®ããç»é¢ãé
å»¶ã®ç£èŠã倱æããæåœ±ã®å詊è¡ãæåããçšæããããšã«ãªããŸãã ä»åã»ããã£ãã®ã¯ã€ãã³ããäžæ¬¡èšé²ã«ããèšèšã§ãããéåææåœ±ã«ããã¹ã±ãŒã©ããªãã£ã§ã¯ãããŸããã§ããã å©çšè
ã¯ç€Ÿå
ã®ãªãã¬ãŒã¿ãŒæ°ååã§ãåæã«æžã蟌ã人æ°ã¯ããã«éãããŸãã äžè¬å
¬éã®ãµãŒãã¹ãšã¯ãæ³å®ããè² è·ãéããŸãã ããã§ãåææ§æã¯åææåœ±ã«ããŸããã èŠæš¡ãå€ããã°å€æãèŠçŽããŸãããã€ãã³ããäžæ¬¡èšé²ãšããŠæ®ã£ãŠããéããæåœ±ã®æ¹åŒã¯åŸããå€ããããŸãã åææåœ±ã«ã代åã¯ãããŸãã æåœ±ãšæžã蟌ã¿ãåããã©ã³ã¶ã¯ã·ã§ã³ã«ãããããprojector ã«äžå
·åããããæåœ±ã«å€±æãããšãç»é²ãæŽæ°ãã®ãã®ã倱æããŸãã 倱æããã®ã¯æäœãã1ä»¶ã§ãã·ã¹ãã å
šäœãæ¢ãŸãããã§ã¯ãããŸããã éåææåœ±ãªãæžã蟌ã¿ã¯éããç»é¢ãžã®åæ ã ããé
ããŸãã ç§ãã¡ã¯ã誀ã£ã衚瀺ã®ãŸãŸæ¥åãé²ãããããã®å Žã§æäœã倱æããŠåå ã远ããã»ãããç«ã¡äžãæã«ã¯æ±ãããããšå€æããŸããã ãã®ã¶ããæåœ±ã«ã¯ CI ã§ AST ã¬ãã«ã®å¶çŽããããprojector ã®ãã¹ããæžãããšãèŠçŽã«ããŠããŸãã ã€ãã³ãã¹ãã¢ã MySQL ã®ããŒãã«ã«ãã ã€ãã³ãã¹ãã¢ã«ã¯ã EventStoreDB ã®ãããªå°çšã®ããã«ãŠã§ã¢ã§ã¯ãªãã Aurora MySQL ã®éåžžã®ããŒãã«ã䜿ããŸããã agent_events ã«ã¯ INSERT ããè¡ããªããšæ±ºãã远èšå°çšã®ããŒãã«ãšããŠéçšããŠããŸãã æ¥ååºç€ã®ããŒã¿ããŒã¹ã¯ããžã§ãã¡ãã¬ãŒã䜿ã£ãŠãã Aurora ã¯ã©ã¹ã¿å
ã«çœ®ããŠããŸãã æ°ããããŒã¿ããŒã¹åºç€ãç«ãŠãã«æžã¿ãããã¯ã¢ãããç£èŠã瀟å
ã®ããŒã¿åºç€ãžéããã€ãã©ã€ã³ãå
±çšã§ããŸãã åãã¯ã©ã¹ã¿ã䜿ããããæš©éã¯æ¥ç¶ããšã«åããŸããã ãžã§ãã¡ãã¬ãŒã®ããŒã¿ã¯ãªãŒãã¬ããªã«ããèªãã ãã§ãæžãèŸŒã¿æš©éã¯ãããŸããã åã蟌ããç¯å²ãæš©éã§çµã£ãŠããŸãã æ¥ååºç€ãžã®æžã蟌ã¿ã«äœ¿ãæ¥ç¶ã¯ãèªåãã¡ã®è«çããŒã¿ããŒã¹ã®å€ã«åºãããŸããã ããŒã¿ããŒã¹ã®é
çœ®ãæ±ºããããšãã€ãã³ãã¹ãã¢ã MySQL ã®ããŒãã«ã«ããŸããã ã€ãã³ããš Read Model ãåã MySQL ãã©ã³ã¶ã¯ã·ã§ã³ã§æŽæ°ãããããäž¡æ¹ãåãããŒã¿ããŒã¹ã«çœ®ããŠããŸãã 4ãæãšããæéã«ãæ°ããããã«ãŠã§ã¢ã®åŠç¿ãšéçšãæã¡èŸŒãŸãã«æžãããšã倿ææã§ããã export const agentEvents = mysqlTable ( "agent_events" , { eventSeq: bigint ( "event_seq" , { mode: "number" }) . autoincrement (). primaryKey (), streamKey: varchar ( "stream_key" , { length: 255 }). notNull (), streamVersion: int ( "stream_version" ). notNull (), eventType: varchar ( "event_type" , { length: 100 }). notNull (), payload: json ( "payload" ). notNull (), occurredAt: datetime ( "occurred_at" , { fsp: 6 }). notNull (), }, ( t ) => ({ streamVersion: unique ( "uk_stream_version" ) . on ( t . streamKey , t . streamVersion ), })); ããŒãã«ãã·ã³ãã«ã«ããã¶ããã€ãã³ãã®åã¯ãã¡ã€ã³å±€ã§å³å¯ã«ããŠããŸãã Zod ã® enum ãäžæ¬¡æ
å ±ã«ããŠãéçŽããšã« eventType ãš payload ã®çµã¿åããã union ã§å®çŸ©ããŸãã export const EventTypeSchema = z . enum ([ ` ${ EVENT_TYPE_PREFIX } .introduction.refund-case-created.v1` , ` ${ EVENT_TYPE_PREFIX } .introduction.refund-case-closed.v1` , // ... ]); export type EventType = z . infer < typeof EventTypeSchema >; export type RefundCaseEvent = | ( StoredEventBase & { eventType : typeof EVENT_TYPES . introductionRefundCaseCreated ; payload : RefundCaseCreatedPayload ; }) | ( StoredEventBase & { eventType : typeof EVENT_TYPES . introductionRefundCaseClosed ; payload : RefundCaseClosedPayload ; }); // ... evolve ã§ã¯ switch (event.eventType) ã§åå²ããå case ã®äžã§ event.payload ã®åãçµã蟌ããŸãã DB ã«ä¿åããã eventType ã¯æååã§ãããæžã蟌ãåŽãšèªã¿åºãåŽã¯åã§å¶çŽãããŠããŸãã ã²ãšã€ã®éçŽã«ç©ãŸããã€ãã³ãã®äžŠã³ãã¹ããªãŒã ãšåŒã³ã streamKey ã§èå¥ããŸãã ã€ãã³ãã远èšãããšãã¯ãã¹ããªãŒã ãèªã¿èŸŒãã æç¹ã®çã«1ãè¶³ããå€ã streamVersion ã«æžããŸãã åãéçŽã䞊è¡ããŠæŽæ°ãããšãè€åãŠããŒã¯å¶çŽãåŸããæ¥ãæžã蟌ã¿ã匟ããŸãã å°çšã®ã€ãã³ãã¹ãã¢ã expectedVersion ã§æäŸããæ¥œèгç䞊è¡å¶åŸ¡ããè€åãŠããŒã¯å¶çŽã§å®è£
ãã圢ã§ãã å¶çŽãæ
ãã®ã¯è¡çªã®æ€åºã§ãæžã蟌ã¿ã«æåããã€ãã³ã㯠streamVersion ã«ãã£ãŠã¹ããªãŒã å
ã§é åºã¥ããããŸãã ã1ãã©ã³ã¶ã¯ã·ã§ã³1éçŽããå®ãéããéçŽã®äžå€æ¡ä»¶ãç¶æã§ããŸãã ç«¶åããæäœã¯èªåã§ããçŽãããç»é¢ã«ãšã©ãŒãè¿ããŸãã åãæ±è·è
ãåæã«æäœããå Žé¢ã¯ãŸããªã®ã§ãè£ã§åå®è¡ãããããæäœãã人ã«ç«¶åãäŒããããšã«ããŸããã å°çšã®ã€ãã³ãã¹ãã¢ãæã€æ©èœã®ãã¡ãå¿
èŠã ã£ãã®ã¯è¿œèšãšç«¶åæ€åºã ãã§ããã 賌èªãããã¹ãŠã®ã€ãã³ãã察象ã«ããé åºä¿èšŒã¯äœ¿ã£ãŠããŸããã Read Model ãåæåœ±ãããšãã¯ã eventSeq ã®æé ã§ã€ãã³ããæµããŸãã eventSeq 㯠autoincrement ã®æ¡çªé ã§ãããã³ãããé ãšã¯äžèŽããŸããã åãã¹ããªãŒã ãžã®äžŠè¡è¿œèšã¯ãŠããŒã¯å¶çŽã§ç«¶åãããããæ£åžžã«ä¿åãããåäžã¹ããªãŒã ã®ã€ãã³ãã§ã¯ã eventSeq ãš streamVersion ã®é åºãäžèŽããŸãã ããŸã® projector ã¯éçŽããŸããã é åºã«äŸåããªãã®ã§ããã®æ¹æ³ã§è¶³ããŠããŸãã å°æ¥ãéåææåœ±ãžç§»ãå Žåã¯ãæ¡çªæžã¿ã§æªã³ãããã®ã€ãã³ããé£ã°ããŠèªãå¯èœæ§ããããããé åºã®è¿œãæ¹ããèŠçŽãå¿
èŠããããŸãã ã¹ãããã·ã§ãããäœããªã ã¹ãããã·ã§ãããäœããªããšç©æ¥µçã«æ±ºããããã§ã¯ãããŸããã ãŸã å¿
èŠã«ãªãèŠæš¡ã«éããŠããªãã ãã§ãã ã¹ããªãŒã ãé·ããªããšåçã«æéãããããããéäžã®ç¶æ
ãä¿åããããããåŸã®ã€ãã³ãã ããèªãã®ãäžè¬çã§ãã ç§ãã¡ã¯ decide ã®ãã³ã«ããã®ã¹ããªãŒã ã®ã€ãã³ããæåããèªã¿çŽããŠããŸãã ã²ãšã€ã®æ±è·è
ãå¥çŽã«ç©ãŸããã€ãã³ãã¯ãŸã å°ãªããçŸç¶ã®åçæéã§åé¡ãããŸããã å¿
èŠã«ãªã£ãæç¹ã§è¿œå ããã€ããã§ãã ç§»è¡å°çšã€ãã³ãã§ããŒã¿ç§»è¡ãå
ã«é²ãã ES ãåæã«ããããšã¯ãããŒã¿ç§»è¡ã§åœ¹ã«ç«ã¡ãŸããã äžè¬çãªããŒã¿ç§»è¡ã§ã¯ãå
ã«ç§»è¡å
ã®ã¹ããŒããåºããæ§ããŒã¿ãæ°ããæ§é ãžå€æããŸãã ä»åã¯ãç§»è¡å
ã§ããã·ã¹ãã ã®ä»æ§èªäœããäºæ¥éšãžã®ãã¢ãªã³ã°ãšäžŠè¡ããŠå€ãã£ãŠããŸããã çæ³ã®ããŒã¿æ§é ãåºãŸããŸã§åŸ
ã£ãŠãããšãããŒã¿ç§»è¡ããªãªãŒã¹ã®ã¯ãªãã£ã«ã«ãã¹ã«ãªããŸãã æ©ããªãªãŒã¹ãããã£ãã®ã¯ãæ¥çšã ããçç±ã§ã¯ãããŸããã ã€ãã³ãã¯ãã·ã¹ãã ã䜿ããå§ããŠããèç©ãããŸãã çæ³åœ¢ãŸã§ä»äžããŠããåºããããçŸå Žã䜿ããç¶æ
ãæ©ãäœããæ¥åäžã®äºå®ãèšé²ãå§ããããšèããŠããŸããã èç©ãæ©ãå§ããã»ã©ãåŸãã远å ããéèšãæœçã§åç
§ã§ããæéãé·ããªããŸãã ããã§ãã¹ãã¬ããã·ãŒãã®1è¡ãã»ãŒãã®ãŸãŸ payload ãžåãåããç§»è¡å°çšã®ã€ãã³ãåãå®çŸ©ããŸããã ç§»è¡ã€ãã³ãã«ã¯ãç§»è¡æç¹ã§ã·ãŒãã«ããæžãããŠããããšããäºå®ã ããèšé²ããŸãã ã¢ããªã±ãŒã·ã§ã³ã®æäœããç§»è¡åŸã«ç®æãããŒã¿æ§é ãšã¯åãé¢ããç§»è¡å
ã®å€ã Read Model ã«ã©ã衚ãã㯠projector ã«ä»»ããŸããã ç§»è¡å
ã®èšé²ãšè§£éãåãããããæœåºãã¯ã¬ã³ãžã³ã°ãæå
¥ãæ€èšŒãããªãç§»è¡åŠçãã仿§ã®ç¢ºå®ãåŸ
ããã«æºåã§ããŸããã Read Model ã®ä»æ§ãå€ãã£ãŠããprojector ãçŽããç§»è¡å°çšã€ãã³ãã®çæãšæå
¥ã®æé ã¯ä¿ãŠãŸããã ãã ããç§»è¡å°çšã€ãã³ãã¯è² åµãšããŠæ®ããŸãã ES ã§ã¯éå»ã®ã€ãã³ããæžãæããªããããç§»è¡ã€ãã³ããå±¥æŽããæ¶ããŸããã éçŽã® evolve ãš Read Model ã® projector ã¯ãéåžžã€ãã³ããšç§»è¡ã€ãã³ãã®äž¡æ¹ãè§£éãç¶ããå¿
èŠããããŸãã æ¬ æå€ã®æ±ããªã©ãç§»è¡ã€ãã³ãã«ããå¿
èŠã®ãªãåå²ãæ®ããŸããã æ©èœã远å ãããã³ã«ããã®åå²ãèæ
®ããæéããããå§ããŠããŸãã å°æ¥ã¯ãç§»è¡ã€ãã³ããéåžžã€ãã³ãã®äžŠã³ãžåè§£ããŠæå
¥ãçŽãããã®åå²ããªããèšç»ã§ãã CRUD ãšã®æ¯èŒ ã³ãŒããæžãäœæ¥ã ããªããCRUD ã®ã»ããéãã£ãã¯ãã§ãã ES åºæã®æåœ±åºç€ãåçåŠçãå
ã«çšæããå¿
èŠããªããéçŽã²ãšã€ãããã®ã³ãŒããæžããŸãã ãã ããä»åæ³å®ããŠãã CRUD ã®æ§æã§ã¯ãç§»è¡å
ã®ã¹ããŒããåºããŠããæ§ããŒã¿ã®å€æãæºåããããšã«ãªããŸãã 仿§ã®ç¢ºå®ãåŸ
ã€ã¶ãããªãªãŒã¹æ¥ãŸã§ã®äœè£ã¯ããã«å°ãªããªã£ãŠãããšèããŠããŸãã ããã§æ¯èŒããŠããã®ã¯ãä»åæ€èšããæ§æã§ãã CRUD ã«å±¥æŽããŒãã«ã倿ŽããŒã¿ãã£ããã£ïŒCDCïŒãçµã¿åãããã°ãä¿æã§ããèšé²ã¯å€ãããŸãã æ¯èŒè»ž CRUD CRUDïŒå±¥æŽã»CDC ES åæå®è£
å°ãã å±¥æŽåºç€ãå ãã åçã»æåœ±åºç€ãå«ã¿å€§ãã å
ã«æ±ºãããã® çŸåšç¶æ
ã®ã¹ããŒã æ®ãåããŸãã¯å
šå€æŽã®ååŸæ¹æ³ ã€ãã³ãã®å¢çãš payload æ®ãèšé² åºæ¬ã¯çŸåšç¶æ
è¡ãåã®å€æŽå·®å æ¥åäžã®åºæ¥äº åŸããéèšã§ããç¯å² äžæžãåã®ç¶æ
ã¯åŸ©å
ã§ããªã èšé²ããå·®åãšãåã®æå³ãä¿ãããç¯å² å¿
èŠãªäºå®ãã€ãã³ãã«å«ãŸããç¯å² åãæ¡ä»¶ 仿§ãšæž¬ãæ¹ãå®å®ããŠãã å¿
èŠãªå±¥æŽãå
ã«èšèšã§ãã 衚瀺ãšéèšãåŸããå€ããã 人æç޹ä»ã§ã¯ããã¡ãã«ã®ééçããªãŒãã¿ã€ã ãæœçã®å€æææã«ãªããŸãã ãã®è©³ããæž¬ãæ¹ã決ãŸã£ãã®ã¯ããªãªãŒã¹åŸã§ãã ãã¡ãã«ã®å°éå±¥æŽããŒãã«ã¯ãªãªãŒã¹ãã1ãæååŸãåæçšã® Read Model 矀ã¯3ãæåŸã«äœããŸããã ã©ã¡ããéå»ã«é¡ã£ãŠããŒã¿ãåãŸã£ãŠããŸãã ã€ãã³ãã«ã¯ããã¹ããŒã¿ã¹åã A ãã B ã«å€ãã£ããã§ã¯ãªãããæèšºãå§ãããã颿¥ãåžæããããNG ã«ãªã£ãããšèšé²ããŠããŸããã ãã¡ãã«ã®å段éãåãæ¥åçšèªã§å®çŸ©ããããããæåœ±ãæžããšãã«ãè¡ã®å€æŽãæ¥åäžã®åºæ¥äºãžèªã¿æ¿ããå¿
èŠããããŸããã§ããã CRUD ã§ããå±¥æŽããŒãã«ãæåããçšæããã°åãåæã¯ã§ããŸãã ãã ãããã®å Žåã¯ã©ã®åã®å±¥æŽãæ®ãããå
ã«æ±ºããŸãã ãã¡ãã«ã®å°éå±¥æŽã«äœãå¿
èŠãåãã£ãã®ã¯ãªãªãŒã¹åŸãªã®ã§ãå¿
èŠãªå±¥æŽããªãªãŒã¹åã«ãã¹ãŠéžã¶ã®ã¯é£ããç¶æ³ã§ããã åãéžã°ãããã¹ãŠã®å€æŽãèšé²ããæ¹æ³ããããŸãã Fivetran ã®ãããªããŒã«ã§ CDC ãè¡ãããç£æ»ãã°ã䜿ããããŒãã«ã®å
šå€æŽãåæåºç€ãžéãæ¹æ³ã§ãã éçŽã decide ãå®è£
ããªãã¶ããã¢ããªã±ãŒã·ã§ã³åŽã¯è»œããªããŸãã CDC ã§æ®ãã®ã¯è¡ã®å·®åã§ãã ãã〠NG ã«ãªã£ãããã®ããã«ãããæç¹ã§èµ·ããäºå®ãªãã倿Žå±¥æŽãã埩å
ã§ããŸãã é£ãããªãã®ã¯ãæ¥åäžã®æŠå¿µèªäœãäœãæ¿ããå Žåã§ãã éçºäžã«ãæ±äººãµã€ãã®ãå¿åãããã®ãŸãŸæã¡èŸŒãã èšèšãæšãŠã人æç޹ä»ã®ã玹ä»ããžäžæ¬åããããšããããŸããã ãã®å€æŽã§ã¯ãåãåã§ãååŸã§æå³ãç°ãªããŸãã ã©ã®å€æŽãæ¥åäžäœãæå³ããã®ããå¥ã«èšé²ãæ®ããŠè£ãããšãã§ããŸãã ãã ãæ¥åäžã®æå³ãŸã§å¥ã«èšé²ããŠåŸ©å
ã§ããããã«ãããšãES ãšåãããèšé²æã®æå³ãèšèšããŠä¿ã€ã³ã¹ããçããŸãã ãã¡ãããES ã§ããã¹ãŠãåŸããæ±ºããããããã§ã¯ãããŸããã ã€ãã³ãã®å¢çãš payload ã«äœãå«ãããã¯ãèšé²ããæç¹ã§æ±ºããŸãã åŸããé
ç®ã远å ããŠããéå»ã®ã€ãã³ãã«ãã®å€ã¯å
¥ããŸããã ä»åé
ãããããã®ã¯ãèšé²æžã¿ã®äºå®ããäœã衚瀺ããã©ãéèšããããšãã倿ã§ãã AI ãšãŒãžã§ã³ãã«æž¡ããããã£ãå®è£
ES ã¯å®è£
éã®å€ãã¢ãŒããã¯ãã£ã§ãã ã²ãšã€ã®æ©èœã«ãã€ãã³ãå®çŸ©ã decide ã evolve ãprojectorããã¹ããå¿
èŠã§ãäŒŒãæ§æã®ãã¡ã€ã«ã䞊ã³ãŸãã äžäŸãšããŠãè¿éã±ãŒã¹ã®éçŽã¯å®è£
ã³ãŒãã2,215è¡ããã¹ããå«ãããš4,487è¡ã«ãªããŸããã 人æç޹ä»ã®æ¥åã«ã¯ãå¥çŽãæ¿èªãè§£çŽãè¿éããã¢ãªã³ã°ãªã©ãäŒŒãæ§é ãæã€éçŽãæ°å€ããããŸãã æçµçã«å®è£
ããéçŽã¯20çš®ã§ãã æåœ±ãåçã®å
±éåºç€ããæ©èœéçºã«å
ç«ã£ãŠçšæããå¿
èŠããããŸãã ãã®å®è£
éã¯ãES ãæ¡ãã«ããããçç±ã®ã²ãšã€ã§ããã ãªããžããªãäœã£ãé±ã«ãã³ãŒãã£ã³ã°èŠçŽãšãã¡ã€ã³ã®åæã AI ãšãŒãžã§ã³ãåãã®æç€ºãã¡ã€ã«ã«æžããCI ã®ã¬ãŒããæŽåããŸããã åãã¡ã€ã«ã®è²¬åãçãããåãš CI ã§èŠçŽéåãæ€åºã§ããããã«ããããšã§ãåã圢ã®å®è£
ãç¹°ãè¿ãéšå㯠AI ãšãŒãžã§ã³ãã«æž¡ããŸããã AI ãšãŒãžã§ã³ãã«æž¡ãäœæ¥ã®å¢çã¯ãCRUD ã§ãäœããŸãã ES ãå®ããã®ã¯ã€ãã³ããäžæ¬¡èšé²ã«ãããšãããŸã§ã§ã颿°ã®åãæ¹ãŸã§ã¯æ±ºãŸããŸããã ç§ãã¡ã¯åè¿°ã® Decider ãã¿ãŒã³ãçµã¿åãããæ¥åäžã®æ±ºå®ã decide ãã€ãã³ãã«ããç¶æ
é·ç§»ã evolve ã«åããŸããã evolve ãæ±ãã®ã¯ãããã®ã€ãã³ããé©çšãããšç¶æ
ã®ã©ããå€ããããã§ãã ã€ãã³ãåã远å ããã®ã« evolve ã® case ãæžãå¿ãããšã default ç¯ã® never 代å
¥ãã³ã³ãã€ã«ãšã©ãŒã«ãªããŸãã default : { const unhandled: never = event ; return err ({ kind: "refund_case_unhandled_event" , eventType: String ( unhandled ) }); } decide ã«ã¯æ¥åã«ãŒã«ãéãŸãããã人ãå
容ãèªãã§å€æããŸãã åãéçŽã®äžã§ããå®åçãªç¶æ
é·ç§»ãšãæ¥åäžã®å€æã䌎ãåŠçã颿°åäœã§åããããŸããã CRUD ã®ãã³ãã©ã§ã¯ãAI ãšãŒãžã§ã³ãã«æž¡ãäœæ¥ã®å¢çããããããåŒãããŠããããã§ã¯ãããŸããã å
¥åã®æ€èšŒãæ¥åã«ãŒã«ã®å€å®ãããŒãã«ã®æŽæ°ãã²ãšã€ã®é¢æ°ã«çœ®ããªããã©ããŸã§ä»»ããããå®è£
ããšã«å€æããå¿
èŠããããŸãã éçºã®äžç€ããã¯ãé²ãæ¹ãåºãŸã£ãäœæ¥ããAI ãšãŒãžã§ã³ãåãã®æé æžïŒskillïŒãšããŠåãåºããŸããã éçŽã®å®è£
ãã€ãã³ãã®ããŒãžã§ãã³ã°ãmigration ã®çæãããŒã«ã« DB ã®åæ§ç¯ãªã©ã§ãã ãªãªãŒã¹æç¹ã§62æ¬ã«ãªããŸããã ãã ããã¬ãŒããçšæããã«ãã€ã©ãŒãã¬ãŒãã ããçæããããšãåœ¢ã®æŽã£ãã³ãŒãã«æŠå¿µçãªèª€ããçŽã蟌ã¿ãŸãã æ¬æ Œçã«äœãå§ããåãã¢ãŒããã¯ãã£ãçè§£ãããããå°ããªã¢ããªãäœã£ãŠã¯å£ããŠããŸããã åããšãããŸã§ã¯ããã«ãã©ãçãã®ã«ãæ©èœã远å ãããšæ°æ¥ã§è¡ãè©°ãŸãããšãäœåºŠããããŸããã åŸãã確èªãããšããã¡ã€ã³ã®åãæ¹ã誀ã£ããŸãŸããã¡ã€ã«ã®åœ¢ã ããæã£ãŠããŸããã èšèšå€æã¯ ADRïŒArchitecture Decision RecordïŒãšããŠæ®ãããªãªãŒã¹ãŸã§ã«57æ¬ã«ãªããŸããã ADR ã¯ãAI ãšãŒãžã§ã³ãã«å€æã®èæ¯ãæž¡ããããã«æŽããŸããã AI ãšãŒãžã§ã³ãã«ãã£ãŠãå®è£
ã®ã³ã¹ãã¯äžããç¶ããŠããŸãã ãã ããéãäœããã¶ããèšèšã誀ã£ããšãã«çŽãã³ãŒããå¢ããŸãã äœã£ãŠç¢ºãããéçºã§ã¯ãæžãéãã ãã§ãªããééãã«æ°ã¥ãããšãã«ã©ããŸã§æ»ãããé²ã¿æ¹ãå·Šå³ããŸãã äºå®ãšèŠãæ¹ãåããããšã§ãç»é¢ãéèšã«é¢ãã倿Žã®å€ã㯠projector ã®æžãæãã§æžã¿ãŸããã ãªãªãŒã¹åŸã®è©äŸ¡ 2026幎4æã®ãªãªãŒã¹åœæ¥ãæåã®ããŒã ã®æ¥åãã¹ãã¬ããã·ãŒãããå
補ã·ã¹ãã ãžåãæ¿ããŸããã åãæ¿ãåŸã®1ãæã¯çްããªããŒã¿ä¿®æ£ãç¶ããæ¬çªã® Read Model ã3ååæåœ±ããŸããã ããã§ãæ¥åã¯æ¢ãŸããŸããã§ããã èšé²æžã¿ã®ã€ãã³ãã«ã¯æãå
¥ãããprojector ãçŽã㊠Read Model ãäœãçŽããããã§ãã ãã®çµæã ããèŠãŠãã©ããª0â1ã«ã CQRSïŒã€ãã³ããœãŒã·ã³ã°ãå§ãããããã§ã¯ãããŸããã ä»åã®å€æã«ã¯ãå°ãªããšãæ¬¡ã®æ¡ä»¶ããããŸããã ãªãªãŒã¹åŸãç»é¢ãæž¬ãæ¹ãå€ããç¶ãã æ¥åäžã®äºå®ãåŸããäœåºŠãåç
§ãã ç§»è¡å
ããŒã¿ã®å質ãäºåã«èªã¿åããªã ãããã®æ¡ä»¶ããªããã°ããã£ãšã·ã³ãã«ãªèšèšãéžãã ãšæããŸãã AI ãçµã¿èŸŒããæ¥ååºç€ãž ãã®ã·ã¹ãã ã§ç®æããŠããã®ã¯ãäºæ¥éšã®ã¡ã³ããŒãé¡§å®¢ãæ±è·è
ãšåãåã亀æžãææ¡ã ãã«éäžã§ããç¶æ
ã§ãã æ¥åã®æµããã·ã¹ãã äžã§èŠããããã«ãªããäºåäœæ¥ãå ±åããããžã¡ã³ãã AI ãåŒãåããããã°ãäººã¯æ±äººãµã€ãã ãã§ã¯ä»£æ¿ã§ããªã人æç޹ä»ã®ä»äºã«æéã䜿ããŸãã æ¥åããã»ã¹ã®å¯èŠåãš AI ãã€ãã£ãåã¯ãã¡ãã¬ãŒå
šäœã§é²ããŠããæ¹éã§ãã ä»åã®æ¥ååºç€ãã人æç޹ä»ã®é åã§ãã®æ¹éãé²ããåãçµã¿ã®ã²ãšã€ã§ãã æ¥åã®äºå®ãæ§é åããŠèšé²ããŠããã°ããã®èšé²ãããšã« AI ãæ¥åã®æµããææ¡ãã倿ãå®è¡ã«é¢ãããããã«ãªããŸãã ã¡ãã¬ãŒã§ã¯çæAIå©çšã®ã¬ã€ãã©ã€ã³ã瀟å
ã«å±éããåéšéã¯ãã®ã¬ã€ãã©ã€ã³ã«æ²¿ã£ãŠçæAIãå©çšããŠããŸãã MEDLEY Summer Tech Blog Relay 28æ¥ç®ã®èšäºã¯åæããã§ãïŒ ã¡ãã¬ãŒã§ã¯ããå»çãã«ã¹ã±ã¢ã®æªæ¥ãã€ããã仲éãåéããŠããŸãã å°ãã§ãèå³ããæã¡ããã ããŸãããããã²ã«ãžã¥ã¢ã«é¢è«ã«ãè¶ããã ããã ã¡ãã¬ãŒã§åãïœæ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã§ã®åãæ¹ã人äºå¶åºŠãæ±äººæ
å ±ãªã©ãæ¡çšã«é¢ããæ
å ±ãã玹ä»ããŸãã www.medley.jp
æ³äººãã£ããããã¡ã³ã課ã®Sã»Sã§ãã ãã€ããBiz / LIVING ã®æ°èŠéçºã»ä¿å®éçšãè¡ãªã£ãŠãããŸãã æ¥ã
ãã€ã³ããããããŠããããå®è£
ãããŠãã ããã§ããã¢ãŠããããã®éã質ãæãããã«äŒžã³ãªã ç§èªèº«ã以åã¯ãããªåæ»æãæã€ããšããããŸããã 仿¯ãè¿ããšããã®åå ã®äžã€ã¯ãã€ã³ãããããŠããã£ãŠã¿ããšããã§æ¢ãŸã£ãŠããããšã ã£ãã®ããªãšæããŸãã ãããªèª²é¡ã«å¯ŸããŠã ãäŒããããæããã ãå ããããã«ãªã£ãŠãããå人ãšããŠãããŒã ãšããŠããã¢ãŠããããã®éãšè³ªãå°ããã€æ¹å ããŠãã宿ããããŸãã ä»åã¯ããã®å®äœéšãããšã«ã ãªããäŒããããæããããã¢ãŠããããã®æ¹åã«å¹ãã®ã ã«ã€ããŠããŸãšããŸãã ãïžã®èšäºå
容ããã£ãããšäžæçµµã«ããã®ã§ããã¡ããã確èªé ããäžã§ãèªãã§ããã ããšã¹ã ãŒãºã«èªã¿é²ããŠããã ããããªãšæããŸãã ã¢ãŠããããã®éã質ãæãããã«äžãããªãã£ãçç± ç§ã®å Žåãçµè«ã¯ã·ã³ãã«ã§ããã ã€ã³ãããã¯ããŠããããå®éã«ãã£ãŠã¿ãããšãã§ããŠããããã©ãããã§æ¢ãŸã£ãŠããããã äžèŠãããšãããã¯ã ãã€ã³ãããã ãã§çµããããã¡ãããšã¢ãŠããããããŠããç¶æ
ã ã«æããŸãããã å®éãç§èªèº«ãããæã£ãŠããŸãããã仿ããšããã®ç¶æ
ã®ã¢ãŠããããã¯èªåã®äžã ãã§å®çµãããããã°ã äžæ¹éè¡ã®ã¢ãŠãããã ã ã£ããã§ãã ãã¡ãããããã£ãŠã¿ããããšèªäœã¯ããšãŠã倧åã§ãã ãã ãããã ãã ãšã èªåã®çè§£ã®ææ§ãã«æ°ã¥ãã«ãã æ
å ±æŽçãäžååãªãŸãŸã§ãé²ããããŠããŸã åŠã³ãç¥èŠãèªåã®äžã ãã«çãŸãããã ãšããç¶æ
ã«ãªãããããçµæãšããŠãã¢ãŠããããã®éã質ãé æã¡ã«ãªãããããšæããŸããã ã¢ãŠãããããããå°ãåè§£ããŠæããŠã¿ã ããã§ãç§ã¯ãã¢ãŠããããããããå°ã现ããåããŠèããããã«ããŠã¿ãŸããã ããšãã°ãã¢ãŠããããã«ã¯å°ãªããšã3çš®é¡ãããšæã£ãŠããŸãã â» èªåãªãã®è§£éãªã®ã§ãåºèŸèã¯ããšããã人ã«ãã£ãŠæãæ¹ã¯å€ãããããããŸããããä»åã®ããŒãã«åãããŠãçè§£é ããŸããšå¹žãã§ãã ãã£ãŠã¿ã å®éã«æãåãããŠãææç©ãçã¿åºãããšã§ãã å®è£
ãããæ€èšŒãããèšèšããŠã¿ãããªã©ãããã«ãããããªãšæããŸãã äŒãã èªåã®ç¥èãçµéšããä»è
ãçè§£ã§ãã圢ã«ããŠæž¡ãããšã§ãã å£é ãããã¹ãåããããã£ãããèšäºãã¬ãã¥ãŒã³ã¡ã³ããå£é å
±æãªã©ãå«ãŸããŸãã æãã çžæããèªåãšåãããããã«è¿ãã¬ãã«ã§åçŸã§ããããã«ããããšã§ãã åã«æ
å ±ãæž¡ãã ãã§ãªããçžæãå®éã«äœ¿ããç¶æ
ãŸã§æ¯æŽããããšãŸã§ããã€ã³ãããªãšæããŸãã ãã®3ã€ã§èŠãŠãéå»ãæ¯ãè¿ããšã以åã®ç§ã¯ã1. ãã£ãŠã¿ãããŸã§ã¯ã§ããŠããŠããã2. äŒãããã3. æãããããããŸãè¶³ããŠããŸããã§ããã ãããããã®2ã€ãæèããŠå¢ããããã«ãªã£ãŠãããã¢ãŠããããã®éãšè³ªã®äž¡æ¹ã«å€åãåºãŠããã®ããªãšæããŸãã ãªããäŒããããæãããã¢ãŠãããããããã®ã çç±ã¯ããã€ããããšæããŸãããç¹ã«å€§ãããšæããŠããã®ã¯ã äŒããããšã§ãèªåã®çè§£ãæŽçããããã 誰ãã«äŒããããšãããšãäžèšãæŽçããå¿
èŠãåºãŠããŸãã äœãåæç¥èãªã®ã ã©ããéèŠãªã®ã ãªããã®å®è£
ã倿ãããã®ã ã©ã説æããã°äŒããã®ã ãã®äžã§ãèªåã®äžã§ã¯åãã£ãã€ããã§ããããèšèªåããããšãããšãæå€ãšææ§ãªéšåãèŠã€ãããŸãã ã€ãŸãã ãäŒãããã¯ãä»è
ã®ããã§ãããšåæã«ãèªåã®çè§£ãæŽçãçŽãã¢ã¯ã·ã§ã³ ã§ãããã®ããªãšæããŸãã æããããšã§ãèªåã®çè§£äžè¶³ãæã蟌ã¿ã«æ°ã¥ãããã æããå Žé¢ã§ã¯ãçžæãã質åããã£ãŒãããã¯ããè¿ã£ãŠããŸãã ãããããªã倧ããã§ãã èªåã«ãšã£ãŠã¯åœããåã«ãªã£ãŠããããšã§ããçžæãããããšããã§ã¯ãããŸããã ãã®æã«ãäžèšã®ãã㪠質åãåããããšã§ãèªåã®çè§£ã®æµ
ãã説æäžè¶³ã«æ°ã¥ã ããšããããŸãã ãªããã®èšèšã«ããã®ã ã©ããŸã§ããã¬ãŒã ã¯ãŒã¯ã®è²¬åã§ãã©ããããèªåãã¡ã®å®è£
ãªã®ã ãªã TypeScript ã®åããããŸã§å³å¯ã«ä»ããã®ã Next.js ã®ãã®æžãæ¹ãéžã¶çç±ã¯äœã ããã«ãã£ãŠãèªåã®ç¥èãèãæ¹ããã¢ããããŒãã§ããããã«èªèº«ã®ãã£ãŠã¿ãã¢ãŠãããããäŒãããæããã®ã¢ãŠããããã®è³ªãåäžã§ããŸãã ããŒã å
šäœã®ã¢ãŠããããåäžã«ã€ãªãããã ãäŒããããæãããã¯ãèªåã®ããã ãã§ãªããããŒã ã®ã¢ãŠããããåäžã«ç¹ãããŸãã ããšãã°ãäžèšã®ãããªå€åãèµ·ãããããªããŸãã ç¥èå
±æãé²ã¿ãå±äººåãæžã ã¬ãã¥ãŒèгç¹ãæãããããªã å®è£
ã®èæ¯å
±æãé²ã ãªã³ããŒãã£ã³ã°ããããããªã åã倱æãããŒã å
ã§ç¹°ãè¿ãã«ãããªã å人ã®åŠã³ãã ããŒã ã«å±éãããããã«ãªãã®ã§ãçµæãšããŠãPJå
šäœãšããŠåºããã¢ãŠããããã®éãšè³ªãäžããããã ãªããŸãã ç§ããå®éã«ããäŒããããæãããã¢ãŠãããããããŠæããããš ãäŒãããããšã§æããããš ãäŒãããã¢ãŠãããããããŠã¿ã宿ã§ãããšãä»ããããŠèšäºãæžããŠäŒããŠããããšèªäœããŸãã«ããã§ãã èªåã®äžã§ã¯ãªããšãªãåãã£ãŠããããšã§ããæç« ã«ããããšãããšã èªåã¯äœã«è©°ãŸã£ãŠããã®ã ã©ãã§å€åãèµ·ããã®ã äœãåçŸå¯èœãªåŠã³ãªã®ã ãæŽçããªããšãçãé²ã¿ãŸããã ãŸããèšäºãšããŠäŒããããšãããšãåã«æã£ãããšãæžãã®ã§ã¯ãªãã èªã¿æã«ãšã£ãŠåãããããã èªãã ããšã«è¡åã«ã€ãªããã èªåã®çµéšãä»ã®äººã«ãå¿çšã§ãããã ãšããèŠç¹ã§èŠçŽãããã«ãªããŸãã ïŒãã®èšäºããèªåãªããã©ããããäŒãããããã©ã¹ã®ã¢ã¯ã·ã§ã³ãèµ·ãããŠããããããèããªããæžããŠããŸãïŒ ãã®ããã»ã¹ãéããŠã èªåã®çµéšã倿ãèšèªåãããåå©çšããããç¥èŠã«ãªã£ãŠããæèŠããããŸãã ããã§ããŠãç¥èŠãå
±æãããããšã§ã å®è£
ã®èæ¯ãå
±æããããããªã ã¬ãã¥ãŒæã®èгç¹ãæãããããªã ããŒã å
ã§åããšããã§ã€ãŸããã«ãããªã ãšãã£ãæå³ã§ãã çµç¹ãããŒã ã®ã¢ãŠããããåäžã«å°ãã¯ã€ãªããã®ã§ã¯ãªãã ãšæããŠããŸãã ãæãããããšã§æããããš ç§ã¯ãããã³ããšã³ãå¯ããªã®ã§ãããã¯ãšã³ãå¯ãã®æ¹ã«å¯ŸããŠãããã³ããšã³ãã®åºç€ã Next.jsãTypeScript ã«ã€ããŠå
±æããããã¬ã¯ãã£ãŒãããããæ©äŒããããŸããã ãã®äžã§åŒ·ãæããã®ã¯ã æãããšãèªåã®çè§£ã®çããããèŠãã ãšããããšã§ãã èªåã®äžã§ã¯åœããåã«ãªã£ãŠããããšã§ãã質åãåãããšãæå€ãšããŸã説æã§ããªãããšãå€ã
ãããŸããã ããšãã°ã ãã®å®è£
æ¹éãéžã¶çç±ã¯äœã ãã®åå®çŸ©ã¯äœãé²ãããã®ã ã³ã³ããŒãã³ããåããåºæºã¯äœã ãã®æžãæ¹ãä¿å®ããããã®ã¯ãªãã ãšãã£ã質åã«åãåãããšã§ããåãã£ãŠããã€ããã ã£ãããšããæ¹ããŠæ·±æããããã£ããã«ãªããŸããã ãŸãã æããäžã§æ
å ±ãæŽçãçŽãããã説æãæ¹åãããããããšã§ãèªåèªèº«ã®ã¢ãŠããããã®è³ªãäžãã£ãŠãããŸãã ã ïŒãã質åãåãããšäžç·ã«èª¿ã¹ã€ã€æ¹ããŠåŠç¿ãæ·±ãŸãããšãå€ãã£ãã§ããïŒ ããã«ãæããçžæãåçããããã¯ãã以äžã®ææç©ãåºããŠãããããã«ãªããšãããŒã å
šäœãšããŠåºããã¢ãŠããããã®éã質ãäžãã£ãŠãããŸãã ããã¯ãå人ã§é 匵ãã ãã§ã¯åŸã¥ããå€åã§ããæãããã¯ãèªåã®æé·ãšããŒã ã®æé·ãåæã«é²ããããè¡åã ãšæããŠããŸãã ãäŒããããæããããããŒã ã«ãæå¹ãªã¢ãŠããããã§ããçç± ç€Ÿå
ã®ãšã³ãžãã¢çµç¹ãšãã芳ç¹ã§èŠãŠãããäŒããããæãããã¯ããªãéèŠã ãšæã£ãŠããŸãã ãªããªãã éçºçŸå Žã§ã¯ãåã«èª°ãäžäººã詳ããã ãã§ã¯è¶³ããªãå Žé¢ãå€ããã ã§ãã å人ã®ç¥èãçµéšãå
±æãããªããŸãŸã ãšã ç¹å®ã®äººã«ããåãããªãå®è£
ãå¢ãã ã¬ãã¥ãŒã人ã«ãã£ãŠã¶ãããããªã ãã£ããã¢ããã«æéãããã åã調æ»ã倱æãç¹°ãè¿ããã ãšãã£ããããªããšãèµ·ãããããªããŸãã éã«ããäŒããããæããããããŸãåãããã«ãªããšãäžèšã®ããã«ãªãããšã§ãçµæãšããŠãéçºå
šäœã®é²ã¿æ¹ãè¯ããªããŸãã å±äººåãæžã èæ¯èŸŒã¿ã§å®è£
ãçè§£ãããããªã æ°ããå
¥ã£ãã¡ã³ããŒãåŠã³ããããªã ããŒã å
ã§å
±éèšèªãå¢ãã ãŸãã¯ãå°ããå§ããŠã¿ã ãããŸã§æžããŠããéãã§ããããäŒããããæãããã¯æéãåŽåãããããŸãã ãªã®ã§ãæåãã倧ããããããšããªããŠããããšæã£ãŠããŸãã äŸãã°ã以äžã®ãããªã¢ã¯ã·ã§ã³ãªã©ãæããããŸãã åŠãã ããšã瀟å
ãã£ããã«çãå
±æãã è©°ãŸã£ããã€ã³ããšè§£æ±ºçãã¡ã¢ãšããŠæ®ã å£é ã§èª¬æããå
容ããããšã§ããã¹ãã§ãå
±æãã å匷äŒããã¢ããã®äžã§ãèªåãçè§£ããŠããããšãèšèªåããŠã¿ã 倧åãªã®ã¯ãããã£ãŠã¿ããã§çµãããããä»è
ã«å±ã圢ã«ããããŸã§ã¢ãŠããããããããš ã ãšæããŸãã ããæ¹ãããèªèº«ãè² æ
ã®å°ãªãããæ¹ã§è¯ãããªãšæããŸãã®ã§ã察é¢ãé話ã§äŒããã®ãåŸæãªæ¹ã¯ãããããå ŽãæŽ»çšããã°ãããšæããŸãããå£é ããããã¹ãã®æ¹ãåŸæãªæ¹ã¯ããã£ãããèšäºãããã¥ã¡ã³ãã§å®è·µããã®ãè¯ããšæããŸãã ïŒã¡ãªã¿ã«ãç§ã¯ãããã¹ãã奜ããªã®ã§ãããã¹ããç©æ¥µçã«æŽ»çšããŠããŸããïŒ ãŸãšã ç§èªèº«ãã¢ãŠããããã®éã質ã«ã€ããŠã¯ããŸã ãŸã éåã°ã§ãã ãããã以åããæ¹åããŠãã宿ãããã®ãäºå®ã§ãã ç¹°ãè¿ãã«ãªããŸããããã®äžã§åŒ·ãæããŠããã®ã¯ã ã¢ãŠããããã¯ããã£ãŠã¿ããã ãã§çµããããããäŒããããæããããŸã§å«ãããšå¹æçã§ãã ãšããããšã§ãã äŒããããšã§ãèªåã®çè§£ãæŽçããã æããããšã§ãèªåã®çè§£äžè¶³ãæã蟌ã¿ã«æ°ã¥ãã ãã®çµæãå人ã ãã§ãªãããŒã å
šäœã®ã¢ãŠããããåäžã«ãã€ãªãã çæçã«ã¯å°ãæéã«æãããããããŸããã ããããé·ãç®ã§èŠããšããã®ç©ã¿éããå人ã«ãããŒã ã«ãå¹ããŠãããšæã£ãŠããŸãã ã¢ããªã«ã®è«ºã«ããããŸããã ãæ©ãè¡ããããªããã²ãšãã§è¡ããé ããŸã§è¡ããããªããã¿ããªã§è¡ããã ãšãããã®ããããŸããããŸãã«ããã§ããã ã¢ãŠããããå
ïŒããŒã ã仲éïŒã«åããããšãæèããããšã§ãå人ã»ããŒã ã®ã¢ãŠãããããäžããããŠãé·æçã«ããã倧ããªã¢ãŠãããããåºããããã«ãªããšæããŸãã ãããã€ã³ããããå®è£
ãããŠããã®ã«ããªããªã䌞ã³åããªãæèŠãããæ¹ãããã°ããã²ãäŒããããæããããŸã§ãã¢ãŠããããã«å«ããŠã¿ãŠã¯ãããã§ããããã ç§ããŸã ãŸã éäžãªã®ã§ãåŒãç¶ãäžç·ã«é 匵ãããããããã§ãã















