Ты начинал разработку с нуля или присоединялся к готовому проекту на прошлой работе?

Ответ

В моем опыте были оба сценария, и каждый ценен по-своему.

Разработка с нуля (Greenfield): На одном из проектов я создавал с нуля сервис обработки геоданных на C++17. Мои задачи включали:

  • Выбор архитектуры (микросервисы vs монолит) и стека технологий (Boost.Asio для сетевого I/O, Protobuf для сериализации).
  • Настройка системы сборки с помощью CMake и CI/CD пайплайна в GitLab.
  • Проектирование ядра приложения с акцентом на расширяемость и тестируемость.

Пример начальной структуры:

// Core.h - основа нового сервиса
class DataPipeline {
public:
    DataPipeline(const Config& config);
    void start();
    void processBatch(const std::vector<GeoPoint>& points);
private:
    std::unique_ptr<NetworkService> network_; // PIMPL идиома для скрытия деталей
    ThreadPool workers_;
};

Присоединение к существующему проекту (Brownfield): На другой позиции я вошел в крупный legacy-проект игрового движка. Там я:

  • Проводил анализ и рефакторинг "спагетти-кода", внедряя современные идиомы C++ (RAII, умные указатели).
  • Интегрировал новые модули (например, систему воксельной геометрии) в устоявшуюся, но сложную архитектуру.
  • Работал с унаследованным кодом, написанным на C++03, постепенно модернизируя его до C++17 стандарта.

Я гибко адаптируюсь к любой ситуации, будь то создание новой архитектуры или эффективная работа в рамках существующей.

Ответ 18+ 🔞

А, ну это классика, ебать мои старые костыли! В моей биографии было и то, и другое, и каждый раз — отдельный цирк с конями. Оба сценария по-своему интересны, хоть и мозг выносят по-разному.

Когда делаешь с чистого листа (Greenfield): Был у меня проект — сервис для геоданных на C++17. Тут, ёпта, полная свобода и одновременно овердохуища ответственности. Сам выбираешь, как жить: микросервисы или монолит, какой фреймворк для сетевухи брать (я взял Boost.Asio), как сериализовать данные (Protobuf, само собой). Сам настраиваешь сборку на CMake и CI/CD в GitLab, чтобы всё само бегало. А самое главное — проектируешь ядро так, чтобы потом не хотелось себя вилкой в глаз ткнуть. Чтобы и расширялось легко, и тесты к нему писать было не больно.

Вот, смотри, как это примерно начиналось:

// Core.h - основа нового сервиса
class DataPipeline {
public:
    DataPipeline(const Config& config);
    void start();
    void processBatch(const std::vector<GeoPoint>& points);
private:
    std::unique_ptr<NetworkService> network_; // PIMPL идиома для скрытия деталей
    ThreadPool workers_;
};

Красота же, да? Всё с нуля, всё твоё. Чувствуешь себя богом, пока не накосячишь.

А вот когда вляпываешься в готовый проект (Brownfield): Совсем другая история, ядрёна вошь. Как-то раз попал я в команду поддержки старого игрового движка. Это, блядь, был настоящий адский legacy. Код — сплошное спагетти, где за каждой строчкой таится сюрприз, хуй с горы. Моя работа там была — разгребать эти завалы. Потихоньку выковыривать старый код C++03 и впихивать туда современные штуки вроде RAII и умных указателей. Пытаться встроить новый модуль, например, для вокселей, в эту древнюю, замысловатую архитектуру, которая дышала на ладан. Это как ремонт в хрущёвке: живёшь в ней и по кусочкам меняешь всё, чтобы не обрушилось. Терпения ебать ноль к концу дня.

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