Обязательное вступление . . . . . . . . . . . . . . . . . . . . . . . . . 13
От издательства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Глава 1. Профессионализм . . . . . . . . . . . . . . . . . . . . . . . . 19
Оборотная сторона профессионализма . . . . . . . . . . . . . . . . . . . . . . . 20
Ответственность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Первое правило: не навреди . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Не навреди функциональности . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Контроль качества не должен ничего обнаружить . . . . . . . . . 24
Вы должны быть уверены в том, что ваш код работает . . . . . 25
Автоматизированный контроль качества . . . . . . . . . . . . . . . . . . 26
Не навреди структуре . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Трудовая этика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Знай свою область . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Непрерывное обучение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Тренировка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Совместная работа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Наставничество . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Знание предметной области . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Понимание интересов работодателя/заказчика . . . . . . . . . . . . 33
Скромность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Глава 2. Как сказать "нет" . . . . . . . . . . . . . . . . . . . . . . . . 35
Антагонистические роли . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Как насчет "почему"? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Высокие ставки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Умение работать в коллективе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Не пытайтесь . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Пассивная агрессивность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Цена согласия . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
О невозможности хорошего кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Глава 3. Как сказать "да" . . . . . . . . . . . . . . . . . . . . . . . . . 56
Язык обещаний . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Признаки пустых обещаний . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Признаки серьезных обещаний . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Выполнение обещания зависит от другого человека X. . . . . . 60
Вы не уверены в том, что обещание можно выполнить . . . . . 61
Вы не справились . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Учимся говорить "да" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Обратная сторона "попытки" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Дисциплинированное принятие обязательств . . . . . . . . . . . . . 64
Итоги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Глава 4. Написание кода . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Готовность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Ночное программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
Программирование в расстроенных чувствах . . . . . . . . . . . . . . 70
Зона потока . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Музыка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Помехи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Творческий кризис . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Творческий ввод . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Отладка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Время отладки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Выбор темпа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Умейте остановиться . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
По дороге домой . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Душ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Отставание от графика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Надежда . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Спешка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Сверхурочные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Ложная готовность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Определение "готовности" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Помощь . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Как помогать другим . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Как принимать помощь . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Обучение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Глава 5. Разработка через тестирование . . . . . . . . . . . . 87
Вердикт вынесен . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Три закона TDD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Длинный перечень преимуществ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Уверенность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Снижение плотности дефектов . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Смелость . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Документация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Архитектура . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Выбор профессионалов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Чем TDD не является . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Глава 6. Тренировка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Азы тренировки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Двадцать два нуля . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Длительность рабочего цикла . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Додзё программирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Ката . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Вадза . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Рандори . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Расширение кругозора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Проекты с открытым кодом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Этика тренировки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Глава 7. Приемочное тестирование . . . . . . . . . . . . . . . . 105
Передача требований . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Преждевременная точность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Принцип неопределенности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Стремление к точности оценки . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Поздняя неоднозначность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Приемочные тесты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Что такое "выполнено"? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Взаимодействие сторон . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Автоматизация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Дополнительная работа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Кто и когда пишет приемочные тесты? . . . . . . . . . . . . . . . . . . . 115
Роль разработчика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Обсуждение тестов и пассивно-агрессивная позиция . . . . . 117
Приемочные тесты и модульные тесты . . . . . . . . . . . . . . . . . . . 119
Графические интерфейсы и другие сложности . . . . . . . . . . . . 120
Выбор интерфейса для тестирования . . . . . . . . . . . . . . . . . . . . 121
Непрерывная интеграция . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Стоп-сигнал . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Глава 8. Стратегии тестирования . . . . . . . . . . . . . . . . . . 124
Контроль качества не должен находить дефекты . . . . . . . . . . . . 125
Служба контроля качества - часть команды . . . . . . . . . . . . . 125
Пирамида автоматизации тестирования . . . . . . . . . . . . . . . . . . . . . 126
Модульные тесты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Компонентные тесты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Интеграционные тесты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Системные тесты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Исследовательские тесты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Глава 9. Планирование . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Встречи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Отказ от участия . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Уход со встречи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Повестка дня и цель . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Пятиминутка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Встречи планирования итераций . . . . . . . . . . . . . . . . . . . . . . . . . 136
Ретроспективные встречи по итерациям
и демонстрации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Споры и разногласия . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Мана концентрации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Перезарядка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Физические упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Ввод и вывод . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Помидоры и распределение времени . . . . . . . . . . . . . . . . . . . . . 140
Уклонение от работы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Инверсия приоритетов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Тупики . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Грязь, болота и трясины . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Глава 10. Оценки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Что такое "оценка"? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Обязательства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Оценка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Подразумеваемые обязательства . . . . . . . . . . . . . . . . . . . . . . . . . 150
PERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Оценка времени выполнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Широкополосный дельфийский метод . . . . . . . . . . . . . . . . . . . 154
Метод быстрого голосования . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Покер планирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Аффинная оценка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Анализ по трем переменным . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Закон больших чисел . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Глава 11. Под давлением . . . . . . . . . . . . . . . . . . . . . . . . . 159
Как избежать давления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Обязательства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Как сохранить чистоту . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Дисциплина в кризисных ситуациях . . . . . . . . . . . . . . . . . . . . . 163
Как вести себя в тяжелой ситуации . . . . . . . . . . . . . . . . . . . . . . . . . 163
Без паники . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
Взаимодействие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Доверяйте своим методам . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Помощь . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Глава 12. Сотрудничество . . . . . . . . . . . . . . . . . . . . . . . . 166
Программисты и люди . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Программисты и работодатели . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Программисты и программисты . . . . . . . . . . . . . . . . . . . . . . . . . 171
Принадлежность кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Коллективная принадлежность кода . . . . . . . . . . . . . . . . . . . . . 172
Парное программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Как работать мозжечком . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Глава 13. Группы и проекты . . . . . . . . . . . . . . . . . . . . . . 175
Формирование группы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
"Притертая" группа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Созревание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Что сначала - группа или проект? . . . . . . . . . . . . . . . . . . . . . . . 177
Но как управлять такой группой? . . . . . . . . . . . . . . . . . . . . . . . . 178
Дилемма владельца проекта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Глава 14. Наставники, ученики и мастерство . . . . . . . . 180
Диплом для неподготовленных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Обучение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Digi-comp I, мой первый компьютер . . . . . . . . . . . . . . . . . . . . . . 182
ECP-18 в средней школе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Нетрадиционное обучение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Горький опыт . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Ученичество . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Период ученичества . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Мастер . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Ремесленник . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Ученики/интерны . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Реальность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Профессионализм . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Как убедить людей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Приложение. Инструментарий . . . . . . . . . . . . . . . . . . . . 193
Инструменты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Управление исходным кодом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
"Корпоративные" системы управления исходным
кодом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Пессимистическая и оптимистическая блокировка . . . . . . . 196
CVS / SVN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
IDE/редактор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Непрерывная сборка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Инструменты модульного тестирования . . . . . . . . . . . . . . . . . . . . 204
Инструменты компонентного тестирования . . . . . . . . . . . . . . . . . 205
Определение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
FitNesse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Другие инструменты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Инструменты интеграционного тестирования . . . . . . . . . . . . . . . 207
UML/MDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Детализация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Без изменений и надежд . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Алфавитный указатель. . . . . . . . . . . . . . . . . . . . . . . . . . . 211