Всем привет! Недавно в Новосибирске прошла очередная C++ Siberia 2019. На конференции была уютная атмосфера и много хороших докладов. Видеозаписи докладов сейчас готовятся к публикации. Пользуясь случаем, я побеседовал с двумя нашими частыми докладчиками, которые редко пропускают конференции и делают всегда отличные доклады: Антон Полухин antoshkka и Павел Филонов.   Антон — представитель России в ISO на международных заседаниях рабочей группы по стандартизации C++, автор нескольких принятых предложений к стандарту языка C++, Boost-библиотек и книги «Boost C++ Application Development Cookbook». 
  Павел — разработчик-исследователь в Лаборатории Касперского, занимается вопросами применения методов машинного обучения в задачах обеспечения безопасности кибер-физических систем, ведёт преподавательскую деятельность. В ожидании видео с конференции предлагаю вам прочитать расшифровку нашей беседы.
  Сергей: Всем привет! Это Сергей Платонов, мы сейчас на конференции C++ Siberia. Сегодня мы беседуем с нашими постоянными докладчиками — Антоном Полухиным и Павлом Филоновым. Как дела? Павел: Отлично! Мы снова в Новосибирске. Сергей: Мы сейчас сидим лицом прямо к сибирским лесам. Павел: Красивый вид, хорошие люди, очень интересные темы. Антон: А еще на данный момент тут теплее, чем в Москве. Сергей: Я хотел бы с вами сегодня поговорить о С++, как это ни странно звучит на С++ конференции. О разных вещах. Например, меня очень интересует, почему вы приезжаете на конференцию из Москвы в Новосибирск, причем не первый раз. Павел: За себя могу сказать, что у меня главная причина — мне очень нравится кому-то что-то рассказывать. Я не могу это удержать в себе. Когда я узнаю про какую-то новую интересную штуку, с одной стороны, я всегда сомневаюсь, действительно ли она хорошая, интересная, надо пойти рассказать людям и посмотреть, как они отреагируют на это — будут ли они плеваться или попросят приехать еще. И судя по тому, что не плюются, не закидывают помидорами, наверное, те вещи, которые меня распирают, людям нравятся. Хочется их слушать и обсуждать. Плюс всегда радует возможность просто покататься. В Новосибирске я первый раз был именно на конференции С++ Siberia, и второй раз тоже на ней. Просто так я бы сюда не доехал. Антон: По другим городам поездить всегда интересно. В Новосибирске замечательно, тут теплее, чем в Москве. Мокрый снег за шиворот не сыпется. Одни плюсы! Сергей: Я, конечно же, лукавлю и задаю этот вопрос не просто так. У меня есть воспоминания про рабочую группу 21 и про то, как, по-моему, она появилась. Мне интересно послушать человека, который на самом деле ее делал. Как получилось, что Россия теперь представлена в комитете? Антон: Это получилось на С++ Russia в Питере. Я помню, что я заходил в лифт с женой, там уже стоял Гор Нишанов (Твиттер), я понял, что это отличный способ узнать, как попасть в международный комитет по стандартизации. Собственно, об этом я его и спросил. И Гор такой: «Знаешь, ты сегодня далеко не первый, кто ко мне с этим вопросом подходит. До тебя подходили люди из Яндекса». Я отвечаю, что я в Яндексе совсем недолго работаю, и попросил описать, как эти люди выглядели — я тоже к ним подойду. Гор мне всё рассказал. Я подошел к тем людям, которых он описал. И действительно выяснилось, что Яндекс собирался создать некую рабочую группу, чтобы держать руку на пульсе С++ и представлять интересы российских разработчиков в международном комитете. Группа была создана. Там не только сотрудники Яндекса, есть и сотрудники других компаний. Павел: Сейчас от Лаборатории Касперского в составе группы там работает еще Антон Бикинеев. Сегодня, к сожалению, он не с нами. Антон: Кстати, Антон делает очень крутую штуку — он с руками и ногами влез во внутренности компилятора и пытается реализовать одно из наших предложений. У него даже есть более-менее работающий прототип. Павел: Кстати, он жалуется на тебя, что ты пишешь proposal-ы быстрее, чем он успевает реализовать их в компиляторе. Антон: Да, это так. Сергей: То есть Антон Бикинеев тут выступает как такая core-группа нашей рабочей РГ? Приятно слышать, что конференции приложили к этому руку. Надеюсь, что все понимают, насколько это полезно и интересно. Получается, не обязательно работать в Яндексе, чтобы попасть в рабочую группу? Антон: Вообще необязательно быть частью рабочей группы, чтобы твою идею донесли до комитета по стандартизации С++ или чтобы она вообще стала частью плюсов. Павел: Кажется, можно просто зайти на сайт и оставить своё предложение. Антон: Да, на https://stdcpp.ru. Там можно поделиться идеей, обсудить идеи других участников. Идей там много, а рук не хватает, чтобы за всё браться. Поэтому если придет человек и начнет писать конкретные черновики хотя бы каких-то предложений на идеи, то всем станет проще, и эти идеи быстрее попадут в комитет. Павел: Как думаешь, Антон, в каком proposal или чём-то ещё выражен самый большой вклад рабочей группы? Антон: Мы сделали направление для всей статической рефлексии в плюсах. Как сейчас помню: было предложение сделать constexpr_vector — отдельный класс, которым можно пользоваться только в constexpr-контексте. Выходит Давид (David Vandevoorde) и рассказывает про эту штуку. Весь зал радостно кричит, давайте это сделаем. И он такой: «Мы же захотим все классы стандартной библиотеки так продублировать? По-другому никак». «Может, constexpr_new?» «Нет, оно не работает». И я такой: challenge accepted. И через три месяца я и Саша Зайцев сделали прототип, который позволяет std::vector работать в constexpr-контексте. Прям работает, на clang, даже в компиляторе ничего не пришлось подшаманивать. Мы показали это Давиду, он говорит: «А! Ну вот так? Не, вы тут схитрили». Мы согласились. Он говорит: «Не, ну так конечно можно. Кстати, почему бы и нет». После этого он выкинул бумагу с constexpr_vector и начал работать над тем, чтобы все контейнеры стандартной библиотеки можно было использовать constexpr-контексте, Сейчас там уже много людей. Мы от рабочей группы в основном все алгоритмы промазали constexpr-ом, Луи Дион делает так, чтобы контейнеры были промазаны constexpr-ом, а Давид делает, чтобы сам ядро языка умело делать некое подобие constexpr new. Сергей: Это про аллокаторы? Антон: Да. Была проблема в аллокаторах. Сергей: Здорово! Кажется, что это прям большие изменения. Антон: Еще лет 6, и они появятся в стандарте ;-) Павел: Нет, наверное, мы не так быстро успеем пощупать их на кончиках пальцев. Антон: сonstexpr-контейнеры должны в двадцатый стандарт попасть. constexpr-алгоритмы точно попали. Павел: То есть, всего пару лет? Сергей: Если сейчас у нас начался 2019 год, то 20-й стандарт будет где-то в 2020 году. Ну да, наверное — пару лет. Павел: К тому же, если я правильно помню, раньше компиляторы всегда были отстающими по сравнению со стандартописателями, сейчас я часто вижу попытки сначала что-то прогнать в качестве эксперимента через компилятор — то же, что ты рассказываешь, делает Антон. А уже потом принимать это в виде стандартов. Сергей: Раньше, я помню, был еще TR. Антон: Но их выкинули в пользу TS. Очень многое поменялось, да :-) Сергей: То есть сейчас в современных компиляторах тоже можно подключить неймспейс ts? Антон: Там сейчас это делается флажками расширениями к компилятору, то есть есть Coroutines TS, их можно попробовать в Clang и Visual Studio. Есть modules TS, и они не везде одинаковые. Есть TS-ы на библиотечные вещи, на многопоточность, нетворкинг. Сергей: Это же все-таки ядро языка с аллокаторами, это тоже задается неким отдельным флагом? Антон: Это не будет задаваться отдельным флагом. Давид (David Vandevoorde) — один из разработчиков компиляторов, один из фронтенд-разработчиков EDG, он просто это реализовал. Считается, что это ок, оно ничего не ломает, другие new мы не хотим, что-то тут экспериментировать бессмысленно, всё просто работает. Отлично, затаскиваем. Сергей: Очень круто. Павел: Кстати, возвращаясь к теме конференций. Антон, ты ведь частый спикер не только на С++ Russia, но и посещаешь CPP Con, Meeting CPP, CPP Now, возможно, что-то еще. Можешь как-то сравнить и сказать, в чем ты видишь разницу? Это одни и те же люди, одни и те же темы, или чувствуется, что, в зависимости от того, как ты перемещаешься, меняется тематика или рабочий язык конференции? Антон: В принципе, чувствуется, что на конференциях в России очень сильные разработчики. Им можно рассказывать очень сложные темы. Я попробовал рассказать крайне сложную тему, magic_get, где-то на другой конференции, и мне запомнился чувак, который по мере моего рассказа перестал реагировать на внешние раздражители. Он просто сидит и не моргает. Я подумал, может, шутеечку вставить — вставил, пошутил — он даже не моргнул. Потом он оклемался. Но, наверное, лучше такой хардкор рассказывать только у нас где-нибудь. Сергей: И только Антону Бикинееву. Просто мы тут вспоминали как раз за обедом историю, когда ты на одном из митапов рассказывал про magic_get.  Павел: Антон на этом митапе присутствовал и обратился к тебе с настолько сложным вопросом, что он явно выходил за пределы того, что ты рассказал. Кажется, про то, что поиск в списке типов идет не линейно, а с помощью бинарного поиска. Ты ему ответил и спросил, откуда он вообще это знает. На что Антон упомянул, что он всю ночь до твоего доклада читал исходники magic_get, который лежит у тебя на GitHub, и пытался разобраться, как же он работает. Антон: С Антоном Бикинеевым у нас старая странная история. Я видел, как он сделал пару коммитов в Boost, еще до того, как мы были знакомы. И после этого я видел, что он сделал pull request и в Clang, и в constexpr. Я видел этот pull request, и почему-то мне запомнилось в этот момент имя. Наверное, потому, что чувак из Boost, коммитит в Clang — отлично! Потом я рассказываю на С++ Siberia про 17-е плюсы, про if constexpr, и чувак из зала выкрикивает: «Да, я это даже в Clang немного делал». Я такой: «Ты Антон Бикинеев!» Сергей: С++ Siberia соединяет. Павел: Также, если я правильно помню, именно в Сибири мы начали ставить первые эксперименты по мастер-классам. Сначала пытались примериться к ним, посмотреть, зайдет ли этот формат. И как, показывает практика последних 3-4 конференций, если считать C++ Russia — мне кажется, новый формат зашел очень хорошо. У меня, например, теперь есть возможность не в 40 минут пытаться впихнуть какую-то тему, а спокойно 6 часов рассказывать людям всё, что я считаю нужным. Если люди готовы, я рассказываю всё, что могу, даже больше шести часов. Антон: Мастер-классы — это весело. Порой там задают такие вопросы, что ты такой: «Блин, а почему так?» И несколько дней пытаешься понять, почему именно так на этом конкретном компиляторе, на этом конкретном несчастном ноутбуке оно не работает. И находится какая-нибудь ошибка в компиляторе или что-то еще. Казалось бы, ты приходишь на мастер-класс просто что-то рассказать, но вместо этого ты получаешь полезный фидбэк, который помогает где-то подправить, что-то улучшить. Сергей: С точки зрения организатора конференции и куратора сообщества я скажу, что для меня мастер-классы очень полезны, потому что иногда люди идут на него, получают какие-то базовые знания, дальше их развивают, применяют и возвращаются с докладом об этом. Ко мне подходило несколько человек и говорили, что они ходили на мастер-класс к одному из вас, тема их очень заинтересовала, и они сделали свой собственный доклад. Павел: Антон, я помню, что ты еще и автор книжки по Boost, сейчас уже выходит второе издание. Расскажи, как ты решил ее написать? Я, например, всё никак не возьмусь изложить свои мысли в таком сложном, на мой взгляд, формате. Антон: Это был напряженный месяц в Boost, я там с кем-то спорил, с кем-то ругался и говорил, что надо делать не так. Меня переубеждали и, кажется, переубедили. И издательство как раз искало людей, которые будут писать книгу по Boost. Похоже, они заглянули в рассылку Boost, посмотрели самого активного участника, который говорил увереннее всех остальных, и выбрали меня. Павел: А как ты вообще начал контрибьютить в Boost? Это было связано с работой или просто как хобби? Антон: Это было связано с тем, что я не понимал, как Boost работает. Мы на работе использовали Boost. На одной из самых первых моих работ был Boost, и я вообще не знал, как он там устроен, почему он так работает. Павел: Boost немного магическая библиотека до сих пор. Антон: И я начал смотреть, разбираться, и в какой-то момент я вдруг понял, что вот тут в lexical_cast можно сделать получше. Тогда я написал тому мейнтейнеру, Алексею из lexical_cast, давай этот патч применим, а он мне не отвечал. Я написал ему еще два-три патчика. Павел: Если я правильно помню, надо быть напористым в продвижении своих патчей. Антон: Безусловно. С опенсорсом так всегда. В итоге мейнтейнер сказал, что он сейчас совсем зашивается, у него много дел, и предложил стать мейнтейнером lexical_cast мне. Я обрадовался и согласился. А потом потихоньку на меня навесился Boost.Any, Boost.Variant я подхватил. В тот момент написал парочку своих библиотек, Boost.TypeIndex, Boost.Stacktrace, который сейчас принимается в стандарт. Павел: Откуда ты черпаешь идеи для новых фич в готовых библиотеках? Антон: Некоторые вещи, например, Boost.DLL — это человек писал в рассылку Boost, мол, смотрите, какая у меня классная библиотека, она делает много всего очень страшного, сложного и интересного. Я посмотрел на нее и так: «Ну это да, это да — о, а вот это я бы хотел!» Я связался с этим чуваком и предложил какой-то кусочек для работы с плагинами вынести отдельно. Вынесли отдельно, и получилось так, что этот кусочек попал в Boost намного раньше, чем то, что делает сам человек. Со Stacktrace я в какой-то момент понял, что нет механизма получить Stacktrace. Да, иногда до меня медленно доходит. И это был как раз тот момент, когда я понял, что в плюсах нет возможности получить Stacktrace. Павел: Кажется, я на двух разных работах дважды писал подобную библиотеку для того, чтобы распечатывать стектрейсы при падении. Антон: И вот взял, попробовал, закинул людям из Boost, они сказали, что нет, так не пойдет. Потом я попробовал еще два раза, и вот одна из версий, она всех устроила и прижилась. Павел: Ты же ее при этом как-то используешь в своей работе? Антон: Да, мы сейчас в Яндекс.Такси весьма активно используем Boost.Stacktrace, он весьма хорош при тех же эксепшнах, например. Есть у тебя что-то совсем общее — работа с JSON, скажем. Пользователь в какой-то момент обращается к тому полю JSON, которого нет. Просто кинуть исключение? Ну, где-то выше оно поймается. А вообще, пользователь где это вызвал? Там у пользователя во всем коде работы с JSON, где именно то поле, куда он не достучался? В какой момент он его запросил? И Stacktrace отлично помогает понимать, что и где не так, где накосячил пользователь. Павел: Часто версии, которые ты используешь на работе начинают разъезжаться с тем, что есть в опенсорсе? Или ты постоянно пытаешься переливать фичи туда и обратно? Антон: Я переливаю фичи туда-обратно. Разумеется, с разрешения руководства. И скажу, что это очень полезное взаимодействие. Так, например, в Яндекс.Такси мы заметили, что не хватает функции toString() для Stacktrace. Она есть в предложении на стандартизацию, она везде описана, но в Boost ее нет. При том, что мне казалось, что она там есть, я всё предложение по стандартизации сдирал с Boost. Добавил в Boost. Все счастливы. Павел: Кстати, возвращаясь к рабочей группе. Наверное, ты после C++ Siberia сразу отправляешься на следующую встречу? Антон: Да, я завтра утром сажусь в самолет, 40 часов полета, и в тот же день прилетаю на Кону. На повестке встречи у всего комитета — решить, как будет выглядеть С++ 20. Что в него попадет. Последняя остановка перед тем, как С++ 20 останется только баг-фиксить. На повестке дня сейчас модули и корутины. Павел: Две важные фичи, про которые идут долгие усердные споры. Антон: С модулями еще более-менее всё понятно, вроде их примут, а вот с корутинами совсем непонятно, потому что как раз к этому заседанию появилось третье конкурирующее предложение по корутинам. Оно совсем другое, совсем отличается от того, что есть в Coroutines TS, и там есть сильные моменты. Есть, конечно, и слабые. Непонятно, как оно вообще пойдет. И как вообще люди настроены к корутинам. Павел: Какие у тебя планы на следующий С++ Russia? Ждать ли от тебя доклада? Антон: Да, обязательно. Что-нибудь придумаю. Может, про Пилораму. Сергей: Хорошо, спасибо большое, друзья! Не буду вас больше задерживать. Всем пока! Увидимся на C++ Russia. Как верно сказал Павел в этом интервью, тренинги и мастер-классы имеют неоспоримое преимущество: у ведущего есть возможность в течение нескольких часов донести тему полностью, а не пытаться уложиться в 50 минут как на обычном докладе.  Потихоньку мастер-классы становятся традицией. Впервые мы провели их в 2017 году, потом обкатали на C++ Siberia. В этом году будет три мастер-класса. С ведущими двух из них вы уже познакомились в этом интервью. Мастер-класс — это шесть часов, сочетающие в себе теоретическую информацию и практические занятия. Небольшое количество участников обеспечивает индивидуальную работу с каждым. Это, в первую очередь, конечно, практика. Так что на всех мастер-классах потребуется ноутбук с установленным современным компилятором C++. На выбор предложены три мастер-класса: «Applied functional programming in C++» проведёт Ivan Čukić, а «Continuous integration для C++ разработчика» и «Шустрый и современный C++» — дело рук наших разработчиков, Павла Филонова и Антона Полухина.  Мастер-класс Ивана не для начального уровня, он подойдет мидлам, которые хотят открыть пошире двери восприятия. Иван — научный сотрудник Белградского Университета, мейнтейнер KActivities, Contour daemon, Lancelot и других KDE проектов. Речь пойдет, как можно понять, о функциональном программировании. На всякий случай участникам рекомендуется иметь последние версии GCC и Clang. Чуть позже мы выложим VirtualBox образ со всем необходимым. На мастер классе будут затронуты следующие темы: далека ли STL от функционального программирования, что такое функциональные объекты, std::invoke и монады, монады, монады. И ещё немного монад. С разработчиком-исследователем в Лаборатории Касперского Павлом Филоновым вы уже знакомы по этому интервью. Он предложит участникам построить свой CI с conan и travis. Также Павел объяснит метод непрерывной интеграции, а в практической части научит решать задачи на примерах домашнего проекта/работы над Open Source и рабочего проекта с закрытым исходным кодом. Естественно, вы должны уметь программировать на C++, принести ноутбук с любой ОС, один из основных компиляторов, свежие cmake (нужно понимать синтаксис CMakeLists.txt), git, python 3 и pip3 и пачка учётных записей. Подробней об этом есть в описании на сайте. И, наконец, мастер-класс от antoshkka посвящён навыкам правильной оптимизации. На всякий случай, напоминаю: он — старший разработчик сервиса Яндекс.Такси, представитель РГ 21 на международных заседаниях комитета по стандартизации C++, автор принятых предложений к стандарту языка, разработчик Boost, и т.д. Антон рассмотрит примеры с частыми ошибками преждевременной оптимизации, далее участники рассмотрят алгоритмы и сложности стандартной библиотеки, контейнеры с особенностями, Move семантику и её неожиданное поведение, многопоточность. Так как курс практический, то все темы будут исследоваться экспериментально, используя C++ библиотеку для бенчмарков google benchmark. Для курса понадобится всего лишь базовые знания C++ и свежая версия компилятора с поддержкой C++11. Всё вышенаписанное конечно — только краткая справка для ознакомления. Единственный настоящий источник истины — это сайт конференции, где всё подробно и чётко изложено. Например, там чётко перечислен необходимый софт на вашем ноутбуке вместе с его версиями. C++ программист