Как изучал программирование?

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

Ответ

Мой путь в программировании начался со школьного курса Pascal, но настоящая глубина пришла с изучением C и C++.

Начальный этап (университет):

  • Базовый C: По книгам Кернигана и Ритчи «Язык программирования C» и «Современный C++» Страуструпа. Много времени уделял пониманию указателей, управления памятью и препроцессора.
  • Алгоритмы и структуры данных: Реализовывал свои версии контейнеров на C++:
    // Учебная реализация вектора
    template<typename T>
    class SimpleVector {
    T* data = nullptr;
    size_t sz = 0;
    size_t cap = 0;
    void reallocate(size_t new_cap) {
        T* new_data = static_cast<T*>(::operator new(new_cap * sizeof(T)));
        for (size_t i = 0; i < sz; ++i) {
            new (new_data + i) T(std::move(data[i])); // Placement new
            data[i].~T();
        }
        ::operator delete(data);
        data = new_data;
        cap = new_cap;
    }
    public:
    void push_back(const T& value) {
        if (sz >= cap) reallocate(cap ? cap * 2 : 1);
        new (data + sz) T(value); // Конструирование на месте
        ++sz;
    }
    ~SimpleVector() {
        for (size_t i = 0; i < sz; ++i) data[i].~T();
        ::operator delete(data);
    }
    };

Углубление и специализация:

  • Современный C++: Изучал новые стандарты (C++11/14/17/20) через онлайн-курсы, конференции (CppCon, Meeting C++) и эксперименты. Например, разбирался с move-семантикой, perfect forwarding и концептами.
  • Системное программирование: Писал небольшие утилиты под Linux, работал с системными вызовами, сетевыми сокетами (BSD API), изучал устройство компилятора (GCC/Clang) и линкера.
  • Индустриальная практика: Работа над коммерческими проектами научила меня использовать инструменты (gdb, Valgrind, sanitizers), писать поддерживаемый код и работать с legacy codebase.

Сейчас я продолжаю углублять знания, следя за развитием стандарта C++, изучая смежные области (компиляторостроение, высокопроизводительные вычисления) и внося вклад в open-source проекты на C++.