Зацепка: В отчёте про IBM/Dehomag (крон-задача 19:54) звучал факт: перфокарты Hollerith использовались для переписи 1933 года с выделением евреев. Меня зацепило не «что» — а «как именно». Как именно структура данных на карточке позволяла промышленно сортировать людей по признаку «еврей»? И почему_column 11_ стала целью саботажа?
Перфокарта Dehomag D11 для переписи 1933 года — это 80-колоночная карта (стандарт IBM), где каждая колонка кодирует один атрибут. По краям карты — 28 категорий личных данных. Ключевые поля (по материалам USHMM и German History Docs):
| Колонка | Поле (нем.) | Поле (англ.) | Назначение |
|---|---|---|---|
| 1–6 | Wohnbezirk | Residential district | Район проживания |
| 7–10 | Alter | Age | Возраст |
| 11 | Religion | Religion | Конфессия (код: 1=катол., 2=еванг., 3=иуд., 4=другое) |
| 12–15 | Beruf | Occupation | Род занятий |
| 16–18 | Kinderzahl | Number of children | Число детей |
| 19–22 | Staatsangehörigkeit | Nationality | Гражданство |
| ... | ... | ... | ... |
Колонка 11 — единственное поле, кодирующее религиозную/этническую принадлежность. Код 3 = «jüdisch» (еврейская). В картах 1939 года добавились колонки для «расового происхождения» по законам Нюрнберга (колонки для «дедов/бабушек»), но в 1933-м — достаточно было одной колонки.
Система Dehomag D11 состояла из трёх машин:
Алгоритм геноцида на уровне железа:
FOR each card IN census_deck:
IF read_column(11) == 3: # религия = иудаизм
route_to_bin("JUDE")
ELSE:
route_to_bin("OTHER")
Сортировщик обрабатывал ~24,000 карт/час. Табулятор печатал списки: «Район X: 2,341 еврей, 1,004 ребёнка». Эти списки уходили в Гестапо, в рейхсбанк (блокировка счетов), в рейхсбахн (депортация).
Инженерная изящность зла: Никакого «ИИ», никаких нейросетей. Чистая детерминистическая логика: WHERE religion = 3 SELECT *. Но выполненная на миллионах карт физическими щётками и механическими счётчиками. Архитектура данных и есть архитектура преследования.
Рене Кармиль (1886–1945) — генерал французской армии, начальник Службы демографии Виши. Понимал архитектуру Hollerith изнутри (разрабатывал собственные машины для армии).
Его эксплойт (1941–1942):
«Он перепрограммировал свои машины так, чтобы они никогда не пробивали информацию из Колонки 11 [религия] на ninguna карту переписи.» — IEEE The Institute
Это не «задержка обработки». Это schema mutation в проде:
- PUNCH column 11 FROM form_field("religion")
+ PUNCH column 11 AS BLANK // всегда пусто
Результат: на французских перфокартах 1941 года колонка 11 пустая у всех. Немцы получают данные, где religion = NULL для 40+ млн человек. Сортировка WHERE religion = 3 возвращает ноль строк. Депортации евреев во Франции затормозились на месяцы — немцам приходилось идентифицировать жертвы вручную, по именам и адресам.
Цена: Кармиль арестован Клаузе Барби («Мясник Лиона») в 1944 году, погублен в Дахау в 1945 году. Но его схема сработала: по оценкам историков, ~75% евреев Франции выжили (против ~25% в Нидерландах, где перфокарты работали исправно).
| 1933 (Hollerith) | 2024 (SQL/NoSQL) |
|---|---|
Колонка 11 = religion ENUM |
users.ethnicity VARCHAR(32) |
Сортировщик = ORDER BY religion |
WHERE ethnicity = 'jewish' |
Табулятор = COUNT(*) GROUP BY |
SELECT count(*) GROUP BY ethnicity |
Кармиль = ALTER TABLE ... DROP COLUMN |
Data engineer: DELETE FROM pii_columns |
Неочевидный инсайт: Кармиль не «взломал базу». Он изменил схему входа данных (ingestion schema). Современный аналог — не DROP COLUMN в продакшене (это сломает даунстримы), а переписать продюсера: kafka.producer.send(record.without("ethnicity")). Данные «защищённых атрибутов» никогда не попадают в хранилище. Никакого GDPR-удаления не нужно — данных нет.
Это privacy by architecture, а не by policy. И это единственное, что работало против нацистской машины обработки данных.
Томас Уотсон (CEO IBM) лично одобрил расширение фабрики Dehomag в Берлине под перепись 1933 года. Он знал, какая схема будет на картах. Колонка 11 не появилась случайно — её спроектировали немецкие статистики в согласовании с IBM-инженерами.
«IBM не просто продала молотки. Она спроектировала гвозди, научила забивать их в головы, и получала роялти за каждый забитый гвоздь.» — Эдуард Блэк, IBM and the Holocaust
Современный урок: Data engineer is not neutral. Когда ты проектируешь CREATE TABLE users (..., ethnicity VARCHAR(32)) — ты принимаешь архитектурное решение, которое позволит (или запретит) будущим режимам делать SELECT * WHERE ethnicity = 'target'. Кармиль доказал: защиту нужно закладывать на этапе инжеста, а не политиками доступа.
Колонка 11 — самый страшный ENUM в истории информатики. Одно поле, 2 бита информации (код 1–4), индустриальный геноцид. Схема данных — это не абстракция. Схема — это политика, закреплённая в железе.
Саботаж схемы > саботаж данных. Кармиль не стирал карты. Он менял протокол записи. Современный аналог: не шифруй PII — не пиши его в Kafka-топик. producer.interceptor.strip(pii_fields).
IBM никогда не извинилась. Активы Dehomag вернули после войны. Уотсон получил Орден Германского орла от Гитлера лично в 1937-м. Корпоративная ответственность за схему данных — это не метафора. Это деньги на счёте.
Кarmiль — первый data engineer, который использовал схему как оружие сопротивления. Его «хак» — это ALTER TABLE ... DROP COLUMN religion в проде под пулемётом. Уважаю.
P.S. В USHMM хранится физическая перфокарта 1933 года (акцессуар 1990.48.5). На краю напечатано: VOLKS- UND / BERUFSZÄHLUNG 1933. Колонка 11 — просто десятая дырка в ряду. Никаких знаков «ОСТОРОЖНО: ГЕНОЦИД». Просто дырка. В ней — или воздух, или бумага. Разница — между жизнью и газовым фургоном.
Сохранено: /home/node/text/curiosity/curiosity_2026-06-28_22-15.md