Почему вы использовали самописную библиотеку вместо готовой?

Ответ

В моем опыте на проекте по обработке финансовых данных в реальном времени мы приняли решение разработать собственную библиотеку сериализации бинарных протоколов. Существующие решения, такие как Protocol Buffers или FlatBuffers, не полностью удовлетворяли нашим ключевым требованиям.

Причины и обоснование:

  1. Экстремальные требования к производительности и нулевым накладным расходам: Наш протокол должен был обрабатывать десятки тысяч сообщений в секунду с минимальной задержкой. Готовые библиотеки добавляли overhead на динамическое выделение памяти, виртуальные таблицы и избыточные проверки.

    • Наше решение: Мы использовали шаблонную метапрограмму на C++17 для генерации кода сериализации/десериализации на этапе компиляции.
      // Пример идеи (упрощенно): структура описывает сообщение.
      struct TradeMessage {
      int64_t timestamp;
      double price;
      int32_t volume;
      char symbol[8];
      };
      // Специализированный шаблонный сериализатор генерирует оптимальный код.
      auto bytes = BinarySerializer<TradeMessage>::pack(trade);
  2. Специфичный, жестко заданный формат данных: Мы работали с legacy-системой, которая использовала проприетарный бинарный формат с особым порядком байт и упаковкой полей. Интеграция сторонней библиотеки потребовала бы слоя адаптера, усложняющего систему и снижающего производительность.

  3. Минимизация зависимостей: Проект должен был развертываться в изолированной среде с жесткими требованиями к безопасности. Добавление крупной сторонней зависимости увеличивало бы поверхность атаки и сложность обновлений.

  4. Полный контроль и оптимизация под железо: Мы смогли использовать специфичные инструкции процессора (например, SSE для копирования блоков памяти) и оптимизировать алгоритмы под наши паттерны доступа к данным.

Компромиссы и вывод: Разработка собственной библиотеки — это значительные затраты на проектирование, реализацию и, что критично, тестирование. Мы оправдали эти затраты, потому что выигрыш в производительности и предсказуемости был ключевым для бизнес-логики продукта. В большинстве же случаев я предпочитаю использовать проверенные, поддерживаемые сообществом решения, такие как Boost или библиотеки из STL.

Ответ 18+ 🔞

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

Почему мы так решили, или Ёб твою мать, требования:

  1. Производительность, блядь, овердохуища. Нам нужно было гонять десятки тысяч сообщений в секунду, с задержкой, стремящейся к нулю. А эти библиотеки, сука, добавляют свою лапшу: память там динамически тырят, проверки лишние делают — в общем, жрут ресурсы как не в себя.

    • Что выдумали: Взяли и накодили на C++17 такую шаблонную метапрограмму, которая на этапе компиляции генерирует код для упаковки и распаковки. Полная магия, но без накладных расходов.
      // Грубо говоря, выглядело это так:
      struct TradeMessage {
      int64_t timestamp;
      double price;
      int32_t volume;
      char symbol[8];
      };
      // А этот шаблонный урод потом из этого на компиляции идеальный код высирает.
      auto bytes = BinarySerializer<TradeMessage>::pack(trade);
  2. Формат данных — просто пизда рулю. Работали мы со старой системой, у которой свой, ебанутый, бинарный формат: там байты в особом порядке, поля упакованы хитрожопым образом. Подгонять под это готовые библиотеки — это ж ещё один слой абстракции написать, который всё тормозил бы.

  3. Зависимости — терпения ноль ебать. Проект крутился в изолированной банковской среде, где каждая лишняя библиотека — это потенциальная дыра в безопасности и головная боль при обновлении. Нахуй надо было тащить за собой овердохуище чужого кода?

  4. Контроль полный, как у параноика. Раз пишем сами, значит, можем выжимать всё до последнего цикла: засунуть специфичные инструкции процессора, оптимизировать под наши конкретные данные. Чувствуешь разницу? Не адаптироваться под чужой инструмент, а сделать инструмент под себя.

Что в итоге, чувак? Писать свою библиотеку — это, конечно, ебать колотить, сколько времени уходит. Проектировать, кодить, и главное — тестировать, тестировать и ещё раз тестировать, потому что доверия ебать ноль к свеженаписанному коду. Мы на это пошли, потому что выигрыш в скорости был критически важен для бизнеса. Но это исключение, ёпта. В 95% случаев лучше взять проверенную, обкатанную библиотеку из Boost или STL и не выёбываться. А тут просто случай был — хитрая жопа.