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

 

 

 

 

 

249Click

 

 

 

 

 

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

 

 

 

250m

 

 

 

 

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

 

 

 

 

 

Глава 10. Код, который построил ДжекClick

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

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

Единообразие

Важно, чтобы все пользовались одной и той же системой сборки. В про% тивном случае вы будете собирать разные пакеты. С виду разные меха% низмы сборки могут показаться эквивалентными (Я работаю в своей IDE, а он пользуется make#файлами), но в таком случае затрудняется сопровождение и возникает опасность ошибок. Могут незаметно вкра% сться мелкие различия, например разные опции компиляторов, и ис% полняемые модули не будут одинаковыми.

Это согласуется с требованием хранить систему сборки рядом с дере% вом исходного кода. Если система сборки физически становится ча% стью кода, то ее невозможно обойти или избежать.

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

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

Повторяемость и надежность

Сборка должна быть детерминированной и надежной. Набор исход% ных файлов должен легко определяться перед сборкой. Две сборки, проведенные с одним и тем же набором файлов, должны дать совер% шенно одинаковые исполняемые модули – сборка должна быть повто# ряемой.

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

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

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

1Я испытываю органическое недоверие ко всем средствам, более сложным, чем GNU Make, но это может характеризовать скорее меня, чем эти слож%

ные средства. Мне вполне достаточно того, что дает GNU Make!

 

 

 

 

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

 

 

 

 

 

251Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

не сможете воспроизвести аварийную ситуацию, а тем более исправить ошибку.

Вы должны быть в состоянии достать дерево исходных файлов трехлетней давности и правильно собрать его заново.

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

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

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

Атомарность

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

Правильная сборка выглядит как одна операция. Достаточно нажать кноп& ку или набрать одну команду.

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

1.Получение чистого исходного кода.

2.Сборка кода.

3.Создание дистрибутива из результатов.

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

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

252m

 

 

 

 

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

 

 

 

 

 

Глава 10. Код, который построил ДжекClick

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Рассказы бывалого человека

Повторяемость сборки имеет важное значение; вы должны быть в состоянии воссоздать любую выпущенную версию вашего про% дукта. Иначе у вас могут возникнуть неприятности. Мне дове% лось работать в компании, где возникла именно такая проблема.

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

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

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

Борьба с ошибками

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

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

При ошибке во время сборки система должна удалить все незавер% шенные объекты. Иначе при следующем запуске сборки она решит,

что эти файлы целые, и возьмет их в работу. В результате потом мо%