Заметьте, пожалуйста, что путь, которым информатика пробивала свою нишу, был сам по себе примером успешного «разделения проблем». Каждый раз, когда мы вкладываем уйму умственной энергии в тщательную разработку любой дискретной системы, мы делаем это не просто для удовольствия: мы всегда надеемся, что результат наших усилий будет использован на благо другим. Мы надеемся, что он будет удовлетворять нужды, соответствовать ожиданиям и доставлять удовольствие своим пользователям. В донаучный период разработки систем неформальное понятие «удовлетворения пользователя» было единственным приемлемым критерием качества программного обеспечения.
Недостаток «удовлетворения пользователя» как критерия качества состоит в том, что это не техническое понятие: он не задаёт технического направления разработчику и, кроме того, может быть достигнут другими средствами, помимо технических, например, агрессивной рекламой или промывкой мозгов. К науке это не имеет ни малейшего отношения. Задачи должны быть разделены, и тут на сцене появляются функциональные спецификации.
Роль формальной функциональной спецификации — просто служить логическим барьером между двумя совершенно разными проблемами, известными как «проблема удовлетворённости» и «проблема корректности». Проблема удовлетворённости касается вопроса, соответствует ли система, отвечающая таким-то и таким-то формальным спецификациям, вашим ожиданиям и надеждам.
Проблема корректности касается вопроса, соответствует ли данная разработка таким-то и таким-то формальным функциональным спецификациям.
Логический барьер был необходим, чтобы поставить проблему корректности перед информатикой: он изолирует уютную нишу информатики от проблемы удовлетворённости, решению которой наука мало чем способна помочь. Заметьте, пожалуйста, что я не утверждаю, что одна из проблем важнее другой; в конце концов, цепь не прочнее самого слабого звена. Однако я утверждаю, что проблема корректности представляет ту самую часть, которую нам удалось втиснуть в «тонкий пограничный слой» Бонди, где разумное применение научной мысли может принести пользу, тогда как неформализованная проблема удовлетворённости в действительности лежит на пределами компетенции науки.
У вас могут быть самые разные проблемы, начиная с опасного перекрёстка и заканчивая такими, которые угрожают самому существованию целых поколений. Однако наука никогда не решает ваши проблемы, она решает лишь свои собственные, и заключение, примете ли вы решение формальной научной проблемы как таковой в качестве приемлемого решения своей задачи, лежит целиком на вас. Другими словами: наука никогда не предлагает моделей реальности, она лишь строит свою теорию, и вопрос, примете ли вы своё восприятие действительности в качестве достаточно достоверной модели для этой теории, полностью ваша проблема. Достоверность и реалистичность больше не являются научными понятиями, и учёный уступает право разглагольствования о них философам, пророкам и поэтам.
С этой точки зрения роль науки довольно ограничена, на самом деле до такой неутешительной степени, что многие предпочитают закрывать глаза на ограниченность науки.
Акцентировать внимание на этих ограничениях не принято в научной среде, поскольку помимо прочего это вызывает вопрос, а зачем тогда общество должно терпеть учёных.
Это не шутка: все мы знаем, что если бы сегодня общество вдруг решило изгнать своих учёных, это было бы не впервые.
И теперь, когда наука «вышла в народ», так сказать, она также не столь популярна среди публики в целом. Люди всегда питали противоречивые чувства по отношению к технологии, и с чем более мощными технологиями они сталкиваются, тем драматичнее становится двойственность этого отношения.
Они чувствуют угрозу со стороны технологии сильнее, чем когда-либо прежде; в то же время их надежда на спасительную мощь науки и технологии всё больше крепнет. В старые добрые времена традиционного шаманства от него требовались только снадобья от всех недугов, Эликсир для вечной юности и Философский Камень для сотворения золота.
Так было в старые добры времена, когда поиск Философского Камня только начинался.
В наши же дни передовой электроники Философский Камень обзавёлся совершенно новыми измерениями. Достижения в традиционном стиле сотворения золота благодаря робототехнике постепенно во всех странах приведут к положительному балансу в торговле. Они решат проблемы производства и безработицы. Они дадут правительству силы победить преступность и коррупцию, тогда как вездесущие микрокомпьютеры станут на страже демократии. Обучающие машины обновят образовательный процесс, в то время как калькуляторы, автоматические корректоры правописания и в целом мыслящие машины сделают большую часть обучения излишней. Все государственные секреты будут абсолютно надёжно защищены неприступным шифрованием; мощные схемы декодирования позволят нам взламывать любые коды. Оружейные и защитные системы будут одинаково эффективны. И, что важнее всего, если мы не знаем, что нам делать, мы получим «поддержку принятия решений», наше руководство будет информировано, а наша информация — управляема, нашим разработкам будет оказываться столь же значительная помощь, что и усилению наших мыслительных способностей, и безо всякой специальной подготовки любой, в самом деле любой, даже руководство и генералы, будут иметь под рукой все нужные им знания экспертов. Замечательное новшество сегодняшнего Философского Камня состоит в том, что вы можете перевалить на него свою ответственность.
Слишком много для вопиющей бессмыслицы. Теперь можно было бы поспорить, что в своей несклонности к компромиссам я занял непримиримую позицию; я знаю, что немало из моих благоразумных и уважаемых коллег критикуют бы пределы, которые я обрисовал им для информатики непрактично узкими. Они указывают на всевозможные системы, обладающие большой потенциальной полезностью, лежащие за пределами очерченных мной строгих границ. Они возражают, прежде всего, что нынче такие системы разрабатываются без особых формальных функциональных спецификаций, как бы нам этого ни хотелось. Один из примеров предоставляется библиотекой расчётных программ, для которой не границы применимости, ни точность результатов не были чётко установлены. Другим примером могла бы быть система оптического распознавания символов для использования в сортировке почты, по крайней мере будучи поставленной без точного определения, какие символы будут безошибочно распознаваться. Верно, однако позвольте мне отметить несколько моментов.
Прежде всего, позвольте напомнить, что я отказался разделять проблемы удовлетворённости и корректности по их относительной важности, другими словами, что нет никакой внутренней порочности в ненаучном проекте: он всего лишь ненаучен. Во-вторых, существуют проекты, для которых очевидно, что ниша информатики не подходит; если это тот самый случай, информатика не в состоянии ничем им помочь, и лучше ей не вмешиваться. Почему компьютерные приложения, которым наука не способна помочь, должны быть отброшены? Я не думаю, что нам следует беспокоиться об этом. Я твёрдо убеждён в том, что мы сильно недооцениваем культурное значение компьютеров, судя о них в первую очередь как об инструментах, поскольку я ожидаю от них гораздо большего влияния на их способность интеллектуального вызова.
Моё растущее беспокойство, однако, вызывает то, что подобные проекты используют лишь часть компьютерных характеристик, и то, что они ведут к достаточно неспецифицированным продуктам, в которых исчезают другие характеристики компьютера. Расчётные программы используют способность компьютера к перемалыванию чисел, оптическое распознавание символов использует ёмкость памяти и гибкость, но в обоих случаях конечный продукт больше не является автоматом с точно установленными свойствами. Следовательно, результирующий продукт уже не является машиной в смысле информатики, и его использование сродни занятиям математикой без аксиом. Подобные расчётные программы могут использоваться лишь в контексте, в котором результат не имеет столь большого значения, либо аналитик, использующий их, располагает другими средствами для проверки ответа; подобная система оптического распознавания может применяться лишь в обстоятельствах, в которых не имеет большого значения, если, скажем, часть писем сначала отправится в неверном направлении. Мы больше не можем полагаться на такие системы, как если бы они были автоматами, и нам придётся удалять их из замкнутых циклов.
Для многих такое заключение неприемлемо, и как результат существует школа мышления — или, если вам так больше нравится, школа недомыслия, — которая утверждает, что ситуация не столь серьёзна, что нам не следует быть столь строгими, что инженеры всегда допускали периодические сбои своих компонентов, что стремление к совершенству быстро начинает препятствовать производительности, и что лучше бы нам научиться жить в реальном мире с системами и подсистемами, которые обычно делают то, что мы от них ожидаем. Это соблазнительное предложение. Разве не замечательно — достичь превосходства без гонки за совершенством?
(Тем более что в крайне популистском обществе последнее социально неприемлемо). Такова позиция, ныне принятая под знаменем «программной инженерии».
Однако то, что сторонники называют «прогрессом программной инженерии», страдает несколькими непреодолимыми противоречиями.
Одно из них — это то, что стремление к совершенству находится в противоречии с производительностью в том смысле, что сделает разработку программного обеспечения чересчур дорогостоящей. Но в чём основная причина заоблачных цен на неё? Дороже всего обходится как по людским ресурсам, так и по непредвиденным задержкам отладка, и можно немало сэкономить, вложив больше средств в предотвращение будущих ошибок, поставив разработку на первое место. Поскольку ошибки обходятся столь дорого, в конечном счёте высококачественный дизайн обходится куда дешевле. Другая важная причина состоит в том, что многие системы построены на зыбком фундаменте в том смысле, что базовое программное обеспечение в виде операционных систем и компиляторов слишком неустойчивы, поэтому каждый новый релиз этого базового программного обеспечения требует возможно дорогой адаптации базирующейся на нём прикладной части. Наконец, многие инструменты, с которыми собирается работать программист, настолько плохо документированы, что вынуждают его выяснять экспериментальным путём, чем же они могут оказаться для него полезными. Поскольку