Ранее мы делали материал про использование C и C++ в Data Science. А сегодня мы хотим поделиться с вами интервью с автором C++ Бьерном Страуструпом. Далее в посте вас ждет рассказ о профессиональном пути Бьерна, деталях создания собственного языка программирования и извлеченные им из этого уроки.



Если вы держите хорошие идеи при себе, они бесполезны. Вы могли бы с таким же успехом разгадывать кроссворды. Только сформулированные в письменном виде и высказанные в беседах идеи становятся вкладом. (с) Бьерн Страуструп

Основам объектно-ориентированного программирования вы научились у Кристена Нюгора, создавшего вместе с Оле-Йоханом Далем объектно-ориентированный язык программирования Simula. Кристен Нюгор часто посещал ваш университет в Дании. Как он повлиял на вашу карьеру?

Кристен был интересным человеком со впечатляющим характером. Он был, конечно, очень творческой натурой и гигантом во всех отношениях. Для начала, рост его был около 6 футов и 6 дюймов и он был довольно широким. Вдохновившись чем-то, он мог обнять, как медведь. Обсуждение с ним любой темы — скажем, программирования, криминальной фантастики или трудовой политики всегда было интересным, иногда вдохновляющим.

Будучи молодым студентом магистратуры, я часто встречался с ним, потому что мой студенческий кабинет находился у начала лестницы, ведущей в гостевую квартиру. Каждый месяц он приезжал из Осло на неделю или около того. По прибытии он звал меня, чтобы (перефразируя) «доставить подозреваемых». Моей работой было привести полдюжины хороших учеников и ящик пива. Затем мы говорили — а это значит, что Кристен пару часов выдавал информацию на различные темы. Так я узнал много нового о проектировании и об основах объектно-ориентированного программирования. Это была скандинавская школа ООП, где главную роль, конечно, играет проектирование и моделирование реального мира в коде.

В 1979 году вы получили степень доктора философии (прим. перев. российский аналог степени — кандидат наук) по информатике в Кембриджском университете под руководством Дэвида Уиллера. Что вы узнали от Девида Уилера такого, что было полезно для вашей будущей работы?

Дэвид Уиллер был мастером своего дела. О его умениях в проектировании ходили легенды. Интересен был стиль преподавания. Каждую неделю я приходил в его офис, чтобы рассказать, какие замечательные идеи у меня возникли или с какими я столкнулся за это время. Реакция была предсказуемой: «Да, Бьёрн, это неплохая идея; на самом деле, мы почти использовали ее для EDSAC-2». То есть у него была такая же идея, когда я поступил в начальную школу, и он отказался от нее в пользу чего-то лучше. Я слышал, что некоторым студентам было трудно справиться с такими ответами, но был очарован, потому что Девид затем приступил к разъяснению моих идей, оценивал их в контексте и подробно рассказывал об их сильных и слабых сторонах, возможных улучшениях и альтернативах. Я задавал вопросы, мы обсуждали проблемы, решения и компромиссы в течение часа или более. Он научил меня многому в том, как исследовать пространства проектирования и как объяснять идеи — всегда на конкретных примерах. При этом я нахожу его официальные лекции смертельно скучными. Не думаю, что ему нравилось их читать. У Дэвида были другие сильные стороны.

В мой первый день в Кембридже он спросил меня: «Какая разница между магистром и доктором?». Я не знал. «Если я должен сказать тебе, что делать, то ты магистр», — сказал он и продолжил (неизменно вежливо) указывать на то, что быть магистром Кембриджа — это судьба хуже смерти. Я не возражал, потому что, как он, наверное, забыл, я только что получил замечательную степень магистра математики в области вычислительной техники в Университете Орхеса.

За те годы, что он наблюдал за мной, не думаю, что он дал мне больше, чем один направляющий совет. В последний день перед отъездом из Кембриджа, после завершения диссертации, он пригласил меня на ланч и сказал: «Ты едешь в Bell Labs. Это очень хорошее место со множеством прекрасных людей, но в то же время, это черная дыра. Хорошие люди приходят туда и о них больше никогда не слышат. Что бы ты ни делал, будь на виду». Здесь идеально подходит формулировка: если вы держите хорошие идеи при себе, они бесполезны. Вы могли бы с таким же успехом разгадывать кроссворды. Только сформулированные в письменном виде и высказанные в беседах идеи становятся вкладом.

В Дэвиде Уиллере меня привлек его отличный послужной список как в аппаратном, так и в программном обеспечении. А Кристен Нюгор и Деннис Ритчи — честные, добрые и великодушные люди, которым можно доверять. Они усердно трудились ради того, что считали важным.

Вы говорили, что спроектировали C++ еще в 1979 году, чтобы ответить на вопрос «Как вы непосредственно манипулируете аппаратным обеспечением, а также поддерживаете эффективную высокоуровневую абстракцию?» Вы все еще верите, что это была хорошая идея?

Определенно! Деннис Ритчи известен тем, что различает языки, призванные «решить проблему», и языки, призванные «доказать точку зрения». Подобно C, C++ относится к первой категории. Граница между программным и аппаратным обеспечением интересна, сложна, постоянно меняется и приобретает все большее значение. Фундаментальной идеей C++ было предоставить поддержку прямого доступа к оборудованию, основанную на модели языка C, а затем позволить людям «уйти» к уровням выражения выше, через так называемую абстракцию без накладных расходов. Похоже, что в этом пространстве проектирования есть бесконечная необходимость в коде. Я начал с С и Simula-подобных классов. С годами, улучшения (например, шаблоны) значительно расширили выразительные возможности и оптимизируемость С++.

Почему вы выбрали C в качестве основы для своей работы? 

Я решил не начинать с нуля. Мне хотелось быть частью технического сообщества и не повторять все фундаментальные проектные решения. Я знал по меньшей мере десяток языков, которые мог бы использовать, гибких и с хорошим доступом к аппаратным средствам. Например, я знаком с Algol 68 и мне понравилась его система типов. Но у языка не было большого индустриального сообщества. Вместе с этим, поддержка статической проверки типов в C была слабой. Но поддержка сообщества была превосходной: Деннис Ритчи и Брайан Керниган были прямо по коридору от меня! Кроме того, подход к работе с аппаратным обеспечением в C был отличным, поэтому в качестве основы я выбрал C и стал добавлять функциональность по мере необходимости, начиная с проверки аргументов функций и классов с конструкторами и деструкторами.

Вы также писали, что на С++ можно смотреть как на результат трех десятилетий противоречивых требований. Сделай язык проще! Добавь эти две важные особенности сейчас! Не ломай мой код! Вы можете объяснить, что понимаете под этими требованиями? 

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

  • Очевидно, что у C++ есть нежелательная сложность и «бородавки», которые хотелось бы удалить. Я официально заявляю, что можно создать язык в 1/10 размера С++ (любой мерой) не в ущерб выразительности или мощности выполнения (HOPL3). Это нелегко и я не думаю, что нынешние попытки увенчаются успехом. Но считаю это возможным и желательным.
  • К сожалению, при достижении этой разумной цели порядка полутриллиона строк кода перестанет работать. Устареет огромное количество учебного материала и тяжело доставшийся опыт многих программистов. Многие, возможно, даже большинство организаций все еще будут зависеть от С++ в течение многих лет или десятилетий. Автоматическое, гарантированное корректное преобразование исходного кода могло бы облегчить боль, но трансляция кода с грязного на чистый затруднена. При этом очень важный код на C++ управляет хитрыми аспектами аппаратного обеспечения.
  • Наконец, мало кто хочет только упрощения. Люди хотят новые удобства, чисто выражающие что-то, что очень трудно выразить на C++. Им нужны новые возможности и эти возможности обязательно сделают язык больше.
  • Мы просто не можем иметь все, что хотим. Но это не должно заставить нас унывать. Прогресс возможен, но он предполагает болезненные компромиссы и тщательную разработку. Стоит помнить, что каждый долгоживущий и широко используемый язык будет обладать особенностью, которая в ретроспективе может быть серьезно улучшена или заменена лучшими альтернативами. Язык также имеет большую кодовую базу, которая не соответствует современным стандартам проектирования и реализации. Это неизбежная цена успеха.


Какие основные уроки вы извлекли за годы существования C++?

Я извлек много уроков, так что трудно выбрать главный. Полагаю, вы имеете в виду уроки проектирования языка.

  • Фундаментальные решения важны, и их трудно изменить, тем более, что в реальном мире основные языковые решения не могут изменяться.
  • Мода соблазнительна и ей трудно сопротивляться, но она меняется куда быстрее, чем живет язык. Важно быть немного скромным и подозрительным к своим собственным убеждениям.
  • Часто первое разумное решение не лучшее в долгосрочной перспективе.
  • Стабильность на протяжении десятилетий — это особенность языка. Ты не знаешь, для чего и как люди будут использовать его.
  • Ни один язык и ни один стиль программирования не будет хорошо служить всем пользователям.

Полная безопасность типов и управление ресурсами были идеалами для С++ с самого начала. Однако, учитывая необходимость обобщения и бескомпромиссности в производительности, к этим идеалам можно было подходить только поэтапно, по мере развития понимания и технологий. Произвольный код на C++ не может гарантировать безопасность типов и ресурсов. Мы не можем изменить язык так, чтобы предложить эти гарантии, не сломав при этом множество строк кода. Однако сегодня мы достигли той точки, когда можем гарантировать полную безопасность типов и ресурсов, используя комбинацию руководств, библиотечной поддержки и статического анализа: The C++ Core Guidelines. Я изложил основные руководящие принципы в работе 2015 года. Сейчас статический анализатор, поддерживающий Core Guidelines, поставляется вместе с Microsoft Visual Studio. Я надеюсь на такую поддержку основных руководящих принципов, (которые не являются частью единой реализации), чтобы их использование стало повсеместным.

С годами я все больше ценю инструментальную поддержку. Мы пишем программы не просто на языке программирования, а в определенной цепочке инструментов и среде, состоящей из библиотек и конвенций. Мир C++ предлагает ошеломляющее разнообразие инструментов и библиотек. Многие из них превосходны, но нет доминирующих «неофициальных стандартов», поэтому очень трудно выбирать и сотрудничать с людьми разных предпочтений. Я надеюсь на сближение людей, которое существенно поможет разработчикам C++ и преподаванию C++. Это обсуждается в моей работе HOPL-4 и в Thriving in a crowded and changing world: C++ 2006–2020.

Кто все еще использует C++?

Больше разработчиков, чем когда-либо. C++ — основа многих, многих систем и приложений, включая некоторые из наших наиболее широко используемых и известных систем. Это также обсуждается в Thriving in a crowded and changing world: C++ 2006–2020. Компании Google, Facebook — одни из основных пользователей. Полупроводниковая промышленность, игры, финансы, автомобильная и аэрокосмическая промышленность, медицина, биология, физика высоких энергий и астрономия — C++ используется во всех этих областях. Многое, однако, невидимо для конечных пользователей.

Разработчиков C++ трудно подсчитать, но опросы говорят о 4,5 миллионах пользователей и это число растет. Я даже слышал «5 миллионов». Нет хорошего подхода для подсчета. Многие индексы, такие как Tiobe, считают «шум», то есть упоминания в сети. Но один увлеченный студент размещает гораздо больше упоминаний, чем 200 занятых разработчиков важных приложений.

Во времена искусственного интеллекта С++ все еще актуален? 

Конечно! C++ — основа большинства современных AI/ML. Большая часть нового автомобильного программного обеспечения — это C++, на C++ работает много высокопроизводительного программного обеспечения. Независимо от того, какой язык вы используете для AI/ML, реализация включает критическую часть на некоторых библиотеках C++. Пример — Tensorflow. Серьезный специалист по данным выразил это так: «Я трачу 97% своего времени на написание кода на Python и мой компьютер использует 98.5% циклов, работающих на C++, чтобы выполнить его».

Какие из существующих сейчас языков наиболее интересны? 

Может быть C++. Многие идеи современных языков пришли из С++ или пошли в массы через С++. RAII для управления ресурсами. Шаблоны для обобщенного программирования. Шаблоны и функции constexpr для вычислений во время компиляции. Различные механизмы конкурентного выполнения. В свою очередь, С++, конечно же, во многом обязан более ранним языкам и исследованиям. В смысле будущих разработок, которые повлияют на методы программирования, я буду следить за статической рефлексией. Много интересной работы делается в функциональных языках и в «скриптинге» (например, TypeScript).

Почему вы решили оставить работу на полный рабочий день в академии и присоединиться к Morgan Stanley?

Есть несколько связанных с этим причин. Больше десяти лет я делал большую часть того, что делал академик в смысле карьеры: преподавал студентам магистратуры, аспирантами, работал с будущими докторами философии, планировал учебные программы, писал учебники (например, Programming — Principles and Practice Using C++ (Second Edition), научные работы на конференциях и в журналах (например, Specifying C++ Concepts), получал исследовательские гранты, заседал в университетских комитетах. Эта работа перестала быть новой, интересной и сложной.

Я чувствовал, что мне нужно вернуться «в шахту», в промышленность, чтобы убедиться, что мои работы и мнения все еще актуальны. В академических кругах трудно было заниматься тем, что мне интересно: масштабированием, надежностью, производительностью и поддержкой. Кроме того, я почувствовал необходимость стать ближе к своей семье в Нью-Йорке и в Европе. Морган Стенли находился в Нью-Йорке, у него были очень интересные проблемы, связанные с надежностью и производительностью распределенных систем, большими базами кода на C++, и — что немного удивило меня, учитывая репутацию финансовой индустрии — было много приятных людей, с которыми можно работать.

Вы приглашенный профессор информатики в Колумбийском университете. Какое главное послание вы хотите передать молодым студентам?

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

Вы хотите что-нибудь добавить?

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

image