«Код-ревью — это когда твои комментарии в интернете действительно читают»: дискуссия с разработчиками на C++
Заходят как‑то на Хабр С++ разработчики из крупных компаний, а у них спрашивают: что такое код‑ревью и используют ли они спецификатор final. Эти и другие вопросы с подвохом мы задали инженерам из YADRO, VK, Kaspersky, Syntacore и PVS‑Studio. В итоге обсудили инструменты для работы со сторонними зависимостями, интерфейсы «плюсовых» библиотек и отказ (или нет) от exceptions.
Продолжим дискуссию на митапе по С++, который пройдет онлайн 20 марта. Регистрируйтесь, подключайтесь к трансляции и пишите вопросы и комментарии в чат — ведущие озвучат некоторые из них.
Кто отвечает на вопросы
Илья Казаков
Разработчик в команде систем хранения данных в YADRO
Константин Владимиров
Руководитель отдела компиляторов и инструментов разработки в Syntacore
Александр Еналдиев
Техлид в контентной фильтрации в Kaspersky
Станислав Юрченко
Разработчик в VK AdTech
Евгений Фёклин
Разработчик ядра анализатора кода в PVS-Studio
Продолжи фразу: «Код-ревью — это когда...»
Илья Казаков: Когда твои комментарии в интернете действительно читают.
Константин Владимиров: Когда группа разработчиков смотрит коммит своего коллеги и дает ему полезную и конструктивную обратную связь.
Александр Еналдиев: Когда шрамы от баталий затягиваются, а код объективно становится лучше.
Станислав Юрченко: Когда код, в отличие от настроения, становится лучше.
Евгений Фёклин: Когда ты уговариваешь кого-то посмотреть на код, который ты написал.
Что лучше: кидать exception или возвращать код ошибки? Можно ли отказаться от эксепшенов полностью?
Илья Казаков: В С++17 появились std::variant и std::optional и std::variant. В C++23 появился std::expected и монады для std::expected и std::optional. Не вижу никаких препятствий для удобной работы с кодами ошибок. Я обожаю помечать функции и методы с помощью noexcept и очень боюсь abort и std::terminate. Использую исключения только в конструкторах, а иногда вообще запрещаю конструкторы и пишу фабричные методы — спасибо __cpp_guaranteed_copy_elision. Исключения — зло, fight me.
Константин Владимиров: Лучше использовать исключения. Они оптимизируют основной путь и убирают из кода мусор.
Александр Еналдиев: Exceptions выглядят как карго-культ. Я встречал людей, которые знают, что не нужно их кидать, но, какую цель при этом преследуют, не знают. Все должно идти от задачи: стало ли лучше или «те же яйца, только в профиль»?
Станислав Юрченко: Я бы сформулировал вопрос иначе: иногда лучше exception, иногда — код ошибки. Это не вопрос, где обязательно нужно выбрать что-то одно, все зависит от контекста. Если нужна централизованная обработка большого набора ошибок, исключения — хороший вариант. Если же алгоритм подразумевает последовательное ветвление в зависимости от получаемых ошибок — возвращение кода может быть лучшим решением.
Евгений Фёклин: Для меня лучше кидать exception для обработки ошибок. Оно позволяет создавать иерархии исключений.
Какими инструментами для работы со сторонними зависимостями ты предпочитаешь пользоваться?
Илья Казаков: Считаю, что слишком мало внимания уделяют Conan. Он очень активно развивается и собирает вокруг себя достаточно большое сообщество. Я сам — автор нескольких рецептов в conan-center-index, и он занимает особое место в моем сердечке.
Константин Владимиров: Мне нравится Conan, но я не имею ничего против vcpkg. В принципе все что угодно, лишь бы не сабмодули.
Александр Еналдиев: Кажется, что Conan (был) неплох, но лично для меня в рабочих процессах вопрос не актуален — у нас монорепозиторий.
Станислав Юрченко: Не могу сказать, что познал дзен в этом вопросе. Я просто пользовался Conan.
Евгений Фёклин: CMake, Сhocolatey, Сonan, vspkg.
Часто речь в докладах на митапах и конференциях идет о стандартной библиотеке. Как считаешь, можно ли писать на С++ и не использовать стандартную библиотеку?
Илья Казаков: Я более чем уверен что те, кто отказывается от стандартной библиотеки, в конечном итоге пишут точно тот же код что и в стандартной библиотеке. К сожалению, (или к счастью) я не встречался на практике с ситуацией когда использование стандартной библиотеки было бы невозможно. Не нравится динамическая зависимость? Ничего не мешает линковаться статически. Проблема с версией библиотеки на таргет платформе? Линкуйся статически. Не нравится линковаться статически? Линкуйся статически :)
Константин Владимиров: Можно. Но для этого придется переписать часть стандартной библиотеки, иногда существенную. Был опыт. Скажу так: разрабатывать заново то, что уже есть в стандартной библиотеке, в первую очередь скучно.
Александр Еналдиев: Ожидание: тебе намекают про плюсы в драйверах или bare metal С++. Реальность: народ пишет на Qt и не выкупает про STL и Boost.
Станислав Юрченко: Разумной причиной отказаться от стандартной библиотеки может быть необходимость разработки для встраиваемых систем, где размер проекта и бережная работа с памятью возведены в абсолют. В других случаях причин лишать себя обширного инструментария с хорошей оптимизацией я не вижу.
Есть фраза «У каждой хорошей С++ библиотеки должен быть С-интерфейс». Почему так?
Илья Казаков: Что такое интерфейс библиотеки в мире С++? Это заголовочные файлы. Каждый раз, когда ты включаешь заголовочный файл, ты включаешь все его зависимости, и в результате зависимости библиотеки перетекают в твои зависимости. Кроме того, возможна ситуация, когда заголовочный файл использует стандарт выше, чем стандарт твоего проекта. В таком случае использовать библиотеку вовсе не выйдет. Но если предоставить заголовочник, написанный на С, то головной боли будет намного меньше. Правда, к сожалению, и функционала.
Константин Владимиров: Из-за того, что у C есть стабильное ABI и нет манглирования (как минимум манглирования типами). В языке C++ манглирование типами происходит в стиле, зависящем от реализации.
Александр Еналдиев: Ожидание: имели в виду, что неплохо бы рассчитывать на гетерогенную среду, всякие С, С++, расты, шарпы и прочие cython. Реальность: потому что Си-шное лобби не дремлет.
Как часто ты используешь final?
Илья Казаков: До недавнего времени вообще о нем не вспоминал, однако Константин Владимиров убедил меня в том что очень зря. Теперь останавливаю себя от того чтобы писать его везде (даже там, где он не нужен)
Константин Владимиров: Довольно часто и на классах и на конкретных методах.
Александр Еналдиев: Раз в два года точно.
Станислав Юрченко: Руководствуюсь правилом «не лепи куда попало». Встречаю редко, пользуюсь еще реже.
Евгений Фёклин: Тимлид нам запрещает использовать виртуальные функции.
Присоединяйтесь к обсуждению в комментариях! Как бы вы ответили на вопросы?А также регистрируйтесь на митап по С++, чтобы поучаствовать в онлайн-дискуссии с экспертами.