
В 2011-м и немного в 2015 году я принимал участие в разработке портала с прикольными роликами «Вы — очевидец» (далее «сайт»). Сейчас дни максимальной славы этого сайта прошли, и он стал хобби-проектом известного продюсера и телеведущего Ивана Усачёва.
В то время Хабр показал, что возможен успешный, коллективный, практически самомодерируемый блог. Это была революция в области IT-блогов (в моих глазах).
Поэтому я захотел разработать для «Очевидца» какую-то похожую систему оценок роликов, новостей и прочего. Я был очарован системой оценок и кармы Хабра. Но захотелось сделать ещё круче и с системным философским обоснованием.
Надеюсь, вы найдёте в этой статье что-то полезное, что позволит улучшить систему оценок для вашего проекта.
В поисках подхода
Поставить «плюс» или «минус» — это то же самое, что дать пользователю меч карающий или длань вознаграждающую. Это определённая власть. Нужно определить её принципы.
Виды власти
Когда мы начинаем говорить о системе управления каким-то общественным институтом, первое, что приходит на ум, — демократия, власть народа.
Однако к ней возникает масса вопросов. Разве это справедливо, что голос наркомана равен голосу академика?
Да, академик может быть наивным и некомпетентным в каких-то вопросах. Но в целом ответ очевиден — значимость голоса отличается.
Если мы даём кухарке власть управлять государством, то она должна получить дополнительное образование, чтобы принимать грамотные решения, плюс иметь интеллект и волю к этому. Но невозможно обучить и сделать способными всех.
Как это применимо к развлекательному сайту? Есть пользователи, которые генерируют полезный контент (о том, как оценить пользу, поговорим далее), а есть те, кто этого не делает.
Очевидно, что у первых должно быть больше возможностей, чем у вторых. Первые — это ядро, центр кристаллизации, из которого вырастает качественное сообщество.
Поэтому далее приходит на ум сделать меритократическую систему, где наибольшие права имеют самые умные, но это звучит бредово для развлекательного сайта.
Поэтому в названии статьи я использовал слово «офелократия» — «власть пользы». Ὠφελοκρατία (Oфеlokratia) от «ὠφέλεια» (польза, выгода) + «κράτος» (власть).
Рейтинговая система должна приносить пользу сайту, выполняя задачи его владельца и продвигая тот контент, который в первую очередь нужен владельцу сайта. В данном случае нужно было вдохновлять оценками пользователей присылать интересные ролики.
Если никак не контролировать контент, то его качество может сильно упасть, он может перетечь в эротическую и порнографическую форму, что не входило в задачи Ивана.
Основная идея
Сделать автоматическую систему, которая пересчитывает ценность каждого вида контента, когда-либо опубликованного на сайте, рейтинг и силу голоса пользователей чуть ли не онлайн. И она была реализована за исключением того, что всё обновлялось раз в 30 минут. Обновление происходило в фоне и не мешало работе сайта и длилось от нескольких секунд до 1,5 минут для тысяч пользователей и огромного числа контента.
Виды контента
Основным контентом на сайте являются ролики, вторым по важности — посты, третьим — комментарии. Поэтому рейтинговая система должна учитывать разную важность контента.
В ходе размышлений и экспериментов были получены следующие относительные веса:
43 (пользователь, это «карма», что мы с ней сделали, будет дальше)
21 (ролик)
15 (пост)
1 (комментарий)
Хороший комментатор поддерживает беседу и интерес, добавляет ценности к материалу. Многие на Хабре считают, что самая ценная информация проскакивает именно в комментариях. В них может высказаться, «вставить свои 5 копеек» какой-то эксперт, у которого нет времени писать статью, но его комментарий сильно повысит ценность материала.
Нужна ли «карма»?
Вначале я думал, что она очень нужна, но потом пришёл к выводу, что пользователи могут адекватно оценить друг друга только если лично знакомы. Эта проблема, кстати, существует и в демократии. Поэтому нет смысла в оценке пользователя. Достаточно оценок контента. «По делам узнаете их».
Пусть оценка пользователя, его сила голоса определяется контентом, который он создаёт/заливает. Так что технически возможность голосовать за пользователя в коде была оставлена, но убрана с фронтенда. И потом эта возможность не использовалась.
Всё течёт, всё меняется. Временная инфляция.
После внедрения силы голоса на сайте со временем появилась проблема — у пользователей-старожилов, которые перестали вносить вклад в развитие сообщества, была большая сила голоса и они подавляли новых авторов.
Ведь сегодняшний «я» совсем не тот человек, что 10 лет назад. Если я создал качественный контент, но потом отошёл от дел и только голосую на сайте, то моё право голоса должно постепенно уменьшаться. С одной стороны, это отражает справедливость, а с другой стороны стимулирует пользователя чаще создавать контент.
Есть идеи общественного устройства, когда право голоса есть только у тех, кто платит налоги, так как пенсионеру можно пообещать палку колбасы и он как хочешь проголосует. Он — зависимое от государства лицо. Им можно манипулировать как хочешь. Тут такая же аналогия. Если ты активный член сообщества, инфляция оценок тебя не касается, если пользователь только потребитель и даже комментов не пишет, его сила голоса падает.
Пользователи-старожилы могут стать некой геронтократией, впасть в маразм, сойти с ума, а их голоса будут по-прежнему обладать такой же силой, как в лучшие дни.
Я рассудил, что будет справедливым при расчёте силы голоса уменьшать вес оценок за контент пользователя примерно на 50% за 10 лет. Как вы помните, сила голоса в моей системе складывается из оценок контента этого пользователя. Для этой временной инфляции избрал сигмоидную функцию на основе арктангенса.

Функция выбрана таким образом, чтобы быстрее всего инфляция была вначале, а потом замедлялась. Аналогия — классика в литературе, значение которой падает, но настолько медленно, что это совершенно незаметно.
Справедливость оценок в зависимости от числа проголосовавших
Известно, что при измерении чего-либо инструментом с погрешностью, ошибка тем больше, чем меньше измерений. Поэтому я взял старый советский учебник «Теория измерений» и посмотрел формулы оттуда. Каждый пользователь фактически измеряет качество контента. Поэтому чем больше таких измерений, тем более справедливо будет оценена статья.
В итоге я использовал сигмоидную функцию, где K — подстроечный коэффициент (0.05), а Npeople— число проголосовавших людей.

Примерно при 70 голосах он уже почти достигает 1. Как вы поняли, это асимптотический график.
Есть ещё один неожиданный вывод из этого подхода к набору нужного числа голосов для справедливой оценки: мы должны показывать в ленте даже ролики с отрицательными оценками до тех пор, пока не наберётся некое число людей, которое скажет нам, что оценка более-менее достоверна.
А все ли люди делают одинаково точные оценки?
Конечно, нет. Более-менее точно человек может оценить того, кто рядом с ним по уровню. Например, более-менее точно я могу оценить математический уровень своего более талантливого одноклассника; он — уровень победителя олимпиады по стране; тот — учёного; учёный — академика; а академик — Перельмана, работы которого понимают (условно) пять человек во всём мире.
Подобную иерархическую схему ещё предлагал Циолковский, когда люди выбирают старшего по подъезду, те — старшего по дому, те — старшего по району. И так до руководителя известных галактик. В те времена идея власти советов на всех уровнях была горячей темой.
Мне показалось, что это явно перебор для развлекательного сайта, где для пользователей очень важно количество оценок, поэтому настолько продвинутую схему не стал разрабатывать. Тем более в ней есть уязвимости — люди с сильными голосами могут заболеть и контент может не набрать заслуженный им рейтинг.
Применительно к Хабру подобная схема бы означала, что за контент маститых авторов должны голосовать только маститые. И не факт, что это бы сработало. Эксперты могут завидовать друг другу, специально не оценивать статьи других авторов, чтобы занять позицию в рейтинге повыше. И статья от эксперта, даже с массой тонких неточностей, может принести пользу обычным людям, которые вообще не обладают экспертностью в этой сфере.
Сами оценки
Любой человек может оценить что-то не только по принципу «чёрное/белое», поэтому в движке используются оценки от -127 до +127. На фронтенде вначале даже были, если не ошибаюсь, оценки от -5 до +5. Но потом всё быстро скатилось к «плюсу» и «минусу» — «+1» и «-1» (в движке это записывается как «+127» и «-127»). Для пользователей развлекательного сайта это оказалось оптимальным.
В дальнейшем «минусы» убрали (не я), остались только «плюсы». Как понимаю, во избежание войн пользователей между собой — чтобы уменьшить токсичность среды. Лично мне это не нравится, но, возможно, владельцу сайта было виднее.
Рейтинг пользователей
Условно пользователи имеют рейтинг от -100 до +100. Где с отрицательным рейтингом злодеи и вредные персонажи, а с положительным — полезные. У вредных персонажей с рейтингом <= 0 нет возможности голосовать.
Сила голоса
На самом деле это логарифм от рейтинга. Даже если пользователи отличаются по рейтингу в 10 раз, то по силе голоса всего в 2 раза. Показалось справедливым, и результаты тестирования подтвердили, что именно рейтинг, пропущенный через логарифм, сохраняет баланс и власть у обычных пользователей.
Максимально человек может иметь силу голоса, равную 32. Условно, максимум голос суперполезного человека может стоить как 32 голоса обычных пользователей.
Но из-за временной инфляции и трудности набора большого числа голосов обычно максимальная сила голоса не более 5.
В принципе рейтинг и сила голоса дублируют друг друга. Поэтому у меня была мысль убрать рейтинг пользователей с сайта, а оставить только рейтинг по силе голоса. Но я переключился на другие проекты, и это до сих пор не сделано.
В чём равны бомж и академик?
Были сделаны абсолютно одинаковые лимиты на число голосов в сутки для всех пользователей. Насколько я помню, из соображений того, что если пользователям с прокачанной силой голоса ещё дать дополнительное число голосований, то это испортит баланс. И так полезность пользователя отражается в его силе голоса.
Анонимность
На Хабре мне не нравилось, что минусаторы чаще всего делают это исподтишка, не объясняя причин. Поэтому на «Очевидце» должна была быть возможность посмотреть, кто и как голосовал за ролик.

Более того, изначально нельзя было поставить минус без объяснения причины. Можно было выбрать одну из причин, уже указанных другим пользователем.
Просто поставить минус — это не особо улучшало сайт. А вот поставить минус и написать комментарий — это давало новый контент и обратную связь автору контента.
Интересно, что после введения этого правила число минусов резко сократилось.
В дальнейшем (после того, как я вышел из разработки) была убрана вначале обязанность указывать причину минуса, а потом и сами минусы. А вот открытость голосования осталась до сих пор.
Борьба с накрутками
Пользователи А и Б могут голосовать друг за друга, таким образом увеличивая взаимно рейтинг. Может быть и более сложная схема — «треугольник». «А» → «Б» → «B» → «А». В теории могут быть накруточные квадраты, пятиугольники и т. д.
Кроме наличия самого цикла, есть ещё критерии — близость оценок во времени и другие.
В порыве решить задачу в общем случае я сделал решение, которое отслеживает схемы вплоть до восьмиугольников. Добился нахождения голосований-шестиугольников среди десятков тысяч единиц контента за 1,8 секунды, 7-угольников — 23 секунды и для 8-угольников — 435 секунд.
В итоге я был немало удивлён.
Все знают теорию 6 рукопожатий, которая гласит, что все люди на планете знакомы друг с другом не более чем через 6 рукопожатий.
Так вот для сайта с десятками тысяч пользователей, если за рукопожатие считать факт оценки, то можно придумывать теорию 3 оценок. В итоге оказалось, что имеет смысл отслеживать только взаимное голосование. Так как через ~3 оценки все пользователи оказались связаны между собой.
Был написан скрипт, который запускался по cron и удалял такие взаимные голоса. Это было сделано для того, чтобы накрутчики думали, что они выполнили свою задачу, и не придумывали новых схем. А потом незаметно их голоса удалялись.
Источник справедливости
Оказалось, что если систему рейтинга запустить в свободное плавание, то голоса смещаются в сторону самой активной прослойки тесно связанных какими-то узами пользователей сайта. Может, это были какие-то одноклассники, может, люди из какой-то гильдии — которых, сюрприз, больше, чем админов. И они начинают задавать тон на сайте — но не в ту сторону, в которую хочет его задать владелец.
Поэтому пришлось ввести абсолютную ценность силы голоса для админов в начале каждого цикла пересчёта. И голоса, отданные админами, наделяют силой других пользователей — а те, в свою очередь, третьих, потом четвёртых и так далее. Сила расходится, как круги по воде. Пользователи могут голосовать против админов, и эти голоса учитываются, но в начале каждого следующего цикла пересчёта голосов сила админов восстанавливается из божественного источника (константы в скрипте) и они вновь оказываются источниками силы.
А нужно было городить огород?
Как вы заметили, в рейтинге используется масса параметров, возможно излишних для развлекательного сайта. С практической точки зрения, в этом, может быть, и не было смысла. Но мне хотелось решить задачу идеально — посмотреть, что это даст.
Да, продвинутая система не стала киллер-фичей. Она не дала такого громадного выигрыша для коллективного блока, как просто хоть какая-то рейтинговая система по сравнению с её отсутствием. Но в истории сайта она стала «фишкой» и сыграла свою роль.
Конец первой части. Во второй мы поговорим, как это всё было сделано на хранимых процедурах и запросах в MySql.
© 2025 ООО «МТ ФИНАНС»