Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save orsinium/d3befbe081af648facb928a4ed29eeb2 to your computer and use it in GitHub Desktop.
Save orsinium/d3befbe081af648facb928a4ed29eeb2 to your computer and use it in GitHub Desktop.
Совместная работа над текстами

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

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

  1. Все изменения должны происходить мгновенно. Нужно предоставить пользователю возможность продолжать работу с документом, не дожидаясь подтверждения внесения правок со стороны сервера.
  2. После окончания работы версии файла у клиента и на сервере должны совпадать.
  3. Принцип сохранения намерений (intention preservation): необходимо сохранить изменения, внесенные каждым пользователем, даже в случае конфликта правок.

Представленные выше проблемы решаются следующими способами:

  1. Блокировка фрагментов текста. Всё просто: абзац, который редактирует какой-либо пользователь, блокируется от изменений другими пользователями. Такой подход позволяет однозначно разрешить конфликты правок (которые просто не могут быть, т.к. пользователи вносят их по очереди, с учетом всех предыдущих правок), однако требует постоянного соединения с сервером.
  2. Operation Transformation. При использовании данного подхода на сервер от каждого пользователя передаются операции, которые он совершил с текстом. Например, "вставить букву А после 47 символа текста". Это позволяет избежать как блокировок, так и необходимости постоянного соединения с сервером, однако во всех существующих алгоритмах, реализующих данную идею, возможны ситуации, когда при совмещении правок различных пользователей результат будет совершенно не тем, который они ожидали увидеть.

Более гибким является подход, при котором каждый пользователь создает свою версию документа (branch). Если имеются неконфликтные версии, авторы которых разрешили слияние, они объединяются между собой (merge). Рассмотрим алгоритм подробнее:

  1. Пользователь выбирает версию файла для редактирования, вносит изменения, разрешает или запрещает автослияние и отправляет свою версию на сервер. Если автослияние запрещено, алгоритм завершается.
  2. С помощью утилиты diff в тексте отыскиваются слова (изображения, ячейки таблицы и т.д.), измененные (сюда же относятся удаленные и добавленные) пользователем.
  3. Версия пользователя сравнивается с другими версиями, имеющими с ней общий исходный файл и доступными для автослияния. Если все изменения либо производились над разными словами, либо совпадают, данные версии объединяются, и алгоритм прерывается.
  4. Если имеются доступные для слияния тексты, однако с каждым из них имеется конфликт, автору предлагается либо произвести слияние с одним из таких файлов, отказавшись от своих правок, являющихся конфликтными, либо так и оставить файл отдельной версией. Формат представления файла как дерева версий кажется неудобным для многих людей, привыкших работать только с одной версией документа, однако он уже успел хорошо себя зарекомендовать в системах контроля версий, ставших привычным инструментом для большинства программистов, работающих над крупными проектами. Данный подход, по сравнению с предыдущими, не требует постоянного соединения с Интернетом, позволяет пользователям вносить любые правки в любое время и наиболее подробно отображает все внесенные в файл изменения. Со стороны сервера для его реализации требуется больше памяти (т.к. для каждого файла хранятся все версии), но и значительно меньше вычислительных мощностей (благодаря редким синхронизациям и простому алгоритму сравнения).

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment