Представь очередь. В ней все, кто когда-либо жил на Земле — от первого человека до ребёнка, родившегося минуту назад. Очередь длиной примерно в сто семнадцать миллиардов. Где-то в ней стоишь ты. Место у тебя есть с рождения, его никто не отнимет и не отдаст другому. Просто до сих пор никто его не называл.

Я наткнулся на это случайно.Нашёл у демографов из Population Reference Bureau: к 2022 году за всю историю родилось примерно 117 миллиардов человек. Живых сейчас восемь с третью. Остальные без малого сто девять — это и есть история человечества.
Раз всех можно посчитать, у каждого есть номер. Порядковый. Его надо просто назвать.
Как считается номер
Номер зависит только от даты рождения. Одна и та же дата всегда даёт одно и то же число — хоть на сервере, хоть на бумаге. Никто номер не выдаёт: его можно посчитать для любой даты, даже для той, которая ещё не наступила. У человека, который родится через год, номер уже есть — просто пока некому его назвать.
Внутри — таблица из пятидесяти точек: к такому-то году родилось столько-то людей суммарно. Прошлое — тридцать восемь точек — из одной публикации демографов 2022 года. Ещё двенадцать уходят в будущее, до 3400 года: это уже не данные, а проекция с предположением о снижающейся рождаемости, и в коде так и написано. Расставлены неровно: на 1950–2022 приходится двадцать девять, на все предыдущие двести тысяч лет — девять. Про недавних людей известно куда больше, чем про остальных.

Между соседними точками считаем по прямой:
function interpolate(year: number): number { for (let i = 0; i < ANCHORS.length - 1; i++) { const a = ANCHORS[i]!, b = ANCHORS[i + 1]!; if (year >= a.year && year <= b.year) { const t = (year - a.year) / (b.year - a.year); return a.cumulative + t * (b.cumulative - a.cumulative); } } return 0; }
Можно было вести плавную кривую. Не стал: между густыми современными точками разницы почти нет, а между редкими древними кривая нарисует изгибы, которых никто не измерял. Прямая честно отдаёт то, что написано в таблице.
Внутри года место определяет доля прошедших дней:
const fraction = dayOfYear / daysInYear(year); const number = Math.round(yearStart + fraction * (yearEnd - yearStart));
Чем дальше дата от двадцатого века, тем хуже мы знаем ответ, и сайт пишет об этом рядом с номером:
после 1900 → разброс в тысячу раньше 1900 → разброс в 50 миллионов раньше 1500 → разброс в 500 миллионов до нашей эры → разброс в 2 миллиарда
Две таблицы, склеенные в одну. Сначала древние века я взял из старой публикации демографов, а итог — из новой. Числа же про одно и то же. Но десять миллиардов древних рождений, которых в старой не было, никуда не делись — они распределились по ближайшим точкам, то есть по годам с 1990 по 2026. Получалось, что сейчас рождается до 550 миллионов человек в год при настоящих ста тридцати двух.
Пришлось собрать таблицу заново, целиком по одной публикации. Счётчик при этом один раз уменьшился на четверть миллиарда.
Год «50» оказался 1950-м. В JavaScript есть стандартный способ собрать дату из года, месяца и дня. Если дать ему год 50, он поймёт это как 1950-й, а не как пятидесятый год нашей эры: так решили в девяностых, и с тех пор это живёт в языке.
// НЕ Date.UTC(year, 0, 1): для годов 0–99 Date.UTC маппит их в 1900–1999 const yearStart0 = new Date(0); yearStart0.setUTCFullYear(year, 0, 1);
Анонимность
Номер сам по себе — красивая цифра. Чтобы она что-то значила, вокруг неё нужны люди, занятые чем-то вместе. Любой участник задаёт вопрос про то, что решится на днях, реестр отвечает, а когда жизнь даёт свой ответ — видно, как думали люди.
Чтобы это работало, ответы должны быть анонимными не на словах. «Мы не передаём ваши данные» — это политика, а политику отменяют одним решением. Мне хотелось, чтобы анонимность держала сама база.
CREATE TABLE votes ( -- ответы poll_id UUID NOT NULL, -- на какой вопрос option_id UUID NOT NULL, -- какой вариант выбран country_code CHAR(2) NOT NULL, voted_at TIMESTAMPTZ NOT NULL ); CREATE TABLE poll_participations ( -- кто уже отвечал user_id UUID NOT NULL, poll_id UUID NOT NULL, PRIMARY KEY (user_id, poll_id) );
В таблице ответов нет колонки с человеком. Не пустая — её там нет. Во второй человек есть, но нет выбранного варианта: она нужна, только чтобы нельзя было ответить дважды. Она знает, что ты участвовал, но не знает, что ты выбрал. Внутри этих двух таблиц связать одно с другим нечем — кроме одной нити, о которой ниже. В настоящей таблице ответов есть ещё код континента; ничего, что указывает на человека, там нет.
Ещё время ответа при записи сдвигается на случайные секунды в пределах полуминуты. Иначе два ответа, пришедшие в одну секунду, совпали бы по времени с двумя записями об участии, и анонимность развалилась бы через часы. Со стороны участия то же: дата участия хранится с точностью до дня.
Сами таблицы закрыты от обычных ролей базы. Наружу торчат функции и одно представление, которые умеют посчитать и вернуть итог, но не умеют отдать строки.
Порог, который выглядел защитой. Разрез по странам открывается, только если в стране ответили хотя бы пятьдесят человек — иначе получается: «в маленькой стране ответили трое, и один из них ты».
Дыра видна, если написать её числами: сорок девять против одного. Порог пройден, а единственный человек выделен полностью. Пришлось добавить второе условие — хотя бы пять ответов в каждом варианте.
WHERE ct.total >= 50 AND ct.min_bucket >= 5;
Порог на общей сумме не защищает меньшинство внутри суммы. Очевидно, когда скажешь вслух, и незаметно, пока написано одним неравенством.
Граница, которую называю сам
Я не говорю, что связь человека с ответом «невосстановима». Это слишком громкое слово для любого сайта, у которого есть сервер.
Внутри базы одна нить всё же есть, и я назову её сам. Запись об участии и запись ответа рождаются в одной транзакции, а Postgres помечает обе строки её номером. Пока этот номер не перезаписан обслуживанием таблиц, человек с правами суперпользователя может сложить их вместе. Снаружи остаются логи платформы, на которой крутится сайт: обычные записи веб-сервера о запросах. Я ими для такого сопоставления не пользуюсь, но сказать «невозможно» не могу. Вот и вся граница.
Так честнее, чем написать «полная анонимность» и надеяться, что не спросят.
Ставки без денег
На свой ответ можно поставить баллы (на спортивных — и без ответа). На обычных вопросах коэффициент начинается с равных шансов, а когда ответов набирается пятьдесят, складывается из того, как ответили остальные. На спортивных беру его с открытого рынка — пока руками, автомат для этого написан, но ещё не включён — и убираю заработок букмекера: у любой конторы сумма шансов чуть больше ста процентов, эта добавка и есть её доход. Я возвращаю сумму к ста, чтобы число измеряло мнение, а не чужую прибыль. Денег в этом нет: баллы не переводятся между людьми и не превращаются в приз.
Ещё формулировка вопроса и условие исхода замерзают после первого ответа. Человек отвечал на конкретный вопрос с конкретным правилом — менять их потом значит переписывать договор с ним. Условие исхода стережёт триггер в самой базе; формулировку — единственная функция, через которую её можно править. Интерфейс тут ни при чём.
Письма тем, кто ещё не родился
Написать письмо в будущее можно много где. А конкретному человеку, который ещё не родился, было нельзя: непонятно, кому. Теперь у будущего человека есть адрес — его номер.
Письмо адресуется номеру, а не почте или имени, и ждёт своей даты. Если номер за год после неё так и не заняли, письмо истекает — вечных писем я не обещаю. Это единственная часть сайта, где номер нужен не тебе, а кому-то другому.

Про номера у людей
Мне уже говорили: номера у людей — так себе идея. Я так не думаю. Номер ничего не заменяет и не отнимает, ни имени, ни лица. Он называет место, которое у тебя есть с первого дня. Мы считаем года. Считаем историю. Считаем население. Странно было бы не посчитать людей.
Свой номер можно посмотреть по дате рождения: papanumbers.com. Из России сайт открывается через VPN — сервер за блокировкой, зеркала пока нет.
Комментарии (14)

domix32
18.09.2026 09:06Номер ничего не заменяет и не отнимает, ни имени, ни лица.
Оно бы имело смысл, если б был какой-то глобальный реестр с субсекундной точностью, ибо в день добавляется по 300к человек по всей планете, то бишь по ~5 человек в секунду. А так общий номер будет получен огромной кучей людей.

faunderus Автор
18.09.2026 09:06Про «огромную кучу людей» — на расчёте так, на выдаче нет. Расчёт по дате и времени даёт основание; закрепляется ближайший свободный номер, и уникальность держит база — дважды один номер не выдаётся. Время рождения при этом учитывается: час — это около 12 тысяч позиций, минута — примерно двести. Точность ограничена данными, а не арифметикой. Демографическая оценка идёт с погрешностью порядка тысячи позиций для современных дат.Номер честно отвечает на вопрос «сколько людей примерно жило до тебя». Реестра с субсекундной точностью нет, и я его не обещал.
Если нужна аналогия — Менделеев. Его таблица работала не потому, что все клетки были заполнены: часть элементов ещё не нашли, а места под них уже стояли, и это не делало таблицу выдумкой. Место задавалось правилом. Здесь то же самое: правило — накопленное число рождений по демографической оценке, а не журнал регистрации.

domix32
18.09.2026 09:06Реестра с субсекундной точностью нет, и я его не обещал.
Его ни у кого нет и быть не может, если вы не буквальный бог какой-нибудь. И под глобальным я имел ввиду реестр всея человечества.

faunderus Автор
18.09.2026 09:06В моем прошлом ответе написано: накопленное число рождений по демографической оценке, а не журнал регистрации. Ученые не боги и я на такой статус не претендую.

Akon32
18.09.2026 09:06Эээ... Нет.
Не было "первого человека", нет такой единственной мутации, которая переключает вид из Homo Erectus в Homo Sapiens. Новый вид появляется плавно, и начало выделить невозможно. Ну если только не считать от Адама и Евы.
Кроме этого, невозможно достоверно определить последовательность рождения людей, т.к. где-то могут быть незарегистрированные случаи. К тому же, рождение не фиксируется с точностью до секунды, чтобы можно было достоверно ранжировать людей по времени.
В итоге в этой вашей "последовательности" нет ни начала, ни следующего элемента.

faunderus Автор
18.09.2026 09:06Всё верно, и я не спорю. «Первого человека» нет — в таблице PRB нижняя точка стоит на −190 000 как соглашение, а не как факт рождения кого-то конкретного; я это называю в статье прямо. Последовательность рождений действительно не восстановима.Cегодня в мире около 300 тысяч рождений в сутки и до секунды их никто не фиксирует.
Поэтому номер — не позиция в достоверной очереди, а значение функции от даты рождения на опубликованной демографической оценке. Для одной даты оно одинаково у всех, кто в этот день родился, и это не дефект расчёта — это его граница.

Gutt
18.09.2026 09:06Про первое. Очевидно, общее число рождений в начале истории Homo Sapiens Sapiens было ничтожным по сравнению с накопленным позже числом рождений: даже если считать по верхней границе численности в 100 000 особей на протяжении 300 000 лет, то с использованием современных данных о среднем количестве рождений на особь в обществах охотников и собирателей получаем до 1,2 млрд рождений, что лишь 1 % от накопленного количества рождений до сегодняшнего дня. Для использованного метода кусочно-линейной интерполяции "от балды" это намного меньше, чем погрешность, вносимая такой интерполяцией.

faunderus Автор
18.09.2026 09:06Ну если не согласны с выводами и данными что же делать)я други не нашел

Tired_pilot
18.09.2026 09:06Нейронка отвечает ответами, сгенерированными нейронкой на комментарии к статье, написанной нейронкой.

faunderus Автор
18.09.2026 09:06Я продолжу, к проекту сделаный нейронкой, про людей на нейронках совметно с нейронками) хочешь честно? статью сам написал, отредактировал нейронкой, отправил на хабр - завернули , написали типо мало технических данных, тогда уже отредактировали и добавили технические моменты!Проект Я придумал, статью я пиcал, в коментах я отвечаю.

faunderus Автор
18.09.2026 09:06И еще продолжение- нейронка рекомендовала статью тут размещать , я не програмист, и это мой первый проект
bigtrot
Начал читать статью и с самого начало не понял. Что такое точка? Почему пятьдесят точек? Как эти точки покрывают года рождения людей? Исходя из этого дальнейшие изложения не понятны.
faunderus Автор
Объяснил видимо не совсем точно. Коротко: демографы (PRB, UN WPP) публикуют оценки «сколько людей родилось всего» на отдельные моменты истории. Условно: 1900 год — 100 миллиардов, 1950 — 106, 2000 — 114, 2026 — 117,6. Это не мои выдумки, такие оценки публикуют демографы (PRB, UN WPP). Вот эти пятьдесят пар «год - накопленное число рождений» я и называл точками . Между ними я считаю линейно, поэтому дата рождения превращается в число: сколько людей родилось до тебя.