Все было совсем не так!

(против извратителей истории:о)

circle.gif (501 bytes) В качестве извратителя выступил весьма уважаемый мною Александр Легалов. 13 февраля он опубликовал статью "Итоги экспансии объектно-ориентированной парадигмы", мимо которой я просто так пройти не сумел. Просто закипело у меня и накипело при чтении этой статьи, и сейчас я начну А.Легалова гневно обличать:) 

Я не фанат ООП (ни того, у которого лидер Ясир Арафат, ни того, у которого лидер Гради Буч). Да и вообще последнюю программу в своей жизни написал лет пять назад, или даже больше, а последней прочитанной книгой по программированию была книга этого самого пресловутого Буча. И оспариваю я вовсе не основной тезис статьи - "процессы vs классы". 

Просто история структурного программирования прошла полностью на моих глазах. Потому нижеследующий абзац произвел на меня неизгладимое впечатление.

circle.gif (501 bytes)Наибольшего расцвета в "золотую эпоху" процедурного подхода достигли структурное и функциональное программирование.

Вся штука в том, что Дейкстра и другие сторонники структурного программирования вовсе не сводили его к процедурам. Танцевать уже тогда предлагалось от данных. Особенно этот подход был формализован в Р-технологии (Киев): там предлагалось описывать в р-схемах структуры ДАННЫХ, и потом из этих схем получались структуры ПРОГРАММ. Казалось бы, Александр Легалов как раз об этом и пишет. 

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

Но даже и в первоначальном подходе структурное программирование не сводилось к запрету на использование GO TO. Любую идею можно извратить до полной противоположности, и идея структурного программирования не исключение. Во времена, когда я горячо внедрял структурное программирование везде, куда только мог дотянуться, я видел много чудес - например, абсолютно структурные программы, написанные на Фортране-4 (который. как известно, вообще стоит на GO TO) и абсолютно неструктурные программы, написанные без единого GO TO. Потому что структурное программирование - это вовсе не отказ от GO TO, а переход к определенному типу мышления. Кто-то так мыслить умеет, а кто-то - нет, вот и все. Кто-то борется с пьянством запретом на продажу алкоголя, а кто-то - пропагандой хороших вин. В программировании все примерно так же.

circle.gif (501 bytes)Или вот еще абзац:

Исходя из того, что структура обрабатываемых данных в основном представляла иерархические, иногда рекурсивные, и-или деревья, процедуры обработки соответствующих структур строились на основе вложенных условных операторов или переключателей. Именно эти конструкции и оказались уязвимым местом структурных программ. Любое изменение данных вело к изменению их обработчиков. Приходилось модифицировать практически каждую процедуру, связанную с обработкой соответствующих структур. Если для простых программ внесение таких изменений не является трудоемкой задачей, то в сложных промышленных продуктах, насчитывающих сотни тысяч строк кода, немудрено получить дополнительные ошибки.

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

Чтобы не быть голословным, приведу пример: в 1983 году в одной из наших систем потребовалось перенести базовую управляющую структуру из оперативной памяти, где она была представлена в виде списковой структуры, на диск, где, понятно, ее вид был существенно другим. Это была действительно базовая структура - не было ни одного модуля, который так или иначе не использовал бы ее. Так вот, перенос этой кучи взаимосвязанных таблиц из ОП на диск не вызвал никаких изменений в остальных модулях. Некоторые программисты умудрились вообще не узнать об этом событии - разве что заметили некоторое падение скорости работы. А мы всего лишь применили так называемые "информационно прочные" модули (справедливости ради отмечу, что именно понятие информационно прочного модуля больше всего соответствует возникшему позже понятию объекта). 

Разумеется, трудно не согласиться с Александром Легаловым в том, что по сравнению со структурным подходом  "встраивание обработчика внутрь класса и возможность его переопределения в наследниках позволили локализовать проблему." Разумеется, дальнейшее развитие идей было плодотворным и ООП по сравнению со структурным программированием (даже в эпоху его расцвета) выглядит куда привлекательнее. Я, фактически, протестую против упрощенного воспроизведения истории. Не так все было грустно в "золотую эпоху" процедурного подхода". Нам, например, стоило один раз обломать рога, построив довольно большую программу на чисто процедурном   подходе, чтобы не возвращаться к нему уже никогда. То есть, на то, чтобы от того, чему нас тогда учили в университете (а это, в сущности, был машинный язык с АЛГОЛом) придти к правильным идеям декомпозиции, нам понадобился всего год с небольшим (ну, и плюс море крови на отладке:о). Думаю, что путь остальных разработчиков вряд ли был намного длиннее. А если и был, то это уже свойство не методологии, а самих разработчиков. 

circle.gif (501 bytes)Ну, и," чтобы второй раз не вставать, - за дам". Вряд ли я в обозримом будущем буду писать что-либо о методологии программирования - уж больно я стал далек от этих вещей, а в новейших течениях и вовсе некомпетентен. Поэтому выскажу сейчас крамольную мысль, которая, впрочем, имеет отношение к теме статьи. Мысль эта заключается в том, что программирование - наука по сути не техническая, а гуманитарная. Несмотря на то, что программирование - это производственный процесс (и этот тезис я много лет отстаивал), в нем очень большую роль играют особенности человеческого мышления. Я с этим столкнулся еще во времена расцвета этого самого процедурного подхода. Были люди, которые по организации своей психики абсолютно не были готовы к иерархической декомпозиции - ну хоть ты их застрели. У них был другой тип мышления - ну там, положим, ассоциативный. И, стало быть, им или надо было категорически запретить заниматься программированием, или изобретать для них какое-то другое программирование, не структурное. Понятие объекта тоже не во всякую башку влезет - не в силу чьего-то дебилизма, а в силу другой организации мышления. И битва парадигм (вернемся к статье Александра Легалова) - возможно, битва не столько объективных концепций, сколько субъективных способов мышления. Кому-то удобнее мыслить объектами, кому-то функциями, и так далее То есть, понятно, что некие общие принципы мышления разных людей - есть. Но есть и существенные отличия. Возможно, в программировании мы настолько глубоко используем свойства мышления, что инструмент начинает  влиять на методологию. А значит, нужно говорить не о том, какая парадигма победит, а о том, как их поудачнее совместить. Иначе придется вводить запрет на профессию для тех программистов, у которых стиль мышления отличается от общепринятого стандарта:о). Дикая, идиотская мысль, я согласен, но что-то в ней есть.

Алексей Бабий


Взгляд

circle.gif (501 bytes)   Вот и у меня сегодня взгляд такой же:о)

  

Фото Вильяма Соколенко , слова Алексея Бабия 


Опубликовано:   "Сталкер"
© Алексей Бабий 2001