Кто и как развивает C++?
Яндекс для разработчиков
Ещё с 2016 года сотрудники Яндекса представляют Россию в комитете по стандартизации C++. Это организация, которая контролирует развитие языка. Наша рабочая группа в составе комитета называется РГ21. Кстати, недавно в неё вступил первый специалист не из Яндекса — Антон Бикинеев, Kaspersky Lab.
Трижды в год комитет проводит собрание, каждый раз — в новом городе мира. Во время собраний рассматриваются так называемые proposals — предложения об изменениях в языке. РГ21 участвует в этих дискуссиях, готовит и защищает свои предложения, а также — может помочь с оформлением вашей идеи для комитета. Если вы хорошо разбираетесь в C++, знаете, как его улучшить, и готовы защищать свою идею — напишите о ней на сайте рабочей группы.
Антон Полухин, старший разработчик Яндекс.Такси и сооснователь РГ21, рассказывает о работе комитета и о том, какие идеи российского сообщества найдут применение в C++20.
Одно из собраний комитета. Все в кепках C++, в первом ряду — Герб Саттер
Первые впечатления
Первая поездка на собрание была захватывающей — я сразу увидел всех своих кумиров. Заходишь в лифт в отеле, а там стоит Бьярне Страуструп или Герб Саттер. Ты чувствуешь, будто едешь в лифте с рок-звёздами. А потом ты ещё с ними общаешься.
Иерархия комитета
В комитете сейчас около 180 человек, он непрерывно растёт. Есть шесть основных подгрупп, у каждой своя сфера ответственности: язык, эволюция языка, библиотеки, эволюция библиотек и ещё две, которые являются инкубаторами — в них попадают все самые противоречивые предложения. Инкубаторы появились несколько месяцев назад. Плюс ещё восемь подгрупп по конкретным направлениям.
Как правило, новые идеи попадают в подгруппу эволюции языка или эволюции библиотек. Там они обсуждаются, улучшаются или забраковываются. Одобренные идеи переходят к подгруппе языка или библиотек, где уже происходят правки текста для добавления в стандарт. Есть много подводных камней, известных лишь участникам этих двух подгрупп. Только они досконально разбираются в том, что можно и что нельзя писать в стандарте.
Участники
Любой разработчик может прийти на заседание, высказать своё мнение, недовольство или представить идею. Но собрания проходят по всему миру, и ездить на них за свой счёт очень накладно. Поэтому большинство людей представляют интересы таких компаний, как Google, Яндекс, Mozilla, Facebook и др. В комитете есть представители всех крупных IT-корпораций и фирм, которые занимаются производством железа. Ещё одна причина такого состава участников заключается в том, что C++ популярен в серьёзном продакшене, хорошо приспособлен к решению сложных задач.
Когда компания решает, кого послать на собрание, она выбирает сильных разработчиков, которые ориентируются и в её корпоративных интересах, и, конечно, в самом языке. Получается, что комитет в основном состоит из старших и ещё более старших разработчиков. Людей, которые представляют интересы студентов и стартапов, не очень много, и это сильно повышает порог вхождения в язык. Те абстракции и инструменты, которые кажутся очевидными с точки зрения экспертов, слишком сложны для менее искушённой публики. Хотелось бы, чтобы в дальнейшем с ростом комитета в нём появлялись люди из разных институтов.
Cобрания
Каждое собрание занимает неделю. С понедельника по пятницу с 8:30 утра до 6 вечера идут основные обсуждения. Среди них есть самые большие встречи, в которых участвует большинство людей — это позволяет понять, каковы наши главные цели на текущем собрании. Большие встречи обычно проходят по понедельникам. В последующие дни люди собираются подгруппами. По вечерам, с 8 и до поздней ночи — отдельные клубики по интересам. И наконец, в субботу проходит финальное голосование.
Необходимая бюрократия
Таким образом, если у вас есть идея, которую вы хотите «продвинуть» в стандарт, то вам придётся поочерёдно согласовать её с множеством подгрупп. С другой стороны, это лучше, чем если за неё возьмутся все 180 человек сразу. Столько людей вряд ли договорятся — будет много непродуктивного шума. Система подгрупп работает лучше — можно одновременно рассматривать больше предложений.
Вступая в комитет, я надеялся, что идеи будут принимать быстрее. Первое время меня раздражало, что идея меняется, казалось бы, незначительно, но при этом откладывается до следующего собрания — и так несколько раз. Но однажды я взял в руки предложение, которое уже раз семь было исправлено, и посмотрел на разницу между текущим текстом и текстом двухлетней давности. Я понял, что за два года была проделана большая работа, proposal стал намного лучше — несмотря на то, что с первого взгляда кажется, будто правок мало.
Структура предложения
Она выработалась естественным образом. Всё начинается с заголовка, который должен цеплять глаз — чтобы люди просто прочитали ваш proposal. Дальше обычно идёт краткое содержание — какую проблему мы пытаемся решить, почему её надо решать. Затем следует описание конкретных решений, а под конец — проработанный текст для включения в стандарт. Вся специфика заключается в этом тексте. В нём всё сложно, всё привязано к языку. Вряд ли в других языках могут быть подобные изыски. К счастью, в комитете есть люди, которые способны помочь автору предложения. Можно попробовать написать черновик самому, а дальше тебе покажут, где и что исправить. Я, например, могу помочь с библиотеками. А вот по ядру языка могут подсказать лишь около 15 человек в мире — те, кто занят разработкой компиляторов.
С++20
Начиная с С++11 комитет обновляет язык каждые три года. Есть надежда, что 20 версия выйдет в 2020 году. С другой стороны, в С++20 гораздо больше крупных нововведений, чем в C++17 и C++14. Contracts, concepts и ranges точно войдут в релиз, modules — скорее всего, coroutines — возможно. Я перечислил очень большие истории, часть из которых началась ещё 9 лет назад. Так что не исключено, что C++20 немного опоздает. Зато этот релиз увеличит популярность языка и привнесёт большие изменения в то, как люди им пользуются.
Идеи от сообщества
Некоторое время назад никак с нами не связанный разработчик Алексей Горгуров предложил на сайте РГ21 принять класс stack trace в стандарт — и сейчас этот класс действительно готовится к принятию в C++20. Если честно, мне изначально казалось, что принимать stack trace в стандарт рановато, но автор идеи начал её прорабатывать, написал черновую версию proposal. Оставалось только внести правки и представить идею в комитете. Участники сразу ей загорелись.
Есть отдельное обсуждение про wide_int, это числа, ширина которых задаётся на этапе компиляции. К нам пришёл наш разработчик Игорь Клеванец, сказал, что ему интересно попробовать, сделал прототип, начал писать proposal, привёл его к виду, готовому для обсуждения в комитете. Таких историй довольно много.