Какой у тебя коммерческий опыт?

Ответ

Я работаю C++ разработчиком более 5 лет, в основном в областях high-performance computing (HPC) и embedded систем.

1. High-Performance Computing (3 года):

  • Разрабатывал и оптимизировал ядро физического симулятора для задач вычислительной гидродинамики (CFD).
  • Основной стек: C++17/20, MPI для межпроцессного взаимодействия, OpenMP для многопоточности внутри узла, библиотеки линейной алгебры (Eigen, BLAS).
  • Задача: ускорить расчёт на кластере. Профилировал код с помощью Intel VTune, выявил «горячую» точку — умножение разрежённых матриц. Переписал алгоритм, используя более эффективный формат хранения матрицы (CSR -> Hybrid), и применил векторизацию (SIMD) через директивы компилятора и интринсики. Результат — ускорение этого блока на ~40%.
// Упрощённый пример векторизованного сложения массивов (использование AVX2)
#include <immintrin.h>
void vectorized_add(const float* a, const float* b, float* result, size_t n) {
    size_t i = 0;
    for (; i + 8 <= n; i += 8) {
        __m256 av = _mm256_loadu_ps(a + i);
        __m256 bv = _mm256_loadu_ps(b + i);
        __m256 sum = _mm256_add_ps(av, bv);
        _mm256_storeu_ps(result + i, sum);
    }
    // Обработка остатка (tail)
    for (; i < n; ++i) {
        result[i] = a[i] + b[i];
    }
}

2. Embedded Systems (2 года):

  • Разработка ПО для устройств промышленной автоматизации на базе микроконтроллеров ARM Cortex-M.
  • Стек: C++14 (с ограничениями RTTI/Exceptions), FreeRTOS, работа с периферией (SPI, I2C, ADC), создание драйверов.
  • Задача: реализовать надёжный обмен данными по CAN-шине. Разработал драйвер с двойной буферизацией и приоритетной очередью сообщений, что позволило избежать потерь данных в условиях высокой нагрузки шины.

Ответ 18+ 🔞

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

1. Высокопроизводительные вычисления (HPC), 3 года: Сидел я, значит, на проекте по вычислительной гидродинамике. Задача — симулятор физический, который на кластерах гоняют. И вот сидишь ты, смотришь на профайлер, а там какая-то одна функция жрёт процессорного времени, как не в себя. В моём случае это было умножение разрежённых матриц. Смотрю — алгоритм старый, формат хранения неэффективный. Ну, думаю, ёперный театр, сейчас будем оптимизировать. Переписал я всё на C++17/20, использовал MPI для связи между узлами, OpenMP — внутри. Но главный фокус был в том, чтобы формат матрицы поменять с CSR на гибридный и, самое главное, впендюрить векторизацию. Сидишь, с интринсиками AVX2 колдуешь, как шаман. В итоге этот блок ускорился на 40%, представляешь? Ни хуя себе! Руководство аж прослезилось.

// Упрощённый пример векторизованного сложения массивов (использование AVX2)
#include <immintrin.h>
void vectorized_add(const float* a, const float* b, float* result, size_t n) {
    size_t i = 0;
    for (; i + 8 <= n; i += 8) {
        __m256 av = _mm256_loadu_ps(a + i);
        __m256 bv = _mm256_loadu_ps(b + i);
        __m256 sum = _mm256_add_ps(av, bv);
        _mm256_storeu_ps(result + i, sum);
    }
    // Обработка остатка (tail)
    for (; i < n; ++i) {
        result[i] = a[i] + b[i];
    }
}

2. Встроенные системы (Embedded), 2 года: А потом, как по контрасту, резко пересел на промышленные контроллеры. ARM Cortex-M, FreeRTOS, и C++14, но такой урезанный — без RTTI, без исключений. Прям хитрая жопа, потому что думать надо по-другому. Однажды поставили задачу — сделать надёжный обмен по CAN-шине. А CAN — он же как толпа пьяных: все кричат, сообщения летят, и если твой драйвер — распиздяй, то всё потеряется. Пришлось городить систему с двойной буферизацией и приоритетной очередью. Сидишь, отлаживаешь, смотришь осциллографом, а в голове одна мысль: «терпения ноль, ебать». Но когда заработало без единого глюка под максимальной нагрузкой — вот это было чувство. Прям сам от себя охуел, что на таких ограничениях можно сделать что-то стабильное. Совсем другой мир, но тоже безумно интересный.