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

This document was uploaded by one of our users. The uploader already confirmed that they had the permission to publish it. If you are author/publisher or own the copyright of this documents, please report to us by using this DMCA report form.

Simply click on the Download Book button.

Yes, Book downloads on Ebookily are 100% Free.

Sometimes the book is free on Amazon As well, so go ahead and hit "Search on Amazon"

Ничто не сравнится по ценности с советами настоящего программиста-профессионала. Книга Питера Гудлифа "Ремесло программиста" написана ясно, практично и занимательно. Она поможет вам перейти на более высокий уровень мастерства программирования и покажет, как писать код, который больше чем "просто работает". Да, вы умеете писать работающий код, но как написать понятный код? Как добиться его надежности и отсутствия ошибок? Смогут ли другие программисты выяснить логику и цель вашего кода? Выдающиеся программисты не просто обладают техническими знаниями - у них есть правильный подход и отношение к программированию. Перед вами руководство по выживанию в условиях промышленного производства ПО. Эта книга посвящена тому, чему вас никто не учил: как правильно программировать в реальной жизни. Здесь вы найдете не связанные с конкретными языками рекомендации, полезные всем разработчикам и касающиеся таких проблем, как стиль представления, выбор имен переменных, обработка ошибок, безопасность, эффективность групповой работы, технологии разработки и составление документации. Читатель должен обладать опытом программирования, ибо книга не учит программированию - она учит правильно программировать. Издание будет полезно и студентам старших курсов, знакомым с принципами программирования --- Вы умеете писать код, который работает, но как нужно писать код, чтобы его было легко понять? И как добиться его надежности и отсутствия ошибок? Если ваш труд станут читать другие программисты, смогут ли они выяснить логику и цель кода? Выдающиеся программисты не просто обладают техническими знаниями: у них еще есть правильный подход и отношение к программированию. Если вы хотите стать настоящим профессионалом в программировании или повысить свой нынешний уровень мастерства, эта книга покажет вам, как писать код, который больше чем “просто работает”. Здесь вы найдете не связанные с конкретными языками рекомендации, полезные всем разработчикам и касающиеся таких проблем, как стиль представления, выбор имен переменных, обработка ошибок и безопасность. Рассматриваются и более широкие практические темы, такие как эффективность групповой работы, технологии разработки и составление документации. В конце каждой главы есть раздел контрольных вопросов, заставляющий повторить основные идеи и выступить в качестве эксперта, что делает книгу особенно ценным пособием для молодых программистов, желающих стать профессионалами и эффективно трудиться в команде. Это руководство по выживанию в условиях промышленного производства программного обеспечения научит тому, как: - Писать хороший код, когда условия тому не благоприятствуют - Избегать катастроф и отвлечений во время работы - Точно оценить свои возможности и выбрать пути совершенствования - Занять продуктивную позицию и следовать лучшим примерам Ничто не сравнится по ценности с советами настоящего программиста-профессионала. Эта книга написана ясно, практично и занимательно. Она поможет вам перейти на более высокий уровень в мастерстве программирования и вашей личной карьере. --- Отзывы на книгу «Ремесло программиста» «Овладеть ремеслом – это не только освоить приемы и инструменты; здесь нужны позиция и мастерство. Те программисты, которые неравнодушны к своему делу, именно это и узнают из книги. При содействии большого числа обезьянок эта книга приглашает читателя задуматься над тем, чем они занимаются». Кевлин Хенни (Kevlin Henney), независимый консультант «Легко читается, занимательно, даже забавно… Книга полна мудрости, накопленной за годы реальной работы, мучений и побед в сфере программных разработок… Жаль, что у меня не было такой книги, когда я начинал работать программистом». Стив Лав (Steve Love), старший разработчик «Эта книга – кладезь информации, необходимой каждому профессиональному разработчику программного обеспечения». Тим Пенхи (Tim Penhey), редактор C VU «Здравость суждений приходит с опытом. А опыт – вы получаете его в результате своих «нездравых» суждений! Здесь у вас есть возможность поучиться на чужом, дорого доставшемся опыте, с большей пользой и меньшими муками». Луи Гольдтвейт (Lois Goldthwaite), член комитетов по стандартизации C++ и POSIX BSI «Именно та книга, которая нужна необстрелянным новобранцам. Рассказывает всю правду, легко читается и охватывает широкий круг тем, которые должен знать новичок». Джон Джеггер (Jon Jagger), наставник, консультант, преподаватель, программист «Уникальное и практическое руководство для становления профессионального программиста в современных условиях». Эндрю Берроуз (Andrew Burrows), разработчик ПО «Пит обладает редким талантом. Он может не только определить технику, которой пользуются лучшие профессиональные разработчики программ (часто не догадываясь об этом), но и описать ее четким и сжатым образом». Грег Лоу (Greg Law), CEO, UNDO Ltd. «Жаль, что этой книги не существовало в начале моей карьеры, когда учили меня. Но хотя бы теперь я могу воспользоваться ею, когда учу других». Доктор Эндрю Беннет (Andrew Bennett), старший программист, B.ENG., Ph.D., MIET, MIEEE «Те, кому посчастливилось присутствовать на лекциях Пита Гудлифа, сразу узнают его манеру рассказывать о предмете понятно и с юмором. В учебной среде это оборачивается направленным структурированным преподаванием, которое позволяет учиться и развиваться как новичку, так и опытному профессионалу». Роберт Д. Шофилд (Robert D. Schofield), M.SC., основатель MIET, SCIENTIFIC SOFTWARE SERVICES Ltd. «Пит хочет, чтобы программисты писали не просто код, а хороший код, пользуясь правильными инструментами и методами. Книга исследует широкий круг проблем программирования и излагает нормы и принципы, с которыми должен быть знаком каждый разработчик, которому небезразлично его дело». Крис Рид (Chris Reed), программист «Увлеченность Пита Гудлифа идеей повышения профессионализма в области разработки ПО давно известна. Обладая солидными знаниями вкупе с даром занимательно и понятно излагать их, Пит проявил себя как прекрасный наставник и для новичков, и для опытных разработчиков». Роб Войси (Rob Voisey), технический директор, AKAI DIGITAL Ltd. «Мне больше всего понравились обезьянки». Алиса Гудлиф, 4 1/2 года

Author(s): Гудлиф П. (Goodliffe P.)
Series: Профессионально
Publisher: Символ-Плюс
Year: 2009

Language: Russian
Pages: 699

Об авторе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Благодарности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Предисловие. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

I. Перед лицом кода. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

1. Держим оборону. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
На пути к хорошему коду . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Готовьтесь к худшему. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Что такое защитное программирование? . . . . . . . . . . . . . . . . . . . . . . . . . 32
Этот страшный, ужасный мир . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Технологии защитного программирования . . . . . . . . . . . . . . . . . . . . . . . 36
Ограничения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

2. Тонкий расчет. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Да в чем проблема? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Знайте своих клиентов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Что такое хорошее представление? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Размещение скобок. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Единственно верный стиль . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Внутрифирменные стили (и когда их придерживаться) . . . . . . . . . . . . 63
Установка стандарта. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Религиозные войны? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

3. Что в имени тебе моем?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Зачем нужны хорошие имена? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Каким объектам мы даем имена?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Игра в названия. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Технические подробности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Роза пахнет розой . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

4. Литературоведение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Самодокументируемый код. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Техника написания самодокументируемого кода . . . . . . . . . . . . . . . . . . 98
Практические методологии самодокументирования . . . . . . . . . . . . . . 103
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

5. Заметки на полях . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Что есть комментарий в коде? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Как выглядят комментарии? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Сколько комментариев требуется? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Что помещать в комментарии? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
На практике . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Замечание об эстетичности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Работа с комментариями . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
6. Людям свойственно ошибаться . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Откуда что берется . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Механизмы сообщения об ошибках . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Обнаружение ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Обработка ошибок. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Подымаем скандал . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Управление ошибками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156

II. Тайная жизнь кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

7. Инструментарий программиста . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Что такое инструмент программирования? . . . . . . . . . . . . . . . . . . . . . . 160
А зачем они нужны – инструменты? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Электроинструменты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Какой инструмент необходим? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180

8. Время испытаний. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Проверка на подлинность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Кто, что, когда, зачем?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Тестировать легко… . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Типы тестирования. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Выбор контрольных примеров для блочного тестирования . . . . . . . . 200
Архитектура и тестирование. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Руками не трогать! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Анатомия провала. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Справлюсь ли я сам?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209

9. Поиск ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Реальные факты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Природа этого зверя . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Борьба с вредителями. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Охота за ошибками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Как исправлять ошибки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Профилактика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Спрей от ос, репеллент для мух, липучки… . . . . . . . . . . . . . . . . . . . . . . 231
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235

10. Код, который построил Джек . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Языковые барьеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Делаем слона из мухи. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
Выполнение сборки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
Что должна уметь хорошая система сборки? . . . . . . . . . . . . . . . . . . . . . 249
Механика сборки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Отпусти меня… . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Мастер на все руки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264

11. Жажда скорости . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Что такое оптимизация? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
От чего страдает оптимальность кода? . . . . . . . . . . . . . . . . . . . . . . . . . . 270
Доводы против оптимизации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Нужна ли оптимизация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
Технические подробности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Методы оптимизации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
Как писать эффективный код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292

12. Комплекс незащищенности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Риски. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Наши оппоненты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Оправдания, оправдания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Ощущение незащищенности. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Дела защитные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312

III. Проектирование кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315

13. Важность проектирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
Программирование как конструкторская работа . . . . . . . . . . . . . . . . . 318
Что нужно проектировать? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
Из%за чего весь этот шум? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Хороший проект программного продукта . . . . . . . . . . . . . . . . . . . . . . . 321
Как проектировать код. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339

14. Программная архитектура . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
Что такое программная архитектура?. . . . . . . . . . . . . . . . . . . . . . . . . . . 343
Какими качествами должна обладать архитектура? . . . . . . . . . . . . . . 350
Архитектурные стили . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360

15. Программное обеспечение – эволюция или революция?. . . . . . 363
Гниение программного обеспечения . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Тревожные симптомы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
Как развивается код? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
Вера в невозможное . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
Как с этим бороться? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378

IV. Стадо программистов? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381

16. Кодеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Мартышкин труд. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384
Идеальный программист . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
И что из этого следует?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
Для глупцов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
План действий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402

17. Вместе мы – сила. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
Команды – общий взгляд. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
Организация команды . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
Инструменты для групповой работы . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
Болезни, которым подвержены команды . . . . . . . . . . . . . . . . . . . . . . . . 413
Личное мастерство и качества, необходимые
для работы в команде . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
Принципы групповой работы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
Жизненный цикл команды . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
План действий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444

18. Защита исходного кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Наши обязанности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
Управление версиями исходного кода. . . . . . . . . . . . . . . . . . . . . . . . . . . 449
Управление конфигурацией . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
Резервное копирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
Выпуск исходного кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
Где я оставлю свой код… . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463

V. Часть процесса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465

19. Спецификации. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
Что же это такое, конкретно? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Типы спецификаций. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
Что должны содержать спецификации? . . . . . . . . . . . . . . . . . . . . . . . . . 478
Процесс составления спецификаций . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
Почему мы не пишем спецификации? . . . . . . . . . . . . . . . . . . . . . . . . . . 484
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487

20. Рецензия на отстрел. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
Что такое «рецензирование кода»? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
Когда проводить рецензирование?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
Проведение рецензирования кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
Пересмотрите свое отношение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
Идеальный код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
За пределами рецензирования кода. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502
Контрольный список . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504

21. Какой длины веревочка? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507
Выстрел в темноте. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508
Почему трудно делать оценки?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
Под давлением . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512
Практические способы оценки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513
Игры с планами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Не отставай! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525

VI. Вид сверху . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527

22. Рецепт программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
Стили программирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
Рецепты: как и что . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
Процессы разработки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
Спасибо, хватит! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549
Выбор процесса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552

23. За гранью возможного . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
Программирование приложений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
Программирование игр . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560
Системное программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561
Встроенное программное обеспечение. . . . . . . . . . . . . . . . . . . . . . . . . . . 563
Программирование распределенных систем . . . . . . . . . . . . . . . . . . . . . 566
Программирование веб%приложений. . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
Программирование масштаба предприятия. . . . . . . . . . . . . . . . . . . . . . 571
Численное программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572
И что дальше? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576

24. Что дальше? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577
Но что же дальше? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578

Ответы и обсуждение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
Глава 1. Держим оборону. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
Глава 2. Тонкий расчет. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
Глава 3. Что в имени тебе моем?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594
Глава 4. Литературоведение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
Глава 5. Заметки на полях. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
Глава 6. Людям свойственно ошибаться . . . . . . . . . . . . . . . . . . . . . . . . . 607
Глава 7. Инструментарий программиста . . . . . . . . . . . . . . . . . . . . . . . . 612
Глава 8. Время испытаний . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
Глава 9. Поиск ошибок. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
Глава 10. Код, который построил Джек . . . . . . . . . . . . . . . . . . . . . . . . . 624
Глава 11. Жажда скорости . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
Глава 12. Комплекс незащищенности . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
Глава 13. Важность проектирования. . . . . . . . . . . . . . . . . . . . . . . . . . . . 643
Глава 14. Программная архитектура . . . . . . . . . . . . . . . . . . . . . . . . . . . 646
Глава 15. Программное обеспечение – эволюция или революция? . . 652
Глава 16. Кодеры. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
Глава 17. Вместе мы – сила . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659
Глава 18. Защита исходного кода. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Глава 19. Спецификации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671
Глава 20. Рецензия на отстрел . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
Глава 21. Какой длины веревочка? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678
Глава 22. Рецепт программы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
Глава 23. За гранью возможного . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685

Библиография . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688
Алфавитный указатель . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693