Что, по-твоему, программист должен делать с кодом?

Ответ

Программист должен постоянно улучшать код, над которым работает. Это не только написание новой функциональности, но и забота о существующей кодовой базе. В моей практике на C++ это включает несколько аспектов:

  1. Рефакторинг для ясности и поддерживаемости. Например, замена "магических чисел" на именованные константы, выделение сложных фрагментов в отдельные функции с понятными именами, упрощение запутанных условных конструкций.

    // Было
    if (status == 0 || status == 1 || status == 3) { ... }
    
    // Стало
    bool isTerminalState(Status s) {
        return s == Status::Success || s == Status::Failed || s == Status::Cancelled;
    }
    if (isTerminalState(currentStatus)) { ... }
  2. Оптимизация производительности там, где это необходимо и обосновано. Это не преждевременная оптимизация, а анализ узких мест (профайлинг) и их устранение: выбор более подходящих структур данных (например, std::unordered_map вместо std::map для частого поиска), минимизация копирования (использование семантики перемещения, std::string_view), обеспечение кэш-дружественности доступа к памяти.

  3. Обеспечение надёжности. Написание модульных и интеграционных тестов (с помощью Google Test, Catch2), обработка ошибок, использование умных указателей (std::unique_ptr, std::shared_ptr) для автоматического управления памятью и предотвращения утечек.

    // Вместо сырого указателя
    void riskyFunction() {
        int* raw_ptr = new int[100];
        // ... если здесь выбросится исключение, будет утечка ...
        delete[] raw_ptr;
    }
    
    // С умным указателем
    void safeFunction() {
        auto smart_ptr = std::make_unique<int[]>(100);
        // Память будет освобождена автоматически при выходе из функции, даже при исключении
    }
  4. Документирование сложных решений. Не каждый строки, а нетривиальных алгоритмов, инвариантов классов или причин выбора конкретной реализации. Хороший код в значительной степени самодокументируем, но для сложных моментов я добавляю комментарии в формате Doxygen.

Для меня это цикл: написать, протестировать, измерить, понять, улучшить. Цель — чтобы код через полгода было так же легко читать и изменять, как и сегодня.

Ответ 18+ 🔞

Да ты послушай, что за жизнь у программиста! Сидишь, значит, пишешь код, а потом понимаешь — ёпта, это же пиздопроебибна какая-то! Надо улучшать, а то через полгода сам себя не поймёшь, как будто на дворе 2002-й год и ты пьяный в стельку это писал.

Вот смотри, как это работает на C++. Первый пункт — рефакторинг. Это когда смотришь на условие if (status == 0 || status == 1 || status == 3) и у тебя волнение ебать начинается. Что за цифры? Кто их придумал? Хуй с горы какой-то, а не код. Надо вынести это в отдельную функцию с нормальным названием, чтобы любой чувак, который это увидит, сразу понял, о чём речь. Не 0, а Status::Success. Красота же!

bool isTerminalState(Status s) {
    return s == Status::Success || s == Status::Failed || s == Status::Cancelled;
}
if (isTerminalState(currentStatus)) { ... }

Второе — оптимизация. Тут главное — не быть полупидором, который всё подряд пытается ускорить. Сначала профайлинг, находишь узкое место, а потом уже думаешь. Может, std::map на std::unordered_map поменять, может, копирование лишнее убрать. Цель — чтобы не жрало ресурсов овердохуища, а работало шустро.

Третье — надёжность. Это святое. Вот смотри на этот ужас:

void riskyFunction() {
    int* raw_ptr = new int[100];
    // ... если здесь выбросится исключение, будет утечка ...
    delete[] raw_ptr;
}

Ни хуя себе риск! Вылетит исключение — и память твоя навеки в небытии. А теперь с умным указателем:

void safeFunction() {
    auto smart_ptr = std::make_unique<int[]>(100);
    // Память будет освобождена автоматически при выходе из функции, даже при исключении
}

Вот это уже доверия ебать больше вызывает. И тесты писать надо, конечно. Без них — терпения ноль ебать потом искать, где же ты эту хитрую жопу с багом спрятал.

И наконец, четвёртое — документирование. Не надо комментировать каждую строчку, это манда с ушами. Но если алгоритм сложный, как хуй в пальто завёрнутый, то поясни, чувак, для будущего себя или того парня, кто будет это читать. Хороший код и так многое говорит, но для особо извращённых моментов пара строк в Doxygen — это спасение.

Итог такой: пишешь, тестишь, меряешь, понимаешь, улучшаешь. Круг замкнулся. Цель — чтобы через полгода открыть этот код и не сказать «ёб твою мать, кто это писал?», а спокойно в нём разобраться и продолжить работу. Ядрёна вошь, вот это подход!