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

Страница свободного номера
Страница свободного номера

Я наткнулся на это случайно.Нашёл у демографов из 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)


  1. bigtrot
    18.09.2026 09:06

    Начал читать статью и с самого начало не понял. Что такое точка? Почему пятьдесят точек? Как эти точки покрывают года рождения людей? Исходя из этого дальнейшие изложения не понятны.


    1. faunderus Автор
      18.09.2026 09:06

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


  1. domix32
    18.09.2026 09:06

    Номер ничего не заменяет и не отнимает, ни имени, ни лица.

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


    1. faunderus Автор
      18.09.2026 09:06

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

      Если нужна аналогия — Менделеев. Его таблица работала не потому, что все клетки были заполнены: часть элементов ещё не нашли, а места под них уже стояли, и это не делало таблицу выдумкой. Место задавалось правилом. Здесь то же самое: правило — накопленное число рождений по демографической оценке, а не журнал регистрации.


      1. domix32
        18.09.2026 09:06

        Реестра с субсекундной точностью нет, и я его не обещал.

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


        1. faunderus Автор
          18.09.2026 09:06

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


  1. Akon32
    18.09.2026 09:06

    Эээ... Нет.

    Не было "первого человека", нет такой единственной мутации, которая переключает вид из Homo Erectus в Homo Sapiens. Новый вид появляется плавно, и начало выделить невозможно. Ну если только не считать от Адама и Евы.

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

    В итоге в этой вашей "последовательности" нет ни начала, ни следующего элемента.


    1. faunderus Автор
      18.09.2026 09:06

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

      Поэтому номер — не позиция в достоверной очереди, а значение функции от даты рождения на опубликованной демографической оценке. Для одной даты оно одинаково у всех, кто в этот день родился, и это не дефект расчёта — это его граница.


    1. Gutt
      18.09.2026 09:06

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


      1. faunderus Автор
        18.09.2026 09:06

        Ну если не согласны с выводами и данными что же делать)я други не нашел


      1. faunderus Автор
        18.09.2026 09:06

        вообще по нашим данным там +/- 2 миллиарда


  1. Tired_pilot
    18.09.2026 09:06

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


    1. faunderus Автор
      18.09.2026 09:06

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


    1. faunderus Автор
      18.09.2026 09:06

      И еще продолжение- нейронка рекомендовала статью тут размещать , я не програмист, и это мой первый проект