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

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

Ответ

Программист должен постоянно улучшать код, над которым работает. Это не только написание новой функциональности, но и забота о существующей кодовой базе. В моей практике на 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.

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