Как эффективно решать конфликты – разбор стратегий известного конфликтолога на личном опыте — Карьера на vc.ru
Автор телеграмм-канала про софт-скиллы Игорь Демишев разобрал на собственном опыте классические стратегии поведения в конфликтных ситуациях. В конце статьи шпаргалка по алгоритму поведения в конфликтных ситуациях.
28 639 просмотров
Конфликты — часть нашей повседневной жизни. От того, насколько успешно мы справляемся с такими ситуациями, напрямую зависит то, качество нашей жизни и насколько добиваемся своих целей.
Конфликтологи Кен Томас и Ральф Килман создали модель, описывающую основные стратегии поведения в конфликтных ситуациях. Для хорошего лидера/менеджера/руководителя особенно полезно знать эти стратегии поведения в конфликтах. Тогда вы не только сможете системно и последовательно добиваться своих целей даже в сложных ситуациях, но и направлять свою команду в нужное русло.
Главное правило в конфликте – осознанно выбирать линию вашего поведения и помнить в том числе про влияние отношений с человеком на ваши долгосрочные цели
Модель
Итак, Томас-Килман разделили стратегии по двум шкалам: ориентацию на свои потребности и стремление учитывать интересы других людей. На основани этих критериев они выделили пять стратегий. Для удобства я так же разбил их на активные (те, которые требуют от вас ресурса для решения) и пассивные (которые требуют минимальных затрат энергии).
Классификация:
- Активные
Активные стратегии подразумевают нахождение оптимального способа достичь ваших целей, но стоят ваших ресурсов.
1. Компромисс
2. Сотрудничество
3. Соперничество - Пассивные
Пассивные стратегии в первую очередь нужны для «дешевого» решения не важных вопросов. 1. Уступка
2. Избегание
Как можете увидеть на иллюстрации, я предпочитаю большинство конфликтов решать с помощью сотрудничества или компромиссов. В моём случае такое поведение сформировалась до того, как я узнал об этой модели, на моём собственном опыте (только руководства ~7 лет). Но та же классика вроде Дейла Карнеги только укрепляет убежденность в правильном распределении выбираемых вариантов решения конфликтов.
Далее про каждую стратегию подробнее.
Пассивные
Избегание
Я считаю, что само по себе избегание хорошо либо в случае, когда вы этим самым выиграете себе время чтобы осознанно перейти к другой стратегии, либо когда конфликт не стоит потраченных на него сил и вы не собираетесь далее поддерживать отношения с человеком.
Один из моих любимых способов использования данной стратегии — избегание конфликта с последующим переходом в сотрудничество. Я начал применять этот метод довольно давно, скорее в силу индивидуальных особенностей. А недавно я добрался прочесть книгу Дейла Карнеги «Как заводить друзей и оказывать влияние на людей». Там он пропогандирует именно такой подход.
Единственный способ получить преимущество в споре — уклониться от него. Дейл Карнеги
По его методологии, построение долгосрочных отношений с людьми в подавляющем большинстве случаев перевешивают выгоду от возможной локальной победы. Споры разрушительно влияют на отношения. Я не столь категоричен, но куда мне тягаться с мэтром софт-скиллов.
Но умение избегать конфликтов — довольно сложный навык. Чтобы им овладеть, нужно уметь внимательно воспринимать позицию другого человека и тщательно анализировать другие точки зрения. Есть конкретные вещи, которые могут в этом помочь:
- Думать о последствиях спора:
— Привлечет или оттолкнет ли исход спора оппонентов от меня.
— Выиграю ли я этот спор или проиграю?
— Какую цену придется заплатить за участие в споре? А за выигрыш?
— Если я проиграю локально, какова будет моя долгосрочная выгода? - Давать обеим сторонам время на размышления (если позволяет время). Например, договариваться о встрече на следующий день.
- Научиться общаться спокойно, даже если оппонент не следует этому правилу и вообще вас бесит.
- Задавать себе следующие вопросы:
— А что если мой оппонент прав полностью или частично?
— Есть ли достоинства у его позиции?
Всегда ли эффективно работает этот метод? — Нет. Есть случаи, когда прямой конфликт или другие стратегии более эффективны. Избегание не подходит, когда нужно быстро принять решения и цена промедления слишком велика. Вы же не станете, например, избегать конфликта, если на кону будет здоровье вас или ваших близких?
Избегайте конфликта, когда вам нужно выиграть время или конфликт не стоит потраченных на него сил
Уступка
Она же приспособление. Эта стратегия подразумевает уступки опонненту, чтобы не допустить конфронтации. Отличается от компромисса тем, что вы полностью игнорируете свои подребности и действуете согласно плану оппонента.
Несмотря на то, что обычно такую стратегию неосознанно применяют неуверенные в себе люди, я считаю её важным инструментом и осознанного менеджера. Все просто — применяйте её в не принципиальных для себя вопросах. Так вы сэкономите кучу энергии для действительно важных вопросов.
Но важно не переусердствовать. Если вы очень часто будете прибегать к этой стратегии, это могут счесть за слабость. Или если вы начнете по принципиальным для себя вопросам принимать пассивную позицию, то начнёте подвергаться воздействию негативных эмоций.
Уступайте, когда вопрос конфликта для вас не принципиален и не важен. Но не переусердствуйте, чтобы это не посчитали за слабость
Активные
Компромисс и сотрудничество
Наиболее желаемыми стратегиями являются сотрудничество или компромисс, т.к. подразумевают наиболее конструктивное поведение обеих сторон.
Допустим, вы послушали прошлый совет и в наиболее остром пике конфликта придерживались стратегии избегания, давая оппоненту «выпустить пар». Далее важно вовремя включиться и найти точки соприкосновения с противоположной стороной. Для этого нужно ответить на вопросы:
- Важен ли для него объект конфликта?
- Какие цели он преследует? Каковы его интересы?
- Какие ценности для него важны? Какие вопросы являются для него принципиальными?
- Какими ресурсами для решения конфликта он обладает?
- Как обычно человек себя ведет в конфликтных ситуациях?
- В каких вы с ним отношениях?
Далее, в зависимости от ответов на все эти вопросы и ваших знаний об оппоненте, вы можете предположить, какую стратегию он выберет.
Кроме того, важно найти возможные взаимоисключающие интересы, чтобы понять, нужно ли будет идти на взаимные уступки (компромисс), или можно будет добиться полного удовлетворения сторон (полноценное сотрудничество).
На работе например, я чаще всего применяю переход в сотрудничество через поиск общих KPI или другой взаимной выгоды. Если такого не находится, пытаюсь зайти через выстраивание хороших отношений или формальные договоренности. И только в последнюю очередь эскалирую вопрос выше. Эта тактика очень редко даёт осечки)
Основной критерий для выбора между сотрудничеством и компромиссом — наличие взаимоисключающих интересов у сторон
Соперничество
Соперничество подразумевает, что вы максимально продавливаете свои интересы, возможно в ущерб интересам вашего оппонента.
Основные инструменты этой стратегии:
- Жесткий контроль ситуации и действий оппонента
- Давление на оппонента
- Создание перевеса в свою сторону любыми средствами
- Провокации оппонента на совершение ошибок
- Избегание (конструктивного) диалога с оппонентом
Некоторые инструменты находятся в «серой» зоне этики.
Например, я применял соревновательную стратегию решения конфликта в условиях сжатых сроков запуска проекта. Тогда нужно было быстро принять решение и максимально сократить сроки на создание продукта.
В этой ситуации я просто поставил человека перед фактом, что мы будем действовать определенным образом. Если его команда не успеет сделать свою работу, мы запустим проект без той части.
Я мог себе это позволить на тот момент, т.к. был ответственным за результат проекта, хорошо понимал почему такое решение лучше для бизнеса, заручился поддержкой у главного стейкхолдера. Если бы я этого не сделал, то увяз бы в диалоге с руководителем той комманды, т.к. он довольно искуссный переговорщик. Это привело бы к срыву сроков и демотивации команды, которая и так работала на пределе.
В итоге смежная команда ускорилась и они успели сделать всё самое важное. На второстепенное мы честно забили, и не пожалели об этом решении. Но в моменте это привело к ухудшению наших отношений с их руководителем — это та цена, которую пришлось заплатить.
Используйте соперничество, когда конфликт нельзя решить конструктивно, вы уверены, что победите и принимаете риски испортить отношения с оппонентом
Заключение
На последок поделюсь обещанным алгоритмом выбора стратегии поведения в конфликтных ситуациях. Как вы могли запомнить из картинки в начале статьи, я советую в 60% случаев использовать компромисс или сотрудничество, в 20% избегания и еще по 10% оставляю на соперничество и уступки.
Возможно цифры немного надуманные и в реальности все намного сложнее. Но для базового выбора стратегии вполне подойдет и этот вариант. Пользуйтесь на здоровье!
Пишите в комментарии, если у вас есть что рассказать про решение в конфликтных ситуаций!
Как решить конфликт с гостем ресторана за семь шагов
Стандарты
статья
Подпишись на наш канал в Телеграме, чтобы быть в курсе последних новостей ресторанного бизнеса!
В сфере гостеприимства конфликты могут возникать как между сотрудниками внутри проекта, так и между персоналом и гостями. В сегодняшней статье предлагаю поговорить о втором типе конфликтов и о том, как выходить из них с наименьшими потерями. Ниже представлен алгоритм из семи шагов:
1. Четко определите для себя, что вы хотите получить в результате решения конфликтной ситуации
Например: гость заказал блюдо и говорит, что оно невкусное или что в другом месте оно гораздо вкуснее.
Вы можете попытаться доказать гостю, что он неправ: блюдо приготовлено по ТТК, вы убеждены, что оно вкусное, а претензии ничем не обоснованы. Если вы выбрали данную позицию, смело закрывайте эту статью.
Что вы хотите получить в результате разрешения конфликта, решать только вам; ответ зависит от концепции, статуса вашего заведения и от многих других вещей (от темперамента собственника, в конце концов). Однако эта статья написана для тех, кто хочет решить спор так, чтобы гость остался лояльным по отношению к проекту. Ну или по меньшей мере так, чтобы он не ушел от вас навсегда.
(Я не отрицаю, что гости не всегда ведут себя корректно. Особенно в ситуациях, когда дело касается вкуса, ведь это понятие очень субъективно. Для кого-то борщ его мамы самый вкусный, но не факт, что он будет таким же для окружающих).
2. Донесите до сотрудников ценности гостя и разработайте внутренние правила по решению конфликтных ситуаций
Например: гость обнаружил у себя в блюде волос.
Официант подходит и спрашивает: «Что у вас случилось?». Гость рассказывает, официант идет к менеджеру со словами: «У гостя волос в блюде». Далее приходит неподготовленный менеджер и вновь спрашивает гостя: «Что у вас случилось?».
Т.е. время идет, проблема не решается, и гость вполне обоснованно начинает закипать еще больше.
Поэтому наша задача — максимально наделить линейных сотрудников полномочиями, необходимыми для решения стандартных конфликтных ситуаций: слишком долго пришлось ждать заказ, не нравится вкус, инородный предмет в блюде и т.п.. В идеале официант должен самостоятельно разрешать такие конфликты на начальной стадии.
Еще одна распространенная проблема: часто сотрудники думают не о решении ситуации, а о ее последствиях для себя. Или воспринимают жалобу гостя на свой личный счет, не отделяя свою должность от своей личности. Справиться с этим помогает общее повышение уровня корпоративной культуры заведения (определить, на каком уровне вы сейчас, можно, почитав эту статью).
3. Выслушайте гостя
Выслушать нужно, не перебивая и всем своим видом показывая, насколько для вас важна информация, которую хочет донести до вас гость.
Наши гости иногда не понимают, чего они хотят, и нередко просто дают волю эмоциям. Наша же задача понять, что конкретно хочет гость, и не заразиться его эмоциями. Ваши сотрудники долдны уметь управлять своими эмоциями, четко понимать свои границы — и, конечно же, знать продукт.
4. Выразите сочувствие
Попробуйте на самом деле понять чувства гостя, поставьте себя на его место. Попытайтесь осознать уровень разочарование или расстройства гостя в тот момент, когда он сделал замечание вашему заведению.
5. Извинитесь
Не стоит буквально говорить «простите меня, пожалуйста» (за исключением случаев, когда, например, официант опрокинул напиток на гостя). Лучше подойдет формулировка вроде «мы сожалеем, что так произошло, и обязательно сделаем всё возможное, чтобы в ближайшее время устранить все неполадки и учесть ваши замечания».
6. Сделайте для решения проблемы все — и еще чуть-чуть
Еще на третьем шаге (если мы действительно слушали гостя) гость сам говорит о том, как бы ему хотелось, чтобы эта ситуация решилась. Нам остается дать готовое решение в нескольких вариантах: пусть гость сам выберет тот, что лучше ему подходит. Или же спросить, что можем сделать для решения проблемы, если ответ не лежит на поверхности.
Далее даем небольшой подарок – комплимент, с благодарностью за то, что гость озвучил проблему и мы смогли ее устранить.
Настоящий профессионал должен на интуитивном уровне почувствовать, что именно хочет гость. Иногда достаточно просто внимательно выслушать и подобрать правильные слова.
7. Дайте обратную связь
Расскажите, что вы сделали в данном направлении, поблагодарите гостя. Найдите корневую причину проблемы — это поможет уменьшить количество жалоб в будущем. Ведь управление конфликтом — это действия, направленные на устранение ПРИЧИНЫ конфликта.
О том, где искать сотрудников, которые умеют управлять своими эмоциями и создавать атмосферу гостеприимства вместо того, чтобы распугивать гостей, вы можете узнать на вебинаре Галины Поздняковой «Как найти персонал для ресторана и не пожалеть об этом», который пройдет на нашей площадке 6 мая.
Читайте также:
- Разрешение сложных и конфликтных ситуаций
-
Блюдо, которое подается холодным. Что делать с отзывами мстительных сотрудников?
-
Что ресторану делать с плохими отзывами в интернете?
03 мая 2021
Галина Позднякова
Бизнес-консультант, основатель школы ресторанного менеджмента PANGA.
Рекомендуемые материалы
Новый алгоритм слияния с детальным разрешением конфликтов
Последнее изменение: 25 января 2023 г.
1 Введение
Новый алгоритм слияния с детальным разрешением конфликтов используется при обновлении приложения или объединении изменений в нем. Новый алгоритм слияния имеет следующие особенности:
- Детальное разрешение конфликтов — Когда в документе есть конфликтующие изменения, вам не нужно выбирать между целыми документами: разрешение конфликта с помощью вашего изменения или с помощью их изменения. Вместо этого вы можете разрешать конфликты на уровне отдельных элементов, таких как виджеты, сущности, атрибуты или действия микропотока. Также автоматически принимаются все неконфликтующие изменения с обеих сторон.
- Нет конфликтов при параллельном изменении списков виджетов — Когда два разработчика вносят изменения в виджеты в один и тот же документ, конфликта нет, изменения объединяются. Однако, если изменения вносятся слишком близко к одному и тому же месту в документе, сообщается о конфликте порядка списка , который напоминает разработчику, объединяющему изменения, принять решение об окончательном порядке виджетов в списке.
2 Включение нового алгоритма с детальным разрешением конфликтов
Убедитесь, что ваш репозиторий находится в чистом состоянии: все было зафиксировано и нет незавершенных изменений или конфликтов.
Новый алгоритм включен по умолчанию в Studio Pro 9. Если у вас возникнут проблемы, вы можете вернуться к старому алгоритму, выполнив следующие действия:
- В верхней панели Studio Pro перейдите к Edit > Preferences > Новые функции .
- В разделе Новые функции отключите Новый алгоритм слияния с опцией детального разрешения конфликтов.
- Перезапустите Studio Pro.
Дополнительные сведения см. в разделе «Настройки».
3 Пример разрешения конфликтов
Страничный документ в вашем приложении разработан, как показано ниже:
Ваш коллега вносит следующие изменения в основную строку:
- Текст Дом изменен на Добро пожаловать!
- Логотип Mendix добавляется над текстом Добро пожаловать!
- Подзаголовок Добро пожаловать в ваше новое приложение удален
- Текст Напишите здесь текст добавлен в нижнюю сетку макета
Новый макет документа вашего коллеги показан ниже:
Вы вносите следующие изменения на ответвлении:
- Вы меняете текст Дом на Моя домашняя страница
- Вы добавляете сетку данных внутрь сетки нижнего макета
Теперь ваша страница выглядит так, как показано ниже:
4 Разрешение конфликтов
При объединении изменений новый алгоритм показывает следующие конфликты:
Текст, который изменили обе стороны.
Конфликт порядка списка . Вы оба добавили виджеты в нижнюю сетку макета. Алгоритм слияния не может угадать правильный порядок двух новых виджетов и сообщает о конфликте порядка списка. Это напоминание вам (разработчику, выполняющему слияние) посмотреть окончательный макет и подтвердить заказ.
Чтобы начать процесс разрешения, нажмите кнопку Merge . Страница открывается в специальном режиме с оранжевой полосой вверху:
На страницу уже внесены следующие неконфликтующие изменения:
- Над текстом добавлен логотип Mendix Главная (основная строка)
- Субтитры удалены (основная строка)
- Текстовый виджет добавлен в нижнюю сетку макета (основную строку)
- В нижнюю сетку макета (строку ответвления) добавлена сетка данных
4.1 Разрешение первого конфликта
В случае первого конфликта вы можете просмотреть изменения и решить, какую версию применить. Выберите одну из трех строк, представляющих конфликт, и выберите Разрешить с помощью Моего или Разрешить с помощью Их .
Вы увидите обновление документа сразу после нажатия кнопки. Если вы не удовлетворены своим выбором, вы можете использовать отмену, чтобы вернуться и попробовать другой вариант.
Использование сочетаний клавиш Ctrl + Z и Ctrl + Y , чтобы отменить свой выбор, сначала щелкните документ, чтобы сфокусировать его.
Существует третий вариант разрешения конфликта: Пометить как разрешенный . Это означает, что вы не выбираете чью-либо сторону для разрешения конфликта и оставите все так, как было в оригинале. Ни одно из новых изменений текста не будет применено.
После выбора одного из трех вариантов разрешения конфликта появятся зеленые галочки, указывающие на то, что этот конфликт устранен.
4.2 Разрешение второго конфликта
Второй конфликт — это конфликт порядка списка. Это напоминание взглянуть на порядок виджетов в сетке макета. Вы можете расположить виджеты в нужном порядке в редакторе страниц, а затем выбрать Пометить как разрешенное для конфликта порядка списка.
Вы также можете удалить один из виджетов или добавить новый. Документ полностью доступен для редактирования при разрешении конфликтов.
После разрешения второго конфликта полоса вверху станет зеленой, указывая на то, что все конфликты разрешены:
Некоторые изменения сделают невозможным разрешение конфликтов с помощью моего или их . Например, если вы еще не разрешили первый конфликт и удалили текстовый виджет Home , вы больше не сможете разрешить первый конфликт, потому что виджета просто нет. В этот момент вы можете только пометить конфликт как разрешенный:
4.3 Завершение разрешения конфликтов
После разрешения всех конфликтов нажмите кнопку Принять и выйти Кнопка для завершения результатов. Документ будет сохранен в объединенной форме, и конфликт для этого документа исчезнет. Результатом является документ, который содержит изменения с обеих сторон и, возможно, некоторые ручные правки.
В любой момент вы также можете прервать разрешение конфликта, нажав кнопку Cancel . Конфликт останется, и вы сможете разрешить его позже.
Обратная связь
Была ли эта страница полезной?
Рад слышать это! Благодарю за ваш ответ.
Жаль это слышать. Пожалуйста, расскажите нам, как мы можем улучшить.
Операционные преобразования как алгоритм автоматического разрешения конфликтов | Антон Загорский | Coinmonks
Алгоритмы автоматического разрешения конфликтов в распределенных системах с более чем одним ведущим узлом (в данной статье под ведущим узлом мы подразумеваем узел, который принимает запросы на изменение данных) — достаточно интересное направление исследований. В этой области существуют разные подходы и алгоритмы со своими компромиссами, и в этой статье мы сосредоточимся на технологии Operational Transformation, которая предназначена для разрешения конфликтов в приложениях для совместного редактирования, таких как Google Docs или Etherpad.
Совместное редактирование — сложная задача с точки зрения разработки, поскольку клиенты могут вносить изменения в одни и те же части текста почти в одно и то же время. Чтобы имитировать немедленный ответ, каждый клиент должен поддерживать свою собственную локальную копию документа, в противном случае клиентам пришлось бы ждать, пока их изменения не будут синхронизированы с другими клиентами, а это может занять значительное время. Таким образом, основной проблемой совместного редактирования является обеспечение согласованности между локальными репликами, т.е.0054 сходятся к идентичной, правильной версии документа (Обратите внимание, что мы не можем требовать, чтобы все реплики имели идентичную копию документа в какой-то момент времени, поскольку процесс редактирования может быть бесконечным).
1.1 Первые версии Google Docs
Первые версии Google Docs (как и других подобных приложений) использовали сравнение версий документов. Представьте, что у нас есть два клиента — Алиса и Боб, и их документы синхронизированы. Когда сервер получает изменения от Алисы, он вычисляет разницу между ее версией и своей версией и пытается их объединить. Затем сервер отправляет объединенную версию Бобу. Если у Боба есть свои неотправленные изменения, он пытается объединить полученную версию сервера со своей. И процесс повторяется.
Довольно часто этот подход не работает. Например, представьте, что Алиса, Боб и сервер начинают с синхронизированного документа «Быстрая коричневая лиса».
Алиса выделяет жирным шрифтом слова «коричневый лис», и в то же время Боб меняет «лиса» на «собака». Изменения Алисы поступили первыми на сервер, он применяет и отправляет изменения дальше Бобу. Правильный результат слияния должен быть «Быстрая коричневая собака» , но у алгоритмов слияния недостаточно информации для выполнения правильного слияния. С их точки зрения «Быстрые коричневая лиса собака», «Быстрая коричневая собака», «Быстрая коричневая собака лиса» являются правильными и достоверными результатами. (В таких случаях в git у вас будут конфликты слияния, и вам придется сливать вручную). Так что это главная проблема — мы не можем полагаться на слияние с таким подходом.
1.2 Последние версии Google Docs
Последние версии Google Docs используют другой подход — документ хранится как последовательность операций, и они применяются по порядку (под порядком здесь подразумевается общий порядок) вместо сравнения версий документов.
Хорошо, теперь нам нужно понять , когда применять изменения — нам нужен протокол совместной работы . В Документах Google все операции сводятся к 3 возможным типам:
- Вставить текст
- Удалить текст
- Применить стиль
Когда вы редактируете документ, все изменения добавляются в журнал изменений одного из этих 3 типов, и журнал изменений воспроизводится с какого-то момента, когда вы открываете документ.
(Первым (публичным) проектом Google с поддержкой OT был Google Wave и его набор возможных операций был намного богаче)
1.
3 ПримерПусть Алиса и Боб начнут с синхронизированного документа «LIFE 2017».
Алиса меняет 2017 на 2018, что на самом деле создает 2 операции:
В то же время Боб меняет текст на «CRAZY LIFE 2017»:
Если Боб просто применяет операцию удаления Алисы, когда он ее получает, то он получает неправильный документ (вместо этого следует удалить цифру 7):
Бобу необходимо преобразовать операцию удаления в соответствии с его локальными изменениями, чтобы получить правильное состояние документа:
Теперь все в порядке.
Для большей формальности рассмотрим следующий пример:
затем
Вуаля! Описанный алгоритм является Оперативным Преобразованием.
2.1 Модели согласованности
Для обеспечения согласованности OT было разработано несколько моделей согласованности . Рассмотрим один из них — модель CCI.
Модель CCI состоит из следующих свойств:
- Конвергенция: все реплики одного и того же документа должны быть идентичными после выполнения всех операций
Алиса и Боб начинают с одного и того же документа, затем делают локальные изменения и реплики расходятся (таким образом достигается высокая отзывчивость). Свойство Convergence требует, чтобы Алиса и Боб видели один и тот же документ после того, как они получили изменения друг от друга.
2. Сохранение намерения: гарантирует, что результат выполнения операции в любом состоянии документа будет таким же, как намерение операции . Намерение операции определяется как влияние ее выполнения на созданную реплику.
Рассмотрим пример, где это свойство нарушено:
Алиса и Боб начинают с одного и того же состояния документа, затем вносят свои локальные изменения. Цель операции Алисы — вставить «12» в позицию 1, а цель операции Боба — удалить «CD». После синхронизации намерение Боба нарушается. Мы также можем наблюдать, как расходятся реплики, но это не является требованием для свойства сохранения намерения. Упражнение: каково правильное конечное состояние в этом примере?
3. Сохранение причинно-следственной связи: операции должны выполняться в соответствии с их естественным причинно-следственным порядком в процессе совместной работы (на основе отношения «произошло-прежде»).
Рассмотрим пример, где это свойство нарушено:
Алиса, Боб, агент Смит начинают с одного и того же состояния документа. Алиса вносит сдачу и отправляет ее другим клиентам. Боб получает его первым, исправляет опечатку и отправляет это изменение другим клиентам. Из-за сетевой задержки агент Смит сначала получает от Боба операцию по удалению символа, которого еще нет в его реплике.
OT не может обеспечить это свойство, поэтому можно использовать другие алгоритмы, такие как векторные часы.
2.2 Проектирование OT
Одной из стратегий проектирования OT является его разделение на 3 части:
- Алгоритмы управления преобразованием: отвечают за определение того, когда операция (цель преобразования) готова к преобразованию, какие операции (эталон преобразования) следует должны быть преобразованы и в каком порядке должны выполняться преобразования
- Функции преобразования: отвечают за выполнение фактических преобразований целевой операции в соответствии с влиянием эталонной операции
- Свойства и условия: определяют взаимосвязь между алгоритмами и функциями управления преобразованием и служат требованием корректности алгоритма ОТ
2.
3 Функции преобразованияФункции преобразования можно разделить на два типа:
- Включение/Прямое преобразование: для преобразования операция Oa перед Ob, чтобы включить влияние Ob (например, две вставки)
- Исключение/обратное преобразование: преобразовать операцию Oa перед Ob, чтобы исключить влияние Ob (например, вставка после удаления)
Вот пример функций преобразования, которые работают с изменением символов:
Рассмотрим более подробно, как работает протокол совместной работы Google Docs.
Каждый клиент хранит следующую информацию:
- Последняя синхронизированная версия (id)
- Все локальные изменения, которые не были отправлены на сервер (ожидающие изменения)
- Все локальные изменения, отправленные на сервер, но не подтвержденные ( отправлены изменения)
- Текущее состояние документа видно пользователю
На сервере хранится следующая информация:
- Список всех полученных, но не обработанных изменений (Ожидающие изменения)
- Журнал всех обработанных изменений (Журнал ревизий)
- Состояние документа на момент последней обработки change
Предположим, у нас есть Алиса, Сервер, Боб, и они начинают с синхронизированного пустого документа.
Алиса набирает «Привет»:
Ее изменение было добавлено в список ожидающих изменений, а затем отправлено на сервер и перемещено в список отправленных изменений.
Тем временем Алиса печатала и добавила «мир». В то же время Боб набрал «!» в своем пустом документе (он не получил изменений Алисы):
Алиса {Insert ‘World’, @5} была добавлена к ожидающим изменениям, но не была отправлена, потому что ее первое изменение не было подтверждено, и мы отправляем только одно изменение за раз . Также обратите внимание, что сервер обработал первое изменение Алисы и переместил его в журнал изменений. Затем он отправляет подтверждение Алисе и передает ее изменение Бобу:
Боб получает изменение и применяет к нему функцию преобразования, в результате чего индекс ожидающего изменения был сдвинут с 0 на 5. Обратите внимание, что и Алиса, и Боб обновили свою последнюю синхронизированную версию до 1. В конце концов Алиса удалила свое первое изменение. из отправленных изменений.
Затем и Алиса, и Боб отправляют свои неотправленные изменения на сервер:
Сервер сначала получает изменение Алисы, поэтому он обрабатывает его, отправляет подтверждение Алисе и передает его Бобу. Боб должен снова применить функцию преобразования и сместить свое локальное изменение на индекс 11.
Далее наступает важный момент. Сервер начинает обрабатывать изменение Боба, но, поскольку идентификатор редакции Боба устарел (2 вместо фактического 3), сервер преобразует его изменение в соответствии со всеми изменениями, о которых Боб еще не знает, и сохраняет их как ревизию 3.
Процесс завершен для Алисы. , Бобу все еще нужно получить преобразованное измененное и отправить подтверждение.
Давайте взглянем на другое приложение для совместного редактирования, использующее технику ОТ — http://etherpad.org
Etherpad использует немного другие функции преобразования — он отправляет изменения на сервер в виде набора изменений в следующем формате:
(p1 -> p2)[c_1, c_2, …],
где:
- p1 — длина документа до изменения
- p2 — длина документа после изменения
- c_i — определение если документ:
если c_i — число или диапазон чисел то значит индексы сохранены символов, или
если c_i — символ или строка, тогда это означает вставку
Пример:
- «» + (0 -> 5)[«Привет»] = «Привет»
- «Привет, мир» + (10 -> 14)[0, ‘e’, 1–9, «!!!»] = «Привет, мир!!!»
Документ формируется как хронологическая последовательность таких наборов изменений, примененных к пустому документу.
Заметим, что сервер не может просто применить изменения от клиентов (впрочем, в Google Docs это возможно), так как длина документов может быть разной, например, если клиенты A и B стартовали с одного и того же документа X документа length n и do следующие наборы изменений соответственно:
A: (n -> n_a)[…],
B: (n -> n_b)[…]
тогда B(A(X)) невозможно, потому что B требует документ длины n, но у него есть длины n_a после A. Чтобы решить эту проблему, etherpad вводит так называемую функцию merge , которая принимает 2 набора изменений, применяющих к одному и тому же состоянию документа , и вычисляет новый одиночный набор изменений. Требуется, чтобы
Не очень полезно вычислять m(A, B), когда клиент A получает изменения от клиента B, потому что m(A, B) относится к состоянию X, но A находится в состоянии A(X). Вместо этого мы должны вычислить A’ и B’ так, чтобы
Для простоты определим , следуя функции f :
, которая строится по следующему алгоритму (для f(A, B)):
Пример
Затем
Теперь попробуйте вычислить конечное состояние m(A, B)(X) после слияния.