Удивительно, но за прошедшие 30 лет так и не найдено общепризнанного русского эквивалента этому английскому термину: буквальный перевод "программная инженерия" звучит не совсем по-русски; специализированные англо-русские словари предлагают такие варианты, как "разработка ПО", "техника матобеспечения", "программотехника", "технология программирования" и даже просто "программирование". Это все не то - предмет в лучшем случае сужается, а в худшем - просто искажается. В результате, слишком многие трактуют "Software Engineering" только как приложение CASE - технологий.
Что ж, терминологические трудности отражают проблемы сущностные: общеизвестны сложные отношения отечественных программистов с технологическими схемами, заключающими процесс создания ПО в жесткие рамки. Не потому ли при наличии устойчивого мифа "наши программисты - лучшие в мире" и передаваемых из уст в уста "правдивых историях" о том, каким экспертом чувствует себя наш программист - интеллектуал, начиная работать в западной компании, так мало у нас примеров коммерчески успешных на мировом рынке программных проектов - не просто интересно задуманных и воплощенных в виде прототипа, но и прошедших весь жизненный цикл и попавших в руки широкому потребителю.
Официальной причиной рождения Software Engineering была реакция на те проблемы программной индустрии, которые на той же конференции НАТО получили интегральный ярлык "software crisis": процесс создания ПО обычно не хотел укладываться в запланированные сроки и бюджет, а качество продукта, как правило, оставляло желать лучшего. Об этом кризисе говорят и по сей день; однако, ныне Software Engineering - это обширная и хорошо разработанная область компьютерной науки и технологии, включающая в себя многообразные математические, инженерные, экономические и управленческие аспекты.
Рецензируемая книга профессора Университета в Ланкастере (Англия) Яна Соммервилла является наиболее известным и широко используемым в мире учебником по обозначенной тематике. Первое издание вышло еще в 1982 г. и сейчас пережило уже пятую редакцию; общее же число всех переизданий достигло 18, что, согласитесь, впечатляет.
Такой популярностью книга Я. Соммервилла обязана тому, что содержит сжатое, но четко структурированное и в определенном смысле исчерпывающее изложение основ Software Engineering. Как подчеркивает автор в своем предисловии, он стремился дать описание максимально широкого спектра используемых в практике современной программной индустрии методов и средств, в то же время избегая всякого рода экзотических и представляющих лишь теоретический интерес подходов и тем.
Главы, а их в книге 34, распределены по 8 разделам. Первый - краткое введение в предмет. Следующий - "Требования и Спецификации" начинается с глав, посвященных определению, анализу и эволюции требований к разрабатываемой программной системе. Рассматриваются основные модели систем, среди которых выделяются потоковые ("data-flow"), объектные и семантические модели данных. Описываются методы определения требований, анализируется место формальных спецификаций, в частности - алгебраических и Z-схем, в современной практике разработки.
Раздел 3 посвящен проектированию ПО. Вводятся различные стратегии проектирования и методы оценки их качества. В соответствии с современными представлениями, прежде всего акцентируется важность проектирования архитектуры системы; далее представлены функционально-ориентированный и объектно-ориентированный подходы к проектированию. Отдельные главы описывают специфику создания систем реального времени и пользовательских интерфейсов.
В четвертом разделе речь идет о надежности ПО. Представлены специфические методы "надежного программирования" и количественные методы оценки получаемого результата. В этом контексте рассматривается и практика повторного использования ПО, а также специфика особенно критичных с точки зрения надежности и устойчивости функционирования программных систем. Продолжение этой темы - в следующем разделе, который посвящен верификации и проверке корректности ПО. Для отечественных специалистов будет особенно интересна глава, посвященная методам статической верификации, позволяющим обнаруживать дефекты без запуска программы.
Особый - шестой - раздел книги посвящен столь фетишизируемым иногда CASE - средствам, после чего автор переходит к обширной и особо актуальной для практики отечественных разработок теме менеджмента. Прежде всего акцентируется важность человеческого фактора ("peopleware") и его учета в процессе коллективной разработки программ. Рассматриваются многочисленные приемы и метрики, позволяющие управлять качеством проекта, измерять и повышать производительность труда и выполнять обоснованные оценки стоимости и продолжительности проекта. Подробно описаны подходы к улучшению процесса разработки, в том числе основанные на модели зрелости процесса разработки ("SEI process maturity model").
В последнем разделе рассматриваются проблемы, связанные с эволюцией ПО - представлены подходы к сопровождению, управлению конфигурацией и реинжинирингу. Кстати, последнее понятие, связанное с перестройкой существующей программной системы, автор рекомендует не путать с "reverse engineering" - восстановлением проекта и/или спецификации из кода, что почему-то стало традицией в отечественной литературе.
Книга содержит большое количество иллюстративных примеров и фрагментов кода на языках C++ и Ada. Большое внимание автор уделил методике подачи материала: отсюда продуманная разветвленная структура книги и огромное количество схем и диаграмм, которые к тому же можно скачать по Internet. Конечно, несмотря на солидный объем книги, широта материала не оставила автору шансов на детальное рассмотрение каждой проблемы; неизбежная сжатость изложения, однако, компенсируется аннотиронным указателем на источники, более подробно обсуждающие данную тему. В конце же книги - исчерпывающая библиография из более чем 400 названий.
В целом, можно смело констатировать, что аналогов данной книги, изданных на русском языке, попросту нет. А жаль - она была бы очень полезна всем студентам и преподавателям компьютерных специальностей. Профессионалы же могли бы ее использовать как справочник.