Три совета, как не выучить C++ за 21 день (субъективный гайд с дополнениями)

Типичная проблема новичков при изучении языка программирования — они тонут в море учебных материалов. Интернет предлагает тонны статей, курсов и книг по 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-разработчика, который понимает красоту низкоуровневых оптимизаций, но при этом умеет писать читаемый код, и готов работать над сложными задачами в экосистеме офисных продуктов. 

Источник: https://habr.com/ru/companies/ncloudtech/articles/925932/

Опубликовано в категории: Статьи