Начало занятий в сентябре

Разработчик C++

О курсе

Курс предназначен для разработчиков на языке С++ уровня junior и выше. Если Вы уже занимались разработкой на языке C++, но всё ещё сомневаетесь, что делаете это правильно - курс Вам понравится.
Оценки junior, middle и senior довольно субъективны. Очень приблизительно мы бы оценили требуемый уровень в один год разработки на язке C++. Попробуйте пройти входной тест - это поможет получить представление о требуемом уровне знаний.

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

Цель курса - на основе опыта коммерческой разработки преподавателей предоставить слушателям знания тонкостей языка C++ и разработки программного обеспечения, дать возможность попрактиковаться в применении полученных знаний.

По окончанию курса Вы сможете претендовать на позицию middle C++ разработчика, пройти собеседование станет значительно проще, а выбранная по итогам поиска работы команда по достоинству оценит принесённую Вами пользу.

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

Ключевые вопросы, на которые мы подготовили ответы:
- Как писать на языке C++ правильно?
- Где стоит (и где не стоит) применять C++?
- C++11 / C++14 / C++17 - как во всем этом разобраться?
- Что такое принципы и паттерны проектирования?
- Как писать многопоточный код?
- Как взаимодействовать с сетью?
- Где хранить свои данные, если их много?
- Что такое машинное обучение, и как к нему подступиться?

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

Необходимое время: 4 часа на занятия и 4-8 часов на домашнюю работу в неделю.

Программа курса
Модуль 1
Введение
Модуль 2
Архитектура
Модуль 3
Параллельные вычисления
Модуль 4
Сеть
Модуль 5
Хранилища
Модуль 6
ML
Модуль 7
Проектная работа
Введение
Система сборки: build, test and deploy.
Поиск распространяемых пакетов. Кастомный модуль для наших пакетов.
Домашние задания: 1
ДЗ
Сборка и публикация пакета. Написать программу выводящую на консоль единственную строку

Hello, World!

Сформировать готовый для установки deb-пакет со скомпилированной программой и выложить его в репозиторий.
Прислать ссылку на репозиторий в github и ссылку на репозиторий с
пакетом.
Будет здорово, но не обязательно
Добавить версионность в пакет и сообщение.
Запустить на этапе сборки тесты.
Может пригодиться
Выложить исходные тексты в репозиторий на github.
Залогиниться на https://travis-ci.org/ и включить для своего репозитория
автоматическую сборку.
Залогиниться на https://bintray.com/ (For an Open Source Account и аккаунт
github). Создать новый репозиторий - имя произвольное, тип Debian, Default
Licenses любая. После создания отредактировать включив GPG sign.
Создать в созданном репозитории новый пакет - имя произвольное,
ссылка на контроль версии может быть указана как - (просто чтобы было
заполнено).
По ссылке https://bintray.com/profile/edit в пункте API Key скопировать
ключ. В настройках репозитория в https://travis-ci.org создать переменную,
например BINTRAY_API_KEY, и в качестве значения API Key. Это
позволит не указывать явно ключ в исходниках.


Пример на github:
https://github.com/vvz-otus/hw02.cpp01_2
Только ваш проект называться будет helloworld (а не cpp01_2:)
Широкоиспользуемые фичи C++11 стандарта. auto. Замыкание - Лямбда-функции. Кортежи.
Некоторые небольшие, на первый взгляд, нововведения настолько меняют язык, что диву даешься :)
Широкоиспользуемые фичи C++11 стандарта. rvalue и lvalue ссылки. Move semantic. Variadic Templates. POD.
Домашние задания: 1
ДЗ
ДЗ-02. C++14. 1.
Выполнить задание описанное в 02.homework.pdf

2.
Зарегистрироваться в http://acm.timus.ru
Решить первые пять простых задач:
1001 1000 1785 1293 2012

3. Опционально!
Реализовать constexpr-функцию нахождения ближайшей большей степени двойки
https://goo.gl/CBfjE9
Рассмотрим полезные нововведения 14 стандарта.
Обзор C++17 - а чего же там эдакого? Часть 1.
На дворе 21-й век, и как-то уже не модно заниматься разработкой на C++98 из прошлого века.
Однако C++11 и даже C++14 также больше не являются финальной точкой развития. Пора приступать к изучению C++17!

На этом занятии мы рассмотрим нововведения стандарта C++17. Даже не будем стараться охватить своим взором абсолютно все нововведения, но всё-таки посмотрим довольно много всего.

Итак, по окончанию этого занятия слушатели получат представление о следующих фишках C++17.

Сначала посмотрим в сторону шаблонов. Как попытались облегчить жизнь разработчиков обобщённого кода?
1. Свёртка списка параметров теперь стала гораздо проще. Появился соответствующий синтаксис - отставить написание промежуточных функций или создания массивов.
2. Теперь можно писать auto в параметры шаблона. Да, раньше было нельзя. Да, это действительно удобно. Покажем на примерах.
3. Автоматический вывод параметров шаблонов сделает код короче и (есть надежда) понятнее. Однако, правила автоматического вывода понятными не стали. Посмотрим на реализацию deduction guide и ужаснёмся. А потом сделаем это самостоятельно.

Не только шаблоны и стандартная библиотека были обновлены. Также изменения коснулись некоторых общих конструкций языка.
1. Долой ifdef, даёшь constexpr if! Достаточно нескольких примеров, чтобы восхититься.
2. inline переменные как попытка избежать проблем extern. Редкая проблема, посмотрим, поймём, забудем до востребования.
3. Раньше было нельзя, а теперь можно - constexpr с лямбдами.
4. Может, пригодится - инициализаторы внутри операторов if и switch.
5. Порядок вычислений стал более упорядочен. Мелочь, а приятно. Теперь не всё UB, что таковым кажется.
6. Вложенные пространства имён экономят бумагу (и табуляции).
7. Старый добрый alignas теперь с новыми гарантиями.
8. Structured bindings или что-то вроде std::tie, но не совсем.
9. __has_include в помощь разработчикам библиотек.
10. Атрибуты. Новые атрибуты. Не знали, что есть старые? Ничего - рассмотрим все.
11. Надоело писать банальные сообщения об ошибках? Теперь можно не писать. Встречайте static_assert с одним аргументом.
Обзор C++17 - а чего же там эдакого? Часть 2.
Вглубь реализации умных указателей.
Подводные камни и оптимизации.
19 июля, 20:00 — 21:30
Идея аллокаторов.
Стандартный аллокатор и его недостатки. Различные методы управлением памятью: достоинства и недостатки.
23 июля, 20:00 — 21:30
Домашние задания: 1
ДЗ
ДЗ-03. allocator. 1. Выполнить задание описанное в 03.homework.pdf
2. На acm.timus.ru выполнить 1409, 1877, 2001, 1264, 1787
Что это и зачем? Как выглядит в C++: макросы и шаблонная магия. Примеры. Type traits в STL. SFINAE
26 июля, 20:00 — 21:30
Архитектура
Принципы проектирования ПО
UML. Принципы: SoC, DRY, YAGNI, KISS, TDA, LoD, SOLID
30 июля, 20:00 — 21:30
Домашние задания: 1
ДЗ
ДЗ-04.doxygen. 1. Выполнить задание описанное в 04.homework.pdf
2. Решить первые 15 задач на acm.timus.ru (от простых к сложным)
3. Предоставить РЕВЬЮ ДЗ-02 от двух коллег (которые его выполнили)
4. Опционально: предоставить примеры, из своей практики, использования Принципов Проектирования
GRASP. Часть 1
Рассмотрим: Indirection, Low Coupling, Polymorphism, Protected Variations.

Дополним всё это безобразие: Creator, Controller, Pure Fabrication, Information Expert, High Cohesion
2 августа, 20:00 — 21:30
Шаблоны GoF. Часть 1.
Порождающие шаблоны проектирования.
6 августа, 20:00 — 21:30
Шаблоны GoF. Часть 2.
Структурные шаблоны проектирования.
9 августа, 20:00 — 21:30
Домашние задания: 1
ДЗ
Решаем фрагмент прикладной задачи используя изученные подходы..
Шаблоны GoF. Часть 3.
Поведенческие шаблоны проектирования. 1 часть
13 августа, 20:00 — 21:30
Шаблоны GoF. Часть 4.
Поведенческие шаблоны проектирования. 2 часть
16 августа, 20:00 — 21:30
Домашние задания: 1
ДЗ
Решаем фрагмент прикладной задачи используя изученные подходы..
Антипаттерны
Разберем антипаттерны программирования (кодирования), ООП, проектирования и антипаттерны в других областях
20 августа, 20:00 — 21:30
STL. Часть 1.
Структуры данных STL
23 августа, 20:00 — 21:30
Домашние задания: 1
ДЗ
Реализуем алгоритм используя разные структуры. Оцениваем читаемость и эффективность..
STL. Часть 2
Алгоритмы
27 августа, 20:00 — 21:30
Boost. Часть 1
Контейнеры
30 августа, 20:00 — 21:30
Домашние задания: 1
ДЗ
Создаем набор повседневных утилит..
Boost. Часть 2
Алгоритмы
3 сентября, 20:00 — 21:30
Параллельные вычисления
Многопоточность
Потоки. Критические секции и методы синхронизации: мьютексы, семафор, условные переменные, барьеры. Пулы потоков.
6 сентября, 20:00 — 21:30
Домашние задания: 1
ДЗ
Реализуем алгоритм максимально задействовав все имеющиеся ядра CPU..
Шаблоны 5
Concurrency pattern. Active Object, Balking, Barrier, Double-checked locking, Guarded suspension, Leaders/followers, Monitor Object, Reactor, Read write lock, Scheduler, Thread pool, Thread-local storage.
10 сентября, 20:00 — 21:30
Асинхронное программирование
Архитектура асинхронных сервисов. Низкоуровневая поддержка асинхронного выполнения кода.
13 сентября, 20:00 — 21:30
Домашние задания: 1
ДЗ
Читаем RSS нескольких сервисов..
Lockfree DS
Неблокирующие структуры данных и алгоритмы. BOOST Lockfree
17 сентября, 20:00 — 21:30
Сеть
Сетевое взаимодействие
Сокеты. Протоколы: TCP и UDP. Сериализация. HTTP. Json. Zmq. Protobuf.
20 сентября, 20:00 — 21:30
Домашние задания: 1
ДЗ
Клиент и сервер для реализации внешнего kv хранилища..
Асинхронный ввод/вывод
Библиотеки и практики работы с неблокирующей передачей данных
24 сентября, 20:00 — 21:30
Хранилища
РСУБД
Использование РСУБД. Подключение и работа с БД
27 сентября, 20:00 — 21:30
Домашние задания: 1
ДЗ
Высокоуровневый клиент для работы с pg.
Key Value
Идея NoSQL. Aerospike, redis, leveldb
1 октября, 20:00 — 21:30
Много данных
Map reduce
4 октября, 20:00 — 21:30
Домашние задания: 1
ДЗ
На реальном примере выявить навигационные запросы..
ORM
ООП при работе с базами данных. Паттерны DAO и Repository
8 октября, 20:00 — 21:30
ML
Dlib. Часть 1.
Кластеризация, тематическое моделирование.
11 октября, 20:00 — 21:30
Домашние задания: 1
ДЗ
Разбить заголовки прочитанных rss на группы.
Dlib. Часть 2.
Регрессия
15 октября, 20:00 — 21:30
Dlib. Часть 3.
Классификация
18 октября, 20:00 — 21:30
Домашние задания: 1
ДЗ
На реальном примере выявить поведение характерное для ботов..
Проектная работа
Заключительная часть курса посвящена проектной работе.
Мало что доставляет столько же удовольствия, как самостоятельно реализованный проект на выбранную самостоятельно тему на основе знаний, полученных на курсе.
В процессе написания (и даже в процессе выбора темы) можно получить консультации преподавателей.

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



1. Синтаксис языка стандарта C++03:



  • Переменные,

  • Функции,

  • Указатели,

  • Классы, структуры, union

  • Переопределение операторов,

  • Наследование,

  • Исключения.

  • Понимание шаблонов в языке C++.



2. Базовые знания computer science:



  • Простые алгоритмы и их оценки сложности;

  • Структуры данных и их применение;

  • Принципы работы с памятью - стек, heap;



3. Основы SQL - будем изучать работу с базами данных.



4. Знание основ многопоточного программирования: понятие deadlock не должно ставить Вас в deadlock


Расписание
C++-2018-06 (набор закрыт c 21 июня)
19 июля, четверг 20:00 — 21:30
23 июля, понедельник 20:00 — 21:30
C++-2018-02 (набор закрыт c 22 февраля)
20 июля, пятница 20:00 — 21:30
Преподаватель Дмитрий Шебордаев
24 июля, вторник 20:00 — 21:30
Преподаватель Дмитрий Шебордаев
Преподаватели
Дмитрий Шебордаев
Руководитель отдела разработки технологий в Rambler&Co
Получил образование по специальности «Прикладная математика» в Московском государственном университете экономики статистики и информатики.
Начинал рядовым разработчиком в компании, автоматизирующей процессы розничной торговли. Автор одной из самых популярных систем в РФ и бывших республиках. Не прекращая активной деятельности в разработке, прошёл путь до руководителя. Последние несколько лет работает в области информационного поиска в крупной российской ИТ-компании. Остаётся верен своей профессии свыше 20 лет. Читает образовательные курсы по специальности.
Василий Зазнобин
Разработчик со стажем больше 20-ти лет.
Работал в таких компаниях как: Информзащита, где на заре своей карьеры разрабатывал инсталляционные программы систем защиты; CBOSS, где принимал участие в развитии интеллектуальной телекоммуникационной сети, одной из задач была разработка SMS центра в части поддержки SMPP протокола; Технологический Центр Дойче Банка, где принимал участие в развитии инвестиционно-брокерского бизнеса, одной из задач было развитие серверной части брокерской системы торговли акциями, работающей на мировых инвестиционных площадках NYSE, NASDAQ, LSE, HKSE.
Продолжает работать в компании "Сбербанк-Технологии", где принимал участие в развитии розничного бизнеса в таких программах как Централизация, Надежность 99.99, где одной из задач было создание системы верификации фронтальной и резервной клиентских баз физических лиц.
Любит настольный теннис и разговоры о вселенной. Считает C++ языком программирования будущего. Эволюция привела язык к 14-му стандарту, которого мы и придерживаемся на нашем курсе.
Сергей Кольцов
Senior Developer С++ VisionLabs

Работает программистом уже почти 10 лет. Заинтересовался языками программирования ещё в школе. Начинал почти как и все в ту пору - с Delphi и Borland C++. Так что был заранее обречён на выбор профессии.

Работал как в крупных компаниях (Яндекс, Luxoft), так и в небольших организациях.

С преподаванием впервые столкнулся в школе, когда объяснял логарифмы одноклассницам. В дальнейшем в рамках рабочих обязанностей выполнял менторские функции с коллегами. На позиции руководителя группы разработки консультации членов команды занимают около 30% времени.

Окончил МГТУ им. Н.Э. Баумана в 2011 году, факультет "Информатика и системы управления".
Работодатели