Вебинар: Использование статических анализаторов кода при разработке безопасного ПО - 19.12
Дорогие читатели, команда PVS-Studio представляет вашему вниманию интервью с Андерсом Шау Кнаттеном, автором книги "C++ Brain Teasers: Exercise Your Mind". В этой статье вы познакомитесь с его новой книгой по C++, откроете для себя увлекательные способы изучения стандартов языка и рассмотрите некоторые распространённые ошибки, которые допускают C++ разработчики, а также узнаете немного о биографии Андерса. Надеемся, вам понравится!
— Не могли бы вы представиться и рассказать о своей профессиональной деятельности?
— У меня довольно разнообразный опыт. Я начал программировать в конце девяностых во время учёбы в старшей школе, после того как открыл для себя демосцену. Совершенно случайно я заполучил книгу по Pascal, к которой с тех пор не притрагивался. После я имел дело со множеством разных языков как в качестве хобби, так и в профессиональной деятельности. Для работы в основном использовал C++, Python, Java, C#, Uno и PHP.
Рисунок N2 — Андерс (внизу справа) на своей первой работе около двадцати лет назад
Сейчас я работаю в Ascenium. Это стартап в Осло, который создаёт новый, более производительный процессор. В основном работаю над симулятором производительности и участвую в создании модели памяти. Помимо этого, я пробовал себя в различных областях: компьютерное зрение, сейсмика, моделирование потоков, графические языки программирования/IDE, веб-разработка, также участвовал во всевозможных сторонних проектах.
CppQuiz — это онлайн-квиз, где вы можете проверить свои знания C++. Он состоит из 160 вопросов, каждый из которых включает фрагмент C++ кода. Задача разработчика — изучить этот фрагмент и определить, что выведет программа. Иногда код не компилируется, и это важно учитывать. У квиза три уровня сложности.
Рисунок N3 — Пример вопроса из CppQuiz
— Прежде чем мы перейдём к основной теме статьи, не могли бы вы рассказать о своём проекте СppQuiz? Похоже, что книга каким-то образом связана с ним. Можете поделиться интересными фактами или наблюдениями, связанными с CppQuiz? Есть ли предыстория у этого квиза? Почему он нацелен именно на знание стандартов языка?
— Мой интерес к квизам по C++ возник благодаря моему соотечественнику, норвежцу Олве Маудалу (который в итоге написал предисловие к книге). Я участвовал в нескольких его конференциях с квизами и однажды поздно вечером на ACCU 2013 решил, что должен сделать веб-версию такого квиза. Немного перебрав с пивом, я принялся писать первый вариант в своем гостиничном номере, а продолжил уже в самолете и поезде на следующий день по дороге домой. В общем, исходный код сайта оставляет желать лучшего, но сам проект оказался успешным!
Рисунок N4 — Андерс и Олве Маудал проводят квиз по C++ на конференции NDC TechTown 2023
Причина, по которой я ориентируюсь на конкретный стандарт, заключается в том, что пояснения для вопросов должны отсылать к определённой версии языка, поэтому необходимо решить, на какую именно ссылаться. Ответы на некоторые вопросы меняются с появлением новых стандартов, как, например, в случае с временным продлением срока жизни циклов for, основанных на диапазоне и удалении триграфов. Сейчас мы как раз занимаемся обновлением всех вопросов и пояснений к ним до стандарта C++23. С этим мне очень помогает сообщество, и если вы тоже хотите помочь, загляните сюда. Я ценю любой вклад, — как большой, так и маленький, — а в качестве бонуса разыгрываю экземпляр своей книги.
Также у нас есть мобильное приложение CppQuiz. Сергей Васильченко написал его в одиночку! Мне нужно было лишь создать JSON-экспорт вопросов с сайта.
На момент написания статьи квиз включал вопросы по стандарту C++17, но с тех пор Андерс добавил C++23. Можете ознакомиться с обновленной версией здесь!
А также участвуйте в квизах от команды PVS-Studio!
В книге вы найдете 25 коротких программ на C++. Ваша цель — угадать результат их выполнения и понять, почему язык ведёт себя именно так. Задачи тщательно продуманы и подобраны так, чтобы соответствовать реальным сценариям. В пояснениях к ним вы найдёте множество практических советов по написанию более качественного и безопасного кода. Таким образом, книгу можно читать как просто для развлечения, так и в образовательных целях.
Рисунок N5 — Андерс рад представить вам свою книгу
— Книга входит в серию Brain Teasers от The Pragmatic Programmers. Требовался человек для работы над книгой по C++ в этой серии, и Франсес Буонтемпо представила меня издательству, зная о моём интересе к квизам по C++.
Рисунок N6 — Серия Brain Teasers от The Pragmatic Programmers
— На C++ разработчиков какого уровня ориентирована ваша книга — начинающих или продвинутых?
— Для прочтения книги необходимо иметь хотя бы небольшой опыт работы с C++. Это не введение в язык. Но если вы хоть немного работали с C++ или просто изучали его, пусть даже в школе, книга должна быть вам понятна. Если вы опытный программист, то правильно ответите на все или большинство вопросов, но всё равно, возможно, узнаете что-то новое из развёрнутых комментариев к каждому заданию.
Рисунок N7 — "Сумма частей Аристотеля", отрывок из книги
— Как следует знакомиться с книгой, чтобы она принесла максимум пользы?
— Очень важно попытаться самостоятельно прийти к ответу прежде, чем вы прочтете объяснение. Также я рекомендую подумать о том, почему ответ получился именно такой. Какие механизмы языка задействованы? Почему это работает именно так? Такой подход помогает подготовить необходимую "ямку" в мозгу для хранения информации, полученной в результате объяснения. Я считаю, что так обучение проходит гораздо эффективнее.
— Какие основные проблемы и неоднозначные темы рассматриваются в книге?
— В книге я уделяю внимание основным механизмам языка, а не его экзотическим особенностям и корнер-кейсам, которые, к сожалению, довольно часто встречаются в квизе на сайте. Так что ждите обсуждения таких вещей, как разрешение перегрузок, вывод типов параметров шаблонного класса, целочисленные повышения, время жизни, порядок инициализации, неявные преобразования и т.д. Я также стараюсь дать представления о том, как эти вещи реализуются и как они появились. И, наконец, я всегда даю советы по предупреждениям, линтерам, санитайзерам, библиотекам, техникам и т. д., которые помогут вам избежать неоднозначностей и проблем, поднятых в вопросах.
— Мой любимый вопрос: есть ли в книге пасхалки? Мне кажется, я нашла одну из них во время чтения, но не буду её раскрывать.
— Да, раздел под названием "Взломай планету" — это отсылка к одному из моих любимых фильмов, "Хакеры" (1995).
Рисунок N8 — "Взломай планету", отрывок из книги
— На ваш взгляд, какие распространённые ошибки часто допускают программисты на C++?
— Большую часть своей карьеры я работал в стартапах и небольших командах, поэтому мой опыт может отличаться от опыта людей, работавших в более крупных организациях. Но вот кое-что из того, что сразу приходит на ум:
Много времени может быть потрачено впустую на неважные мелочи, ревью и полировку, которые на деле не имеют значения. И наоборот, кажущиеся невинными "временные" решения/фиксы/хаки могут серьёзно повлиять на других людей, работающих с той же кодовой базой. Различать такие ситуации помогают только опыт и внимательность.
Как разработчики инструмента для поиска ошибок и уязвимостей в коде, мы не можем не согласиться! Мы исследуем ошибки в коде C++ уже 16 лет, и проблемы, вызванные небрежностью и старым добрым Copy-Paste, по-прежнему остаются одними из самых распространённых, и порой разработчикам сложнее всего заметить именно их.
— Вы внесли большой вклад в развитие сообщества благодаря книгам и выступлениям на конференциях. Даже выступали на C++ Russia в 2021 году с докладом " Just Enough Assembly for Compiler Explorer". Давайте поговорим об обучении для C++ программистов. Я полностью согласна с вами в том, что учиться, задавая вопросы "как это работает" и "почему" — лучший способ. Помимо книг, откуда ещё вы черпаете знания?
— Мне нравится посещать конференции по С++. Самые любимые: NDC TechTown, ACCU, C++ on Sea и Meeting C++. Но просто заниматься интересным делом вместе с замечательными коллегами — это мой любимый способ учиться.
Рисунок N9 — NDC TechTown
Рисунок N10 — C++ on Sea
Чаще всего я читаю специализированную литературу, чтобы узнать что-то конкретное. Но недавно я прочитал одну хорошую и не очень нишевую книгу — "Искусство эффективного программирования" Фёдора Пикуса.
Рисунок N11 — "The Art of Writing Efficient Programs", Фёдор Пикус
— Как опытный участник конференций и докладчик, не могли бы вы рассказать о самом интересном выступлении, на котором побывали? Чем оно вам запомнилось?
— Сложно выделить одно, но прямо сейчас вспоминается выступление Олафура Вааге на конференции NDC TechTown в этом году. Вы наверняка слышали про эксперименты, когда люди пытаются запустить Doom на разных необычных устройствах? Так вот, Олафур запустил игру на настоящем спутнике в космосе.
Рисунок N12 — DOOM в космосе, NDC TechTown
Кстати, наша команда также недавно "экспериментировала" с DOOM. Один из наших C++ разработчиков написал статью, в которой разобрал ошибки, встречающиеся в GZDoom. Прочесть об этом кишащем "жуками" приключении вы можете в нашем блоге.
— Вы внесли свой вклад в область компьютерных наук как инженер-программист, а в сообщество C++ — как докладчик на конференциях, автор книг и разработчик множества пет-проектов, таких как CppQuiz. Чем вы особенно гордитесь и почему?
— Оглядываясь назад, я думаю, что больше всего горжусь своим первым выступлением с докладом на конференции ACCU. До того момента я никогда не выступал на конференциях или митапах, но тогда я вышел и просто рассказал свой доклад перед большой аудиторией, включая многих моих кумиров. Честно говоря, сам доклад был не очень хорошим, но и не таким уж плохим, как можно было ожидать, и я воспринимаю его как начало своей "карьеры" спикера на конференциях. Если вы попали на конференцию, где проводятся блиц-доклады, рекомендую попробовать выступить!
— Какой совет вы бы дали себе в начале пути изучения C++ и компьютерных наук в целом?
— Не бойтесь задавать вопросы! Когда вы новичок (в программировании или просто на новой работе), спрашивать может быть страшновато, но помните: люди предполагают, что вы ещё многого не знаете. И если вы переживаете о том, что покажетесь кому-то "глупым", помните: вы выглядите гораздо умнее, если задаёте уточняющие вопросы, а не просто предполагаете что-то и принимаете необоснованные решения. На моей предыдущей работе у меня была коллега, которая пришла к нам сразу после университета, но она никогда не боялась спросить: "Как на самом деле работает эта штука?" или "Что вы имеете в виду?". Это только подчёркивало её уверенность в себе и интеллект, и сразу было понятно, что она быстро взойдёт по карьерной лестнице.
Отличный момент для завершения интервью! Здорово! Большое спасибо за содержательную беседу и за отличную книгу, которая пополнит библиотеку C++ программиста. Удачи вам в достижении ваших целей. Желаю чистого кода!
0