Брэд Кокс, соавтор языка Objective-C:
Цитата:
Почему вы решили расширять уже существующий язык, а не создали новый?
Брэд Кокс: Меня вполне удовлетворял Си, не считая известных, но терпимых ограничений. Изобретать базовый язык для ООП было бы пустой тратой времени.
Почему вы остановились на Си?
Брэд: Потому что у нас не было ничего другого. Ада — это нечто немыслимое, Паскаль считался игрушкой для учёных. Оставались Кобол и Фортран. По-моему, всё сказано. Ах, да, был ещё Chill (язык для телефонии). Единственной разумной альтернативой для Си был Smalltalk, но Xerox не рассталась бы с ним.
Нашей задачей было перенести ООП из исследовательской лаборатории в заводские условия. Единственным надёжным вариантом был Си.
Зачем понадобилось эмулировать Smalltalk?
Брэд: Меня осенило за 15 минут. Как кирпич на голову. В больших проектах на Си меня всегда раздражало отсутствие всякой инкапсуляции и оборачивания данных и процедур во что-либо, напоминающее методы. Вот и всё.
Что вы думаете о сборщиках мусора?
Брэд: Это замечательная вещь. Всегда так считал. Мне приходилось сражаться с маркетологами, которые считали это «особенностью» языка, которую можно без особых хлопот подрисовать к Си, не потревожив тех, кто выбрал Си из-за его эффективности.
Почему в Objective-C запрещено множественное наследование?
Брэд: Историческая причина состоит в том, что Objective-C является прямым потомком Smalltalk, где тоже не поддерживается множественное наследование. Если бы мне сегодня предоставилась возможность пересмотреть то давнее решение, то, возможно, даже одиночного наследования не осталось бы. Наследование не играет большой роли. Инкапсуляция — вот в чём главный вклад ООП.
Ваш проект, видимо, повлиял на Java, поскольку одиночное наследование было перенесено и туда. А из Java тоже можно было бы удалить одиночное наследование?
Брэд: Вероятно, да. Но этого не должно быть и не будет. Оно там есть, оно работает, и оно оправдывает своё назначение. Просто им иногда злоупотребляют, как и любыми возможностями языка, и оно не так важно, как инкапсуляция.
Сначала я активно использовал наследование, чтобы оценить пределы его применения. Затем я понял, что настоящим достижением ООП является инкапсуляция, и с её помощью можно вручную сделать почти всё, для чего я применял наследование, но более понятным образом.
С тех пор моё внимание было перенесено на объекты с более высоким уровнем детализации (OOP и JBI/SCA), которые, заметьте, вообще не поддерживают наследование.
Иногда разработчики языка начинают с описания маленького формализованного ядра, а затем на этом фундаменте возводят язык. Вы подошли к созданию Objective-C так же — или решили позаимствовать всё, что можно, у Smalltalk и Си?
Брэд: Да уж, я точно не начинал с формального обоснования. Я думал о кремниевых кристаллах. Мы много консультировали крупное кремниевое производство и бывали на их фабриках. Я сравнивал их работу с нашей и обратил внимание, что вся их работа основана на многократном использовании кремниевых компонентов. Все их мысли были направлены на эти детали, а не на соединяющие их паяльники. Для нас, конечно, таким паяльником служит язык.
Я видел, что все заняты языками, то есть паяльниками, и никого не интересуют компоненты. Мне показалось, что этот подход устарел. Оказывается, очень важно то, почему у производителей чипов было такое видение: кремниевые компоненты состоят из атомов, и есть бизнес-модель для их покупки и продажи. Для программных компонентов такая бизнес-модель в действительности оказывается очень недолговечной.
Всё программное обеспечение недолговечно.
Брэд: Верно, но потому мы и сосредоточиваемся на языках, а не на компонентах. В сущности, у нас нет сколь-нибудь устойчивых компонентов. Если провести аналогию с жилищами, то мы словно вернулись в пещерный век, когда для того, чтобы построить дом, нужно было найти какую-то монолитную кучу — например, вулканического пепла, — и, боюсь, это приведёт нас к загрузчику классов Java. Пещерное жилище строится так: берёте большую кучу и удаляете из неё всё ненужное, что в сущности даёт модель загрузчика классов. Моя энергия сейчас направлена на работу с компонентами мелкой детализации, где начинаешь с пустого места, добавляя всё по мере надобности, как и в современном домостроении.
SOA поддерживает объекты крупной детализации, размещаемые в сети и по необходимости параллельные, поскольку обычно они располагаются на разных машинах. JBI Sun и SCA OASIS усиливают эту модель посредством объектов/компонентов большей детализации, из которых собираются объекты SOA. Это первое проявление в разработке ПО подхода с различной степенью детализации, являющегося нормой в разработке аппаратуры: мелкие объекты (логические элементы) собираются в средние (чипы, «программные ИС»), которые собираются в более крупные объекты (карты), которые... и так далее. Главное отличие в том, что в материальных областях системы действительно фрактальны и имеют гораздо больше уровней, а у нас их всего три. Пока.
Несомненно, есть приложения, требующие более плотной интеграции. Просто я не занимался этой проблемой в своё время. Это упущение отчасти объясняется моим собственным неумением управлять системами с высоким уровнем параллелизма и моими сомнениями в том, что кто-либо вообще умеет это делать.
Мы наблюдаем неуклонный рост сложности и размера приложений. Чего больше от ООП — пользы или вреда? Мой опыт показывает, что идея создания объектов многократного использования увеличивает сложность и удваивает объём работ. Сначала пишешь объект многократного использования, а потом приходится модифицировать его и заполнять оставшееся из-под него место чем-то другим.
Брэд: Вы правы — если под ООП понимать инкапсуляцию в стиле Objective-C/Java, которую в своей второй книге «Superdistribution» (Addison-Wesley Professional) я назвал интеграцией на уровне чипов. Но если рассматривать интеграцию на уровне чипов лишь как один уровень в комплекте средств многоуровневой интеграции, являющемся нормой при проектировании аппаратных средств, то объекты уровня логических элементов гармонично вписываются в фрактальный мир инкапсуляции уровней чипов, карт и выше.
Именно поэтому я занялся сегодня SOA (уровень шасси) и JBI (уровень шины). Они поддерживают инкапсуляцию на том же уровне, что и традиционное ООП. И даже выше: они инкапсулируют не только данные+процессы, но и весь свой поток управления.
Самое замечательное то, что многоуровневая интеграция не стоит вам ничего и показала свою пригодность, будучи использована в любых масштабах в других областях производства. Единственная зацепка — в трудности убедить сторонников одноуровневого ООП. Всё это мы видели — борьбу ООП и традиционного процедурного программирования, а сегодня — SOA с JBI и Java.
Все верят мифу о том, что новые технологии делают «устаревшими» старые, такие как ООП. Этого никогда не было и не будет. Новое всегда вырастает поверх старого.
Похоже, мы вступаем в эру экспериментов с языками и готовности программистов опробовать непривычные для них технологии вроде Rails и функционального программирования. Какие уроки из своей работы над Objective-C вы могли бы предложить модернизаторам и авторам языков?
Брэд: Я пытался, но не вполне успешно, понять синтаксис таких языков, как Haskell, — по крайней мере, не настолько успешно, чтобы составить твёрдое мнение о нём. Я довольно активно применяю XQuery, а это функциональный язык. И я считаю, что читать XQuery гораздо приятнее, чем XSLT.
Мне кажется, я умею осваивать новые методы, но что касается Haskell, то я просто не могу понять его синтаксис. Примерно та же проблема была у меня с Лиспом. Тем не менее на меня произвёл впечатление проект для военно-морского флота, в котором сложная политика авторизации и аутентификации была выражена в виде правил Haskell, допускающих проверку.
Я вижу будущее не в том, чтобы непрерывно множить всё новые и новые нотации для одной и той же работы, которой мы занимаемся десятилетиями, — написания процедурного кода. Это не означает, что работа на таком уровне не имеет значения: из неё в конечном итоге возникают компоненты более высокого уровня, и тут вряд ли что-то изменится. Я только хочу сказать, что новые способы написания процедурного кода — это не передний край инноваций.
Что я нахожу увлекательным, так это появление новых видов нотации для совершенно нового занятия, а именно для составления систем более высокого уровня из библиотек существующих компонентов. Конкретным примером служит BPEL, допускающий применение на двух уровнях интеграции: SOA для объектов крупной детализации и JBI (Sun) или SCA (OASYS). Посмотрите, например, редактор BPEL в NetBeans. В этой области OMG проделала отличную работу с архитектурой, управляемой моделями.
Какие уроки из опыта изобретения, дальнейшего развития и распространения вашего языка могли бы извлечь разработчики компьютерных систем в настоящем и будущем?
Брэд: Многоуровневая интеграция (она же инкапсуляция) интересовала меня, сколько я помню, всегда: разбить работу на части и поручить их специалистам, затем воспользоваться тем, что они сделали, не нарушая или почти не нарушая инкапсуляцию, знать, «что внутри», чтобы успешнее применять.
Меня не удовлетворяет в Си (и подобных ему языках) то, что на программистов полностью обрушивается вся сложность программы, за исключением небольшой её части, инкапсулированной в функциях. Единственной действительной границей инкапсуляции было всё пространство процесса, что равносильно чрезвычайно эффективной капсуле верхнего уровня, интенсивно используемой в UNIX в виде двухуровневой инкапсуляции посредством скриптов оболочки и понятия «каналов и фильтров».
В попытках объяснить преимущества объектно-ориентированного программирования я часто пользовался термином Software-IC (программные ИС), чтобы обозначить новый уровень интеграции, более крупный, чем функции Си (уровень логических элементов), и меньший, чем UNIX-программа (уровень шасси). Главным мотивом разработки Objective-C явилось для меня желание сделать простой программный паяльник, чтобы собирать большие функциональные блоки (уровня шасси) из многократно используемых «программных ИС». Напротив, C++ возник из совершенно другого представления: огромная автоматизированная фабрика для изготовления тесно связанных блоков из элементов уровня логических узлов. Если интерпретировать метафору аппаратуры для программирования, то интеграция на уровне чипов происходит только на этапе компоновки; интеграция на уровне логических элементов — на этапе компиляции.
Большие перемены произошли потом в связи с появлением «вездесущих систем», открывших новые уровни интеграции, более крупные, чем пространство процесса UNIX. Например, в архитектуре, ориентированной на сервисы (SOA), интернет представляет собой нечто вроде проводов между компонентами HiFi-системы, а сервисы (программы) на отдельных серверах сами функционируют как компоненты. Я считаю, что это невероятно интересно, поскольку это первый уровень интеграции, аппроксимирующий естественное для повседневной жизни распределение обязанностей.
Поможет ли строительство систем из мелких «кирпичиков» избегать в будущем проблем с устаревшим программным обеспечением?
Брэд: Я убеждён в силе компонентного подхода, но не хочу излишне навязывать эту идею: компоненты решают не все проблемы. Компоненты — это изобретённый нами способ решения задач объёма выше среднего: что-то из того, чем мы отличаемся от шимпанзе. Мы открыли, что можно решать задачи, просто перекладывая их на чужие плечи. Это называется разделением труда, только и всего. Вот этим люди отличаются от шимпанзе, которые до такого не додумались. Они умеют делать инструменты, у них есть язык для общения, поэтому, на первый взгляд, люди и шимпанзе мало отличаются друг от друга. Мы открыли способ решения проблем путём перекладывания их на других — посредством экономической системы.
Как можно улучшить качество ПО?
Брэд: Один из путей — хранить ПО на серверах, как в схеме «ПО как сервис» (Software as a Service, SaaS). Есть надежда, что такая система окажется экономически эффективной, хотя очевидно, что при этом пострадают определённые аспекты (секретность, безопасность, производительность и так далее).
Есть другое экономическое решение, сегодня весьма широко распространённое: реклама. Здесь пользователи не являются ни охотниками, ни добычей: они — приманка. Несмотря на успех Google, полагаю, этот путь не приведёт ни к чему хорошему. Мы все свидетели того, к чему привела эта модель на радио и телевидении, и точно то же самое происходит с интернетом.
Последним вариантом остаётся модель open source в каких-то из её многочисленных вариантов и разновидностей — бесплатного, условно-бесплатного, добровольно оплачиваемого и так далее ПО. Сегодня я в основном работаю над этой моделью. Не потому, что лучше неё ничего нельзя придумать, а потому, что других не осталось, и она решает одну из проблем, в которых виновато само Минобороны: замкнутость на проприетарности.
Что мешает нам создавать программные объекты такого же качества, как «реальные»?
Брэд: Экономическая система вознаграждения за усовершенствования.
Вы считаете, что для повышения качества ПО нужны лучшие стимулы?
Брэд: Если вы посмотрите, благодаря чему повысилось качество носков, свитеров и булочек Twinkie, то увидите, что двигателем этой системы служит экономика. Именно негодная экономика ПО — причина его нынешнего примитивного уровня развития.
Фармацевтическая компания тратит миллиарды долларов на исследования, потому что от продажи лекарств, появляющихся в их результате, она получает десятки и сотни миллиардов. В их науке присутствует сильный монетарный фактор, хотя значительная часть исследований ведётся открыто.
Брэд: Да, так можно что-то прихватить, чтобы стать владельцем. Когда дело касается кирпичей или кремниевых чипов, экономика подкреплена законами природы. Такой подход основан на действующих в обществе законах. Иными словами, нужно обзавестись адвокатами, патентами, профессиональными секретами, организовать судебные преследования, и такая модель может заработать. Только это очень противно.
Влияет ли университетское образование на ваши взгляды, касающиеся разработки ПО?
Брэд: Несомненно. Постоянно.
Если вы изучаете экологические системы, то ПО во всех отношениях кажется вам экологической системой, за исключением того, что в нём нет ничего, подобного физическим законам сохранения - массы или энергии. Наш продукт состоит из битов, которые так легко копируются, что покупка, продажа и владение ими затруднены. Экономическая система, экология не работают.
Если бы леопард мог реплицировать то, чем питается, с такой же лёгкостью, как мы реплицируем ПО, был бы невозможен прогресс ни леопарда, ни тех, на кого он охотится.
У ПО есть постоянная проблема прав собственности и вознаграждения за продукты и труд.
Не сместился ли интерес исследований компьютерной науки из академической сферы в производственную?
Брэд: Никогда не считал себя «учёным в области компьютерных наук» или академическим работником (хотя и проработал какое-то время в этой сфере). Всё остальное время я работал в условиях производства и, естественно, отдаю предпочтение ему.
При этом успехи академических исследований не производили на меня впечатления до недавней поры, когда я заметил растущее академическое участие в таких организациях, как W3C, Oasis и других, занимающихся выработкой стандартов. С моей точки зрения, это замечательно.
Мне нравится следующая цитата с virtualschool.edu:
"Таким образом, компьютерная наука не мертва. Она просто никогда не существовала".
Главная идея новой парадигмы, которую я пытаюсь проповедовать в своей новой книге, состоит в том, что вирус болезни, симптомы которой мы называем кризисом программного обеспечения, возник из-за того, что мы имеем дело с субстанцией, состоящей из битов, а не атомов, и порождённой исключительно людьми, а не природой.
Но поскольку эта субстанция не подчиняется законам сохранения массы, коммерческие механизмы, побуждающие людей совместно трудиться над изготовлением карандашей или лент для багажных конвейеров, совершенно не работают. Без развития торговли не может возникнуть развитый общественный порядок, поэтому мы застряли в том примитивном состоянии, когда всё изготавливается из простейших элементов.
Поэтому всё уникально, и ничто выше уровня отдельных битов не обладает повторяемостью, оправдывающей экспериментальное изучение. Вот поэтому нет такой вещи, как компьютерная наука.
Каковы недостатки наших способов обучения разработке ПО?
Брэд: Лично я, занимаясь преподавательской работой, пытался информировать слушателей о недостатке надёжных экономических рычагов, влияющих на качество ПО. Как правило, экономические вопросы отсутствуют и игнорируются в учебных программах по компьютерным наукам и программированию, им не уделяется никакого внимания.
Источник: Федерико Бьянкуцци, Шейн Уорден «Пионеры программирования. Диалоги с создателями наиболее популярных языков программирования»