Файл: Руководство по стилю программирования и конструированию по.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.11.2023
Просмотров: 844
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
ГЛАВА 28 Управление конструированием
671
쐽
откажитесь делать то, что говорит ваш менеджер, настаивайте на выполнении работы правильным образом;
쐽
найдите другую работу.
Наилучшим долгосрочным решением будет попытка просветить вашего менеджера.
Это не всегда легкая задача, но одним из способов подготовиться к ней будет чтение книги Дейла Карнеги «How to Win Friends and Influence People».
Дополнительные ресурсы по управлению конструированием
Следующие книги освещают общие вопросы управления программными проектами.
Gilb, Tom.
Principles of Software Engineering Management. Wokin- gham, England: Addison-Wesley, 1988. Гилб прокладывает собственный курс на про- тяжении 30 лет, и большую часть времени он обгоняет остальных независимо от того, отдают ли они себе в этом отчет. Эта книга — хороший тому пример. Она была одной из первых работ, в которых обсуждались эволюционные методики раз- работки, управление рисками и применение формальных проверок. Гилб хоро- шо осведомлен о наиболее передовых подходах; действительно, эта книга, опуб- ликованная более 15 лет назад, содержит большинство хороших методик, кото- рые преподносятся в настоящее время в качестве быстрой (agile) разработки. Гилб исключительно практичен, и его книга до сих пор является одной из лучших в сфере управления ПО.
McConnell, Steve.
Rapid Development. Redmond, WA: Microsoft Press, 1996. Эта книга охватывает вопросы руководства и управления проектами, на выполнение кото- рых остро не хватает времени, что, по моему опыту, относится к большинству про- ектов.
Brooks, Frederick P., Jr.
The Mythical Man-Month: Essays on Software Engineering, Anniver-
sary Edition (2d ed). Reading, MA: Addison-Wesley, 1995. Эта книга — смесь метафор и фольклора, связанного с управлением программными проектами. Она увлека- тельна и может пролить свет на содержимое ваших собственных проектов. В ее основе лежит рассказ о трудностях, с которыми сталкивался Брукс при разработ- ке операционной системы OS/360, что позволяет мне сделать несколько замеча- ний. Она полна советов наподобие «Мы сделали так, и это не сработало» и «Нам следовало сделать вот так, потому что тогда бы это работало». Наблюдения Брук- са по поводу неудачных методик хорошо обоснованы, но его заявления, что дру- гие технологии были бы удачны, слишком гипотетичны. Читайте эту книгу кри- тически, чтобы отделять наблюдения от умозаключений. Это предупреждение не умаляет значимости книги. Ее до сих пор чаще других цитируют в компьютер- ной литературе, и, хотя впервые она была опубликована в 1975 году, до сих пор кажется актуальной. Ее сложно читать без того, чтобы не восклицать «Точно!»
каждые пару страниц.
Соответствующие стандарты
IEEE Std 1058-1998, Standard for Software Project Management Plans.
IEEE Std 12207-1997, Information Technology — Software Life Cycle Processes.
http://cc2e.com/2813
672
1 ... 77 78 79 80 81 82 83 84 ... 104
ЧАСТЬ VI Системные вопросы
IEEE Std 1045-1992, Standard for Software Productivity Metrics.
IEEE Std 1062-1998, Recommended Practice for Software Acquisition.
IEEE Std 1540-2001, Standard for Software Life Cycle Processes — Risk Management.
IEEE Std 828-1998, Standard for Software Configuration Management Plans
IEEE Std 1490-1998, Guide — Adoption of PMI Standard — A Guide to the Project
Management Body of Knowledge.
Ключевые моменты
쐽
Хорошая практика кодирования может быть достигнута путем внедрения стан- дартов или более ловкими способами.
쐽
Управление конфигурацией при правильном применении делает работу про- граммистов проще. Это особенно касается контроля изменений.
쐽
Правильная оценка ПО — сложная задача. Ключ к успеху — использование нескольких подходов, уточнение оценок по мере продвижения проекта и при- менение накопленных данных при выполнении оценки.
쐽
Измерения — это ключ к успешному управлению конструированием. Вы все- гда сможете найти способы измерить любой аспект проекта, что будет лучше,
чем полное отсутствие измерений. Точное измерение — ключ к точному со- ставлению плана, контролю качества и улучшению процесса разработки.
쐽
Программисты и менеджеры — в первую очередь люди, и они лучше всего работают тогда, когда к ним относятся по-человечески.
ГЛАВА
28 Управлениена конструированием
673
Г Л А В А 2 9
Интеграция
Содержание
쐽
29.1. Важность выбора подхода к интеграции
쐽
29.2. Частота интеграции — поэтапная или инкремент- ная?
쐽
29.3. Стратегии инкрементной интеграции
쐽
29.4. Ежедневная сборка и дымовые тесты
Связанные темы
쐽
Тестирование во время разработки: глава 22
쐽
Отладка: глава 23
쐽
Управление конструированием: глава 28
Термин «интеграция» относится к такой операции в процессе разработки ПО, при которой вы объединяете отдельные программные компоненты в единую си- стему. В небольших проектах интеграция может занять одно утро и заключаться в объединении горстки классов. В больших — могут потребоваться недели или месяцы, чтобы связать воедино весь набор программ. Независимо от размера за- дач в них применяются одни и те же принципы.
Тема интеграции тесно переплетается с вопросом последовательности конструи- рования. Порядок, в котором вы создаете классы или компоненты, влияет на по- рядок их интеграции: вы не можете интегрировать то, что еще не было создано.
Последовательности интеграции и конструирования имеют большое значение.
В этой главе мы рассмотрим оба вопроса с точки зрения интеграции.
29.1. Важность выбора подхода к интеграции
В инженерных отраслях, отличных от разработки ПО, важность правильной ин- теграции хорошо известна. На северо-западном побережье Тихого океана, где я живу, столкнулись с драматическими последствиями плохой интеграции, когда футбольный стадион Университета Вашингтон частично обрушился во время строительства (рис. 29-1).
http://cc2e.com/2985
674
ЧАСТЬ
VI Системные вопросы
Рис. 29-1. Навес над футбольным стадионом Вашингтонского университета об-
рушился, не выдержав собственного веса во время строительства. Он скорее всего
был бы достаточно прочным после завершения работ, но строительство велось
в неправильном порядке — налицо ошибка интеграции
Не имеет значения, что после завершения строительства стадион был бы доста- точно прочным — он должен был быть таким и на других этапах работы. Если вы создаете и интегрируете ПО в неправильном порядке, его сложнее кодировать, сложнее тестировать и сложнее отлаживать. Если ничего не работает до того, как заработает все вместе, можно предположить, что проект никогда не будет завер- шен. Он также может рухнуть под собственным весом во время конструирования: количество дефектов может оказаться непреодолимым, прогресс — невидимым, а сложность — чрезмерной, даже если законченный продукт был бы вполне ра- ботоспособен.
Поскольку интеграция выполняется после того, как разработчик завершил свое тестирование, и одновременно с системным тестированием, ее иногда считают операцией, относящейся к тестированию. Однако она достаточно сложна, и поэтому ее следует рассматривать как независимый вид деятельности.
Аккуратная интеграция обеспечивает:
쐽
упрощенную диагностику дефектов;
쐽
меньшее число ошибок;
쐽
меньшее количество «лесов»;
쐽
раннее создание первой работающей версии продукта;
쐽
уменьшение общего времени разработки;
쐽
лучшие отношения с заказчиком;
쐽
улучшение морального климата;
쐽
увеличение шансов завершения проекта;
쐽
более надежные оценки графика проекта;
쐽
более аккуратные отчеты о состоянии;
ГЛАВА
29 Интеграция
675
쐽
лучшее качество кода;
쐽
меньшее количество документации.
Интеграцию часто недооценивают, несмотря на ее важность, и именно поэтому я посвятил ей отдельную главу.
29.2. Частота интеграции — поэтапная
или инкрементная?
Интеграция программ выполняется посредством поэтапного или инкрементного подхода.
Поэтапная интеграция
За исключением последних нескольких лет поэтапная интеграция была нормой.
Она состояла из хорошо определенных этапов, перечисленных ниже.
1. «Модульная разработка»: проектирование, кодирование, тестирование и отладка каждого класса.
2. «Системная интеграция»: объединение классов в одну огромную систему.
3. «Системная дезинтеграция» [спасибо Мейлиру Пейдж-Джонсу (Meilir Page-Jones) за это остроумное замечание]: тестирование и отладка всей системы.
Проблема поэтапной интеграции в том, что, когда классы в системе впервые соединяются вместе, неизбежно возникают новые проблемы и их причины могут быть в чем угодно. Поскольку у вас масса классов, которые никогда раньше не ра- ботали вместе, виновником может быть плохо протестированный класс, ошибка в интерфейсе между двумя классами или ошибка, вызванная взаимодействием двух классов. Все классы находятся под подозрением.
Неопределенность местонахождения любой из проблем сочетается с тем фактом, что все эти проблемы вдруг проявляют себя одновременно. Это заставляет вас иметь дело не только с проблемами, вызванными взаимодействием классов, но и другими ошибками, которые трудно диагностировать, так как они взаимодей- ствуют. Поэтому поэтапную интеграцию называют еще «интеграцией большого взрыва» (рис. 29-2).
Рис. 29-2. Поэтапную интеграцию также называют интеграцией
«большого взрыва» — и заслуженно!
676
ЧАСТЬ
VI Системные вопросы
Поэтапную интеграцию нельзя начинать до начала последних стадий проекта, когда будут разработаны и протестированы все классы. Когда классы наконец будут объединены и проявится большое число ошибок, программисты тут же ударятся в паническую отладку вместо методического определения и исправления ошибок.
Для небольших программ — нет, а для крошечных — поэтапная интеграция может быть наилучшим подходом. Если программа состоит из двух-трех классов, поэтапная интеграция может сэкономить ваше время, если вам повезет. Но в большинстве случаев другой подход будет лучше.
Инкрементная интеграция
При инкрементной интеграции вы пишете и тестируете маленькие участки программы, а затем комбинируете эти кусочки друг с другом по одному. При таком подходе — по одному элементу за раз — вы выполняете перечисленные далее действия.
1. Разрабатываете небольшую, функциональную часть си- стемы. Это может быть наименьшая функциональная часть, самая сложная часть, основная часть или их комбинация.
Тщательно тестируете и отлаживаете ее. Она послужит скелетом, на котором будут наращиваться мускулы, нервы и кожа, составляющие остальные части системы.
2. Проектируете, кодируете, тестируете и отлаживаете класс.
3. Прикрепляете новый класс к скелету. Тестируете и отлаживаете соединение скелета и нового класса. Убеждаетесь, что эта комбинация работает, прежде чем переходить к добавлению нового класса. Если дело сделано, повторяете процесс, начиная с п. 2.
У вас может возникнуть желание интегрировать большие модули, чем отдельный класс. Например, если компонент был тщательно протестирован и каждый из его классов прошел мини-интеграцию, вы можете интегрировать весь компонент, и это все еще будет инкрементная интеграция. По мере того, как вы добавляете новые куски, система разрастается и ускоряется, как разрастается и ускоряется снежный ком, катящийся с горы (рис. 29-3).
Рис. 29-3. Инкрементная интеграция дает проекту движущую силу и напоминает
снежный ком, катящийся с горы
Перекрестная ссылка О метафо- рах, подходящих для инкремент- ной интеграции, см. подразделы
«Метафора жемчужины: мед- ленное приращение системы» и «Строительная метафора: по- строение ПО» раздела 2.3.
ГЛАВА
29 Интеграция
677
Преимущества инкрементной интеграции
Инкрементный подход имеет массу преимуществ перед традиционным поэтапным подходом независимо от того, какую инкрементную стратегию вы используете:
Ошибки можно легко обнаружить Когда во время инкрементной интеграции возникает новая проблема, то очевидно, что к этому прича- стен новый класс. Либо его интерфейс с остальной частью программы неправилен, либо его взаимодействие с ранее интегрированными классами при- водит к ошибке. В любом случае вы точно знаете, где искать проблему (рис. 29-4).
Более того, поскольку вы сталкиваетесь с меньшим числом проблем одновременно, вы уменьшаете риск того, что несколько ошибок будут взаимодействовать или маскировать друг друга. Чем больше интерфейсных ошибок может возникнуть, тем больше преимуществ от инкрементной интеграции получат ваши проекты.
Учет ошибок в одном проекте показал, что 39% составляли ошибки межмодульных интерфейсов (Basili и Perricone, 1984). Поскольку разработчики многих проектов проводят до 50% времени за отладкой, максимизация эффективности отладки пу- тем упрощения поиска ошибок дает выигрыш в качестве и производительности.
Рис. 29-4. При поэтапной интеграции вы объединяете так много компонентов
одновременно, что тяжело понять, где находится ошибка. Она может быть
в любом компоненте или их соединениях. При инкрементной интеграции ошибка
обычно таится либо в новом компоненте, либо в месте соединения нового компонен-
та и остальной системы
В таком проекте система раньше становится работоспособной Когда код интегрирован и способен выполняться, даже если система еще не пригодна к использованию, это выглядит так, будто это скоро произойдет. При инкремент- ной интеграции программисты раньше видят результаты своей работы, поэтому их моральное состояние лучше, чем в том случае, когда они подозревают, что их проект может никогда не сделать первый вдох.
Вы получаете улучшенный мониторинг состояния При частой интеграции реализованная и нереализованная функциональность видна с первого взгляда.
Менеджеры будут иметь лучшее представление о состоянии проекта, видя, что 50% системы уже работает, а не слыша, что кодирование «завершено на 99%».