Автор Тема: Электронный маршрутник в бою (впечатления)  (Прочитано 28281 раз)

Malamut

  • Флудер
  • Сообщений: 475
    • Просмотр профиля
Я бы сказал что тут кроме очевидных проблем в технической реализации, которые может и можно пофиксить (я правда считаю, что прям окончательно это невозможно), есть проблемы UI, которые на самом деле обособлены. Проблема ui - невозможность проверить, что на сервер записался введённый ответ и крайне простая возможность случайно его запортить. Всплывающие окна а-ля вы хотите перезаписать ответ - они в любом веке актуальны, дело не в технологиях, а в удобном интерфейсе, который вызывает уверенность и не позволяет случайно выстрелить в ногу.

achekh

  • Сэнсей
  • Сообщений: 2 969
    • Просмотр профиля
Но я считаю задачу, которую вы пытаетесь решить, нерешаемой даже в
теории.

Как опытый программист со стажем ползволю полность с вами не согласиться

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

Храмов Александр

  • Оргкомитет
  • Сэнсей
  • Сообщений: 6 228
    • Просмотр профиля
Цитировать
Но я считаю задачу, которую вы пытаетесь решить, нерешаемой даже в теории. Я потому и пишу про безграмотность. Ключевая цель маршрутника - запись результатов. То есть вы должны обеспечить уверенность, что никакие результаты не потерялись.

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


achekh

  • Сэнсей
  • Сообщений: 2 969
    • Просмотр профиля
А, и еще неплохо было бы на сервере хранить историю изменений (в том числе с информацией от кого пришел запрос на изменение: браузер, пользователь и т.д.) хотя бы в начальном режиме внедрения, чтобы можно было понять в какой момент и почему могли сброситься.

Игрик

  • Оргкомитет
  • Сэнсей
  • Сообщений: 24 287
    • Просмотр профиля
всё ещё будет невозможно проверить
Да почему невозможно-то? Перед отправкой ответов на проверку вы видите те ответы, которые мы получим.

achekh

  • Сэнсей
  • Сообщений: 2 969
    • Просмотр профиля
Вполне можно дать команде возможность самим распечатать маршрутник перед игрой, чтобы команда параллельно вносила туда ответы, в конце игры сфотографировав его и загрузив отдельной фотографией. Однако, самое интересное начнется, когда ответы в электронной версии не будут совпадать с бумажной, представленной на фото. А такое - будет.  При этом вероятность ошибок и у нас и у вас повысится. Поэтому и приходится лавировать между техническими решениями, игровыми решениями и вопросом трудоемкости.

Кстати, а это очень крутая как мне кажется идея. Но т.к. игра электронная, то я бы конечно сделал так:
1. Если загружен маршрутник, то его необходимо распознать автоматичсеки и перенести ответы в электронный вид.
2. При этом если ответ не распзнался либо распознался с малой уверенностью то - выдавать ошибку валидации и просить пользователя подтвердить/ответ вручную сразу после загрузки маршрутника.

Т.е. по сути фото маршрутника это просто вариант автоматически заполнить поля электронного варинанта.
Но конечно хорошая программа распознавания стоит денег и не малых :)

Но это было бы конечно очень круто и в дальнейшем можно было бы перенести и на офлайн игры.

Игрик

  • Оргкомитет
  • Сэнсей
  • Сообщений: 24 287
    • Просмотр профиля
А, и еще неплохо было бы на сервере хранить историю изменений (в том числе с информацией от кого пришел запрос на изменение: браузер, пользователь и т.д.) хотя бы в начальном режиме внедрения, чтобы можно было понять в какой момент и почему могли сброситься.
А тут вот к сожалению еще нужно учитывать количество участников и их одновременное желание писать и проверять ответы.
А если их будет не 40 команд, а 100? А если 1000? А если 3000?

achekh

  • Сэнсей
  • Сообщений: 2 969
    • Просмотр профиля
А, и еще неплохо было бы на сервере хранить историю изменений (в том числе с информацией от кого пришел запрос на изменение: браузер, пользователь и т.д.) хотя бы в начальном режиме внедрения, чтобы можно было понять в какой момент и почему могли сброситься.
А тут вот к сожалению еще нужно учитывать количество участников и их одновременное желание писать и проверять ответы.
А если их будет не 40 команд, а 100? А если 1000? А если 3000?

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

Но я скорее это имел ввиду (Как и написал) в начале внедрения для цели тестирования, чтобы понять где и почему ответы пробадают, чтобы выявить ошибки, исправить, и затем уже отключить эту опцию.

Игрик

  • Оргкомитет
  • Сэнсей
  • Сообщений: 24 287
    • Просмотр профиля
achekh вы еще кажется упускаете тот момент, что базово вся основа в другом.
мы даем возможность играть с разных устройств. и на каждом устройстве в реальном времени показываем, если другие участники вводят ответы. это сделано для решения разных целей. но сохраняем мы, как ты как программист понимаешь, не один ответ один раз в таком случае.

achekh

  • Сэнсей
  • Сообщений: 2 969
    • Просмотр профиля
Добавлю сюда еще один не очень юзер-френдли момент, который встретил:
При окончании времени (но не нажатии завершить) во всяком случае у меня на телефоне страница с заданиями была открыта и я мог по-прежнему вводить ответы, грузить фото.
Неплохо было бы когда время вышло при следущей синхронизации автоматически  завершать игру и открывать страницу с грамотами (как будто вручную обновил страницу).

achekh

  • Сэнсей
  • Сообщений: 2 969
    • Просмотр профиля
achekh вы еще кажется упускаете тот момент, что базово вся основа в другом.
мы даем возможность играть с разных устройств. и на каждом устройстве в реальном времени показываем, если другие участники вводят ответы. это сделано для решения разных целей. но сохраняем мы, как ты как программист понимаешь, не один ответ один раз в таком случае.
Не очень понял честно говоря.
Ты имеешь ввиду, что когда идет отправка на сервер - то сохраняются все ответы (даже те, которые вводил не Я, а с другого устройства)?
Если так то я это прекрасно понимаю и не виду противоречий с тем, что написал.
Если решаем сохранить в базу - добавляем в историю.
Просто тут конечно важно не в лоб записывать в базу все подряд, а определить что именно записывать из того что пришло.
Самое просто - если ответ не отличается, то в базу его записывать не надо, поэтому и в историю ничего не попадет.
Затем условие можно как-то усложнять. Например, как писал выше смотреть на время изменения и не обновлять старые данные.

Т.е. в идеальном варианте история будет просто дублировать основные данные.
А вот если я или другой поменяет - тогда в итомрии будет больше записей.
И если эти обновления выяснится что были ошибкой, то это может помочь определить причину.

Повторюсь историю я предлагаю рассматреть только как инструмент для дебага.
Потому что я сильно сомневаюсь, что имея просто инфу от юзера по устройствам и описанию проблемы вы легко и быстро сможете воспроизвести проблему.
А вот если увидите в истории что реально происходило - то это может очень сильно помочь.
« Последнее редактирование: 28.06.2020, 10:36:06 от achekh »

Игрик

  • Оргкомитет
  • Сэнсей
  • Сообщений: 24 287
    • Просмотр профиля
При окончании времени (но не нажатии завершить) во всяком случае у меня на телефоне страница с заданиями была открыта и я мог по-прежнему вводить ответы, грузить фото.
Вот это вообще странно. Оно точно кидает на страницу с грамотами. Либо глюк устройства, что вряд ли, либо баг у нас из-за применения контрольного времени, это пофиксим.

Лев Евдокимов

  • Сэнсей
  • Сообщений: 1 687
    • Просмотр профиля
Окна с картинками открываются в неочевидных местах страницы. Если страница увеличена - попробуй найди. При попытке увеличить саму картинку она тоже может сбежать

Вот да, на телефоне в вертикальной ориентации картинка открывается за пределами поля видимости и почти всегда где-то над началом страницы (а задание далеко в конце). Т.е. страница явно не рассчитана на экраны телефонов. А в поле люди вряд ли пойдут с устройствами с большими экранами.

Malamut

  • Флудер
  • Сообщений: 475
    • Просмотр профиля
achekh,
Давайте) Начнём со времени. Вот вы говорите - по времени прихода ответа. А время чьё? Серверное? Это ад: предположим, что первый человек ввёл ответ неправильный, но у него нет интернета. Второй - правильный через 10 минут, с интернетом. Третий и четвертый увидели правильный ответ и все согласились, что всё ок и забыли про этот КП. Потом устройство первого выходит онлайн - и бац, в итоге имеем неправильный ответ, про который, внимание!, все уверены, что сохранён на сервере точно правильный (3иц и 4ый же проверили!).

Время клиентское - гораздо лучше. Но для этого надо либо вкручивать реализацию ntp на JS в клиент, либо как-то учитывать расхождение часов. Учитывая, что на телефонах время имеет тенденцию иногда скакать на несколько секунд из-за всяких синхронизаций с сетью, и что мы же хотим прям онлайн одно и то же поле редактировать у вех 4х участников - легко возможна ситуация из пункта 1. Просто потому, что клиентское время - ресурс ненадёжный, непостоянный и нестабильный.

Про предупреждения на любое изменение: это гораздо надёжней. Но получится, что при правке отдельных букв (например, перевод в капс или ещё что), при нестабильном интернете у вас на каждый чих будет всплывающее окно. Технологии 21 века, однако. Как выделять явно отличия так, чтоб это было заметно - я вообще не представляю. Вы же помните, что клиент может начать синхронизоваться уже сильно после ввода ответа, когда вы уже забыли про тот КП (когда появится интернет).

В общем. Нет, эта задача не имеет надёжного решения. Потому что:

Игрик, achekh,
согласитесь, есть минимальные требования к работоспособности электронного маршрутника. Их всего два, как по мне:
1. Стоя у КП, игрок должен точно знать сохранился ли его ответ на сервер и какой ответ сохранился. Если что-то пошло не так - игрок это точно должен знать (выдать ошибку сохранения), чтоб иметь позже возможность поправить.
2. Никакой сохранённый ответ не может быть неявно изменён. То есть при любой попытке перезаписи сохранённого ответа надо выдавать предупреждение - вы уверены, что хотите поменять ответ А на ответ Б? А то капля дождя на экран, неосторожное нажатие на бекспейс или ещё что - и вы даже не узнаете, что ваш ответ уже неправильный. Испортить содержимое открытого для редактирования текстового поля в полевых условиях и без глючной синхронизации - проще простого.

Ни 1, ни 2 текущий маршрутник не обеспечивает. Зато пытается решить задачу одновременного редактирования одного поля. Непонятно зачем. Конечно, сохранённый кем-то ответ сразу же дожен быть виден всем другим участникам команды (это те же технологии 21 века, между прочим)! Но одновременно редактировать одно и то же текстовое поле для этого совершенно нет никакой необходимости.

Слономышь

  • Флудер
  • Сообщений: 274
    • Просмотр профиля
не смогли стереть введённую фотографию
Вообще не могли предположить, что команда решит удалять правильный ответ.
В том то и дело, что случайно загрузилась "левая" фотка. Правильной фотки на это КП не было в принципе. "Левую" удалить хотелось, но не получилось.

Слономышь

  • Флудер
  • Сообщений: 274
    • Просмотр профиля
Хотелось бы после финиша в режиме ридондли иметь возможность открыть туже страницу  с вводом ответов чтобы посмотреть что не так
Она же есть. Нажимаешь "Закончить игру" и проверяешь.
Да, но после окончательной отправки ответов тоже хотелось бы иметь возможность посмотреть на то, что отправил. Хотя бы для апелляций.

Игрик

  • Оргкомитет
  • Сэнсей
  • Сообщений: 24 287
    • Просмотр профиля
Слономышь
мысль понял, спасибо
обе мысли :)

unxed

  • Администратор
  • Флудер
  • Сообщений: 283
    • Просмотр профиля
Друзья, привет! Критика прочитана и услышана. Баг с заливкой фото действительно наблюдался (он проявлялся, когда одно и то же фото пробовали заливать несколько раз), он исправлен. Баг с некорректным временем финиша тоже найден и исправлен.

Идеи вроде "а давайте всё переделаем с нуля, я знаю, как надо" будут решительно отвергаться здесь. О причинах такой политики люди, увлекающиеся программированием, могут прочитать вот в этой статье классика Джоэла Спольски. Улучшать движок мы будем небольшими инкрементальными изменениями, без глобальных революций.

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

Спасибо за понимание :)

PS: Запоминание введенных данных в localstorage, чтобы обновление страницы при отвалившемся инете не теряло введенные данные - разумная идея, она в числе планируемых улучшений. Положение попандера и фокус при масштабировании тоже в планах на улучшение.

achekh

  • Сэнсей
  • Сообщений: 2 969
    • Просмотр профиля
Malamut
Сразу видно вы не программист )
Безусловно время должно приходить с клиента. Но оно достаточно легко различными вариантами конвертируется в серверное.
Проблема синхронизации до секунд это да, проблема глобальная и известная. Поэтому часто пишут в требованиях чтобы время на серверах где используется продукт совпадало с точностью до секунды.
Если учен что время не скачет то разницу между клиентом и сервером легко зафиксировать при логина с точностью до секунды.
А если оно скачет то тут все сложнее.
Но эти частные случаи либо можно решать отдельно, либо вообще не решать. И это поверьте нормально.
Ах да, ещё: безусловно время надо проверять только если изменяет другой пользователя. Если тот же то и последний изменивший, то надо просто обновлять.

При этом вероятность того что два разных пользователя введут разные ответы с разницей в секунды согласитесь крайне мал.

И собственно это совсем не теория.
Именно такой описанный подход мы используем в своем коммерческом приложении.

И ни один клиент ещё не жаловался.

achekh

  • Сэнсей
  • Сообщений: 2 969
    • Просмотр профиля
Ах да
Про предупреждения на любое изменение: это гораздо надёжней. Но получится, что при правке отдельных букв (например, перевод в капс или ещё что), при нестабильном интернете у вас на каждый чих будет всплывающее окно.
Точно не программист. В таз случаях делается тайм-аут. Например 1 секунда после нажатия клавиши. Нажал тайм-аут заново запустится.

achekh

  • Сэнсей
  • Сообщений: 2 969
    • Просмотр профиля
1. Стоя у КП, игрок должен точно знать сохранился ли его ответ на сервер и какой ответ сохранился. Если что-то пошло не так - игрок это точно должен знать (выдать ошибку сохранения), чтоб иметь позже возможность поправить.
Можно при окончании ввода сохранять изменения (грубо говоря по нажатию enter). А не по тайм-ауту. Те КП сохраняются по-отдельности а не пачкой.  Если ошибка да, подсветить. Если ошибка нет сети попробовать позже.

achekh

  • Сэнсей
  • Сообщений: 2 969
    • Просмотр профиля
2. Никакой сохранённый ответ не может быть неявно изменён. То есть при любой попытке перезаписи сохранённого ответа надо выдавать предупреждение - вы уверены, что хотите поменять ответ А на ответ Б? А то капля дождя на экран, неосторожное нажатие на бекспейс или ещё что - и вы даже не узнаете, что ваш ответ уже неправильный. Испортить содержимое открытого для редактирования текстового поля в полевых условиях и без глючной синхронизации - проще простого.
Те вы предлагаете word, notepad или любому другому приложению никогда не пользоваться автосохранением?
Интересно что вы скажете когда введёте кучу текста и ответов на КП а у вас умрет браузер, перезапустить телефон и придется все вводить с нуля.
Да, автосохранение отключается. Но это прошлый даже позапрошлый век. В том числе для многопоточных приложений. Оно есть и будет. Иначе вы первый приведите с жалобой я вводил исправлял а мои исправления потерялись.
Вот с таким даже к нам прибегали клиенты и жаловались (когда у нас не было автосохранение)

Malamut

  • Флудер
  • Сообщений: 475
    • Просмотр профиля
unxed и achekh,
Смотрите. Сейчас вероятность того, что итоговый ответ совпадает с ожиданиями игроков от него - далеко не 100%. Мы за последнюю игру 7 раз минимум перевводили ответ потому, что он почему-то не сохранился и попортился, например. Ну то есть, скажем, 95%  в условиях нестабильного интернета. Есть способ сделать эту вероятность гарантированно 100%. Даже если улучшениями движка и внедрениями всяких эвристик вы доведёте вероятность до 99.9, это всего лишь будет значить, что каждый 1000 ответ игрок будет считать, что он ввёл правильно, а сервер его всё равно не примет. Вы обязательно где-то сделает допущения и не разберёте все случаи - в итоге вы всегда будете терять ответы. Может, единицы из тысяч, но всё же.

Но повторяю, есть способ добиться 100% совпадения мнения игрока и сервера. Учитывая, что при этом интерфейс к тому же станет нагляднее и проще, то мне не понятно, зачем заведомо соглашаться на порчу части ответов. При этом все плюшки останутся: и отображение в реалтайм действий сокомандников, и возможность с любого устройства вносить данные в любое поле, и прочее. Единственно, что нельзя будет делать - это одновременно в одном и том же поле редактировать один и тот же ответ. Но это, согласитесь, никогда не может быть надо. Я напишу чётные буквы, а ты нечётные. Разве что для вот для такой весёлой развлекаловки, других практических применений это не имеет.
И это поверьте нормально.
То есть нет, это вот в условиях задачи онлайн-маршрутника ненормально. Вам единтсвенное что надо - гарантировать сохранение данных. А вы целенаправленно на это забиваете. Зачем? Я активно использую Google Authentificator. У него допустимое расхождение, на секундочку, 1,5 минуты. Раз в месяц мне стабильно приходится пользоваться функцией коррекции времени, чтобы коды работали. Нет, клиентское время не является надёжным ресурсом, на основании которого можно делать какие-то важные выводы (например, о сохранении критически важных данных, коими являются ответы в условиях онлайн маршрутника). Я могу привести более изощрённые примеры попыток полагаться на время клиента (я не просто так написал про скачущие на несколько секунд часы мобилок))), но и этого более чем достаточно.

unxed,
Ну и по поводу переписывания. Я не предлагаю переписать всё. Я предлагаю изменить логику сохранения финального ответа, сделав её наглядной и надёжной. Это работы, повторяю, на полчаса-час, то есть это никак не переписывание с 0. Всё остальное, включая онлайн синхронизацию данных между клиентами, остаётся, все плюшки - остаются. Не считаю, что стоит тащить неудачные решения лишь бы их не переписывать. Это тупиковый путь. Примером, кстати, является движок форума, на котором мы сидим. Из-за проблем в архитектуре и нежелания их кардинально менять, это вермишель кода крайне плохого качества. Чего стоит система плагинов-патчей! Нет, я не настолько не программист, насколько вы думаете))
Те вы предлагаете word, notepad или любому другому приложению никогда не пользоваться автосохранением?
Автосохранение никогда не заменяет неявно текущие данные. Автосохранение маст хев, но это лишь дополнение к основному для решения нештатных ситуаций, а не замена его. Для автосохранения в условиях задачи онлайн-маршрутника есть такая штука как localstorage. Идеально всё будет работать, именно так, как ожидают пользователи, проверено)

achekh

  • Сэнсей
  • Сообщений: 2 969
    • Просмотр профиля
Ни 1, ни 2 текущий маршрутник не обеспечивает. Зато пытается решить задачу одновременного редактирования одного поля. Непонятно зачем. Конечно, сохранённый кем-то ответ сразу же дожен быть виден всем другим участникам команды (это те же технологии 21 века, между прочим)! Но одновременно редактировать одно и то же текстовое поле для этого совершенно нет никакой необходимости.
Необходимости может и нет. Это согласен редкий кейс. Но это ещё раз легко решается ща исключением нескольких кривых кейсов когда два редактируют одновременно и при этом время не синхронизировано у них.
Ещё раз достаточно просто проверить изменял ли пользователь поле или нет. И если изменял когда - раньше или позже чем текущее значение.

Malamut

  • Флудер
  • Сообщений: 475
    • Просмотр профиля
achekh,
Это всё эвристики и допущения. Бессмысленные, когда существует простой, наглядный и надёжный способ, и более того - вредные, поскольку by design приводят к порче критически важных данных, не добавляя преимуществ. Пункт 1 (показывать пользователю сохранился его ответ на сервере или нет) в текущей концепции вообще целенаправленно проигнорирован, а это ключевой пункт любой операции записи! Представляете, пишете в БД, а она вам в ответ не условные true или false, а пустоту. Всегда пустоту и ничего кроме пустоты. Что делать будете?) А что предлагаете делать игрокам БГ? Перезапрашивать данные через обновление страницы разве что. Причём, из-за специфики, это надо делать на всех устройствах с открытыми заданиями, а то может быть, что одно из них возьмёт и потом уже поменяет ответ на сервере без ведома пользователя. ИМХО, бред. Текущий юзер экспиренс полностью провален, какое-то гадание на кофейной гуще, а не сохранение ответов на сервер.