Бьерн Страуструп.
Язык программирования С++
297
реальной системы. Для разработчиков и менеджеров есть искушение переделать прототип в конечный
программный продукт, а "искусство настройки системы" отложить до выпуска следующей версии. Если
идти таким путем, то прототипы отрицают все основы проектирования.
Сходная проблема возникает, если исследователи привязываются к тем средствам, которые они
создали при построении прототипа, и забывают, что они могут оказаться непригодными для рабочей
системы, и что свобода от ограничений и формальностей, к которой они привыкли, работая в
небольшой группе, может оказаться невозможной в большом коллективе, бьющимся над устранением
длинной цепи препятствий.
И в то же время создание прототипов может сыграть важную роль. Рассмотрим, например,
проектирование пользовательского интерфейса. Для этой задачи внутренняя структура той части
системы, которая прямо не общается с пользователем, обычно не важна, и использование прототипов -
это единственный способ узнать, какова будет реакция пользователя при работе с
системой. Другим
примером служат прототипы, прямо предназначенные для изучения внутренней структуры системы.
Здесь уже интерфейс с пользователем может быть примитивным, возможна работа с моделью
пользователей.
Использование прототипов - это способ экспериментирования. Ожидаемый результат - это
более
глубокое понимание целей, а не сам прототип. Возможно, сущность прототипа заключается в том, что
он является настолько неполным, что может служить лишь средством для эксперимента, и его нельзя
превратить в конечный продукт без больших затрат на перепроектирование и на другую реализацию.
Оставляя прототип "неполным", мы тем самым переключаем внимание на эксперимент и уменьшаем
опасность превращения прототипа в законченный продукт. Это также почти избавляет от искушения
взять за основу проекта системы проект прототипа, при этом забывая или игнорируя те ограничения,
которые внутренне присущи прототипу. После эксперимента прототип надо просто выбросить.
Не следует забывать о
других способах проведения эксперимента, которые могут служить во многих
случаях альтернативой созданию прототипа, и там, где они применимы, их использование
предпочтительнее, поскольку они обладают большей точностью и требуют меньших затрат времени
разработчика и ресурсов системы. Примерами могут служить математические модели и различные
формы моделирования. По сути, существует бесконечная возрастающая последовательность, начиная
от математических моделей, ко все более и более детальным способам моделирования, затем к
прототипам, к частичным реализациям системы, вплоть до полной системы.
Это подводит к идее построения системы, исходя из начального проекта и реализации, и двигаясь
путем повторного прохождения этапов проектирования и реализации. Это идеальная стратегия, но она
предъявляет высокие требования к средствам проектирования и реализации, и в
ней содержится
определенный риск того, что программный объем, реализующий решения, принятые при начальном
проектировании, в процессе развития вырастет до такой величины, что существенное улучшение
проекта будет просто невозможно.
Похоже, что по крайней мере теперь такую стратегию применяют или в проектах от малого до среднего
размеров, т.е. там, где маловероятны переделки общего проекта, или же для перепроектирования и
иной реализации после выдачи первоначальной версии системы, где указанная стратегия становится
неизбежной.
Помимо экспериментов, предназначенных для оценки решений, принимаемых на этапе проектирования,
источником получения полезной информации может быть анализ собственно проектирования и (или)
реализации. Например, может оказаться полезным изучение различных зависимостей между классами
(см.$$ 12.2), не следует забывать и о таких традиционных вспомогательных средствах реализации, как
граф вызовов функций, оценка производительности и т.п.
Заметим, что спецификация (результат анализа системы) и проект могут содержать ошибки, как и
реализация, и возможно, они даже больше подвержены ошибкам, т.к. являются менее точными, не
могут быть проверены на практике и обычно не окружены такими развитыми средствами, как те, что
служат для анализа и проверки реализации. Введение большей формализации в
язык или запись, с
помощью которой изложен проект, в какой-то степени облегчает использования этих средств для
проектирования. Но, как сказано в $$12.1.1, это нельзя делать за счет ухудшения языка, используемого
для реализации. К тому же формальная запись может сама стать источником трудностей и проблем.
Это происходит, когда выбранная степень формализации плохо подходит для конкретных задач, когда
строгость формализации превосходит математическую основу системы и квалификацию разработчиков
Бьерн Страуструп.
Язык программирования С++
298
и программистов, и когда формальное описание системы начинает расходиться с реальной системой,
для которой оно предназначалось.
Заключение о необходимости опыта и о том, что проектирование неизбежно сопровождается ошибками
и плохо поддержано программными средствами, служит основным доводом в пользу итеративной
модели проектирования и реализации. Альтернатива - это линейная модель процесса развития,
начиная с
анализа и кончая тестированием, но она существенно дефектна, поскольку не допускает
повторных проходов, исходя из опыта, полученного на различных этапах развития системы.
Достарыңызбен бөлісу: