Почему объектно-ориентированное программирование провалилось?

Прошло ровно 10 лет после публикации известной и классической в мире программирования статьи, написанной Ричардом Гэбриелом, название которой стало уже нарицательным и вынесено в заголовок этого материала. Статья стала настолько острой и злободневной для своего времени, что вызвала бурный всплеск обсуждений в сообществе программистов, целый ряд известных программистов включились в открытую полемику с автором - от редакции известнейшего американского программистского журнала "Др.Добс" до таких ученых, как Энди Танненбаум.

Автор этой нашумевшей статьи, доктор компьютерных наук Стэнфорда, старший архитектор по разработке ПО сначала Sun, а потом и IBM, Ричард Гэбриел (www.dreamsongs.com/Bio.html), никогда не скрывал своего скептического отношения к парадигме ООП. В 2002 году, по прошествии двух лет после первоначальной публикации своей критической статьи, автора пригласили выступить, теперь уже живьем и перед большой аудиторией, и изложить свои критические взгляды на ежегодной конференции OOPSLA (Центральная конференция IT-специалистов по объектно-ориентированным языкам и методологиям разработки ПО, en.wikipedia.org/wiki/OOPSLA). И, чтобы по старой доброй американской традиции превратить это в горячее шоу, в качестве его оппонента одновременно пригласили Гая Стили (en.wikipedia.org/wiki/Guy_L._Steele), отца-разработчика языка Scheme, крупнейшего специалиста-теоретика по ООП, авторитет которого в американской академической среде непререкаем. Чтобы максимально отразить позиции выступающих, их решили усилить ещё двумя. В качестве "анти-объектника" дополнительно пригласили Пола Грэма (en.wikipedia.org/wiki/Paul_Graham_(computer_programmer)), крупнейшего специалиста по Lisp, автора многочисленных книг и стандартизаций Lisp, кстати, согласно Википедии, в 1995 году создавшего вместе с Робертом Моррисом первое в мире web-приложение - Viaweb (en.wikipedia.org/wiki/Viaweb), которое затем выкупила у них Yahoo (как мы все знаем, Роберт Моррис, близкий друг и коллега Пола, на этом достижении не остановился и написал, пожалуй, самый знаменитый червь в истории Интернета, но это уже совсем другая история). В стан объектников пригласили Джеймса Ноубла, автора одних из первых книг и работ по теории ООП. Многие участники вспоминают, что конференция этого года надолго запомнилась им по тому уровню обсуждения, которое завязалось тогда в этой публичной "интеллектуальной дуэли" фактически диаметрально разных школ программирования. Но факт остаётся фактом: сторона, представлявшая объектно-ориентированное программирование, во время открытой дискуссии с противниками под смех зала даже запуталась в своих же концепциях. Люди вспоминают, что у всех создалось стойкое впечатление, что аргументация Lisp'еров была куда убедительней и последовательней, чем сторонников ООП (любопытно, что главным докладчиком по ООП был создатель языка Scheme (en.wikipedia.org/wiki/Scheme_(programming_language)) - главного современного диалекта того же Lisp'а).

Пол Грэм утверждал, что половина всех концепций ООП являются, скорее, плохими, чем хорошими, в связи с чем он искренне сочувствует ООП-программистам, тогда как вторая половина от оставшихся концепций и вовсе не имеет никакого отношения к ООП, с которыми их почему-то постоянно ассоциируют. Например, он говорит: "В восьмидесятых годах метод повторного использования каким-то неясным мне образом связали с объектно-ориентированным программированием, и сколь угодно многочисленные имеющиеся доказательства обратного, по-видимому, уже не избавят этот метод от этого клейма. Хотя иногда объектно-ориентированный код годится для повторного использования, таким его делает вовсе не объектно-ориентированность, а программирование в стиле "снизу вверх". Возьмём, например, библиотеки: их можно подгружать и повторно использовать сколько угодно, потому что, по сути, они представляют собой отдельный язык. И при этом совсем неважно, написаны они в объектно-ориентированном стиле или нет". Другой крупный критик ООП - это известный специалист по программированию Александр Степанов (en.wikipedia.org/wiki/Alexander_Stepanov), который, работая в Bell Labs, участвовал в создании C++ вместе c Бьерном Страуструпом, а впоследствии, уже по приглашению в HP Labs, написал Standard Template Library (STL). Александр Александрович полностью разочаровался в парадигме ООП, в частности, он пишет: "Я уверен, что ООП методологически неверна. Она начинает с построения классов. Это как если бы математики начинали с аксиом. Но реально никто не начинает с аксиом, все начинают с доказательств. Только когда найден набор подходящих доказательств, только тогда на этой основе выводится аксиома. Т.е. в математике вы заканчиваете аксиомой. То же самое и с программированием: сначала вы должны начинать развивать алгоритмы, и только в конце этой работы вы приходите к тому, что в состоянии сформулировать четкие и непротиворечивые интерфейсы. Именно из-за этой неразберихи в ООП так популярен рефакторинг - из-за ущербности парадигмы вы просто обречены на переписывание программы уже в тот самый момент, когда только задумали её спроектировать в ООП-стиле". Ричард Столлман также известен своим критическим отношением к ООП, особенно он любит шутить насчет мифа объектников, что ООП "ускоряет разработку программ": "Как только ты сказал слово "объект", можешь сразу забыть о модульности". Томас Поток из MIT даже провел масштабное прикладное исследование (www.csm.ornl.gov/~v8q/Homepage/Papers Old/spetep- printable.pdf), которое продемонстрировало, что нет никакой заметной разницы в производительности между программистами, работающими в ООП и в обычном процедурном стиле программирования.

Почти все пункты своего выступления и претензии к ООП как к парадигме Ричард Гэбриел позже заново систематизировал с учетом имевшего место широкого обсуждения и критики, после чего все было сведено в брошюру (www.dreamsongs.com/Files/ObjectsHaveFailed.pdf), которую Ричард выложил в свободный доступ вместе с поясняющими их слайдами (www.dreamsongs.com/Files/ObjectsHaveFailedSlides.pdf, очень краткое содержание его выступления можно найти и в переводе на русский язык: bugtraq.ru/library/programming/objectshavefailed.html). После этого очень сильного выступления у него появилось много последователей, которые попытались систематизировать все мифы и дефекты ООП в своих многочисленных статьях и работах (www.devx.com/DevX/Article/26776, www.geocities.com/tablizer/oopbad.htm, www.softpanorama.org/SE/anti_oo.shtml). К сожалению, вероятно, из-за того, что, как я уже сказал выше, ответное выступление объектников "Почему ООП не провалилось" получилось несколько скомканным из-за интеллектуального натиска Lisp'еров, выступающие так и не оформили впоследствии свою позицию преимуществ ООП в развернутом виде. В Интернете сохранилось лишь краткое содержание-конспект их выступления, которое также существует как в английской оригинальной версии (www.dreamsongs.com/ObjectsHaveNotFailedNarr.html), так и в русском переводе (bugtraq.ru/library/programming/objectshavenotfailed.html).

Ричард Гэбриел неожиданно сравнивает нынешнюю ситуацию с ООП с провалом эфиродинамики в физике начала 20 века, когда, в сущности, произошла "тихая революция". Молодые сторонники теории относительности, массово пришедшие в номенклатуру университетов, тогда постепенно захватили власть в области преподавания физики, навязав свою, столь любимую интеллектуалами того времени теорию относительности широким массам физиков. На самом деле в то время имелись как положительные эксперименты и опыты, подтверждающие существование эфира, так и отрицательные. Первые были полностью проигнорированы и исключены административными мерами из всех учебников физики, после чего эфир был незаслуженно "закрыт" и отправлен в отставку, и вот уже нынешнее поколение студентов-физиков даже и не знает о тех весьма успешных опытах по обнаружению эфирного ветра. "Ну и где мы теперь, с этой вашей красивой теорией относительности, кто-нибудь может мне назвать хоть какие-то реально-практические результаты её применения в вашей обыденной жизни после целого века её ковыряния и массового насаждения?", - как всегда язвительно вопрошает Гэбриел. По мнению Ричарда, то же самое произошло и с ООП, которая в 80-х годах была провозглашена "серебряной пулей" в "борьбе со сложностью программистского бытия", искусственно и безальтернативно навязана в академической среде, причем мифы, которые кочуют из учебника в учебник по ООП, "часто забавны и высосаны буквально из пальца".

Только время покажет, кто в итоге окажется правым, а кто в этой горячей методологической дискуссии искренне заблуждался. Но в любом случае, лично я за то, чтобы у нас всегда оставались возможности для альтернативных взглядов, пусть даже отличных от выбора большинства (как провокационно замечают американцы в таких случаях, "лемминги не могут ошибаться"). И да, будьте смелее в своих поисках и размышлениях, не нужно бояться, если в очередной раз в истории вдруг окажется, что... "король-то голый"!

Игорь САВЧУК,
Blogerator.ru

Версия для печатиВерсия для печати

Номер: 

43 за 2010 год

Рубрика: 

Размышлизмы
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Страницы

Аватар пользователя Кристофер
> Назад к истокам? - Fortran77 в массы? ;-)

Кстати, Логик, зря шутишь. Насколько я знаю историю, Фортран является первым языком, в котором стали использоваться подпрограммы. А от них до классов рукой подать, впрочем, как и от обычных функций.

В рамках данной статьи я не совсем понял смысл самой конференции, как собственно и выступления Гэбриэла. И тем более того мнения, что данный персонаж вдруг открыл всем глаза:))).

Аватар пользователя Logicby
Читая современные(!) книги по программированию, часто видишь предупреждения о том, к примеру:

- 100 раз подумайте а стоит ли вам наследоваться?

- если всё же решитесь, то подумайте 101 раз и откажитесь от наследования - вам же лучше будет.

Типа так.

Аватар пользователя Кристофер
Ну, наследование классов -- это просто прием программирования. Почему он вдруг не рекомендуется... загадка.

Хотя... С++ настолько зас..ли невразумительными классами, убивая программирование, что для упрощения им понадобился VB или VC#. Теперь засоряют эти языки. Вокруг них уже тоже собралось достаточно прохиндеев, ИМХО.

Аватар пользователя Logic
Кристофер > Ну, наследование классов -- это просто прием программирования. Почему он вдруг не рекомендуется... загадка.

Потому что вы НЕ идеальный программист. И в реале выходит, что большинство методов наследуемого класса приходится ПЕРЕопределять!

Аватар пользователя Logic
Кристофер > Ну, наследование классов -- это просто прием программирования. Почему он вдруг не рекомендуется... загадка.

"Dependency Injection" by DHANJI R. PRASANNA (©2009 by Manning Publications Co.)

стр. 277

"Many programmers are taught to use inheritance as a means of reusing code. Why rewrite all this great code you’ve done before? This is a noble enough idea in principle.

When applied using class inheritance, it can lead to odd and often confounding problems. The first of these problems is the fragile base class. When you create a subclass to share functionality, you’re creating a tight coupling between the new functionality and the base class. The more times you do this, the more tight couplings there are to the base class.

If you’re the world’s first perfect programmer, this isn’t an issue. You would write the perfect base class that never needed to change, even if requirements did, and it would contain all the possible code necessary for its subclasses’ evolution. Never mind

that it would be enormous and look horrible.

But if you’re like everyone else, changes are coming. And they are likely to hurt a lot. Changing functionality in the base class necessitates changing the behavior of all classes that extend it.

Furthermore, it’s very difficult to always design a correctly extensible base class..."

Аватар пользователя Кристофер
Знаешь, я не гомофоб, но комментировать DHANJI R. PRASANNA не буду:)))
Аватар пользователя Logicby
Кристофер > Знаешь, я не гомофоб, но комментировать DHANJI R. PRASANNA не буду.

"Любой программист рано или поздно превращается в индуса." (С)

Аватар пользователя Logic
Кристофер >Знаешь, я не гомофоб...

"Шатьендранат Бозе написал в начале 1920-х годов Альберту Эйнштейну. Бозе собирался послать свои выкладки в журнал Zeitschrift fur Physik, но Эйнштейн так вдохновился идеями индийского коллеги, что немедленно сам перевел его статью с английского на немецкий и отправил в редакцию. Создатель общей и специальной теорий относительности развил соображения Бозе (индус рассматривал только фотоны, а Эйнштейн дополнил теорию Бозе для частиц, обладающих массой) и изложил свои выводы еще в двух статьях, которые также были опубликованы в Zeitschrift fur Physik...

Индия – именно там большую часть времени жил и работал человек, впервые указавший на возможность существования неизвестного ранее состояния материи. Этого человека звали Шатьендранат Бозе, и он был одним из отцов-основателей квантовой механики.

Чтобы отметить научные заслуги Бозе, в его честь был назван один из типов элементарных частиц – бозоны. К бозонам относятся, например, фотоны - переносчики электромагнетизма, и глюоны, которые переносят сильное взаимодействие и определяют притяжение друг к другу кварков. Знаменитый бозон Хиггса, ради поисков которого был создан Большой адронный коллайдер, тоже относится к этой категории элементарных частиц..."

Страницы