Що ж, цей день настав швидке спільне редагування у редакторах ONLYOFFICE

Суворий vs швидкий
Інші аргументи на користь «суворого» режиму редагування:
Ми не комплексували з приводу відсутності швидкого режиму спільного редагування, але користувачі хотіли його. Як і наш відділ PR, який практикує спільну творчість у режимі real-time. Загалом ми здалися і навіть знайшли
Плюси «швидкого» режиму:
- Зручність та швидкість при роботі з невеликими документами (кілька сторінок);
- Видовищність;
- Зручність для спільної розробки ідеї, наприклад мозкового штурму;
- Можливість оперативно внести та відстежити фінальні правки при спільній роботі над підсумковою версією документа.
Як все влаштовано
Операційне перетворення
Схема із затисканням виявилася практично ідеальною для всього, крім набору та видалення тексту. У цих випадках блокування параграфа, навіть нетривале, викликало неприємні природні явища: деякі літери просто не набиралися. Тому від блокування параграфів при введенні та видаленні тексту нам довелося відмовитися (в інших випадках блокування, як і раніше, присутнє).
Суть алгоритму в наступному:
Припустимо, у нас є параграф із текстом «авбр» і два користувача — Номер Один і Номер Два, які хочуть одночасно внести зміни до цього тексту. Наприклад, Номер Один вводить на початок слова букву «х», а Номер Два видаляє букву «в». При злитті має вийти «хабр».

Для алгоритму дії користувачів можна записати як ins(«x», 0) (вставка літери «x» у нульову позицію) та del(1) (видалення в позиції 1). Спробуймо послідовно виконати ці перетворення з урахуванням того, чиї зміни першими прийдуть на сервер:

Видно, що складністьполягає не тільки в самих змінах, а й у тому, хто з користувачів встиг надіслати свої редагування першим. Вирішення цієї проблеми в тому, що зміни користувача, які приходять на сервер другим, потрібно перетворювати через зміни, які прийшли першими. У першому випадку, оскільки видалення позиції 1 не змінює вставку в позиції 0, друга зміна не змінюється.
У другому випадку вставка в позицію 0 впливає наступне видалення позиції 1, воно перетворюється на видалення позиції 2. У результаті після перетворення ми отримуємо наступну схему.

Головна відмінність

У нашій схемі все станеться інакше. Обидва користувачі надішлють на сервер запит на збереження своїх змін. Один із них отримає відповідь «можна», а другий «не можна». Той, якому прийшло «можна», одразу відправить свої зміни на сервер, який, у свою чергу, надішле їх другому користувачу. Другий користувач застосує ці зміни та (за описаною вище схемою) перетворює через них свої. Тільки після цього він відправить свої зміни на сервер. Потім редагування прийдуть першому користувачеві.

Головний плюс нашої схеми в тому, що ми не завантажуємо сервер — на ньому зберігається лише список змін, які були зроблені з документом, та організується черга збереження.
Скасувати/повернути
Відразу визнаємо, у нас поки що немає undo в режимі «швидкого» спільного редагування. На жаль, такого undo, який хотіли б користувачі, немає ні в кого.
Припустимо, одна людина додала таблицю, а інша почала її змінювати, скажімо, рухати кордони, вводити текст. Потім перший вирішив зробити undo додавання таблиці. Насправді таблиця пропаде з усім, що зробив у ній другий користувач. Якщо він, наприклад, перетягнув до таблицічастина тексту з документа, то вона кане в небуття разом із скасованою таблицею. Крім того, для такого варіанту undo неможливо зробити правильне redo з погляду внесених до документа змін.
Схема undo/redo у Google Docs не повертає документ у вихідний вигляд, як цього хотів би користувач, навпаки – може зробити його таким, яким цей документ ніколи не був.
Втім, ми думаємо і над додаванням undo, яке б працювало приблизно як у Google. У наших планах воно мирно співіснує з варіантом Microsoft: поки що можна робити коректне undo/redo, ми робимо його, потім пробуємо робити undo як у Google Docs.
У різних режимах
Можливість перемикання режимів редагування – це наше нововведення. Користувачі, які одночасно працюють з документом, можуть вибрати найбільш комфортний для себе спосіб редагування.
Наприклад, у Номера Один увімкнено «строгий» режим, а у Номера Два — «швидкий». Перший блокує об'єкти та зберігає свої зміни сам. Другий нічого не блокує, а збереження у нього відбувається автоматично. Якщо перший редагує об'єкт або фрагмент тексту, другий нічого не може робити. При цьому перший не бачить, що робить другий – хай буде сюрприз. Після збереження Номер Один відправить свої зміни та прийме зміни Номера Другого.
Якщо підключається Номер Три із «швидким» режимом, то вони з Номером Другим спокійно працюють у режимі швидкого спільного редагування. При цьому вони не бачать і не можуть правити те, що заблокував цей інтроверт Номер Один. В останнього, до речі, працюють і undo, і redo.
Спробувати швидке спільне редагування можна тут.