Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги хакеры / Питер_Гудлиф_Ремесло_программиста_Практика_написания_хорошего_кода.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

17. Вместе мы – сила

 

 

 

 

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

 

 

 

 

 

659Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

ся в исходном коде и уметь проводить модификации, которые хоро% шо уживаются с имеющимся кодом.

Сопровождение

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

4.Если программирование – это искусство, то каким должно быть соот ношение обдумывания и планирования, с одной стороны, и интуиции и инстинктивности – с другой? Чем руководствуетесь вы – инстинк том или планом?

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

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

Глава 17. Вместе мы – сила

Вопросы для размышления

1.Почему программы пишут командами? В чем преимущества относи тельно самостоятельной разработки?

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

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

Существует еще личная мотивация: технари любят работать над кру% тыми проектами. В составе команды вы можете работать над система%

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

660m

 

 

 

 

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

 

 

 

 

 

Ответы и обсуждениеClick

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

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

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

2.Опишите симптомы хорошей и плохой групповой работы. Каковы не обходимые условия хорошей работы и как проявляется плохая груп повая работа?

Для эффективной работы команды должны быть обеспечены следую% щие условия:

Правильный подбор людей, имеющих все необходимые техниче% ские навыки.

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

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

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

Мотивация (финансовая или эмоциональная).

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

Хорошее администрирование.

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

Четкая и всеми понимаемая технологическая процедура разработ% ки, которой следуют все члены команды.

Поддержка со стороны компании, а не препятствия и бюрократизм.

С другой стороны, есть надежные индикаторы того, что команда не мо% жет работать эффективно. В этом списке есть как внутренние, так и внешние факторы:

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

Главаm

17. Вместе мы – сила

 

 

 

 

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

 

 

 

 

 

661Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Нереалистичный график работы и срок окончания, устанавливае% мый до того, как команда может оценить объем работы.

Неясные задачи проекта и отсутствие технических требований к про% екту.

Нарушение коммуникативных процессов.

Плохие или неподготовленные руководители команд.

Плохо определенные роли и ответственность участников – кто и за что отвечает?

Неправильное личное отношение к работе и личные цели.

Некомпетентность членов команды.

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

Оценка разработчиков по критериям, не соответствующим задачам команды.

Большая текучесть кадров.

Отсутствие изменений в процедуре руководства.

Отсутствие обучения и наставничества.

3.Сравните групповую разработку программ и метафору строительства (см. раздел «Действительно ли мы собираем программы?» на стр. 240). Позволяет ли она лучше понять групповую работу?

Есть несколько метафор для описания нашей работы (например, спор# тивная команда, или хоровое общество Демарко, или фабрика, о ко% торой мы шутим здесь) (DeMarco 99). Проблема любой метафоры в том, что она справедлива лишь отчасти. У программирования есть свои задачи и проблемы. Химическая технология отличается от граж% данского строительства, а то отличается от съемки фильма, а съемка отличается от написания программ.

Метафора стройки полезна, хотя и не идеальна. В конце концов, мы сооружаем программу в соответствии с планом, из отдельных блоков (одни из которых мы изготавливаем сами, а другие покупаем или до% стаем). Вот полезные параллели:

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

У бригады есть задача: она должна завершить строительство в соот% ветствии с назначенными сроками и выделенным бюджетом.

Кто%то является заказчиком работы, имея цель: это конечная цель работы.

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

рана и пр. Каждый вносит свой важный вклад.

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

662m

 

 

 

 

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

 

 

 

 

 

Ответы и обсуждениеClick

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Есть ответственные члены команды: прораб управляет людьми.

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

4.Какие факторы – внешние или внутренние – больше всего угрожают эффективности команды разработчиков?

Те и другие угрожают сорвать вашу работу. Внутренние факторы та% ковы:

Неэффективные члены команды

Конфликты

Беспорядок

Критические ошибки, выявленные на поздних стадиях

Неточные планы

Они соединяются с такими внешними факторами, как:

Нечеткие или меняющиеся технические требования

Нереалистичные сроки

Плохое администрирование

Корпоративный бюрократизм

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

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

5. Как размер команды влияет на ее динамику?

Чем больше в команде людей, тем больше она требует:

Затрат на координацию

Затрат на коммуникации (с новыми людьми появляются и новые пу% ти коммуникаций, число которых увеличивается экспоненциально)

Затрат на кооперацию

Зависимости от других (прямой и косвенной)

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

Главаm

17. Вместе мы – сила

 

 

 

 

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

 

 

 

 

 

663Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

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

По мере роста команды растет вероятность, что отдельные программи% сты начнут работать спустя рукава, поскольку на общем фоне это бу% дет незаметно. В «Мифическом человеко%месяце» Брукса показывает% ся, что подключение к проекту новых работников необязательно при% водит к его ускоренному завершению (Brooks 95).

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

Вцелом, чем меньше команда разработчиков, тем лучше; но она долж% на быть достаточно велика, чтобы суметь выполнить задачу.

6.Как защитить команду от проблем, создаваемых неопытными чле нами?

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

Есть несколько приемов, делающих работу неопытных кодировщиков менее рискованной:

Будьте разумны и не ждите от них чудес. Давайте стажерам посиль% ные задания.

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

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

Не применяйте новейшие технологии и приемы.

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

Учите их.

Рецензируйте их код.

Выберите им наставников.

Программируйте с ними в парах.