Protobuffers Are Wrong (2018) 💬 Длинная дискуссия
Почему Protobuf плохи
Protobuf — это любительская, непродуманная технология, созданная для задачи, которую в действительности имеет только Google. Их главная беда — убогая типовая система: нет композиции, куча произвольных запретов (oneof
нельзя повторять, map
нельзя параметризовать, ключ map
не может быть bytes
или enum
и т.д.). Всё это — следствие донавешивания фич «как получится» вместо проектирования.
Достаточно трёх простых конструкций: обязательные поля (произведение типов), oneof
как отдельная копроизводная и параметрические типы. На них можно выразить optional
, repeated
, map
без всяких хаков.
Ещё protobuf разделяет «скаляры» и «сообщения». Скалярные поля всегда «есть»: даже если ты их не заполнял, они инициализируются нулём/пустой строкой. Отличить «поле не прислали» от «прислали 0» невозможно — источник багов и лишних костылей.
Комментарии (231)
- Критика protobuf сводится к «плохо, но альтернатив ещё хуже»: ни одна другая схема не даёт таких же гарантий обратной совместимости + встроенный линтер.
- Главные боли: нулевые значения неотличимы от «не установлено», нет композиции/алгебраических типов, oneof и repeated ограничены, инструментарий (protoc) громоздок.
- Часть проблем — культурное наследие Google: «не давать пользователю обобщений, зато добавить 100 специальных случаев».
- Реальный совет: использовать protobuf только как быстрый бинарный wire-формат, а внутри приложения держать свою доменную модель и писать явные конвертеры.
- Живые альтернативы обсуждаются (Avro, FlatBuffers, Cap’n Proto, JSON+схема), но у каждой свои компромиссы; серебряной пули пока нет.
MapLibre Tile: A next generation geospatial format optimized for rendering
MapLibre Tile — новый формат векторных тайлов, призванный заменить Mapbox Vector Tile (MVT).
Основные цели:
- меньше размер (до 50 % экономии);
- быстрее парсинг (до 2× ускорения);
- простота реализации без внешних зависимостей.
Ключевые улучшения
- FlatBuffers вместо Protocol Buffers → компактнее и без распаковки.
- структурированные слои: геометрия, атрибуты, индексы — отдельные буферы, что ускоряет выборку.
- delta-кодирование координат и ID → ещё меньше байт.
- встроенный R-tree для быстрого поиска объектов в тайле.
Совместимость
- Поддержка JS, C++, Swift, Kotlin.
- Рендерится в MapLibre GL JS ≥ 5.0 без изменений API.
- Обратная совместимость: конвертер MVT → MLT доступен.
Roadmap
Q4 2024 — стабильная спецификация, конвертеры, примеры.
Комментарии (11)
- Участники рады ускорению декодирования и уменьшению размера тайлов, но опасаются сложности внедрения вне MapLibre.
- Некоторые считают, что узкое место не в загрузке/декодировании, а в памяти и рантайме при множестве слоёв.
- Уже ведётся работа над MapLibre GL JS/Native (Java, JS, Rust, TS); CLI-кодировщик почти готов.
- Ожидается интеграция с Planetiler и, возможно, форк tippecanoe; документация и анонсы через новостную рассылку MapLibre.