Сегодня о технике разработки программного обеспечения известно значительно больше, чем в 1975 году. Какие из утверждений, содержащихся в первом издании 1975 года, подтвердились опытом и данными? Какие были опровергнуты? Какие устарели в нашем изменчивом мире? Чтобы вам легче было судить, здесь, в виде сводки, приведены важнейшие утверждения книги 1975 года, которые я считал верными: факты и извлеченные из опыта практические правила, приведенные с сохранением изначального смысла. (Можно задаться вопросом: если это все, что было сказано в первоначальном издании, почему тогда это заняло так много места?) В скобках приведены свежие комментарии.
Большинство этих предложений можно проверить на практике. Излагая их в сжатой форме, я надеюсь сконцентрировать мысли читателя, измерения и комментарии.
Глава 1. Смоляная яма
| 1.1. |
Для создания системного программного продукта требуется примерно в девять раз больше усилий по сравнению с составляющими его программами, написанными отдельно для частного использования. По моей оценке, превращение программы в продукт вводит коэффициент, равный трем; проектирование, интеграция и тестирование компонентов, которые должны образовать согласованную систему, также вводит коэффициент, равный трем; все эти составляющие стоимости существенно независимы друг от друга. |
| 1.2 |
Занятие программированием "отвечает глубокой внутренней потребности в творчестве и удовлетворяет чувственные потребности, которые есть у всех у нас", доставляя пять видов радости:
- Радость, получаемая при создании чего-то своими руками.
- Удовольствие создавать вещи, которые могут быть полезны другим людям.
- Очарование создания сложных головоломных объектов, состоящих из взаимодействующих движущихся частей.
- Радость, получаемая от неизменного узнавания нового, неповторяемости задачи.
- Удовольствие от работы со столь податливым материалом - чистой мыслью, который, тем не менее, существует, движется и работает так, как не могут словесные объекты.
|
| 1.3 |
В то же время этому занятию присущи и огорчения:
- При изучении программирования труднее всего привыкнуть к требованию совершенства.
- Постановка задач осуществляется другими людьми и приходится зависеть от вещей (особенно, программ ), которые нельзя контролировать; полномочия не соответствуют ответственности.
- Страшно только на словах: фактическая власть приобретается как следствие успешного выполнения задач.
- Программный проект приближается к окончательному виду тем медленнее, чем ближе окончание, хотя кажется, что к концу сходимость должна быть более быстрой.
- Программному продукту грозит устаревание еще до его завершения. Настоящий тигр - не пара бумажному, если требуется реальное использование.
|
| 2.1. |
Программные проекты чаще проваливаются из-за нехватки календарного времени, чем по всем остальным причинам, вместе взятым. |
| 2.2 |
Чтобы приготовить вкусную пищу, нужно время; некоторые задачи нельзя ускорить, не испортив результат. |
| 2.3 |
Все программисты являются оптимистами: "Все будет хорошо". |
| 2.4 |
Поскольку программист работает с чистыми идеями, мы не ожидаем особых трудностей при реализации. |
| 2.5 |
Но сами наши идеи бывают ошибочными - отсюда и ошибки в программах. |
| 2.6 |
Наши методы оценивания, основанные на учете затрат, смешивают затраты с полученным результатом. Человеко-месяц является ошибочным и опасным заблуждением, поскольку предполагает, что месяцы и количество людей можно менять местами. |
| 2.7 |
Разделение задачи между несколькими людьми вызывает дополнительные затраты на обучение и обмен информацией. |
| 2.8 |
Мое практическое правило: 1/3 времени - на проектирование, 1/6 - на написание программы, 1/4 - на тестирование компонентов и 1/4 - на системное тестирование. |
| 2.9 |
Как научной дисциплине нам не хватает методов оценки. |
| 2.10 |
Поскольку мы не уверены в своих оценках сроков работы, нам часто не достает смелости упрямо отстаивать их под нажимом руководства и клиентов. |
| 2. 11 |
Закон Брукса: если проект не укладывается в сроки, то добавление рабочей силы задержит его еще больше. |
| 2.12 |
Добавление рабочей силы увеличивает общий объем затрат тремя путями: труд по перекраиванию задач и происходящее при этом нарушение работы, обучение новых людей, дополнительное общение. |
| 6.1 |
Даже в большой команде проектировщиков оформление результатов нужно поручить одному или двум людям, чтобы обеспечить согласованность мини-решений. |
| 6.2 |
Важно явно определить те части архитектуры, которые не прописаны столь же тщательно, как остальные. |
| 6.3 |
Необходимо иметь как формальное описание проекта - для точности, так и текстуальное - для понимания. |
| 6.4 |
Либо формальное, либо текстуальное определения выбираются в качестве стандарта, при этом второе определение является производным. Каждое определение может выступать в любой из ролей. |
| 6.5 |
Реализация, в том числе модель, может служить определением архитектуры; такое использование имеет существенные недостатки. |
| 6.6 |
Прямое включение является очень искусным приемом для осуществления стандартов архитектуры в программном обеспечении (в аппаратном обеспечении - тоже: возьмите интерфейс Mac WIMP, встроенный в ROM). |
| 6.7 |
Архитектурное "определение будет яснее, а (архитектурная) дисциплина крепче, если изначально строятся как минимум две реализации". |
| 6.8 |
Важно, чтобы архитектор в телефонных разговорах отвечал исполнителям на их вопросы; обязательно нужно регистрировать эти разговоры в журнале и доводить их до общего сведения. (Сейчас для этого предпочтительнее электронная почта.) |
| 6.9 |
"Лучший друг менеджера проекта - его постоянный противник, независимая организация, тестирующая продукт." |
| 7.1 |
Проект Вавилонской башни провалился из-за недостатка обмена информацией и, как следствие, организации. |
| Обмен информацией |
| 7.2 |
"Отставание от графика, несоответствие функциональности, системные ошибки - все это из-за того, что левая рука не знает, что творит правая." Предположения команд расходятся. |
| 7.3 |
Бригады должны поддерживать между собой связь всеми возможными способами: неформально, путем регулярных совещаний по проекту с техническими отчетами и через общую рабочую тетрадь проекта. (А также электронную почту.) |
| Рабочая тетрадь проекта |
| 7.4 |
Рабочая тетрадь проекта есть "не столько отдельный документ, сколько структура, налагаемая на все документы, которые, так или иначе, будут созданы во время выполнения проекта." |
| 7.5 |
"Все документы проекта должны входить в эту структуру (рабочей тетради)." |
| 7.6 |
Структуру рабочей тетради нужно проектировать тщательно и рано. |
| 7.7 |
Правильное структурирование текущей документации с самого начала позволяет "составленные позднее документы оформить в виде отрывков, которые вписываются в эту структуру" и улучшает руководства по продукту. |
| 7.8 |
"Каждый член команды должен видеть все материалы (рабочей тетради)." (Сейчас я бы сказал "должен иметь возможность видеть". Например, достаточно WWW-страниц.) |
| 7.9 |
Своевременное обновление может иметь критическое значение. |
| 7.10 |
Необходимо, чтобы внимание пользователя было особо привлечено к изменениям, произошедшим после его последнего прочтения, причем с пометками об их значении. |
| 7.11 |
Рабочая тетрадь проекта OS/360 начиналась с бумажного варианта с последующим переходом на микрофиши. |
| 7.12 |
Сегодня (и даже в 1975 году) общий электронный блокнот является значительно лучшим, более дешевым и простым механизмом достижения этих целей. |
| 7.13 |
Необходимо помечать текст с помощью полосок изменения дат пересмотра (или их функционального эквивалента). Так же необходима сводка изменений по типу стека. |
| 7.14 |
Парнас старается доказать, что стремление к тому, чтобы каждый видел все, совершенно ошибочно: части должны инкапсулироваться таким образом, чтобы никому не требовалось или не разрешалось видеть содержание каких-либо частей, кроме своих собственных, а видны могут быть только интерфейсы. |
| 7.15 |
Предложение Парнаса - путь к катастрофе. (Парнас вполне убедил меня в обратном, и я совершенно изменил свое мнение. ) |
| Организация |
| 7.16 |
Задачей организации является сокращение объема необходимого общения и согласования. |
| 7.17 |
Организация заключает в себе разделение труда и специализацию функций с целью сократить обмен информацией. |
| 7.18 |
Обычная древовидная организация отражает структурный принцип власти, который показывает, что нельзя одновременно служить двум хозяевам. |
| 7.19 |
Структура обмена информацией в организации является не деревом, а сетью, и нужно придумать различные виды специальных организационных механизмов ("пунктирные линии "), чтобы преодолеть дефицит обмена информацией в древовидной организации. |
| 7.20 |
В каждом субпроекте есть две руководящие должности: продюсер и технический директор, или архитектор. Их функции совершенно различны и требуют разных способностей. |
| 7.21 |
Вполне эффективным может быть любой тип взаимоотношений между этими двумя должностями:
- Это может быть одно лицо.
- Продюсер может быть начальником, а директор - его правой рукой.
- Директор может быть начальником, а продюсер - его правой рукой.
|
| 8.1 |
Нельзя точно оценить общий объем или график работ программного проекта, просто оценив время написания программы и умножив на некоторые коэффициенты для остальных частей задания. |
| 8.2 |
Данные, относящиеся к созданию небольших отдельных систем, не применимы к проектам создания программных комплексов. |
| 8.3 |
Объем работ растет как степенная функция размера программы. |
| 8.4 |
Некоторые опубликованные исследования показывают, что показатель степени примерно равен 1,5. (Результаты Бема с этим не согласуются и меняются от 1,05 до 1,2. )1 |
| 8.5 |
Данные Портмана по ICL показывают, что занятые на полный рабочий день программисты только около 50 процентов времени занимаются программированием и отладкой, а остальное время занимают разные дополнительные задачи. |
| 8.6 |
По данным Арона из IBM, производительность труда лежит в пределах от 1,5 до 10 тысяч строк программы на человека в год в зависимости от количества взаимодействий между частями системы. |
| 8.7 |
По данным Харра из Bell Labs, производительность труда при задаче типа разработки операционной системы составила около 0,6 тысяч строк кода на человека в год, а при разработке компиляторов - 2,2 тысячи для законченных продуктов. |
| 8.8 |
Данные Брукса по OS/360 согласуются с данными Харра: 0,6-0,8 тысяч строк кода на человеко-год для операционных систем и 2-3 тысячи для компиляторов. |
| 8.9 |
Данные Корбато по проекту МТИ MULTICS показывают, что производительность труда при разработке смеси операционной системы и компиляторов составила 1,2 тысяч строк кода на человека в год, но это строки кода PL/I, а остальные данные относятся к строкам кода ассемблера. |
| 8.10 |
Производительность примерно постоянна в переводе на элементарные операторы. |
| 8.11 |
При использовании подходящих языков высокого уровня производительность можно увеличить в пять раз. |
| 9.1 |
Если не считать времени выполнения, то главные издержки приходятся на занимаемое программой пространство памяти. Это в особенности верно для операционных систем, значительная часть которых остается резидентной. |
| 9.2 |
Несмотря на это, деньги, потраченные на память для размещения программы, дают очень хорошее улучшение характеристик на единицу вложений - лучшее, чем все другие способы инвестирования в конфигурацию. Плох не размер программы, а лишний размер. |
| 9.3 |
Разработчик программы должен устанавливать задание по размеру, контролировать размер и придумывать методы сокращения размера, так же, как разработчик аппаратной части делает это для деталей. |
| 9.4 |
Ресурсы по памяти должны явно задавать не только размер резидентной части, но и интенсивность обращений программы к диску. |
| 9.5 |
Ресурсы памяти должны привязываться к назначению функций: точно определяйте, что должен делать модуль, когда задаете его размеры. |
| 9.6 |
Группы в составе больших бригад склонны производить оптимизацию в своих узких интересах, не думая о конечном эффекте, который она окажет на пользователя. Эта потеря ориентации является большой опасностью для крупных проектов. |
| 9.7 |
На всем протяжении реализации системные архитекторы должны постоянно проявлять бдительность с целью непрерывного обеспечения целостности системы. |
| 9.8 |
Воспитание общесистемного и ориентированного на пользователя подхода является, возможно, главной задачей менеджера по программированию. |
| 9.9 |
Нужно уже на ранних этапах определить, насколько детализированным будет предоставляемый пользователю выбор опций, поскольку объединение опций в группы сберегает память (а часто и расходы на маркетинг). |
| 9.10 |
Важно определить размер транзитной памяти, связанный с размером перегружаемого кода, поскольку зависимость производительности от этого размера сильнее, чем линейная. (Этот пункт полностью устарел благодаря наличию виртуальной памяти и дешевизне физической памяти. Теперь пользователи обычно покупают память в количестве, достаточном для размещения всего кода основных приложений.) |
| 9.11 |
Для достижения хорошего компромисса между пространством и временем необходимо проводить обучение технике программирования, присущей данному языку или машине, особенно если они новые. |
| 9.12 |
У программирования есть технология, и каждый проект нуждается в библиотеке стандартных компонентов. |
| 9.13 |
Библиотеки программ должны иметь по две версии каждого компонента - быструю и компактную. (Похоже, что сегодня это устарело.) |
| 9.14 |
Компактные и быстрые программы почти всегда являются результатом стратегического прорыва, а не тактической грамотности. |
| 9.15 |
Таким прорывом часто является новый алгоритм. |
| 9.16 |
Еще чаще прорыв происходит благодаря изменению представления данных или таблиц. Представление - сущность программирования. |
| 10.1 |
Гипотеза: Среди моря бумаг несколько документов становятся критически важными осями, вокруг которых вращается все управление проектом. Они являются главными личными инструментами менеджера. |
| 10.2 |
Для проекта разработки компьютера решающими документами являются цели, руководство, график, бюджет, организационная структура, план помещений, а также оценка, прогноз и цены для самой машины. |
| 10.3 |
Для факультета университета важнейшие документы аналогичны: цели, требования к соискателям степеней, описания курсов, предложения по научной работе, расписание занятий и план обучения, бюджет, план помещений, а также назначения преподавателей и аспирантов. |
| 10.4 |
Для программного проекта требования те же: цели, руководство пользователя, внутренняя документация, график, бюджет, организационная структура и план помещений. |
| 10.5 |
Поэтому даже для самого маленького проекта менеджер с самого начала должен формализовать такой набор документов. |
| 10.6 |
Подготовка каждого документа их этого маленького набора концентрирует мысль и кристаллизует обсуждение. При изложении на бумаге требуется принятие сотен мини-решений, и их наличие отличает четкую и точную политику от расплывчатой. |
| 10.7 |
Сопровождение каждого важного документа требует наличия механизма слежения за состоянием и предупреждения. |
| 10.8 |
Каждый документ в отдельности служит контрольным списком и базой данных. |
| 10.9 |
Важнейшая задача менеджера - обеспечить общее движение в одном направлении. |
| 10.10 |
Главная постоянная задача менеджера - общение, а не принятие решений; документы информируют всю команду о планах и решениях. |
| 10.11 |
Только маленькая часть, возможно, 20 процентов, рабочего времени администратора занята задачами, которые требуют сведений, отсутствующих в его памяти. |
| 10.12 |
По этой причине модная идея "всеохватывающей информационной системы для управления", обеспечивающей поддержку руководителя, основывается на неверной модели поведения руководителя. |
| 11.1 |
Инженеры-химики выяснили, что осуществленный в лаборатории процесс нельзя одним махом перенести в заводские условия, но необходимо построить опытный завод, чтобы получить опыт наращивания количеств веществ и функционирования в незащищенных средах. |
| 11.2 |
Этот промежуточный шаг в равной мере необходим для программных продуктов, но для инженеров-программистов пока не стало обычной практикой проводить полевые испытания опытной системы, прежде чем начинать поставки готового продукта. (Сейчас это уже стало общей практикой благодаря выпуску бета-версий. Это не то же самое, что макет с ограниченной функциональностью, альфа-версию, которую я также пропагандирую.) |
| 11.3 |
Для большинства проектов первую построенную версию едва можно использовать: слишком медленная, слишком большая, слишком сложная в применении, или все это вместе. |
| 11.4 |
Отбросить и перепроектировать можно все сразу, а можно по частям, но все равно это придется сделать. |
| 11.5 |
Поставка первой системы (хлама) клиенту позволяет выиграть время, но происходит это ценой мучений пользователей, отвлечения разработчиков, поддерживающих систему во время перепроектирования и дурной репутации продукта, которую будет трудно победить. |
| 11.6 |
Поэтому планируйте выбросить первую версию - вам все равно придется это сделать. |
| 11.7 |
"Программист поставляет удовлетворение потребности пользователя, а не какой-то осязаемый продукт " (Косгроув). |
| 11.8 |
Как фактические потребности пользователя, так и понимание им своих потребностей меняются во время создания, тестирования и использования программы. |
| 11.9 |
Податливость и неосязаемость программного продукта побуждают его создателей (исключительно) к вечному изменению требований. |
| 11.10 |
Некоторые законные изменения в задачах (и стратегиях разработки) неизбежны, и лучше подготовиться к ним заранее, чем предполагать, что их не будет. |
| 11.11 |
Способы проектирования системы с учетом будущих изменений, особенно структурное программирование с тщательным документированием интерфейсов модулей, хорошо известны, но не всегда применяются. Полезно также, где только можно, использовать технологии табличного управления. (Такая техника благодаря стоимости и размеру памяти в настоящее время применяется все более успешно.) |
| 11.12 |
Для сокращения вносимых при изменениях ошибок следует использовать языки высокого уровня, операции времени компиляции, встраивание ссылок на объявления и технику самодокументирования. |
| 11.13 |
Вносите изменения квантами в хорошо определенные нумерованные версии. (Сейчас это обычная практика.) |
| Планируйте организацию для изменений |
| 11.14 |
"Нежелание программистов документировать проект происходит не столько от лени, сколько от неуверенности, стоит ли связывать себя отстаиванием решений, которые, как знает проектировщик, являются предварительными" (Косгроув). |
| 11.15 |
Создавать организационную структуру с учетом внесения в будущем изменений значительно труднее, чем проектировать систему с учетом будущих изменений. |
| 11.16 |
Руководитель проекта должен стремиться к тому, чтобы его менеджеры и технический персонал были настолько взаимозаменяемы, насколько позволяют их способности. В частности, нужно иметь возможность легко переводить людей с технической на управленческую работу и обратно. |
| 11.17 |
Препятствия к поддержанию эффективной организации с двойной служебной лестницей являются социологическими. Необходимо постоянно бдительно и энергично бороться с ними. |
| 11.18 |
Легко установить соответствующие размеры жалованья для соответствующих ступенек двойной лестницы, но требуется принять меры, чтобы дать им соответствующий престиж: одинаковые офисы, одинаковые службы поддержки, в значительной мере компенсирующие управленческую деятельность. |
| 11.19 |
Организация по типу операционной бригады позволяет активно решать все стороны этой проблемы. Это действительно долгосрочное решение проблемы гибкой организации. |
| Два шага вперед, шаг назад: сопровождение программ |
| 11.20 |
Сопровождение программы в корне отличается от сопровождения аппаратной части; оно состоит, главным образом, из изменений, исправляющих конструктивные дефекты, включение дополнительных функций или адаптацию к изменениям среды использования или конфигурации. |
| 11.21 |
Стоимость пожизненного сопровождения широко используемой программы обычно составляет 40 и более процентов стоимости ее разработки. |
| 11.22 |
Стоимость сопровождения сильно зависит от числа пользователей: чем больше пользователей, тем больше ошибок они находят. |
| 11.23 |
Кэмпбел отмечает интересную кривую взлета и падений обнаруживаемых ошибок в течение жизни продукта |
.
| 11.24 |
Исправление одной ошибки с большой вероятностью (от 20 до 50 процентов) вносит другую. |
| 11.25 |
После каждого исправления нужно прогнать весь набор контрольных примеров, по которым система проверялась раньше, чтобы убедиться, что она каким-то непонятным образом не повредилась. |
| 11.26 |
Методы разработки программ, позволяющие исключить или по крайней мере выявить побочные эффекты, могут резко снизить стоимость сопровождения. |
| 11.27 |
То же можно сказать о методах реализации проектов меньшим числом интерфейсов и меньшим количеством ошибок. |
| Шаг вперед, шаг назад: энтропия системы с течением времени растет |
| 11.28 |
Леман и Белади считают, что общее количество модулей растет линейно с номером версии операционной системы (OS/360), но числи модулей, затронутых изменениями, растет экспоненциально в зависимости от номера версии. |
| 11.29 |
Все исправления имеют тенденцию к разрушению структуры, увеличению энтропии и дезорганизации системы. Даже самое искусное сопровождение программы только отдаляет момент повержения ее в состояние неисправимого хаоса, выходом из которого является повторное проектирование с самого начала. (Иногда реальная необходимость обновления программы, например, с целью повышения производительности, вызывает необходимость изменения внутренних границ структур. Часто исходные границы служат причиной выявляющихся впоследствии недостатков.) |
| 12.1 |
Менеджер проекта должен установить принципы и выделить ресурсы для разработки общеупотребляемых инструментов, в то же время он должен признать необходимость в персонализированных инструментах. |
| 12.2 |
Бригадам, разрабатывающим операционные системы, необходима для отладки собственная целевая машина. Для нее требуется скорее максимум памяти, чем максимум скорости, и системный программист для поддержки стандартного программного обеспечения. |
| 12.3 |
Машина для отладки или ее программное обеспечение должны иметь инструмент для автоматического подсчета и изменения всех видов параметров программы. |
| 12.4 |
Потребность в целевой машине описывается специфической кривой: после низкой активности следует взрывной рост, который потом выравнивается. |
| 12.5 |
Системной отладкой, как астрономией, всегда занимались преимущественно по ночам. |
| 12.6 |
Вопреки теории, выделение времени целевой машины одной бригаде значительными блоками оказалось лучшим вариантом планирования времени, чем чередование использования машины бригадами. |
| 12.7 |
Этот предпочтительный при нехватке компьютеров метод планирования времени пережил 20 лет (с 1975 года) технологических изменений, поскольку является наиболее продуктивным. (И остается им в 1995 году.) |
| 12.8 |
Если целевой компьютер является новым, необходим его логический эмулятор. Его можно получить раньше, и он обеспечивает надежную машину для отладки даже после того, как поставляется настоящая машина. |
| 12.9 |
Главную библиотеку программ нужно разделить на: 1) набор индивидуальных "игровых площадок", 2) подбиблиотеку системной интеграции, проходящую системное тестирование и 3) версию-релиз. Формальное разделение и перемещение обеспечивают контроль. |
| 12.10 |
Инструмент, обеспечивающий наибольшую экономию труда в программном проекте, - это, наверное, система редактирования текстов. |
| 12.11 |
Объемистость системной документации создает новый тип непостижимости (см., например Unix), но это значительно предпочтительнее, чем более распространенный крайний недостаток документации. |
| 12.12 |
Создайте эмулятор производительности снаружи внутрь, сверху вниз. Начните работу с ним как можно раньше. Прислушайтесь к тому, что он вам скажет. |
| Языки высокого уровня |
| 12.13 |
Только лень и инертность препятствуют повсеместному применению языков высокого уровня и интерактивного программирования. (Но сегодня они приняты повсеместно.) |
| 12.14 |
Язык высокого уровня способствует не только увеличению производительности, но и отладке. Меньше ошибок и легче поиск. |
| 12.15 |
Прежние возражения, связанные с функциональностью, размером и скоростью результирующей программы устарели благодаря развитию языков и технологии компиляции. |
| 12.16 |
Сегодня единственный подходящий кандидат для системного программирования - PL/I. (Больше не соответствует действительности.) |
| Интерактивное программирование |
| 12.17 |
В некоторых приложениях пакетные системы никогда не будут вытеснены интерактивными системами. (По-прежнему верно.) |
| 12.18 |
Отладка - это тяжелая и долгая часть системного программирования, и медленная оборачиваемость является проклятием отладки. |
| 12.19 |
Есть свидетельства тому, что интерактивное программирование по крайней мере удваивает скорость системного программирования. |
| 13.1 |
Детальная и старательная проработка архитектуры согласно главам 4, 5 и 6 не только упрощает использование продукта, но также облегчает его разработку и делает менее подверженным ошибкам. |
| 13.2 |
Высоцкий говорит, что "очень многие неудачи связаны именно с теми аспектами, которые были не вполне специфицированы". |
| 13.3 |
Задолго до всякого написания программы спецификация должна быть передана сторонней группе тестирования для тщательного рассмотрения полноты и ясности. Сами разработчики сделать это не могут. |
| 13.4 |
"Нисходящее проектирование Вирта (с пошаговым уточнением) является самой важной новой формализацией программирования за десятилетие (1965-1975)." |
| 13.5 |
Вирт проповедует использование на каждом шаге нотации возможно более высокого порядка. |
| 13.6 |
Хорошее нисходящее проектирование помогает избегать ошибок благодаря четырем обстоятельствам. |
| 13.7 |
Иногда приходится возвращаться назад, отбрасывать самый верхний уровень и начинать все сначала. |
| 13.8 |
Структурное программирование, т.е. разработка программ, управляющие структуры которых состоят только из заданного набора операторов, воздействующих на блоки кода (в противоположность беспорядочным переходам), дает верный способ избежать ошибок и представляет собой правильный способ мышления. |
| 13.9 |
Экспериментальные данные Голда показывают, что во время первого диалога каждого сеанса достигается втрое больший прогресс в интерактивной отладке, чем при последующих диалогах. Все же полезно тщательно спланировать отладку, прежде чем регистрироваться на машине. (Я полагаю, что это полезно до сих пор, в 1995 году.) |
| 13.10 |
Я считаю, что для правильного использования хорошей системы (интерактивной отладки с быстрой реакцией ) на каждые два часа работы за столом должно приходиться два часа работы на машине: один час - на подчистки и документирование после первого сеанса, и один час - на планирование изменений и тестов очередного сеанса. |
| 13.11 |
Системная отладка (в отличие от отладки компонентов) занимает больше времени, чем ожидается. |
| 13.12 |
Трудность системной отладки оправдывает тщательную систематичность и плановость. |
| 13.13 |
Системную отладку нужно начинать, только убедившись в работоспособности компонентов, (в противоположность подходу "свинти и попробуй" и началу системной отладки при известных, но не устраненных ошибках в компонентах). (Это особенно справедливо для бригад.) |
| 13.14 |
Рекомендуется создать большое окружение и много проверочного кода и "лесов" для отладки, возможно, на 50 процентов больше, чем сам отлаживаемый продукт. |
| 13.15 |
Необходимо контролировать изменения и версии, при этом члены команды пусть играют со своими копиями на "площадках для игр". |
| 13.16 |
Во время системного тестирования добавляйте компоненты по одному. |
| 13.17 |
Леман и Белади свидетельствуют, что квант изменений должен быть либобольшим и вноситься редко, либо очень маленьким - и часто. Последний случай более чреват неустойчивостью. (В Microsoft работают маленькими частыми квантами. Разрабатываемая система собирается заново каждые сутки.) |
| 14.1 |
"Как оказывается, что проект запаздывает на один год? ...Сначала он запаздывает на один день." |
| 14.2 |
Отставание, растущее понемногу изо дня в день, труднее распознать, труднее предотвратить, труднее выправить. |
| 14.3 |
Чтобы управлять большим проектом по жесткому графику, надо прежде всего иметь<.I> график, состоящий из вех и соответствующих им дат. |
| 14.4 |
Вехи должны быть конкретными, специфическими, измеримыми событиями, определенными с предельной точностью. |
| 14.5 |
Программист редко лжет относительно движения вехи, если веха очерчена резко, он не может обманывать себя. |
| 14.6 |
Исследования поведения правительственных подрядчиков по проведению оценок в крупных проектах показали, что оценки сроков работы, тщательно пересматриваемые каждые две недели, незначительно меняются по мере приближения начала работ, что во время работ переоценки<.I> уверенно снижаются и что недооценки не меняются, пока до запланированного срока окончания работ не остается около трех недель. |
| 14.7 |
Хроническое отставание от графика убивает моральный дух. (Джин Маккарти из Microsoft говорит: "Если вы пропустили один крайний срок, будьте уверены, что пропустите и второй."2 ) |
| 14.8 |
Для выдающихся команд программистов характерна энергия<.I>, как и для выдающихся бейсбольных команд. |
| 14.9 |
Ничто не заменит график с критическими путями, чтобы определить, какое отставание во что обойдется. |
| 14.10 |
Подготовка диаграммы критических путей есть самая ценная часть ее применения, поскольку определение топологии сети, указание зависимостей в ней и оценивание путей вынуждают осуществить большой объем очень конкретного планирования на самых ранних стадиях проекта. |
| 14.11 |
Первая диаграмма всегда ужасна, и для создания второй приходится проявить много изобретательности. |
| 14.12 |
Диаграмма критических путей дает отпор деморализующей оговорке "другая часть тоже запаздывает". |
| 14.13 |
Каждому начальнику нужны два вида данных: информация о срывах плана, которая требует вмешательства, и картина состояния дел, чтобы быть осведомленным и иметь раннее предупреждение. |
| 14.14 |
Получить правдивую картину состояния дел нелегко, поскольку у подчиненных менеджеров есть основания не делиться своими данными. |
| 14.15 |
Неправильными действиями начальник может обеспечить утаивание всей картины состояния дел; напротив, тщательное рассмотрение отчетов без паники и вмешательства поощряет честный доклад. |
| 14.16 |
Необходимо иметь методологию обзора, с помощью которой подлинное положение вещей становится известным всем игрокам. Главным для этой цели является график с вехами и документ о завершении. |
| 14.17 |
Высоцкий: "Я нашел, что удобно иметь в отчете о состоянии работ две даты - "плановую" (дату начальника) и "оцениваемую" (дату менеджера низшего звена). Менеджер проекта должен осторожно относиться к оцениваемым датам." |
| 14.18 |
Небольшая группа планирования и контроля, дающая отчеты о прохождении вех, неоценима при работе над большим проектом. |
| 15.1 |
Для программного продукта сторона, обращенная к пользователю, - документация - столь же важна, как и сторона, обращенная к машине. |
| 15.2 |
Даже для программ, написанных исключительно для себя, текстуальная документация необходима: память может изменить автору-пользователю. |
| 15.3 |
В целом, преподавателям и менеджерам не удалось воспитать на всю жизнь у программистов уважение к документации, преодолевающее лень и пресс графика работ. |
| 15.4 |
Эта неудача вызвана не столько недостатком старания или красноречия, сколько неспособностью показать, как проводить документирование эффективно и экономично. |
| 15.5 |
Документация часто страдает отсутствием общего обзора. Посмотрите сначала издалека, а потом медленно приближайтесь. |
| 15.6 |
Важная документация пользователя должна быть вчерне написана до разработки программы, поскольку в ней содержатся основные плановые решения. В ней должны быть описаны девять предметов (см. текст главы). |
| 15.7 |
Программу нужно поставлять с несколькими контрольными примерами: с допустимыми входными данными, допустимыми на грани возможностей, и с явно недопустимыми входными данными. |
| 15.8 |
Внутренняя документация программы, предназначенная тому, кто должен ее модифицировать, также должна содержать текстуальный обзор, в котором должны быть описаны пять предметов (см. главу). |
| 15.9 |
Блок-схема чаще всего напрасно включается в документацию. Подробная пошаговая блок-схема устарела благодаря письменным языкам высокого уровня. (Блок-схема - графический язык высокого уровня.) |
| 15.10 |
Редко требуется блок-схема более чем на одну страницу - если она вообще нужна. (Стандарт MILSPEC здесь совершенно не прав.) |
| 15.11 |
Что действительно необходимо - это структурный граф программы без соблюдения стандартов составления блок-схем ANSI. |
| 15.12 |
Чтобы обеспечить обновление документации, важно включить ее в исходный текст программы, а не держать отдельным документом. |
| 15.13 |
Для облегчения труда ведения документации есть три важных правила:
- Как можно больше используйте для документирования обязательные части программы, такие как имена и объявления.
- Используйте свободное пространство и формат, чтобы показать отношения подчиненности, вложенности и улучшить читаемость.
- Вставляйте в программу необходимую текстовую документацию в виде параграфов комментариев, особенно в заголовках модулей.
|
| 15.14 |
В документации, которой будут пользоваться при модификации программы, объясняйте не только "как", но и "почему". Назначение является решающим для понимания. Даже языки высокого уровня совсем не передают значения. |
| 15.15 |
Методы самодокументирующегося программирования наиболее полезны и мощны при использовании языков высокого уровня. |