Не так давно у нас в офисе мы провели бесплатный курс лекций «Современный и эффективный C++» и записали их на видео.
Курс рассчитан на недавно пришедших в нашу команду программистов, стажеров и всех желающих.
В этой статье мы хотели бы осветить цель данного курса, процесс подготовки к нему и подвести итоги.
Мы надеемся, что кому-то из вас наш курс лекций покажется интересным и вы оцените нашу работу по достоинству.
Желаем Вам приятного просмотра отчетов!
Как пришла идея
Наша компания 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 и т.д.
Филипп отдохнул, набрался сил и рассказал о «магии шаблонов».Всем известно, что с каждым выпуском нового стандарта метапрограммирование становится все более сложным и непонятным; количество «магии шаблонов» в базах кода постоянно растет. Целью лекции было познакомить с этим вопросом, рассказав об основных аспектах метапрограммирования:
- шаблонные функции;
- классы шаблонов;
- полная и частичная специализация шаблонов;
- переменные шаблоны;
- свертка.
Но это было еще не все! Филип решил окончательно их добить, рассказав о вычислениях и манипуляциях с типами на этапе компиляции, о CRTP (Curiosity recurring templatepattern), SFINAE и детекторах.
Создание проектов на C/C++ и их оптимизация
Выжившим на предыдущей лекции рассказали, как пить меньше кофе и меньше драться на мечах, пока компилировался их проект.Были рассмотрены следующие аспекты:
- этапы трансляции на языки C/C++;
- зависимости;
- внешние шаблоны;
- предварительно скомпилированные заголовки;
- параллельная и распределенная компиляция;
- кэш компилятора;
- замена компонентов перевода: препроцессор, компилятор, компоновщик;
- Единый блок компиляции (SCU);
- модули.
Неуверенное поведение, или как выстрелить себе в ногу
«Некоторые люди думают, что знают, как ведут себя C и C++, когда они играют с указателями переполнения или нулевыми указателями.Нет, они не знают. И никто не знает. Именно здесь начинается неопределенное поведение, а слово «неопределенное» означает, что мы не можем делать никаких предположений или догадок.
Вы просто не можете писать программы, которые вводят неопределенное поведение, и точка.
Давайте рассмотрим тему неопределенного поведения и некоторые примеры кода, которые к нему приводят», — так звучало начало 11 лекции, в которой Андрей вновь принял эстафету от Филиппа и раскрыл ключевые моменты этой темы, включая терминологию.
:
- расплывчатое и неопределенное поведение;
- выход за границу массива;
- отсутствие виртуального деструктора;
- оператор удалить ;
- нулевые указатели;
- смены;
- целочисленное переполнение (64-битные ошибки);
- целочисленное переполнение (контрольная сумма).
C++20 и обозримое будущее
Мы не могли не завершить нашу серию лекций рассказом о скором выпуске новейшего стандарта C++20. Основной акцент был сделан на понятиях ( Концепции ), библиотека диапазонов ( Диапазоны ), сопрограммы ( Сопрограммы ), модули ( Модули ), контракты ( Контракты ), оператор трехстороннего сравнения оператор <=> ( Оператор космического корабля ), макросы для тестирования функциональности ( Макросы тестирования функций ), атрибуты ( Атрибуты ), станд::формат , станд::jthread и о многом другом.И вот, когда все организационные вопросы были решены, настал момент реализации идеи.
Выполнение
Мы бы, конечно, назвали этот этап «Ожидание-Реальность», потому что, как это обычно бывает, все, что задумано на этапе планирования, меняется в миллион раз больше на этапе реализации.Естественно, мы знали об этом факте и были готовы( Нет ), что что-то пойдет не так.
Главной проблемой для нас стали соседи снизу, которые активно делали ремонт в арендованном ими помещении, а в нашем кабинете началось бурение (без комментариев), что не могло не отразиться на записи лекций.
В связи с этим почти половина лекций курса была перезаписана или некоторые части сняты на видео.
И если в случае с Андреем не нужно было ничего перезаписывать, так как его лекции длились около часа и этого времени нам хватало, чтобы компания ниже не проводила монтажных работ, то с лекциями Филиппа нам пришлось мучайтесь, потому что 1,5-2 часа на одну лекцию — это не каждый программист выдержит, и не каждый рабочий способен столько времени ждать, не работая.
Пожалуй, эта ситуация была самой неожиданной; в остальном никаких серьезных проблем не возникло.
Теперь поговорим о начале курса.
На первую лекцию записались около 20 участников, но на самом деле ее посетили 11 студентов.
Мы, конечно, понимали, что глупо судить по первому событию, и решили посмотреть, что будет дальше.
Число студентов на протяжении всего курса постоянно менялось: то увеличивалось, то уменьшалось.
Однако нам понравилось то, что сформировался некий «костяк» группы, который присутствовал на каждой лекции.
Одним из преимуществ также является активность участников.
Как и в любом новом коллективе, поначалу все смущались и молча слушали лекцию, но примерно через 3-4 лекции эта скованность прошла и занятия пошли в более активной форме – вопросы, дискуссии, просто живое общение после лекции – и бывали случаи, когда человек продолжал общаться с лектором еще минут 40-50, потому что ему очень была интересна тема и он очень хотел развиваться в этом направлении.
Это не могло не радовать, так как мы понимали, что отчасти способствовали этому факту (+100 к карме).
Самым упорным были вручены сертификаты.
Полученные результаты
Ключевым показателем эффективности нашего предприятия является достижение поставленных целей.Стало ли молодым специалистам и стажерам легче работать в нашем коллективе в плане социализации и повышения профессиональных навыков и умений? Однозначно да, поскольку лекции основывались на конкретных примерах, с которыми наши программисты сталкиваются в процессе работы.
Кроме того, такая форма обучения помогла ускорить процесс адаптации в коллективе новых сотрудников.
Смогли ли мы популяризировать язык C++ за пределами офиса? Честно говоря, мы думаем, что это 50/50. С одной стороны, были очень заинтересованные люди, которые не только посещали наши лекции, но и пересматривали их потом, искали дополнительную информацию по той или иной теме и приходили во всеоружии на следующую лекцию.
Какая там подготовка! Был случай, когда шел очень сильный дождь, и человек пришел мокрый, чтобы не пропустить урок.
Вот это я понимаю - рвение! С другой стороны, желающих прийти на наш курс «со стороны» изначально оказалось больше, чем в конце.
Для этого у меня есть как минимум три причины:
- Основу целевой аудитории составляли студенты, и, возможно, записавшись на курс, они имели определенное понимание темы, но их ожидания не совпадали с реальностью, поскольку, несмотря на то, что курс охватывал общие аспекты при программировании на языках C/C++ было много узконаправленных и специализированных моментов.
- Курс проходил в середине лета (да, мы знаем, что в этом году это не аргумент, особенно если вы живете в средней полосе России).
Многие просто уехали из города и не смогли посетить курс, даже если были в нем заинтересованы.
- Были работающие программисты, которые и без нашего курса все знали :)
Если у вас остались какие-либо вопросы, возможно, даже предложения или идеи, не стесняйтесь оставлять комментарии и давайте пообщаемся :).
И да, спасибо, что прочитали эту статью.
Ссылка на подборку докладов: «Современный и эффективный C++» В контакте с И YouTube .
Будем признательны, если вы поделитесь ими в социальных сетях.
Теги: #программирование #C++ #курсы программирования #pvs-studio #лекции по программированию #курсы c++
-
Яндекс.фотографии Для Picasa
19 Oct, 24 -
Google Начнет Размещать Рекламу В Газетах
19 Oct, 24