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

Ответ

Мой путь в программировании начался со школьного курса 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++.

Ответ 18+ 🔞

А, ну слушай, вот как оно было, ебать мои старые костыли. Началось всё, как у всех, со школьного Паскаля. Но это так, мартышлюшка, детский сад. Настоящий пиздец, в хорошем смысле, начался, когда в универе в руки попались 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);
    }
};

И смотришь на этот placement new и явный вызов деструктора, и думаешь — ну пидарас шерстяной, кто это вообще придумал? Но зато потом понимаешь, как всё под капотом работает, и уже не так страшно.

Этап второй, погружение:

  • Современный C++: Тут понеслось. C++11, 14, 17, 20... Move-семантика, perfect forwarding, концепты. Читаешь про std::move, а в голове сначала: «чё за хуйня?». Потом вроде сходится, пишешь, а оно не компилируется — и снова ёклмн. Но когда разобрался — красота же, чувак.
  • Системное программирование: Под Линуксом начал ковырять. Системные вызовы, сокеты, компиляторы GCC/Clang. Тут уже не просто код, а прям с железом общаешься. Ощущение, будто из кабины трактора пересел в кабину истребителя. Мощно, но и ответственности — овердохуища.
  • Работа: Ну а потом попал на реальный проект. Вот тут-то и началось. Наследие какое-нибудь, код, который писал какой-то хитрая жопа лет десять назад. Отладчик gdb, Valgrind — лучшие друзья. Учишься не просто писать, а писать так, чтобы через полгода самому не захотелось глаза себе вилкой выколоть.

Сейчас, бля, вроде уже не ламер, но и не гуру. Стандарт развивается, open-source проекты есть, куда можно заглянуть. В общем, путь такой: сначала нихуя не понял, потом вроде что-то понял, а потом осознал, что нихуя не понял, но уже на другом уровне. Как-то так.