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

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

15

Программное обеспечение – эволюция или революция?

Как развивается код?

В этой главе:

Как код развивается со временем

Гниение программного обеспечения – как происходит разложение

Как справляться с рисками, связанными со старением кода

Не знаю, будет ли лучше, если все изменится; но чтобы стало лучше, всё должно измениться.

Г. Лихтенберг

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

К сожалению, в действительности все не так. Далеко не так.

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

364m

 

 

 

 

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

 

 

 

 

 

Глава 15. Программное обеспечение – эволюция или революция?Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Программное обеспечение – живой объект. Оно не наделено сознанием или свойствами растений, но у него есть своя жизнь: момент зачатия, неуклонное развитие и окончательное достижение зрелости. Затем его выпускают в большой мир, где оно должно зарабатывать себе на жизнь

Еще несколько метафор для построения программ

Мы уже рассматривали метафору здания и обсуждали, как она применима к процессу построения программного обеспечения (см. раздел «Действительно ли мы собираем программы?» на стр. 240). В этой главе я приведу еще несколько метафор. Они бросают новый взгляд на наши методы программирования:

Выращивание программного продукта

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

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

Эволюция программного продукта

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

Мы намеренно совершаем изменения; программное обес% печение не может развиваться самостоятельно.

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

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

 

 

 

 

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

 

 

 

 

 

365Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

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

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

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

Гниение программного обеспечения

Если ты молод, то растешь. Если ты созрел, то гниешь.

Рэй Крок

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

Существует заблуждение, будто бы программное обеспечение развивает% ся только на начальных стадиях своего существования. Самой длитель% ной всегда оказывается стадия сопровождения1 программного продукта. На нее уходит самая значительная часть всего труда – даже если этот труд не сконцентрирован так компактно, как на этапах начального про% ектирования и разработки. Б. У. Боэм (B.W. Boehm), уважаемый в об% ласти вычислительных наук ученый, подсчитал, что от 40 до 80% сум% марного времени разработки приходится на сопровождение (Boehm 76).

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

1Имеется в виду работа, выполняемая после начальной поставки продукта,

которая не считается основной новой версией.

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

366m

 

 

 

 

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

 

 

 

 

 

Глава 15. Программное обеспечение – эволюция или революция?Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

В конечном итоге, больше кода оказывается написанным после того, как проект был признан завершенным.

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

Модификации должны быть минимальными, чтобы уменьшить их влияние на тщательно отлаженный основной код.

API выпущенных и проданных продуктов уже в работе у клиентов, поэтому их труднее модифицировать.

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

Ограничения могут также носить психологический характер и осно% вываться на предубеждениях (в том числе ошибочных) разработчиков:

Этот код всегда работал так, поэтому мы не можем его изменить.

Пересматривать архитектуру на данной стадии слишком обремени% тельно.

Не стоит тратить время и деньги на правильную модификацию; продукту все равно осталось жить недолго.

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

Есть тонкая граница между сопровождением имеющегося продукта и разработкой очередной его версии. Где она проходит – спорный во% прос. Но в любом случае модифицируется оригинальный базовый код – его автором или кем%то другим. Вот тут и начинается деградация кода. Модифицируется код или нет – все равно плохо; в любом случае код деградирует.

Если вообще не притрагиваться к коду, не делать своевременных ис% правлений и модификаций, программа деградирует. В худшем случае она вообще перестанет работать, если будет заменена ОС или сделанные допущения устареют. Ярким примером служит проблема 2000 года.1 Либо программа морально устареет по мере того, как конкурирующие продукты станут предлагать больше функций и приобретут большую популярность. Нетронутый код медленно деградирует.

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

1Многими старыми программами не предполагалось пользоваться после 2000 года, поэтому программисты не боялись указывать год двумя цифра% ми – 76 вместо 1976. Как только цифры перевалили за 00, все вычисления

с датами пошли наперекосяк.