Глава 4


ПОНИМАНИЕ И ВЗАИМОПОНИМАНИЕ —

КЛЮЧЕВЫЕ ПРОБЛЕМЫ ИНФОРМАТИКИ

 Понимание — функция разума, главная его функция...

Наталья Автономова

ОТСУТСТВИЕ ПОНИМАНИЯ ВЕДЕТ К МИЛЛИОННЫМ УБЫТКАМ

Главным требованием к языку ДРАКОН считается облегчение и улучшение работы ума, улучшение понимаемости проектов, алгоритмов, программ и технологических знаний. Для обозначения данного требования вводится понятие “критерий сверхвысокой понимаемости”. Считается, что язык удовлетворяет этому критерию, если написанные на нем проекты, алгоритмы, программы и технологии обладают наивысшим когнитивным качеством.

Вспомним общеизвестные факты не столь уж далекого прошлого. Один из руководителей фирмы IBM Джозеф Фокс сообщает, что в начале 1970-х гг. две основные авиакомпании возбудили дело против своих подрядчиков, поскольку созданная ими система обработки данных стоимостью 40 млн. долл. не только не работала, но и вообще не подавала никаких признаков жизни. Крупный европейский банк направил в суд иск о взыскании 70 млн. долл., выплаченных за программное обеспечение. Военно-воздушные силы США затратили более 300 млн. долл. на тщетную попытку автоматизировать комплексную систему перевозок и снабжения. Продолжая тему, Альгирдас Авиженис отмечает случаи, когда сложные и дорогие системы так и не смогли заработать из-за того, что в рамках установленных сроков и средств не удалось устранить ошибки в программном обеспечении. Джон Муса указывает: эксплуатационные и экономические последствия программных ошибок становятся “поистине ужасными”. Причина всех этих “земных катастроф” больших программистских проектов, как правило, заключалась в том, что заказчик и исполнитель совершенно по-разному понимали задачу. Грубо говоря, заказчик надеялся получить систему “про Фому”, а исполнитель сделал “про Ерему”.

Перечисленные классические примеры крупномасштабных неудач, а также многие другие факты, в том числе эпидемия казавшихся непонятными провалов проектов АСУ1 в нашей стране хотя и стали достоянием истории, тем не менее остаются поучительными до сих пор. Анализ по-добных инцидентов позволяет сделать четыре вывода:

  1. успех крупного проекта напрямую зависит от взаимопонимания между его участниками;
  2. чтобы добиться взаимопонимания, нужны недели и месяцы, а в сложных случаях — годы кропотливой совместной работы заказчика и исполнителя;
  3. проблему взаимопонимания нельзя считать решенной до сих пор; достижение взаимопонимания — тяжелый и сложный интеллектуальный труд, производительность которого крайне низка;
  4. было бы крайне желательно формализовать этот труд и резко увеличить его производительность.

ИЗДЕВАТЕЛЬСТВО НАД ЗДРАВЫМ СМЫСЛОМ

ПОД НАЗВАНИЕМ “АБСОЛЮТНО ПРАВИЛЬНАЯ ПРОГРАММА”

Во всех перечисленных случаях создаваемые системы подвергались тщательной проверке. Возникает вопрос: почему столь мощный инструмент как тестирование не позволил выявить грубейшие ошибки в программном продукте?

Ответ понятен. В описанных примерах начало работы было на первый взгляд вполне разумным. Исполнитель заблаговременно составил и согласовал с заказчиком многотомный документ — техническое задание на разработку программного комплекса (формальные спецификации) и только после этого приступил к работе: проектированию, программированию и тестированию. Тестирование показало, что код программ был безошибочным и точно соответствовал спецификациям. Словом, программа была абсолютно правильной.

Парадокс в том, что программа называется правильной, если она соответствует техническому заданию. А если ошибки умудрились просочиться в “святая святых” — задание на разработку системы? Вот тут-то и зарыта собака! Оказывается, тестирование — отнюдь не панацея. Иными словами, тестирование программ, даже самое придирчивое и дотошное, в большинстве случаев в принципе не позволяет обнаружить ошибки в спецификациях.

СПЕЦИФИКАЦИИ ПРОГРАММ — ВОТ ГЛАВНЫЙ “ГАДЮЧНИК”!

Со временем стало ясно, что одетые в “шапки-невидимки” ошибки в спецификациях наиболее коварны и представляют собой основную опасность. Они практически неуязвимы для лобовой танковой атаки массированного тестирования. Однако наиболее сенсационным стал вывод о том, что подготовка спецификаций — один из основных источников ошибок. Выяснилось, что на устранение ошибок в требованиях на программы уходит в среднем 82% всех усилий, затраченных коллективом разработчиков на устранение ошибок проекта, тогда как на устранение ошибок кодирования — 1%.

Ошибки в спецификациях обнаруживаются обычно лишь после окончания приемосдаточных испытаний разработанной системы. Они “всплывают как мины на фарватере, уже на стадии внедрения и сопровождения готового программного продукта в организации-заказчике” (Г. Громов, 1993).

Проблема спецификаций — одна из центральных в программировании. Джеймс Мартин пишет: “То и дело встречается одна и та же печальная история: после нескольких лет напряженной разработки системы обработки данных конечные пользователи заявляют, что это вовсе не то, что они хотели... Обычная реакция разработчиков на такую скверную ситуацию — заявление, что требования к системе не были определены пользователем достаточно полно. И это несмотря на то, что требования к системе иногда представляются в виде многих томов документации”.

Что же является причиной ошибок в спецификациях? Рассмотрим вопрос на примере разработки АСУ технологическими процессами атомной электростанции (АСУ ТП АЭС). Заказчики (разработчики АЭС) прекрасно знают “физику процесса”, т. е. технологию работы реакторного и турбинного отделений и других систем АЭС, но, к сожалению, не являются профессорами по части АСУ и программирования. Исполнители (разработчики АСУ ТП АЭС), наоборот, детально знакомы с компьютерами, программированием, особенностями построения систем управления, но, увы, мало что смыслят в реакторах, спецводоочистке и прочих секретах АЭС. Таким образом, проблема состоит в том, что те и другие должны научиться понимать друг друга. Для этого нужно произвести взаимное обучение, взаимный обмен знаниями, которые обычно представлены в виде той или иной документации. Успех взаимного обучения во многом зависит от когнитивных свойств используемого профессионального языка (языка представления знаний). Очевидно, что речь идет о чрезвычайно тонких, деликатных и сложных когнитивных проблемах, в первую очередь, о проблеме понимания.

Проведенный анализ позволяет сделать два замечания:

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

СПЕЦИФИКАЦИИ ПРОГРАММ И МЕТОДОЛОГИЯ RAD

В методологии RAD используется весьма оригинальный подход к проблеме спецификаций — что-то вроде “умный в гору не пойдет, умный гору обойдет”. В самом деле, зачем создавать трудоемкие бумажные спецификации, если при наличии CASE-инструментов гораздо проще получить работоспособный прототип системы!

Новый подход тесно связан с понятием “качество программного продукта”. По мнению Джеймса Мартина, раньше большинство организаций пользовались неудачным определением этого понятия. Они понимали его как “максимально возможное соответствие письменным спецификациям”. При традиционном подходе спецификации, подписанные пользователем, замораживались на весь период, пока выполнялись проектирование, кодирование и тестирование. Зачастую это приводило к тому, что внесение изменений в спецификации запрещалось на срок до восемнадцати месяцев и разрешалось лишь после запуска системы в работу. Естественно, за это время бизнес-требования к проектируемой системе успевали существенно измениться, а созданная система полностью игнорировала этот факт! Так что заказчик был вынужден начинать работу с заведомо непригодной системой, ибо она учитывала не все, а лишь часть его требований, не говоря уже об ошибках в спецификациях, вызванных просчетами пользователя, в связи с чем часть исходных требований была неточна, а многое вообще упущено из виду.

Так было. Однако методология RAD дает новое определение качества программ, понимая его как “максимально возможное удовлетворение истинных бизнес-требований (требований пользователя) на момент предъявления работающей системы заказчику”. Чтобы этого добиться, пришлось многое изменить: резко увеличить скорость разработки с помощью I-CASE-инструментов и, сверх того, радикально улучшить взаимоотношения разработчика и пользователя. Если раньше пользователю “выкручивали руки”, заставляя подписывать бумажные спецификации, которые он плохо понимал, то теперь ситуация изменилась. После короткой серии четко организованных начальных ознакомительных переговоров, результаты которых немедленно вводятся в компьютер, разработчик быстро создает компьютерный прототип системы и немедленно передает его пользователю. Последний, сидя за компьютером, пробует проект “на зуб”, осознает свои заблуждения и направляет разработчику ответную порцию уточнений. Разработчик быстро изменяет прототип и тут же выдает пользователю усовершенствованную версию. Подобная игра в пинг-понг между разработчиком и пользователем повторяется несколько раз и приводит к тому, что прототип постепенно превращается в работающую систему.

Главная хитрость в том, что пользователи больше не должны покупать кота в мешке и подписывать кишащие ошибками бумажные спецификации (разобраться в которых — выше их сил). Они ставят подпись на проекте, полученном с помощью инструментария I-CASE, который вполне доступен их пониманию и который они могут профессионально оценить. Таким образом, действия пользователя, связанные с контролем проекта, имеют компьютерную точность. Участвуя в отработке проекта за экраном компьютера, пользователь гораздо глубже вникает в детали, чем при умозрительном анализе бумажных спецификаций. Изложенный метод иногда называют “раннее прототипирование при спиральном цикле разработки”, потому что прототип тестируется заказчиком на каждом витке спирали, чтобы снизить вероятность ошибки в законченной системе.

Нет сомнения, что перечисленные новшества весьма полезны. Однако нельзя забывать два обстоятельства. Во-первых, RAD — это не общая, а частная методология, так как она применима не к любым системам, а лишь к системам определенного класса (бизнес-приложениям). Во-вторых, наряду с достоинствами, методология RAD имеет и существенные изъяны. К ним относятся недооценка важности проблемы улучшения работы ума, проблемы понимания и когнитивно-эргономического подхода к проектированию языковых средств. Вследствие этого графические и иные средства RAD имеют слабые места и нуждаются в улучшении.

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

КОНЦЕПЦИЯ КОГНИТИВНОГО ПРОГРАММИРОВАНИЯ

При разработке нового языка программирования обычно стараются найти разумный компромисс между различными, нередко противоречивыми требованиями, которые, в частности, включают следующие:

  1. легкость понимания программ;
  2. небольшая трудоемкость написания программ;
  3. минимизация потребной машинной памяти;
  4. малое время выполнения программ;
  5. небольшое время трансляции;
  6. легкость автоматизированного выявления ошибок.

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

Разработка языка ДРАКОН опирается на концепцию когнитивного программирования, в основе которой лежат следующие постулаты.

ПОСТУЛАТ 1. Когнитивные требования к языку рассматриваются как основные, машинные — как второстепенные. Обоснование постулата состоит в том, что сегодня, когда быстродействие компьютеров и объем памяти резко возросли, а их удельная стоимость снизилась, основной проблемой является низкая производительность персонала, по-этому улучшение работы ума, повышение продуктивности человеческого мозга является задачей номер один.

ПОСТУЛАТ 2. Легкость понимания программ — более важное требование, чем удобство их написания. Как отмечает Я. Пайл, возможность прочитать программу и отчетливо осознать ее смысл гораздо важнее, чем возможность кратко и быстро ее написать. Причиной служит однократное выполнение работы автором программы и необходимость многократного чтения программы в течение ее жизненного цикла1. Известно, что высокая удобочитаемость программ облегчает их сопровождение.

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

  1. оптимизирующие трансляторы нового поколения;
  2. методы автоматического улучшения (оптимизации) программ, обеспечивающие преобразование неэффективных, но понятных программ в эквивалентные, более эффективные;
  3. методы интеллектуализации компьютеров;
  4. улучшение характеристик компьютеров до границ, делающих массовую эксплуатацию неэффективных (или частично неэффективных) программ экономически приемлемой и даже выгодной;
  5. введение в основной язык дополнительной возможности, позволяющей писать отдельные куски программ на языке ассемблера. Такая возможность используется в случае, когда неэффективность программы, написанной на основных средствах языка, выходит за пределы разумного.

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

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

ВЫВОДЫ

  1. Чтобы решить проблему понимания и сократить экономический ущерб, вызванный взаимным непониманием между заказчиками, разработчиками и эксплуатационниками, необходимо принять концепцию когнитивного программирования и коренным образом изменить приоритеты при создании языков нового поколения.
  2. Сегодня первостепенное значение приобретает требование облегчения и улучшения работы ума, минимизации интеллектуальных затрат персонала, расходуемых на создание и сопровождение программного продукта в течение всего жизненного цикла.
  3. Значительная или даже основная доля интеллектуальных усилий персонала при разработке сложных проектов затрачивается на процесс познания, на восприятие и понимание информации. Поэтому требование познаваемости проектов и алгоритмов и связанный с ним критерий сверхвысокой понимаемости становятся определяющими.