В какой момент понял, что разработка на C++ — это твое?

Ответ

Это был не один момент, а цепь открытий. Сначала — базовое понимание в университете. Настоящий переломный момент наступил, когда я впервые осознанно отладил проблему с висячим указателем (dangling pointer).

Я писал простой менеджер ресурсов:

class Texture {
    GLuint id_;
public:
    Texture(const char* path) { /* glGenTextures, загрузка... */ }
    ~Texture() { glDeleteTextures(1, &id_); }
    // ...
};

// Где-то в коде:
Texture* loadTexture() {
    Texture* tex = new Texture("asset.png");
    return tex;
}
// ... и забыл delete -> утечка, а потом и использование после удаления.

Осознав проблему, я переписал это с использованием std::unique_ptr и RAII. Момент, когда я понял, что язык дает мне невероятную мощь и контроль (ручное управление памятью, инлайнинг, шаблоны), но и требует абсолютной дисциплины и понимания, был ключевым. C++ — это не просто написание кода, это проектирование систем с полным пониманием их стоимости. Эта комбинация вызова и контроля меня и увлекла.

Ответ 18+ 🔞

А, ну вот это, блядь, история! Я тебе сейчас расскажу, как меня накрыло понимание этого всего дела. Это ж не просто щелкнуло и всё — нет, это была цепь таких открытий, что в конце я сам от себя охуел.

Сначала, конечно, университетская муть. Теория, вода, бла-бла-бла. Ну, вроде что-то понятно, а вроде и нихуя. Настоящий пиздец, простите за выражение, начался, когда я впервые в жизни осознанно поймал и починил висячий указатель (dangling pointer). До этого я про них читал, а тут — бац! — и он, сука, наяву, в моём коде.

Пишу я, значит, какой-то менеджер текстур, детство, наивность, ебать мои старые костыли:

class Texture {
    GLuint id_;
public:
    Texture(const char* path) { /* glGenTextures, загрузка... */ }
    ~Texture() { glDeleteTextures(1, &id_); }
    // ...
};

// Где-то в коде:
Texture* loadTexture() {
    Texture* tex = new Texture("asset.png");
    return tex;
}
// ... и забыл delete -> утечка, а потом и использование после удаления.

И сижу, туплю. Вроде работает, а потом раз — и краш. А потом ещё. А потом я начинаю копать, и до меня доходит: я же создаю объект в куче, возвращаю на него указатель, а потом этот указатель как хуй с горы — летит непонятно куда, память не освобождается, а потом кто-то пытается к этому месту достучаться, когда там уже давно мусор. Ёпта, вот это да! Удивление пиздец, честно.

И вот тут-то и случился перелом. Я не просто починил баг. Я сел, почесал репу и понял всю эту философию. Я осознал, что этот язык, этот C++ — он же, блядь, как обоюдоострый меч. С одной стороны, даёт тебе овердохуища власти: хочешь — памятью рули вручную, хочешь — всё инлайнь, шаблоны эти твои на все случаи жизни. Контроль тотальный.

Но с другой стороны — требует за эту власть полной, блядь, капитуляции твоего разгильдяйства. Абсолютной дисциплины. Ты должен понимать, что и почём. Сколько стоит твой виртуальный вызов, что творится с кэшем, когда ты пишешь вот так, а не эдак. Это не «написал и забыл». Это проектирование систем с полным осознанием, во что каждая строчка тебе в итоге выльется.

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