Сделайте C++ Снова Великим!.. В Туле

Не так давно у нас в офисе мы провели бесплатный курс лекций «Современный и эффективный C++» и записали их на видео.

Курс рассчитан на недавно пришедших в нашу команду программистов, стажеров и всех желающих.

В этой статье мы хотели бы осветить цель данного курса, процесс подготовки к нему и подвести итоги.

Мы надеемся, что кому-то из вас наш курс лекций покажется интересным и вы оцените нашу работу по достоинству.

Желаем Вам приятного просмотра отчетов!

Сделайте C++ снова великим!.
</p><p>
.
</p><p>
 в Туле



Как пришла идея

Наша компания PVS-Studio занимается разработкой статического анализатора кода, выявляющего ошибки и потенциальные уязвимости в исходном коде программ, написанных на C, C++, C# и Java. И не секрет, что мы заинтересованы в привлечении молодых специалистов.

Часто бывает, что у нас есть студенты-практиканты, которые хотели бы получить профессиональный опыт в области программирования, но пока не обладают достаточными знаниями в этой области.

Кроме того, нашим вновь прибывшим специалистам также нужна помощь в профессиональном росте.

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

У этой идеи было как минимум три цели: показать молодым специалистам и стажерам, как писать код точнее, эффективнее и безопаснее; популяризировать C++ за пределами офиса и продемонстрировать перспективность языка в плане изучения и дальнейшей работы с ним; популяризировать нашу компанию как интересного работодателя.

Определившись с целями и вдохновившись идеей, мы приступили к воплощению нашей мечты в реальность.



Подготовка

При дальнейшем обсуждении нашей идеи стало появляться так много вопросов и так мало ответов (удивительно, правда?).

В повестке дня было: время и место, кто будет готовить курс, кто его будет проводить, какие темы следует осветить, будем ли мы записывать курс на видео, как мы это будем делать, как его продвигать и где лучше всего.

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

Э», «Кто.

Э», «Где.

Э» ».

И вот, когда мысли и идеи всех «синхронизировались», было решено, что курс будет состоять из 12 лекций по 2 раза в неделю, с 9 июля по 15 августа.

Андрей Карпов и на добровольно-принудительной основе Филипп Хандельянц были выбраны лекторами.

На нашей YouTube канал Мы собрали все видео в отдельный плейлист для удобства просмотра.

Также у нас есть Сообщество Вконтакте , где собрана вся информация по лекциям.

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

человек.

Остановимся подробнее на темах лекций и их содержании.



Нововведения в стандарте C++11

C++11. сколько смысла в этих пяти символах.

Первая лекция получилась самой длинной и, пожалуй, информативной, так как почти за два часа Филипп и ребята обсудили множество вопросов.

Поэтому они начали с рассмотрения языка C++ и актуальности его использования.

Затем мы перешли непосредственно к самим изменениям в стандарте C++11. В этой части мы рассмотрели расширение ядра языка, а именно:

  • универсальная инициализация;
  • семантика перемещения;
  • общие константные выражения (constexpr) ;
  • изменения в определении типа POD;
  • списки инициализации (std::initializer_list ) ;
  • вывод типа через авто И тип объявления ;
  • диапазон для ;
  • лямбда-функции;
  • альтернативный синтаксис функции;
  • вывести тип возвращаемого значения функции;
  • делегирование конструкторов;
  • спецификаторы по умолчанию/удалить для функций;
  • спецификаторы переопределить/окончательный при работе с полиморфизмом;
  • nullptr_t И нульптр ;
  • и многие многие другие.

После обсуждения расширений ядра Филип рассказал о расширениях стандартной библиотеки, в том числе:
  • обновление стандартной библиотеки с учетом изменений в языковом ядре;
  • многопоточность: потоки ( станд::поток ), мьютексы ( станд::мьютекс, .

    ), условные переменные ( std::условная_переменная, .

    );

  • RAII-обертки ( std::lock_guard, std::unique_lock );
  • кортежи ( станд::кортеж) ;
  • хеш-таблицы ( std::unordered(_set/_multiset/_map/_multimap );
  • обычные выражения ( станд::регулярное выражение );
  • умные указатели ( std::unique_ptr, std::shared_ptr, std::weak_ptr );
  • вместо этого генераторы псевдослучайных чисел рандом() ;
  • обертки ссылок ( std::reference_wrapper );
  • универсальная оболочка для функций ( станд::функция );
  • типы ( тип_черты ).

Конечно, стоит понимать, что такой огромный объем информации невозможно подробно осветить за два часа, поэтому некоторые моменты были рассказаны более подробно, а другие имели более вводную функцию.



Нововведения в стандарте C++14

Вторая лекция была посвящена рассмотрению новшеств стандарта C++14. Изменений было немного, поэтому слушатели «мучились» не 2 часа, а всего 40 минут :-).

Как и в первой лекции, внимание было уделено двум основным моментам: изменениям ядра C++ и изменениям стандартной библиотеки.

Вот о чем мы говорили:

  • Вывод типа возвращаемого значения для функций без явного указания завершающего объявления типа возвращаемого значения ( конечный тип возвращаемого значения );
  • тип объявления (авто) ;
  • смягчение ограничений для constexpr ;
  • переменные переменные;
  • агрегатная инициализация;
  • двоичные литералы;
  • разделители чисел;
  • общие лямбды;
  • список захвата лямбда-функции с инициализацией;
  • атрибут [[устарело]] , std::shared_timed_mutex;
  • гетерогенный поиск ассоциативных контейнеров;
  • стандартные пользовательские литералы (s для станд::строка ; ч,мин , с , РС , нас , нс Для станд::продолжительность , если , я , иль для мнимой части станд::комплекс );
  • станд::получить теперь можно получить значение из станд::кортеж тип;
  • std::make_unique ;
  • std::integer_sequence ;
  • бесплатные функции std::begin, std::end, std::cbegin, std::cend, std::rbegin, std::rend, std::crbegin, std::crend ;
  • станд::обмен .



Вывод типов в C++

Рассмотрев нововведения стандартов C++11 и C++14, мы сосредоточились на теме вывода типов в C++.

Почему была поднята эта тема? До появления C++11 мало кто глубоко задумывался о том, что это такое и как он работает, за исключением авторов «магии шаблонов» и разработчиков компиляторов.

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



Нововведения в стандарте C++17

Говоря о современном C++, нельзя было не упомянуть новейший существующий стандарт C++.

Изложение изложено по уже проверенной схеме: рассматривались изменения в ядре, а затем в стандартной библиотеке.

Таким образом, мы рассмотрели:

  • выведение типов шаблонных классов из конструкторов;
  • бросать() считается как нет, кроме и помечены как обесцененный ;
  • нет, кроме стал частью системы типов и теперь учитывается при выборе перегрузок функций;
  • удаление копирования ;
  • свертка ( выражение складки );
  • если/переключить с инициализатором;
  • если constexpr , структурированные привязки ;
  • вложенные пространства имен;
  • новые атрибуты [[ Проваливаться ]], [[ возможно_неиспользуемый ]] И [[ не выбрасывать ]];
  • шестнадцатеричные вещественные литералы;
  • static_assert принимает сообщение как необязательный параметр вместо обязательного;
  • имя типа теперь разрешено входить шаблон шаблона параметры;
  • еще одно новое правило вывода типа авто С список-инициализаторов скобок ;
  • в соответствии переменные;
  • авто может использоваться в параметрах шаблона;
  • директива препроцессора __has_include ;
  • регистр стало зарезервированным словом и до сих пор не используется;
  • std::string_view ;
  • станд::необязательно ;
  • станд::любой ;
  • станд::вариант ;
  • станд::байт ;
  • std::uncaught_Exceptions вместо std::uncaught_Exception ;
  • повышение::файловая система с изменениями, загруженными как std::файловая система ;
  • try_emplace И вставить_или_назначить для ассоциативных массивов;
  • бесплатные функции станд::размер , станд::пусто И станд::данные ;
  • переменные шаблона для тип_черты ( станд::*_v ).



STL: концепция, контейнеры, итераторы

Пятая лекция была целиком посвящена стандартной библиотеке шаблонов.

Мы обсудили историю STL, из чего он состоит и как начать его использовать.

Подробнее о стандартных контейнерах мы говорили ( вектор , список , вперед_список , дек , .

), контейнеры-адаптеры ( куча , очередь , Priority_queue , куча ) и о типах итераторов ( вход , выход , вперед , двунаправленный , случайный , смежный ).



STL: алгоритмы, оболочки, функциональные объекты

На этой лекции мы продолжили работу над STL. Филип рассказал о том, что нет необходимости заниматься велосипедостроением и пора начать использовать стандартные алгоритмы STL. Различные категории алгоритмов, полезные функциональные оболочки ( плюс , минус , .

).



Статический анализ как неотъемлемая часть разработки при написании программ на C++

Филипп решил немного отдохнуть :-), а седьмую лекцию прочитал наш технический директор Андрей Карпов.

Он рассказал о статическом анализе вообще и о том, почему его необходимо использовать в работе.

Андрей объяснил прямую связь между использованием статического анализатора и улучшением качества кода при работе над большим проектом.

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



Стандарт программирования PVS-Studio и общие приемы разработки эффективной диагностики C++

Филипп пока отдыхает, а Андрей и слушатели заглянули на внутреннюю кухню разработки PVS-Studio, рассмотрев две темы.

Сначала мы немного рассказали о стандарте кодирования, принятом в нашей команде, и о том, почему мы решили форматировать код именно так, а не иначе.

Во-вторых, мы обсудили некоторые приемы микрооптимизации кода, которые мы используем при разработке анализатора.

Мы обсуждали знаменитую фразу «преждевременная оптимизация — корень всех зол».

Тема была затронута вскользь, но Андрей планирует в ближайшее время посвятить этому отдельный доклад».

Преждевременная оптимизация – зло! Да здравствует преждевременная оптимизация! "на конференции C++Россия.

Так что приглашаем всех на эту замечательную конференцию и доклад Андрея.

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

Что касается контента, то здесь обсуждались следующие моменты стандарта кодирования PVS-Studio:

  • основные положения;
  • струны;
  • именование переменных;
  • типы именования;
  • функции именования;
  • выравнивание кода;
  • табличное оформление сложного состояния;
  • разделение пространств;
  • преждевременная оптимизация;
  • оптимизация размеров классов и структур;
  • переменные с коротким временем жизни и многое другое.



Метапрограммирование на C++: шаблоны, вычисления constexpr и т.д.

Филипп отдохнул, набрался сил и рассказал о «магии шаблонов».

Всем известно, что с каждым выпуском нового стандарта метапрограммирование становится все более сложным и непонятным; количество «магии шаблонов» в базах кода постоянно растет. Целью лекции было познакомить с этим вопросом, рассказав об основных аспектах метапрограммирования:

  • шаблонные функции;
  • классы шаблонов;
  • полная и частичная специализация шаблонов;
  • переменные шаблоны;
  • свертка.

Слушатели через 30 минут:

Сделайте C++ снова великим!.
</p><p>
.
</p><p>
 в Туле

Но это было еще не все! Филип решил окончательно их добить, рассказав о вычислениях и манипуляциях с типами на этапе компиляции, о CRTP (Curiosity recurring templatepattern), SFINAE и детекторах.



Создание проектов на C/C++ и их оптимизация

Выжившим на предыдущей лекции рассказали, как пить меньше кофе и меньше драться на мечах, пока компилировался их проект.

Сделайте C++ снова великим!.
</p><p>
.
</p><p>
 в Туле

Были рассмотрены следующие аспекты:
  • этапы трансляции на языки C/C++;
  • зависимости;
  • внешние шаблоны;
  • предварительно скомпилированные заголовки;
  • параллельная и распределенная компиляция;
  • кэш компилятора;
  • замена компонентов перевода: препроцессор, компилятор, компоновщик;
  • Единый блок компиляции (SCU);
  • модули.



Неуверенное поведение, или как выстрелить себе в ногу

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

Нет, они не знают. И никто не знает. Именно здесь начинается неопределенное поведение, а слово «неопределенное» означает, что мы не можем делать никаких предположений или догадок.

Вы просто не можете писать программы, которые вводят неопределенное поведение, и точка.

Давайте рассмотрим тему неопределенного поведения и некоторые примеры кода, которые к нему приводят», — так звучало начало 11 лекции, в которой Андрей вновь принял эстафету от Филиппа и раскрыл ключевые моменты этой темы, включая терминологию.

:

  • расплывчатое и неопределенное поведение;
  • выход за границу массива;
  • отсутствие виртуального деструктора;
  • оператор удалить ;
  • нулевые указатели;
  • смены;
  • целочисленное переполнение (64-битные ошибки);
  • целочисленное переполнение (контрольная сумма).



C++20 и обозримое будущее

Мы не могли не завершить нашу серию лекций рассказом о скором выпуске новейшего стандарта C++20. Основной акцент был сделан на понятиях ( Концепции ), библиотека диапазонов ( Диапазоны ), сопрограммы ( Сопрограммы ), модули ( Модули ), контракты ( Контракты ), оператор трехстороннего сравнения оператор <=> ( Оператор космического корабля ), макросы для тестирования функциональности ( Макросы тестирования функций ), атрибуты ( Атрибуты ), станд::формат , станд::jthread и о многом другом.

И вот, когда все организационные вопросы были решены, настал момент реализации идеи.



Выполнение

Мы бы, конечно, назвали этот этап «Ожидание-Реальность», потому что, как это обычно бывает, все, что задумано на этапе планирования, меняется в миллион раз больше на этапе реализации.

Естественно, мы знали об этом факте и были готовы( Нет ), что что-то пойдет не так.

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

В связи с этим почти половина лекций курса была перезаписана или некоторые части сняты на видео.

И если в случае с Андреем не нужно было ничего перезаписывать, так как его лекции длились около часа и этого времени нам хватало, чтобы компания ниже не проводила монтажных работ, то с лекциями Филиппа нам пришлось мучайтесь, потому что 1,5-2 часа на одну лекцию — это не каждый программист выдержит, и не каждый рабочий способен столько времени ждать, не работая.

Пожалуй, эта ситуация была самой неожиданной; в остальном никаких серьезных проблем не возникло.

Теперь поговорим о начале курса.

На первую лекцию записались около 20 участников, но на самом деле ее посетили 11 студентов.

Мы, конечно, понимали, что глупо судить по первому событию, и решили посмотреть, что будет дальше.

Число студентов на протяжении всего курса постоянно менялось: то увеличивалось, то уменьшалось.

Однако нам понравилось то, что сформировался некий «костяк» группы, который присутствовал на каждой лекции.

Одним из преимуществ также является активность участников.

Как и в любом новом коллективе, поначалу все смущались и молча слушали лекцию, но примерно через 3-4 лекции эта скованность прошла и занятия пошли в более активной форме – вопросы, дискуссии, просто живое общение после лекции – и бывали случаи, когда человек продолжал общаться с лектором еще минут 40-50, потому что ему очень была интересна тема и он очень хотел развиваться в этом направлении.

Это не могло не радовать, так как мы понимали, что отчасти способствовали этому факту (+100 к карме).



Сделайте C++ снова великим!.
</p><p>
.
</p><p>
 в Туле

Самым упорным были вручены сертификаты.



Сделайте C++ снова великим!.
</p><p>
.
</p><p>
 в Туле



Полученные результаты

Ключевым показателем эффективности нашего предприятия является достижение поставленных целей.

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

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

Смогли ли мы популяризировать язык C++ за пределами офиса? Честно говоря, мы думаем, что это 50/50. С одной стороны, были очень заинтересованные люди, которые не только посещали наши лекции, но и пересматривали их потом, искали дополнительную информацию по той или иной теме и приходили во всеоружии на следующую лекцию.

Какая там подготовка! Был случай, когда шел очень сильный дождь, и человек пришел мокрый, чтобы не пропустить урок.

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

Для этого у меня есть как минимум три причины:

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

  2. Курс проходил в середине лета (да, мы знаем, что в этом году это не аргумент, особенно если вы живете в средней полосе России).

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

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

Если у вас остались какие-либо вопросы, возможно, даже предложения или идеи, не стесняйтесь оставлять комментарии и давайте пообщаемся :).

И да, спасибо, что прочитали эту статью.

Ссылка на подборку докладов: «Современный и эффективный C++» В контакте с И YouTube .

Будем признательны, если вы поделитесь ими в социальных сетях.

Теги: #программирование #C++ #курсы программирования #pvs-studio #лекции по программированию #курсы c++

Вместе с данным постом часто просматривают: