
TDD
ã€ãã³ã
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
ãã¬ãžã³
æè¡ããã°
ã¿ãªãããããã«ã¡ã¯âïž ãããã¯ãéçºéšã® ããã¡ãã ã§ãð± ã¹ã¿ã¡ã³ã¯ãå
æ¥éå¬ããã ããã³ããšã³ãã«ã³ãã¡ã¬ã³ã¹åå€å± 2026 ã«ãã©ããã¹ãã³ãµãŒãšããŠãåºå±ã»åè³ãããŠããã ããŸããïŒ ããã³ããšã³ãã«ã³ãã¡ã¬ã³ã¹åå€å±2026 æ¥æïŒ2026幎5æ9æ¥(å) å ŽæïŒãŠã€ã³ã¯ããã¡(ã450-0002 æç¥çåå€å±åžäžæåºåé§
4äžç®4-38 ) fec-nagoya-org.github.io ãã©ããã¹ãã³ãµãŒãšããŠããŒã¹åºå±ããããŸããðª ä»åã®ã«ã³ãã¡ã¬ã³ã¹ã«ã¯ãå°éé åãããããç°ãªãã¹ã¿ã¡ã³ã®ãšã³ãžãã¢ãã¡ãåå ããŸããã ããã¯ãšã³ãã¡ã€ã³ã®ã¡ã³ããŒãããAI掻çšã«æ³šç®ããã¡ã³ããŒãŸã§ãå€è§çãªèŠç¹ã§ã»ãã·ã§ã³ãèŽè¬ããçµæããäžèŠå°å³ãªçœ ããžã®å¯Ÿçããã5幎ã«ããã¶å·æ°åãã®èå°è£ãããã«ã¯ãAIã€ã³ã¹ããŒã«ã®ãªã¢ã«ãªå°çããŸã§ãæ¿åã§çºããç¥èŠãããããéãŸããŸããâš ãã®ããã°ã§ã¯ãåå ã¡ã³ããŒãããã¡ã°ãå°è±¡ã«æ®ã£ãïŒããšèªããå³éžã»ãã·ã§ã³ã®ææ³ã¬ããŒããããããã®èŠç¹ã§ãå±ãããŸãð¥ ð¥ ã¹ã¿ã¡ã³ãšã³ãžãã¢ãçºããã»ãã·ã§ã³5éž ããã ðå°è±¡ã«æ®ã£ãã»ãã·ã§ã³ïŒ ãèŠãç®ã¯åããªã®ã«æ€çŽ¢ã§ãããããªãã ( @wabi_1318 ) wabiããã®ãèŠãç®ã¯åããªã®ã«æ€çŽ¢ã§ãããããªãããšããçºè¡šãç§ã«ãšã£ãŠç¹ã«å°è±¡ã«æ®ããŸããã MacOSïŒNFDïŒããã®ã¢ããããŒããšæå
¥åïŒNFCïŒã®å·®åã§ãã¡ã€ã«åæ€çŽ¢ããããããªããªããšãããã°ã¯ãåå ç©¶æãé£ãããã§æ²Œã«ãããããã ãšæããŸããããã©ãŠã¶ãã©ã€ãã©ãªåŽã§èªå解決ãããªãåé¡ããIssueã®è°è«ãªã©ã亀ããŠãªã¢ã«ã«èªã£ãŠãã ãããé¢çœãã£ãã§ãã ãããããäžèŠå°å³ã ãã©èžããšçãèœãšã穎ãã¯äžã
衚ã«åºãŠããªããšæãã®ã§ã貎éãªç¥èŠã§ããã ã·ã¹ãã ã®å
¥åå¢çã§ãã£ããæ€èšŒã»æ£èŠåããŠãåãæŽ»çšããŠçŽ ã®æååãšåºå¥ãããšããèšèšææ³ã®éèŠããåŠã¹ãã®ã§ãä»åŸã®ãããã¯ãéçºã«æŽ»ãããŠãããããšæããŸãã éŽæš éäžé ðå°è±¡ã«æ®ã£ãã»ãã·ã§ã³ïŒããã¶ã€ã³ãšã³ãŒãã®å¢çãæº¶ããã( @kskwtnk ) 綿貫ããã®åºèª¿è¬æŒããã¶ã€ã³ãšã³ãŒãã®å¢çãæº¶ããããšããçºè¡šããšãŠãå°è±¡ã«æ®ããŸããã ç§ã¯ãæ®æ®µããã¯ãšã³ãã¡ã€ã³ã§æžããŠããããã£ããã¢ãããšããŠTypeScript, Reactã®åŠç¿ã¯ããŠããã®ã§ããããã¶ã€ã³åšãã®èªå¥ããã£ããã¢ããããŠããã¹ããšããæ°ã¥ããåŸãŸããã ãŸãããã¶ã€ã³ã·ã¹ãã ãçŸå Žã«å°å
¥ãããããŒã ãæ
£ããŠããããããŸãã¯ãŒã¯ã§ããªãã£ããšãã話ããå®äœéšãããšã«ãã話ã§çŸå ŽæããããŸããããããã倱æè«ã¿ãããªãã®ã¯ãªããªã話ãã¥ãããšæãã®ã§ãå
±æããŠãããŠãšãŠããããããã£ãã§ãã ããããžã§ã¯ãã®åæã¯ãã¶ã€ã³ããŒã¯ã³ã®ã°ããŒãã«ããŒã¯ã³ãå°å
¥ããã ãã§ããã¶ã€ã³ã®çµ±äžæãåºãŠãã³ã¹ãè¯ãå°å
¥ã§ããŠè¯ãããšããè©±ãææ¥ããä»äºã§å³äœ¿ããããªãã¬ããžãšããŠåèã«ãªããŸããã ã¡ãã ðå°è±¡ã«æ®ã£ãã»ãã·ã§ã³ïŒ ããã€ã誰ããããšæã£ãŠãã ããã³ããšã³ãå·æ°5幎éã®å®è·µç¥ã ( @kiichi_sugihara ) é·æçãªãªã¢ãŒããã¯ãã£ã«åãçµã¿ãããã©ãç®ã®åã®æ¹åæ¥åã«è¿œãããŠæéãåããªããšãããçŸå Žã§ãããã課é¡ãžã®åãåãæ¹ãéåžžã«é¢çœãã£ãã§ãã kiiããã®çŸå Žã§ã¯ãåœåãæ¥åæéã®10%ãèªç±ã«äœ¿ããã·ã¹ãã å¥å
šåæ ããèšããŠããããã§ãããæ©èœçãªæ¹åã®æ¹ãããŒã ã瀟å
ãããåã°ããããããæ¹å â åã°ãã â ãããããªãããšããã«ãŒãã«å
¥ããæ ã䜿ãåã£ãŠããŸã£ãŠãããšãã倱æè«ã«ã¯éåžžã«å
±æããŸãããããããåŠã³ãæ ã§ã¯ãªããäžž1æ¥ã·ã¹ãã æ¹åãããããªããã·ã¹ãã å¥å
šåããŒãããèšããããšã§éäžã®åæãé²ãã ç¹ãããããŠæ®æ¥æéãæžãããŠãã®äœçœãå匷ã«å
ãŠãããšããé·æçã«çµç¹ãã·ã¹ãã ãžã®è¯ãæè³ã«ãªããšããã話ãå°è±¡çã§ããã ãŸããæè¡çè² åµãšããç®ã«èŠãã¥ãã課é¡ã解決ããããã«ã¯ãæ©èœéçºä»¥äžã«åšå²ãžã®èª¬æãšåæåœ¢æãå¿
èŠãšãªããŸãããªã¢ãŒããã¯ãã£ã«äŒŽãããã¯ãšã³ãåŽã®APIåé¢ãããã¶ã€ã³ããŒã¯ã³äœæã®å¿
èŠæ§ãªã©ãåã¹ããŒã¯ãã«ããŒãå·»ã蟌ãå£ããã£ãäžã§ããçæ³ãæããŠãäºæ¥ãããžã§ã¯ãã®ã€ãã§ã«æ®µéçã«ä»èŸŒãã§ããããšããç«ã¡åãã¯ãã©ããªä»äºã«ãããŠãéããçªç Žå£ã ãšæããŸããã å¿
èŠæ§ã®åå³ã«å§ãŸããåšå²ã®èª²é¡ãšèªåã®çæ³ãããããããªãããæçµçã«èŠæãæã£ãŠãããžã§ã¯ããå®éãããå§¿å¢ã¯ããŸãã«ãGet things doneãã®äœçŸã ãªãšæããŸããã äŒè³æ¬ è¡ ðå°è±¡ã«æ®ã£ãã»ãã·ã§ã³ïŒ ãAIãšä¹ãåã£ã1500ããŒãžè¶
ã®ãã«ããµã€ãåºç€å·æ°ã ( @mugi_uno ) ãAIãšä¹ãåã£ã1500ããŒãžè¶
ã®ãã«ããµã€ãåºç€å·æ°ãã®ã»ãã·ã§ã³ãèããŠãAIãžã®éä¿¡ã®å±ãããæ¹ããŠå®æããŸããã AIãããã°äœã§ãã§ãããšæããã¡ã§ãããå®éã«æãé²ãããšãå°çãžã®å§ãŸãããšãèšããè€éããåŸ
ã£ãŠããŸããã³ãŒããå€ããã ãã§ãªãããããã¯ãã®ãã§ãŒãºã«å¿ããå€æãæ±ããããå·æ°ååŸã®å·®åãå®å
šã«æé€ããããšã®é£ãããçæããŸãããTDDã®åŸ¹åºãããã¥ã¡ã³ãã®ç©ã¿éãã«ãã£ãŠãã¬ããžãèç©ãã誰ã§ãç·šéã§ããç¶æ
ãäœããšããã¢ãããŒãã¯ãšãŠãåèã«ãªããŸããã ãŸããAIã䜿ãããšã§èªåã®èŠ³æž¬ç¯å²ã«éãã屿æé©ã«é¥ãããããšããææãåºãããŸãããèªç€Ÿã§ãå人ã¹ãã«ã®åäžã¯é²ãäžæ¹ããããžã§ã¯ã暪æçãªãã¬ããžå
±æã®ä»çµã¿ã¯ãŸã æŽåéäžã§ãããã®èª²é¡ã«åãåããããŒã å
šäœã®ã¹ãã«ãåºäžãããä»çµã¿ãäœãããšãæ¥åã ãšæããŠããŸããèªç€Ÿãããã¯ããããå€ãã®äººã«äœ¿ããããå±ããããã«ããAIãæŽ»çšããªããã¹ããŒãæãæã£ãŠåããŠãããããšæããŸãã taro ðå°è±¡ã«æ®ã£ãã»ãã·ã§ã³ïŒ ããã€ã誰ããããšæã£ãŠãã ããã³ããšã³ãå·æ°5幎éã®å®è·µç¥ ã ( @kiichi_sugihara ) æãå°è±¡ã«æ®ã£ãã®ã¯ãã¡ãã®ã»ãã·ã§ã³ã§ãã ããã€ãçµéšè±å¯ãªãšã³ãžãã¢ãæ¥ãŠãäžç·ã«å·æ°ãé²ããŠãããã ããããšæããªããç®ã®åã®éçºã§ç²Ÿäžæ¯ã ã£ãããšãããšããããå§ãŸã 5 幎éã®ç©èªã§ããã äœããå¿ãåããããã®ã¯ãç»å£è
ã® ä»äºã«å¯Ÿããç±é ã§ãã5幎ãããŠå°ããã€ä¿¡é Œãšå°éæ§ãç©ã¿äžããæçµçã«ããã³ããšã³ãå·æ°ãããåããŸã§ã®è»è·¡ã¯ãèããŠããèªåãŸã§ç±ããªããã®ã§ããã ã»ãã·ã§ã³ãèããŠèªåãåãå
¥ããããšæã£ãã®ã¯ã次ã®2ã€ã§ãã 1æ¥ã®æéã®äœ¿ãæ¹ è²¬ä»»è
ã»é¢ä¿è
ã®å·»ãèŸŒã¿æ¹ 1æ¥ã®æéã®äœ¿ãæ¹ã«ã€ããŠã§ããæ¯æ¥ã®æ¥åãåãããã«ããªãã®ã§ã¯ãªããããã£ãšè¯ãããæ¹ãããã®ã§ã¯ãªããããšåãç¶ãã æéã®äœ¿ãæ¹ãã®ãã®ãèšèšãã ããã®ç©ã¿éããè€å©ã®ããã«å¹ããŠããŠãæªæ¥ã決ããã®ã ãšããèãæ¹ã¯åŒ·ãå°è±¡ã«æ®ããŸããã 責任è
ã»é¢ä¿è
ã®å·»ãèŸŒã¿æ¹ã«ã€ããŠã¯ãæ€èšŒãé²ãŸãªãææã«ãæè¡é¡§åãšã®å®äŸããŒãã£ã³ã°ãå
ã«èšå®ããã æ€èšŒã®é²æãå
±æããå Žãäœã â åŠå¿ãªãåé²ããããåŸãªãæ§é ããäœã£ãŠããŸããšãã話ã象城çã§ããããŸãã1人ã ãšææ§ã«ãªããããéšåãã説æããéçšã§èšèªåãããŠã¯ãªã¢ã«ãªãããšãã坿¬¡å¹æãèªãããŠããŸããã ããã«ãå·æ°ããèªåã®äœçœãã ãã§ããããšããã äºæ¥ããŒãããããèŠæ®ããŠäºæ¥ PJ ã«æ®µéçã«ä»èŸŒã ãšããçºæ³ã«ãçºããŸããããå Žãäœã£ãŠããåãããã¢ãããŒãã瀟å
ã®ããããé¢ä¿è
ã«å¯ŸããŠå®è·µããŠããå§¿å¢ã¯ãä»ã®èªåã«ãšãŠãå¿
èŠã ãšæããŸããã ãã®ãããªèŠæš¡ã®ã«ã³ãã¡ã¬ã³ã¹ã«åå ããã®ã¯åããŠã®çµéšã§ããããããŒã¹éå¶ãã»ãã·ã§ã³èŽè¬ããã©ã¡ããã¢ãããŒã·ã§ã³ã倧ããåŒãäžããŠãããæéã§ãããæ¬¡åãæ©äŒãããã°ãã²åå ãããã§ããããã€ãã¯èŽãåŽã§ã¯ãªãçºè¡šããåŽãšããŠç»å£ã§ãããããæ¥ã
ã®æ¥åãšåŠã³ãç©ã¿éããŠãããããšæããŸãã ããã㫠以äžãããã³ããšã³ãã«ã³ãã¡ã¬ã³ã¹åå€å± 2026ã®åå ã¬ããŒãã§ããïŒ å°éé åãç°ãªãã¡ã³ããŒãããããã®èŠç¹ã§ã»ãã·ã§ã³ãèŽè¬ããããšã§ãæè¡çãªãã¬ããžã¯ãã¡ãããããŒã ãã«ãã£ã³ã°ããããžã§ã¯ãæšé²ã®ãã³ããŸã§ãæ¬åœã«å€ãã®åºæ¿ãšåŠã³ãåŸãããšãã§ããŸããð¥ ã¹ã¿ã¡ã³ã§ã¯ãããããŠåŸãæå
端ã®ç¥èŠãçŸå Žã®å®è·µç¥ãæ¥ã
ã®ãããã¯ãéçºã«éå
ãããŠãŒã¶ãŒã®çããŸã«ããè¯ã䟡å€ãå±ããŠãããããããããããããŒã äžäžžãšãªã£ãŠçªãé²ãã§ãããŸãðš æ¹ããŸããŠãçŽ æŽãããã«ã³ãã¡ã¬ã³ã¹ãäŒç»ã»éå¶ããŠãã ãã£ãã¹ã¿ããã®çæ§ããããŠåœæ¥ããŒã¹ã«ãç«ã¡å¯ãããã ããçããŸãæ¬åœã«ããããšãããããŸããð ããã§ã¯ã次åã®ããã¯ããã°ããæ¥œãã¿ã«ð· herp.careers
ã¯ããã« ããã«ã¡ã¯ãZOZOTOWNéçº1éšiOSãããã¯ã®è»éã§ãïŒ @juginon ïŒã ã¿ãªããã«æ¥ã
䜿ã£ãŠããã ããŠããZOZOTOWN iOSã¢ããªã®ããŒã ç»é¢ã§ãããå®ã¯2024幎ç§ãã2026幎ã®å¹ŽåãŸã§çŽ1幎åãæ°Žé¢äžã§ãªã¢ãŒããã¯ãã£ãè¡ã£ãŠããŸããã ãªã¢ãŒããã¯ãã£ã«çæããåã®åœæã®ç§ã¯ã¢ãŒããã¯ãã£èšèšãžã®çè§£ããŸã æµ
ãããå®éã«æãåãããªãã身ã«ã€ãããããšããåæ©ã§ãã®ãªã¢ãŒããã¯ãã£ãäž»å°ããŸãããèªåã«ãšã£ãŠã¯ãã£ã¬ã³ãžã³ã°ãªåãçµã¿ã§ãã¢ãŒããã¯ãã£èšèšããã¹ãèšèšãžã®çè§£ãå®è·µãéããŠå€§ããæ·±ãŸã£ããããžã§ã¯ãã«ãªããŸããã æ¬èšäºã§ã¯ããã®ãªã¢ãŒããã¯ãã£ã®ãã¹ãŠã®è»è·¡ãšãããã§åŸãåŠã³ããäŒãããŸãã ãªããæ¬èšäºã§ç޹ä»ããããŒã ç»é¢ãªãã¡ã¯ã¿ãªã³ã°ã¯ãiOSããŒã å
šäœã§åãçµãã§ããã¢ãŒããã¯ãã£å·æ°ã®å
·äœçãªäºäŸã®1ã€ã§ããããŸããããŒã ãšããŠã®åãçµã¿ãç¥èå
±æã®ä»çµã¿ã«ã€ããŠã¯ ZOZOTOWNã®iOSã¢ãŒããã¯ãã£ãšããŒã é²åã®è»è·¡ ã«ããŸãšããŠããŸããæ¬èšäºãšåãããŠèªããšãåã
ã®åãçµã¿ãšããŒã å
šäœã®æèãããç«äœçã«çè§£ã§ããŸãã ç®æ¬¡ ã¯ããã« ç®æ¬¡ ããŒã ç»é¢ã«ã€ã㊠ã¿ã ã¢ãžã¥ãŒã« ããŒã ç»é¢ãæ±ããŠããèª²é¡ åœåã®èšèšãšããã®åŸã®éçšå®æ
ã®ä¹é¢ ç¶æ¿æ§é ãäžèŠã«ãªã£ã ãã°ç®¡çã®è€éå MVCã«ããViewControllerãžã®è²¬åéäž é«ãæ¹ä¿®é »åºŠ ãªãã¡ã¯ã¿ãªã³ã°ã®èšèšæ¹é æ¹é1: 圱é¿ç¯å²ãæå°åããªããæ®µéçã«é²ãã æ¹é2: 段éçã«è²¬åãåé¢ãã Step1: Objective-Cã¬ã¬ã·ãŒåãžã®äŸåãå¥ãã Step2: æãç¬ç«æ§ã®é«ãAPIã察象ã«ãViewModel/UseCaseãéšåå°å
¥ãã å°ããå§ããããšã®éèŠæ§ Step3: MallHomeViewControllerå
šäœã«ViewModel/UseCaseãå°å
¥ãã åé¡1. Swift Concurrencyãžã®ç§»è¡ åé¡2. ã¢ãžã¥ãŒã«æ§ç¯ã¡ãœããã®æŽç Step3å®äºåŸã«ãã°ã«é¢ãããã°ãçºèŠ ãã°ãåŒãèµ·ãããåå Step3-ex: åœåæŽçãšãŠããããã¹ãã®è¿œå åœåã®æŽç ãŠããããã¹ãã®è¿œå äžç¢ºããã«æ°ã¥ããæç¹ã§ãã¹ããæžã Step4: HomeViewControllerã«ViewModel/UseCaseãå°å
¥ãã TDDã«ããèšèšã®å
±æ ãªã³ããŒãã£ã³ã°åšãã®ç¶æ
管ç ãªãã¡ã¯ã¿ãªã³ã°åã®èª²é¡ ã¹ããŒããã·ã³ã«ããåèšèš é·æãªãã¡ã¯ã¿ãªã³ã°ãé²ããäžã§ã®ãã€ã³ã ãããã« ããŒã ç»é¢ã«ã€ã㊠ZOZOTOWN iOSã¢ããªã®ããŒã ç»é¢ã¯ä»¥äžã®ããã«ãäž»ã«ã¿ããšã¢ãžã¥ãŒã«ã«ãã£ãŠæ§æãããŠããŸãã ã¿ã ç»é¢äžéšã«è¡šç€ºãããŠããããã¹ãŠããã³ã¹ã¡ãéšåãæããŸããã¿ãã¯åãæ¿ããå¯èœã§ããã¹ãŠã¿ãã§ã¯ã¢ãã¬ã«ã»ã·ã¥ãŒãºã»ã³ã¹ã¡çãã¹ãŠã®ååããã³ã¹ã¡ã¿ãã§ã¯ã³ã¹ã¡ååç¹åã®ç»é¢è¡šç€ºã«ãªããŸãã å®è£
äžã¯ä»¥äžã®2çš®é¡ã®ViewControllerã§æ§æãããŠããŸãã HomeViewController : ããŒã ã¿ãã®ã«ãŒãç»é¢ãšãªãç»é¢å
šäœã管çããViewController ããããŒãæ€çŽ¢çªãªã©ãäž¡æ¹ã®ã¿ãã§å
±éããŠè¡šç€ºããéšåãããŒã ç»é¢å
šäœã®ç®¡çãæ
ã MallHomeViewController : ãã¹ãŠã¿ã/ã³ã¹ã¡ã¿ãã®ã³ã³ãã³ãã管çããViewController ããããã®ã¿ãã§è¡šç€ºãå€ããéšåã®ç®¡çãæ
ã ã¢ãžã¥ãŒã« åã¿ãã®ã³ã³ãã³ãã¯ãè€æ°ã®ãã¢ãžã¥ãŒã«ããšåŒã°ãããããã¯ã瞊ã«äžŠãã æ§æã§ããã¢ãžã¥ãŒã«ãšã¯ãæ§å¥éžæã»ãããŒã»ãã§ãã¯ããã¢ã€ãã ãšãã£ããåã
ã®ã³ã³ãã³ãåäœã®ããšã§ãã ãŠãŒã¶ãŒãããŒã ç»é¢ãã¹ã¯ããŒã«ãããšããããã®ã¢ãžã¥ãŒã«ãé çªã«è¡šç€ºãããŸãã ããŒã ç»é¢ãæ±ããŠããèª²é¡ åœåã®èšèšãšããã®åŸã®éçšå®æ
ã®ä¹é¢ ããŒã ç»é¢ã®è€éããçè§£ããã«ã¯ã2021幎ã®ãã«ãªãã¥ãŒã¢ã«æã®èæ¯ãç¥ãå¿
èŠããããŸãã 2021幎3æã®ZOZOTOWNãã«ãªãã¥ãŒã¢ã«ã§åããŠã¿ãæ§æãå°å
¥ãããŸãããåœæã¯3ã€ã®ã¿ããããã MallHomeViewController ãåºåºã¯ã©ã¹ãšãã3ã€ã®ãµãã¯ã©ã¹ã«ããç¶æ¿æ§æãæ¡çšããŸãããåã¿ãã§åºæã®åŠçãçºçããããšãèŠè¶ããèšèšã§ãã åœæã®åãçµã¿ã«ã€ããŠã¯ ZOZOTOWNã¢ã㪠Homeç»é¢ã®ãªãã¥ãŒã¢ã«ã«ãããã¢ãŒããã¯ãã£åèšèš ã§ã詳ãã玹ä»ãããŠããŸãã ãããããã«ãªãã¥ãŒã¢ã«ãã3幎以äžãçµéããéçšãéããäžã§åœåã®èšèšåæãå€ãã£ãŠãããŸããã ç¶æ¿æ§é ãäžèŠã«ãªã£ã åŸæ¥ã§ã¯ MallHomeViewController ãç¶æ¿ããåã¿ãã®ã¯ã©ã¹ãäœæããŠããŸããããåã¿ãã§åºæã®åŠçã¯å®éã«ã¯ã»ãšãã©çºçããŸããã§ããã ã¿ãã®çš®é¡ãä¿æããã ãã§ååãªç¶æ
ã§ãåã¿ãã§å°çšã®ã¯ã©ã¹ãäœæããæ§é ã¯ããã£ãŠå
šäœåã®ææ¡ãé£ããããŠããŸããã ãã°ç®¡çã®è€éå ãªãã¥ãŒã¢ã«åœåã¯GAïŒGoogle AnalyticsïŒã®ã¿ã ã£ããã°éä¿¡ãå°çšã®Loggerã¯ã©ã¹ã管çããŠããŸãããããããã®åŸã瀟å
åæçšãã°ãªã©è€æ°çš®å¥ã®ãã°ã远å ãããŠããäžã§ãLoggerèªèº«ãè€éãªç¶æ
管çãæ
ãããã«ãªã£ãŠãããŸããã è€æ°ã®ãã©ã°ãLoggerã®å
éšã«ç©ã¿éãªãã MallHomeViewController ãæã€ç¶æ
ãšåžžã«åæãããå¿
èŠãçããŸããããŸãããã°ã«é¢ãã責ååé¢ãé©åã«è¡ãããŠããªãéšåãããããããã£ãæ§é ãã³ãŒããèªãéã®ã³ã¹ããé«ããèŠå ã®1ã€ã«ãªã£ãŠãããŸããã MVCã«ããViewControllerãžã®è²¬åéäž 2021å¹Žåœæã¯MVCã¢ãŒããã¯ãã£ãæ¡çšããŠãããããAPIåŒã³åºãã»UIç¶æ
管çã»ããžãã¹ããžãã¯ã®èª¿æŽã MallHomeViewController ã«éäžããŠããŸãããåè¿°ã®Loggerã¯ã©ã¹ãšã®ç¶æ
åæãVCãçŽæ¥æ
ã£ãŠãããæ¹ä¿®ãå ãããã³ã«VCã»Loggeråæ¹ãžã®åœ±é¿ãèæ
®ããªããã°ãªããŸããã§ãããããããç©ã¿éãã§è¡æ°ã¯åã³1000è¡ãè¶
ãããŸã§ã«èšããã§ããŸã£ãŠããŸããã ç¹ã«åé¡ã ã£ãã®ã¯ãUICollectionViewãžã®ããŒã¿æ§ç¯ãšååæŒäžæã®ãã°ããŒã¿äœæãæ··åšãã500è¡åŒ±ã®å·šå€§ãªã¡ãœããã§ããã©ããè§Šãã°äœãå€ããã®ãææ¡ããã ãã§å€§ããªã³ã¹ãããããç¶æ
ã§ããã é«ãæ¹ä¿®é »åºŠ ZOZOTOWNã®ããŒã ç»é¢ã¯å¹³åæ1ããŒã¹ã§æ¹ä¿®æ¡ä»¶ãå
¥ããå€ãææã«ã¯3æ¡ä»¶ãåæäžŠè¡ã§èµ°ãããšããããŸãã ãã®ãªã¢ãŒããã¯ãã£ãéå§ããŠããçŸåšãŸã§ã§ããããŒã ç»é¢ã®ã¢ãžã¥ãŒã«ãç¡éã¹ã¯ããŒã«ã§ããæ©èœããã¢ãžã¥ãŒã«å
ã®ã¢ã€ãã ã§åç»ã衚瀺ããæ©èœãªã©ãèŠæš¡ã®å€§ããªæ¡ä»¶ããªãªãŒã¹ãããŠããŸãã 圱é¿ç¯å²ã®ææ¡ãå°é£ãªFat ViewControllerã¯ãæ¹ä¿®ã®ãã³ã«ãªã¹ã¯ã䌎ããããŒã ã®éçºé床ãäžããåå ã«ãªã£ãŠããŸããã ãªãã¡ã¯ã¿ãªã³ã°ã®èšèšæ¹é 課é¡ã¯æç¢ºã§ãããã1000è¡è¶
ã®VCãäžæ°ã«æžãæããã®ã¯ãªã¹ã¯ãé«ãããŸããããã§ä»¥äžã®æ¹éãç«ãŠãŸããã ãªãããã®ãªãã¡ã¯ã¿ãªã³ã°ã¯éåžžã®æ©èœéçºãšäžŠè¡ããŠé²ããŠããã皌åã®çŽ2å²ããã®åãçµã¿ã«å
ãŠãªããé²ããŠããŸããã1幎åãšããæéã¯ãã®ããã§ãã æ¹é1: 圱é¿ç¯å²ãæå°åããªããæ®µéçã«é²ãã åã¹ãããã®åœ±é¿ç¯å²ãå°ããä¿ã€ããšã§ãåé¡çºçæã®ä¿®æ£ã³ã¹ããæããããPRã®å€æŽéãå°ãªããªãã¬ãã¥ãŒã®è² æ
ãæžãããŸãããŸãåã¹ããããç¬ç«ããŠãªãªãŒã¹å¯èœãªåäœãšããããšã§ã仿¡ä»¶ã®é²è¡ããããã¯ããŸããã 以äžã®ã¡ãªãããæèããªãã以äžã®ã¹ãããã§é²ããèšç»ãç«ãŠãŸããïŒåœåã¯4ã¹ããããçµæãšããŠ5ã¹ãããã«ãªããŸããïŒã ã¹ããã å
容 Step1 Objective-Cã¬ã¬ã·ãŒåãžã®äŸåãå¥ãã Step2 æãç¬ç«æ§ã®é«ãAPIã察象ã«ãViewModel/UseCaseãéšåå°å
¥ãã Step3 MallHomeViewControllerå
šäœã«ViewModel/UseCaseãå°å
¥ãã Step3-ex Step3å®äºåŸã«ãã°ãçºèŠããåœåæŽçãšãŠããããã¹ãã远å Step4 HomeViewControllerã«ViewModel/UseCaseãå°å
¥ããã ã¹ããããèšèšããäžã§ã®ãã€ã³ãã3ç¹ç޹ä»ããŸãã Step1ãæåã«è¡ã£ãçç± MallHomeViewController ã«ã¯Objective-Cã®ã¬ã¬ã·ãŒãªåãžã®äŸåããããŸãããMVVMåãå
ã«é²ãããšãViewModel/UseCaseã¯ObjCã®åãæ±ãèšèšã«ãªããŸãããã®åŸObjCäŸåãé€å»ãããšãViewModel/UseCaseã®èšèšå€æŽãå¿
èŠã«ãªãææ»ããçºçããŸãããã®ãããMVVMåã®å段éãšããŠäŸåã®é€å»ãæåã®ã¹ããããšããŸããã MallHomeViewControllerããå
ã«çæããçç± ã¿ãã®äžèº«ã管çããŠãã MallHomeViewController ã¯ãçæéå§ããéããªãåŸç¶æ¡ä»¶ã®æ¹ä¿®ãå
¥ãäºå®ã§ããããã®ãããããããåã«MVVMåãå®éãããããšãåªå
ããŸããã Step2ãšStep3ãåããçç± ããŒã ç»é¢ã§ã¯è€æ°ã®APIãåŒã³åºããŠãããæåããå
šAPIã察象ãšãããšMVVMåã®åœ±é¿ç¯å²ã倧ãããªããããŸãããŸãç¬ç«æ§ã®é«ãäžéšã®APIã«çµã£ãŠViewModel/UseCaseãå°å
¥ããããšã§ãã¢ãŒããã¯ãã£ã®å
šäœåãå°ããªå€æŽã§ç¢ºèªã§ããåé¡ãçºçããéã®ä¿®æ£ã³ã¹ããæããããŸãã æ¹é2: 段éçã«è²¬åãåé¢ãã UseCase â ViewModel â ViewControllerã®é ã§è²¬åãåé¢ããŠãããæçµçã«ä»¥äžã®æ§æãç®æããŸãããåœæã®ã¢ãŒããã¯ãã£ã¬ã€ãã©ã€ã³ã§ã¯UseCaseã®æ¡çšãå®ããããŠããŸããããŸãAPIãªã¯ãšã¹ãã»ãã°éä¿¡ã»ããžãã¹ããžãã¯ãè€åçã«çµ¡ãããŒã ç»é¢ã®èŠæš¡æã«ãããŠããViewModelã®è¥å€§åãé²ãããã§é©åãªèšèšå€æã§ããã ããã§ç޹ä»ããŠãã倧ãŸããªå
šäœæ¹éã¯ã以åããŒã ã¡ã³ããŒã® ãªãã㌠ãããè¡ã£ã åå詳现ç»é¢ã®ãªã¢ãŒããã¯ãã£ã«ãããé²ãæ¹ ãåèã«ããŠããŸãã Step1: Objective-Cã¬ã¬ã·ãŒåãžã®äŸåãå¥ãã MallHomeViewController ã§ã¯ãååæ
å ±ã衚瀺ããéšåãObjective-Cã§æžãããã¬ã¬ã·ãŒãªåã«äŸåããŠãããAPIã¬ã¹ãã³ã¹ããã¬ã¬ã·ãŒãªåãžå€æããäžèŠãªäŸåããããŸããããã®ãããæåã®ã¹ãããã¯MVVMåã§ãªã äžèŠãªäŸåã®é€å» ããå§ããŸããã 以äžã®3段éã§äŸåãå¥ãããŸããã ååã®æ
å ±è¡šç€ºã«ãããŠå¿
èŠãªæ
å ±ãæã€UIModelãäœæ APIã¬ã¹ãã³ã¹ããã®UIModelã«å€æããTranslatorãäœæ Translatorã¯å€éšAPIã®ã¬ã¹ãã³ã¹åãUIModelã®åã«å€æãã責åãæã€ å€éšAPIã®åå®çŸ©ã倿ŽãããŠãViewModelãVCãžçŽæ¥åœ±é¿ããªãæ§é ã«ãªã ã¬ã¬ã·ãŒãªåã䜿ããªãæ°ããã»ã«ãå®è£
ããç§»è¡ æçµçã« MallHomeViewController ããObjective-Cã¬ã¬ã·ãŒåãžã®äŸåãå®å
šã«é€å»ããŸããã Step2: æãç¬ç«æ§ã®é«ãAPIã察象ã«ãViewModel/UseCaseãéšåå°å
¥ãã Step1ã§ã¯ãªãŒã³ãªåºç€ãã§ãããããããããMVVMåã«çæããŸããèšèšèšç»ã§ãæãç¬ç«æ§ãé«ãããšå€æãã äžä»£å¥ã©ã³ãã³ã°ã¢ãžã¥ãŒã« ããå§ããŸããã äžä»£å¥ã©ã³ãã³ã°ã¢ãžã¥ãŒã«ãšã¯ããŠãŒã¶ãŒãäžä»£ïŒ~10代ã20代ãªã©ïŒãéžæãããšããã®äžä»£ã®äººæ°ã¢ã€ãã ãã©ã³ãã³ã°åœ¢åŒã§è¡šç€ºãããã¢ãžã¥ãŒã«ã§ãã ããããŒã®äžä»£éžæãã¿ã³ãã¿ããããŠåãæ¿ãããšã察å¿ããã©ã³ãã³ã°ãåååŸã»å衚瀺ãããŸãã 以äžã®ç¹åŸŽããã£ããããããŒã ç»é¢ã®MVVMåã«ãããæåã®ã¹ããããšããŠå·¥æ°ããããããã¢ãŒããã¯ãã£ã®å
šäœåãå®è£
ããªããçè§£ã§ããæé©ãªé¡æãšå€æããçæããŸããã äžä»£å¥ã©ã³ãã³ã°å°çšã®ç¬ç«ããAPIãæã€ ãŠãŒã¶ãŒãäžä»£ãéžæãããšãã ãæŽæ°ããã ä»ã®ã¢ãžã¥ãŒã«ã®æŽæ°ãšç¬ç«ããŠåäœãã å°ããå§ããããšã®éèŠæ§ Step2ã¯å
šéšã§7ã€ã®PRãäœæããŸãããUseCaseäœæâUIModeläœæâViewModeläœæâViewControllerããUseCase/ViewModelãžåŠçãç§»åããæµãã§ä¿®æ£ãå ããŠãããŸããã 巚倧ãªViewControllerãäžæ°ã«æžãæããããšãããšã倿Žã倧ãããªããããŠã¬ãã¥ãŒãå°é£ã«ãªãããã°æ··å
¥ãªã¹ã¯ãé«ãŸããŸããStep2ã§Openãã7ã€ã®PRã®ã»ãšãã©ã100è¡æªæºã®ã³ãŒã远å ã«åãŸã£ãŠãããã¬ãã¥ãŒã§ã®ææãã»ãšãã©ãªãã¹ã ãŒãºã«ããŒãžã§ããŸããã ãŸããStep2ãéã㊠PRã®å岿¹æ³ ã 倿Žãå ããã¬ã€ã€ãŒã®é çª ãæç¢ºã«ãªããæ¬¡ã®ã¹ãããã§ããã¢ãžã¥ãŒã«æŽæ°å
šäœã®ãªã¢ãŒããã¯ãã£ãžã®èªä¿¡ãã€ããŸãããå€§èŠæš¡ãªãªãã¡ã¯ã¿ãªã³ã°ã«çæããéã¯ãæãç¬ç«æ§ã®é«ãéšåããå§ããããšã§ãã¬ãã¥ãŒã§ã®å顿€ç¥ããã°æ··å
¥ã®é²æ¢ã«çŽçµããŸããæåã®å°ããªã¹ããããéããŠPRã®å岿¹æ³ã倿Žãå ããã¬ã€ã€ãŒã®é çªãææ¡ããŠãããšãåŸç¶ã®å€§ããªã¹ããããããèªä¿¡ãæã£ãŠé²ããããŸãã Step3: MallHomeViewControllerå
šäœã«ViewModel/UseCaseãå°å
¥ãã ããŒã ç»é¢ã§ã¯ãäžä»£å¥ã©ã³ãã³ã°ã¢ãžã¥ãŒã«ã®ååŸAPI以å€ã«åèš4ã€ã®APIã䞊è¡ããŠåŒã³åºããŠããŸããStep3ã§ã¯ãããã®äž»èŠAPIãåŒã³åºããŠããéšåãã¹ãŠã«ViewModel/UseCaseãå°å
¥ããŸãããStep3ã¯Step2ã®ããã«ã¹ã ãŒãºã«ã¯è¡ãããããã€ãã®åé¡ã«çŽé¢ããŸããã代衚çãªåé¡ã玹ä»ããŸãã åé¡1. Swift Concurrencyãžã®ç§»è¡ åœæã® MallHomeViewController ã§ã¯ãäžéšåã®APIåŒã³åºãã« BrightFutures ã䜿ã£ãŠããŸããããã®ã©ã€ãã©ãªã¯2022幎ã«EOLãšãªã£ãŠãããããŒã å
ã§ãæ°èŠå®è£
ã§ã¯éæšå¥šãšããŠããããããã®ã¿ã€ãã³ã°ã§Swift Concurrencyãžç§»è¡ããŸããã Swift Concurrency察å¿ã«é¢ããŠããã®ãšããåããŠã®çµéšã§ããã®äžã§è²ã
ãšåŠã³ããããŸããã 䞊è¡åŠçã«ãããã¥ãŒè¡šç€ºæã®è¡šç€ºé æ
ä¿ ã¯ããŒãžã£ããŒã¹ã®ã³ãŒãã§ã¯ãè€æ°ã®ã¢ãžã¥ãŒã«ååŸAPIãçŽåã§åŒã³åºããŠããããã¹ãŠã®ã¬ã¹ãã³ã¹ãæã£ãŠããäžæ¬ã§æç»ããŠããŸãããSwift Concurrencyãžç§»è¡ããŠäžŠè¡åŒã³åºãã«ããããšã§ãã©ã®APIã¬ã¹ãã³ã¹ãå
ã«è¿ã£ãŠããããäžå®ã«ãªããŸããã¬ã¹ãã³ã¹ãåãåã£ãé ã«UIModelãç©ãã§ããå®è£
ã®ãŸãŸã§ã¯è¡šç€ºé ãå€ãã£ãŠããŸããŸãããå®è£
åœåã¯ãã®åé¡ã«æ°ã¥ããŠããŸããã§ããã UIModelã®é
åã«åžžã«æ±ºãŸã£ãé åºã§æ ŒçŽããå®è£
ã«ä¿®æ£ããããšã§è§£æ±ºããŸããããã¹ãŠã®APIã¬ã¹ãã³ã¹ãæã£ãŠããæ£ããé åºã§ãŸãšããŠæç»ãããšããåºæ¬çãªæµãã¯å€ãããã䞊è¡ååŸã«ããé床æ¹åãšè¡šç€ºé ã®ä¿èšŒãäž¡ç«ããŠããŸãã withCheckedThrowingContinuation ã«ãã£ã³ã»ã«ãäŒæããªãã£ã ç¹å®ã®APIåŒã³åºãã«ã¯ã¿ã€ã ã¢ãŠãåŠçãå¿
èŠã§ããã withThrowingTaskGroup ã䜿ãã ããŒã¿ååŸã¿ã¹ã¯ ãš äžå®æéåŸã«ã¿ã€ã ã¢ãŠããšã©ãŒãæããã¿ã¹ã¯ ã䞊走ãããŸãããã©ã¡ãããå®äºããã group.cancelAll() ã§ããäžæ¹ããã£ã³ã»ã«ããå®è£
ãæ¡çšããŠããŸããã ãããå®éã«ã¯ãã£ã³ã»ã«ãæ£ããæ©èœããŠããŸããã§ãããéä¿¡ãåæãããç¶æ
ã§ãªããŒããç¹°ãè¿ããšãã¿ã€ã ã¢ãŠããçºçã㊠group.cancelAll() ãåŒã³åºãããŠããã«ãããããããããŒãã£ã³ã°ãæ°žé ã«ç¶ãäžå
·åãçºçããŠããŸããã åå ã¯ãã³ãŒã«ããã¯åã®ãµãŒãããŒãã£SDKã withCheckedThrowingContinuation ã§ããªããžããŠããéšåã«ãããŸããããã®SDKã¯éä¿¡åææã«ã³ãŒã«ããã¯ãåŒã³åºããªãå ŽåããããŸããã¿ã¹ã¯ã°ã«ãŒãã®ãã£ã³ã»ã«ã¯ withCheckedThrowingContinuation å
ã«ã¯èªåã§äŒæããŸãããã³ãŒã«ããã¯ãåŒã°ããªãéããcontinuationã¯è§£æ±ºãããªããŸãŸãšãªããŸãã // ä¿®æ£å: ãã£ã³ã»ã«ã continuation ã«äŒæããªã func fetchData () async throws -> Response { try await withCheckedThrowingContinuation { continuation in legacySDK.fetch { result in // éä¿¡åææã¯ãããåŒã°ããªãå Žåããã // group.cancelAll() ãããŠã continuation 㯠resolve ãããªããŸãŸ continuation.resume(with : result ) } } } // ä¿®æ£åŸ: withTaskCancellationHandler ã远å ãããã£ã³ã»ã«æã« continuation ã resolve ãã func fetchData () async throws -> Response { let holder = ContinuationHolder() return try await withTaskCancellationHandler { try await withCheckedThrowingContinuation { continuation in holder.continuation = continuation legacySDK.fetch { result in holder.continuation?.resume(with : result ) } } } onCancel : { // ã¿ã¹ã¯ããã£ã³ã»ã«ããããšããonCancel ã§ãšã©ãŒãæã㊠continuation ã解決ãã holder.continuation?.resume(throwing : APIError.cancelled ) } } å¯Ÿå¿æ¹æ³ã¯ withTaskCancellationHandler ã远å ããããšã§ãããã¿ã¹ã¯ããã£ã³ã»ã«ããããš onCancel ã¯ããŒãžã£ãåŒã°ããããã§continuationã«ãšã©ãŒãæããããšã§ãã³ãŒã«ããã¯ãè¿ã£ãŠããªãç¶æ
ã§ãã¿ã¹ã¯ãçµäºã§ããŸããcontinuationãžã®åç
§ã class ã§ä¿æããŠããã®ã¯ã onCancel ã¯ããŒãžã£ãå¥ã³ã³ããã¹ãã§å®è¡ãããããã§ãã var ã§ã¯Swift Concurrencyã®èŠåãåºãŸãã withCheckedThrowingContinuation ã¯ã³ãŒã«ããã¯åAPIã async/await ã«å€æããææ®µãšããŠæå¹ã§ãããã¿ã¹ã¯ãã£ã³ã»ã«ã¯èªåã§ã¯äŒæããŸããããã£ã³ã»ã«ã«å¯Ÿå¿ãããã«ã¯ withTaskCancellationHandler ãšçµã¿åãããŠã onCancel æã«æç€ºçã«continuationã解決ããå¿
èŠããããŸãã åé¡2. ã¢ãžã¥ãŒã«æ§ç¯ã¡ãœããã®æŽç Step3ã®çµç€ã§ã¯ãViewControllerã«çœ®ãããŠãã500è¡åŒ±ã®å·šå€§ãªã¢ãžã¥ãŒã«æ§ç¯ã¡ãœãããæŽçããŸããã ãã®ã¡ãœããã«ã¯2ã€ã®è²¬åãæ··åšããŠããŸããã UICollectionViewã«è¡šç€ºããããŒã¿ãœãŒã¹ã®äœæïŒVCåŽã®è²¬åïŒ ååæŒäžæã®ãã°éä¿¡ã«å¿
èŠãªã¢ãžã¥ãŒã«å
äœçœ®æ
å ±ã®èšç®ïŒVMåŽã®è²¬åïŒ åŸè
ãViewModelãžç§»åããåã¢ãžã¥ãŒã«ã®åäžæ§æ¯èŒãå¯èœãªæ§é ãšããããšã§ãäœçœ®æ
å ±ãé©åã«ååŸã§ããããã«ããŸããã ããããšèªäœã¯äžæã§æžããããã«ãšãŠãã·ã³ãã«ãªãã®ã§ããå®è£
åœæã®èªåã®èªèãåæ§ã§ããã®æŽçã«é¢ããŠã¯ã¹ã ãŒãºã«é²ã¿ããã®ãŸãŸStep3ããªãªãŒã¹ããŸããã ããããããã§ä»åã®ãªã¢ãŒããã¯ãã£ã«ãããæå€§ã®å£ã«ã¶ã€ãã£ãŠããŸããŸãã Step3å®äºåŸã«ãã°ã«é¢ãããã°ãçºèŠ Step3ã®ãªãªãŒã¹åŸãã¢ãžã¥ãŒã«ã管çããŠããããŒã ãããã«ã«ãŒã»ã«ãããŒã®ã¿ãããã°ã§ããããŒã®äœçœ®ãæ£åžžã«éãããŠããªãããšããåãåãããå±ããŸããã 調æ»ã®çµæãã«ã«ãŒã»ã«ãããŒã®ã¿ããæã®ãã°ã«å«ãŸããããããŒã®äœçœ®ããšããŠã ããŒã ç»é¢å
šäœã«ãããã»ã¯ã·ã§ã³ã®è¡šç€ºäœçœ® ã誀ã£ãŠéä¿¡ããŠããããšã倿ããŸãããæ¬æ¥éãã¹ãå€ã¯ ã«ã«ãŒã»ã«å
ã®ãããŒã®äœçœ®ïŒäœæç®ã®ãããŒãïŒ ã§ããã ãã°ãåŒãèµ·ãããåå ã¢ãžã¥ãŒã«/ã»ã¯ã·ã§ã³/ã€ã³ããã¯ã¹ãªã©ã®äœçœ®ã«é¢ããåœåã®ææ§ã ããŒã ç»é¢ã¯è€æ°ã®ã³ã³ãã³ãã瞊ã«äžŠã¹ãæ§æã§ãããç»é¢äžã®è¡šç€ºé ïŒã»ã¯ã·ã§ã³äœçœ®ïŒããšãåã³ã³ãã³ãå
ã®äœçœ®ïŒã€ã³ããã¯ã¹ïŒããšãã2çš®é¡ã®"äœçœ®"ãååšããŸãããã³ãŒãäžã§ããããåºå¥ããåœåãäžæç¢ºã§ããã APIããååŸããã¬ã¹ãã³ã¹å/ãã°éä¿¡çšãã©ã¡ãŒã¿ãŒå/å
éšã§äœ¿çšããŠãã倿°åã®ããããã®äœ¿ãåããææ§ãªãŸãŸå®è£
ãç©ã¿éããŠãããã³ãŒããèªãéã«æ··åããããç¶æ
ã§ããã ãã°ã®å€ã®æ£ããããã¹ãã§æ€èšŒã§ããŠããªãã£ã ããã°ãéä¿¡ãããããšãã¯æå確èªã§æ€èšŒããŠããŸãããããéä¿¡ããããã°ã®å€ã®æ£ããããŸã§æ€èšŒã§ããŠããŸããã§ããã åœæã¯ãŠããããã¹ããæŽåãããŠããªãã£ããããã³ãŒãã¬ãã¥ãŒã ãã§ã¯é²ããããŸããã§ããããŠããããã¹ããããã°ããã®ãã°ã¯ãªãªãŒã¹åã«æ€ç¥ã§ããã¯ãã§ãã ããããæ€ç¥ã§ããªãã£ãèæ¯ãšããŠãSwift Concurrency察å¿ã§ã®æ³å®å€ã®å·¥æ°ã«ããçŠããšããã°ã®éèŠåºŠãçãèŠç©ãã£ãŠããããšãæããããŸãã Step3ã®çµç€ã®PRã¯Step2ãšã¯æã£ãŠå€ãã£ãŠ500è¡ãè¶
ãã倧ããªPRã«ãªã£ãŠããŸããã¬ãã¥ã¢ã«ã倧ããªè² æ
ããããŠããŸããŸããããå°ããåå²ããŠé²ããããšããåœåã®æ¹éã貫ããªãã£ãç¹ãåçã®1ã€ã§ãã Step3-ex: åœåæŽçãšãŠããããã¹ãã®è¿œå ãã°ãè¿
éã«ä¿®æ£ããåŸãStep3ã®å»¶é·ãšããŠåœåã®æŽçãšãŠããããã¹ãã远å ããŸããã åœåã®æŽç Step3ã§ã®ãã°åå ã®1ã€ãããã°éä¿¡ã³ãŒãã®èªã¿ã«ãããã«ãã£ãããããŸãåœåãæŽçããŠãããã¹ããæžããšããé åºãéžã³ãŸããã ã¢ãžã¥ãŒã«ã»ã»ã¯ã·ã§ã³åœåã®çµ±äž UICollectionViewäžã®æŠå¿µã®åŒã³æ¹ãšå€æ°ã®åãæŽçãããã¢ãžã¥ãŒã«ããšãã»ã¯ã·ã§ã³ãã®äœ¿ãåãã«ãŒã«ãæç¢ºã«ããŸããã ãã°éä¿¡ã®äœçœ®æ
å ±ã«é¢ããåœåçµ±äž ã»ã¯ã·ã§ã³ã®è¡šç€ºäœçœ®ãšã»ã¯ã·ã§ã³å
ã®ååäœçœ®ã衚ã倿°åããããããæç¢ºã«åºå¥ã§ããååã«çµ±äžããŸããã ãŠããããã¹ãã®è¿œå ãã°ãåŒãèµ·ãããŠããŸã£ããã°éä¿¡æã®ã»ã¯ã·ã§ã³äœçœ®ã«é¢ãããã¹ããã¯ãããšããŠãã¢ãžã¥ãŒã«ã®ååŸãæ§å¥å€æŽãç»é¢é·ç§»ãã©ã€ããµã€ã¯ã«ã€ãã³ããªã©å€æ°ã®ã·ããªãªãã«ããŒããŸãããStep2, Step3ã§UseCaseããããã³ã«ã§DIã§ããæ§é ã«ãªã£ãŠãããããMockã䜿ã£ããã¹ããæžããããã«ãªã£ãŠããŸãã ãŠããããã¹ããæ°èŠã§æžããŠããã®ãåããŠã®çµéšã ã£ãããããã¹ãã«é¢ããç¥èãè±å¯ãªããŒã ã¡ã³ããŒã«ã¢ãã¬ãã¥ãŒãè¡ã£ãŠããããŸããã åœåæŽçãšãã¹ã远å ãçµããæç¹ã§ãMallHomeViewModelã®ãã¹ãã«ãã¬ããžã¯38ïŒ
ãã99ïŒ
ã«åäžããŸããã äžç¢ºããã«æ°ã¥ããæç¹ã§ãã¹ããæžã Step3ã§ã¯ãã¢ãŒããã¯ãã£ãæŽåããŠãããã¹ããæžãã°ããããšããèããããã°ãåŒãèµ·ãããŠããŸãããã®èãã®å±ããã宿ããŸããããã°ãäžç¢ºããã«æ°ã¥ããã¿ã€ãã³ã°ã§ãã¹ããæžãããšã§ãçµæçã«æ¬¡ã®ã¹ããããå®å¿ããŠé²ããåã«ãªããŸãã Step4: HomeViewControllerã«ViewModel/UseCaseãå°å
¥ãã æçµã¹ãããã®Step4ã§ã¯ããŒã ç»é¢å
šäœã管çããŠãã HomeViewController ã®ãªã¢ãŒããã¯ãã£ãè¡ããŸããããã®ã¹ãããã§ã¯ãStep3ãŸã§ã®å€±æãšåŠã³ã掻ãã㊠TDDïŒãã¹ãé§åéçºïŒ ãæ¡çšããŸããããŸããStep3ã§ã®PRåå²ã®ç²åºŠãã¹ãèžãŸããã¬ãã¥ãŒããããç²åºŠã§PRãäœæãã¬ãã¥ã¢ãžã®è² æ
ãèæ
®ããPRæŠç¥ãåããŸããã TDDã«ããèšèšã®å
±æ Step4ã§ç¹çãã¹ãã¯ã UseCase/ViewModelã®ãã¹ãã±ãŒã¹ãProtocol/å®è£
ããå
ã«äœæãã ããšã§ããUseCase/ViewModelã®ãã¹ãéåœ¢äœæ â ãã¹ãã±ãŒã¹ã®äœæ â UseCase/ViewModelãšProtocolã®äœæ â å®è£
ããšããé çªã§é²ããŸããã ãã®TDDã¢ãããŒããç¹ã«åšåãçºæ®ããã®ãã ãã°éä¿¡åšãã®ä»æ§æŽç ã§ããã HomeViewController ã®ãã°éä¿¡ããžãã¯ã¯è€éã§ãèµ·åçµè·¯ïŒéåžžèµ·åã»ããã·ã¥éç¥ã»DeeplinkïŒãã¿ãåãæ¿ãã«å¿ããŠã©ã®ãã°ãã©ã®ã¿ã€ãã³ã°ã§éãããå€ãããŸãããŸããåãç»é¢é·ç§»ã§ãè€æ°ã®ã©ã€ããµã€ã¯ã«ã€ãã³ããé£ç¶ããŠçºç«ããããããã°ã®äºééä¿¡ã鲿¢ããå¶åŸ¡ãå¿
èŠã§ãããã®ãããªä»æ§ã§ã¯å®è£
è
ããšã«è§£éãåããããããStep3ãšåãèœãèžãå¯èœæ§ããããŸããã ããã§å®è£
ã«å
ç«ã¡ãèµ·åçµè·¯ããšã®ãã°éä¿¡ãããŒãããã¥ã¡ã³ããšããŠæŽçãã ããŒã ã§ä»æ§ãåæããäžã§ãã¹ãã±ãŒã¹ãèšèšãã ãšããããã»ã¹ãèžã¿ãŸãããããã¥ã¡ã³ãã«ã¯ ã©ã®åç·ã§ã©ã®ãã°ãäœåéãããã¹ãã ãç¶²çŸ
çã«èšè¿°ããããããã®ãŸãŸãã¹ãã®ä»æ§ãšããŠå
±æããŸããã ãã¹ãèšèšã«ãããŠéèŠãªæ¹éãšããŠã å
éšã®ãã©ã°ç¶æ
ã§ã¯ãªããŠãŒã¶ãŒã®åç·åäœã§ãã¹ããèšè¿°ãã ããšãæ¡çšããŸãããäŸãã°ä»¥äžã®ãããªã·ããªãªããã®ãŸãŸãã¹ãåãšããŠèšè¿°ããŠããŸãã éåžžã®ã¢ããªèµ·åã§ããŒã ç»é¢ã衚瀺ãããšãããã°ã1床ã ãéä¿¡ãããããš ããã·ã¥éç¥ã§ã¢ããªãèµ·åãããšããç¹å®ã®ãã°ã¯éä¿¡ããªãããš Deeplinkã§ããŒã ç»é¢ã«é·ç§»ãããšããviewWillAppearã§ã®ãã°éä¿¡ã¯ã¹ãããããããš ãã©ã®åç·ã§äœãèµ·ããã¹ããããšãã圢ã§ãã¹ããæžãããšã§ããã¹ãã仿§æžãšããŠæ©èœããããã«ãªããŸããå
éšå®è£
ããªãã¡ã¯ã¿ãªã³ã°ã§å€ãã£ãŠããåç·ããŒã¹ã®ãã¹ãã¯ãã®ãŸãŸç¶æã§ãããããä¿å®æ§ãé«ãŸããŸããã ãã¹ããå
ã«æžãããšã§ãããã®UseCaseã¯äœããã¹ããããããŒã ã§è°è«ããªããèšèšãé²ããããšãã§ããŸãããStep3ã§ããžãã¯ã®æŒãããã°ã«ã€ãªãã£ããšããåçããããã§æŽ»ããŠããŸãã ãªã³ããŒãã£ã³ã°åšãã®ç¶æ
管ç HomeViewController 㯠ãªã³ããŒãã£ã³ã° ïŒååèµ·åæã®æ¡å
ãããŒïŒåšãã®ç¶æ
管çãè€éã§ãã ãªãã¡ã¯ã¿ãªã³ã°åã®èª²é¡ åããŠZOZOTOWNã¢ããªãã€ã³ã¹ããŒã«ãããŠãŒã¶ãŒã¯ãããŒã ç»é¢ã衚瀺ããããŸã§ã«è€æ°ã®æ¡å
ç»é¢ãçµç±ããŸãã åé¡ã¯ããã®äžé£ã®ãããŒã管çããããã« 5ã€ä»¥äžã®Boolãã©ã° ãè€æ°ã®ãã¡ã€ã«ã«ãŸããã£ãŠæ£åšããŠããããšã§ãããäŸãã°ããã°ã€ã³ç»é¢ã®è¡šç€ºãå®äºãããããããã·ã¥éç¥èš±è«Ÿã衚瀺ããããã蚎æ±ãããŒã®è¡šç€ºãå¿
èŠãããšãã£ããã©ã°ãåæã«åæ£ããŠããŸãããããããçµã¿åãããæ¡ä»¶åå²ã«ãã£ãŠæ¬¡ã®è¡šç€ºå
å®¹ãæ±ºãŸãæ§é ã«ãªã£ãŠããŸãããããã«ããããä»ã©ã®ãã©ã°ãã©ã®ç¶æ
ã®ãšãäœãèµ·ããã®ãããææ¡ããã ãã§ãããªãã®ã³ã¹ããããã£ãŠããŸããã ãã®ãããªè€éããåå ã®1ã€ãšãªãããªã³ããŒãã£ã³ã°ã«é¢ããäžå
·åãçºçããããšããããŸããã ã¹ããŒããã·ã³ã«ããåèšèš Step4ã§ã¯ãã®ãªã³ããŒãã£ã³ã°ãããŒãã¹ããŒããã·ã³ãšããŠåèšèšããŸããã ãªã³ããŒãã£ã³ã°ã¯ä»¥äžã®4ã€ã®ç¶æ
ïŒStateïŒãšããããããé·ç§»ãããã€ãã³ãïŒEventïŒã«ãã£ãŠã¢ãã«åãããŸãã ViewModelã¯ãã®ç¶æ
ã賌èªããç¶æ
ã«å¿ããŠã©ã®ç»é¢ã衚瀺ãããã宣èšçã«èšè¿°ããŸãã ãã®èšèšã«ããããçŸåšã®ãããŒã®ã©ãã«ãããããç¶æ
ãšããŠäžç¹ã«éçŽãããé·ç§»ã®ããªã¬ãŒãšãªãã€ãã³ããæç€ºçã«ãªããŸããããããŸã§ã®ãã©ã°ã®çµã¿åããã«ããæé»çãªç¶æ
管çããè±åŽããã³ãŒããèªãã ãã§ãªã³ããŒãã£ã³ã°ãããŒã®å
šäœåãææ¡ã§ããããã«ãªããŸããã ãŸãããã©ã®ã€ãã³ãã§ã©ã®ç¶æ
ã«é·ç§»ããããããã¹ãã§çŽæ¥æ€èšŒã§ããããã«ãªããŸãããå°æ¥çã«ãªã³ããŒãã£ã³ã°ã®ã¹ãããã远å ã»å€æŽãããŠããç¶æ
é·ç§»ã®å®çŸ©ãä¿®æ£ããã ãã§å¯Ÿå¿ã§ããŸãã ããããŠãçŽ1幎5ãæã«ãããããŒã ç»é¢ãªã¢ãŒããã¯ãã£ãå®äºããŸãããStep4ã«é¢ããŠã¯ãããŒã ç»é¢ã«èµ·å ããé害ãåãåããã¯çºçããŸããã§ããã Step3ã§äœéšãããã°ãšããã®åŸæ®µéçã«æŽåãããã¹ãããå®éã®å質ä¿èšŒãšããŠæ©èœããŠããçµæã ãšæããŠããŸãã ããŒã ç»é¢ãªã¢ãŒããã¯ãã£å®äºåŸãåŸç¶æ¡ä»¶ã§ããŒã ç»é¢ãè§Šã£ãä»ã®ã¡ã³ããŒãããå®è£
ãæ¥œã«ãªã£ãããšãããã£ãŒãããã¯ãããããŸãããããã¯ã責åãé©åã«åå²ãããããšã§æ¹ä¿®ã®åœ±é¿ç¯å²ãææ¡ãããããªã£ãããšã瀺ããŠããŸãã ãŸãããã°åšãã®ä¿®æ£ãå
¥ã£ããšããããã¹ãã§æåãæ
ä¿ã§ããããã«ãªã£ãããšãã声ããããŸãããStep3ã§äœéšãããã°ã«å¯ŸããŠãStep3-ex以éã§æ§ç¯ãããã¹ããå®éã«æ©èœããŠããç¬éã§ããã é·æãªãã¡ã¯ã¿ãªã³ã°ãé²ããäžã§ã®ãã€ã³ã ä»åã®ãªã¢ãŒããã¯ãã£ãéããŠã®åŠã³ããã€ã³ãã¯åã¹ãããã§ç޹ä»ããŸããããå
šäœãéããŠç¹ã«éèŠã ãšæããç¹ãšããŠã èšèšããã¥ã¡ã³ãã®ç¶ç¶çãªæŽå ãæããŸãã èšèšèšç»ïŒæ®µéçãªã¹ãããèšç»ãã€ã³ã¿ãã§ãŒã¹èšèšïŒãææžåããŠããããšã¯ãé·æã«ããããããžã§ã¯ããããŒã ã§å
±æããåå°ã«ãªããŸããããªããã®èšèšã«ãããããæ®ã£ãŠããããšã§ãåŸç¶ã®ã¹ãããã§ãäžè²«ãã倿ãã§ããŸãããŸããAIãæŽ»çšããã³ãŒãã£ã³ã°ãäžè¬çã«ãªã£ãçŸåšã§ã¯ãèšèšæ¹éãææžåãããŠããããšã¯ããäžå±€éèŠã§ããAIãžã®æç€ºã®ç²ŸåºŠãäžããã ãã§ãªããçæãããã³ãŒãããããžã§ã¯ãã®èšèšæå³ãšäžèŽããŠãããã®æ€èšŒã«ã圹ç«ã¡ãŸãã ãããã« ãã®ãªã¢ãŒããã¯ãã£ãæ¯ãè¿ããšãæåã¯ãã¢ãŒããã¯ãã£ã«ã€ããŠã®çè§£ãæ·±ãããããšããåæ©ããå§ãŸããŸããããããå®éã«ã¯ãããã¹ãã®éèŠæ§ããæ®µéçãªå€æŽã®äŸ¡å€ãã倱æãæ¬¡ã«æŽ»ããããšããšãããããæ¬è³ªçãªããšãåŠãã ãããžã§ã¯ãã«ãªããŸããã ç¹ã«ãStep3åŸã®ãã°çºèŠâStep3-exã®ãã¹ã远å âStep4ã§ã®TDDæ¡çšã§ãã°0ãéæã§ããããšã¯ãèªåã®æé·ã匷ã宿ã§ãããã€ã³ãã§ããã ZOZOTOWN iOSã¢ããªã®ãªã¢ãŒããã¯ãã£ã¯ãŸã ç¶ããŠããŸãããã®ããŒã ç»é¢ã§ã®çµéšãããŒã ã®è³ç£ãšããŠç©ã¿äžããªãããããè¯ãã¢ããªãäœãç¶ããŠãããããšæããŸãã ZOZOã§ã¯ãäžç·ã«ãµãŒãã¹ãäœãäžããŠãããæ¹ãåéäžã§ãããèå³ã®ããæ¹ã¯ã以äžã®ãªã³ã¯ãããã²ãå¿åãã ããã corp.zozo.com
ããã«ã¡ã¯ããšã³ã¿ãŒãã©ã€ãºç¬¬äžæ¬éš æŠç¥ãœãªã¥ãŒã·ã§ã³ 1 éšã®è±ã§ãã æ®æ®µã¯Webã¢ããªãã¹ããã¢ããªã®æ¡ä»¶ãªã©ãæ
åœããŠããŸããããšãè¶£å³ã§AIãå匷ããŠããŸãã äžéã§ã¯Claude Codeãå¹
ãå©ããããªãããªããCodexã«ãã ããç¶ããŠããç§ã ããããæµè¡ãã«ä¹ããã°ãšæããä»åã¯Claude Codeã®èšäºãæžããŠã¿ãŸãã ããããå··ã§ã¯superpowersãªããŠãã®ã話é¡ã«ãªã£ãŠããããããããªãã§ããã ãšã³ãžãã¢ã®è±ç¥ãçµéããAIé§åéçºã®ãã¹ããã©ã¯ãã£ã¹ãsuperpowersã ãããããã°ãClaude Codeåå¿è
ã®ç§ã§ããã䞊ã¿ã®éçºãã§ããã¯ãã§ãã ãã®èšäºãæžãçµãã£ãŠããããã«ã¯ããã£ãšCodex掟ããClaude掟ã«å¯è¿ã£ãŠããã§ãããã ã§ã¯ããã£ãããã£ãŠãããŸãããã 1.Claude Codeãšã¯ 2.superpowersãšã¯ 3.Claude Codeã®åæã»ããã¢ãã 4.superpowersã®ã€ã³ã¹ããŒã« 5.superpowers-brainstorming 6.superpowers-using-git-worktrees 7.superpowers-writing-plans 8.superpowers-subagent-driven-development or executing-plans 9.superpowers-test-driven-development 10.superpowers-requesting-code-review 11.superpowers-finishing-a-development-branch 12. åäœç¢ºèª Plan2ã«ã€ã㊠ãããã« Codexãšã®æ¯èŒ éçºå¹çãšã³ã¹ã æ¡çšæ
å ± 1.Claude Codeãšã¯ Claude Codeã¯ãAnthropic瀟ãæäŸããŠããAIã³ãŒãã£ã³ã°ãšãŒãžã§ã³ãã ã¿ãŒããã«äžã§åäœããã³ãŒãã®çæã»ä¿®æ£ã»èª¿æ»ã»ãã¹ãå®è¡ãªã©ã察話圢åŒã§é²ããããšãã§ããã ãAIã«ã³ãŒããæžããŠããããã ãã§ãªããéçºäœæ¥ãã®ãã®ãäžç·ã«é²ããããšãã§ããããŒã«ã 2.superpowersãšã¯ superpowersã¯ãClaude CodeãããããŸã掻çšããããã®ã¯ãŒã¯ãããŒéã ãã¬ã¹ããèšç»äœæãTDDãã³ãŒãã¬ãã¥ãŒäŸé Œãªã©ãéçºã®åãã§ãŒãºã§äœ¿ããâåâãçšæãããŠããã Claude Codeã«ä»»ãããã«ããã®ã§ã¯ãªãã人éãšAIãããŸã圹å²åæ
ããããã®ãã¹ããã©ã¯ãã£ã¹éã ããã«ãããVibe CodingãSpecé§åéçºã®å質ã®åºäžããæåŸ
ã§ããã åèïŒ superpowers â»MITã©ã€ã»ã³ã¹ superpowersã¯ä»¥äžã®ã¯ãŒã¯ãããŒã§æ§æãããŠããŸãã èŠä»¶ãæŽçãã äœæ¥ç°å¢ãåãã å®è£
èšç»ãç«ãŠã ãã¹ããæžããªããå®è£
ãã(TDD) ã¬ãã¥ãŒãã ãã©ã³ããä»äžãã ãŸãã brainstorming ã§å®è£
ãããå
å®¹ãæŽçããŸãã ãããªãã³ãŒããæžãå§ããã®ã§ã¯ãªããClaude Codeã質åãããªãããç®çã»ä»æ§ã»ä»£æ¿æ¡ã»æžå¿µç¹ãæç¢ºã«ããŸãã ããã§åºããå
容ããåŸç¶ã®èšèšãå®è£
èšç»ã®åå°ã«ãªããŸãã æ¬¡ã«ã using-git-worktrees ã§äœæ¥çšã®ç¬ç«ããç°å¢ãäœæããŸãã æ°ãããã©ã³ããšworktreeãçšæããããšã§ãæ¢åã®äœæ¥ç°å¢ãå£ããã«å®è£
ãé²ããããŸãã AIã«å®è£
ãä»»ããããã§ãå®å
šã«è©Šè¡é¯èª€ã§ããç¶æ
ãäœãå·¥çšã§ãã ãã®åŸã writing-plans ã§å®è£
èšç»ãäœæããŸãã 倿Žãããã¡ã€ã«ãå®è£
æé ãæ€èšŒæ¹æ³ãå°ããªã¿ã¹ã¯ã«åè§£ããŸãã READMEã§ã¯ããããžã§ã¯ãçè§£ãæµ
ããžã¥ãã¢ãšã³ãžãã¢ã§ãé²ãããããããæç¢ºãªèšç»ãäœãããšèª¬æãããŠããŸãã After you've signed off on the design, your agent puts together an implementation plan that's clear enough for an enthusiastic junior engineer with poor taste èšç»ãã§ãããã subagent-driven-development ãŸã㯠executing-plans ã§å®è£
ãé²ããŸãã åè
ã¯ã¿ã¹ã¯ããšã«ãµããšãŒãžã§ã³ããå²ãåœãŠã仿§æºæ ãšã³ãŒãå質ã確èªããªããé²ããæ¹åŒã§ãã åŸè
ã¯èšç»ã«æ²¿ã£ãŠãããåäœã§å®è¡ãã人éã®ç¢ºèªãã€ã³ããæã¿ãªããé²ããæ¹åŒã§ãã å®è£
äžã¯ã test-driven-development ã«ãã£ãŠTDDã®æµããéèŠãããŸãã ãã¹ããå
ã«æžãããŸã ãããã¯ãã³ãŒãããªãã®ã§ãã¹ãã倱æããããã¹ããã°ãªãŒã³(æ£åžžã«éé)ããããã«å®è£
ã远å ããŠãããšããRED-GREEN-REFACTORã®æµãã§ãã æåŸ
ããæ¯ãèããå
ã«å®çŸ©ããããšã§ãAIããããã£ãœãåãã³ãŒãããæžããŠçµããã®ã§ã¯ãªãããã¹ãã§ç¢ºèªå¯èœãªåœ¢ã§å®è£
ãé²ããããŸãã ã¿ã¹ã¯ã®åéã«ã¯ã requesting-code-review ã§ã³ãŒãã¬ãã¥ãŒãè¡ããŸãã å®è£
ãèšç»ã«æ²¿ã£ãŠãããããã°ãèšèšäžã®åé¡ããªããã確èªããŸãã é倧ãªåé¡ãããå Žåã¯ã次ã«é²ãåã«ä¿®æ£ããæµãã«ãªããŸãã æåŸã«ã finishing-a-development-branch ã§éçºãã©ã³ããä»äžããŸãã ãã¹ãçµæã確èªããããŒãžããã®ããPull Requestãäœãã®ãããã©ã³ããæ®ãã®ããç Žæ£ããã®ããéžæããŸãã äžèŠã«ãªã£ãworktreeã®çä»ããŸã§å«ããŠãéçºäœæ¥ãå®äºãããŸãã ã€ãŸãsuperpowersã¯ã ãèãã â åãã â èšç»ãã â ãã¹ããã â å®è£
ãã â ã¬ãã¥ãŒãã â ä»äžããã ãšãã å
å®ãªéçºããã»ã¹ãAIãšãŒãžã§ã³ãã«å®ãããããã®ä»çµã¿ ã§ãã READMEã«ã âThe agent checks for relevant skills before any task. Mandatory workflows, not suggestions.â ãšããããã«ã匷å¶åãæã£ãã¯ãŒã¯ãããŒãšããŠèšèšãããŠããŸãã 3.Claude Codeã®åæã»ããã¢ãã 瀟å
ã§Claude Enterpriseã®ã©ã€ã»ã³ã¹ãè²°ã£ãã°ããã§ãŸã£ãããªç¶æ
ã ãšããããæšæ¶ããŠããŒã¯ã³ãç¡é§é£ãããŠãããŸãã VSCodeã«Claude Codeã®æ¡åŒµæ©èœãå
¥ããŸãã ã¡ãªã¿ã«ãCodexãšClaude Codeã®ã€ã³ã¹ããŒã«æ°ãšã¬ãã¥ãŒã¯ãããªæãã Claude Codeã®ã»ããã·ã§ã¢ãè©äŸ¡ãé«ãçŸç¶ã ã€ã³ã¹ããŒã«ãå®äºãããšããã°ã€ã³æ¹æ³ãåãããŸãã å
ã»ã©ã®Claude Enterpriseã®ã¢ã«ãŠã³ãã§ãã°ã€ã³ããŸãã æ¥ç¶ç¢ºèªã衚瀺ãããã®ã§ããæ¿èªããããæŒäžããŸãã èªèšŒã³ãŒããåãããã®ã§ãVSCodeã«æ»ã£ãŠè²Œãä»ããŸãã éããŸãããäœãã坿ããããã£ã©ã¯ã¿ãŒãæµ®ããã§ããŸãã æšæ¶ããŠç¡é§ã«ããŒã¯ã³ãæ¶è²»ããŠãããŸãããã ã¡ãªã¿ã«åœŒã¯äœãšããååãªãã ãããšèª¿ã¹ãŠã¿ããšããããClawd(ã¯ããŒã)ããšããããã§ãã Crab(è¹)ã®ãã£ã©ã¯ã¿ãŒããããããã§ãããããããããClawdã æ¬¡ã¯ã¿ãŒããã«ã§äœ¿ãããã®ã€ã³ã¹ããŒã«ã Pathãéããã€ã³ã¹ããŒã«ç¢ºèªã ãããåããŠã®èµ·åã ã ã¿ãŒããã«ã®è²åããéžæããŸãã(Dark mode) ãã°ã€ã³æ¹æ³ãéžæããŸãã èªèšŒã«æåããŸããã èªã¿é£ã°ã人ãå€ããããããŸããããããã«ãšã£ãŠã倧äºãªããšãæžããŠãããŸãã ãããªmistakesãæ¥µåæžããã®ããããã玹ä»ããsuperpowersã§ããã ä»åã¯åããŠã®å©çšãªã®ã§ãæšå¥šèšå®ãéžæããŸãã ã«ã¬ã³ããã£ã¬ã¯ããªã«å¯Ÿããæš©éãèãããŠãŸããããã¯èªç±ã«æäœããŠããã®ã§YesãéžæããŸãã ã»ããã¢ãããå®äºããŸããã 4.superpowersã®ã€ã³ã¹ããŒã« å
¬åŒã®ããŒã±ãããã¬ã€ã¹ããã€ã³ã¹ããŒã«ããŸãã ãã®repoã ãã§ã®ã€ã³ã¹ããŒã«ãéžæããŸãã superpowersãæã«å
¥ããŸããã æå¹åããŸãã 5.superpowers-brainstorming ããŠãæºåãæŽã£ãã®ã§AIãšãã¬ã¹ãããŠã¿ãŸãã superpowersãäœã«ã€ããŠè°è«ããããã ãïŒã æ¥æ¬èªããããã®ã ãããïŒ ãã ã®ToDoã¢ããªããã€ãŸããªãã®ã§ãçµç¹åãã®ã¿ã¹ã¯ç®¡çããŒã«ãããŒãã«ããŠã¿ãŸãã æ¥æ¬èªã§è¿ã£ãŠããŸããã ãªãã»ã©ãã¢ãã¯ãèŠãªããæ¹éãæ±ºããŠããæ¹æ³ãããããã§ãããã£ãããªã®ã§äœ¿ã£ãŠã¿ãŸãã brainstorming ã®ã¹ãã«ãèªã¿ãããšèšã£ãŠããã®ã§èš±å¯ããŸãã ãã¬ã¹ããå§ãŸããŸããã äžèŠæš¡ãéžæããŸãã ToDoã¿ã¹ã¯ã®æ¯ãæ¹ããŠãŒã¹ã±ãŒã¹ãåãããŠããŸããå
šéšå¿
èŠãããªã®ã§ããã®ããã«åçããŸãã ããšã§Claude CodeãæããŠãããã®ã§ããããäžæ12人ãã¯ãäžå¯Ÿå€ãã®èª€åãšã®ããšã ã¿ã¹ã¯ã®ãªãã€ã³ãæ¹æ³ã§ãããèªåãéžæããŠã¿ãŸãã éç¥æ¹æ³ã¯ãµãŒãã¹å
ã«ããŸãããã èªèšŒã¯ãµãŒãã¹ç¬èªãéžæããŸãã ãããã€å
ã¯AWSãæ³å®ããŠããã®ã§ã¯ã©ãŠããéžæããŸãã ã¿ã¹ã¯ã®é²æç¢ºèªãã§ãã人ã§ãããè€æ°éžæå¯ãšã®ããšã§3ã€éžæããŠã¿ãŸãã ã¹ã³ãŒããåºãããããã§ãMVPãèãããŠããŸãã ãŸããã£ããäžæéä¿¡ã®å®è£
ããå
¥ã£ãŠã»ããã§ããã â»MVPïŒMinimum Viable ProductïŒ ããã¯çµ¶å¯Ÿã«èããããšæã£ãŠããŸãããå®äºã®å®çŸ©ã§ãã ããã¯ãµãŒãã¹äžã§ãå¯Ÿå¿æžã¿ããæŒãããä»çµã¿ã§è¯ãã§ãããã èšèšã®ç¢ºèªãå§ãŸããŸããã ãã¢ã¢ããªã§Multi-AZã¯ãªãããããŸããããããã¯ãéçºã«äœ¿ãããè©äŸ¡ãããã®ã§ããªãããªæ§æã§ãããŸãããã ãéåæãªãã§ããããšåçããŸãã æ¬¡ã¯ããŒã¿ã¢ãã«ã§ãã AssignmentãšããäžéããŒãã«ã§äººãšã¿ã¹ã¯ãçŽã¥ããŠããŸããããããŠããã§ã¹ããŒã¿ã¹ç®¡çãããŠããŸãã Notificationã§éç¥ã¬ã³ãŒãã管çããæ§æã«ãªã£ãŠããŸããè¯ããšæããŸãã ãªãã€ã³ãã¯è€æ°åçºçããå¯èœæ§ãããããããã®ããŒãã«ã§ç®¡çããŸãã è¯ãèšèšã§ãããèªåã§èšèšããã«ããŠããããããšæããŸãã å
ŒåãšããããšããããããªããŸãããä»åã¯ã·ã³ãã«æ§æã§ãããŸãããã æ¬¡ã¯ãŠãŒã¹ã±ãŒã¹ã®ã¬ãã¥ãŒã§ãã ã¡ãã£ãšãåæéçºã§ã¯äžèŠãªéšåãããã®ã§çç¥ãäŸé ŒããŸãã æ¬¡ã¯èªèšŒã»èªå¯åšãã®ç¢ºèªã§ãã ããã®å®è£
ãåãããã®ã§æç€ºããŸãã æ¬¡ã¯ãšã©ãŒãã³ããªã³ã°åšãã®ç¢ºèªã 次ã¯ãã¹ãæŠç¥ã§ãã åæéçºãšããŠã¯ååãããèšç»ã ãšæããŸãã ãããŸã§ã®å
容ãèšèšæžã«ãŸãšããŠãããããã§ãã èšèšæžã®äœæãå§ãŸããŸããã 6.superpowers-using-git-worktrees ããŒã«ã«ã«gitãå
¥ããŠããããwriting-plansã«åŒãç¶ããŸãã 7.superpowers-writing-plans åŒç¶ããçµãããŸããã ä»åã¯Plan1ãšPlan2ã«åãããPlan1ã§MVPãéçºããPlan2ã®æ¹ã§ãããã€åšããèšç»ããŠããããã§ãã ã¡ãªã¿ã«ããããŸã§ã®äœæ¥ãccusageã§ç¢ºèªãçŽ$7ã§ããã $7ã...å人å©çšã ãšå³ãããª...ã 8.superpowers-subagent-driven-development or executing-plans 次ã¯ãã®èšç»ãå®è¡ã«ç§»ããŠããããŸãã é²ãæ¹ã¯1ã€ã®ãšãŒãžã§ã³ãã§é次å®è¡ãããããµããšãŒãžã§ã³ããé§äœ¿ããŠãã©ã¬ã«ã«éçºããããéžã¹ãŸãã ä»åã¯ãã«ãã¯ãŒãèŠããã®ã§ããµããšãŒãžã§ã³ããéžæããŸãã ãµããšãŒãžã§ã³ãã®ã¹ãã«ãèªã¿èŸŒãŸããŸããã 9.superpowers-test-driven-development ãã£ãããåºæ¬çã«ã¯Yesãå©ãäœæ¥ã«ãªãã®ã§ã¹ã¯ã·ã§ã¯äžéšå²æããŸãã (AIãšãŒãžã§ã³ãã«èš±å¯ããæš©éã確èªãã€ã€) Task 0.1ãå®äºããŸããããããŸã§30åãããã æ¥åPCã«dockerãæªã€ã³ã¹ããŒã«ã ã£ããããããã§äººéåŽã«ããŒã«ãæž¡ã£ãŠããŸããã ãäžå¯§ã«æé ãŸã§èšèŒããŠãããŠããã®ã§ã察å¿ããŠAIãšãŒãžã§ã³ãã«ããŒã«ãæ»ããŸãã ã€ã³ã¹ããŒã«ãå®äºããã®ã§ãç¶ããäŸé ŒããŸãã wslã®ããŒãžã§ã³ãå€ããŠDockerãèµ·åã§ããã«äººéã«è¿ã£ãŠããã®ã§ã察å¿ããŠç¶ããäŸé ŒããŸãã ããŒã«ã«ã§Postgresèµ·åãæ¥ç¶ç¢ºèªãŸã§ããŸããããããŸã§40åãããã§ããããã TDDçšã®ç°å¢ã»ããã¢ãããå§ãŸããŸããã ç°å¢ã®ã»ããã¢ãããçµãã£ãã®ã§ããããããµããšãŒãžã§ã³ããé§äœ¿ããŠã³ãŒãã£ã³ã°éšåãé²ããŠããããŸãã ãµããšãŒãžã§ã³ãã§ã®éçºã«é¢ããã¹ãã«ãèªã¿èŸŒãŸããŸããã ãã¹ã¯ãŒãèªèšŒéšåã®ä»®å®è£
ãçµãã£ãããã§ãã TDDã§ãã¹ãã³ãŒãâãããã¯ãã³ãŒãã®é çªã§ã³ãŒãã£ã³ã°ãé²ãã§ããããšããã¡ã€ã«ãããããããŸãã ãã¹ãã³ãŒãã«ã¯ããã·ã¥åããã¹ã®æ€èšŒã®æ£åžžç³»ãç°åžžç³»ãæžãããŠãŸãã ã¡ãã£ãšãã¹ããå°ãªãæ°ãããŸãããããšã§äŒç·ååããã®ã§ã¹ã«ãŒããŠãã ããã 10.superpowers-requesting-code-review éšåã®éçºã®ãã³ã«ãã³ãŒãã¬ãã¥ãŒãåŒãã§ããŸããã ç»åã®äžå€®ä»è¿ã«ãã¹ãå質ã«é¢ããèšèŒããããŸãã å
ã»ã©ã®ãã¹ãã±ãŒã¹ã¯ãã®èгç¹ã«ééããå質ã«ãªã£ãŠããããšãããããŸãã Test quality â Does the test verify behavior (not implementation)? Does it cover both happy path and one negative case (wrong password)? Does it avoid mocking the thing being tested? æ¬¡ã¯æš©ééšåã®TDDãå§ãŸããŸããã å
ã«ä»åã®3ã€ã®æš©éã§ã®ãã¹ãã±ãŒã¹ãäœæããŠããããšãããããŸãã 倱æãã¹ãã®äœæã倱æç¢ºèªãå®è£
ãæå確èªãšããRED-GREENã®ãµã€ã¯ã«ãç¹°ãè¿ããŠéçºãé²ãã§ãããŸãã ã³ãŒãã¬ãã¥ãŒã§ãprismaåŽã®æš©éãšã¢ããªå
ã§ã®æš©éã§éè€ç®¡çã«ãªãããããã®æžãæ¹ã¯ãããŠã»ãããšã¬ãã¥ãŒã§ææãåããŠãŸããã ãã®ã€ã·ã¥ãŒãããšã«å®è£
è
ãä¿®æ£ã«å
¥ã£ãŠãŸãã ãªãã ããããŒã éçºã£ãœããªã£ãŠããŸãããã 11.superpowers-finishing-a-development-branch Plan1ã®Phase1ãçµãã£ãã¿ã€ãã³ã°ã§ãfinishing-a-development-branchã®ã¹ãã«ãèªãŸããŸããã ãã€ã°ã¬ãŒã·ã§ã³ãã¹ããéããŠãããŸããã 12. åäœç¢ºèª åäœç¢ºèªæ¹æ³ãèããŠããã®éãã«èµ·åããŸãã ãã°ã€ã³ç»é¢ãéããã®ã§ãã°ã€ã³ããŠã¿ãŸãã ãã°ã€ã³ã§ããŸããã ãŸã æå°éã®æ©èœãããªãã®ã§ãåŒãç¶ãéçºãç¶ããŸãã å
šäœã§Phase7ã®ãã¡ããŸã Phase1ã®ç¶æ
ã§ãã Phase2ã¯ã¿ã¹ã¯äœæåšãã 1æéããããªããããã§ãPhase2ãå®äºã Phase3ã¯éç¥åšãã®å®è£
ã Phase4ã¯ãªãã€ã³ããŒåšãã®å®è£
ã Phase5ã¯ããã·ã¥ããŒãåšãã®å®è£
ã Phase6ã¯E2Eãã¹ãã®ç°å¢æ§ç¯ã E2Eãå®è¡ãããšããã1ä»¶passããŠã2ä»¶failedã«ãªããŸããã çµæãã³ããããŠãClaude Codeã«è¿ããŸãã 2ä»¶passããŠã1ä»¶failedã«ãªã£ãŠããŸããã å床ããšã©ãŒãã°ãClaude Codeã«é£æºããŠä¿®æ£ãäŸé ŒããŸããã åå®è¡ãããããE2Eã«ãã¹ãŠåæ ŒããŸããã ã¡ãªã¿ã«ãE2Eã®1ã€ç®ã®äžèº«ã¯ãããªæãã§ãã ãäŸé Œäœæ â æ
åœè
ãå¯Ÿå¿æžã¿ã«ãã â äŸé Œè
ã鲿ã確èªãããäžé£ã®æ¥åãããŒããã©ãŠã¶äžã§ç¢ºèªãããã¹ãã«ãªã£ãŠããŸãã 2ã€ç®ã¯ãããªæãã éšçœ²ç®¡çè
åãããã·ã¥ããŒãã®E2Eãã¹ãã§ãã ãDBãåæåâãŠãŒã¶ãŒãäœæâã¿ã¹ã¯ãçŽæ¥DBã«äœæâ2人åã®å²ãåœãŠãäœæâéšçœ²ç®¡çè
ã§ãã°ã€ã³âããã·ã¥ããŒããéãâè¡šç€ºãæ€èšŒ(æ£åžã1/2 ãèŠããããš)ããšããæµãã«ãªã£ãŠããŸãã 3ã€ç®ã¯ãããªæãã ãªãã€ã³ããŒæ©èœã®E2Eãã¹ãã§ãã ãDBãåæåâãŠãŒã¶ãŒãäœæâã¿ã¹ã¯ãçŽæ¥DBã«äœæâæ
åœè
ãžã®å²ãåœãŠãäœæâãªãã€ã³ããŒAPIãå®è¡âæ
åœè
ã§ãã°ã€ã³âéç¥ç»é¢ã確èªããšããæµãã«ãªã£ãŠããŸãã E2Eã«ééããããšãäŒãããšãPhase7ã«åãæãããŸããã æ°æéåŸãPlan1ããã¹ãŠå®äºããŸããã ã¡ãªã¿ã«ããããŸã§ããã£ãã³ã¹ãã¯çŽ$98(â1äž5åå)ã§ããã Plan2ã«ã€ã㊠AWSãžã®ãããã€ã¯Codexã§ã容æã«ã§ããã®ã§ãä»åã®èšäºã§ã¯å²æãããŠããã ããŸãã ãã®ãããã®æš©éç§»è²åšãã«ã€ããŠã¯ éå»ã®èšäº ãåç
§ããŠãã ããã ãããã« Codexãšã®æ¯èŒ Codexãšæ¯ã¹ãŠèšç»ç«ãŠãŠèªåŸçã«èµ°ãèœåãé«ã Codexãšæ¯ã¹ãŠã³ã¹ããé«ã èªèµ°ããŠããããã1æ¥åœããã®äœæ¥éãå€ã èšç»ãç«ãŠãããšã«ãããŒã¯ã³ãæ¶è²»ãã ãµããšãŒãžã§ã³ãã䜿ããšçšã«ãã³ã°ãã ãã³ã°ããéã«ã¯ctrl+oã§ç¶æ
ã確èªããctrl+cã§æ¢ããŠãããåå®è¡ãäŸé Œããå¿
èŠããã£ãã ããã«ããã®éã«superpowersã®ãµã€ã¯ã«ããå€ããããšããã£ãã ãã®å Žåã以äžã®ããã«åœä»€ããŠsuperpowersã®ãããŒã«åŒ·å¶çã«æ»ããŠãããå¿
èŠããã£ãã ããã³ããïŒãã³ã°ããŠããããäžæåæ¢ããŸãããsuperpowersã®ã¹ãã«ã確èªããŠTDDã§ã®éçºãç¶ç¶ããŠãã ããã éçºå¹çãšã³ã¹ã ãããŸã§çŽ1ïœ2æ¥éã§ããã(ã»ãã®äœæ¥ãããªããè£ã§åãããã ã) ã³ã¹ãã1ïœ2äžåçšåºŠã§ããã BtoC/BtoBæ¡ä»¶ã®äžè¬çãªéçºã§ã¯ãããã¯ãã®åæéçºã«ããªãã®æéãšã³ã¹ããããããŸãã(æè¡çã«ã€ãŸãããšãå€ã
ãã) ããã倧å¹
ã«åæžã§ãããšæããšã人åéçºã®æä»£ã«ã¯ããæ»ããªããªãšæããŸãã æ¡çšæ
å ± å
æ¥Xã§ãJTCã§ã¯ç€Ÿå
ã®AIå©çšãé²ãã§ãããåãã«ãããã¿ãããªã®ã話é¡ã«ãªã£ãŠãŸããããåŒç€Ÿã¯ãã®æ°å¹Žéã§åçš®AIããŒã«ã®ã©ã€ã»ã³ã¹ãç³è«åšããããªãæŽåããããã¡ããã¡ãåããããã§ããAIã䜿ã£ãŠä»äºãããSIã®æ¹ã¯ãã²ãæ€èšãã ãããã â ã®ã¹ã¿ãŒãæŒããŠããã ãããšå¬ããã§ããå±ã¿ã«ãªããŸãã æåŸãŸã§èªãã§ããã ããããããšãããããŸããã ãšã³ã¿ãŒãã©ã€ãºç¬¬äžæ¬éšã§ã¯äžç·ã«åããŠãã ãã仲éãåéäžã§ãã以äžã®ãªã³ã¯ãããé¡ãããŸãã ç§ãã¡ã¯äžç·ã«åããŠããã仲éãåéããŠããŸãïŒ äžéæ¡çš-ãšã³ã¿ãŒãã©ã€ãºç¬¬äžæ¬éš æ°åæ¡çš-ãšã³ã¿ãŒãã©ã€ãºç¬¬äžæ¬éš å·çïŒ è± è¯æ²» (@hanabusa.ryoji) ã¬ãã¥ãŒïŒ @miyazawa.hibiki ïŒ Shodo ã§å·çãããŸãã ïŒ











