Фредерик П. Брукс

Вид материалаДокументы
Глава 16. Серебряной пули нет - сущность и акциденция в программной инженнерии
Неизбежны ли трудности? Трудности, вытекающие из сущности
Подобный материал:
1   ...   28   29   30   31   32   33   34   35   ...   48

Глава 16. Серебряной пули нет - сущность и акциденция в программной инженнерии


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

Резюме1


Создание программного обеспечения всегда включает в себя существенныезадачи - моделирование сложных концептуальных структур, составляющихабстрактный программный объект, и второстепенные задачи - созданиепредставлений этих абстрактных объектов с помощью языков программирования иотображение их в машинные языки с учетом ограничений по памяти и скорости. Впрошлом рост продуктивности программирования по большей части достигалсяблагодаря устранению искусственных преград, делавших второстепенные задачичрезмерно трудными, например, жестких аппаратных ограничений, неудобныхязыков программирования, нехватки машинного времени. Какая часть работыразработчиков программного обеспечения все еще связана со второстепенными, ане с существенными обстоятельствами? Если она занимает менее 9/10 всехзатрат, то, даже сведя все второстепенные затраты к нулю, мы не получимроста производительности на порядок величин.

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

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

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

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

- Выявлять и растить выдающихся разработчиков концепций новогопоколения.

Введение


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

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

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

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

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

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

Неизбежны ли трудности? Трудности, вытекающие из сущности


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

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

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

Акциденции я рассматриваю в следующем параграфе. Сначала рассмотримсущность.

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

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

Верно то, что создание программных систем всегда будет трудным.Серебряной пули нет по самой природе вещей.

Рассмотрим неотъемлемые свойства этой несократимой сущности современныхпрограммных систем: сложность, согласованность, изменяемость и незримость.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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