В 1620 г. Френсис Бэкон написал, что беседы ученых мужей часто оканчиваются разногласиями по поводу смысла слов. По-видимому, ни для какой области это не является столь верным, как для вычислительной техники. Родившись в конце сороковых годов, вычислительная машина еще не вышла из младенческого возраста, и научный мир продолжает бороться за создание достаточно объемлющей, согласованной и ясной терминологии.

В 1978 г. мне посчастливилось стать председателем комиссии по обследованию вычислительных машин, действующих в ВМФ США, которая готовила доклад для заместителя военно-морского министра США по вопросам научных исследований, техники и систем. Мне сразу стало ясно, что большинство терминов вычислительной техники и программирования все члены комиссии определяли немного по-разному. Не раз нам приходилось прерывать наши заседания, чтобы найти определения, удовлетворившие бы всех.

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

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

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

Вычислительные машины, несколько десятилетий назад доступные только крупным организациям, входят теперь в домашний обиход, а их цена значительно снизилась. То, что стоило двадцать лет назад 2 млн. долларов, теперь можно купить за тысячу. Производители цифровой электроники совершили экономическое чудо: в 1960 г. транзистор стоил около двадцати долларов, а в 1980 г., если бы вам удалось выделить его из большой интегральной схемы, он стоил бы всего 0,000 002 доллара!

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

Этот замечательный прогресс в изготовлении аппаратуры предъявил дополнительные требования к программному обеспечению и сделал еще более острой нехватку разработчиков этого обеспечения.

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

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

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

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

Итак, в первой части книги возводится фундамент, на котором строятся идеи программного обеспечения. Здесь я даю определения, разъясняю их смысл и делаю различия между ними. Я вполне осознаю, что многие из них не согласуются с общепринятыми в некоторых областях, но я не знаю никакого другого способа ясно изложить материал. Останется ли пользователь со своей старой терминологией или начнет привыкать к терминологии книги — не так важно; гораздо важнее, чтобы идеи излагались ясно, не запутывались второстепенными понятиями из-за неопределенности формулировок.

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

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

Но в очень немногих книгах ставится цель осветить проблемы, возникающие у руководителей процессом программирования и ходом работ над проектом, а также у руководителей высшего ранга, — каково общее положение дел, что наиболее важно, каковы тенденции, какие возможны ловушки, какие наиболее важные уроки извлечены за последнее время в мире программирования? В течение семи с половиной лет я имел счастье руководить большим программистским предприятием — отделением фирмы IBM. В моем подчинении было 4400 человек, в большинстве своем профессионалы, в основном создававшие программное обеспечение для больших систем реального времени. Многие уроки достались мне очень тяжело. Мы всегда шли непроторенными путями, одновременно приходилось выполнять работы по сотне и более контрактов.

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

Мы работали над крупными проектами: 700 человек в течение 10 лет в Хьюстоне, шт. Техас, создавали систему наземного управления пилотируемыми космическими полетами; 500 человек в течение 10 лет в Атлантик-Сити, шт. Нью-Джерси, в местном отделении FAA, разрабатывали систему управления транспортным воздушным сообщением; 700 человек в течение 5 лет в Уиппани, шт. Нью-Джерси, работали над программной частью системы противоракетной обороны; 500 человек в Лос-Анджелесе в течение 5 лет делали спутниковую систему ВВС США.

Ниже я привожу примеры работ, проведенных под моим руководством за 7,5 лет, с 1969 по 1977 г.:

Люди/Годы Место Проект
700/7 Хьюстон, шт. Техас «Аполлон», «Скайлэб», «Шаттл»
700/5 Уиппани, шт. Нью-Джерси Противоракетная система «Сэйфгард»
500/7 Атлантик-Сити, шт. Нью-Джерси Управление воздушными транспортными линиями FAA (Federal Aviation Agency — Федеральное авиационное агентство)
200/2 Мыс Кеннеди, шт. Флорида Система запуска ракет
60/3 Гейтсбург, шт. Мэриленд Японская издательская система
20/3 Нью-Йорк, шт. Нью-Йорк Диспетчерская служба полиции города
5/1 Гейтсбург, шт. Мэриленд Автоматизация службы сбора информации газеты «Нью-Йорк таймс»
5/5 Лондон, Великобритания Общенациональная банковская система
53/3 Гейтсбург, шт. Мэриленд Система межиздательских связей США
200/3 Хьюстон, шт. Техас Автоматизация нефтеочистительных заводов (Канада, Бельгия)
15/2 Сент-Луис, шт. Миссури Автоматизация железнодорожной связи, МОРАС

Один вывод, который можно сделать из этого списка, состоит в том, что программирование по контракту имеет разбросанный, кочевой характер. Контора моя была в Гейтсбурге, шт. Мэриленд, хотя большая часть работ проводилась по месту расположения заказчиков. И для этого были причины — разработка программного обеспечения проходит достаточно сложно, даже когда разработчики и пользователи находятся в одном месте.

Нашей группе из Гейтсбурга прекрасно удалось автоматизировать выпуск двух японских газет после полосы неудач. В течение всех 7,5 лет я имел удовольствие получать отчеты от Милса, его огромный талант помогал нам неоднократно. X. Милс и Т. Бэйкер создали архивную систему газеты «Нью-Йорк таймс» с поразительной производительностью. По окончании работ у нас получилось, по моему мнению, самое большое в мире запрограммированное собрание статистических данных. Эта система используется уже более 8 лет и стала национальным богатством. В этой книге мы неоднократно будем обращаться к проекту «Нью-Йорк таймс».

Председатель правления фирмы IBM говорил мне, что система управления транспортными авиалиниями никогда не заработает, я же отвечал, что уверен в успехе. Наша система была раскритикована и конгрессом США за то, что в ней повторно тратились усилия на то, что уже было сделано нами в Хьюстоне для посадки человека на Луну.

Оглядываясь назад, я вижу, что короткий промежуток лет вместил много систем, кризисов, ошибок, успехов. Система управления воздушными транспортными линиями не просто работает, Великобритания купила у IBM вычислительное оборудование на сумму 10 млн. долларов, став тем самым двадцать первым участком этой системы. Для работы над этим проектом мы выделили десять человек, которые располагаются в Гейтвиче, Англия. То, что другая страна, к тому же располагающая собственным агентством по управлению воздушными перевозками (и ограниченная беспощадной политикой «покупать только британское»), готова заплатить 10 млн. долларов за «американскую систему», заставило замолчать всех критиков.

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

В течение последних 4 лет я был председателем консультационной фирмы по разработке и использованию программного обеспечения. Мои коллеги и я разрабатывали планы, давали советы, проводили ревизии и вырабатывали требования и для небольших систем, и для самых крупных из когда-либо созданных. Мы проделывали это и для министерства обороны США и некоторых его подразделений, и для больших коммерческих фирм. Выводы, сделанные из подобной деятельности, собраны в тексте книги.

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

В частности, я хочу признать огромный вклад Эндрью Ферентино, моего коллеги по работе в IBM, а теперь также по фирме Software Architecture and Engineering, Inc. Интуиция Энди, его глубокое понимание программного обеспечения, его определения помогли сформироваться многим идеям этой книги. Многие цифры и понятия принадлежат ему.

По мнению многих, выражение: «May you live in interesting times» считается проклятием. Проклятие это или благое пожелание — это вопрос философский, и мы не будем его здесь рассматривать, но я уверен, что последнюю четверть века, а также последующий десяток лет человечество запомнит как время захватывающих перемен в области автоматизации интеллекта. Мы должны быть счастливы, что нам довелось жить в это время открытий и достижений.

Я хочу также поблагодарить Лауру-Анну Чарлз и Жанет Далчер за помощь, оказанную в подготовке книги к печати.

Вашингтон, Джозеф М. Фокс