Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги хакеры / Питер_Гудлиф_Ремесло_программиста_Практика_написания_хорошего_кода.pdf
Скачиваний:
16
Добавлен:
19.04.2024
Размер:
9.23 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

Игрыm

с планами

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

Игры с планами

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

517Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Несколько не связанных между собой оценок времени никому не инте% ресны. Их нужно объединить, создав нечто полезное: план проекта, с помощью которого можно управлять графиком разработки. В соот% ветствии со своими отдельными оценками времени задачи размещают% ся на графике работ и распределяются между разработчиками. Выяв% ляются зависимости между задачами и учитываются в плане (очевид% но, что зависимые задачи нельзя начать ранее, чем будут завершены те, от которых они зависят). Окончательный результат представляет собой диаграмму, в которой по горизонтальной оси отложено время, а задачи размещаются параллельно, примерно как на рис. 21.1 (вари% ант классической диаграммы Ганта).

 

 

Начало

 

 

 

Конец

 

 

проекта

 

 

 

проекта

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Фред

Задача A

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Хильда

 

 

 

 

Задача D

 

 

 

 

 

 

 

 

 

 

 

 

Гертруда

Задача B

 

 

Задача E

 

 

 

 

 

 

 

 

 

Гарольд

 

Задача C

 

 

Задача F

 

Рис. 21.1. Диаграмма Ганта

При составлении плана проекта происходит распределение заданий меж% ду разработчиками и составление графика работ. Но это сделать просто. Важная задача – управление рисками: создание надежного и разумного плана, учитывающего неопределенность и скрытые ловушки.

Надежные планы проектов:

Сокращают критический путь

Это одна цепочка примыкающих вплотную задач, проходящая от начала до конца проекта и показанная темными прямоугольника% ми на приведенной выше диаграмме. Задержка в любой из этих за% дач тормозит все зависящие от нее задачи и отодвигает окончатель% ное завершение проекта.

Критический путь в плане есть всегда – по определению. Вот отчего седеют составители плана проекта! Наша цель – оптимальное вза% имное расположение задач, обеспечивающее кратчайший (или свя% занный с наименьшим риском) критический путь.

Не злоупотребляют параллелизмом

Часто при планировании крупных проектов ошибочно полагают, что чем больше программистов бросить на задачу, тем быстрее она будет решена. Так бывает редко. При управлении большим количе% ством людей возникают существенные дополнительные расходы:

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

518m

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-xcha

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

Глава 21. Какой длины веревочка?Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

больше каналов общения, больше объем координации, больше то% чек возможного срыва. Эта тема обсуждается в классическом труде Брукса «Мифический человеко%месяц». (Brooks 95)

Нельзя чрезмерно распараллеливать план проекта, как не следует распараллеливать отдельных разработчиков. Если поручить одно% му разработчику выполнять два задания одновременно, нельзя ожидать, что это займет у него столько же времени, как при после% довательном решении этих задач. Кажется очевидным, но на прак% тике часто происходит иначе: вам могут предложить осуществлять поддержку старого проекта и одновременно начать работу над но% вым. Значительное время тратится на переключение с одной задачи на другую, что снижает суммарную эффективность. Если делать две вещи одну за другой, вам понадобится меньше времени (хотя это может не соответствовать бизнес%целям организации).

Не слишком длинные

Не очень хорошо, если план проекта слишком длинный. Одна мел% кая проблема на критическом пути – и весь проект оказывается под угрозой.

В такой ситуации выгодно применять итеративную и инкремент% ную разработку (см. раздел «Итеративная и инкрементная разра% ботка» на стр. 545), разбивая крупные графики разработки на более мелкие и менее рискованные итерации, которыми проще управ% лять. Это делает план более динамичным; фактически он воссозда% ется заново в каждый момент поставки. Такой подход является бо% лее безопасным и позволяет выявлять проблемы на ранних стадиях разработки, но он требует большего суммарного объема работы. Многим менеджерам это не нравится – им нравится иллюзия, соз% даваемая схемой «водопада», не допускающей отклонений.

Вхороших планах не просто пригнаны вплотную отдельные оценки.

Вних учитываются реалии программного производства и предусмат% риваются средства снижения рисков. Для этого берутся во внимание следующие факторы:

Отпуска

Продолжительность отпусков, предоставляемых каждому разра% ботчику, известна заранее и должна быть учтена в графике. Необ% ходимо также учесть общественные праздники и рождественские каникулы во всех компаниях. В среднем на одну неделю работы программиста приходится полдня отпуска.

Загрузка

Чтобы быть реалистичным, план должен учитывать обычные отвле% чения (совещания, учебу, болезни и т. д.). Как правило, для каждого разработчика это учитывается в плане в виде загруженности на 80%. Для тех, кто пользуется большим спросом, загруженность оказыва% ется меньше. Нужно честно это учитывать, иначе «популярные»

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

Игрыm

с планами

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

519Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

программисты начинают отставать от графика, несмотря на то, что напряженно работают, и вскоре теряют веру в свои силы.

Непредвиденные обстоятельства

Это крупная проблема. Нужно учесть проблемы, которые едва вид% ны на горизонте, и обеспечить зазор для непредвиденных неприят% ностей, которые могут помешать вам завершить работу в срок. Тут вступает в действие управление рисками.

Риском лучше всего управлять здесь, на уровне проекта, а не в оцен% ках отдельных задач. В плане разработки можно оставить место для потенциальных проблем и принимать обоснованные решения, имея перед глазами процесс разработки в целом. Альтернативный выбор – пессимистические индивидуальные оценки, включенные в общий план, – приводит к завышенной продолжительности.

Возникает главный вопрос: сколько времени зарезервировать на непредвиденные обстоятельства? Можно просто умножить срок на три и назвать это учетом непредвиденных обстоятельств! Хороший путь – присвоить каждой задаче коэффициент надежности и, осно% вываясь на нем, включить в план дополнительные псевдозадачи для наиболее рискованных работ как «аварийный запас». Назна% чить им длительность, пропорциональную продолжительности ис% ходной задачи и коэффициенту надежности.

Интеграция

Задача не кончается с завершением написания кода и тестирова% ния. Оставьте достаточно времени на объединение всех компонент и тестирование системы в целом. Потребуются отладка и решение проблем, которые обнаружатся только при стыковке компонент (например, недостаточная производительность или несоответствие интерфейсов).

Поддержка

Чем дольше работает человек в организации, тем чаще к нему мо% гут обращаться с просьбами поддержать старые проекты, ответить на сообщение клиента об ошибке и т. д. Учтите эти обстоятельства при планировании загрузки программистов, отметив потребность в них других проектов.

Когда ключевых специалистов разрывают на части, проекты начи% нают потихоньку отставать.

Уборка

Выделите в конце своего плана время на приборку. В битве за вы% пуск программного продукта в срок часто срезают углы. Это называ% ют также накопившейся технической задолженностью. Несмотря на все проповеди относительно правильного проектирования и хо% рошей практики кодирования, это неизбежное зло; это вполне праг% матично. Однако нужно выделить время для уборки и приведения кода в опрятное состояние. В противном случае очередной круг раз%

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

520m

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-xcha

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

Глава 21. Какой длины веревочка?Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

работки будет основываться на кривом и неработоспособном коде. Если оставить эту проблему без внимания, растущая куча времен% ных заплаток станет тяжелым грузом для ваших программистов.

Считайте эту работу частью предыдущего задания (хотя она выполня% ется после того, как прошел день выпуска продукта), а не как начало следующего. Отдайте свой долг тому проекту, который его создал.

Не считайте такую приборку необязательной данью; она представ% ляет собой важную часть проекта. В сумасшедшей обстановке про% граммного производства на факультативные задачи, помещенные в конец графика, просто никто не обращает внимания. Тщательно следите за этими задачами.

Составляйте графики работ так, чтобы оставалось время на приведение кода в порядок. Планируйте возврат технической задолженности.

Глубокое изучение составления планов проектов выходит за рамки данной книги; это большая и сложная задача. Но необходимо разби% раться в ее базовых принципах. Нужно уметь разрабатывать програм% мы в соответствии с планом и знать, что кладется в его основу, чтобы хорошо разбираться в том, что от вас требуется.

Существует много моделей планирования – формальных способов де% лать основанные на фактах догадки. PERT (Program Evaluation and Review Technique система планирования и руководства разработ# ками) – это классический метод планирования, разработанный в 1950%х годах в ВМФ США. Он напоминает мой расчет времени прибытия при поездке в Бристоль. Для каждой задачи делается три оценки в зависи% мости от вероятности поставки в срок: лучший сценарий, худший и наиболее вероятный. Это связывается с процедурой планирования, в которой определяется критический путь и вычисляется время завер% шения проекта в лучшем и худшем случаях. Чем больше разрыв меж% ду двумя оценками для задачи, тем больший риск с ней ассоциирует% ся. В таком случае она может потребовать более тщательного руково% дства или выделения для своего решения более опытного сотрудника.

Конструктивная модель затрат Боэма (COCOMO – Constructive Cost Model) появилась в 1981 году и представляет собой модель оценки, ос% нованную на анализе реальных программных проектов. На ее базе по% явилась модель COCOMO II, более точно отражающая природу совре% менных программных проектов. (Boehm 81) Проекты в контролируе# мых средах (Projects in Controlled Environments, PRINCE) – это пример классической британской бюрократии, воплощенной в виде управле% ния проектом; если бы можно было потребовать стояния в очередях, это обязательно было бы сделано!1 Эта модель охватывает весь жизненный

1Стояние в очередях – любимое времяпрепровождение британцев наряду

с чаепитием и игрой в крикет.