Предисловие
Программные системы ныне присутствуют повсеместно: практически любые электронные устройства содержат программное обеспечение (ПО) того или иного вида. Без соответствующего программного обеспечения в современном мире невозможно представить индустриальное производство, школы и университеты, систему здравоохранения, финансовые и правительственные учреждения. Многие используют ПО для самообразования или различного рода развлечений. Создание спецификации требований, разработка, модификация и сопровождение таких систем ПО составляет суть технической дисциплины инженерия программного обеспечения (software engineering).
Даже простые системы ПО обладают высокой степенью сложности, поэтому при их разработке приходится использовать весь арсенал технических и инженерных методов. Таким образом, инженерия программного обеспечения - это инженерная дисциплина, где разработчики ПО используют теорию и методы компьютерных наук для успешного решения различных нетривиальных задач (но, конечно, не каждый проект ПО в силу различных причин успешно завершается). Большинство современных программ предлагают пользователям большие сервисные возможности для работы с ними - нельзя не заметить реального прогресса в развитии технологии создания ПО за последние 30 лет.
Инженерия программного обеспечения развивается в основном в соответствии с постановкой новых задач построения больших пользовательских систем ПО для промышленности, правительства и оборонного ведомства. С другой стороны, в настоящее время сфера программного обеспечения чрезвычайно широка: от игр на специализированных игровых консолях, а также программных продуктов для персональных компьютеров и Web-ориентированных программных систем до очень больших масштабируемых распределенных систем. Хотя некоторые технологии, применяемые для построения пользовательских программных систем, универсальны (например, объектно-ориентированные методы), новые технологии создания программного обеспечения развиваются с учетом различных типов ПО. Невозможно охватить в одной книге все технологии создания ПО, поэтому я сконцентрировал основное внимание не на методах разработки отдельных программных продуктов, а на универсальных технологиях и методах проектирования и построения больших масштабируемых программных систем.
Хотя данная книга запланирована как общее введение в инженерию программного обеспечения, в ней отражены мои собственные интересы к критическим системам и процессу разработки требований для программных систем. Я думаю, что эти вопросы имеют практическую важность в преддверии 21-го столетия, так как благодаря их решению современное ПО сможет удовлетворить реальные нужды пользователей следующего века.
В этой книге я старался дать широкую панораму инженерии программного обеспечения без концентрации внимания на каких-либо специальных методах или средствах. Я испытываю стойкую неприязнь к фанатикам любого рода, будь то академический проповедник, рекламирующий формальные методы и подходы, или продавец ПО, пытающийся убедить меня, что именно его программное средство или метод решит все проблемы создания программного обеспечения. Не существует простых решений задач создания ПО; для этого необходим широкий спектр средств, методов и технологий.
Книги неизбежно отражают мнения и предпочтения авторов. Некоторые читатели конечно же не согласятся с моим мнением или выбором материала для книги. Такое несогласие, т.е. здоровая реакция, вызванная множественностью подходов к инженерии программного обеспечения, и является залогом ее дальнейшего развития. Вместе с тем я надеюсь, что все разработчики программного обеспечения, а также студенты, изучающие дисциплину "Инженерия программного обеспечения", найдут в этой книге что-то интересное для себя.
Отличия от пятого издания
Подобно многим системам программного обеспечения, эта книга растет и изменяется начиная с первого издания, опубликованного в 1982 году. Одной из целей при подготовке настоящего издания было сокращение объема книги. Это привело к определенной реорганизации ее содержания и к глубоким раздумьям о том, какой материал можно удалить для того, чтобы включить новый. В результате объем книги уменьшился на 10% по сравнению с пятым изданием.
- Теперь книга содержит семь частей, а не восемь, как было в предыдущем издании. В них представлено введение в инженерию программного обеспечения, темы разработки требований для ПО, собственно создания программного продукта, разработки критических систем, проверки и аттестации ПО, управления ПО, а также эволюции программных систем.
- Добавлены новые главы, описывающие процесс создания и эксплуатации программного обеспечения, архитектуру распределенных систем, проблемы надежности и наследования ПО. Теме формальной спецификации ПО теперь посвящена только одна глава. Материал по CASE-технологиям сокращен и распределен по нескольким главам. Материал по функциональному проектированию ПО теперь содержит новую главу по наследуемым системам (legacy systems). Главы, описывающие верификацию и аттестацию ПО, объединены в отдельную часть.
- Во все главы внесены изменения, а некоторые существенно переработаны. Повторное использование программных компонентов в настоящем издании рассматривается как тема разработки ПО с повторным использованием программных продуктов совместно с материалом о паттернах и темой разработки ПО, основанной на покомпонентном подходе. Главы по разработке требований выделены в отдельную часть книги.
- Вводная часть книги содержит четыре главы. В них собран вводный материал, который в пятом издании был разбросан по всей книге. Глава 1 полностью переписана и построена в форме вопросов и ответов, касающихся инженерии программного обеспечения.
- Материал по критическим системам реструктуризирован и объединен таким образом, чтобы темы надежности, безопасности и работоспособности ПО теперь не выделялись как отдельные. Добавлен также небольшой материал о защищенности ПО как атрибуте критических систем.
- В данном издании примеры программ написаны на языке Java, а модели объектов - на UML. Примеры программ на языках Ada и C++ удалены из книги, но доступны на моем Web-узле.
Круг читателей книги
Книга предназначена для студентов, изучающих технологии создания ПО, и специалистов по программному обеспечению, работающих в различных областях индустрии разработки программных систем. Ее можно использовать как основу базового курса по инженерии программного обеспечения или в качестве материала для таких курсов, как углубленные технологии программирования, спецификации ПО, разработка и управление программными системами. Программисты-практики не только найдут в книге много полезного в аспекте общих концептуальных вопросов, но и "освежат" знания по таким практическим темам, как разработка требований, предъявляемых к ПО, разработка архитектуры программных систем, конструирование надежных систем и управление процессом создания ПО. Кроме того, практические примеры, сопровождающие изложение материала, дадут представление о тех типах программных приложений, с которыми специалист по программному обеспечению может столкнуться в практической деятельности.
Я предполагаю, что читатель имеет базовые знания по программированию и современным компьютерным системам, а также знаком с такими основными структурами данных, как стеки, списки и очереди.
Использование книги как учебного пособия
Материал книги может служить основой для трех курсов по технологии создания программного обеспечения.
1. Базовый вводный курс по инженерии программного обеспечения. Для этого можно использовать материал первой части, затем выбрать отдельные главы из остальных частей книги. Это даст студентам общее представление об инженерии программного обеспечения и позволит в дальнейшем подробнее изучить темы, которые их интересуют.
2. Вводные или углубленные курсы по отдельным темам инженерии программного обеспечения. На базе материала книги можно создать курсы по спецификации ПО, методам разработки ПО, управлению процессом создания ПО, разработке надежных систем и эволюции ПО. Каждая часть книги может служить основой вводного или углубленного курса по этим темам.
3. Более углубленные курсы по отдельным темам инженерии программного обеспечения. Главы книги могут составить основу таких курсов, но необходимо дополнить их материалом из других источников. Дополнительные материалы можно найти на моей Web-странице.
Достоинство настоящей книги состоит в том, что ее можно использовать как основу для многих различных взаимосвязанных курсов. Например, в университете Ланкастера мы используем материал этой книги для вводного курса по инженерии программного обеспечения, для курса по спецификации ПО, курса по разработке критических систем и для курса по управлению разработкой ПО, дополняя его при необходимости материалом из других источников. Книга дает студентам последовательное и достаточно полное представление о технологии создания ПО, так что им не приходится покупать несколько книг по этой тематике.
Книга содержит весь материал, рекомендованный Ассоциацией по вычислительной технике и Институтом инженеров по электротехнике и электронике (ACM и IEEE) в документе Computing Curricula 2001 (Учебный план по компьютерным дисциплинам 2001), по компоненту Software Engineering (Инженерия программного обеспечения) базового набора дисциплин, составляющих основу компьютерных наук. Материал книги также соответствует документу Software Engineering Body of Knowledge (Совокупность знаний по инженерии программного обеспечения), который должен был быть опубликован ACM/IEEE в 2001 году.
Web-страница
Моя Web-страница (http://www.software-engin.com) содержит ссылки на материал, который используется в этой книге и будет полезен как преподавателям, так и изучающим инженерию программного обеспечения самостоятельно. Для загрузки доступны отмеченные ниже материалы.
- Руководство для преподавателей, включающее советы по использованию данной книги, рекомендации по аудиторной работе, задания для самостоятельного изучения, решения некоторых примеров из книги. Весь материал представлен в формате Adobe PDF.
- Иллюстративный материал для каждой главы в формате Adobe PDF и Microsoft PowerPoint. Преподаватели могут адаптировать и изменять этот материал в соответствии со своими потребностями.
- Исходные коды программ на языке Java для всех основных примеров из книги, включая дополнительный код, необходимый для компиляции.
- Дополнительный материал, используемый в предыдущих изданиях книги. Также доступны программные примеры на языках Ada и С++, которые иллюстрировали пятое издание.
Web-страница содержит ссылки на статьи по инженерии программного обеспечения, ссылки на другие Web-страницы аналогичной направленности, информацию о книгах по данной тематике и рекомендации для дальнейшего чтения.
Я всегда рад получить отклики на мои книги; вы можете писать мне по адресу электронной почты [email protected]. Но я заранее приношу свои извинения за то, что из-за отсутствия времени не смогу ответить студентам на вопросы их домашних заданий.
Благодарности
За все годы существования этой книги многие внесли свой вклад в ее эволюцию, и поэтому я хочу поблагодарить каждого, кто высказал замечания по тексту предыдущих изданий и дал свои рекомендации по его улучшению. Я благодарен всем, кто отметил отдельные недостатки в тексте книги и сделал полезные замечания, которые учтены в последнем издании.
Прежде всего за отмеченные недостатки и полезные рекомендации я хочу поблагодарить Энди и Линдсея Гиллесов (Andy Gillies и Lindsey Gillies) из университета Восточной Англии, Джоя Ламберта (Joe Lambert) из университета шт. Пенсильвания, Франка Меддикса (Frank Maddix) из университета Восточной Англии, Нэнси Мед (Nancy Mead) из Института инженерии программного обеспечения (Software Engineering Institute), г. Питтсбург, Крис Прайс (Chris Price) из университета Уэльса, г. Аберистуит, Грегга Ротермела (Gregg Rothermel) из университета шт. Орегон и Гууса Шрейбера (Guus Schreiber) из университета Амстердама. Особую благодарность хочу выразить моим друзьям Рону Моррисону (Ron Morrison) из университета Св. Андрея и Рею Велланду (Ray Welland) из университета Глазго, которые рецензировали предыдущие издания книги и вновь добровольно прочитали текст этого издания.
Особо хотелось бы отметить заслуги моей семьи; они смирились с моим постоянным отсутствием за ужином в те бесконечные дни, когда я заканчивал эту книгу. Благодарю мою жену Энни и дочерей Али и Джейн за прекрасный кофе и терпение.
Иан Соммервилл
Ланкастер, февраль 2000 г.