Как проходила карьерная лестница на прошлой работе

Ответ

Я начинал как Junior C++ Developer, занимался в основном исправлением багов и поддержкой существующего кодовой базы, написанной на C++03. Через полтора года меня повысили до Middle-разработчика. На этой позиции я уже проектировал новые модули, оптимизировал критические алгоритмы (например, снизил время обработки данных на 15% через переход на std::unordered_map и улучшение кэширования) и активно участвовал в code review.

Последние два года я работал как Senior C++ Developer. Мои обязанности включали:

  • Руководство небольшой командой из трёх разработчиков.
  • Проектирование архитектуры новых сервисов с использованием современных стандартов C++ (C++17/20).
  • Полное техническое взаимодействие с заказчиками: от сбора требований до презентации результатов.
  • Инициация и проведение миграции проекта с C++03 на C++17, что позволило использовать std::optional, std::variant и упростить код.
  • Внедрение практик CI/CD (GitLab CI) и статического анализа (Clang-Tidy, PVS-Studio) в процесс разработки.

Пример эволюции задач:

// Junior: Исправление уязвимости переполнения буфера в legacy-коде.
void fixBufferOverflow(char* dst, const char* src, size_t dstSize) {
    strncpy(dst, src, dstSize - 1);
    dst[dstSize - 1] = '';
}

// Senior: Проектирование безопасного и эффективного абстрактного буфера с RAII.
class SecureBuffer {
    std::vector<char> data_;
public:
    explicit SecureBuffer(size_t size) : data_(size) {}
    void copyFrom(const char* src, size_t len) {
        if (len > data_.size()) throw std::runtime_error("Buffer overflow");
        std::copy(src, src + len, data_.begin());
    }
    // ... Реализация move-семантики, потокобезопасные методы при необходимости.
};

Ответ 18+ 🔞

А, ну рассказывай, как ты из грязи в князи пробивался! Начинал, значит, как юниор по плюсам, да? Классика, ёпта. Сидел, наверное, в этой своей legacy-кодовой базе, написанной на C++03, как будто на дворе 2002-й год. Исправлял баги, которые старшие товарищи понаделали, пока те пиво пили. Знакомо, блядь.

Через полтора года — опа! — уже миддл. Ну, тут уже пошло повеселее: не просто латаешь дыры, а уже проектируешь модули, алгоритмы оптимизируешь. Снизил время обработки на 15% через std::unordered_map? Звучит солидно, чувак. Не то что эти распиздяи, которые велосипеды из std::map собирают там, где хеш-таблица просится. Молодец, что головой думал, а не хуй с горы.

А последние два года — вообще сеньор, ядрёна вошь! Тут уже не просто код пишешь, а команду из трёх человек ведёшь. Это ж надо не только самому не накосячить, но и за другими следить, чтобы они тебе в проект какую-нибудь пиздопроебибну не занесли. Архитектуру новых сервисов на C++17/20 проектируешь — это уже серьёзно. std::optional, std::variant — это тебе не хухры-мухры, это реально жизнь упрощает, если, конечно, не использовать их как мартышлюшка, которая с гранатой играет.

И самое главное — миграцию с C++03 на C++17 инициировал и провёл. Вот это, блядь, подвиг! Это ж надо было всем этим мамкиным архитекторам, которые двадцать лет на макросах и сырых указах сидели, объяснить, что auto — это не только марка машины. Наверное, волнение ебать было, когда презентацию заказчикам делал. Но видимо, прокатило, раз проект не накрылся медным тазом.

CI/CD внедрил, статический анализ... Clang-Tidy, PVS-Studio — это хорошо. Это хоть как-то отсекает самый откровенный бред, который в код review может просочиться. Доверия ебать ноль к некоторым коллегам, так что пусть машина сначала проверит.

И пример твой — просто песня. Сравнил задачи — сразу видно, где щенок был, а где волком стал.

  • Юниор: Лезешь в какой-то древний, вонючий код, где strncpy и переполнение буфера — норма жизни. Фиксишь уязвимость, чтобы хоть как-то усыпить бдительность сканера безопасности. Работа грязная, неблагодарная, но кто-то же должен это делать.
  • Сеньор: Уже проектируешь нормальный, безопасный класс SecureBuffer на std::vector с RAII. Никаких сырых указателей, никакого ручного управления памятью. Выброс исключения при переполнении — красиво, по-взрослому. И сразу видно, что думаешь о move-семантике, о потокобезопасности... В общем, не код, а конфетка.

Короче, эволюция налицо. Из того, кто латал дыры скотчем, превратился в того, кто проектирует системы, которые изначально не текут. Респект, как говорится. Только смотри, на этой позиции сеньора не зазнайся, а то станешь таким же полупидором-архитектором, который новые стандарты не учит и всем говорит, что его void* — это круто и по-пацански.