Работали ли вы с проектированием архитектуры ПО на C++?

«Работали ли вы с проектированием архитектуры ПО на C++?» — вопрос из категории Архитектура, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, участвовал в проектировании и реализации различных архитектурных стилей для C++ систем.

1. Многослойная (Layered) архитектура в монолите: В большом desktop-приложении мы разделяли код на слои:

  • Data Layer: Работа с БД через абстракции (использовали ORM вроде ODB или собственные DAO).
  • Business Logic Layer: Ядро на C++ с строгими инвариантами.
  • Presentation Layer: GUI на Qt, который общался с логикой через интерфейсы (абстрактные классы) и модель данных. Это упрощало тестирование (логика не зависела от GUI) и поддержку.

2. Событийно-ориентированная архитектура (EDA): В high-frequency trading системе использовали Boost.Asio для асинхронного ввода-вывода. Компоненты обменивались сообщениями через внутреннюю шину событий (in-memory).

// Упрощенный пример обработчика события
class MarketDataHandler {
public:
    void on_tick(const TickEvent& event) {
        // Асинхронная обработка тика
        strategy_->evaluate(event);
    }
private:
    std::unique_ptr<TradingStrategy> strategy_;
};

3. Микросервисная архитектура: C++ микросервисы общались по gRPC (для низкой задержки) или REST API (через библиотеку вроде cpp-httplib). Каждый сервис был отдельным CMake-проектом, что позволяло независимо развертывать и масштабировать вычислительно нагруженные модули (например, сервис риск-менеджмента).

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