Дорогие читатели, команда PVS-Studio представляет вашему вниманию интервью с Андерсом Шау Кнаттеном, автором книги "C++ Brain Teasers: Exercise Your Mind". В этой статье вы познакомитесь с его новой книгой по C++, откроете для себя увлекательные способы изучения стандартов языка и рассмотрите некоторые распространённые ошибки, которые допускают C++ разработчики, а также узнаете немного о биографии Андерса. Надеемся, вам понравится!

Об авторе

— Не могли бы вы представиться и рассказать о своей профессиональной деятельности?

— У меня довольно разнообразный опыт. Я начал программировать в конце девяностых во время учёбы в старшей школе, после того как открыл для себя демосцену. Совершенно случайно я заполучил книгу по Pascal, к которой с тех пор не притрагивался. После я имел дело со множеством разных языков как в качестве хобби, так и в профессиональной деятельности. Для работы в основном использовал C++, Python, Java, C#, Uno и PHP.

Андерс (внизу справа) на своей первой работе около двадцати лет назад
Андерс (внизу справа) на своей первой работе около двадцати лет назад

Сейчас я работаю в Ascenium. Это стартап в Осло, который создаёт новый, более производительный процессор. В основном работаю над симулятором производительности и участвую в создании модели памяти. Помимо этого, я пробовал себя в различных областях: компьютерное зрение, сейсмика, моделирование потоков, графические языки программирования/IDE, веб-разработка, также участвовал во всевозможных сторонних проектах.

CppQuiz: проверьте свои знания стандарта C++

О квизе

CppQuiz — это онлайн-квиз, где вы можете проверить свои знания C++. Он состоит из 160 вопросов, каждый из которых включает фрагмент C++ кода. Задача разработчика — изучить этот фрагмент и определить, что выведет программа. Иногда код не компилируется, и это важно учитывать. У квиза три уровня сложности.

Пример вопроса из CppQuiz
Пример вопроса из CppQuiz

— Прежде чем мы перейдём к основной теме статьи, не могли бы вы рассказать о своём проекте СppQuiz? Похоже, что книга каким-то образом связана с ним. Можете поделиться интересными фактами или наблюдениями, связанными с CppQuiz? Есть ли предыстория у этого квиза? Почему он нацелен именно на знание стандартов языка?

— Мой интерес к квизам по C++ возник благодаря моему соотечественнику, норвежцу Олве Маудалу (который в итоге написал предисловие к книге). Я участвовал в нескольких его конференциях с квизами и однажды поздно вечером на ACCU 2013 решил, что должен сделать веб-версию такого квиза. Немного перебрав с пивом, я принялся писать первый вариант в своем гостиничном номере, а продолжил уже в самолете и поезде на следующий день по дороге домой. В общем, исходный код сайта оставляет желать лучшего, но сам проект оказался успешным!

Андерс и Олве Маудал проводят квиз по C++ на конференции NDC TechTown 2023
Андерс и Олве Маудал проводят квиз по C++ на конференции NDC TechTown 2023

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

Также у нас есть мобильное приложение CppQuiz. Сергей Васильченко написал его в одиночку! Мне нужно было лишь создать JSON-экспорт вопросов с сайта.

На момент написания статьи квиз включал вопросы по стандарту C++17, но с тех пор Андерс добавил C++23. Можете ознакомиться с обновленной версией здесь!

А также участвуйте в квизах от команды PVS-Studio!

Книга "C++ Brain Teasers: Exercise Your Mind"

О книге

В книге вы найдете 25 коротких программ на C++. Ваша цель — угадать результат их выполнения и понять, почему язык ведёт себя именно так. Задачи тщательно продуманы и подобраны так, чтобы соответствовать реальным сценариям. В пояснениях к ним вы найдёте множество практических советов по написанию более качественного и безопасного кода. Таким образом, книгу можно читать как просто для развлечения, так и в образовательных целях.

Андерс рад представить вам свою книгу
Андерс рад представить вам свою книгу

— Книга входит в серию Brain Teasers от The Pragmatic Programmers. Требовался человек для работы над книгой по C++ в этой серии, и Франсес Буонтемпо представила меня издательству, зная о моём интересе к квизам по C++.

Серия Brain Teasers от The Pragmatic Programmers
Серия Brain Teasers от The Pragmatic Programmers

— На C++ разработчиков какого уровня ориентирована ваша книга — начинающих или продвинутых?

— Для прочтения книги необходимо иметь хотя бы небольшой опыт работы с C++. Это не введение в язык. Но если вы хоть немного работали с C++ или просто изучали его, пусть даже в школе, книга должна быть вам понятна. Если вы опытный программист, то правильно ответите на все или большинство вопросов, но всё равно, возможно, узнаете что-то новое из развёрнутых комментариев к каждому заданию.

"Сумма частей Аристотеля", отрывок из книги
"Сумма частей Аристотеля", отрывок из книги

— Как следует знакомиться с книгой, чтобы она принесла максимум пользы?

— Очень важно попытаться самостоятельно прийти к ответу прежде, чем вы прочтете объяснение. Также я рекомендую подумать о том, почему ответ получился именно такой. Какие механизмы языка задействованы? Почему это работает именно так? Такой подход помогает подготовить необходимую "ямку" в мозгу для хранения информации, полученной в результате объяснения. Я считаю, что так обучение проходит гораздо эффективнее.

— Какие основные проблемы и неоднозначные темы рассматриваются в книге?

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

— Мой любимый вопрос: есть ли в книге пасхалки? Мне кажется, я нашла одну из них во время чтения, но не буду её раскрывать.

— Да, раздел под названием "Взломай планету" — это отсылка к одному из моих любимых фильмов, "Хакеры" (1995).

"Взломай планету", отрывок из книги
"Взломай планету", отрывок из книги

— На ваш взгляд, какие распространённые ошибки часто допускают программисты на C++?

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

  • старые добрые недопонимания, нечёткие требования и решение не тех задач;

  • недостаточное внимание к тестированию, линтерам и инструментам разработки;

  • непонимание последствий и компромиссов, связанных с "инвестициями в качество кода".

Много времени может быть потрачено впустую на неважные мелочи, ревью и полировку, которые на деле не имеют значения. И наоборот, кажущиеся невинными "временные" решения/фиксы/хаки могут серьёзно повлиять на других людей, работающих с той же кодовой базой. Различать такие ситуации помогают только опыт и внимательность.

Как разработчики инструмента для поиска ошибок и уязвимостей в коде, мы не можем не согласиться! Мы исследуем ошибки в коде C++ уже 16 лет, и проблемы, вызванные небрежностью и старым добрым Copy-Paste, по-прежнему остаются одними из самых распространённых, и порой разработчикам сложнее всего заметить именно их.

Полезные материалы для C++ программистов

— Вы внесли большой вклад в развитие сообщества благодаря книгам и выступлениям на конференциях. Даже выступали на C++ Russia в 2021 году с докладом " Just Enough Assembly for Compiler Explorer". Давайте поговорим об обучении для C++ программистов. Я полностью согласна с вами в том, что учиться, задавая вопросы "как это работает" и "почему" — лучший способ. Помимо книг, откуда ещё вы черпаете знания?

— Мне нравится посещать конференции по С++. Самые любимые: NDC TechTown, ACCU, C++ on Sea и Meeting C++. Но просто заниматься интересным делом вместе с замечательными коллегами — это мой любимый способ учиться.

NDC TechTown
NDC TechTown
C++ on Sea
C++ on Sea

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

"The Art of Writing Efficient Programs", Фёдор Пикус
"The Art of Writing Efficient Programs", Фёдор Пикус

— Как опытный участник конференций и докладчик, не могли бы вы рассказать о самом интересном выступлении, на котором побывали? Чем оно вам запомнилось?

— Сложно выделить одно, но прямо сейчас вспоминается выступление Олафура Вааге на конференции NDC TechTown в этом году. Вы наверняка слышали про эксперименты, когда люди пытаются запустить Doom на разных необычных устройствах? Так вот, Олафур запустил игру на настоящем спутнике в космосе.

DOOM в космосе, NDC TechTown
DOOM в космосе, NDC TechTown

Кстати, наша команда также недавно "экспериментировала" с DOOM. Один из наших C++ разработчиков написал статью, в которой разобрал ошибки, встречающиеся в GZDoom. Прочесть об этом кишащем "жуками" приключении вы можете в нашем блоге.

Заключение

— Вы внесли свой вклад в область компьютерных наук как инженер-программист, а в сообщество C++ — как докладчик на конференциях, автор книг и разработчик множества пет-проектов, таких как CppQuiz. Чем вы особенно гордитесь и почему?

— Оглядываясь назад, я думаю, что больше всего горжусь своим первым выступлением с докладом на конференции ACCU. До того момента я никогда не выступал на конференциях или митапах, но тогда я вышел и просто рассказал свой доклад перед большой аудиторией, включая многих моих кумиров. Честно говоря, сам доклад был не очень хорошим, но и не таким уж плохим, как можно было ожидать, и я воспринимаю его как начало своей "карьеры" спикера на конференциях. Если вы попали на конференцию, где проводятся блиц-доклады, рекомендую попробовать выступить!

— Какой совет вы бы дали себе в начале пути изучения C++ и компьютерных наук в целом?

— Не бойтесь задавать вопросы! Когда вы новичок (в программировании или просто на новой работе), спрашивать может быть страшновато, но помните: люди предполагают, что вы ещё многого не знаете. И если вы переживаете о том, что покажетесь кому-то "глупым", помните: вы выглядите гораздо умнее, если задаёте уточняющие вопросы, а не просто предполагаете что-то и принимаете необоснованные решения. На моей предыдущей работе у меня была коллега, которая пришла к нам сразу после университета, но она никогда не боялась спросить: "Как на самом деле работает эта штука?" или "Что вы имеете в виду?". Это только подчёркивало её уверенность в себе и интеллект, и сразу было понятно, что она быстро взойдёт по карьерной лестнице.

Отличный момент для завершения интервью! Здорово! Большое спасибо за содержательную беседу и за отличную книгу, которая пополнит библиотеку C++ программиста. Удачи вам в достижении ваших целей. Желаю чистого кода!

Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Uliana Khromchenko. Brain debugging. Interview with Anders Schau Knatten, author of "C++ Brain Teasers: Exercise Your Mind".

Комментарии (1)


  1. TheDreamsWind
    06.12.2024 07:10

    CcpQuiz не самая плохая викторина по C++, прошёлся по вопросам в свое время, но как и любой "квиз" на практике помогает мало: во-первых ряд вопросов отвечается интуитивно, и не требует от экзаменуемого знать какая именно цепочка правил приводит к данному результату, во-вторых в ряде случаев ответ не получится дать на 100% корректно (к примеру данный квиз относит NDR к Undefined Behavior), ну и в-третьих способность пройти данный квиз не помогает в практическом программировании, т.к. подобный код часто вообще не пишешь (поскольку он нарушает любые разумные конвенции) и за пределами квиза он не запоминается