2010幎ãç§ã¯Google Waveã§åããŸãããããã§ã¯ãã¡ãŒã«ãGoogleããã¯ããã©ãŒã©ã ãã€ã³ã¹ã¿ã³ãã¡ãã»ãŒãžããã®ä»ã®å€ãã®ã·ã³ã°ã«ã¿ã¹ã¯ã¢ããªã±ãŒã·ã§ã³ã眮ãæããããã«ãå ±åã§ç·šéå¯èœãªã¹ããŒã¹ãäœæããããšããŸãããç§ã®ããŒã«ã®äžã§ãç§ã¯ç¹ã«æ±çšç°å¢ã奜ãã§ããWaveã®ããã«ãæ©èœã¯åœæå®åŒåãããŠããŸããã§ãããä»ã®ã»ãšãã©ã®ããŒã«ãšã¯ç°ãªããæ±çšç°å¢ã¯ç¬èªã®ã¯ãŒã¯ãããŒã課ããªããããäŒæ¥ã®èšç»ãWikiã®äœæãåéãšã®ããŒãã²ãŒã ã®ãã¬ã€ãä»äºã®äŒè°ã®ã¹ã±ãžã¥ãŒã«ãªã©ã«äœ¿çšã§ããŸãã
å éšçã«ã¯ãWaveã®å ±åç·šéã¯Operational TransformïŒOTïŒã®äžã§æ©èœããåœæã¯äœæ¥ã䜿çšãããŠããŸãããç§ãã¡ã®ã¢ã«ãŽãªãºã ã¯1995幎ã®æšæã®è©±ã«åºã¥ããŠããŸãããã¢ã«ãŽãªãºã ã¯ãããã¥ã¡ã³ãããšã«ããäœçœ®0ã®ã¿ã€ãHãããäœçœ®1ã®ã¿ã€ãiããªã©ã®å€æŽã®åå¥ã®æç³»åãªã¹ããä¿æããŸããã»ãšãã©ã®å ŽåããŠãŒã¶ãŒã¯ããã¥ã¡ã³ãã®ææ°ããŒãžã§ã³ãå€æŽãããã°ã¯äžé£ã®å€æŽã®ããã«èŠããŸãããå ±åç·šéããå Žåãåæç·šéã«çŽé¢ããŸãã
ãã®å ŽåããµãŒããŒã«å°éããæåã®ç·šéã¯éåžžã©ããèšé²ããã次ã®ç·šéãå€ããªã£ãŠããããšãå€æããå Žåã¯ãã€ãã³ããã°ãšæ¯èŒãããŠããŠãŒã¶ãŒã®æåã®ç®æšã決å®ãããŸãã ïŒå€ãã®å Žåããã¹ãŠã¯æåäœçœ®ã®æŽæ°ã«åž°çããŸããïŒæ¬¡ã«ãã¢ã«ãŽãªãºã ã¯ããããããããã¯ãŠãŒã¶ãŒãæãã§ããçµæã§ãããšæããããªã¢ã«ã¿ã€ã ã§git-rebaseãªã©ã®æ°ããæäœãè¿œå ããŸãã
Google Waveã®ééã«äŒŽããOTã¢ãã«ãShareJSã«ç§»æ€ããŸããããã®æãããŒãã¯æ°ãããŠå¥åŠã«æããŸããããããŠç§ãæ£ããèŠããŠããã°ãç§ã¯npmãªãªãŒã¹ã®åã§ããShareJSãå§ããŸãããåçŽãªå ±åç·šéè ã¯1000è¡ã®ã³ãŒãããå¿ èŠãšããããã¢ã§ã¯ãã©ãŠã¶ãšã¢ããªã±ãŒã·ã§ã³ã§ããã¥ã¡ã³ããå ±åç·šéããŸããã
æ¬è³ªçã«ãOTã¯ïŒïŒã«ãŒãã§è£ 食ãããŠããŸãæåãªãã»ãããæŽæ°ããããã®è€æ°ã®ãã«ãæ©èœãåããŠããŸããå®éã«ã¯ãOTã¯ã·ã³ãã«ã§ç解ãããããããã«éçšã§ããåªããæ©èœãçºæ®ããŸããïŒæé©åãããŠããªãjavascriptã§ã¯1ç§ããã10ã10äžåã®æäœãæé©åãããCã§ã¯1ã2,000äžåïŒãã€ãã³ããã°ã¯éåžžãããå€ãã®ã¡ã¢ãªãæ¶è²»ããå¯èœæ§ããããŸãããç¹ã«å€ãç·šéãçµã¿åãããããšãã§ããªããªããŸãããå¿ èŠã«å¿ããŠãã°ãæžããããšãã§ããŸãããªãã¬ãŒã·ã§ã³ãã°ããŒãã«ã«å²ãåœãŠãã«ã¯ãäžå åããããµãŒããŒãå¿ èŠã§ãããã»ãšãã©ã®ã·ã¹ãã ã«ã¯ãã§ã«ãã®ãããªãµãŒããŒãŸãã¯ããŒã¿ããŒã¹ããããŸããã
äžå åããããµãŒããŒ
OTã®éèŠãªåé¡ã¯ãéäžåãµãŒããŒãžã®äŸåã§ãããœãŒã·ã£ã«ãããã¯ãŒã¯ãä»ããŠGoogleDocsããã¥ã¡ã³ããžã®ã¢ã¯ã»ã¹ãèš±å¯ãããšãããã®ããã¥ã¡ã³ããéè² è·ã«ãªããç·šéãç¡å¹ã«ãªã£ãŠããŸãããªã©ã®å¥åŠãªã¡ãã»ãŒãžã衚瀺ãããã®ã¯ãªãã ãããšæã£ãããšã¯ãããŸãããããã®çç±ã¯ïŒç§ã®æèŠã§ã¯ïŒæ¬¡ã®ãšããã§ããããã¥ã¡ã³ããéããšããã¹ãŠã®ç·šéãåŠçããããã«1ã€ã®ç¹å®ã®ãµãŒããŒãéžæãããå€æ°ã®ãŠãŒã¶ãŒãããã¥ã¡ã³ãã«é£ã³ã€ããå Žåãã·ã¹ãã ã¯ãµãŒããŒã«éè² è·ããããªãããã«éåžžã«åªåããå¿ èŠããããŸãã
ãã®åé¡ãåé¿ããã«ã¯ãããã€ãã®æ¹æ³ããããŸãããµãããã¥ã¡ã³ãã®ã·ã£ãŒãã£ã³ã°ïŒGoogle Docksã®å Žåã®ããã«ïŒã«å ããŠãããŒã¿ããŒã¹ãã©ã³ã¶ã¯ã·ã§ã³ããã€ãã¹ããŠãåè©Šè¡ã«ãŒããä»ããŠç·šéãè¡ãããšãã§ãããããã·ãªã¢ã«åã®åé¡ã¯åãããŒã¿ããŒã¹ã§åŠçãããŸãïŒãããFirepadã®åäœæ¹æ³ã§ãïŒãããã³ShareDBïŒã
ãã ããOTã¯å®å šã§ã¯ãããŸãããé»åã¡ãŒã«ãWaveã«çœ®ãæãããã£ãã®ã§ãããã¡ãŒã«ã¯ããŒãžããµããŒããã1ã€ã®æåãã§ãŒã³ãå€ãã®äŒæ¥ã«ãŸãããããšãã§ããã©ãããããããã¹ãŠãæ£åžžã«æ©èœããŸããããã«ãFacebookã¡ãã»ãŒãžãšã¯ç°ãªãããã³ããŒãåã«èšèŒãããŠããäŒæ¥ã«é»åã¡ãŒã«ãéä¿¡ã§ããŸãã Waveã§ã¡ãŒã«ã眮ãæããå Žåã¯ãããšãã°æ¬¡ã®ããŒãã«ã§ååã«æçŽãéããšãã«ãå€éšãããã¯ãŒã¯ã«ã¢ã¯ã»ã¹ããã«ã¡ãã»ãŒãžãéä¿¡ããæ©èœãå¿ èŠã«ãªããŸããããããOTã®äžã«ããããã¹ãŠãã©ã®ããã«å®è£ ã§ããŸããïŒç§ãã¡ã¯ã©ãããããããã®ãããªããã»ã¹ãèšå®ããããšãã§ããŸããããããã¯è€éãããŠãšã©ãŒã§ãã£ã±ãã§ããããšãå€æããŸããïŒç§ãã¡ã¯å³ãäœæããŸãããåãŠã§ãŒããããã³ã«ããŠã§ãŒããµãŒããŒã®ããªãŒãã»ããã¢ããããŠæäœãåæ¹åã«è»¢éããŸããããå®å šã«ã¯æ©èœããŸããã§ããã10幎匱åã®WaveProtocol Summitã§ããã®ãããªãããã¯ãŒã¯ã®äœæãšæ§æã®æ¹æ³ã«ã€ããŠãã¬ãŒã³ããŒã·ã§ã³ãè¡ããŸããããæºåãšäºåãã§ãã¯ããã¹ãŠè¡ã£ãã«ããããããããã¬ãŒã³ããŒã·ã§ã³èªäœã®åã¹ããããå³å¯ã«é å®ã§ããããããã¯ãŒã¯ãæ©èœããŸããã§ããããªããããèµ·ãã£ãã®ãã¯ãŸã ããããŸãããããã°ãäœã§ããããããªãã¯ããŒãžã§ã³ã§ã¯ã»ãšãã©ä¿®æ£ãããŠããããéåžžã«å°é£ã§ããã
é¢éžCRTD
ãã§ã«è¿°ã¹ãããã«ãã¡ã€ã³ã®Waveã¢ã«ãŽãªãºã ã¯ããªãæã®1995幎ã«äœæããããã®ã§ãåœæèªå® ã«ã€ã³ã¿ãŒãããããã£ãããšããèŠããŠããŸããããã以æ¥ãç 究è ã¯OTã®ããã©ãŒãã³ã¹ãæ¹åããããã«ãããŸã¬åªåãéããæãææãªæ¹åã§CRTDïŒç«¶åã®ãªãè€è£œããŒã¿ã¿ã€ãïŒã䜿çšããŠããŸãããã®ã¢ãããŒãã¯éåžžãšã¯å°ãç°ãªããäžå€®ãµãŒããŒãå¿ èŠãšããã«ãªã¢ã«ã¿ã€ã ã§ãã¡ã€ã«ãç·šéã§ããŸããããŒãã£ã³ã®ãã¬ãŒã³ããŒã·ã§ã³ã¯ãç§ã説æã§ããããã圌ãã®ä»äºããããã説æããŠããã®ã§ã詳现ã¯ã¹ãããããŸãã
人ã ã¯äœå¹Žãã®éCRTDã«ã€ããŠç§ã®æèŠãæ±ããŠããŸããããããŠç§ã®çãã¯ãã€ããã®ããã«èãããŸãïŒ
ãããã¯ãã¡ããšããŠããŠã人ã ããããã«åãçµãã§ãããŠããããã§ãããããïŒ
- . . , 100 Delta-CRTD . (: B4.)
- - CRTD , , 100 automerge master 83 . , , , , . ( automerge 1.1 .)
- äœå¹Žãã®éãOTã«ååšããæ©èœã¯CRDTã«ååšããŸããã§ãããããšãã°ã/ object move /ïŒJSONããªãŒã®ããéšåããå¥ã®éšåã«äœãã転éããïŒããµããŒãããCRDTããŸã äœæããŠããŸããããã®ãããªæé ã¯Workflowyã®ãããªã¢ããªã±ãŒã·ã§ã³ã«å¿ èŠã§ãããOTã¯ããããããŸãåŠçããŸãã
- CRDTã¯ããèªäœãè€éã§ãããæšè«ããã®ãå°é£ã§ãã
- ããªãã¯ãããããã§ã«äžå åããããµãŒããŒ/ããŒã¿ããŒã¹ãæã£ãŠããŸãã
ç§ã¯ãã¹ãŠã®æ¹å€ã«å¯ŸããŠCRDTãç¡èŠããŸããããããããããšã§é¢é£ããæç®ãç¡èŠããé©ããããšã«ãCRDTã®éãã§ç¥èŠã§ããªãæ¹åãèŠéããŸãããããŒãã£ã³ã¯åœŒã®ãã¬ãŒã³ããŒã·ã§ã³ïŒæ³šç®ã«å€ãã以äžã®ãã®ïŒã§äž»ãªãã€ã³ããåãäžããŠããŸãã
- : CRDT (Automerge / RGA Y.js / YATA) [log(n)] . ( .)
- : - , 54- . automerge , Y.js, Y.js 100 160 3 . .
- : , .
- : , CRDT OT. , automerge .
é床ã®çç±ã¯ç§ãçŽåŸãããªãã£ãã®ã§ãã¢ã€ãã¢ããã¹ãããããã«ãèªåããŒãžããã®ã¢ã€ãã¢ã䜿çšããŠãBããªãŒãä»ããŠRustã§CRDTãç¬èªã«å®è£ ããŠãã¹ãããŸãããæ©èœïŒæåã®åé€ã競åïŒã¯ãããŸããã§ãããã1ç§ããã600äžåã®ç·šéãåŠçã§ããŸããã ïŒåå埩ã§ã2人ã®äº€äºã®ãŠãŒã¶ãŒã空çœã®ããã¥ã¡ã³ãã2000åç·šéããåèšã§330ãã€ã¯ãç§ãã€ãŸã1ç§ããã606äžåã®ç·šéãè¡ãããŸãããïŒãããã£ãŠãCRDTã¯å€§å¹ ã«æ¹åãããããããšOTã®é床差ã¯RustãšOTã®é床差ãããããã«å°ãããªããŸããã Javascriptã
ãããã®ä¿®æ£ã¯ãã¹ãŠãèªåããŒãžããã©ãŒãã³ã¹ãã©ã³ãã®ãè¿æ¥å ¬éãã»ã¯ã·ã§ã³ã«é·ãéå«ãŸããŠããŸãããçµå±ã®ãšãããèªåããŒãžã ããCRDTã§ã¯ãããŸãããY.jsã¯ããèªäœã䟡å€ãããããšã蚌æãããã¹ãã§çŸåšã®ããŒãžã§ã³ã®èªåããŒãžãç°¡åã«ãã€ãã¹ããŸããç§ãèå³ãæã£ãŠããæ©èœãæ¬ ããŠããŸãããäžè¬çã«ãæ°ããã¢ã«ãŽãªãºã ãäœæããããããæ¢åã®å®è£ ãä¿®æ£ããæ¹ã確ãã«ç°¡åã§ãã
æªæ¥ãçºæãã
ç§ã¯é²æ©ããããšãéåžžã«å¿é ããŠããŸããçŸå¹Žã䜿ããªãã®ã¯äœãããããã®ã§ããããããã¡ããããªã¢ã«ã¿ã€ã ã§ç·šéããäºå®ã§ãããOTãä»ããå®è£ ãšããã®ç¹ã«é¢ããŠç§ãè¡ã£ããã¹ãŠã®äœæ¥ã«ã€ããŠã¯ããã確信ãæãŠããæ²ãããããããŸããã
æè¿ãJSONãšRESTã¯ã©ãã«ã§ããããŸãã 15幎åŸã«ã¯ããªã¢ã«ã¿ã€ã ã®å ±åç·šéãã©ãã«ã§ããããšããŸãããããããžã§ã¯ãã«ç°¡åã«è»¢éããããã®å ±åç·šéã«é¢ããŠãJSONã«çžåœãããã®ã¯äœã§ããïŒãã®èŒãããæªæ¥ã«ã¯ãCRDTã®é«å質ãªå®è£ ãå¿ èŠã«ãªããŸããããã¯ãäžéšã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯OTãæ©èœããããããä»ããŠGItã®ãªã¢ã«ã¿ã€ã ããŒãžã§ã³ãäœæããããGoogleWaveã®åçŽãªããªãšãŒã·ã§ã³ãæ©èœããªããªã£ããããããã§ãããããããã§ã«åªããCRDTå®è£ ãããå ŽåãOTå®è£ ãå¿ èŠã§ããïŒ OTããCRDTãžã®ãã¹ãŠã®æ©èœã®è»¢éïŒã¡ãªã¿ã«ãããªãã³ã°æäœãå«ãïŒã¯é£ãããããŸãããããã®éã¯åœãŠã¯ãŸããªããããç§ã¯ããã§ã¯ãªããšæããŸããè³¢ã人ã¯ç§ã«åæããŸããããç§ã®æèŠã§ã¯ãèšèªããšã«åªããé«éã®CRDTãããããšãèãããšãOTã®å¿ èŠæ§ã¯å®å šã«ãªããªããŸãã
OTã®å©ç¹ã®1ã€ã¯ãã»ãšãã©ã®ææ°ã®ã¢ããªã±ãŒã·ã§ã³ãšåæ§ã«ãéäžåã·ã¹ãã ã«ç°¡åã«å®è£ ã§ããããšã§ãããåæ£åã¢ã«ãŽãªãºã ãåæ§ã«å®è£ ãããŸããïŒããšãã°ãGithubãèŠãŠãã ãããïŒç§ã®æèŠã§ã¯ãwasmã§ã®é«å質ã®CRDTã¯ãJSã§ã®OTå®è£ ãããé«éã§ãããŸããéäžåã·ã¹ãã ã®ã¿ã«é¢å¿ãããå Žåã¯ã次ã®ç¹ã«æ³šæããŠãã ãããOTã®å¶éã«ãããGoogleã¯GoogleDocsã®ã¹ã±ãŒãªã³ã°ã®åé¡ãåŒãèµ·ãããŸããã
ã§ããããä»ãå°ãããŠéãCRDTã«åãæ¿ããæã§ããããã«ç§ã«ã¯æããŸããã»ãšãã©ã®å ŽåãåŠè¡çãªäœæ¥ã¯ãã§ã«è¡ãããŠãããå®è£ ãæåãããããã®åé¡ãæ®ã£ãŠããŸãã
次ã¯äœã§ãã
ç§ã¯éäžåã¢ããªã±ãŒã·ã§ã³ã®äžçã«ãŸããŸãé¢å¿ãæã£ãŠããŸãããã¢ããªã±ãŒã·ã§ã³ã¯ç§ã®ããã€ã¹äžã§ç§ã®ããŒã¿ãšçžäºäœçšãããããã®ã¢ããªã±ãŒã·ã§ã³ãããã«å¿ããŠãã®ãããªæ¥ç¶ã«åå¿ããæãæ¥ãŸããã©ããããããšé»è©±ããããŒã¿ãå¥ã®åœã®ãµãŒããŒã«ã¢ããããŒãããã®ã§ã¯ãªããwifiãä»ããŠçžäºã«ããŒã¿ã転éã§ããããã«ããããšèããŠããŸããç¹ã«ããããã®ãµãŒããŒãç§ã®æ³šæã競ãåºåã®å·šäººã«ãã£ãŠè³éæäŸãããŠããå Žåã
å²åŠçã«ã¯ãGoogle Docsã§ããã¥ã¡ã³ããç·šéãããšãã³ã³ãã¥ãŒã¿ãŒãGoogleã«ãã¡ã€ã«ã®ç·šéèš±å¯ãæ±ããŸãïŒäœããã®çç±ã§ãµãŒããŒãããããããšèšã£ãå Žåããã¹ãŠã®ç·šéå 容ã倱ãããããïŒãæ¯èŒã®ããã«
git push
ãgithubã«ãããšãã¯ãéç¥ããã ãã§ãç§ã®ã³ãŒãã®ç·šéã«ã€ããŠã®githubãç§ã®ãªããžããªã¯ãããã眮ãããŠãããã¹ãŠã®ããŒã¿ãšããŒããŠã§ã¢ãšåæ§ã«ããŸã ç§ã®ãã®ã§ããããããç§ã®ã¢ããªã±ãŒã·ã§ã³ã®åäœæ¹æ³ã§ããããŒãã£ã³ã®ãããªäººã
ã®ãããã§ãç§ãã¡ã¯ä»ãè¯ãCRDTãäœãæ¹æ³ãç¥ã£ãŠããŸãããã ããããŒã«ã«ãã¡ãŒã¹ãã®ã¢ããªã±ãŒã·ã§ã³ãããŒã¹ãšããŠåãå
¥ããããåã«ãããå€ãã®ã³ãŒãè¡ãèšè¿°ããå¿
èŠããããŸãã
å šäœãšããŠãéçšã®å€é©ã«å¥ããåããæãæ¥ãŸãããç§ãæžãããã¹ãŠã®äžã§ãç§ãã¡ã¯äžç·ã«çŽ æŽãããæéãéãããŸãããéçšå€æã³ãŒã ã¯ãæãå°é£ã§èå³æ·±ããã®ã®1ã€ã§ãããããªãã¯è³¢ããŠçŽ æŽãããã§ããOTããããCRDTã¯ããªãã決ããŠã§ããªãããšãããããšãã§ããŸãããããŠãCRDTãå¿ èŠã§ããããã€ãã®è¯ãå®è£ ã§ãæ¬åœã«ç¹å¥ãªããšãéæã§ãããšæããŸãã
ç§ã¯äœå¹Žã«ãããã£ãŠOTã«è²»ããããã¹ãŠã®äœæ¥ãæŒã¿ãŸãããOTã¯ãã¯ãç§ã®å°æ¥ã®ããžã§ã³ã«é©åããŸãããCRDTã䜿çšãããšãWaveãããç°¡åãã€è¿ éã«åæ§ç¯ãããŠãŒã¶ãŒãããžã¿ã«èŸ²æ°ã§ã¯ãªãããžã¿ã«åžæ°ã®ããã«æ±ãã¢ããªãäœæã§ããŸãããããŠãããã¯éèŠã§ãã
äœæããæãæ¥ãŸããã