Типичная проблема новичков при изучении языка программирования — они тонут в море учебных материалов. Интернет предлагает тонны статей, курсов и книг по C++, но как выбрать действительно стоящие?

Меня зовут Владислав Столяров, я руководитель команды анализа безопасности продуктов в мультипродуктовой экосистеме МойОфис. Наши решения — Документы Настольные и Документы Онлайн — во многом работают благодаря C++, так что мне есть чем поделиться. В этой статье расскажу, что делать, если вы вдруг решили залететь в плюсы, но уже чувствуете, как накрывает экзистенциальный кризис от обилия информации.


Поймите, точно ли вам нужно учить C++

Для начала разберемся: а надо ли вам это? На самом деле, я допускаю два варианта, когда это возможно.

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

Второй вариант — вам это действительно нужно (так сказать, рациональный подход).

Например, большинство университетов на IT спецухах преподают программирование на C++. А значит какое-то знание языка есть у большинства студентов этих вузов (тангенс угла, переведенного в радианы вычисляли; матрицы переворачивали). Кажется хорошей идеей расширить эти знания до возможности коммерческого применения.

Таким образом, изучение языка с околонулевого уровня может быть полезно, например, для студентов технических вузов.

Тут, кстати, нужно сделать оффтоп: такие ВУЗы, как МФТИ с их Константином Владимировым, сюда не относится. Это не только лучшие курсы по языку в России, но и в мире. Причем бесплатно и на русском.

Первый совет: послушайте курс лекций

Также, если вы все еще хотите учить C++ и вам нравится формат видеолекций, то дальше этого пункта можно не читать (ладно, ладно, просто вернитесь к этой части статьи после того, как закончите читать).

Итак, вот ссылка на канал Константина: плейлист с основами языка. Досмотрев их, можно двинуть на магистерский курс. Это что-то вроде Терминатора 2 или Крёстного отца 2, то есть он, возможно, понравится вам даже больше первой части. Вдумчиво посмотрите эти два курса. Что делать дальше вы и сами разберетесь.

Также лекции можно посмотреть на Rutube.

Константин, респект!
Константин, респект!

Второй совет: найдите мастера

На самом деле, отличный способ освоить C++ — обратиться к рекомендации опытного разработчика, уже прошедшего этот тернистый путь. Вычислить «того самого» спеца можно примерно по таким «грин-флагам» (тут всё по критериям Страуструпа):

  • чинит многопоточный код volatile;

  • при виде std::vector<bool> вздрагивает, но молчит — как дзен-буддист;

  • на проекте 23-й стандарт, а он до сих пор использует SFINAE вместо концептов;

  • подливает виски в кофе, сидя в опенспейсе — и уверен, что делает это незаметно :)

Знакомьтесь, Олег 23 года.
Знакомьтесь, Олег 23 года.

Если вам еще не повезло устроиться на работу (или стажировку), и вы читаете советы в интернете, то по тону и содержанию советов нужно пытаться примерить ролевую модель, описанную выше и в приоритете слушать советы best match кандидатов.

Также преступно будет не упомянуть о таком способе, как общение с коллегами в замечательных чатах в телеграм:

  • supapro.cxx — чат для тех, кто немного знает C++, простые вопросы, синтаксису и ide (в общем, для новичков);

  • pro.cxx — главный чат по серьезным вопросам для более опытных разработчиков.

Градация, конечно, условная, но там есть дружелюбные администраторы, которые всегда подскажут, если вопрос лучше задать в другом чате. Уж точно получше гиен со Stack Overflow (оценочное суждение автора).

Третий совет: читайте книги и практикуйтесь

Возможно, вы хотите учить C++ по книгам. Тогда выберите фундаментальный труд по основам языка. Тут также будет субъективная рекомендация.

У меня чтение любой книги по программированию проходит в два этапа. Первый — появление энтузиазма (без него на самом деле никуда) к освоению какой-либо темы. По ней есть вроде бы интересная книга. Не трудно догадаться, что первый этап я называю «на энтузиазме».

Книга читается, и по мере продвижения, обратно пропорционально тому, насколько книга интересно и полезно написана, энтузиазм гаснет. Если в этот момент книга прочитана примерно до середины, то она дочитывается, если нет – дропается. Таким образом, мы плавно переходим ко второму этапу — «на морально волевых». Примерно с середины книги (повезло, если со второй трети) книга дочитыватеся как раз на них родимых.

Теперь о самой фундаментальной книге. Тут, с моей точки зрения, есть также два подхода. Первый, для мазохистов – Страуструп:

Я знаю о чем говорю. Сам по ней учился. Это издание, 2010 года, а вам я советую взять поновее. В принципе год неважен, главное, чтобы стандарт был выше 11. С++ до и после 11 стандарта – два разных языка. Дальше разница ощущается меньше.

Например, фича 20 стандарта – модули. Часто вы используете модули, коллеги? А все компиляторы их поддерживают? И даже чувствительная мне тема статического анализа кода с модулями еще особо не работает).

По моим критериям, этап «на морально волевых» включается с первой трети этой книги. Из плюсов тут можно отметить относительно неплохой русский перевод и получение фундаментальных знаний о языке из первых уст его создателя (критерий знания языка автором – 4 из 10 по шкале Страуструпа).

Второй подход – сбалансированный. C++ Primer (или «Язык программирования C++ Базовый курс»). Я читал эту версию:

У нее местами дурацкий перевод (здравствуйте типы данных «набор» и «карта»). Но, тем не менее, она довольно фундаментальная и охватывает все основы языка. Эта книга мне кажется не такой душной, как первый вариант. «На морально волевых» с двух третей/трех четвертей книги. С моей точки зрения — отлично!

После теоретических основ нужно жестко заняться практикой. В общем-то, чтоб выучить язык программирования, нужно писать код. Много кода. Действительно много кода.

Сначала можно делать упражнения из выбранной книги. Но, по мере освоения синтаксиса языка и выполнения несложных упражнений, нужно начать писать какой-нибудь проектик. Я писал шахматы (эталонный говнокод), простенький компилятор, приложение для учёта инвестиций, даже блокчейн свой пробовал делать. Очень популярный вариант (по субъективным опросам) – игровой движок. Меня не коснулось, но очень много коллег когда-то писали и им нравилось. Вообще, при общении с коллегами, у меня создалось впечатление, что примерно половина из них когда-то делали свои игровые движки. Если вы делали – отпишитесь в комментариях, интересно продолжить сбор статистики:)

Во время работы над своими проектами стоит почитать советы Майерса (там много книг: 35 советов, 42 совета, 50 советов, 55 советов). В общем, очень много советов по тому, как писать код. Лучше всего они усваиваются как раз во время практики. Если любите советы, то можно ещё в C++ Core Guidelines заглядывать, там много полезного-интересного.

Для проработки алгоритмических навыков (собесы то надо как-то проходить) можно параллельно решать литкод. Тут в качестве книжного подкрепления рекомендую любую из книг по алгоритмам в диапазоне от «Грокаем алгоритмы» (вся книга читается «на энтузиазме») до трехтомника «Искусства программирования» Дональда Кнута («морально волевые» с первых страниц, однако, при определённых наклонностях, в соответствии с фамилией автора, в процессе может понравиться).

На этом этапе также очень полезно иметь под рукой удобный справочник — cppreference. Лучший сайт, на котором можно оперативно почитать про те или иные языковые конструкции.

Развиваем джедайские навыки в отдельных областях

  • метапрограммирование – начать стоит с книги C++ Шаблоны. Я читал такой вариант:

Если интересно почитать, откуда у современного метапрограммирования растут ноги, то есть фундаментальная книжка Александреску. Она относительно тяжёлая для усвоения, но вы к этому моменту уже будете достаточно закалены:

  • Многопоточка. Тут я могу порекомендовать:

Отличная книга для начинающих практиковаться в этой области. Как раз после ее прочтения я перестал чувствовать себя дирижёром в оркестре, состоящим из людей без слуха и морального желания играть (в количестве std::thread::hardware_concurrency) и начал писать более-менее безбажный код. В музыкальной аналогии, программы перестали издавать звук царапанья по стеклу, начав исполнять хотя бы собачий вальс.

Также неплохая идея — периодически мониторить, что происходит в мире. Один из самых простых способов — посещать конференции. Тут я могу порекомендовать C++ Russia. Это как раз конфа, где разработчики рассказывают о наболевшем: возникших проблемах и способах их решения. Начать знакомство можно с просмотра докладов прошлых лет. Я там тоже выступал пару раз.

Если хочется проникнуться международным опытом коллег, то есть отличная конфа – cppcon. Там, в том числе, выступают многие авторы книг, представленных выше.

В общем-то, на этом все. Какой путь вы бы не выбрали, на этом этапе вы уже сами научитесь выбирать хорошие материалы.

В заключение

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

Ну и если после изучения всех этих мультиметодов и шаблонов и бессонных ночей с cppreference у вас появилось желание применить свои знания C++ на реальных проектах — приходите к нам в команду «МойОфис»! Мы ищем C++/Qt-разработчика, который понимает красоту низкоуровневых оптимизаций, но при этом умеет писать читаемый код, и готов работать над сложными задачами в экосистеме офисных продуктов. 

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


  1. 1TheNikita
    09.07.2025 13:49

    Мем
    Мем

    Сразу вспоминается старый добрый мем)


    1. Siemargl
      09.07.2025 13:49

      Ещё есть мем "как нарисовать лошадь"


  1. dv0ich
    09.07.2025 13:49

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

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

    Ну и да, чатботы в помощь. С++ это старый зрелый язык, по нему мегатонны материалов, так что ИИшки владеют им неплохо. Но нужно быть точным в промптах, потому что тот же чатгпт любит навернуть сырых указателей и прочей порнографии без острой на то надобности. Лучше прямо требовать код в духе последних стандартов.


  1. artemisia_borealis
    09.07.2025 13:49

    Как выучить С++ за 21 Полярный день.

    Это был бы топчик и к тому же реалистичный.


  1. TimurZhoraev
    09.07.2025 13:49

    Было бы неплохо сделать обзор может даже по условным git-проектам где есть примеры решения задач где используются концептуальные преимущества языка или по содержанию "диска прилагаемого к книге". В основном сейчас лучше изучить концепции из разряда "наследование - это неявное дополнительное поле типа, соответствующее номеру класса по желанию компилятора плюс массив указателей на процедуры или switch-case, реализующие виртуальные функции согласно этому полю", "рекурсия - это неявный стек, который располагается не совсем вручную", ну и разумеется механизмы лямбда, различных темплейтов что это не просто синтаксический сахар и форма макросов, и, конечно же, dynamic_cast и как правильно его готовить чтобы не было сегфолтов.


    1. Nemoumbra
      09.07.2025 13:49

      наследование - это неявное дополнительное поле типа, соответствующее номеру класса по желанию компилятора плюс массив указателей на процедуры или switch-case, реализующие виртуальные функции согласно этому полю

      У меня немного над глазом задёргалось после этой фразы. Речь ведь шла про не про любое наследование, а при наследование при наличии виртуальных функций, да?


  1. Codziro
    09.07.2025 13:49

    Ваша статья прямо в яблочко для меня!

    Мне было "надо". Хотел перейти в Unreal engine после довольно продолжительного опыта в веб играх.

    Хотел освоить с наскока, стал задачки на codewars на C++ делать. Но довольно быстро понял, что ничему там не учусь именно в плане языка.

    Стал читать Страуструпа, третье издание на английском. Очень муторно, согласен, что для новичка это так себе вариант. В итоге сейчас использую его скорее, как справочник, когда попадётся очередная непонятная штуковина в ответах нейрочатов.

    Стал писать свой 3d движок. Пригодится для понимания того, как готовые движки работают. И для упражнений отличный вариант!

    В итоге пользуюсь deepseek, Страуструпом и книгой по игровым шаблонам проектирования Game Programming Patterns с примерами на C++

    Вообще заметил, что во многие облости как-то проще заходить с нуля. Например для андроид разработки и котлина есть суперские справочные материалы и уроки от гугла и intelij. Для go и python есть какие-то уроки прямо на их официальных сайтах. И если по ним не станешь мастером, то хотя бы базу, чтобы другие материалы заходили проще, получишь. А вот откуда начинать с C++ - действительно вопрос хороший


    1. wander
      09.07.2025 13:49

      Вместо Старуструпа можно взять Липпмана.


  1. rukhi7
    09.07.2025 13:49

    Интересно почему нет ни одной статьи о том как выучить математику, диф-уры,матанализ, ...

    Там тоже много чего интересного.