2 00:00:05,634 --> 00:00:09,200 Ванг: Привет. Я Дэвид. Я из команды Google Wave. 3 00:00:09,200 --> 00:00:11,234 Я работаю над одновременным совместным редактированием, 4 00:00:11,234 --> 00:00:13,434 которое вы, вероятно, видели в последнем демо. 5 00:00:13,434 --> 00:00:16,133 Как же мы этого добились? 6 00:00:16,133 --> 00:00:17,667 А добились мы этого, 7 00:00:17,667 --> 00:00:20,801 используя технологию, называемую операционное преобразование. 8 00:00:20,801 --> 00:00:24,167 Это весьма активная область научных исследований 9 00:00:24,167 --> 00:00:26,734 в течении последних десяти лет. 10 00:00:26,734 --> 00:00:29,534 И мы взяли этот алгоритм 11 00:00:29,534 --> 00:00:33,667 и расширили его, чтобы предоставить вам одновременное совместное редактирование, 12 00:00:33,667 --> 00:00:35,467 к которому вы уже так привыкли. 13 00:00:35,467 --> 00:00:36,934 Как это всё работает? 14 00:00:36,934 --> 00:00:38,901 Давайте я покажу на примере. 15 00:00:38,901 --> 00:00:42,467 Представьте, что у нас есть клиент... 16 00:00:42,467 --> 00:00:46,234 и сервер... 17 00:00:46,234 --> 00:00:49,567 и они стартуют в одинаковом состоянии - 18 00:00:49,567 --> 00:00:51,934 A,B,C, и D 19 00:00:54,567 --> 00:00:57,968 Теперь представьте, что клиент хочет вставить букву 20 00:00:57,968 --> 00:01:00,467 между C и D. 21 00:01:00,467 --> 00:01:05,434 И вот он вставляет, скажем, X между символами C и D. 22 00:01:05,434 --> 00:01:08,534 А сервер вообще-то хотел удалить символ B. 23 00:01:08,534 --> 00:01:12,267 И теперь он пришёл к состоянию A, C и D. 24 00:01:12,267 --> 00:01:14,534 Теперь, всё это происходит одновременно. 25 00:01:14,534 --> 00:01:16,634 И как же они сообщают о том, 26 00:01:16,634 --> 00:01:19,901 что сделали всё это с обеих сторон? 27 00:01:19,901 --> 00:01:22,300 Они пересылают действие, 28 00:01:22,300 --> 00:01:24,434 которое мы называем операцией, по каналу. 29 00:01:24,434 --> 00:01:32,467 Так, клиент посылает вставку X в позиции 0,1,2 и 3. 30 00:01:32,467 --> 00:01:35,601 А сервер посылает операцию 31 00:01:35,601 --> 00:01:41,200 удаления символа B в позици 0 и 1. 32 00:01:41,200 --> 00:01:45,367 Теперь, когда другая сторона получает сообщение, 33 00:01:45,367 --> 00:01:48,400 они могли бы слепо это выполнить, если бы захотели. 34 00:01:48,400 --> 00:01:49,834 Но что же произойдёт 35 00:01:49,834 --> 00:01:51,934 если слепо выполнить операцию? 36 00:01:51,934 --> 00:01:55,934 Так, если бы сервер выполнил операцию клиента, 37 00:01:55,934 --> 00:01:58,234 вставил "X" вслепую, 38 00:01:58,234 --> 00:02:00,801 получилось бы состояние A,C,D и X. 39 00:02:00,801 --> 00:02:03,801 но это совершенно не то, что хотел клиент. 40 00:02:03,801 --> 00:02:05,300 То, что нам нужно сделать, 41 00:02:05,300 --> 00:02:08,501 это пройти процесс, называемый преобразованием. 42 00:02:08,501 --> 00:02:10,033 Происходит то, что сервер 43 00:02:10,033 --> 00:02:12,200 берёт операцию клиента 44 00:02:12,200 --> 00:02:15,567 и преобразовывает её вместе со своей операцией. 45 00:02:15,567 --> 00:02:17,801 в результате получается новая операция, 46 00:02:17,801 --> 00:02:21,400 которая вставляет символ X уже в позицию 2. 47 00:02:21,400 --> 00:02:23,534 потому что он вычел позицию 48 00:02:23,534 --> 00:02:25,501 удалённого у себя символа. 49 00:02:25,501 --> 00:02:27,667 Теперь сервер применяет эту операцию, 50 00:02:27,667 --> 00:02:32,400 и получается состояние A,C,X, и D. 51 00:02:32,400 --> 00:02:34,133 Клиент, со своей стороны, 52 00:02:34,133 --> 00:02:36,467 делает точно такие же преобразования. 53 00:02:36,467 --> 00:02:38,601 Однако, в этом случае, получается 54 00:02:38,601 --> 00:02:43,334 что операция преобразовалась в точно такую же операцию. 55 00:02:43,334 --> 00:02:46,567 Клиент оказывается с удалённой B, 56 00:02:46,567 --> 00:02:48,667 c A,C,X и D. 57 00:02:48,667 --> 00:02:50,300 Как видно, 58 00:02:50,300 --> 00:02:52,968 теперь и клиент и сервер 59 00:02:52,968 --> 00:02:55,334 оказываются в одном и том же состоянии, 60 00:02:55,334 --> 00:02:58,300 несмотря на то, что они выполняли операции одновременно 61 00:02:58,300 --> 00:03:00,934 и в разных местах. 62 00:03:00,934 --> 00:03:03,767 Так почему это оживление так важно? 63 00:03:03,767 --> 00:03:05,567 Давайте возьмём аналогию, допустим... 64 00:03:05,567 --> 00:03:08,734 Представьте, вы с другом пошли в кафе, 65 00:03:08,734 --> 00:03:11,467 и разговаривали друг с другом. 66 00:03:11,467 --> 00:03:14,601 И тут вы закрываете уши и говорите - 67 00:03:14,601 --> 00:03:17,501 "Подожди, сперва закончи своё предложение 68 00:03:17,501 --> 00:03:20,334 а потом говори мне его" 69 00:03:20,334 --> 00:03:22,734 И это именно то, что у нас сейчас есть 70 00:03:22,734 --> 00:03:24,234 в мгновенных сообщениях, 71 00:03:24,234 --> 00:03:26,501 где кто-нибудь набирает сообщение, 72 00:03:26,501 --> 00:03:28,000 а вы ждёте пока он закончит. 73 00:03:28,000 --> 00:03:29,367 Вы ждёте, и ждёте, и ждёте. 74 00:03:29,367 --> 00:03:30,868 Но в действительности вы же не ждёте в кафе 75 00:03:30,868 --> 00:03:32,467 пока ваш друг закончит говорить, 76 00:03:32,467 --> 00:03:33,834 до того, как начнёте слушать его, не так ли? 77 00:03:33,834 --> 00:03:37,033 Это бы серьёзно нарушило течение диалога. 78 00:03:37,033 --> 00:03:40,934 Делая вещи живыми и одновременными, 79 00:03:40,934 --> 00:03:42,767 вы получаете очень оживлённый диалог, 80 00:03:42,767 --> 00:03:45,400 будто вы на самом деле говорите с человеком, 81 00:03:45,400 --> 00:03:47,934 и вы можете разговаривать очень быстро. 82 00:03:47,934 --> 00:03:51,501 Одна из важных вещей, которые мы сделали в Google Wave, 83 00:03:51,501 --> 00:03:55,501 это выбор архитектуры клиент/сервер. 84 00:03:55,501 --> 00:03:59,567 Это очень интересная научная область - 85 00:03:59,567 --> 00:04:04,968 использование полностью клиентской системы, без всяких серверов. 86 00:04:04,968 --> 00:04:08,300 Тем не менее, мы намеренно выбрали архитектуру клиент/сервер, 87 00:04:08,300 --> 00:04:11,501 потому что она позволяет обслуживать огромное количество клиентов, 88 00:04:11,501 --> 00:04:14,400 без усложнения системы. 89 00:04:14,400 --> 00:04:17,400 Представьте, например, 90 00:04:17,400 --> 00:04:20,300 у нас есть клиент, клиент 1, 91 00:04:20,300 --> 00:04:22,501 соединяется с сервером, 92 00:04:22,501 --> 00:04:27,167 и другой клиент соединяется с сервером. 93 00:04:27,167 --> 00:04:32,467 И теперь они взаимодействуют с сервером... 94 00:04:32,467 --> 00:04:35,033 связываясь с ним, и используя сервер 95 00:04:35,033 --> 00:04:36,701 как точку ретрансляции. 96 00:04:36,701 --> 00:04:38,634 Что вы c этого имеете? 97 00:04:38,634 --> 00:04:41,200 А получаете вы, во-первых, 98 00:04:41,200 --> 00:04:45,300 одну систему, которая содержит источник истины. 99 00:04:45,300 --> 00:04:48,868 И даже если все клиенты рухнут, или уйдут в оффлайн на долгое время, 100 00:04:48,868 --> 00:04:52,367 есть одно место, откуда вы можете забрать документ. 101 00:04:52,367 --> 00:04:54,601 Другой важный момент в том, 102 00:04:54,601 --> 00:04:57,934 что, слегка изменив операционные преобразования, 103 00:04:57,934 --> 00:05:02,167 вы получаете очень эффективный единый источник истины. 104 00:05:02,167 --> 00:05:03,400 которым является сервер. 105 00:05:03,400 --> 00:05:05,467 Модификации, которые мы сделали - 106 00:05:05,467 --> 00:05:08,133 это изменение операционного преобразования 107 00:05:08,133 --> 00:05:10,701 так, что клиент должен... 108 00:05:10,701 --> 00:05:12,300 ожидать от сервера... 109 00:05:12,300 --> 00:05:15,467 подтверждения получения операции, которую послал клиент. 110 00:05:15,467 --> 00:05:19,000 Это значит, что клиент всегда остаётся 111 00:05:19,000 --> 00:05:22,367 на пути операционных преобразований сервера. 112 00:05:22,367 --> 00:05:24,701 Это позволяет серверу 113 00:05:24,701 --> 00:05:27,534 хранить единую историю операций 114 00:05:27,534 --> 00:05:31,234 без необходимости хранить отображения состояний клиентов 115 00:05:31,234 --> 00:05:33,801 для каждого подключённого клиента. 116 00:05:33,801 --> 00:05:35,434 Это означает, 117 00:05:35,434 --> 00:05:39,100 что сколько бы ни было клиентов, подключённых к серверу, 118 00:05:39,100 --> 00:05:42,100 существует только одна копия документа на сервере. 119 00:05:42,100 --> 00:05:43,734 Но что более важно - 120 00:05:43,734 --> 00:05:46,868 поскольку есть один поток операций, 121 00:05:46,868 --> 00:05:49,100 происходящих на сервере, 122 00:05:49,100 --> 00:05:50,434 в этом случае, 123 00:05:50,434 --> 00:05:52,267 вот тут происходит несколько операций, 124 00:05:52,267 --> 00:05:55,234 и вот тут происходит несколько операций, 125 00:05:55,234 --> 00:05:57,701 и теперь возможно делать единое воспроизведение. 126 00:05:57,701 --> 00:05:59,133 Это значит, что 127 00:05:59,133 --> 00:06:02,667 можно просматривать как всё действительно происходило. 128 00:06:02,667 --> 00:06:05,567 Вы вероятно видели, в демо Ларса, 129 00:06:05,567 --> 00:06:08,200 там, где он мог посмотреть в прошлое 130 00:06:08,200 --> 00:06:11,501 и видеть - что редактировал кто-то другой. 131 00:06:11,501 --> 00:06:13,200 Как он это делал? 132 00:06:13,200 --> 00:06:15,834 Это делается просто, обращаясь к серверу, 133 00:06:15,834 --> 00:06:17,467 и запрашивая у сервера - 134 00:06:17,467 --> 00:06:21,167 "пожалуйста, дай мне все выполненные тобой операции, 135 00:06:21,167 --> 00:06:25,934 достаточными для восприятия порциями, чтобы я понял смысл." 136 00:06:25,934 --> 00:06:27,133 И в этом случае, к примеру, 137 00:06:27,133 --> 00:06:29,834 операция клиента может быть отмотана назад 138 00:06:29,834 --> 00:06:31,334 за один шаг. 139 00:06:31,334 --> 00:06:33,567 И операция другого клиента может быть отмотана назад 140 00:06:33,567 --> 00:06:34,901 ещё за один шаг. 141 00:06:34,901 --> 00:06:38,234 Я думаю, это очень классная часть технологии. 142 00:06:38,234 --> 00:06:42,434 Она делает возможным очень живое и одновременное общение, 143 00:06:42,434 --> 00:06:44,834 просто как будто люди сидят в одной комнате, 144 00:06:44,834 --> 00:06:47,601 и оживлённо общаются. 145 00:06:47,601 --> 00:06:51,100 Я надеюсь эта технология будет полезна и вам.