В своём предыдущем посте я рассказал, что знаю, как работает Flash-компонент Codeforces для показа решений во время контеста, и собираюсь рассказать другим. Не для того, чтобы эту информацию использовали для нарушения правил, а чтобы в контестах можно было участвовать наравне со всеми без Flash. Реакция со стороны администрации была весьма болезненной — как будто я собираюсь сломать Codeforces, то есть сделать так, чтобы он не мог нормально работать. Я не согласен с подобной оценкой. Более того, я сомневаюсь, что те усилия, которые прикладывает Codeforces для защиты кода решений от копирования, вообще оправданы.
Я считаю, что когда MikeMirzayanov придумывал систему защиты от копирования кода (или оценивал, если эту систему придумал кто-то другой), он совершил две ошибки. Первая из них чисто техническая: он решил, что то, что алгоритм шифрования реализован с помощью Flash, само по себе является серьёзным препятствием для реверс-инжиниринга. Никакой другой защиты там нет: алгоритм очень простой, код легко читается, а для расшифровки не нужно даже знать ключ. Как я уже писал, это не работает — декомпиляторы для Flash легко находятся в Google. Так что почти никакой реальной защиты и не было, только видимость защиты.
Вторая ошибка скорее стратегическая: в попытке сделать систему максимально защищённой MikeMirzayanov решил пожертвовать удобством участников и продолжал настаивать на своём решении, даже когда участники неоднократно озвучивали своё несогласие. Ни для кого не секрет, что полностью исключить возможность читерства на соревнованиях невозможно. Особенно это касается онлайн-соревнований, где есть методы читерства, которые просто реализовать и сложно предотвратить. Например, совместное участие в личном контесте нескольких человек под одним аккаунтом. По сравнению с этим варианты читерства, которые возникают в результате возможности копировать код, не выглядят захватывающими: чтобы читать чужой код, необходимо уже иметь своё решение, которое проходит претесты, а значит, идею решения всё равно нужно придумать самому (да и, чтобы понять идею чужого решения, не нужно его никуда копировать — достаточно его прочитать). А чтобы использовать скопированный код чужого решения для взломов, нужно не только уметь его запускать, но и иметь нетривиальные тесты — ведь это решение уже прошло претесты. В общем, нужно достаточно много возни, а в результате на одних взломах всё равно далеко не уедешь.
При планировании системы защиты стоит предполагать, что большинство участников не будут пытаться нарушить правила, по крайней мере, преднамеренно. Потому что если это не так, то у сообщества серьёзные проблемы, которые не решить техническими средствами. Так что большинство участников вообще не будет пытаться скопировать текст решений, некоторые могут попробовать просто его выделить и скопировать (возможно, не зная, что это против правил — кто же их читает?), отдельные участники могут попробовать влезть в инструменты разработчика. Но если кто-то дошёл до того, чтобы вытаскивать текст, рисуемый на canvas-е, то у меня для вас плохие новости: он действительно хочет скопировать код, и он его скопирует. Потому что аналоговая дыра остаётся всегда, OCR — это не rocket science, а склеить изображение всего кода из видео его прокрутки — если подумать, то не такая уж и сложная задача.
Исходя из вышесказанного, я считаю, что нынешняя система на основе Flash в целом не приносит пользу. Да, она может не дать небольшому количеству участников считерить, но для большинства она создаёт неудобства. Целевой аудиторией Codeforces являются честные участники, так что о них нужно думать в первую очередь. В этом плане показателен пример TopCoder: их браузерная арена не использует Flash, и код оттуда извлекается вводом одной строчки в консоль. Их Java-арена вообще передаёт код открытым текстом — бери и копируй. И при всём при этом у них, судя по всему, нет серьёзных проблем с читерами (иначе бы они что-нибудь изменили). Лично мне их подход нравится намного больше.