Так как я теперь С++ программист, рано или поздно я должен был поделиться впечатлениями. Но сначала коротка история.
Давным-давно, в другой жизни, мы набирали на работу программистов. Давали простую задачку типа перевернуть строку и разрешали писать на чем угодно. Любой язык, который ты знаешь. Ведь сила, она, брат, не в языке. Show us your best self. Так вот, про языки. Приходили сишники, и программы у них получались примерно такие, как от низкоуровнего языка и ожидаешь — страх, неуверенность, кишки, расчлененка и совершенно скучные вопросы типа «а кто выделит место под результат», которые внезапно выходят на первый план и становятся шоу-стопперами. В смысле писали они хорошо и правильно, это скорее мои ощущения от языка.
А потом пришел сиплюсплюсник. Я тогда, наивный, подумал — ну примерно то же самое получится. Но нет, он как-то очень быстро и ловко накидал программу, нигде явно память не выделял, нигде даже указателей не появилось. Все чистенько и аккуратненько, как будто на Джаве писал. А когда указатели над головами не летают, сразу чувствуешь себя сильно безопаснее. И я подумал — опа! Так что, можно было? Никогда бы не стал строить свою карьеру на внимательной работе с памятью, но без нее я вполне смог бы жить.
С тех пор эта мысль у меня висела в фоне — может быть, не так плох С++, как его малюют? Может быть, там как с Джавой — плохие программисты пишут плохо и создают языку репутацию, а хорошие сидят тихонечко, пишут хорошо и проблем не знают. Но проверить эту гипотезу поводов все не подворачивалось. Отзывы тоже были противоречивые, что скорее подтверждало мою гипотезу.
И вот наконец я попробовал С++ сам. То есть я пришел немножечно сбоку в большой и старый C++ проект, а именно Skia. Да и попробовал совсем чуть-чуть. Но главное, что свою гипотезу я, кажется, проверил: неважно, насколько хорошо ты обложился умными указателями, рефкаунтерами и move конструкторами. Неважно, сколько человек писало, смотрело, ревьюило и потом использовало твой код. Неважно, насколько прожжеными плюсовиками они были, неважно, как долго компания развивает экспертизу именно в C++ и насколько хороши их best practices. Все равно рано или поздно кто-нибудь, где-нибудь, как-нибудь, что-нибудь продолбает. Это точно такая же бомба замедленного действия, как и С, а промышленный код выглядит примерно так же страшно и ничуть не менее безопасно. В Skia контрибутит 170 человек. На ней работают Chrome, Android, Flutter, Firefox и Xamarin. И я, одним глазом на нее поглядывающий, без опыта низкоуровнего программирования, без опыта С или С++, нашел за 6 месяцев два случая некорректной работы с памятью. А ведь я их даже не искал! Причем в одном случае мне пришлось объяснять, почему это баг — даже натренированный глаз, когда ему показываешь сломанный код, не всегда способен заметить ошибку.
Итог, увы, неутешительный. Людям верить нельзя. Хороший программист даже себе не должен верить. Машинам — можно. Тотальные гарантии — единственное, что нас спасет. In the long run, конечно.