Совместное редактирование документов

Инструменты совместной работы – это набор различных функций, которые используются во время проведения сеансов видеоконференцсвязи для упрощения взаимодействия между собеседниками. К инструментам совместной работы можно отнести следующие возможности.

Показ презентаций (Slideshow)

Данная функция позволяет участникам сеанса видеоконференцсвязи осуществлять демонстрацию слайдовых презентаций, фотографий, диаграмм, рисунков и различных таблиц. Во время сеанса персональной или групповой видеоконференции ведущий может подкреплять свое выступление графическими или текстовыми данными. Особенно актуальна данная функция для ведущих обучающих семинаров или ознакомительных курсов.

Обмен мгновенными сообщениями (Chat)

Во время сеанса видеоконференции зачастую очень удобно пользоваться текстовым чатом для передачи различной текстовой и гипертекстовой информации, обсуждения хода выступления докладчика, выражения своих эмоций с помощью смайлов.

Показ удалённого рабочего стола (Screen Sharing)

Этот инструмент совместной работы невероятно универсален, потому как позволяет участникам не только демонстрировать друг другу свой рабочий стол или отдельные его элементы, но и управлять им в режиме реального времени. При помощи демонстрации и управления рабочим столом любой из участников видеоконференции может продемонстрировать всем остальным то, над чем он работает в данный момент. Это очень удобно, ведь таким образом собеседники могут помогать друг другу в устранении возникших неполадок в компьютере, совместно решать какие-либо задачи и разрабатывать новые проекты.

Запись сеанса видеоконференции (Recording)

Не являясь инструментом для совместной работы, запись видеоконференции, тем не менее, очень удобна для совместной работы с материалами видеоконференции после её окончания. Например, ведущий может выложить запись в интернете для широкой публики, а её участники всегда могут повторно просмотреть материал для лучшего усвоения информации.

Передача файлов (File Transfer)

Ни одна видеоконференция не проходит без обмена данными. Передают многое: аудио- и видеофайлы, электронную документацию, всевозможные чертежи и даже фотографии. Функция передачи данных избавляет от использования сторонних файлообменных программ, которые зачастую платные, требуют длительной установки и не всегда надёжны. С помощью функции передачи данных участники могут оставаться на своих местах, и не беспокоится о том, что какой-нибудь документ «затеряется в пути».

Добрый день. Последний год я занимаюсь в проекте «МойОфис» вопросами совместного редактирования (collaboration). Оглядываясь назад, могу констатировать, что это непростая и очень интересная задача. Поэтому я хотел бы подробно рассказать о ней и дать ответы на следующие вопросы:

  1. Какие существуют подходы к обеспечению совместного редактирования?
  2. Насколько они сложны в реализации?
  3. Можно ли взять готовую библиотеку и использовать ее в своем проекте?
  4. Можно ли вести разработку без оглядки на совместное редактирование?


Для того чтобы подробно и аргументированно ответить на них, необходимо написать довольно много материала, поэтому статей будет несколько, присаживайтесь поудобнее, мы начинаем.
Как только мы начинаем хранить файлы на сервере (в облаке), возникает естественное желание обеспечить их редактирование несколькими людьми. Особенно это актуально для офисных документов, над которыми работают сразу несколько человек и каждый из них вносит правки.
Но «нельзя просто так взять и…» предоставить всем доступ для правки одного документа. Необходим механизм, который обеспечит удобное и корректное изменение одного файла несколькими пользователями. Давайте рассмотрим варианты, как это можно сделать.

Возможные подходы

Блокировка всего документа при редактировании

Это самый тривиальный метод. Преимуществами такого решения являются простота реализации и возможность работы со всеми типами данных. На этом преимущества заканчиваются и начинаются сплошные неудобства для пользователя:

  • В один момент времени только один пользователь может вносить правки. Чем больше будет такой документ и чем чаще его будут редактировать, тем более явным становится это неудобство. Представьте себе ТЗ на сотню с лишним страниц, при этом один пользователь вынужден ждать, пока его коллега закончит править раздел в другой части документа.
  • Каждое изменение в документе приводит к необходимости полностью передать его на сервер, а затем скачать всем участникам, что сильно ухудшает скорость работы и увеличивает объем пересылаемых данных.
  • Данное решение не может обеспечить офлайн-работу, ведь чтобы приступить к редактированию документа, требуется заблокировать его на сервере от изменения другими пользователями. А без соединения с сервером сделать это нельзя.
  • Неснятая блокировка. Представим, что один пользователь забыл снять блокировку, да еще и ушел домой или вовсе уехал в отпуск. Всем остальным приходится ждать или искать нерадивого пользователя. Частично от этого можно уйти, контролируя время активности или предоставив администратору возможность принудительно снять блокировку. Впрочем, ни то ни другое не является идеальным решением, так как в первом случае нельзя понять, на основе чего можно отличить пропавший интернет от недисциплинированности пользователя, а во втором нельзя обойтись без вмешательства человека и чьи-то изменения могут быть потеряны.

Такой вариант можно часто встретить в решениях для корпоративных порталов, ERP, СЭД.

Блокировка части документа

Для текстового документа такой единицей деления может стать абзац или таблица. Это улучшает весь процесс работы, а именно:

  • Теперь можно одновременно редактировать один документ, при условии, что правки вносятся в разные его части.
  • Заблокировать документ полностью нельзя. Несмотря на неснятую блокировку, с остальным документом можно продолжать работать.

Но и этот подход нельзя назвать идеальным:

  • По-прежнему нельзя обеспечить офлайн-работу. Для блокировки любой из частей документа необходимо связаться с сервером.
  • Часть документа, заблокированная при редактировании, может быть значительной. Действительно, абзац может быть довольно большим и содержать несколько сотен или тысяч знаков текста. Еще больше сложностей возникает при работе с таблицами. Без дополнительных ухищрений нельзя одновременно разрешить менять содержимое ячеек и структуру таблицы — вставлять и удалять строки или столбцы. Это означает, что при любом изменении одной из ячеек требуется блокировать всю таблицу. В офисных документах таблицы могут быть разного уровня вложенности или же очень большого размера. Особенно неприятным этот момент становится при работе с табличными документами, где рабочий лист и вовсе состоит из одной таблицы, а значит при любых изменениях надо его блокировать полностью.
  • С точки зрения структуры, документ можно упрощенно представить как последовательность абзацев и таблиц. И когда мы вставляем или удаляем таблицы и абзацы, то мы редактируем эту последовательность. А это значит, что корректность совместного редактирования такой последовательности также необходимо обеспечить (кстати, принципиальной разницы между редактированием списка абзацев или списка букв нет, разве что первое происходит реже). Без введения принципиально другого метода синхронизации это должна быть опять же блокировка, только на этот раз объект блокировки будет один на весь документ.

Некоторые читатели могут заметить, что задача совместного редактирования успешно решается в системах контроля версий, с последовательной историей (SVN или CVS) или с возможностью ветвлений (GIT, Mercurial). Да, вы правы, но и здесь есть свои нюансы, которые делают невозможным применить в нашем случае тот же принцип:

  • Merge. Во-первых, для пользователей офисных пакетов это понятие как правило незнакомо. Во-вторых, объединение разных версий документа становится принципиально более трудным при переходе от простого текста к документу со сложной (как правило иерархической) структурой, где есть текст, вложенные таблицы, изображения и различные настройки форматирования. Просто представьте себе подобный 3-way merge.
  • Даже при использовании kdiff3 или winmerge случаются ошибки, а ведь они работают с простым текстом.
  • Обычному пользователю офисных приложений будет непросто вникнуть в мир ветвлений и слияний. А вникнув, использовать будет не очень быстро и удобно.

Взгляд с другой стороны

Будем исходить из того, что с точки зрения пользователя вся работа с документом должна сводиться лишь к тому, чтобы исправить текст, вставить график, обещанный коллегам, и на этом закончить. Так же, как он это делал раньше с локальными документами. Все сложные процессы по поддержке корректного состояния документа должны быть скрыты от пользователя. При этом важно сохранить отзывчивость и функциональность, сравнимую с редактированием локальных файлов.
Для нас это диктует дополнительные требования:
1. Использование оптимистичной стратегии внесения изменений. К локальной копии документа правки должны применяться сразу. И независимо от этого они отправляются на сервер, а от него к другим клиентам, при этом то, как быстро они будут получены и применены, никак не влияет на скорость работы с локальной версией.
Отсюда следует, что состояния документа у клиентов и на сервере могут отличаться. Это формирует следующее требование:
2. Сходимость (convergence). Когда все пользователи закончат свою работу и все уведомления о правках будут доставлены, как на сервере, так и у клиентов должно быть одно и то же состояние документа.
Но это еще не все. Первые два требования можно выполнить с помощью простого, но явно не устраивающего пользователей алгоритма. Если на сервер приходят два конкурирующих изменения, то можно просто игнорировать то, что пришло позже, уведомив соответствующим образом клиентов. Этого будет достаточно, чтобы удовлетворить первые два требования, но явно недостаточно, чтобы сделать счастливым того, чьи изменения были выкинуты. А это значит, что нужно задекларировать еще одно требование:
3. Принцип сохранения намерений (intention preservation). Мы должны обеспечить максимальное сохранение намерений всех пользователей, даже если правки вносятся одновременно и они конкурируют друг с другом.
Мы декларируем, что каждая правка от каждого из пользователей важна для нас и мы не будем отменять ее без необходимости. Необходимость отменить все же может возникнуть. Например, в таких ситуациях, когда один пользователь отредактировал абзац, который параллельно был удален кем-то другим. В этом случае изменения уже просто нельзя применить, так как абзац более не существует.
Второй момент, который стоит упомянуть в контексте этого принципа, — формализация. Понятие «намерение» достаточно абстрактно. Представим, что в тексте есть слово «оптека», которое параллельно исправляют два пользователя, причем по-разному: «аптека» и «оптика». Большинство известных алгоритмов (и наш тоже) работают на уровне букв, и в результате получится «аптика», что не соответствует «высокоуровневым» намерениям обоих авторов. Существуют формализации намерений пользователей на уровне слабых порядков букв («хочу вставить букву «и” после буквы «т”, но перед «к”»). Для некоторых алгоритмов сохранение выраженных таким образом намерений является неотъемлемой их частью (об этом можно почитать ).
В нашем случае мы не формализуем намерения пользователей и тем более не даем строгих гарантий их соблюдения, но декларируем, что будем максимально придерживаться этого принципа.

Выбор неблокирующего алгоритма

Существуют два алгоритма, которые удовлетворяют всем нашим требованиям: оптимистичное внесение изменений, сходимость и сохранение намерений.

Первый. Differential synchronization. Который в итоге нам не подошел

Алгоритм предполагает постоянный 3-way merge на стороне клиента и сервера, который сопровождается пересылкой патчей в обе стороны. На схеме представлена общая идея.

Более подробное описание можно увидеть на сайте автора.

Вероятно, вы уже догадались, по какой причине этот алгоритм нам не подходит. Правильно, как уже упоминалось, 3-way merge для документа со сложной структурой нетривиален. При этом необходимо иметь формальную гарантию того, что он даст одинаковые результаты при слияниях в разных порядках и направлениях… Это ставит крест на перспективе применения у нас данного подхода.

Второй. Operation Transformation (OT)

Это скорее общий подход, на основе которого разработаны различные алгоритмы.
В основе OT лежит довольно простая идея. Все изменения данных мы описываем как операции, которые пересылаем и преобразуем относительно других без самого документа. Когда операция приходит от одного пользователя к другому, мы ее трансформируем таким образом, чтобы она стала валидной относительно разницы между документами этих двух пользователей, выраженной в операциях. Звучит заумно, но на самом деле принцип довольно простой.

Что такое Operation Transformation

Давайте посмотрим на еще одну схему, которая популярна в статьях об OT.

Операция О2:

  • Пользователю 1 приходит операция О2 del от пользователя 2.
  • Операция О2 трансформируется относительно операции О1, которой не было у пользователя 2 на момент создания О2.
  • В результате получается del, так как перед позицией 2 уже успели вставить один символ и у «с” позиция стала 3.

Операция О1:

  • Пользователю 2 от пользователя 1 приходит операция О1 ins.
  • O1 трансформируется относительно О2, но на этот раз при трансформации операция не меняется и применяется в таком же виде, как и у автора операции — пользователя 1.

Здесь используется трансформация включения (в некоторых алгоритмах используется и трансформация исключения). В дальнейшем я буду использовать обозначение Inc(O1, O2) для операции О1 с учетом эффектов операции О2, то есть, если кратко, мы включили О2 в О1.
Основное требование, которому должны удовлетворять трансформации включения (известное как Transition Property 1), — это:
Inc(O2, O1) * O1 = Inc(O1, O2) * O2,
где * — последовательное применение, справа налево. Для простоты понимания посмотрите на изображение:

Приведенное выше равенство в применении к этой картинке означает, что, начав с одного состояния документа и двигаясь по правой или левой ветке, мы получим одно и то же итоговое состояние. Принципиальным моментом является то, что начинать «движение» мы должны из одного и того же состояния. Если это условие не соблюдать, то результатом будет рассогласованное состояние документов либо трансформированная операция может просто не иметь смысла. Например, вставка символа в неверную или несуществующую позицию документа.
Как я указал выше, существует несколько различных алгоритмов на основе ОТ. Их главным отличием является решение ключевого вопроса: как производить трансформации таким образом, чтобы любые операции, участвующие в трансформации, были над одним и тем же состоянием документа, и, если такой возможности нет, то с помощью каких еще преобразований можно изменить порядок применения операций.
Дело в том, что первые алгоритмы на основе ОТ не предусматривали использования центрального сервера. Все клиенты связывались между собой peer-to-peer. Соответственно, текущее состояние документа у пользователей выражалось последовательностью операций (О1, О2… ОN), при этом в каждый момент времени количество, состав и порядок этих операций у каждого клиента может быть свой. В этом случае нельзя определить единый строгий порядок среди всех генерируемых операций, можно ввести только слабый порядок по happens before критерию. Операции, между которыми нет такого отношения, считаются конкурирующими или параллельными (concurrent).
Подобный подход также несет с собой определенные сложности:

  • Производительность. Количество трансформаций может быть очень большим, клиентам приходится хранить всю историю, так как в любой момент может прийти сколь угодно «древняя» операция от другого пользователя.
  • Для корректной реализации требования TP-1 уже недостаточно. Приходится требовать еще и как минимум TP-2: Inc(O3, Inc(O1, O2) * O2) = Inc(O3, Inc(O2, O1) * O1). В зависимости от конкретного алгоритма может понадобиться выполнение других требований к трансформациям и обратным операциям (полный список ). Если у вас есть набор операций, то эти требования должны быть выполнены для любой пары или тройки, а это далеко не всегда так. При этом, чтобы иметь уверенность в сходимости алгоритма, эти требования необходимо формально верифицировать, то есть доказать, как теорему.
  • Сложность. Подобные алгоритмы действительно непростые, и порой в них находят ошибки. Например, один из случаев, потенциально приводящий к ошибке, выглядит вот так:


Интересующиеся классическими peer-to-peer алгоритмами могут найти подробный их обзор и сравнение .
Перечисленные выше трудности можно разрешить, если отказаться от равноправности всех клиентов и peer-to-peer соединений. При добавлении центрального сервера состояние документов можно описывать простой ревизией и требовать выполнения не более чем TP-1… Но этой теме будет посвящена уже следующая статья. Обещаю, что для любителей алгоритмов там будет больше интересного.

«Корпорация Зла» (joke) осваивает нишу совместной работы с документами уже второе десятилетие. Начиналось всё с ранних версий SharePoint, при упоминании которых котики поопытнее сразу начинают плакать – уж больно специфичен с точки зрения и настроек, и возможностей был в те далекие годы MS SP. Ладно, не будем больше травмировать друг друга воспоминаниями о том неуклюжем монстре…

Но упорства у Microsoft не занимать – работа по улучшению ситуации велась все это время, причем сразу на нескольких фронтах. В результате сейчас можно говорить о сложившейся инфраструктуре совместной работы с документами, которую предлагает Microsoft. В ней выделяются два класса софта:

  1. Средства коллективного доступа к документам, включающие в себя каталогизацию, управление версиями, раздачу прав и тому подобные серверные фичи. Эти средства, в свою очередь, подразделяются на облачные (OneDrive, SharePoint Online) и on-premise, то есть разворачиваемые в инфраструктуре самого заказчика — сервер SharePoint 2016.
  2. Средства редактирования документов. К ним относятся: десктопное семейство Microsoft Office (тоже сильно переработанное за последнее время), свежесочиненные мобильные версии Office, изначально ориентированные на совместную работу с документами, и, вишенкой на торте – собственная реализация сервера онлайн-редактирования документов Office Online apps (несколько ранее известного под именем Office Web Apps).

Все это великолепие, наверное, не делает Microsoft «убийцей Google Docs» (убийцами нашего мозга в данном случае, скорее, выступают журналисты, придумывающие подобные заголовки для новостей), но дает неплохую альтернативу потребителю. Особенно это касается корпоративных клиентов, у которых, во-первых, уже есть инфраструктура от MS (AD, Exchange, Skype for Business), а во-вторых, есть потребность держать всю или часть информации под контролем, то есть на собственных серверах. Для таких клиентов новые возможности совместной работы с документами от Microsoft выглядят особенно привлекательно.
В итоге у нас появилась идея рассказать, как собственно об этих возможностях, так и о том, как все это хозяйство установить и настроить. Попробуем добраться и до сравнения с альтернативными сервисами. Поскольку понятно, что такой лонгрид и писать долго, и читать его осилит не каждый, мы решили разделить это на несколько статей. Эта – первая. И в ней дальше мы пройдемся по тем фичам и особенностям, которые есть у каждого из продуктов Microsoft, обеспечивающих совместное редактирование документов: Office Online, MS Office на десктопах и он же на мобильных устройствах. Сразу предупреждаю – дальше будет много внимания к деталям и разжевывания мелких особенностей, нетерпеливый читатель может сразу прочитать «выводы» в конце заметки, для остальных – поехали.

Office Online

Office Online Server – это довольно интересное приложение, про которое не все еще хорошо знают. Во-первых, это возможность сократить количество лицензий и установок MS Office. Во-вторых, расширение возможности доступа и редактирования документа, грубо говоря – нужен только браузер. В-третьих, это самые лучшие на сегодня у Microsoft возможности совместной работы. Давайте посмотрим, о чем я.

Word Online

Правка документа в Office Online может производиться несколькими пользователями одновременно, при этом изменения и имя пользователя вносящего правки отображаются моментально у остальных соавторов. Пользователи могут править одновременно один и тот же участок текста, блокировки по абзацам нет.

Excel Online

В Excel Online изменения в ячейке отобразятся у других соавторов только при переходе первого на следующую ячейку. При этом ячейки не блокируются и вносить изменения могут сразу несколько пользователей.

PowerPoint Online

PowerPoint Online позволяет работать одновременно над одним слайдом, но лучше работать над разными элементами, иначе пользователи не видят real time изменений друг друга.

Настольная версия Office

Опыт совместной работы с документами через Office Online оставляет приятные впечатления, когда речь идет о правках текста без необходимости значительных изменений форматирования. Если вам захочется вставить диаграммы, smart art, оглавление, макросы, форматировать таблицы, использовать формулы и т.д. тут придётся использовать настольную версию программ. О разнице функционала настольной версии и online можно писать отдельную статью. Здесь же рассмотрим отличия, связанные с совместной работой.

MS Word

При редактировании в настольной версии программы блокируется абзац, над которым работает другой пользователь.
Вносимые изменения станут видны другим соавторам только после их сохранения автором и обновления документа остальными пользователями.
Сохранение-обновление объединено в кнопке Save (Ctrl+S) Наличие обновлений индицируется иконкой напротив имени автора.

MS Excel

В случае с Excel возможности одновременной работы над документом нет. Нам предлагают либо всем перейти в онлайн версию –
либо встать в очередь —

MS PowerPoint

Напротив, в PowerPoint ни блокировки, ни обозначения элемента, над которым работает другой пользователь нет. Так что, о том, что кто-то ещё работает над той же презентацией, вы можете понять разве что через панель Share.
Наличие обновлений сигнализируется малоприметным статусом Updates Available. Статус появляется только после сохранения изменений автором, сами изменения появляются после обновления документа с помощью Save (Ctrl+S).

Мобильные устройства

Microsoft Word App и Microsoft PowerPoint App

При работе на Android абзац или элемент, над которым работает пользователь, не блокируется и возможна одновременная работа с ним, но и ничего не подсвечивается для других соавторов, Правки отображаются без дополнительных действий с небольшой задержкой. То, что кто-то другой работает над этим же элементом, можно видеть в меню «Share”.
В случае с IPhone при изменениях выдается сообщение об обновлениях с предложением Применить/Отменить.
Интересно было бы ещё протестировать на Windows Phone с Windows 10. Но в компании таких не нашлось.

Microsoft Excel App

Совместная работа real time в Excel App не поддерживается.

Выводы

В целом, функциональность совместного редактирования документов от Microsoft можно считать состоявшейся, хотя разные компоненты реализуют ее по-разному. Сам по себе процесс совместного редактирования лучше всего реализован в Office Online – это реальный co-working. В список вещей, на которые можно смотреть вечно, добавлю себе движущиеся по экрану флажки с именами коллег и постепенно заполняющийся сам по себе документ. Но, к сожалению, за полноценным функционалом редактирования как такового по-прежнему придётся обращаться к настольным версиям программ, в которых ещё осталась и нужна кнопка сохранения, а также не так удобно реализован процесс совместной работы (больше всего пока страдает Excel, где все так и осталось на уровне чекина-чекаута).

В следующей заметке мы расскажем, как осуществить процесс разворачивания on-premise компонент совместного доступа в корпоративной инфраструктуре. Ферма SharePoint 2016, Office Online Server, публикация – вот это все. Не отключайтесь.
C уважением коллектив компании Servilon.ru Servilon.com

Add a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *