Book: 97 этюдов для программистов



97 этюдов для программистов

97 этюдов для программистов

97 programmers.indd 1

15.02.2012 13:56:36

По договору между издательством «Символ-Плюс» и Интернет-магазином

«Books.Ru – Книги России» единственный легальный способ получения дан-

ного файла с книгой ISBN 978-5-93286-198-1, название «97 этюдов для про-

граммистов» – покупка в Интернет-магазине «Books.Ru – Книги России».

Если Вы получили данный файл каким-либо другим образом, Вы нарушили

международное законодательство и законодательство Российской Федера-

ции об охране авторского права. Вам необходимо удалить данный файл, а

также сообщить издательству «Символ-Плюс» (piracy@symbol.ru), где имен-

но Вы получили данный файл.

16 лет вместе

с профессионалами

с 1996 года

всегда к слову

97 Things Every

Programmer Should Know

Collective Wisdom from the Experts

Pete Goodliffe, Robert Martin,

Diomidis Spinellis, Kevlin Henney and others

Edited by Kevlin Henney

97 этюдов

для программистов

Опыт ведущих экспертов

Пит Гудлиф, Роберт Мартин,

Диомидис Спинеллис, Кевлин Хенни и др.

под редакцией Кевлина Хенни

Санкт-Петербург – Москва

2012

Серия «Профессионально»

Пит Гудлиф, Роберт Мартин,

Диомидис Спинеллис, Кевлин Хенни и др.

97 этюдов для программистов

Опыт ведущих экспертов

Перевод С. Маккавеева

Главный редактор

А. Галунов

Зав. редакцией

Н. Макарова

Науч. редактор

А. Долгушин

Редактор

М. Зислис

Корректор

О. Макарова

Верстка

Д. Орлова

Гудлиф П., Мартин Р., Спинеллис Д., Хенни К. и др.

97 этюдов для программистов. Опыт ведущих экспертов. – Пер. с англ. – СПб.:

Сим вол-Плюс, 2012. – 256 с., ил.

ISBN 978-5-93286-198-1

Приобщитесь к мудрости экспертов и запомните то, что должен знать каждый

про граммист, с каким бы языком и на какой платформе он ни работал. 97 кратких

и очень полезных советов повысят ваш профессионализм посредством новых под-

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

чен ных для оттачивания мастерства.

Авторы этой книги, очень опытные и признанные в отрасли специалисты, пере да-

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

Ста тьи касаются разных тем: от рекомендаций по написанию кода до культуры,

от выбора алгоритмов до гибкого программирования, от приемов реализации до

про фессионализма, от стиля до сущности. Новички смогут познакомиться с фун-

даментальными положениями, а для профессионалов сборник сможет стать от-

прав ной точкой для обсуждений.

ISBN 978-5-93286-198-1

ISBN 978-0-596-80948-5 (англ)

© Издательство Символ-Плюс, 2012

Authorized Russian translation of the English edition of 97 Things Every Programmer

Should Know ISBN 978-0-596-80948-5 © 2010 O’Reilly Media Inc. This trans lation is pub-

lished and sold by permission of O’Reilly Media Inc., the owner of all rights to publish and

sell the same.

Все права на данное издание защищены Законодательством РФ, включая право на полное или час-

тичное воспроизведение в любой форме. Все товарные знаки или зарегистрированные товарные зна ки,

упоминаемые в настоящем издании, являются собственностью соответствующих фирм.

Издательство «Символ-Плюс». 199034, Санкт-Петербург, 16 линия, 7,

тел. (812) 380-5007, www.symbol.ru. Лицензия ЛП N 000054 от 25.12.98.

Подписано в печать 29.02.2012. Формат 70×90 1/16.

Печать офсетная. Объем 16 печ. л.

Отсутствующим друзьям посвящается

Оглавление

Оглавление

Статьи по категориям . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

Предисловие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

Будьте благоразумны . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

Себ Роуз

Применяйте принципы функционального программирования . . . . . . . . . . . . . . . . . 24

Эдвард Гарсон

Выясните, как поступит пользователь (и вы – не пользователь) . . . . . . . . . . . . . . . . 26

Жиль Колборн

Автоматизируйте свой стандарт форматирования кода . . . . . . . . . . . . . . . . . . . . . . . 28

Филип ван Лаенен

Красота – следствие простоты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

Йорн Ольмхейм

Прежде чем приступать к рефакторингу . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

Раджит Аттапатту

Осторожно: общий код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

Уди Дахан

Правило бойскаута . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

Роберт Мартин, известный также как «Дядюшка Боб»

Прежде чем пенять на других, проверь собственный код . . . . . . . . . . . . . . . . . . . . . . 38

Аллан Келли

Тщательно выбирайте инструменты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

Джованни Аспрони

Оглавление

7

Пишите код

на языке предметной области . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

Дэн Норт

Код – это проектирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

Райан Браш

Важность форматирования кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

Стив Фримен

Рецензирование кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

Маттиас Карлссон

Пиши код с умом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

Йехиль Кимхи

Комментарий о комментариях . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

Кэл Эванс

Комментируйте только то, о чем не скажет код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

Кевлин Хенни

Непрерывное обучение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

Клинт Шэнк

Удобство – не атрибут качества . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

Грегор Хоп

Развертывание приложения: раннее и регулярное . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

Стив Берчук

Отличайте исключения в бизнес-логике от технических . . . . . . . . . . . . . . . . . . . . . . 62

Дэн Берг Джонссон

Больше осознанной практики . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

Джон Джаггер

Предметно-ориентированные языки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

Микаэль Хунгер

Не бойтесь что-нибудь сломать . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

Майк Льюис

Не прикалывайтесь с тестовыми данными . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

Род Бегби

Не проходите мимо ошибки! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

Пит Гудлиф

8

Оглавление

Не просто учите язык, поймите его культуру . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

Андерс Норас

Не прибивайте программу гвоздями к стене . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

Верити Стоб

Не полагайтесь на «автоматические чудеса» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

Алан Гриффитс

Не повторяй свой код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

Стив Смит

Этот код не трогать! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

Кэл Эванс

Инкапсулируйте поведение, а не только состояние . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

Эйнар Ландре

Числа с плавающей запятой недействительны . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

Чак Эллисон

Удовлетворяйте свое честолюбие через Open Source . . . . . . . . . . . . . . . . . . . . . . . . . . 88

Ричард Монсон-Хейфел

Золотое правило проектирования API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

Майкл Фезерс

Миф о гуру . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

Райан Браш

Тяжелый труд не оправдывает себя . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

Олве Маудал

Как пользоваться системой отслеживания ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

Мэтт Доар

Улучшайте код, удаляя его . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

Пит Гудлиф

Установи меня! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

Маркус Бэйкер

Межпроцессная коммуникация влияет на время отклика приложения . . . . . . . . 102

Рэнди Стэффорд

Сборка должна быть чистой . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

Йоханнес Бродуолл

Оглавление

9

Умей пользоваться утилитами командной строки . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

Кэрролл Робинсон

Как следует изучи более двух языков программирования . . . . . . . . . . . . . . . . . . . . 108

Рассел Уиндер

Знай свою IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

Хейнц Кабуц

Знай свои возможности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

Грег Колвин

Знай, что сохранишь в репозиторий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

Дэн Берг Джонссон

Место для больших наборов взаимосвязанных данных – в базе данных . . . . . . . . 116

Диомидис Спинеллис

Учите иностранные языки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

Клаус Маркардт

Учитесь делать оценки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

Джованни Аспрони

Научитесь говорить «Hello, World» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

Томас Гест

Пусть ваш проект говорит сам за себя . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

Дэниэл Линднер

Компоновщик не таит в себе никаких чудес . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

Уолтер Брайт

Долговечность временных решений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

Клаус Маркардт

Интерфейсы должно быть легко использовать правильно

и трудно – неправильно . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

Скотт Мейерс

Пусть невидимое станет более видимым . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

Джон Джаггер

Передача сообщений улучшает масштабируемость параллельных систем . . . . . . 134

Рассел Уиндер

Послание потомкам . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

Линда Райзинг

10

Оглавление

Упущенные возможности применения полиморфизма . . . . . . . . . . . . . . . . . . . . . . . 138

Кирк Пеппердин

Невероятно, но факт: тестировщики – ваши друзья . . . . . . . . . . . . . . . . . . . . . . . . . 140

Берк Хафнагель

Один бинарный файл . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

Стив Фримен

Правду скажет только код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

Петер Зоммерлад

Возьмите сборку (и ее рефакторинг) на себя . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

Стив Берчук

Программируйте парами и входите в поток . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148

Гудни Хаукнес, Кари Россланд и Анн Кэтрин Гэгнат

Предпочитайте примитивам предметно-ориентированные типы данных . . . . . . . 150

Эйнар Ландре

Предотвращайте появление ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152

Жиль Колборн

Профессиональный программист . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

Роберт Мартин (Дядюшка Боб)

Держите все

в системе управления версиями . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156

Диомидис Спинеллис

Брось мышь и медленно отойди от клавиатуры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158

Берк Хафнагель

Читайте код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160

Карианне Берг

Читайте гуманитарные книги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

Кейт Брэйтуэйт

Почаще изобретайте колесо . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

Джейсон П. Сэйдж

Не поддавайтесь очарованию шаблона Singleton . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166

Сэм Сааристе

Путь к повышению эффективности программ заминирован грязным кодом . . . . 168

Кирк Пеппердин

Оглавление

11

Простота достигается сокращением . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170

Пол У. Гомер

Принцип единственной ответственности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .172

Роберт Мартин (Дядюшка Боб)

Сначала скажите «да» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .174

Алекс Миллер

Шаг назад. Теперь автоматизируй, автоматизируй, автоматизируй… . . . . . . . . . . .176

Кэй Хорстман

Пользуйтесь инструментами для анализа кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178

Сара Маунт

Тестируйте требуемое, а не случайное поведение . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180

Кевлин Хенни

Тестируйте точно и конкретно . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182

Кевлин Хенни

Тестируйте во сне (и по выходным) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184

Раджит Аттапатту

Тестирование – это инженерная строгость в разработке

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

Нил Форд

Думайте состояниями . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188

Никлас Нильссон

Одна голова хорошо, но две – часто лучше . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

Эдриан Уайбл

Две ошибки могут гасить

одна другую (и тогда

их трудно исправлять) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192

Аллан Келли

Написание кода в духе Убунту для друзей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194

Аслам Хан

Утилиты UNIX – ваши друзья . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196

Диомидис Спинеллис

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

Ян Кристиаан ван Винкель

12

Оглавление

Многословный журнал лишит вас сна . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200

Йоханнес Бродуолл

WET размазывает узкие места производительности . . . . . . . . . . . . . . . . . . . . . . . . . 202

Кирк Пеппердин

Когда программисты и тестировщики сотрудничают . . . . . . . . . . . . . . . . . . . . . . . . 204

Джанет Грегори

Пишите код так, как будто вам предстоит сопровождать его

всю оставшуюся жизнь . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206

Юрий Зубарев

Пишите маленькие функции на основе примеров . . . . . . . . . . . . . . . . . . . . . . . . . . . 208

Кейт Брэйтуэйт

Тесты пишутся для людей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210

Джерард Мезарос

Нужно заботиться о коде . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212

Пит Гудлиф

Ваши заказчики имеют в виду не то, что говорят . . . . . . . . . . . . . . . . . . . . . . . . . . . 214

Нэйт Джексон

Авторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216

Алфавитный указатель . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244

Статьи по категориям

Ошибки и исправления

Прежде чем пенять на других, проверь собственный код . . . . . . . . . . . . . . . . . . . 38

Этот код не трогать! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

Как пользоваться системой отслеживания ошибок . . . . . . . . . . . . . . . . . . . . . . . . 96

Две ошибки могут гасить одна другую (и тогда их трудно исправлять) . . . . . . 192

Сборка и развертывание

Развертывание приложения: раннее и регулярное . . . . . . . . . . . . . . . . . . . . . . . . . 60

Этот код не трогать! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

Установи меня! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

Сборка должна быть чистой . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

Пусть ваш проект говорит сам за себя. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

Один бинарный файл . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

Возьмите сборку (и ее рефакторинг) на себя . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

Правила написания и форматирования кода

Автоматизируйте свой стандарт форматирования кода . . . . . . . . . . . . . . . . . . . . 28

Важность форматирования кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

Рецензирование кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

Комментарий о комментариях . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

Комментируйте только то, о чем не скажет код . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

Пользуйтесь инструментами для анализа кода . . . . . . . . . . . . . . . . . . . . . . . . . . 178

Принципы проектирования и техника написания кода

Применяйте принципы функционального программирования . . . . . . . . . . . . . . 24

Выясните, как поступит пользователь (и вы – не пользователь) . . . . . . . . . . . . . 26

Красота – следствие простоты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

14

Статьи по категориям

Тщательно выбирайте инструменты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

Пишите код на языке предметной области . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

Код – это проектирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

Пиши код с умом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

Удобство – не атрибут качества . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

Отличайте исключения в бизнес-логике от технических . . . . . . . . . . . . . . . . . . . . 62

Не повторяй свой код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

Инкапсулируйте поведение, а не только состояние . . . . . . . . . . . . . . . . . . . . . . . . 84

Золотое правило проектирования API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

Межпроцессная коммуникация влияет на время отклика приложения . . . . . 102

Интерфейсы должно быть легко использовать правильно

и трудно – неправильно . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

Передача сообщений улучшает масштабируемость

параллельных систем . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

Упущенные возможности применения полиморфизма . . . . . . . . . . . . . . . . . . . . 138

Правду скажет только код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

Предпочитайте примитивам предметно-ориентированные типы данных . . . . 150

Предотвращайте появление ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152

Не поддавайтесь очарованию шаблона Singleton . . . . . . . . . . . . . . . . . . . . . . . . . 166

Принцип единственной ответственности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .172

Думайте состояниями . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188

WET размазывает узкие места производительности . . . . . . . . . . . . . . . . . . . . . . 202

Предметно-ориентированное мышление

Пишите код на языке предметной области . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

Предметно-ориентированные языки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66



Учите иностранные языки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

Предпочитайте примитивам предметно-ориентированные типы данных . . . . 150

Читайте гуманитарные книги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

Думайте состояниями . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188

Пишите маленькие функции на основе примеров . . . . . . . . . . . . . . . . . . . . . . . . 208

Ошибки, их обработка и исключения

Отличайте исключения в бизнес-логике от технических . . . . . . . . . . . . . . . . . . . . 62

Не проходите мимо ошибки! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

Не прибивайте программу гвоздями к стене . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

Предотвращайте появление ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152

Многословный журнал лишит вас сна . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200

Статьи по категориям

15

Обучение, мастерство и опыт

Непрерывное обучение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

Больше осознанной практики . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

Не просто учите язык, поймите его культуру . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

Удовлетворяйте свое честолюбие через Open Source . . . . . . . . . . . . . . . . . . . . . . . . 88

Миф о гуру . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

Тяжелый труд не оправдывает себя . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

Читайте код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160

Читайте гуманитарные книги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

Почаще изобретайте колесо . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

Ночное и волшебное

Не полагайтесь на «автоматические чудеса» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

Этот код не трогать! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

Миф о гуру . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

Умей пользоваться утилитами командной строки . . . . . . . . . . . . . . . . . . . . . . . . 106

Компоновщик не таит в себе никаких чудес . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

Тестируйте во сне (и по выходным) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184

Многословный журнал лишит вас сна . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200

Пишите код так, как будто вам предстоит сопровождать его

всю оставшуюся жизнь . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206

Производительность, оптимизация и представление

Применяйте принципы функционального программирования . . . . . . . . . . . . . . 24

Числа с плавающей запятой недействительны . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

Улучшайте код, удаляя его . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

Межпроцессная коммуникация влияет на время отклика приложения . . . . . 102

Знай свои возможности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

Место для больших наборов взаимосвязанных данных – в базе данных . . . . . 116

Передача сообщений улучшает масштабируемость

параллельных систем . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

Путь к повышению эффективности программ заминирован

грязным кодом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168

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

WET размазывает узкие места производительности . . . . . . . . . . . . . . . . . . . . . . 202

Профессионализм, мировоззрение и позиция

Непрерывное обучение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

Больше осознанной практики . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

Тяжелый труд не оправдывает себя . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

16

Статьи по категориям

Долговечность временных решений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

Профессиональный программист . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

Брось мышь и медленно отойди от клавиатуры . . . . . . . . . . . . . . . . . . . . . . . . . . 158

Тестирование – это инженерная строгость в разработке

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

Пишите код так, как будто вам предстоит сопровождать его

всю оставшуюся жизнь . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206

Нужно заботиться о коде . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212

Языки и парадигмы программирования

Применяйте принципы функционального программирования . . . . . . . . . . . . . . 24

Предметно-ориентированные языки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

Не просто учите язык, поймите его культуру . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

Как следует изучи более двух языков программирования . . . . . . . . . . . . . . . . . 108

Учите иностранные языки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

Рефакторинг и забота о коде

Будьте благоразумны . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

Прежде чем приступать к рефакторингу . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

Правило бойскаута . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

Комментируйте только то, о чем не скажет код . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

Не бойтесь что-нибудь сломать . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

Улучшайте код, удаляя его . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

Сборка должна быть чистой . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

Знай, что сохранишь в репозиторий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

Долговечность временных решений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

Послание потомкам . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

Правду скажет только код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

Возьмите сборку (и ее рефакторинг) на себя . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

Профессиональный программист . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

Путь к повышению эффективности программ заминирован

грязным кодом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168

Простота достигается сокращением . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170

Написание кода в духе Убунту для друзей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194

Нужно заботиться о коде . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212

Повторное использование и повторение кода

Осторожно: общий код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

Удобство – не атрибут качества . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

Больше осознанной практики . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

Статьи по категориям

17

Не повторяй свой код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

Почаще изобретайте колесо . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

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

WET размазывает узкие места производительности . . . . . . . . . . . . . . . . . . . . . . 202

Графики, сроки и оценки

Будьте благоразумны . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

Код – это проектирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

Знай, что сохранишь в репозиторий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

Учитесь делать оценки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

Пусть невидимое станет более видимым . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

Простота

Красота – следствие простоты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

Научитесь говорить «Hello, World» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

Послание потомкам . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

Простота достигается сокращением . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170

Командная работа и сотрудничество

Рецензирование кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

Учите иностранные языки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

Программируйте парами и входите в поток . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148

Сначала скажите «да» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .174

Одна голова хорошо, но две – часто лучше . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

Написание кода в духе Убунту для друзей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194

Когда программисты и тестировщики сотрудничают . . . . . . . . . . . . . . . . . . . . . 204

Тесты, тестирование и тестировщики

Применяйте принципы функционального программирования . . . . . . . . . . . . . . 24

Код – это проектирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

Не прикалывайтесь с тестовыми данными . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

Золотое правило проектирования API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

Интерфейсы должно быть легко использовать правильно

и трудно – неправильно . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

Пусть невидимое станет более видимым . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

Невероятно, но факт: тестировщики – ваши друзья . . . . . . . . . . . . . . . . . . . . . . 140

Тестируйте требуемое, а не случайное поведение . . . . . . . . . . . . . . . . . . . . . . . . . 180

Тестируйте точно и конкретно . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182

Тестируйте во сне (и по выходным) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184

18

Статьи по категориям

Тестирование – это инженерная строгость в разработке

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

Когда программисты и тестировщики сотрудничают . . . . . . . . . . . . . . . . . . . . . 204

Пишите маленькие функции на основе примеров . . . . . . . . . . . . . . . . . . . . . . . . 208

Тесты пишутся для людей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210

Инструменты, автоматизация, среды разработки

Автоматизируйте свой стандарт форматирования кода . . . . . . . . . . . . . . . . . . . . 28

Прежде чем пенять на других, проверь собственный код . . . . . . . . . . . . . . . . . . . 38

Тщательно выбирайте инструменты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

Не повторяй свой код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

Как пользоваться системой отслеживания ошибок . . . . . . . . . . . . . . . . . . . . . . . . 96

Умей пользоваться утилитами командной строки . . . . . . . . . . . . . . . . . . . . . . . . 106

Знай свою IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

Место для больших наборов взаимосвязанных данных – в базе данных . . . . . 116

Научитесь говорить «Hello, World» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

Пусть ваш проект говорит сам за себя. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

Компоновщик не таит в себе никаких чудес . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

Держите все в системе управления версиями . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156

Шаг назад. Теперь автоматизируй, автоматизируй, автоматизируй… . . . . . . . .176

Пользуйтесь инструментами для анализа кода . . . . . . . . . . . . . . . . . . . . . . . . . . 178

Тестируйте во сне (и по выходным) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184

Утилиты UNIX – ваши друзья . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196

Пользователи и заказчики

Выясните, как поступит пользователь (и вы – не пользователь) . . . . . . . . . . . . . 26

Предметно-ориентированные языки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

Интерфейсы должно быть легко использовать правильно

и трудно – неправильно . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

Невероятно, но факт: тестировщики – ваши друзья . . . . . . . . . . . . . . . . . . . . . . 140

Предотвращайте появление ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152

Читайте гуманитарные книги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

Ваши заказчики имеют в виду не то, что говорят . . . . . . . . . . . . . . . . . . . . . . . . . 214

Предисловие

Но вей ший ком пь ю тер спо со бен лишь с боль шей ско ро стью ус лож нить

древ ней шую про бле му от но ше ний ме ж ду людь ми, и в ко неч ном ито ге

уча ст ни ку об ще ния по-преж не му при дет ся ре шать, что и как го во рить.

Эд вард Р. Мэ роу (Edward R. Murrow)

Про­грам­ми­стам­есть,­над­чем­ду­мать. Язы ки про грам ми ро ва ния, прие мы про-

грам ми ро ва ния, сре ды раз ра бот ки, сти ли на пи са ния ко да, ин ст ру мен ты, про-

цес сы раз ра бот ки, пла ны ра бот, со ве ща ния, ар хи тек ту ры про грамм, шаб ло ны

про ек ти ро ва ния, ди на ми ка ко манд но го взаи мо дей ст вия, код, тех ни че ские тре-

бо ва ния, де фек ты, ка че ст во ко да. И дру гое. Мно го че го еще.

Здесь мы на хо дим ис кус ст во, ре мес ло и нау ку, ко то рые про сти ра ют ся да ле ко за

рам ки про грам мы. Дея тель ность про грам ми ста объ еди ня ет дис крет ный мир

ком пь ю те ров и те ку чий мир че ло ве че ских за ня тий. Про грам ми сты слу жат свя-

зую щим зве ном ме ж ду биз не сом с его рас плыв ча ты ми до го вор ны ми ис ти на ми

и вы ве рен ной, бес ком про мисс ной об ла стью, где ца рят би ты, бай ты и по стро ен-

ные на их ос но ве поль зо ва тель ские ти пы.

Учи ты вая объ е мы зна ний, ра бо ты и раз но об ра зие спо со бов ее вы пол не ния, ни-

ка кой че ло век или ис точ ник не мо жет пре тен до вать на зна ние «ис тин но го пу ти».

По это му, опи ра ясь на на род ную муд рость и на ко п лен ный опыт, кни га «97 этю-

дов для про грам ми стов» пред ла га ет не столь ко упо ря до чен ную об щую кар ти ну,

сколь ко пе ст рую мо заи ку мне ний о том, что долж но быть из вест но ка ж до му про-

грам ми сту. Она ка са ет ся раз ных тем: от ре ко мен да ций по на пи са нию ко да до

куль ту ры, от вы бо ра ал го рит мов до гиб ко го про грам ми ро ва ния, от прие мов реа-

ли за ции до про фес сио на лиз ма, от сти ля до сущ но сти.

От дель ные ста тьи не сты ку ют ся ме ж ду со бой, да и цель ста ви лась ско рее про ти во-

по лож ная. Цен ность от дель ной ста тьи здесь как раз в том, что она не по хо жа на

дру гие. А цен ность сбор ни ка в це лом со сто ит в том, что ста тьи до пол ня ют, под-

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

сю же том: чи та тель сам мо жет оце нить ма те ри ал, по раз мыш лять над ним и увя-

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

97 этюдов для программистов

20

Предисловие

Лицензионные права

Все ста тьи пуб ли ку ют ся по сво бод ной ли цен зии. Они сво бод но дос туп ны в Ин-

тер не те под ли цен зи ей Creative Commons Attribution 3.0 License, что оз на ча ет

воз мож ность ис поль зо ва ния от дель ных ста тей в соб ст вен ной ра бо те при ус ло вии

ссыл ки на их ав то ров:

http://creativecommons.org/licenses/by/3.0/us/

Контакты

На веб-стра ни це кни ги пе ре чис ле ны най ден ные ошиб ки и при во дят ся до пол ни-

тель ные све де ния:

http://www.oreilly.com/catalog/9780596809485/

Со про во ди тель ный сайт, где опуб ли ко ва ны все ста тьи, био гра фии ав то ров и дру-

гие дан ные, на хо дит ся по ад ре су:

http://programmer.97things.oreilly.com

Вы так же мо же те сле дить за но во стя ми и ис прав ле ния ми кни ги в Twitter:

http://twitter.com/97TEPSK

Ком мен та рии и тех ни че ские во про сы, ка саю щие ся этой кни ги, мож но от пра-

вить элек трон ной по чтой:

bookquestions@oreilly.com

До пол ни тель ная ин фор ма ция о на ших кни гах, Цен трах ре сур сов и се ти O’Reilly

Network при ве де на на на шем веб-сай те:

http://www.oreilly.com/

Safari® Books Online

Safari Books Online – циф ро вая биб лио те ка, ко то рая да ет воз-

мож ность бы ст ро на хо дить от ве ты на ва ши во про сы в 7 500 тех-

ни че ских книг, спра воч ни ков и ви део за пи сей.

Под пис ка Safari да ет пра во чи тать лю бую стра ни цу и смот реть лю бое ви део в ре-

жи ме он лайн. Чи тай те кни ги на со то вых те ле фо нах и мо биль ных уст рой ст вах.

По лу чай те дос туп к но вым из да ни ям до вы хо да их из пе ча ти. По лу чай те экс-

клю зив ный дос туп к ру ко пи сям в про цес се ра бо ты и от прав ляй те за ме ча ния ав-

то рам. Ко пи руй те текст при ме ров ко да, за гру жай те гла вы, соз да вай те за клад ки

и за мет ки, пе ча тай те стра ни цы – вот лишь не ко то рые из мно же ст ва функ ций,

эко но мя щих ва ше вре мя.

O’Reilly Media опуб ли ко ва ла эту кни гу в Safari Books Online. Что бы по лу чить

пол ный циф ро вой дос туп к этой кни ге и кни гам схо жей те ма ти ки, вы пу щен ным

Предисловие

21

O’Reilly и дру ги ми из да тель ст ва ми, офор ми те бес плат ную под пис ку на http://

my.safaribooksonline.com.

Благодарности

Про ек ту «97 этю дов для про грам ми стов» пря мо или кос вен но от да ли свое вре мя

и зна ния мно гие лю ди. Все они за слу жи ва ют бла го дар но сти.

Ри чард Мон сон-Хей фел (Richard Monson-Haefel) – ре дак тор се рии «97 Things»

и ре дак тор пер вой кни ги из этой се рии, «97 Things Every Software Architect Sho-

uld Know»1, в на пи са нии ко то рой я при ни мал уча стие. Спа си бо Ри чар ду за идею

се рии и за ее от кры тость для по тен ци аль ных уча ст ни ков, а так же за то, что он

так энер гич но под дер жи вал мои пред ло же ния по дан ной кни ге.

Хо чу по бла го да рить всех тех, кто от дал свое вре мя и си лы, уча ст вуя в соз да нии

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

и тех, чьи тек сты не по па ли в нее, но опуб ли ко ва ны на веб-сай те. Боль шое ко ли-

че ст во и вы со кое ка че ст во ма те риа ла весь ма за труд ни ли про цесс окон ча тель но-

го от бо ра – же ст ко фик си ро ван ное в на зва нии кни ги чис ло не ос та ви ло мес та

для до пол ни тель ных ста тей.

Я так же бла го да рен за до пол ни тель ные от зы вы, ком мен та рии и пред ло же ния,

ав то ра ми ко то рых бы ли Джо ван ни Ас про ни (Giovanni Asproni), Пол Ко лин Гло-

с тер (Paul Colin Gloster) и Ми ка эль Хун гер (Michael Hunger).

Спа си бо O’Reilly за пре дос тав лен ную это му про ек ту под держ ку – от ви ки-хос-

тин га, сде лав ше го кни гу ре аль но стью, до обес пе че ния всех ста дий про цес са пуб-

ли ка ции в бу маж ном ви де. Со труд ни ки O’Reilly, ко то рых я хо тел бы осо бо по-



бла го да рить: Майк Лу ки дес (Mike Loukides), Ло рел Акер ман (Laurel Ackerman),

Эди Фрид ман (Edie Freedman), Эд Сти вен сон (Ed Stephenson) и Рей чел Мо на хан

(Rachel Monaghan).

Де ло не толь ко в том, что текст кни ги ро ж дал ся в сре де Веб: че рез Веб про ект

так же при об рел из вест ность и по пу ляр ность. Спа си бо всем, кто рас про стра нял

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

Хо чу так же по бла го да рить свою же ну Кэ ро лин за то, что прив но сит по ря док

в мой ха ос, и двух мо их сы но вей, Сте фа на и Ян ни ка, за то, что часть это го по ряд-

ка они вновь пре вра ща ют в ха ос.

На де юсь, что эта кни га ста нет для вас ис точ ни ком ин фор ма ции, от кры тий и вдох-

но ве ния.

При ят но го чте ния!

Кев лин Хен ни (Kevlin Henney)

1

Нил Форд, Майкл Найгард, Билл де Ора и др. «97 этюдов для архитекторов программ-

ных систем». – Пер. с англ. – СПб.: Символ-Плюс, 2010.

97 этюдов для программистов

Будьте благоразумны

Себ Роуз

В лю бом де ле будь бла го ра зу мен и ду май о по след ст ви ях.

Не из вест ный

Как­бы­ус­по­каи­ваю­ще­ни­вы­гля­дел­гра­фик­ра­бо­ты­в на ча ле ите ра ции, в ка кой-

то мо мент не из беж но воз ни ка ет не хват ка вре ме ни. Ес ли при хо дит ся раз ры вать-

ся меж ду «сде лать пра виль но» и «сде лать бы ст ро», час то воз ни ка ет со блазн «сде-

лать бы ст ро» с ого вор кой, что вы ис пра ви те ре ше ние поз же, ко гда по явит ся вре-

мя. Вы со вер шен но ис крен не дае те обе ща ние имен но так и по сту пить – дае те са-

мо му се бе, ко ман де или за каз чи ку. Но очень час то на сле дую щей ите ра ции

воз ни ка ют уже дру гие про бле мы, ко то рым и при хо дит ся по свя щать свое вни ма-

ние. Та кую от ло жен ную ра бо ту на зы ва ют тех ни че ским дол гом, и хо ро ше го от

не го не жди. В сво ей клас си фи ка ции тех ни че ских дол гов Мар тин Фау лер на зы-

ва ет та кой вид дол га умыш лен ным тех ни че ским дол гом, и его не сле ду ет пу тать

с не пред на ме рен ным тех ни че ским дол гом.1

Тех ни че ский долг по до бен кре ди ту: в крат ко сроч ной пер спек ти ве он вы го ден, но

по не му при хо дит ся вы пла чи вать про цен ты до пол но го по га ше ния зай ма. Сре-

зая уг лы при на пи са нии ко да, вы за труд няе те как раз ра бот ку но вой функ ци о-

наль но сти, так и ре фак то ринг. Это соз да ет бла го при ят ную поч ву для по яв ле ния

оши бок и не ста биль ных тес то вых сце на ри ев ( test cases). Чем доль ше долг су ще-

ст ву ет, тем тя же лее по след ст вия. К то му вре ме ни, как дой дут ру ки вне сти за-

пла ни ро ван ные ис прав ле ния, мо жет ока зать ся, что на ос но ве из на чаль но го со-

мни тель но го ко да уже вы строе на це лая го ра не впол не вер ных с точ ки зре ния

про ек ти ро ва ния ре ше ний, а это зна чи тель но ос лож нит ре фак то ринг и ис прав ле-

ние это го ко да. На са мом де ле, к ре ше нию из на чаль ной про бле мы час то воз вра-

ща ют ся лишь то гда, ко гда уже нет вы бо ра, кро ме как вер нуть ся и все ис пра-

вить. И за час тую к это му мо мен ту ис прав ле ние ока зы ва ет ся уже на столь ко

1

http://martinfowler.com/bliki/TechnicalDebtQuadrant.html

Будьте благоразумны

23

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

или пой ти на по доб ный риск.

Бы ва ют си туа ции, ко гда при хо дит ся ид ти на соз да ние тех ни че ско го дол га, ес ли

не об хо ди мо уло жить ся в срок или час тич но реа ли зо вать не кую функ цио наль-

ность. Ста рай тесь не ока зы вать ся в та ких си туа ци ях, од на ко ес ли по ло же ние со-

вер шен но без вы ход ное, дей ст вуй те. Но (и это уве си стое но) вы долж ны вес ти

учет сво его тех ни че ско го дол га и га сить его как мож но ско рее, ина че про бле мы

рас тут, как снеж ный ком. И ес ли уж вы по шли на та кой ком про мисс, со ставь те

кар точ ку с зада ни ем (task card) или соз дай те за пись в сис те ме уче та де фек тов,

что бы не за быть о про бле ме.

Ес ли вы пла ни руе те по га сить свой долг на сле дую щей ите ра ции, по те ри бу дут

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

по сто ян но сле дить, что бы ви деть ре аль ную ко неч ную це ну. Это под чер ки ва ет

влия ние тех ни че ско го дол га про ек та на его биз нес-стои мость и по зво ля ет ра зум-

но рас став лять ак цен ты в во про сах по га ше ния та ко го дол га. Спо соб на чис ле ния

и от сле жи ва ния про цен тов за ви сит от кон крет но го про ек та, но от сле жи вать их

долж ны вы.

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

97 этюдов для программистов

Применяйте принципы

функционального

программирования

Эдвард Гарсон

Функ­цио­наль­ное­про­грам­ми­ро­ва­ние­не дав но сно ва об ра ти ло на се бя вни ма ние

боль шин ст ва в со об ще ст ве про грам ми стов. От час ти бла го да ря то му, что эмерд-

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

ни каю щих в на шей от рас ли в свя зи с рос том зна чи мо сти мно го ядер ных ар хи-

тек тур. И хо тя дан ное при ме не ние, не со мнен но, важ но, од на ко не оно яв ля ет ся

главным ос но ва ни ем для мое го на став ле ния по знать функ цио наль ное про грам-

ми ро ва ние.

Ов ла дев па ра диг мой функ цио наль но го про грам ми ро ва ния, про грам мист мо жет

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

кое по ни ма ние па ра диг мы функ цио наль но го про грам ми ро ва ния и ее при ме не-

ние на прак ти ке по мо гут вам про ек ти ро вать сис те мы, об ла даю щие го раз до боль-

шей сте пе нью ссы лоч ной про зрач но сти ( referential transparency).

Ссы лоч ная про зрач ность яв ля ет ся ка че ст вом очень же ла тель ным: она пред по-

ла га ет, что функ ции не из мен но да ют оди на ко вые ре зуль та ты на оди на ко вых

вход ных дан ных не за ви си мо от мес та и вре ме ни об ра ще ния к этим функ ци ям.

Вы чис ле ние функ ции, та ким об ра зом, сла бо за ви сит от по боч ных эф фек тов из-

ме няю ще го ся (mutable) со стоя ния – в идеа ле не за ви сит от них во об ще.

Один из глав ных ис точ ни ков де фек тов в ко де на им пе ра тив ном язы ке про грам-

ми ро ва ния – из ме няе мые (mutable) пе ре мен ные. Ка ж до му чи та те лю на вер ня ка

при хо ди лось раз би рать ся, по че му в ка ком-ли бо кон крет ном слу чае не ко то рое

зна че ние не со от вет ст во ва ло ожи дае мо му. Се ман ти ка об лас тей ви ди мо сти мо-

жет пре пят ст во вать по яв ле нию та ких ко вар ных оши бок или, по край ней ме ре,

зна чи тель но су жать воз мож ную об ласть их по яв ле ния. Но ис тин ной при чи ной

их воз ник но ве ния мо жет быть са ма кон цеп ция про ек ти ро ва ния та ко го ко да, ко-

то рый бес по ря доч но по ла га ет ся на из ме няе мость (mutability).

И в этом от но ше нии нам оп ре де лен но не сто ит ждать осо бой по мо щи от соб ст вен-

ной от рас ли. Ввод ные тек сты по объ ект но-ори ен ти ро ван но му про грам ми ро ва-

нию скры то про па ган ди ру ют по доб ные кон ст рук ции. В них час то при во дят ся

Применяйте принципы функционального программирования

25

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

и об ме ни ва ют ся вы зо ва ми ме то дов, из ме няю щих со стоя ние (mutator methods),

что не без опас но. Од на ко гра мот ное про ек ти ро ва ние на ос но ве тес тов (test-driven

design), осо бен но ес ли обес пе че на «ими та ция ро лей, а не объ ек тов (mock roles,

not objects)»,1 по зво ля ет из ба вить ся от из ли шеств из мен чи во сти в ар хи тек ту ре.

В ито ге, как пра ви ло, по лу ча ет ся ар хи тек ту ра с бо лее удач ным рас пре де ле ни ем

обя зан но стей и мно же ст вом мел ких функ ций, ко то рые ра бо та ют с по лу чен ны-

ми ар гу мен та ми, а не об ра ща ют ся на пря мую к из ме няе мым пе ре мен ным-чле-

нам. Де фек тов ста но вит ся мень ше, а так же уп ро ща ет ся их от лад ка, ведь лег че

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

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

Это зна чи тель но по вы ша ет ссы лоч ную про зрач ность, и ре ши тель но ни что не

мо жет так спо соб ст во вать глу бо ко му ус вое нию этих идей, как изучение функ-

цио наль ного язы ка про грам ми ро ва ния, где та кая мо дель вы чис ле ний яв ля ет ся

нор мой.

Ко неч но, та кой под ход оп ти ма лен не все гда. На при мер, за час тую в объ ект но-ори-

ен ти ро ван ных сис те мах луч шие ре зуль та ты этот стиль да ет при раз ра бот ке мо-

де ли пред мет ной об лас ти (то есть ко гда со труд ни че ст во объ ек тов слу жит сни же-

нию слож но сти биз нес-пра вил), чем при раз ра бот ке ин тер фей са поль зо ва те ля.

Ов ла дей те па ра диг мой функ цио наль но го про грам ми ро ва ния, что бы ра зум но

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

объ ек тов – они ста нут про сто све тить ся ка че ст вом ссы лоч ной про зрач но сти и ока-

жут ся зна чи тель но бли же к сво им функ цио наль ным ана ло гам, чем мож но бы ло

бы пред по ло жить. На са мом де ле, не ко то рые да же вы ска зы ва ют мне ние, что

в сво ем выс шем про яв ле нии функ цио наль ное про грам ми ро ва ние и объ ект но-

ори ен ти ро ван ный под ход ока зы ва ют ся лишь от ра же ния ми друг дру га, сво его

ро да вы чис ли тель ны ми инь и ян.

1

http://www.jmock.org/oopsla2004.pdf

97 этюдов для программистов

Выясните,

как поступит пользователь

(и вы – не пользователь)

Жиль Колборн

Мы­все­склон­ны­по­ла­гать,­что­дру­гие­лю­ди­рас­су­ж­да­ют­так­же,­как­мы. Но это

не так. В пси хо ло гии это на зы ва ет ся эф фек том лож но го со гла сия. Ес ли лю ди

ду ма ют или по сту па ют ина че, чем мы, мы час то (под соз на тель но) счи та ем их

в чем-то не пол но цен ны ми.

Этот эф фект объ яс ня ет, по че му про грам ми сту так труд но по ста вить се бя на ме-

сто поль зо ва те ля. Поль зо ва те ли рас су ж да ют ина че, чем про грам ми сты. Пре ж де

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

и не хо тят знать, как ра бо та ет ком пь ю тер. Это оз на ча ет, что поль зо ва те ли не мо-

гут при бе гать к ар се на лу прие мов ре ше ния про блем, ко то рым в со вер шен ст ве

овла де ли про грам ми сты. Им не зна ко мы шаб ло ны и ви зуаль ные при ме ты, ко то-

ры ми поль зу ют ся про грам ми сты при ра бо те с ин тер фей са ми, для на ви га ции по

ним и для ос вое ния ин тер фей сов.

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

Пред ло жи те ему вы пол нить за да ние с по мо щью про грам мы, ана ло гич ной той,

ко то рую вы раз ра ба ты вае те. За да ча долж на быть ре аль ной. «Сло жить чис ла в ко-

лон ке» – не пло хо, но еще луч ше: «под счи тать соб ст вен ные рас хо ды за по след ний

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

бы вы де лить эти ячей ки в таб ли це и вве сти ни же фор му лу сум ми ро ва ния?» –

в этом во про се со дер жит ся слиш ком яв ная под сказ ка. Пред ло жи те поль зо ва те-

лю рас ска зы вать о сво их дей ст ви ях по хо ду ра бо ты. Не пе ре би вай те его. Не пы-

тай тесь по мочь. Спра ши вай те се бя: «По че му он де ла ет так?» и «По че му она не

де ла ет это го?».

Пре ж де все го, вы об на ру жи те, что есть ряд дей ст вий, ко то рые все поль зо ва те ли

вы пол ня ют схо жим об ра зом. Они пы та ют ся вы пол нять за да чи в од ном и том же

по ряд ке и де ла ют оди на ко вые ошиб ки в од них и тех же мес тах. Та кое ба зо вое

по ве де ние нуж но класть в ос но ву про ек ти ро ва ния. Срав ни те дан ный под ход

с тем, что обыч но про ис хо дит на встре чах по про ек ти ро ва нию сис те мы, ко гда со-

брав шие ся при слу ши ва ют ся к во про сам вро де та ко го: «А вдруг поль зо ва тель за-

хо чет…». Так в при ло же нии по яв ля ют ся мно го чис лен ные функ ции и воз ни ка ет

Выясните, как поступит пользователь (и вы – не пользователь)

27

пу та ни ца в от но ше нии то го, что нуж но поль зо ва те лям. Ес ли на блю дать за поль-

зо ва те ля ми, та кой пу та ни цы не бу дет.

Вы мо же те столк нуть ся с тем, что поль зо ва тель где-то за стрял. Ко гда вы са ми

за стре вае те, то ос мат ри вае тесь по сто ро нам. Ко гда за стре ва ет поль зо ва тель, его

об ласть вни ма ния, на про тив, су жа ет ся. Ему ста но вит ся слож нее уви деть ре ше-

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

текст – пло хое ре ше ние для пло хо го поль зо ва тель ско го ин тер фей са. Ес ли не об хо-

ди мо дать ин ст рук ции или со про во ди тель ный текст, раз ме щать их нуж но в не по-

сред ст вен ной бли зо сти от про блем ной об лас ти. Имен но су же ние по ля вни ма ния

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

ны, чем встро ен ная справ ка.

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

Ес ли они на хо дят ка кой-то путь к це ли, то бу дут ид ти по не му и впредь, ка ким

бы за пу тан ным он ни был. Луч ше дать им один дей ст ви тель но оче вид ный спо соб

ре ше ния за да чи вме сто двух или трех не оче вид ных (но бо лее бы ст рых).

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

его сло вам, хо чет, и тем, что он де ла ет в дей ст ви тель но сти. Это тре вож ный факт,

ведь обыч но тре бо ва ния поль зо ва те лей со би ра ют ся пу тем их оп ро са. Вот по че му

луч ший спо соб со би рать тре бо ва ния – на блю дать за поль зо ва те ля ми. Час на-

блю де ний за поль зо ва те ля ми даст вам боль ше ин фор ма ции, чем день га да ний

о том, что им нуж но.

97 этюдов для программистов

Автоматизируйте свой стандарт

форматирования кода

Филип ван Лаенен

Ве­ро­ят­но,­вы­то­же­че­рез­это­про­хо­ди­ли. В на ча ле про ек та у всех пол но бла гих

за мы слов – на зо вем их «но во про ект ны ми обе ща ния ми»1. До воль но час то мно-

гие из этих обе ща ний фик си ру ют ся до ку мен таль но. Обе ща ния, свя зан ные с ко-

дом, по па да ют в стан дарт оформ ле ния ко да дан но го про ек та. На пер вом со б ра-

нии про ек та ве ду щий раз ра бот чик ог ла ша ет этот до ку мент, и в идеа ле все со гла-

ша ют ся ста ра тель но со блю дать пред ло жен ные тре бо ва ния. Од на ко по хо ду ра бо-

ты над про ек том все эти бла гие на ме ре ния од но за дру гим за бы ва ют ся. Ко гда

про ект на ко нец за вер шен, код вы гля дит весь ма за пу тан но, и, по хо же, ни кто не

по ни ма ет, как так по лу чи лось.

Ко гда же все по шло на пе ре ко сяк? Впол не ве ро ят но, что как раз на том пер вом

со б ра нии. Не ко то рые его уча ст ни ки бы ли нев ни ма тель ны. Дру гие не по ня ли,

в чем смысл стан дар та. Ху же то го, кое-кто был про тив пред ло жен но го и пря мо

на со б ра нии за те вал про тив стан дар та вос ста ние. И да же те, кто по нял и со гла-

сил ся, в ка кой-то мо мент ра бо ты на про ек те бы ли вы ну ж де ны под дав ле ни ем

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

бу дет оце нен кли ен том, ко то ро му нуж ны но вые функ ции в при ло же нии. Кро ме

то го, со блю де ние стан дар та оформ ле ния ко да мо жет ока зать ся весь ма уто ми-

тель ным де лом, ес ли его не ав то ма ти зи ро вать. По про буй те рас ста вить от сту пы

в пло хо на пи сан ном клас се, и вы убе ди тесь в этом са ми.

Но ес ли это так труд но, за чем нам во об ще соз да вать стан дарт оформ ле ния ко да?

Од на из це лей еди но об раз но го фор ма ти ро ва ния ко да – не по зво лить ни ко му «при-

ва ти зи ро вать» код пу тем фор ма ти ро ва ния его сво им осо бым спо со бом. Так же не

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

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

об лег чать ра бо ту над про ек том и под дер жи вать по сто ян ную ско рость раз ра бот-

ки от на ча ла до кон ца. От сю да сле ду ет, что под держ ка стан дар та долж на быть

1

По аналогии с новогодними обещаниями, которые люди дают себе: заниматься спор-

том, бросить курить и т. п. – Прим. ред.

Автоматизируйте свой стандарт форматирования кода

29

еди но глас ной: пло хо, ес ли один раз ра бот чик де ла ет от сту пы раз ме ром в три про-

бе ла, а дру гой – в че ты ре.

Су ще ст ву ет мно же ст во ин ст ру мен тов, с по мо щью ко то рых мож но соз да вать от-

че ты о ка че ст ве ко да, а так же до ку мен ти ро вать и под дер жи вать стан дарт фор ма-

ти ро ва ния ко да, но это толь ко часть ре ше ния. Стан дарт сле ду ет ав то ма ти зи ро-

вать и вне дрять при ну ди тель но там, где это воз мож но. Вот не ко то рые при ме ры:

Сде лай те фор ма ти ро ва ние ко да ча стью про це ду ры сбор ки, что бы оно про ис-

хо ди ло ав то ма ти че ски при ка ж дой ком пи ля ции ко да.

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

ан ти пат тер нов. Пре ры вай те сбор ку при их об на ру же нии.

На учи тесь на страи вать эти ин ст ру мен ты, что по мо жет на хо дить ан ти пат тер-

ны, спе ци фи че ские для ва ше го про ек та.

Не про сто за ме ряй те про цент по кры тия тес та ми, но и де лай те ав то ма ти че-

скую оцен ку ре зуль та тов. Пре ры вай те сбор ку, ес ли про цент по кры тия тес та-

ми не до пус ти мо низ кий.

По ста рай тесь вне дрить эти прин ци пы в от но ше нии всех тре бо ва ний к ко ду, ко-

то рые вы счи тае те важ ны ми. Пол но стью ав то ма ти зи ро вать все, что вас бес по ко-

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

ав то ма ти че ски, сле ду ет вклю чить в до пол ни тель ный на бор пра вил – как при ло-

же ние к ав то ма ти зи ро ван ной час ти стан дар та. Од на ко вам при дет ся при нять

тот факт, что у вас и ва ших кол лег есть воз мож ность со блю дать пра ви ла из это го

при ло же ния ме нее стро го.

На ко нец, стан дарт ко ди ро ва ния дол жен эво лю цио ни ро вать, а не быть вы се чен-

ным в кам не. С те че ни ем вре ме ни по треб но сти про ек та ме ня ют ся, и то, что ка за-

лось ра зум ным в на ча ле, со всем не обя за тель но ос та нет ся та ко вым че рез не-

сколь ко ме ся цев.

97 этюдов для программистов

Красота – следствие простоты

Йорн Ольмхейм

У­Пла­то­на­есть­од­но­вы­ска­зы­ва­ние, ко то рое, как мне ка жет ся, осо бен но по лез-

но бы ло бы знать и при ни мать близ ко к серд цу всем раз ра бот чи кам про грамм но-

го обес пе че ния:

Кра со та сти ля, гар мо ния, изя ще ст во и хо ро ший ритм ос но вы ва ют ся на про-

сто те.

Од но это пред ло же ние объ еди ня ет цен но сти, ко то ры ми нам, раз ра бот чи кам, над-

ле жит вос хи щать ся.

Есть ряд ве щей, ко то рых мы стре мим ся дос тичь в на шем ко де:

Чи тае мость

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

Ско рость раз ра бот ки

Не уло ви мая кра со та

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

Что та кое кра си вый код? Ве ро ят но, это очень субъ ек тив ный во прос. Вос при ятие

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

че го бы то ни бы ло. Изу чав шие ис кус ст во ина че вос при ни ма ют кра со ту (по край-

ней ме ре, ина че к ней под хо дят), чем по лу чив шие тех ни че ское об ра зо ва ние. Лю-

ди с гу ма ни тар ным об ра зо ва ни ем обыч но рас смат ри ва ют кра со ту про грам мы,

срав ни вая ее с про из ве де ни ем ис кус ст ва, то гда как лю ди с тех ни че ским об ра зо-

ва ни ем ча ще рас су ж да ют о сим мет ри ях и зо ло том се че нии, пы та ясь все све сти

к фор му лам. По мо ему опы ту, имен но на про сто те стро ят ся в боль шин ст ве сво ем

до во ды обе их сто рон.

По раз мыш ляй те об ис ход ном ко де всех про грамм, ко то рые вам до во ди лось

встре чать. Ес ли вы ни ко гда не за ни ма лись изу че ни ем ко да, на пи сан но го дру ги-

ми людь ми, пря мо сей час от ло жи те чте ние, най ди те ка кой-ни будь от кры тый

Красота – следствие простоты

31

ис ход ный код и изу чи те его. Я серь ез но! По ищи те в Ин тер не те код на ва шем лю-

би мом язы ке, на пи сан ный из вест ным и при знан ным спе циа ли стом.

Вы вер ну лись? Хо ро шо. На чем мы ос та но ви лись? Ах, да… Я об на ру жил, что

при ме ры ко да, ко то рые на хо дят от клик в мо ей ду ше и ка жут ся мне кра си вы ми,

име ют не ко то рые об щие свой ст ва. Пре ж де все го, это про сто та ко да. Я счи таю,

что ка ким бы слож ным ни бы ло при ло же ние или сис те ма в це лом, от дель ные его

час ти долж ны быть про сты ми: про стые объ ек ты, вы пол няю щие един ст вен ную

за да чу, и в них на столь ко же про стые спе циа ли зи ро ван ные ме то ды с хо ро шо по-

нят ны ми име на ми. Не ко то рые счи та ют, что тре бо вать, что бы ме то ды со дер жа ли

не бо лее 5–10 строк ко да, – это край ность, и в не ко то рых язы ках это го очень

труд но дос тичь. Од на ко мне все же ка жет ся, что та кая ла ко нич ность очень же-

ла тель на.

Вы вод та ков: кра си вый код – зна чит про стой код. Все со став ные час ти про сты,

ре ша ют про стые за да чи и свя за ны про сты ми от но ше ния ми с дру ги ми час тя ми

сис те мы. Бла го да ря это му мы мо жем об лег чить со про во ж де ние ко да сво их сис-

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

раз ра бот ки на про тя же нии все го вре ме ни су ще ст во ва ния сис те мы.

Про сто та – ис точ ник и не пре мен ный ат ри бут кра со ты.

97 этюдов для программистов

Прежде чем приступать

к рефакторингу

Раджит Аттапатту

Ра­но­или­позд­но­ка­ж­до­му­про­грам­ми­сту­при­хо­дит­ся­вы­пол­нять­ре­фак­то­ринг­

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

ких ве щах, ко то рые мо гут сбе речь вам и кол ле гам уй му вре ме ни (и убе речь от

го лов ной бо ли):

Луч ше все го на чи нать ре фак то ринг с оцен ки со стоя ния су ще ст вую ще го

в про ек те ко да и на пи сан ных для не го тес тов. Так вы смо же те вы яс нить до-

с то ин ст ва и не дос тат ки ко да в его те ку щем со стоя нии, что бы со хра нить его

силь ные сто ро ны и из бе жать уже сде лан ных оши бок. Ка ж до му ка жет ся, что

его сис те ма бу дет луч ше, чем ны неш няя… до тех пор, по ка не вы яс нит ся, что

но вый код не луч ше, а мо жет, да же ху же, чем пре ды ду щая вер сия, – и все

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

Со про тив ляй тесь же ла нию пе ре пи сать все за но во. Луч ше все го по втор но ис-

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

код уже про тес ти ро ва ли, про ре цен зи ро ва ли и все про чее. Вы ки нуть ста рый

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

ме ся цы (или го ды) ра бо ты над про тес ти ро ван ным и про ве рен ным в бо ях ко-

дом, ко то рый мо жет со дер жать не ве до мые вам об ход ные ре ше ния или ис-

прав ле ния де фек тов. Ес ли не учесть это го, в но вом ко де мо гут про явить ся те

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

зуль та те вы по те ряе те мас су вре ме ни и сил, а так же зна ния, ко пив шие ся го-

да ми.

Мно же ст во мел ких из ме не ний луч ше, чем од но мас штаб ное. Вно ся не боль-

шие из ме не ния, лег че оце нить их воз дей ст вие на сис те му при по мо щи стан-

дарт ных ка на лов об рат ной свя зи, та ких, на при мер, как тес ти ро ва ние. Гру ст-

но ви деть, как по сле вне сен но го из ме не ния «па да ет» до б рая сот ня мо дуль ных

тес тов. Вы зван ные по доб ны ми ре зуль та та ми раз дра же ние и нер воз ность мо-

гут спро во ци ро вать вас на при ня тие со мни тель ных ре ше ний. Зна чи тель но

лег че справ лять ся, ес ли в ка ж дый мо мент вре ме ни «па да ют» лишь один-два

тес та.

Прежде чем приступать к рефакторингу

33

По сле ка ж дой ите ра ции раз ра бот ки важ но убе дить ся, что все имею щие ся

тес ты ус пеш но от ра ба ты ва ют. Ес ли имею щие ся тес ты не по кры ва ют вне-

сен ные ва ми из ме не ния, соз дай те но вые тес ты. Не вы бра сы вай те тес ты из

ста ро го ко да без дум но. Внеш не мо жет ка зать ся, что не ко то рые из них не при-

ме ни мы к но вой ар хи тек ту ре сис те мы, но бу дет со вер шен но не лиш ним по-

тра тить вре мя и ра зо брать ся, с ка кой це лью был соз дан кон крет ный тест.

Лич ные пред поч те ния и са мо лю бие ос тавь те в сто ро не. За чем чи нить то,

что и так ра бо та ет? Ес ли стиль или ор га ни за ция ко да про ти во ре чат ва шим

вку сам, это не яв ля ет ся дос та точ ной при чи ной для ре фак то рин га. Рав но как

и ва ша уве рен ность, что вы смо же те на пи сать код луч ше, чем пре ды ду щий

про грам мист.

По яв ле ние но вой тех но ло гии – не дос та точ но вес кая при чи на для про ве де ния

ре фак то рин га. Очень пло хо, ко гда за ре фак то ринг бе рут ся толь ко по то му, что

имею щий ся код на го ды от стал от кру тых но вей ших тех но ло гий, и нам ка-

жет ся, что но вый язык или плат фор ма по зво лят ре шить за да чу на мно го эле-

гант нее. Код ва шей сис те мы луч ше все го ос та вить в по кое, за ис клю че ни ем

слу ча ев, ко гда ана лиз за трат и ре зуль та тов по ка зы ва ет, что но вый язык или

плат фор ма мо гут дать су ще ст вен ный вы иг рыш в функ цио наль но сти, про сто-

те со про во ж де ния или про из во ди тель но сти.

Пом ни те, что лю ди оши ба ют ся. Но вая струк ту ра ко да не все гда га ран ти ру-

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

Мне при хо ди лось быть сви де те лем и уча ст ни ком не сколь ких про ва лив ших ся

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

оши бать ся.

97 этюдов для программистов

Осторожно: общий код

Уди Дахан

Мой­пер­вый­про­ект­в­ком­па­нии. Я толь ко что за щи тил ди плом, мне не тер пит ся

про явить се бя, так что я до позд на за си жи ва юсь на ра бо те и тща тель но изу чаю

су ще ст вую щий код. Ра бо тая над сво ей пер вой за да чей, я при ме няю все, че му ме-

ня учи ли: ком мен та рии, жур на лы со бы тий, вы де ле ние об ще го ко да в биб лио те-

ки (где это воз мож но), все де ла. Мне ка жет ся, что я пол но стью го тов к ре цен зи-

ро ва нию ко да, но кол ле ги слов но ока ты ва ют ме ня хо лод ным ду шем: я по лу чаю

за по втор ное ис поль зо ва ние ко да!

Как так? Во вре мя мо ей уче бы в кол лед же по втор ное ис поль зо ва ние ко да пре воз-

но си лось в чис ле луч ших прак тик раз ра бот ки про грамм. Все про чи тан ные мною

ста тьи и учеб ни ки, на став ляв шие ме ня опыт ные про фес сио наль ные про грам ми-

сты – не у же ли все они оши ба лись?

Ока зы ва ет ся, я упус тил из ви ду не что очень важ ное.

Кон текст.

Тот факт, что две на пря мую не свя зан ные час ти сис те мы поль зу ют ся од ной и той

же ло ги кой, оз на ча ет мень ше, чем мне ка за лось. До то го как я по мес тил об щий

код в од ну биб лио те ку, эти час ти ра бо та ли не за ви си мо од на от дру гой. Они мог ли

не за ви си мо раз ви вать ся. Ло ги ка ка ж дой из них мог ла из ме нить ся в со от вет ст-

вии с ме няю щи ми ся тре бо ва ния ми биз нес-сре ды. Те че ты ре строч ки по хо же го

ко да воз ник ли слу чай но – вре мен ная ано ма лия, сов па де ние. Ну, то есть это бы-

ло сов па де ни ем, по ка за де ло не взял ся я.

Соз дан ные мною биб лио те ки об ще го ко да свя за ли шнур ки бо ти нок в один клу-

бок. Лю бое дви же ние в пер вой пред мет ной об лас ти тре бо ва ло син хро ни за ции со

вто рой пред мет ной об ла стью. По ка функ ции бы ли не за ви си мы, стои мость их со-

про во ж де ния бы ла пре неб ре жи мо ма ла, но как толь ко по яви лась об щая биб лио-

те ка, объ е мы не об хо ди мо го тес ти ро ва ния вы рос ли на по ря док.

Осторожно: общий код

35

Со кра тив аб со лют ное чис ло строк ко да сис те мы, я вме сте с тем уве ли чил ко ли-

че ст во за ви си мо стей. Кон текст этих за ви си мо стей край не ва жен: на хо дись они

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

ес ли не дер жать эти за ви си мо сти под кон тро лем, они за пус тят свои щу паль ца

в бо лее важ ные во про сы функ цио ни ро ва ния сис те мы, да же ес ли сам по се бе код

с ви ду безу пре чен.

Ко вар ст во та ких оши бок – в пра виль но сти ос но во по ла гаю щих идей. По доб ные

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

них боль ше убыт ков, чем поль зы. Те перь, ес ли я ра бо таю с ко дом су ще ст вую ще-

го про ек та и не знаю, где мо гут ис поль зо вать ся раз лич ные его час ти, я го раз до

ос то рож нее под хо жу к со вме ст но му ис поль зо ва нию ко да.

Ос то рож нее с об щим ко дом. Изу чи те кон текст. И лишь за тем дей ст вуй те.

97 этюдов для программистов

Правило бойскаута

Роберт Мартин, известный также как «Дядюшка Боб»

У­бой­скау­тов­есть­пра­ви­ло: «Ос тавь по сле се бя ла герь чи ще, чем он был, ко гда

ты при шел». Ес ли на зем ле ва ля ет ся му сор, ты уби ра ешь его, да же ес ли на му со-

ри ли дру гие. Ты намеренно улуч ша ешь ус ло вия су ще ст во ва ния для сле дую щей

груп пы, ко то рая при дет в ла герь. (А ис ход но это пра ви ло, ус та нов лен ное ос но ва-

те лем ска ут ско го дви же ния Ро бер том Сти вен со ном Сми том Бей ден-Пау эл лом,

зву ча ло так: «По ста рай ся, что бы этот мир стал луч ше, чем до то го, как ты в не го

при шел».)

Пред ставь те, что мы сле ду ем по хо же му пра ви лу для на ше го ко да: «Все гда со-

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

ту да за гру зил». Кто бы ни на пи сал этот мо дуль из на чаль но, что ес ли по тра тить

хоть не мно го сил, что бы улуч шить его? К че му это мо жет при вес ти?

Ду маю, сле дуй мы все это му про сто му пра ви лу, нам боль ше не при шлось бы ви-

деть не умо ли мую де гра да цию на ших про грамм ных сис тем. На про тив, они ста-

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

бес по коя щим ся лишь о соб ст вен ных фраг мен тах ра бо ты, при шли бы це лые ко-

ман ды, за бо тя щие ся о сис те мах в це лом.

Мне ка жет ся, та кое пра ви ло не слиш ком слож но в ис пол не нии. Не обя за тель но

до во дить до со вер шен ст ва ка ж дый мо дуль, ко то рый вы воз вра щае те в ре по зи то-

рий. Про сто сде лай те его чуть луч ше, чем он был, ко гда по пал к вам в ру ки. Ес те-

ст вен но, это оз на ча ет, что, рас ши ряя мо ду ли соб ст вен ным ко дом, вы соз дае те чис-

тый код. Кро ме то го, нуж но на вес ти по ря док хо тя бы еще в од ном мес те, пре ж де

чем со хра нять мо дуль. Дос та точ но лишь дать ка кой-то пе ре мен ной бо лее удач ное

имя или раз бить длин ную функ цию на две бо лее ко рот ких. Мож но уст ра нить

цик ли че скую за ви си мость или до ба вить ин тер фейс, уст ра няю щий за ви си мость

меж ду по ли ти кой и реа ли за ци ей.

Правило бойскаута

37

Че ст но го во ря, мне ка жет ся, что это обыч ные пра ви ла при ли чия – как мыть ру-

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

пря мо, ос тав лять бес по ря док в ко де долж но быть столь же со ци аль но не при ем-

ле мо, как со рить на ули це. Та ко го по про сту не сле ду ет де лать.

Здесь скры то боль ше, чем ка жет ся. Од но де ло – сле дить за по ряд ком в соб ст вен-

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

по мо га ют од на дру гой и под чи ща ют код од на за дру гой. Ка ж дая сле ду ет пра ви-

лу бой скау та, по то му что оно при но сит поль зу всем, а не толь ко од ной кон крет-

ной ко ман де.

97 этюдов для программистов

Прежде чем пенять на других,

проверь собственный код

Аллан Келли

Раз­ра­бот­чи­ку­–­лю­бо­му­из­нас!­– час то бы ва ет труд но при знать, что его код не

ра бо та ет. Это ка жет ся на столь ко не прав до по доб ным, что мы ско рее го то вы до-

пус тить на ли чие ошиб ки в ком пи ля то ре.

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

из-за ошиб ки в ком пи ля то ре, ин тер пре та то ре, опе ра ци он ной сис те ме, сер ве ре

при ло же ний, ба зе дан ных, ме нед же ре па мя ти или лю бом дру гом эле мен те сис-

тем но го про грамм но го обес пе че ния. Да, там встре ча ют ся ошиб ки, но го раз до ре-

же, чем нам хо те лось бы ду мать.

Од на ж ды я дей ст ви тель но столк нул ся с ошиб кой в ком пи ля то ре (уда ле ние пе ре-

мен ной цик ла при оп ти ми за ции), но во всех ос таль ных слу ча ях мои пре тен зии

к ком пи ля то ру или опе ра ци он ной сис те ме ока зы ва лись бес поч вен ны ми. Я тра-

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

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

ошиб ка – моя соб ст вен ная.

Ко гда при ме няе мые в про ек те сред ст ва раз ра бот ки про ве ре ны вре ме нем, ши ро-

ко ис поль зу ют ся и вхо дят в мно го чис лен ные тех но ло ги че ские це поч ки, нет осо-

бых ос но ва ний со мне вать ся в их ка че ст ве. Ко неч но, ес ли это од на из ран них вер-

сий ин ст ру мен та, или им поль зу ют ся лишь не сколь ко че ло век в ми ре, или это

ред ко за гру жае мый про ект с от кры тым ис ход ным ко дом и но ме ром вер сии 0.1,

впол не мож но за по доз рить этот ин ст ру мент. (Точ но так же мож но с по доз ре ни ем

от не стись к аль фа-вер сии ком мер че ско го ин ст ру мен та.)

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

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

ком пи ля тор оши ба ет ся. Тут дей ст ву ют все обыч ные со об ра же ния по от лад ке:

изо ли ро вать про бле му, по ста вить за глуш ки вме сто вы зо вов, ок ру жить про блем-

ный уча сток про вер ка ми; про ве рить вы пол не ние со гла ше ний по вы зо вам, об щие

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

ли стек, и ус та но вить со от вет ст вие ти пов пе ре мен ных; по про бо вать вы пол нить

Прежде чем пенять на других, проверь собственный код

39

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

доч ной и окон ча тель ной (release).

Под вер гай те со мне нию соб ст вен ные до пу ще ния и до пу ще ния дру гих лю дей. До-

пу ще ния в ос но ве ра бо ты ин ст ру мен тов раз ных про из во ди те лей мо гут не сов па-

дать; то же вер но и для раз ных ин ст ру мен тов од но го и то го же про из во ди те ля.

Ес ли кол ле га со об ща ет об ошиб ке, ко то рую вы не мо же те вос про из ве сти, по дой-

ди те и по смот ри те, как она у не го воз ни ка ет. Его дей ст вия или по сле до ва тель-

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

Моя лич ная сис те ма та ко ва: ес ли я не мо гу об на ру жить ошиб ку и на чи наю гре-

шить на ком пи ля тор, при шло вре мя про ве рить це ло ст ность сте ка. Это осо бен но

по лез но, ко гда при до бав ле нии ко да трас си ров ки ло ка ли за ция про бле мы ме-

ня ет ся.

Мно го по точ ность – еще один ис точ ник оши бок, из-за ко то рых про грам ми сты

на чи на ют орать на ком пь ю тер и рань ше сро ка се де ют. Все со ве ты пи сать про стой

код мно го крат но уве ли чи ва ют ся в це не для мно го по точ ных сис тем. При по ис ке

та ких оши бок труд но сис тем но по ла гать ся на от лад ку и мо дуль ное тес ти ро ва-

ние, по это му про сто та кон ст рук ции при об ре та ет пер во сте пен ное зна че ние.

Итак, пре ж де чем за бра сы вать об ви не ния ми ком пи ля тор, вспом ни те со вет Шер-

ло ка Хол мса – «Ес ли ис клю чить все не воз мож ное, то, что ос та нет ся, и бу дет ис-

ти ной, ка кой бы не прав до по доб ной она ни ка за лась» – и сле дуй те ему, а не со ве-

ту Дир ка Джент ли1: «Ес ли ис клю чить все не прав до по доб ное, то, что ос та нет ся,

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

1

Дирк Джентли – персонаж Дугласа Адамса, который, как и Шерлок Холмс, занимал-

ся детективными расследованиями и держал собственное детективное агентство. –

Прим. ред.

97 этюдов для программистов

Тщательно выбирайте

инструменты

Джованни Аспрони

Со­вре­мен­ные­при­ло­же­ния­край­не­ред­ко­соз­да­ют­«с­чис­то­го­лис­та». Их со би ра-

ют из уже су ще ст вую щих ку би ков – ком по нен тов, биб лио тек и фрейм вор ков,

и то му есть ряд вес ких при чин:

Объ е мы, слож ность и изо щрен ность при ло же ний рас тут, а вре ме ни на их соз-

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

чи ков на код биз нес-ло ги ки, чем на код ин фра струк ту ры при ло же ния.

В ши ро ко ис поль зуе мых ком по нен тах и фрейм вор ках мень ше шан сов столк-

нуть ся с ошиб ка ми, чем в раз ра бо тан ных са мо стоя тель но.

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

бла го да ря че му сни жа ют ся за тра ты на раз ра бот ку и уп ро ща ет ся по иск за ин-

те ре со ван ных раз ра бот чи ков с нуж ным опы том.

Соз да ние и со про во ж де ние про грамм но го обес пе че ния тре бу ет боль шо го объ-

е ма че ло ве че ско го тру да, по это му бы ва ет де шев ле ку пить го то вые про дук ты,

чем соз да вать их.

Од на ко пра виль ный вы бор ин гре ди ен тов для но во го при ло же ния мо жет ока зать-

ся слож ной за да чей, тре бую щей взве шен но го под хо да. Де лая свой вы бор, нуж но

учи ты вать не сколь ко фак то ров:

Ка ж дый ин ст ру мент рас счи тан на при ме не ние в оп ре де лен ном кон тек сте,

в ко то рый вхо дят ин фра струк ту ра, мо дель управ ле ния, мо дель дан ных, ком-

му ни ка ци он ные про то ко лы и то му по доб ное, вслед ст вие че го мо жет воз ни-

кать не со от вет ст вие ин ст ру мен тов ар хи тек ту ре при ло же ния. Та кое не со-

от вет ст вие при во дит к не об хо ди мо сти при ме нять «гряз ные» ме то ды и об ход-

ные мар шру ты при ре ше нии за дач, что не оп рав дан но ус лож ня ет код.

У ка ж до го ин ст ру мен та соб ст вен ный гра фик вы хо да но вых вер сий, и об нов-

ле ние ка ко го-ли бо из них мо жет стать чрез вы чай но слож ной и за трат ной по

вре ме ни за да чей, по сколь ку но вая функ цио наль ность, ар хи тек тур ные из ме-

не ния и да же ис прав ле ния, свя зан ные с ошиб ка ми, ино гда при во дят к не со-

Тщательно выбирайте инструменты

41

вмес ти мо сти с дру ги ми ин ст ру мен та ми. Чем боль ше в про ек те ин ст ру мен тов,

тем ост рее мо жет ста но вить ся эта про бле ма.

Есть ин ст ру мен ты, тре бую щие серь ез ной на строй ки, час то в ви де од но го или

не сколь ких кон фи гу ра ци он ных фай лов XML, ко ли че ст во и раз мер ко то рых

мо жет бы ст ро вый ти из-под кон тро ля. В ито ге при ло же ние вы гля дит так,

буд то оно на пи са но на XML, и лишь вдо ба вок к это му име ет ся куч ка строк

ко да на од ном из язы ков про грам ми ро ва ния. Слож ность кон фи гу ри ро ва ния

за труд ня ет со про во ж де ние и даль ней шее раз ви тие при ло же ния.

Мо жет воз ник нуть же ст кая при вяз ка к оп ре де лен но му про из во ди те лю (ven-

dor lock-in), ко гда код, ин тен сив но ис поль зую щий его про дук ты, вдруг ока зы-

ва ет ся ог ра ни чен та ки ми па ра мет ра ми, как про сто та со про во ж де ния, про из-

во ди тель ность, воз мож ность раз ви тия, це на и дру ги ми.

Ес ли пла ни ру ет ся ис поль зо вать бес плат ное про грамм ное обес пе че ние, мо жет

вы яс нить ся, что на прак ти ке оно не та кое уж и бес плат ное. Воз мож но, при-

дет ся оп ла чи вать ком мер че скую под держ ку это го про грамм но го про дук та,

а она мо жет ока зать ся не де ше вой.

Нуж но учи ты вать ус ло вия ли цен зи он ных со гла ше ний, да же ес ли это бес плат-

ное про грамм ное обес пе че ние. На при мер, в не ко то рых ком па ни ях не до пус ка-

ет ся ис поль зо ва ние про грамм но го обес пе че ния с ли цен зи ей GNU по при чи не

его ви рус ной при ро ды, в том смыс ле, что та кая ли цен зия по зво ля ет рас про-

стра нять но вый про дукт толь ко со вме ст но с его ис ход ным ко дом.

Моя лич ная стра те гия смяг че ния этих про блем со сто ит в том, что бы на чи нать

с ма ло го – лишь с тех ин ст ру мен тов, ко то рые аб со лют но не об хо ди мы. Как пра ви-

ло, на стар те са мое глав ное – уст ра нить не об хо ди мость про грам ми ро ва ния ин-

фра струк ту ры низ ко го уров ня (и со пут ст вую щих про блем). Ска жем, в слу чае ра-

бо ты над рас пре де лен ным при ло же ни ем это дос ти га ет ся по сред ст вом ис поль зо-

ва ния свя зую ще го про грамм но го обес пе че ния (middleware) вме сто ра бо ты с со ке-

та ми на пря мую. За тем при не об хо ди мо сти мож но до ба вить дру гие ин ст ру мен ты.

Кро ме то го, я ста ра юсь от де лить внеш ние ин ст ру мен ты от объ ек тов мо ей пред-

мет ной об лас ти с по мо щью ин тер фей сов и сло ев. Это по зво ля ет с ми ни маль ны ми

по те ря ми за ме нить ка кой-ли бо ин ст ру мент, ес ли по на до бит ся. По ло жи тель ный

по боч ный эф фект та ко го под хо да – как пра ви ло, на вы хо де я по лу чаю при ло же-

ние мень ше го раз ме ра и с мень шим ко ли че ст вом внеш них ин ст ру мен тов, чем из-

на чаль но пред по ла га лось.

97 этюдов для программистов

Пишите код

на языке предметной области

Дэн Норт

Пред­ставь­те­се­бе­текст­двух­про­грамм. В од ной вы встре чае те та кое:

if (portfolioIdsByTraderId.get(trader.getId())

containsKey(portfolio.getId())) {...}

Вы че ше те за ты лок, пы та ясь ос мыс лить, что де ла ет этот код. По хо же, он по лу-

ча ет иден ти фи ка тор объ ек та трей де ра, и по это му иден ти фи ка то ру на хо дит ся

ас со циа тив ный мас сив в, э-э-э… оче вид но, ас со циа тив ном мас си ве ас со циа тив-

ных мас си вов; за тем про ве ря ет ся, есть ли в этом внут рен нем мас си ве еще один

иден ти фи ка тор – из объ ек та порт фе ля. Вы сно ва че ше те за ты лок. Ище те объ яв-

ле ние пе ре мен ной portfolioIdsByTraderId и об на ру жи вае те сле дую щее:

Map<int, Map<int, int>> portfolioIdsByTraderId;

По нем но гу вы на чи нае те по ни мать, что это как-то свя за но с на ли чи ем у трей де-

ра дос ту па к оп ре де лен но му порт фе лю. Ко неч но, вы най де те та кой же фраг мент

по ис ка – а ско рее по хо жий, но не мно го от ли чаю щий ся код, – ко гда в дру гом мес-

те по на до бит ся уз нать, есть ли у трей де ра дос туп к не ко то ро му порт фе лю.

В тек сте дру гой про грам мы вы ви ди те:

if (trader.canView(portfolio)) {...}

Ни ка ких го ло во ло мок. Вам не нуж но знать, как объ ект трей де ра оп ре де ля ет

дос туп ность порт фе ля. Где-то в не драх про грам мы, на вер ное, все же за рыт ас со-

циа тив ный мас сив ас со циа тив ных мас си вов. Но это за бо ты объ ек та trader, а не

ва ши.

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

Дав ным-дав но у нас бы ли толь ко са мые эле мен тар ные струк ту ры дан ных: би ты,

бай ты и сим во лы (на са мом де ле, те же бай ты, но мы де ла ли вид, что это бу к вы

и спе ци аль ные сим во лы). С де ся тич ны ми чис ла ми вы хо ди ло по слож нее, ведь

счис ле ние по ос но ва нию 10 пло хо впи сы ва ет ся в дво ич ную сис те му, так что у нас

бы ло не сколь ко раз ме ров для чи сел с пла ваю щей за пя той. За тем по яви лись

Пишите код на языке предметной области

43

мас си вы и стро ки (по су ти, раз но вид ность мас си вов). По том в на шем рас по ря же-

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

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

Тер мин «ком пь ю тер ная нау ка» то гда оз на чал в ос нов ном тру до ем кое ото бра же-

ние ре аль но го ми ра на на ши ог ра ни чен ные струк ту ры дан ных. На стоя щие гу ру

мо гут да же вспом нить, как имен но уда ва лось ре шать за да чу.

За тем по яви лись поль зо ва тель ские ти пы! Лад но, это ни для ко го не но вость, но

они не сколь ко ме ня ют пра ви ла иг ры. Ес ли в ва шей пред мет ной об лас ти есть та-

кие по ня тия, как «трей дер» и «порт фель», вы мо же те мо де ли ро вать их с по мо-

щью ти пов, на зна чив ти пам та кие име на, как Trader и Portfolio. Но, что еще важ-

нее, и от но ше ния меж ду ти па ми мож но мо де ли ро вать че рез тер ми ны из той же

пред мет ной об лас ти.

Ес ли вы не ис поль зуе те в ко де тер ми ны пред мет ной об лас ти, зна чит вы фор ми-

руе те под ра зу ме вае мое (чи тай: сек рет ное) пра ви ло, что вот эта пе ре мен ная ти-

па int в этом мес те обо зна ча ет трей де ра, а вон то int в том мес те обо зна ча ет порт-

фель. (И луч ше их не пу тать!) А ес ли вы реа ли зуе те не ко то рое биз нес-пра ви ло

(«не ко то рым трей де рам нель зя про смат ри вать не ко то рые порт фе ли – это не за-

кон но») с по мо щью не три ви аль но го ал го рит ма в ко де, – на при мер по ис ка су ще-

ст во ва ния зна че ния в ас со циа тив ном мас си ве, – вы вряд ли об лег чае те жизнь

ре бя там, ко то рые бу дут про во дить ау дит и про вер ку на со от вет ст вие за ко но да-

тель ст ву.

Сле дую ще му про грам ми сту, ко то рый бу дет ра бо тать с этим ко дом, ва ше тай ное

зна ние мо жет быть не дос туп но, так по че му не опи сать все яв но? При ме не ние од-

но го клю ча для по ис ка дру го го, ис поль зуе мо го в про вер ке су ще ст во ва ния, не

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

ся, что та ким об ра зом реа ли зу ют ся биз нес-пра ви ла, пре пят ст вую щие кон флик-

ту ин те ре сов?

Яв ное при ме не ние по ня тий пред мет ной об лас ти в ко де да ет воз мож ность дру гим

про грам ми стам по нять его на зна че ние со зна чи тель но мень ши ми уси лия ми, чем

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

ти. Кро ме то го, при со вер шен ст во ва нии мо де ли пред мет ной об лас ти, ко то рое

про ис хо дит по ме ре рас ши ре ния ва ших зна ний о ней, вам бу дет лег че до ра ба ты-

вать код. Ес ли пра виль но ор га ни зо вать ин кап су ля цию, ве ли ки шан сы, что пра-

ви ло бу дет рас по ла гать ся в од ном-един ст вен ном мес те, и вы смо же те ме нять его

так, что ни ка кой вы зы ваю щий код это го не за ме тит.

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

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

97 этюдов для программистов

Код – это проектирование

Райан Браш

Пред­ставь­те­ се­бе,­ вы­ ут­ром­ про­сы­пае­тесь­ и уз нае те, что в строи тель ной про-

мыш лен но сти про изо шел эпо халь ный про рыв. Те перь мил лио ны де ше вых и не-

ве ро ят но бы ст рых ро бо тов уме ют соз да вать раз лич ные ма те риа лы бу к валь но из

воз ду ха, поч ти не рас хо дуя энер гии, и са ми се бя чи нят. Но это еще не все: ес ли

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

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

Мож но пред ста вить се бе, как это пре об ра зит строи тель ную про мыш лен ность,

но ка кие из ме не ния про изой дут на бо лее вы со ком уров не? Как по ве дут се бя ар-

хи тек то ры и про ек ти ров щи ки, ко гда стои мость строи тель ст ва ста нет пре неб ре-

жи мо ма ла? Се го дня до ро го стоя ще му строи тель ст ву обя за тель но пред ше ст ву ет

соз да ние и тща тель ное тес ти ро ва ние фи зи че ских и ком пь ю тер ных мо де лей. Ста-

нем ли мы так ут ру ж дать се бя, ес ли строи тель ст во бу дет фак ти че ски бес плат-

ным? Что за про бле ма, ес ли зда ние раз ва лит ся? Най дем, в чем ошиб ка, и на ши

чу до-ро бо ты по стро ят нам но вое.

Воз мож ны и дру гие по след ст вия. С ухо дом в про шлое мо де лей не до ве ден ные до

кон ца про ек ты зда ний бу дут раз ви вать ся по ме ре то го, как зда ние раз за ра зом

стро ит ся за но во, и про ек ти ров щи ки вно сят в не го улуч ше ния, имея в ви ду же-

лае мую ко неч ную цель. Сто рон не му на блю да те лю труд но бу дет от ли чить не за-

кон чен ный про ект зда ния от сдан но го в экс плуа та цию объ ек та.

На ша спо соб ность пред ска зы вать сро ки ра бот уй дет в не бы тие. Стои мость строи-

тель ст ва лег че рас счи тать, чем стои мость про ек ти ро ва ния: мы при мер но зна ем,

сколь ко сто ит ус та нов ка бал ки и сколь ко ба лок нам нуж но. По сколь ку до ля

пред ска зуе мых за дач стре мит ся к ну лю, пре об ла даю щее зна че ние ста нет иметь

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

но пла ни ро ва ние ра бот ста но вит ся не на деж ным.

Ко неч но, кон ку рен ция ос та нет ся дей ст вую щим фак то ром. Ко гда стои мость строи-

тель ст ва ни чтож на, пре иму ще ст во на рын ке по лу ча ет ком па ния, спо соб ная бы ст-

ро вы пол нять про ек ти ро ва ние. Ос нов ным ин те ре сом ин же нер ных кон тор, та ким

Код – это проектирование

45

об ра зом, ста нет ус ко рен ное про ек ти ро ва ние. Не из беж но про изой дет так, что

кто-то, не об ла дая глу бо ким по ни ма ни ем про ек та, уви дит не про ве рен ный ва ри-

ант, осоз на ет пре иму ще ст ва вы хо да на ры нок с опе ре же ни ем кон ку рен тов и ска-

жет: «Лад но, и так сой дет».

Не ко то рые про ек ты, свя зан ные с жиз нью и здо ровь ем лю дей, бу дут про ра ба ты-

вать ся тща тель нее, но во мно гих слу ча ях по ку па те ли при вы ка ют тер петь не-

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

все гда мо гут по слать сво их чу до-ро бо тов и «за ла тать» про дан ные ими бра ко ван-

ные зда ния или ав то мо би ли. Все это при во дит нас к не ожи дан но му за клю че-

нию: на шей един ст вен ной от прав ной точ кой бы ло рез кое сни же ние стои мо сти

строи тель ст ва, а в ре зуль та те мы по лу чи ли сни же ние ка че ст ва.

Не сто ит удив лять ся, что рас ска зан ная ис то рия ста ла ре аль но стью в про грамм-

ной ин ду ст рии. Ес ли мы со гла сим ся, что ос но ву ко да со став ля ет про ек ти ро ва-

ние – твор че ский, а не ме ха ни че ский про цесс, – это объ яс ня ет кри зис про грамм-

ной от рас ли. У нас кри зис про ек ти ро ва ния: по треб ность в ка че ст вен ных, про ве-

рен ных ар хи тек тур ных ре ше ни ях для при ло же ний пре вы ша ет на ши спо соб но-

сти их соз да вать. Об стоя тель ст ва вы ну ж да ют ра бо тать на ос но ве не за вер шен ных

про ек тов.

К сча стью, эта же мо дель со дер жит под сказ ки, как улуч шить по ло же ние. Фи зи-

че ское мо де ли ро ва ние рав но силь но ав то ма ти зи ро ван но му тес ти ро ва нию: ар хи-

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

су ро вой про вер ке на бо ром тес тов. Что бы сде лать та кие тес ты бо лее эф фек тив ны-

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

сис тем. Со вер шен ст во ва ние язы ков и прак тик про ек ти ро ва ния да ет нам на де ж-

ду. На ко нец, есть не ос по ри мый факт: вы даю щие ся про ек ты зда ний соз да ют ся

вы даю щи ми ся про ек ти ров щи ка ми, по свя тив ши ми се бя ов ла де нию сво им мас-

тер ст вом. С на пи са ни ем ко да все точ но так же.

97 этюдов для программистов

Важность форматирования кода

Стив Фримен

В­не­за­па­мят­ные­вре­ме­на­я ра бо тал над про ек том на язы ке COBOL, в ко то ром

всем уча ст ни кам за пре ща лось из ме нять раз мер от сту па, ес ли не бы ло не об хо ди-

мо сти из ме нить код. Все по то му, что од на ж ды кто-то что-то сло мал – стро ка ко-

да пе ре полз ла на сле дую щую и по па ла в спе ци аль ные ко лон ки в на ча ле стро ки.

За прет дей ст во вал, да же ес ли фор ма ти ро ва ние ко да вво ди ло в за блу ж де ние, –

а та кое слу ча лось, – так что при хо ди лось очень вни ма тель но чи тать код, ведь

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

по то му что она тор мо зи ла ра бо ту про грам ми стов.

Ис сле до ва те ли по ка за ли, что у про грам ми ста от ни ма ет боль ше вре ме ни пе ре ме-

ще ние по ко ду и его чте ние (что бы най ти то ме сто, ко то рое нуж но из ме нить),

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

Вот три спо со ба это сде лать.

Воз мож ность бы ст ро го про смот ра

Зре ние че ло ве ка пре крас но при спо соб ле но для по ис ка в по то ке нуж но го не-

зна чи мо го (пе ре жи ток тех вре мен, ко гда нам при хо ди лось бди тель но сле дить,

не по явил ся ли в са ван не лев). Ста ло быть, я мо гу об лег чить се бе жизнь тем,

что стан дар ти зи рую и убе ру на зад ний план все не свя зан ное с пред мет ной

об ла стью – всю «слу чай ную слож ность», вно си мую боль шин ст вом ком мер че-

ских язы ков. Ес ли код с оди на ко вым по ве де ни ем и вы гля дит оди на ко во, моя

сис те ма вос при ятия по мо жет мне бы ст ро на хо дить от ли чия. По это му я так же

со блю даю со гла ше ния о раз ме ще нии чле нов клас са внут ри ком пи ли руе мо го

фай ла: кон стан ты, по ля, от кры тые ме то ды, за кры тые ме то ды.

Вы ра зи тель ная вер ст ка

Все мы на учи лись не жа леть вре ме ни на вы бор под хо дя щих имен – со гла си-

тесь, это при бли жа ет наш код к вы ра зи тель но му опи са нию вы пол няе мых дей-

ст вий и от ли ча ет его от про сто го пе ре чис ле ния ша гов. Вер ст ка ко да – дру гая

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

ко ман да раз ра бот ки со гла си лась ис поль зо вать про грам му ав то ма ти че ско го

Важность форматирования кода

47

фор ма ти ро ва ния для ос нов ных кон ст рук ций. Соб ст вен ные по прав ки в фор ма-

ти ро ва ние ко да я мо гу вно сить вруч ную во вре мя ко ди ро ва ния. Ес ли не воз ни-

ка ет ост рых раз но гла сий, ко ман да бы ст ро при хо дит к об ще му сти лю, «до ве-

ден но му вруч ную». Сред ст во ав то ма ти че ско го фор ма ти ро ва ния не в со стоя-

нии по нять мои на ме ре ния (мне ли не знать, я ко гда-то сам на пи сал та кую

про грам му), а мне бо лее важ но, что бы пе ре но сы строк и груп пи ров ка строк

от ра жа ли смысл ко да, а не син так сис язы ка. (Ке вин Мак гвайр1 вы ле чил мою

раб скую за ви си мость от средств ав то ма ти че ско го фор ма ти ро ва ния ко да.)

Ком пакт ный фор мат

Чем боль ше ко да уме ща ет ся на эк ра не, тем боль ше ко да я ви жу без раз ры ва

кон тек ста, воз ни каю ще го при про крут ке тек ста на эк ра не и при пе ре клю че-

нии меж ду фай ла ми. Тем мень ше ин фор ма ции о кон тек сте мне нуж но дер-

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

смысл во вре ме на вось ми бу к вен ных имен фай лов и по строч ных прин те ров,

но се го дня я ра бо таю в ин тег ри ро ван ной сре де раз ра бот ки с под держ кой цвет-

ной под свет ки син так си са и пе ре кре ст ных ссы лок. Те перь ме ня ог ра ни чи ва ет

раз ре ше ние эк ра на, и ка ж дый его пик сел дол жен ра бо тать та ким об ра зом,

что бы об лег чить мне по ни ма ние ко да. Я хо чу, что бы фор ма ти ро ва ние по мо га-

ло мне по ни мать код, и не бо лее то го.

Мой друг (не про грам мист) од на ж ды за ме тил, что код по хож на сти хи. У ме ня

воз ни ка ет та кое же ощу ще ние при ви де дей ст ви тель но хо ро ше го ко да: ка ж дый

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

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

со чи не ние сти хо тво ре ний.

1

Кевин Макгвайр Kevin McGuire) – в свое время один из ведущих разработчиков Ec-

lip se, интегрированной среды разработки для Java. – Прим. перев.

97 этюдов для программистов

Рецензирование кода

Маттиас Карлссон

Про­во­дить­ре­цен­зи­ро­ва­ние­ко­да­(code­review)­не­об­хо­ди­мо. По че му? Оно по вы-

ша ет ка че ст во ко да и сни жа ет от но си тель ную до лю де фек тов. Но вы, воз-

мож но, не вер но пред став ляе те се бе, по че му так про ис хо дит.

Мно гие про грам ми сты не при яз нен но от но сят ся к ре цен зи ро ва нию, что бы ва ет

свя за но с их не удач ным лич ным опы том. Мне встре ча лись ор га ни за ции, где

весь код про хо дил фор маль ное ре цен зи ро ва ние, пре ж де чем он мог по пасть в сис-

те му для ком мер че ско го ис поль зо ва ния. Час то ре цен зи ро ва ние про во дит ар хи-

тек тор или ве ду щий раз ра бот чик – прак ти ка, ко то рую мож но на звать « ар хи-

тек тор про ве ря ет все». Это за пи са но в ру ко во дстве по про цес су раз ра бот ки про-

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

Воз мож но, в не ко то рых ор га ни за ци ях дей ст ви тель но не об хо дим та кой стро гий

и фор маль ный про цесс, но та ких мень шин ст во. В боль шин ст ве же ор га ни за ций

по доб ный под ход контр про дук ти вен. Ав то ры ре цен зи руе мо го ко да слов но пред-

ста ют пе ред ко мис си ей по дос роч но му ос во бо ж де нию. Ре цен зи рую щим тре бу ет-

ся ус пе вать и чи тать код, и от сле жи вать все осо бен но сти эво лю цио ни рую щей

сис те мы: они мо гут бы ст ро стать уз ким ме стом все го про цес са, так что про цесс

вско ре де гра ди ру ет.

Ре цен зи ро ва ние ко да долж но быть не про сто ме то дом ис прав ле ния оши бок в ко-

де, а сред ст вом рас про стра не ния зна ний и ус та нов ле ния об щих ос нов на пи са-

ния ко да. Дав дру гим про грам ми стам по зна ко мить ся со сво им ко дом, вы тем са-

мым де лае те ка ж до го сов ла дель цем ко да. Пусть лю бой из уча ст ни ков ко ман ды

прой дет ся по ко ду вме сте с ос таль ны ми. Не нуж но ис кать ошиб ки; при ре цен зи-

ро ва нии ко да нуж но ста рать ся изу чить его и по нять, как он ра бо та ет.

Во вре мя ре цен зи ро ва нии ко да будь те доб ро же ла тель ны. Ком мен та рии долж ны

быть кон ст рук тив ны ми, а не кол ки ми. На значь те ро ли для про ве де ния ре цен-

зи ро ва ния, что бы не по лу чи лось, что на оцен ку ко да влия ют от но ше ния стар-

шин ст ва в ко ман де. На при мер, один ре цен зент мо жет со сре до то чить ся на до ку-

мен та ции, дру гой – на ис клю че ни ях, а тре тий – рас смот реть функ цио наль ность.

Рецензирование кода

49

При та ком под хо де на груз ка по ре цен зи ро ва нию бо лее рав но мер но рас пре де лит-

ся меж ду чле на ми ко ман ды.

До го во ри тесь, что оп ре де лен ный день не де ли бу дет ре гу ляр ным днем ре цен зи ро-

ва ния ко да. Вы де ли те для это го ме ро прия тия па ру ча сов. Ка ж дый раз ме няй те

ав то ра ре цен зи руе мо го ко да по кру гу. Кро ме то го, не за бы вай те на ка ж дом со б-

ра нии по ре цен зи ро ва нию ме нять ро ли уча ст ни ков ре цен зи ро ва ния. Во вле кай-

те в ре цен зи ро ва ние но вич ков. Не смот ря на ма лый опыт, они мо гут дать вам но-

вую точ ку зре ния бла го да ря сво им све жим уни вер си тет ским зна ни ям. При вле-

кай те экс пер тов – они об ла да ют опы том и зна ния ми. Они бы ст рее и точ нее ука-

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

ес ли со гла ше ния ко ман ды по на пи са нию ко да про ве ря ют ся ав то ма ти зи ро ван-

ным ин ст ру мен том. В этом слу чае на со б ра нии по ре цен зи ро ва нию ни ко гда не

при дет ся об су ж дать фор ма ти ро ва ние ко да.

По жа луй, в глав ной ме ре ус пех ре цен зи ро ва ния оп ре де ля ет ся тем, бу дет ли оно

ин те рес но лю дям. Ре цен зи ро ва ние ори ен ти ро ва но на уча ст вую щих в нем лю-

дей. Ес ли со б ра ние по ре цен зи ро ва нию про хо дит в не при ят ной или скуч ной ат-

мо сфе ре, труд но бу дет ко го-ли бо мо ти ви ро вать. Про во ди те ре цен зи ро ва ние ко да

в не фор маль ной об ста нов ке, и пусть глав ной за да чей ме ро прия тия ста нет рас-

про стра не ние зна ний сре ди чле нов ко ман ды. Ос тавь те в сто ро не сар казм, а вме-

сто не го при не си те тор тик или бу тер бро ды.

97 этюдов для программистов

Пиши код с умом

Йехиль Кимхи

По­пыт­ки­ до­ка­зать­ кор­рект­ность­ про­грамм­но­го­ обес­пе­че­ния­ вруч­ную при во-

дят к фор маль но му до ка за тель ст ву, ко то рое длин нее са мо го ко да и со дер жит

ошиб ки с боль шей ве ро ят но стью, чем сам код. Же ла тель но при ме нять ав то ма-

ти зи ро ван ные сред ст ва, но это не все гда воз мож но. Ни же опи сы ва ет ся сре дин-

ный путь: по лу фор маль ное до ка за тель ст во кор рект но сти.

Ме тод ос но ван на раз де ле нии ис сле дуе мо го ко да на ко рот кие фраг мен ты раз ме-

ром от од ной стро ки, ко то рая мо жет со дер жать вы зов функ ции, до бло ков дли-

ной не бо лее 10 строк и об су ж де нии их кор рект но сти. До ка за тель ст во долж но

ока зать ся дос та точ но убе ди тель ным для ва ше го кол ле ги, иг раю ще го роль «ад-

во ка та дья во ла».

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

состоя ние про грам мы (а имен но счет чик ад ре са ко манд и зна че ния всех «жи вых»

объ ек тов) удов ле тво ря ло про сто му в опи са нии свой ст ву, а функ цио наль ность

это го фраг мен та (пре об ра зо ва ние со стоя ния) лег ко опи сы ва лась в ви де од ной не-

за ви си мой за да чи. Со блю де ние пред ло жен ных пра вил уп ро ща ет ве де ние до ка-

за тель ст ва. Та кие свой ст ва ко неч ной точ ки фраг мен та обоб ща ют по ня тия пре д-

усло вий и по сту сло вий для функ ций, а так же ин ва ри ан тов для цик лов и клас-

сов (в от но ше нии эк зем п ля ров клас сов). Не об хо ди мо стре мить ся, что бы фраг-

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

и очень при го дит ся, ес ли пред по ла га ет ся из ме нять эти фраг мен ты.

Мно гие хо ро шо из вест ные (хо тя и, ви ди мо, ре же при ме няе мые) и имею щие ста-

тус «ка че ст вен ных» прак ти ки на пи са ния ко да так же об лег ча ют про ве де ние до-

ка за тельств. Та ким об ра зом, од но лишь на ме ре ние про вес ти в бу ду щем до ка за-

тель ст во кор рект но сти сво его ко да спо соб ст ву ет улуч ше нию его сти ля и струк-

ту ры. Не сто ит удив лять ся, что боль шин ст во по доб ных прак тик про ве ря ет ся

ста ти че ски ми ана ли за то ра ми ко да:

Из бе гай те опе ра то ров goto, по то му что они соз да ют силь ную за ви си мость меж-

ду фраг мен та ми, раз не сен ны ми в ко де.

Пиши код с умом

51

Из бе гай те из ме няе мых гло баль ных пе ре мен ных, по то му что они де ла ют за-

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

Об ласть ви ди мо сти ка ж дой пе ре мен ной долж на быть наи мень шей из воз мож-

ных. На при мер, ло каль ный объ ект мож но объ я вить не по сред ст вен но пе ред

пер вым ис поль зо ва ни ем.

Де лай те объ ек ты не из ме няе мы ми ( immutable), где это воз мож но.

Улуч шай те чи тае мость ко да по сред ст вом про бе лов – как го ри зон таль ных, так

и вер ти каль ных. На при мер, вы рав ни вай те от сту пы для род ст вен ных струк-

тур и раз де ляй те фраг мен ты ко да пус ты ми стро ка ми.

Пи ши те са мо до ку мен ти руе мый код, вы би рая со дер жа тель ные (но дос та точ но

ко рот кие) име на для объ ек тов, функ ций, ти пов и т. д.

Ес ли фраг мент ока зы ва ет ся вло жен ным, пре вра ти те его в функ цию.

Ка ж дая функ ция долж на ре шать един ст вен ную за да чу и быть ко рот кой. Ог ра-

ни че ние дли ны функ ции 24 стро ка ми, вве ден ное мно го лет на зад, по-преж не-

му дей ст ву ет. Раз мер и раз ре ше ние эк ра на по срав не нию с 60-ми го да ми про-

шло го ве ка уве ли чи лись, но че ло ве че ские воз мож но сти вос при ятия ос та лись

преж ни ми.

У функ ции не долж но быть мно го ар гу мен тов (хо ро шая прак ти ка – не бо лее

че ты рех). Это не ог ра ни чи ва ет объ ем пе ре да вае мых функ ции дан ных: объ еди-

не ние род ст вен ных ар гу мен тов в од ном объ ек те ло ка ли зу ет ин ва ри ан ты объ-

ек та, что уп ро ща ет до ка за тель ст во в пла не про вер ки со гла со ван но сти и со-

стоя ний объ ек тов.

В об щем слу чае ка ж дая еди ни ца ко да, на чи ная с фраг мен та и за кан чи вая це-

лой биб лио те кой, долж на иметь ог ра ни чен ный ин тер фейс. Со кра ще ние по то-

ка ин фор ма ции уп ро ща ет до ка за тель ст во. Это оз на ча ет, что сле ду ет из бе гать

ме то дов, воз вра щаю щих внут рен нее со стоя ние ( getters). Нуж но не за пра ши-

вать у объ ек та ин фор ма цию для об ра бот ки, а тре бо вать, что бы он вы пол нил

ра бо ту с той ин фор ма ци ей, ко то рая у не го уже есть. Ины ми сло ва ми, ин кап-

су ля ция – это ог ра ни чен ные ин тер фей сы, и толь ко они.

Что бы со хра нить ин ва ри ан ты клас са, сле ду ет из бе гать ме то дов, при сваи ваю-

щих зна че ния ( setters). Они час то вле кут на ру ше ние ин ва ри ан тов, оп ре де-

ляю щих со стоя ния объ ек та.

До ка за тель ст во кор рект но сти ко да, как и его об су ж де ние, по зво лит вам луч ше

в нем ра зо брать ся. Со об щай те о сво их от кры ти ях – это пой дет всем на поль зу.

97 этюдов для программистов

Комментарий о комментариях

Кэл Эванс

На­мо­ем­пер­вом­за­ня­тии­по­про­грам­ми­ро­ва­нию­в­кол­лед­же­пре по да ва тель вы-

дал нам по два блан ка для со став ле ния тек ста про грам мы на BASIC. На дос ке он

на пи сал за да ние: «Со ста вить про грам му для вво да и вы чис ле ния сред не го из

10 ре зуль та тов в бо улин ге». За тем пре по да ва тель вы шел из ком на ты. Труд на ли

эта за да ча? Не пом ню сво его ре ше ния, но, ка жет ся, там был цикл FOR/NEXT и не

бо лее 15 строк ко да.

В ка ж дом блан ке для ко да про грам мы – мо ло дым лю дям, чи таю щим этот текст,

по яс няю, что мы то гда пи са ли код от ру ки, пре ж де чем вве сти его в ком пь ю тер –

бы ло око ло 70 строк. Мне бы ло со вер шен но не по нят но, по че му пре по да ва тель

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

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

ясь за ра бо тать па ру оч ков за стиль.

К боль шо му мо ему удив ле нию, по лу чив свою ра бо ту об рат но на сле дую щем за-

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

(Это ста ло пред зна ме но ва ни ем все го мое го по сле дую ще го обу че ния в кол лед же.)

По верх мое го тща тель но пе ре пи сан но го ко да бы ло вы ве де но: «А ком мен та рии?»

И пре по да ва тель, и я по ни ма ли, что де ла ет эта про грам ма, но это го бы ло не до-

ста точ но. Часть за да чи со стоя ла в том, что бы на учить ме ня сле дую ще му: мой

код дол жен быть по ня тен дру го му про грам ми сту, ко то рый при дет по сле ме ня.

Этот урок я пом ню до сих пор.

Ком мен та рии – это не по рок. Они столь же не об хо ди мы в про грам ми ро ва нии,

как ос нов ные кон ст рук ции ветв ле ний и цик лов. В боль шин ст ве со вре мен ных

язы ков есть сред ст ва ти па javadoc, ко то рые ана ли зи ру ют на пи сан ные в оп ре де-

лен ном фор ма те ком мен та рии и ав то ма ти че ски со став ля ют спра воч ник по API

(ин тер фей су при клад но го про грам ми ро ва ния). Иметь та кой спра воч ник не пло-

хо, но это го со вер шен но не дос та точ но. Код дол жен со дер жать по яс не ния о сво ем

пред по ла гае мом на зна че нии. Ко гда вы пи ше те код по древ не му прин ци пу «ес ли

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

Комментарий о комментариях

53

ве жью ус лу гу сво ему кли ен ту, сво ему ра бо то да те лю, сво им кол ле гам, а в бу ду-

щем и се бе.

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

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

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

Ком мен та рии в за го лов ке долж ны дать лю бо му про грам ми сту дос та точ но ин фор-

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

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

На од ной мо ей ра бо те у ме ня воз ник ло не со гла сие с про ект ным ре ше ни ем, при-

ня тым «на вер ху». С яз ви тель ной иро ни ей, свой ст вен ной мо ло дым про грам ми-

стам, я по мес тил текст поч то во го со об ще ния, со дер жав ше го ука за ния «свер ху»,

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

ком па нии лич но про смат ри ва ли код, по па дав ший в ре по зи то рий. Так я впер вые

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

97 этюдов для программистов

Комментируйте только то,

о чем не скажет код

Кевлин Хенни

Рас­хо­ж­де­ние­меж­ду­тео­ри­ей­и­прак­ти­кой­на прак ти ке боль ше, чем в тео рии. Это

на блю де ние оп ре де лен но при ме ни мо к ком мен та ри ям. В тео рии об щая идея ком-

мен ти ро ва ния ко да вы гля дит дос той но: дать чи та те лю де таль ное объ яс не ние

про ис хо дя ще го. Что мо жет быть по лез нее, чем да вать по лез ное? А вот на прак ти-

ке ком мен та рии час то вре дят. Как и лю бой вид пи са тель ско го твор че ст ва, на пи-

са ние ком мен та ри ев тре бу ет мас тер ст ва. Это мас тер ст во в зна чи тель ной ме ре

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

Ес ли код на пи сан с на ру ше ния ми син так си са, то ком пи ля то ры, ин тер пре та то ры

и дру гие сред ст ва раз ра бот ки обя за тель но вос про ти вят ся. Ес ли код не кор рек тен

с функ цио наль ной точ ки зре ния, боль шая часть оши бок вы явит ся в ре зуль та те

ре цен зи ро ва ния, ста ти че ско го ана ли за, тес ти ро ва ния и бое во го при ме не ния на

ком мер че ском пред при ятии. А что с ком мен та рия ми? В кни ге «The Elements of

Programming Style»1 (Computing McGraw-Hill) Кер ни ган и Плод жер за ме ча ют,

что «не вер ный ком мен та рий име ет ну ле вое или от ри ца тель ное зна че ние». И все

же та кие не год ные ком мен та рии ус пеш но при жи ва ют ся в ко де на за висть ошиб-

кам всех ви дов. Они по сто ян но от вле ка ют вни ма ние и де зин фор ми ру ют. Они

слу жат не за мет ным, но по сто ян но дей ст вую щим тор мо зом мыш ле ния про грам-

ми ста.

Что мож но ска зать о ком мен та ри ях, ко то рые фор маль но не яв ля ют ся оши боч-

ны ми, но не по вы ша ют цен но сти ко да? Та кие ком мен та рии – про сто шум. Ино-

гда ком мен та рии лишь по вто ря ют уже ска зан ное в ко де на ес те ст вен ном язы ке,

то есть по пу гай ни ча ют, не со об щая чи та те лю ни че го но во го; та кое по вто ре ние не

при да ет ко ду ни ве са, ни пра виль но сти. За ком мен ти ро ван ный код не вы пол ня-

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

Кро ме то го, он очень бы ст ро ус та ре ва ет. Ком мен та рии от но си тель но но ме ров вер-

сий и бло ки за ком мен ти ро ван но го ко да – это по пыт ки ре шить во про сы кон тро ля

1

Керниган Б. и Плоджер Ф. «Элементы стиля программирования». – Пер. с англ. – Ра-

дио и связь, 1984.

Комментируйте только то, о чем не скажет код

55

вер сий и ис то рии ко да. Та кие во про сы ре ша ют ся (и го раз до эф фек тив нее) с по-

мо щью сис тем управ ле ния вер сия ми.

За си лье в ко де бес со дер жа тель ных и не пра виль ных ком мен та ри ев про во ци ру ет

про грам ми стов по про сту иг но ри ро вать все ком мен та рии, про пус кая их при чте-

нии ли бо вы клю чая их ото бра же ние. Про грам ми сты – лю ди изо бре та тель ные,

и най дут спо со бы обой ти все, что по ка жет ся им вре до нос ным: свер нут ком мен-

та рии, из ме нят цве то вую схе му так, что бы ком мен та рии бы ли од но го цве та с фо-

ном, или уда лят ком мен та рии спе ци аль но на пи сан ным сце на ри ем. Что бы спа-

сти код от та ко го не уме ст но го при ло же ния твор че ских спо соб но стей про грам-

ми стов и что бы сни зить риск то го, что кто-то про пус тит дей ст ви тель но цен ные

ком мен та рии, сле ду ет счи тать ком мен та рии ча стью ко да. Ка ж дый ком мен та рий

дол жен иметь ка кую-то цен ность для чи та те ля, ина че это про сто му сор, ко то-

рый нуж но уб рать или пе ре ра бо тать.

Ка кой же ком мен та рий мож но счи тать цен ным? Толь ко та кой ком мен та рий, ко-

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

лишь разъ яс ня ет то, что дол жен са мо стоя тель но ска зать фраг мент ко да, это ука-

зы ва ет на не об хо ди мость из ме нить струк ту ру ко да или при ня тые со гла ше ния по

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

точ но точ ные име на ме то дов и клас сов, луч ше их пе ре име но вать. Чем ком мен ти-

ро вать бло ки в длин ных функ ци ях, вы де ли те их в ма лень кие са мо стоя тель ные

функ ции, на зва ния ко то рых бу дут от ра жать на зна че ния этих бло ков. Ста рай-

тесь со об щать мак си мум ин фор ма ции по сред ст вом ко да. Ес ли вы не мо же те опи-

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

стен ком мен та рий. Ком мен ти руй те то, что не спо со бен ска зать код, а не про сто

то, че го код не го во рит.

97 этюдов для программистов

Непрерывное обучение

Клинт Шэнк

Мы­жи­вем­в­ин­те­рес­ные­вре­ме­на. Раз ра бот ка рас пре де ле на по все му ми ру, и,

как вы яс ня ет ся, очень мно гие спо соб ны вы пол нять ва шу ра бо ту. Что бы со хра-

нить кон ку рен то спо соб ность на рын ке ра бо чей си лы, нуж но не пре рыв но учить-

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

ка в один пре крас ный день не ока жет ся, что вы ста ли не нуж ны, или что ва шу

ра бо ту от да ли ту да, где ее го то вы де лать де шев ле.

Как же ре шать эту за да чу? Од ни ра бо то да те ли не ску пят ся и ор га ни зу ют обу че-

ние, раз ви ваю щее уже на ня тых про грам ми стов. Дру гие во об ще не мо гут по зво-

лить се бе вы де лить на это вре мя или сред ст ва. Са мое на деж ное – са мо му по за бо-

тить ся о сво ем об ра зо ва нии.

Вот пе ре чень спо со бов про дол жать учить ся. Мно гое из пе ре чис лен но го мож но

бес плат но по лу чить в Ин тер не те:

Чи тай те кни ги, жур на лы, бло ги, лен ты Twitter и веб-сай ты. Ес ли вы хо ти те

глуб же ос во ить ка кой-то пред мет, мож но за ре ги ст ри ро вать ся в спи ске рас-

сыл ки или груп пе но во стей.

Ес ли вы хо ти те по-на стоя ще му изу чить но вую тех но ло гию, не об хо ди ма прак-

ти ка: на пи ши те не мно го ко да.

Ста рай тесь ра бо тать с на став ни ком, ведь ес ли вы са мый про дви ну тый спе-

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

му-то на учить ся мож но у лю бо го че ло ве ка, но го раз до боль ше му вы на учи-

тесь у бо лее тол ко во го или бо лее опыт но го кол ле ги. Ес ли не мо же те най ти

на став ни ка, по ду май те о пе ре хо де на дру гое ме сто ра бо ты.

Ис поль зуй те вир ту аль ных на став ни ков. Ищи те в Ин тер не те ав то ров или раз-

ра бот чи ков, ко то рые дей ст ви тель но вам ин те рес ны, и чи тай те все, что они

пи шут. Под пи ши тесь на их бло ги.

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

ра бо та ет оп ре де лен ный ин ст ру мент, вы смо же те бо лее эф фек тив но его при ме-

нять. Ес ли это ин ст ру мен ты с от кры тым ис ход ным ко дом, вам круп но по вез ло.

Непрерывное обучение

57

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

уви деть код, ко то рый на пи са ли и про шер сти ли дей ст ви тель но тол ко вые лю ди.

Сде лав ошиб ку, ра зо брав шись с де фек том или столк нув шись с про бле мой, по-

ста рай тесь до кон ца ра зо брать ся в про ис шед шем. Впол не воз мож но, что кто-то

уже стал ки вал ся с та кой про бле мой и опи сал ее в Се ти. Google вам в по мощь.

Хо ро ший спо соб изу чить ка кой-ли бо пред мет – это учить ему дру гих или рас-

ска зы вать о нем. Ес ли вам пред сто ит вы сту пать пе ред дру ги ми людь ми и от-

ве чать на их во про сы, это даст вам серь ез ную мо ти ва цию изу чить пред мет.

По про буй те ор га ни зо вать не боль шой се ми нар для кол лег за обе дом ли бо вы-

сту пить пе ред спе циа ли зи ро ван ной груп пой поль зо ва те лей (user group) или

на ме ст ной кон фе рен ции.

За пи ши тесь в груп пу изу че ния ка кой-ли бо тех но ло гии (ти па со об ще ст ва для

об су ж де ния во про сов при ме не ния пат тер нов про ек ти ро ва ния – patterns com-

mu nity) или са ми ор га ни зуй те та кую груп пу. Это мо жет быть груп па изу че-

ния язы ка, тех но ло гии или пред ме та, ко то рый вас ин те ре су ет.

Уча ст вуй те в кон фе рен ци ях. Ес ли нет воз мож но сти по ехать на кон фе рен цию,

в Ин тер не те мож но най ти бес плат ные ви део за пи си вы сту п ле ний, ко то рые

пуб ли ку ют ор га ни за то ры мно гих кон фе рен ций.

Дол го ехать на ра бо ту? Слу шай те под кас ты.

Вы поль зуе тесь сред ст ва ми ста ти сти че ско го ана ли за ко да? Чи тае те пре ду-

пре ж де ния, вы да вае мые ва шей IDE? Раз бе ри тесь в со об ще ни ях этих про-

грамм и при чи нах их по яв ле ния.

Сле дуй те со ве там кни ги «The Pragmatic Programmer: From Journeyman to

Mas ter»1 и ка ж дый год изу чай те ка кой-ни будь но вый язык. Или хо тя бы но-

вую тех но ло гию, или ин ст ру мент. Та кое го ри зон таль ное рас ши ре ние зна ний

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

Но вые зна ния не обя за тель но долж ны ог ра ни чи вать ся тех но ло гия ми. Глуб-

же изу чи те свою пред мет ную об ласть; это по зво лит луч ше по ни мать тех ни че-

ские тре бо ва ния и по мо жет ре шать биз нес-за да чи. Еще один по лез ный ва-

ри ант – изу чить спо со бы по вы ше ния лич ной про дук тив но сти.

Сно ва по сту пи те в уни вер си тет.

Бы ло бы за ме ча тель но, ес ли бы мы мог ли, как Нео в «Мат ри це», про сто за пи сать

не об хо ди мую ин фор ма цию в свой мозг. Но это не воз мож но, а по то му по лу че ние

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

ми ну ту. От вес ти для не го не мно го вре ме ни, ска жем раз в не де лю, – уже луч ше,

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

Тех но ло гии ме ня ют ся бы ст ро. Не от ста вай те.

1

Э. Хант, Д. Томас «Программист-прагматик. Путь от подмастерья к мастеру». – Пер.

с англ. – Лори, 2009.

97 этюдов для программистов

Удобство – не атрибут качества

Грегор Хоп

О­важ­но­сти­и­слож­но­сти­про­ек­ти­ро­ва­ния­хо­ро­ших­API (ин тер фей сов при клад-

но го про грам ми ро ва ния) ска за но мно го. Труд но все сде лать пра виль но с пер во го

раза и еще труд нее из ме нить что-ли бо в пу ти; это по хо же на вос пи та ние де тей.

Опыт ные про грам ми сты уже по ня ли, что хо ро ший API пред ла га ет оди на ко вый

уро вень аб ст рак ции для всех ме то дов, об ла да ет еди но об ра зи ем и сим мет ри ей,

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

од но, а сле до вать им на прак ти ке – дру гое. Вы же знае те, что есть слад кое вред но.

Но пе рей дем от слов к де лу и раз бе рем кон крет ную «стра те гию» про ек ти ро ва-

ния API, ко то рая встре ча ет ся мне по сто ян но: про ек ти ро вать API так, что бы он

был удоб ным. Как пра ви ло, все на чи на ет ся с од но го из сле дую щих «оза ре ний»:

По че му кли ент ские клас сы долж ны вы пол нять два вы зо ва, что бы вы пол нить

од но дей ст вие?

За чем соз да вать еще один ме тод, ес ли он де ла ет поч ти то же са мое, что уже

су ще ст вую щий? До бав лю про стой switch.

Слу шай те, это эле мен тар но: ес ли стро ка вто ро го па ра мет ра окан чи ва ет ся на

«.txt», ме тод ав то ма ти че ски по ни ма ет, что пер вый па ра метр яв ля ет ся име нем

фай ла, так что не нуж но соз да вать два ме то да.

На ме ре ния бла гие, но при ве ден ные ре ше ния чре ва ты сни же ни ем чи тае мо сти

ко да, ис поль зую ще го ваш API. Следующий вы зов ме то да

parser.processNodes(text, false);

не сет смы сло вую на груз ку толь ко для то го, кто зна ет, как ме тод реа ли зо ван, ли-

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

поль зо ва те ля: «Я не хо чу за став лять про грам ми ста де лать два вы зо ва» на прак-

ти ке оз на ча ло «Мне не хо те лось пи сать два ме то да». В прин ци пе нет ни че го пло-

хо го, ес ли удоб ст во ис поль зу ет ся как сред ст во про тив мо но тон но сти, гро мозд ко-

сти и не ук лю же сти. Но ес ли вду мать ся, про ти во яди ем для этих сим пто мов слу-

жат эф фек тив ность, эле гант ность, по сле до ва тель ность – и не обя за тель но удоб ст-

Удобство – не атрибут качества

59

во. API пред по ла га ют со кры тие внут рен ней слож но сти сис те мы, по это му впол не

ре зон но ожи дать, что про ек ти ро ва ние хо ро ше го API тре бу ет не ко то рых уси лий.

Впол не воз мож но, что удоб нее на пи сать один боль шой ме тод, а не тща тель но

про ду ман ный на бор опе ра ций, но ка ким из ва ри ан тов про ще поль зо вать ся?

В та ких си туа ци ях бо лее удач ные ар хи тек тур ные ре ше ния мо гут ос но вы вать ся

на ме та фо ре API как ес те ст вен но го язы ка. API дол жен пред ла гать вы ра зи тель-

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

точ но, что бы за да вать по лез ные во про сы и по лу чать на них от ве ты. Это не зна-

чит, что ка ж до му воз мож но му во про су бу дет со пос тав лен лишь один ме тод или

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

мы пред по чи та ем го во рить run (бе жать), а не walk(true) (ид ти), хо тя мож но рас-

смат ри вать эти дей ст вия как од ну и ту же опе ра цию, вы пол няе мую с раз ной ско-

ро стью. По сле до ва тель ный и хо ро шо про ду ман ный сло варь API спо соб ст ву ет

вы ра зи тель но сти и про зрач но сти ко да бо лее вы со ко го уров ня. А что еще важ-

нее – сло варь, до пус каю щий со че та ния слов, да ет воз мож ность дру гим про грам-

ми стам ис поль зо вать API спо со ба ми, ко то рые вы не пред ви де ли, – и это дей ст ви-

тель но боль шое удоб ст во для его поль зо ва те лей! Ко гда у вас в оче ред ной раз воз-

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

что сло ва ПрибериКомнатуНеШумиИСделайДомашнееЗадание нет в сло ва рях, хо тя оно при-

шлось бы весь ма кста ти для та кой по пу ляр ной опе ра ции.

97 этюдов для программистов

Развертывание приложения:

раннее и регулярное

Стив Берчук

От­лад­ку­про­це­ду­ры­раз­вер­ты­ва­ния­(deployment)­и­ус­та­нов­ки­час то от кла ды ва-

ют до эта па за вер ше ния про ек та. В не ко то рых про ек тах соз да ние средств ус та-

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

эту за да чу как «не из беж ное зло». Про ме жу точ ные де мон ст ра ции при ло же ния

про во дят ся в спе ци аль но под го тов лен ной сре де, что бы все ра бо та ло, как на до.

В ре зуль та те ко ман да не по лу ча ет опы та ра бо ты с про цес сом и сре дой раз вер ты-

ва ния до то го мо мен та, ко гда вре ме ни для вне се ния из ме не ний уже мо жет не

ос тать ся.

Про це ду ра раз вер ты ва ния или ус та нов ки – пер вое, что ви дит за каз чик, и ес ли

она про ста, это пер вый шаг к на деж ной (или хо тя бы про стой в от лад ке) про из-

вод ст вен ной сре де. Раз вер ты вае мое про грамм ное обес пе че ние – это то, чем бу дет

поль зо вать ся кли ент. Ес ли вы не обес пе чи те пра виль ное раз вер ты ва ние при ло-

же ния, у ва ших кли ен тов поя вят ся во про сы еще до то го, как они при сту пят

к плот ной ра бо те с ва ши ми про грам ма ми.

На чи ная про ект с про це ду ры ус та нов ки, вы по лу чае те вре мя на ее со вер шен ст-

во ва ние по хо ду цик ла раз ра бот ки про дук та и воз мож ность вно сить из ме не ния

в код при ло же ния с це лью об лег чить его ус та нов ку. Пе рио ди че ский за пуск и тес-

ти ро ва ние про це ду ры ус та нов ки в чис той сре де по зво лит так же про ве рить, не

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

За дви гая раз вер ты ва ние на по след нее ме сто, вы мо же те тем са мым ус лож нить

про цесс раз вер ты ва ния, ведь вам при дет ся ис кать об ход ные мар шру ты для до-

пу ще ний, сде лан ных в ко де. То, что ка за лось удач ной иде ей в IDE, где име ет ся

пол ный кон троль над сре дой, мо жет зна чи тель но ус лож нить про це ду ру раз вер-

ты ва ния. Обо всех ком про мис сах луч ше уз нать за ра нее.

Мо жет ка зать ся, что «спо соб ность раз вер нуть при ло же ние» на ран них ста ди ях

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

как при ло же ние ра бо та ет на ком пь ю те ре раз ра бот чи ка. Од на ко нуж но учесть тот

про стой факт, что ре аль ную цен ность для биз не са пред став ля ет лишь ко неч ный

Развертывание приложения: раннее и регулярное

61

про дукт, спо соб ный ра бо тать в сре де кли ен та. А это в лю бом слу чае не воз мож но

на на чаль ном эта пе и еще по тре бу ет зна чи тель ной ра бо ты. Ес ли вы от кла ды вае те

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

ре шить этот во прос сра зу, раз ре ше ние на столь ко де ше во. Ес ли же про це ду ра

слиш ком слож ная или в ней слиш ком мно го не яс но го, нуж но ра бо тать с ней так

же, как с ко дом при ло же ния: экс пе ри мен ти ро вать, оце ни вать и пе ре де лы вать по

ме ре не об хо ди мо сти.

Про це ду ра ус та нов ки или раз вер ты ва ния кри ти че ски важ на для ус пеш ной ра-

бо ты ва ших кли ен тов или ва шей сер вис ной ко ман ды, по это му не об хо ди мо по-

сто ян но тес ти ро вать и со вер шен ст во вать ее. Тес ти ро ва ние и со вер шен ст во ва ние

ис ход но го ко да про ис хо дят на всем про тя же нии про ек та. Раз вер ты ва ние при ло-

же ния за слу жи ва ет та ко го же от но ше ния.

97 этюдов для программистов

Отличайте исключения

в бизнес-логике от технических

Дэн Берг Джонссон

Есть,­в­об­щем-то,­две­глав­ные­при­чи­ны­воз ник но ве ния оши бок вре ме ни вы пол-

не ния (runtime errors): тех ни че ские про бле мы, пре пят ст вую щие ра бо те при ло-

же ния, и биз нес-ло ги ка, пре пят ст вую щая ис поль зо ва нию при ло же ния не вер-

ным спо со бом. Боль шин ст во со вре мен ных язы ков, та ких как LISP, Java, Small-

talk и C#, сиг на ли зи ру ют о воз ник но ве нии си туа ций обо их ти пов при по мо щи

ис клю че ний. Но эти две си туа ции на столь ко раз лич ны, что их сле ду ет тща тель-

но раз де лять. Пред став лять их по сред ст вом еди ной ие рар хии ис клю че ний – не

го во ря уже об оди на ко вых клас сах ис клю че ний – зна чит соз да вать воз мож ность

пу та ни цы в бу ду щем.

Ошиб ка про грам ми ро ва ния мо жет по ро дить не раз ре ши мую тех ни че скую про-

бле му. На при мер, ес ли пы тать ся по лу чить 83-й эле мент мас си ва раз ме ром 17 эле-

мен тов, про грам ма сой дет с рельс и сге не ри ру ет ис клю че ние. Бо лее тон кий ва ри-

ант – вы зов ко да биб лио те ки с не до пус ти мы ми ар гу мен та ми, при во дя щий к то-

му же ре зуль та ту, но внут ри биб лио те ки.

Бы ло бы ошиб кой пы тать ся на мес те раз ре шать все по доб ные си туа ции, воз ник-

шие по на шей ви не. Вме сто это го мы да ем воз мож ность ис клю че ни ям всплыть на

са мый верх ний уро вень ар хи тек ту ры, где не кий об щий ме ха низм об ра бот ки ис-

клю че ний сде ла ет все воз мож ное, что бы при вес ти сис те му в без опас ное со стоя-

ние, на при мер от ка тит тран зак цию, от ра зит со бы тие в фай ле жур на ла и из вес-

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

Ва ри ант этой си туа ции встре ча ет ся при об ра ще нии к ва шей биб лио те ке, ко гда

вы зы ваю щий на ру шил кон тракт ме то да, на при мер, пе ре дав со вер шен но не при-

ем ле мый ар гу мент или не на стро ив долж ным об ра зом свя зан ный объ ект. Это си-

туа ция то го же ти па, что с об ра ще ни ем к 83-му эле мен ту из 17: вы зы ваю щий

дол жен был про ве рить, и это ошиб ка про грам ми ста на сто ро не кли ент ско го ко-

да. Пра виль ная ре ак ция – ге не ри ро вать тех ни че ское ис клю че ние.

Иная, но то же тех ни че ская си туа ция воз ни ка ет, ко гда про грам ма не мо жет про-

дол жить ра бо ту из-за про блем с ок ру же ни ем, на при мер из-за не дос туп но сти ба зы

Отличайте исключения в бизнес-логике от технических

63

дан ных. В та кой си туа ции сле ду ет пред по ло жить, что ин фра струк ту ра сде ла ла

все воз мож ное, что бы ре шить про бле му – по пы та лась вос ста но вить со еди не ние

долж ное чис ло раз, – и не спра ви лась. Да же ес ли ис тин ная при чи на в дру гом,

по ло же ние для вы зы ваю ще го ко да ана ло гич ное: он ма ло чем мо жет ис пра вить

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

дой дет до уни вер саль но го ме ха низ ма об ра бот ки ис клю че ний.

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

ло ги ке пред мет ной об лас ти. Это ис клю чи тель ная си туа ция, ина че го во ря, не-

обыч ная и не же ла тель ная, но в ней нет стран но сти или ошиб ки про грам ми ро ва-

ния (при ме ром мо жет слу жить по пыт ка снять со сче та боль ше средств, чем на

нем на хо дит ся). Ины ми сло ва ми, та кая си туа ция яв ля ет ся ча стью кон трак та,

а ге не ра ция ис клю че ния – это аль тер на тив ный мар шрут воз вра та, часть мо-

де ли, о ко то рой кли ент ский код дол жен знать и ко то рую дол жен быть го тов об-

ра бо тать. Для та ких слу ча ев ре ко мен ду ет ся соз дать от дель ное ис клю че ние или

от дель ную ие рар хию ис клю че ний, что бы кли ент ский код мог об ра бо тать си туа-

цию осо бым об ра зом.

Объ еди не ние тех ни че ских ис клю че ний и ис клю че ний биз нес-ло ги ки в од ну ие-

рар хию раз мы ва ет раз ли чия меж ду ни ми и мо жет за пу тать вы зы ваю ще го от но-

си тель но кон трак та ме то да, пре ду сло вий вы зо ва и си туа ций, ко то рые долж ны

об ра ба ты вать ся. Раз де ле ние этих слу ча ев при да ет яс но сти и по вы ша ет ве ро ят-

ность то го, что тех ни че ские ис клю че ния бу дут об ра ба ты вать ся стан дарт ны ми

ме ха низ ма ми кар ка са при ло же ния, а ис клю че ния пред мет ной об лас ти бу дут

рас смот ре ны и об ра бо та ны кли ент ским ко дом.

97 этюдов для программистов

Больше осознанной практики

Джон Джаггер

Осоз­нан­ная­прак­ти­ка­–­это­не­про­сто­вы­пол­не­ние­за­да­ния. Ес ли на во прос «За-

чем я вы пол няю за да ние?» вы от ве чае те: «Что бы вы пол нить это за да ние», это не

осоз нан ная прак ти ка.

Осоз нан ная прак ти ка нуж на для то го, что бы улуч шить ва ши спо соб но сти к вы-

пол не нию за да чи. Цель – по вы ше ние мас тер ст ва и тех ни ки. Осоз нан ная прак-

ти ка – это по вто ре ние. Осоз нан ная прак ти ка – это ре ше ние за да чи с це лью по-

вы ше ния мас тер ст ва в од ном или не сколь ких ас пек тах за да чи. Осоз нан ная

прак ти ка – это по вто ры по вто ре ний. Вы про дви гае тесь мед лен но, вы пол няя за-

да чу сно ва и сно ва, по ка не дос тиг не те же лае мо го уров ня мас тер ст ва. Осоз нан-

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

для то го, что бы его вы пол нить.

Глав ная цель ком мер че ской раз ра бот ки – ко неч ный про дукт, а глав ная цель осоз-

нан ной прак ти ки – по вы ше ние эф фек тив но сти тру да. Это раз ные ве щи. При-

кинь те, сколь ко вре ме ни вы тра ти те на ра бо ту над чу жим про ек том? А сколь ко

вре ме ни на ра бо ту над со бой?

Сколь ко осоз нан ной тре ни ров ки не об хо ди мо для при об ре те ния мас тер ст ва?

Пи тер Нор виг (Peter Norvig) пи шет1, что «воз мож но, 10 000 ча сов… – это и есть

то са мое ма ги че ское чис ло».

В кни ге «Leading Lean Software Development: Results Are not the Point» (Ad-

dison-Wesley Professional, 2009) Мэ ри Поп пен дик (Mary Poppendieck) пи шет,

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

ет ся не ме нее 10 000 ча сов це ле на прав лен ной тре ни ров ки, что бы стать экс пер-

та ми».

Мас тер ст во рас тет по сте пен но, а не воз ни ка ет скач ком по сле 10-ты сяч но го ча са!

Од на ко 10 000 ча сов – это серь ез но: при мер но 20 ча сов в не де лю в те че ние 10 лет.

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

1

http://norvig.com/21-days.html

Больше осознанной практики

65

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

го вы бо ра. Ис сле до ва ния по след них два дца ти лет по ка зы ва ют, что глав ным фак-

то ром при об ре те ния ком пе тен ции яв ля ет ся вре мя, по тра чен ное на це ле на прав-

лен ную тре ни ров ку. Вро ж ден ные спо соб но сти – не глав ный фак тор. Вот что пи-

шет Мэ ри Поп пен дик:

Мно гие ис сле до ва те ли выс ших про фес сио наль ных дос ти же ний схо дят ся в том,

что вро ж ден ный та лант яв ля ет ся все го лишь фик си ро ван ной от прав ной точ-

кой: нуж ны ка кие-то ми ни маль ные при род ные спо соб но сти, что бы на чать за-

ни мать ся спор том или оп ре де лен ной про фес сио наль ной дея тель но стью. На чи-

ная с это го по ро го во го зна че ния, пре ус пе ва ют те, кто тру дит ся упор нее все го.

Нет смыс ла осоз нан но прак ти ко вать ся в том, что вы и так умее те де лать мас тер-

ски. Осоз нан ной тре ни ров кой мы раз ви ва ем то, что уме ем не дос та точ но хо ро шо.

Пи тер Нор виг пи шет:

Ключ [к дос ти же нию мас тер ст ва] – осоз нан ная прак ти ка: не про сто мно го-

крат ное по вто ре ние од но го и то го же, но сме лость взять ся за за да чу, ко то рая

не сколь ко пре вы ша ет ва ши ны неш ние спо соб но сти, по пы тать ся ее ре шить,

ана ли зи ро вать эф фек тив ность сво их дей ст вий во вре мя и по сле ра бо ты над ре-

ше ни ем, а так же ис пра вить до пу щен ные ошиб ки.

А Мэ ри Поп пен дик пи шет:

Осоз нан ная прак ти ка – это не по вто ре ние то го, что вы уже умее те; это вы бор

слож ной за да чи, по пыт ка за нять ся тем, в чем вы не впол не ком пе тент ны. Нель-

зя рас счи ты вать, что это бу дет при ят ное вре мя пре про во ж де ние.

Осоз нан ная прак ти ка – это уче ба, ко то рая из ме ня ет вас, из ме ня ет ва ше по ве де-

ние. Уда чи.

97 этюдов для программистов

Предметно-ориентированные

языки

Микаэль Хунгер

Ес­ли­при­слу­шать­ся­к­раз­го­во­ру­экс­пер­тов­в ка кой-ли бо об лас ти, будь то иг ро ки

в шах ма ты, вос пи та те ли дет ско го са да или стра хо вые аген ты, мож но за ме тить,

что их лек си ка су ще ст вен но от ли ча ет ся от по все днев ной. От час ти та ко ва при чи на

по яв ле ния пред мет но-ори ен ти ро ван ных язы ков (domain specific language, DSL):

у ка ж дой пред мет ной об лас ти есть соб ст вен ный спе циа ли зи ро ван ный сло варь

для опи са ния яв ле ний, при су щих этой об лас ти.

Ес ли го во рить о про грам ми ро ва нии, DSL пред став ля ют со бой вы пол няе мые вы-

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

на ог ра ни чен ном сло ва ре и грам ма ти ке, так что спе циа ли сты в дан ной пред мет-

ной об лас ти спо соб ны чи тать и по ни мать вы ра же ния на этом язы ке, а в идеа ле

еще и пи сать соб ст вен ные. Язы ки DSL, ори ен ти ро ван ные на раз ра бот чи ков и уче-

ных, су ще ст ву ют уже доволь но дав но. Дос та точ но древ ни ми при ме ра ми мо гут

по слу жить «ма лые язы ки» на стро еч ных фай лов UNIX, а так же язы ки на ба зе

мощ ных мак ро сов LISP.

Обыч но DSL де лят ся на встро ен ные и не за ви си мые:

Встро ен ные DSL

Соз да ют ся на уни вер саль ных язы ках про грам ми ро ва ния, син так сис ко то рых

по дог нан под струк ту ры ес те ст вен но го язы ка. Про ще все го де лать это с язы-

ка ми, пре дос тав ляю щи ми ши ро кие воз мож но сти для син так си че ско го ук ра-

ша тель ст ва и гиб ко го фор ма ти ро ва ния (на при мер, Ruby и Scala), то гда как

с дру ги ми все слож нее (на при мер, Java). Боль шин ст во встро ен ных DSL – суть

оберт ки су ще ст вую щих API, биб лио тек и биз нес-ло ги ки. Они сни жа ют вход-

ной по рог при ме не ния уже су ще ст вую щей функ цио наль но сти. При ло же ния

на встро ен ных DSL мож но за пус кать как обыч ные при ло же ния. В за ви си мо-

сти от реа ли за ции и пред мет ной об лас ти они мо гут ис поль зо вать ся для на пол-

не ния струк тур дан ных, опи са ния за ви си мо стей, за пус ка про цес сов или за дач,

со об ще ния с дру ги ми сис те ма ми или про вер ки кор рект но сти вво ди мых поль-

зо ва те ля ми дан ных. Син так сис встро ен но го DSL ог ра ни чен воз мож но стя ми

Предметно-ориентированные языки

67

ба зо во го язы ка. Су ще ст ву ет мно же ст во шаб ло нов – на при мер по строи тель вы-

ра же ний, це поч ка ме то дов, ан но та ция – для под гон ки ба зо во го язы ка к нуж-

но му DSL. Ес ли ба зо вый язык не тре бу ет пе ре ком пи ля ции, встро ен ный DSL

при тес ном взаи мо дей ст вии с экс пер том в пред мет ной об лас ти мож но соз дать

дос та точ но бы ст ро.

Не за ви си мые DSL

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

сто вые DSL встре ча ют ся ча ще гра фи че ских. Тек сто вые вы ра же ния мо гут

про хо дить об ра бот ку в це поч ке, вклю чаю щей в се бя лек си че ский ана ли за тор,

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

сред ст ва постоб ра бот ки. Как пра ви ло, вы ра же ния не не за ви си мых DSL пре-

об ра зу ют ся во внут рен ние мо де ли, слу жа щие ос но вой для даль ней шей об ра-

бот ки. По лез но оп ре де лить грам ма ти ку (на при мер, в ви де РФБН1). Грам ма-

ти ка слу жит от прав ным пунк том для соз да ния эле мен тов ин ст ру мен таль ной

це поч ки (на при мер, ре дак то ра, ви зуа ли за то ра, ге не ра то ра ана ли за то ров син-

так си са). Для про стых DSL мо жет ока зать ся дос та точ но ана ли за то ра син так-

си са, соз дан но го вруч ную – на при мер, на ос но ве ре гу ляр ных вы ра же ний. Ес-

ли тре бо ва ния к ана ли за то ру син так си са дос та точ но слож ны, соз дан ный

вруч ную ана ли за тор син так си са мо жет стать слиш ком гро мозд ким, и сле ду ет

об ра тить взор на та кие ин ст ру мен ты для ра бо ты с грам ма ти ка ми и DSL, как

open ArchitectureWare, ANTLR, SableCC, AndroMDA. До воль но час то не за ви-

си мые DSL оп ре де ля ют в ви де диа лек тов XML, но с чте ни ем в этом слу чае мо-

гут быть слож но сти, осо бен но у не спе циа ли стов.

Все гда сле ду ет при ни мать во вни ма ние це ле вую ау ди то рию ва ше го DSL. Из ко го

она со сто ит – из раз ра бот чи ков, ме нед же ров, кли ен тов или ко неч ных поль зо ва-

те лей? В за ви си мо сти от це ле вой ау ди то рии нуж но вы би рать тех ни че ский уро-

вень язы ка, дос туп ные поль зо ва те лю функ ции, ин ст ру мент для под сказ ки по

син так си су (на при мер, IntelliSense), сред ст ва ран ней ва ли да ции, ви зуа ли за ции

и пред став ле ния. Скры вая тех ни че ские де та ли, DSL от да ет власть поль зо ва те-

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

треб но стям, не при бе гая к по мо щи раз ра бот чи ков. DSL по зво ля ет еще и уве ли-

чить ско рость раз ра бот ки бла го да ря рас пре де ле нию за дач по сле то го, как соз дан

на чаль ный кар кас язы ка. Язык мо жет раз ви вать ся по сте пен но. Су ще ст ву ют

так же раз лич ные спо со бы пе ре вес ти су ще ст вую щие язы ки и грам ма ти ки на но-

вый DSL.

1

Расширенная форма Бэкуса-Наура (Extended Backus-Naur Form, EBNF).– Прим. ред.

97 этюдов для программистов

Не бойтесь что-нибудь сломать

Майк Льюис

Ка­ж­дый­по­ра­бо­тав­ший­в­на­шей­от­рас­ли­на вер ня ка встре чал ся с про ек том, код

ко то ро го вну шал опа се ния. Час ти та кой сис те мы силь но взаи мо свя за ны, и из-

ме не ние ко да од ной функ ции по че му-то при во дит к на ру ше нию ра бо ты со всем

дру гой. При до бав ле нии но во го мо ду ля при хо дит ся ог ра ни чи вать ся ми ни маль-

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

рать в джен гу пе ре кры тия ми не бо скре ба – од но знач но ве дет к ка та ст ро фе.

Вне се ние из ме не ний так из ма ты ва ет нер вы толь ко по то му, что сис те ма боль на.

Она ну ж да ет ся в ле че нии, ина че ее со стоя ние бу дет лишь ухуд шать ся. Вы знае те,

в чем по ро ки сис те мы, но бои тесь при нять ре ши тель ные ме ры. Опыт ный хи рург

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

так же, что раз ре зы вре мен ные и по том за жи вут. Ре зуль тат опе ра ции оп рав ды ва-

ет пе ре не сен ные стра да ния, и со стоя ние па ци ен та долж но стать луч ше, чем до

хи рур ги че ско го вме ша тель ст ва.

Не бой тесь сво его ко да. Ко му ка кое де ло, что код не ра бо та ет в про цес се ра бо ты

над ним? Имен но бо язнь пе ре мен и при ве ла ваш про ект к ны неш не му жал ко му

со стоя нию. По тра чен ное на ре фак то ринг вре мя мно го крат но оку пит ся в те че ние

жиз нен но го цик ла ва ше го про ек та. Да к то му же пе ре ра бот ка не здо ро вой сис те-

мы сде ла ет всех уча ст ни ков ко ман ды спе циа ли ста ми в ее уст рой ст ве. Та кой опыт

нуж но це нить, а не жа ло вать ся на не го. А вот ра бо та над сис те мой, по сто ян но

вы зы ваю щей тош но ту, не луч ший вы бор в жиз ни.

Пе ре оп ре де ли те внут рен ние ин тер фей сы. Ре ст рук ту ри руй те мо ду ли. Ре ор га ни-

зуй те код, по лу чен ный пу тем ко пи ро ва ния-встав ки. Уп ро сти те ар хи тек ту ру, со-

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

нив из не го па то ло ги че ские слу чаи, а они час то воз ни ка ют из-за не пра виль но

ор га ни зо ван ной взаи мо свя зи меж ду час тя ми сис те мы. Мед лен но пе ре хо ди те от

ста рой струк ту ры к но вой, не за бы вая в про цес се о тес ти ро ва нии. По пыт ка осу-

ще ст вить ре фак то ринг «в один за ход» мо жет вы звать столь ко про блем, что воз-

ник нет со мне ние в це ле со об раз но сти пе ре ра бот ки во об ще.

Не бойтесь что-нибудь сломать

69

Стань те хи рур гом, сме ло уда ляю щим по ра жен ные тка ни во имя ис це ле ния. Та-

кой под ход за ра зи те лен и вдох но вит ва ших кол лег к про ве де нию дав но от кла ды-

вав шей ся за чи ст ки в дру гих про ек тах. Ве ди те спи сок «ги гие ни че ских» ра бот,

ко то рые, по мне нию ко ман ды, при нес ли бы поль зу про ек ту. Убе ди те ру ко во д ст-

во в том, что, не смот ря на от сут ст вие ви ди мых ре зуль та тов, та кие ра бо ты со кра-

ща ют из держ ки и ус ко ря ют вы пуск но вых вер сий. По сто ян но про яв ляй те за бо-

ту о «здо ро вье» ко да в це лом.

97 этюдов для программистов

Не прикалывайтесь

с тестовыми данными

Род Бегби

Был позд ний ве чер. Я под би рал фик тив ные дан ные, что бы про тес ти ро вать

вер ст ку стра ни цы, на хо див шей ся в ра бо те. Име на поль зо ва те лей я при ду мал

в честь уча ст ни ков груп пы «The Clash». На зва ния ком па ний? Сго дят ся на-

зва ния пе сен «Sex Pistols». Те перь нуж ны ка кие-ни будь бир же вые сим во лы –

че ты рех бу к вен ные сло ва, со стоя щие из за глав ных букв.

Я вы брал те са мые че ты рех бу к вен ные сло ва1.

Вро де впол не без обид но. Про сто не боль шое раз вле че ние для ме ня или тех раз-

ра бот чи ков, ко то рые уви дят это зав тра, по ка я не под клю чу ре аль ный ис-

точ ник дан ных.

А на сле дую щее ут ро ру ко во ди тель про ек та сде лал не сколь ко сним ков эк ра-

на для пре зен та ции.

Ис­то­рия­про­грам­ми­ро­ва­ния­пе ст рит мно же ст вом по доб ных вос по ми на ний. Ша-

ло сти раз ра бот чи ков и ди зай не ров, ко то рые «ни кто ни ко гда не уви дит», вдруг

пред ста ва ли все об ще му обо зре нию.

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

лиц, ко манд или ком па ний. Вот не ко то рые при ме ры:

Во вре мя по ка за те ку щей вер сии кли ент щел ка ет по кноп ке, функ цио наль-

ность ко то рой еще не реа ли зо ва на, и по лу ча ет со об ще ние: «При ду рок, не тро-

гай эту кноп ку».

Про грам мист, со про во ж дав ший ста рую сис те му, по лу чил за да ние до ба вить

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

внут рен ний жур нал. И вот у поль зо ва те лей при ошиб ках по яв ля ют ся со об-

ще ния ти па «Твою мать, Бэт мен, сбой тран зак ции БД!».

1

Следовало бы перевести «трехбуквенные» слова, но биржевые символы содержат 4 бук-

вы, и автор имеет в виду соответствующие четырехбуквенные слова на английском. –

Прим. ред.

Не прикалывайтесь с тестовыми данными

71

Че ло век пе ре пу тал ин тер фейс для вво да тес то вых дан ных и ин тер фейс ад ми-

ни ст ри ро ва ния ра бо чей сис те мы. Он вво дит «при коль ные» дан ные, и вот по-

ку па те ли ви дят на вит ри не ва ше го ин тер нет-ма га зи на «Фал лои ми та тор в ви-

де Бил ла Гейт са» це ной 1 000 000 $.

Ес ли ста рую по го вор ку «по ка прав да обу ва ет ся, ложь уже обой дет пол све та» пе-

ре вес ти на со вре мен ный язык, то мож но ска зать, что в на ше вре мя та кие ля пы

про сла вят ся в Twitter, LiveJournal или Facebook до то го, как в ча со вом поя се

раз ра бот чи ков про снет ся кто-то, спо соб ный их ис пра вить.

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

Ко гда в 2004 ар хи вы с ис ход ным ко дом Windows 2000 по яви лись в фай ло об мен-

ных се тях, не ко то рые ве сель ча ки про фильт ро ва ли их в по ис ках сквер но сло вия,

ру га тельств и про чих за бав ных ве щей.1 (При зна юсь, с той по ры я ино гда при бе-

гаю к ком мен та рию: // TERRIBLE HORRIBLE NO GOOD VERY BAD HACK (УЖАС НО ОТ-

ВРА ТИ ТЕЛЬ НО БЕС ПО ЛЕЗ НО ДРЯН НОЙ ТРЮК!)

Ко ро че, ко гда вы пи ше те в ко де лю бой текст, будь то ком мен та рии, вы вод в жур-

нал, диа ло го вое ок но или тес то вые дан ные, ду май те о том, как это бу дет вы гля-

деть, ес ли текст по па дет в от кры тый дос туп. И то гда ни ко му не при дет ся крас-

неть.

1

http://www.kuro5hin.org/story/2004/2/15/71552/7795

97 этюдов для программистов

Не проходите мимо ошибки!

Пит Гудлиф

Как-то ве че ром я шел по ули це на встре чу с друзь я ми в ба ре. Мы дав нень ко не

пи ли вме сте пи во, я спе шил и ду мал толь ко о встре че с ни ми. По это му я пло-

хо смот рел се бе под но ги. Спо ткнув шись о край тро туа ра, я упал плаш мя, но

ре шил не об ра щать на это вни ма ния.

Но га бо ле ла, но я же спе шил на встре чу с друзь я ми! Я со брал ся с си ла ми и дви-

нул ся даль ше. По хо ду де ла боль уси ли ва лась. По на ча лу я ду мал, что про сто

про хо дит бо ле вой шок, но вско ре по нял, что де ло серь ез нее.

И все же я на пра вил ся в сто ро ну ба ра. Ко гда я до б рал ся ту да, мне бы ло уже

не вы но си мо боль но. Ве чер не осо бен но удал ся – боль не да ва ла о се бе за быть.

Ут ром я по шел к док то ру, и вы яс ни лось, что у ме ня сло ма на го лень. Ос та но-

вись я, ко гда ста ло боль но, мне уда лось бы из бе жать мно гих ос лож не ний, вы-

зван ных тем, что я про дол жал ид ти даль ше. Пред по ло жу, то бы ло мое худ-

шее в жиз ни ут рен нее по хме лье.

Слиш­ком­мно­гие­про­грам­ми­сты пи шут код в ду хе мое го по ве де ния в тот ве чер.

Ошиб ка? Ка кая еще ошиб ка? Это про сто ерун да. Че ст но. Мож но не об ра щать

на нее вни ма ния. Для соз да ния на деж но го ко да та кая стра те гия не го дит ся.

Ска жу боль ше, это по про сту лень. (Вред ная ее раз но вид ность.) Что бы вы там се-

бе ни во об ра жа ли по по во ду от сут ст вия оши бок в соб ст вен ном ко де, их все гда

нуж но про ве рять и все гда об ра ба ты вать. Обя за тель но. По сту пая ина че, вы не

эко но ми те вре мя, но за па сае тесь по тен ци аль ны ми про бле ма ми на бу ду щее.

Со об щить об ошиб ке в ко де мож но раз ны ми спо со ба ми, на при мер:

Вер нуть в ре зуль та те ра бо ты функ ции код­ ошиб­ки, ко то рый оз на ча ет, что

функ ция от ра бо та ла не вер но. Код ошиб ки очень лег ко иг но ри ро вать. В ко де

ни что не ука жет на про бле му. Во об ще теперь ста ло при ня то иг но ри ро вать

зна че ния, воз вра щае мые не ко то ры ми стан дарт ны ми функ ция ми C. Час то ли

вы про ве ряе те зна че ние, воз вра щае мое функ ци ей printf?

• errno – лю бо пыт ный ма разм язы ка C, спе ци аль ная гло баль ная пе ре мен ная, ко-

то рая долж на сиг на ли зи ро вать об ошиб ке. Ее лег ко иг но ри ро вать, ее не удоб но

при ме нять и она слу жит ис точ ни ком вся че ских не при ят но стей: что, на при-

Не проходите мимо ошибки!

73

мер, де лать, ес ли в про грам ме не сколь ко по то ков, вы зы ваю щих од ну и ту же

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

дру гие – нет.

• Ис­клю­че­ния­– это бо лее ор га ни зо ван ный спо соб уве дом лять об ошиб ках и об-

ра ба ты вать их, при чем спо соб, встро ен ный в язык. Иг но ри ро вать ис клю че-

ния не воз мож но. Или все же мож но? Мне час то встре чал ся код ти па

try {

// ...что-то вы пол нить...

}

catch (...) {} // иг но ри ро вать ошиб ки

Един ст вен ное дос то ин ст во этой ужас ной кон ст рук ции – под черк нуть, что в ко-

де про ис хо дит не что со мни тель ное с точ ки зре ния мо ра ли.

Иг но ри руя ошиб ку, за кры вая гла за и де лая вид, что ни че го не про изош ло, вы

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

я не ос та но вил ся не мед лен но, так и дви же ние на про лом че рез крас ные флаж ки

мо жет при вес ти к очень серь ез ным про бле мам. Про бле мы нуж но ре шать при

пер вой же воз мож но сти. Не за тя ги вай те вы пла ту дол гов.

Ес ли не об ра ба ты вать ошиб ки, вот что вы по лу чи те:

• Не­ста­биль­ный­код. Код со мно же ст вом вос хи ти тель ных и труд ных для об на-

ру же ния оши бок.

• Не­без­опас­ный­ код. Взлом щи ки час то поль зу ют ся не дос тат ка ми об ра бот ки

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

• Пло­хая­струк­ту­ра. Ес ли в ва шем ко де по сто ян но про яв ля ют ся ошиб ки, ко то-

рые труд но об ра ба ты вать, то, ве ро ят но, у вас не удач ный ин тер фейс. Фор му-

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

а их об ра бот ка не бы ла столь об ре ме ни тель на.

Сле ду ет не толь ко про ве рять все воз мож ные ошиб ки в ко де, но и об на жать все

по тен ци аль но оши боч ные со стоя ния в ин тер фей сах. Не скры вай те их – нет

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

По че му мы не вы пол ня ем про вер ку на ошиб ки? Вот не ко то рые стан дарт ные

оправ да ния:

Об ра бот ка оши бок за гро мо ж да ет код, за труд няя его чте ние и от сле жи ва ние

«нор маль но го» по то ка вы пол не ния.

Это лиш няя ра бо та, а на ме ня да вят сро ки сда чи.

Я уве рен, что эта функ ция ни ко гда не вер нет ошиб ку (printf все гда ра бо та ет,

malloc все гда вы де ля ет па мять, а ес ли нет, на ши про бле мы го раз до серь ез нее…)

Это про то тип, нет смыс ла де лать его при год ным для ком мер че ско го при ме не-

ния.

С ка ки ми из них вы со глас ны? Что вы мог ли бы на них воз ра зить?

97 этюдов для программистов

Не просто учите язык,

поймите его культуру

Андерс Норас

В­сред­ней­шко­ле­мне­при­шлось­изу­чать­ино­стран­ный­язык. В то вре мя мне ка за-

лось, что дос та точ но хо ро ше го зна ния анг лий ско го язы ка, и по то му я бла го по луч-

но про спал три го да уро ков фран цуз ско го. Спус тя не сколь ко лет я по ехал от ды-

хать в Ту нис. Офи ци аль ный язык этой стра ны – араб ский, но так как это быв шая

фран цуз ская ко ло ния, в Ту ни се ши ро ко рас про стра нен фран цуз ский. По-анг-

лий ски го во рят толь ко в мес тах пре бы ва ния ту ри стов. Из-за сво его не ве же ст ва

в язы ках мне при шлось про во дить вре мя глав ным об ра зом близ бас сей на за чте-

ни ем кни ги «Finnegans Wake» (По мин ки по Фин не га ну), в ко то рой Джеймс

Джойс про де мон ст ри ро вал свое вла де ние как фор мой, так и язы ком. Джойс иг-

раю чи со еди нил вме сте бо лее 40 язы ков, и чте ние кни ги ста ло для ме ня уди ви-

тель ным, хо тя и не про стым опы том. Это пе ре жи ва ние но вых средств вы ра же-

ния, со ткан ных ав то ром из ино стран ных слов и фраз, ос та лось со мной на про тя-

же нии всей мо ей карь е ры про грам ми ста.

В сво ей но ва тор ской кни ге «The Pragmatic Programmer: From Journeyman to Mas-

ter»1 (Addison-Wesley Professional) Эн ди Хант и Дэйв То мас ре ко мен ду ют каж-

дый год изу чать ка кой-ни будь но вый язык про грам ми ро ва ния. Я по про бо вал по-

сле до вать их со ве ту и за го ды ра бо ты при об рел опыт про грам ми ро ва ния на мно-

гих язы ках. Са мый важ ный вы вод из мо их при клю че ний по ли гло та: для изу че-

ния язы ка не дос та точ но ос во ить его син так сис, нуж но по нять его куль ту ру.

Мож но на лю бом язы ке пи сать, как на Фор тра не, но, что бы по-на стоя ще му изу-

чить язык, нуж но при нять его пол но стью.

Не ищи те се бе оп рав да ний, ес ли ваш код C# со сто ит из длин но го ме то да Main

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

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

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

1

Э. Хант, Д. Томас «Программист-прагматик. Путь от подмастерья к мастеру». – Пер.

с англ. – Лори, 2009.

Не просто учите язык, поймите его культуру

75

Ов ла дев прие ма ми но во го язы ка, вы с удив ле ни ем об на ру жи те, что по-но во му

поль зуе тесь те ми язы ка ми, ко то рые зна ли рань ше.

Я на учил ся эф фек тив но ис поль зо вать де ле ги ро ва ние в C# по сле то го, как ос во-

ил Ruby; рас кры тие всех воз мож но стей обоб ще ний .NET (generics) на ве ло ме ня

на мыс ли о том, как с боль шей поль зой при ме нять обоб ще ния в Java; по сле LINQ

мне бы ло лег ко изу чать Scala.

Пе ре ход с од но го язы ка на дру гой по мо га ет так же луч ше по нять шаб ло ны про ек-

ти ро ва ния. Про грам ми сты на C об на ру жи ва ют, что в C# и Java оди на ко во ши ро-

ко упот реб ля ет ся шаб лон ите ра то ра. В Ruby и дру гих ди на ми че ских язы ках

мож но все еще поль зо вать ся шаб ло ном по се ти те ля (visitor), но ва ша реа ли за ция

не бу дет по хо жа на при мер из кни ги Бан ды Че ты рех (The Gang of Four).

Од ни ут вер жда ют, что «По мин ки по Фин не га ну» не воз мож но чи тать, дру гие

вос тор га ют ся сти ли сти че ской кра со той кни ги. Что бы об лег чить чте ние кни ги,

бы ли сде ла ны ее мо но языч ные пе ре во ды. За бав но, что пер вый пе ре вод был фран-

цуз ским.

С ко дом си туа ция во мно гом ана ло гич на. Ес ли пи сать код в сти ле «По ми нок»,

что бы в нем бы ло чуть-чуть Python, не мно го Java и при месь Erlang, про ект пре-

вра ща ет ся в ме си во. Но ес ли вы изу чае те но вые язы ки, что бы рас ши рить свой

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

на ру жи те, что код, ко то рый вы пи ше те на ста ром про ве рен ном язы ке, ста но вит-

ся бо лее кра си вым с ка ж дым но вым изу чен ным язы ком.

97 этюдов для программистов

Не прибивайте программу

гвоздями к стене

Верити Стоб

Од­на­ж­ды­я­на­пи­са­ла­оп­рос-ро­зы­грыш­по­C++, в ко то ром в шут ку пред ло жи ла

та кую стра те гию об ра бот ки ис клю че ний:

Пу тем раз ме ще ния в ко де мно го чис лен ных кон ст рук ций try...catch ино гда

уда ет ся из бе жать ава рий но го за вер ше ния про грам мы. О по лу чен ном в ре зуль-

та те со стоя нии мож но ска зать, что «те ло при би то в вер ти каль ном по ло же нии».

Не смот ря на лег ко мыс лие, я все го лишь из ла га ла урок, из вле чен ный из Его Ве-

ли че ст ва Горь ко го Опы та.

То был ба зо вый класс при ло же ния в на шей са мо пис ной биб лио те ке C++. В ко де

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

то дру гой. Класс со дер жал код об ра бот ки ис клю че ний, ус кольз нув ших от всех

дру гих об ра бот чи ков. Взяв при мер с Йос са риа на из «Улов ки-22», мы ре ши ли

или, ско рее, нам по ка за лось (сло во «ре ши ли» пред по ла га ет боль ше мыс ли тель-

ных уси лий, чем уш ло на соз да ние это го мон ст ра), что эк зем п ляр это го клас са

дол жен жить веч но или уме реть в по пыт ках это сде лать.

С этой це лью мы спле ли во еди но мно же ст во об ра бот чи ков ис клю че ний. Мы сме-

ша ли об ра бот ку струк ту ри ро ван ных ис клю че ний Windows с соб ст вен ны ми ис-

клю че ния ми (пом ни те __try...__except в C++? Я то же не пом ню). Ко гда не ожи-

дан но воз ни ка ло ис клю че ние, мы вы зы ва ли ме то ды сно ва, за пи хи вая в них те

же па ра мет ры. Ко гда я вспо ми наю это, мне нра вит ся ду мать, что, соз да вая вло-

жен ный об ра бот чик try...catch внут ри пред ло же ния catch дру го го об ра бот чи ка,

я ис пы ты ва ла смут ное по доз ре ние, что как-то слу чай но съе ха ла с на деж но го

шос се хо ро шей прак ти ки на аро мат ную, но не здо ро вую до ро гу к бе зу мию. Впро-

чем, это я по ни маю, ско рее, зад ним умом.

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

на этом клас се, при ло же ния ис че за ли бес след но, слов но жерт вы ма фии, сбро шен-

ные с при ча ла. Не ос та ва лось да же пу зы рей на во де в ка че ст ве под сказ ки о пе-

чаль ном про ис ше ст вии, не смот ря на на ли чие под про грамм ава рий ной ре ги ст ра-

ции, от ве чав ших за про то ко ли ро ва ние со бы тия. В кон це кон цов – по про ше ст вии

Не прибивайте программу гвоздями к стене

77

не ма ло го вре ме ни – мы кри ти че ски пе ре оце ни ли свое тво ре ние и ус ты ди лись.

Все это ме си во мы за ме ни ли ма лень ким и на деж ным ме ха низ мом ге не ра ции от-

че та. Но то му пред ше ст во вал не один де ся ток кри ти че ских сбо ев при ло же ния.

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

кто-то еще мог бы со пер ни чать с на шей глу по стью, но не дав но в се ти у ме ня слу-

чи лась дис кус сия с ти пом, ака де ми че ский чин ко то ро го пред по ла га ет боль шее

по ни ма ние по доб ных во про сов. Об су ж дал ся код на Java в уда лен ных тран зак ци-

ях. Тип ут вер ждал, что ес ли в ко де слу чил ся сбой, ис клю че ние долж но быть пе-

ре хва че но и бло ки ро ва но на мес те. («И что же с ним то гда де лать? – спро си ла я. –

При го то вить его на ужин?»)

Он про ци ти ро вал пра ви ло про ек ти ров щи ков поль зо ва тель ских ин тер фей сов:

ПОЛЬ ЗО ВА ТЕЛЬ НИ КО ГДА НЕ ДОЛ ЖЕН ВИ ДЕТЬ СО ОБ ЩЕ НИЕ ОБ ИС КЛЮ-

ЧИ ТЕЛЬ НОЙ СИ ТУА ЦИИ, как буд то это пра ви ло ре ша ет про бле му, на пи ши

его про пис ны ми бу к ва ми или как-то еще. Ин те рес но, мо жет, это он ав тор ко да

для бан ко ма тов, про сла вив ших ся свои ми си ни ми эк ра на ми смер ти в не ко то рых

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

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

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

97 этюдов для программистов

Не полагайтесь

на «автоматические чудеса»

Алан Гриффитс

Ес­ли­взгля­нуть­на­лю­бую­дея­тель­ность, про цесс или дис ци п ли ну с дос та точ но

боль шо го рас стоя ния, все вро де бы про сто. Ме нед же ры, у ко то рых нет опы та

раз ра бот ки про грамм, счи та ют, что ра бо та про грам ми ста про ста, а про грам ми-

сты, у ко то рых нет опы та ру ко во дства, точ но так же от но сят ся к ра бо те ме нед-

же ра.

Про грам ми ро ва ние – не ко то рое за ня тие, на ко то рое тра тят не ко то рую часть сво-

его вре ме ни не ко то рые лю ди. А са мая труд ная часть ра бо ты – мыс ли тель ный

про цесс – ме нее все го за мет на и ме нее все го це нит ся не по свя щен ны ми. Де ся ти-

ле тия ми пред при ни ма ют ся по пыт ки из ба вить ся от по треб но сти в ква ли фи ци ро-

ван ных мыс ля щих кад рах. Од на из наи бо лее ран них и па мят ных по пы ток – уси-

лия Грэйс Хоп пер (Grace Hopper) сде лать язы ки про грам ми ро ва ния не та ки ми

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

в про грам ми стах уз кой спе циа ли за ции мо жет ис чез нуть. Ре зуль тат (COBOL) спо-

соб ст во вал ма те ри аль но му бла го по лу чию мно гих про грам ми стов уз кой спе циа-

ли за ции в по сле дую щие де ся ти ле тия.

На вяз чи вая идея, буд то раз ра бот ку про грамм но го обес пе че ния мож но уп ро-

стить, ес ли ис клю чить из нее про грам ми ро ва ние, пред став ля ет ся со вер шен но на-

ив ной про грам ми сту, ко то рый по ни ма ет, о чем речь. Но ход мыс лей, при во дя щий

к этой ошиб ке, за ло жен в че ло ве че ской при ро де, и про грам ми сты под вер же ны

этой ошиб ке так же, как и все ос таль ные.

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

мист мо жет не со при ка сать ся тес но: по лу че ние тех ни че ских тре бо ва ний от поль-

зо ва те лей, ут вер жде ние бюд же та, на строй ка сер ве ра сбор ки, раз вер ты ва ние при-

ло же ния в тес то вой или про из вод ст вен ной сре де, пе ре вод биз не са на но вые про-

цес сы или про грам мы и то му по доб ное.

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

тель ное стрем ле ние счи тать, что он прост и про ис хо дит «по ка ко му-то вол шеб ст ву

сам по се бе». По ка длит ся это вол шеб ст во, все хо ро шо. Но ко гда (обыч но уме ст но

Не полагайтесь на «автоматические чудеса»

79

имен но сло во «ко гда», а не «ес ли») вол шеб ст во пре кра ща ет ся, про ект стал ки ва-

ет ся с не при ят но стя ми.

Мне встре ча лись про ек ты, в ко то рых раз ра бот чи ки бес плод но тра ти ли не де ли

сво его вре ме ни, по сколь ку ни кто не осоз на вал, что их ра бо та за ви сит от то го,

«пра виль ная» ли вер сия DLL за гру же на. Ко гда на чи на лись пе рио ди че ские сбои,

про ве ря лись все воз мож ные при чи ны, по ка кто-то не об ра щал вни ма ние, что за-

гру жа лась «не вер ная» вер сия DLL.

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

ла док до глу бо кой но чи и ис прав ле ний в по след ний мо мент. На столь ко глад ко,

что выс шее ру ко во дство ре ши ло, что все ра бо та ет «са мо со бой» и мож но обой тись

без ру ко во ди те ля про ек та. Че рез пол го да про ек ты в этом под раз де ле нии ста ли

ид ти, как вез де: с за держ ка ми, ошиб ка ми и не пре рыв ны ми за плат ка ми.

Не нуж но раз би рать ся во всех «вол шеб ст вах», бла го да ря ко то рым ра бо та ет ваш

про ект, но по ни мать их хо тя бы час тич но не по вре дит, как и це нить тех, кто раз-

би ра ет ся в не ко то рых ве щах луч ше вас.

Са мое глав ное, ес ли вол шеб ст во вдруг пе ре ста нет ра бо тать, нуж но знать, как его

во зоб но вить.

97 этюдов для программистов

Не повторяй свой код

Стив Смит

«Don’t­ Repeat­ Yourself­ (DRY)» («не по вто ряй ся») яв ля ет ся, ве ро ят но, од ним из

глав ней ших прин ци пов про грам ми ро ва ния. Этот прин цип сфор му ли ро ва ли Эн-

ди Хант и Дэйв То мас в кни ге «Про грам мист-праг ма тик», и он ле жит в ос но ве

мно гих дру гих ши ро ко из вест ных пра виль ных под хо дов и шаб ло нов про ек ти ро-

ва ния в раз ра бот ке про грамм но го обес пе че ния. Раз ра бот чик, на учив ший ся рас-

по зна вать дуб ли ро ва ние и умею щий уст ра нять его с по мо щью над ле жа щих прие-

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

тот, кто по сто ян но за гряз ня ет при ло же ние не нуж ны ми по вто ре ния ми.

Дублирование кода – это балласт

Ка ж дая стро ка ко да при ло же ния тре бу ет со про во ж де ния, и она слу жит ис точ-

ни ком воз мож ных оши бок в бу ду щем. Дуб ли ро ва ние при во дит к не нуж но му

уве ли че нию объ е ма ко да, что по вы ша ет ве ро ят ность по яв ле ния оши бок и де ла-

ет сис те му из лиш не слож ной. Уве ли че ние объ е ма сис те мы из-за дуб ли ро ва ния,

во-пер вых, ме ша ет раз ра бот чи кам пол но стью ра зо брать ся в сис те ме, а во-вто-

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

по тре бу ет ся по вто рить в дру гих мес тах, где дуб ли ру ет ся эта ло ги ка. Прин цип

DRY тре бу ет, что бы «ка ж дый эле мент ин фор ма ции имел в сис те ме един ст вен-

ное, од но знач ное и на деж ное пред став ле ние».

Повторение в процессах

указывает на необходимость автоматизации

Мно гие про цес сы в раз ра бот ке про грамм но го обес пе че ния мно го крат но по вто ря-

ют ся и лег ко ав то ма ти зи ру ют ся. Прин цип DRY при ме ним как к ис ход но му ко ду

при ло же ния, так и в по доб ных кон тек стах. Руч ное тес ти ро ва ние про хо дит мед-

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

сле ду ет при ме нять ав то ма ти зи ро ван ные на бо ры тес тов ( test suites). Ин те гра-

ция при ло же ния вруч ную за ни ма ет мно го вре ме ни и под вер же на ошиб кам, по-

это му про цесс сбор ки нуж но вы пол нять как мож но ча ще – же ла тель но по сле

Не повторяй свой код

81

ка ж дой за пи си ко да в ре по зи то рий. Там, где есть тру до ем кие руч ные про цес сы,

ко то рые мож но ав то ма ти зи ро вать, их нуж но ав то ма ти зи ро вать и стан дар ти зи-

ро вать. Цель – обес пе чить на ли чие един ст вен но го спо со ба ре ше ния за да чи и сде-

лать его как мож но ме нее тру до ем ким.

Повторение в логике указывает на необходимость абстракции

По вто ре ния в ло ги ке бы ва ют раз ных ви дов. Очень лег ко об на ру жи ва ют ся и ис-

прав ля ют ся слу чаи ко пи ро ва ния и встав ки кон ст рук ций if-then и switch-case.

Мно гие шаб ло ны про ек ти ро ва ния яв ным об ра зом на прав ле ны на со кра ще ние

или уда ле ние дуб ли ро ва ния ло ги ки в при ло же нии. Ес ли объ ект тре бу ет вы пол-

не ния не ко то рых дей ст вий, пре ж де чем его мож но ис поль зо вать, по лез но при ме-

нить шаб ло н Abstract Factory или Factory Method. Ес ли у объ ек та мно го раз ных

ва ри ан тов по ве де ния, по лез но ор га ни зо вать их с по мо щью шаб ло на Strategy,

а не боль ших струк тур if-then. Фак ти че ски са мо соз да ние шаб ло нов про ек ти ро-

ва ния яв ля ет ся по пыт кой со кра тить рас хо до ва ние сил, за тра чи вае мых на ре ше-

ние стан дарт ных про блем и их об су ж де ние. Кро ме то го, при ме не ние прин ци па

DRY к струк ту рам, та ким как схе мы баз дан ных, при во дит к нор ма ли за ции.

Дело принципа

Дру гие прин ци пы про грамм но го обес пе че ния так же свя за ны с DRY. Прин цип

«один и толь ко один раз» (Once and Only Once), ко то рый при ме ним толь ко к функ-

цио наль но му по ве де нию ко да, мож но рас смат ри вать как под мно же ст во DRY.

Прин цип «от крыт/за крыт» (Open/Closed), гла ся щий, что «эле мен ты про грамм-

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

фи ка ции» на прак ти ке дей ст ву ет толь ко то гда, ко гда вы пол ня ет ся прин цип

DRY. Ана ло гич но на DRY ос но ван из вест ный «прин цип един ст вен ной от вет ст-

вен но сти» (Single Responsibility Principle), ко то рый тре бу ет, что бы у клас са бы ла

толь ко од на при чи на из ме не ния.

Ес ли прин цип DRY при ме нять в от но ше нии струк ту ры, ло ги ки, про цес са или

функ ции, он слу жит ба зо вым ру ко во дством для раз ра бот чи ков про грамм но го

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

и бо лее ка че ст вен ных про грамм. Но хо тя и су ще ст ву ют си туа ции, в ко то рых по-

вто ре ние ока зы ва ет ся не об хо ди мым для дос ти же ния нуж ной про из во ди тель но-

сти или вы пол не ния дру гих тре бо ва ний (на при мер, де нор ма ли за ция дан ных

в ба зе дан ных), при ме нять по вто ре ние сле ду ет толь ко для ре ше ния ре аль ных,

а не во об ра жае мых про блем.

97 этюдов для программистов

Этот код не трогать!

Кэл Эванс

С­ка­ж­дым­из­нас­та­кое­ко­гда-ни­будь­да­слу­ча­лось. Ваш код за гру жен на про ме-

жу точ ный (staging) сер вер для сис тем но го тес ти ро ва ния, и ру ко во ди тель от де ла

тес ти ро ва ния со об ща ет вам, что есть про бле ма. Вы сра зу го то вы от ве тить: «Дай-

те-ка я бы ст ро все ис прав лю: я знаю, в чем де ло».

Од на ко в бо лее ши ро ком смыс ле про бле ма в том, что вы как раз ра бот чик счи тае-

те, что вам дол жен быть пре дос тав лен дос туп к сер ве ру, где осу ще ст в ля ет ся тес-

ти ро ва ние.

В боль шин ст ве слу ча ев, ес ли речь идет о веб-раз ра бот ке, ар хи тек ту ру мож но

раз бить на сле дую щие час ти:

Ло каль ная раз ра бот ка и мо дуль ное тес ти ро ва ние на ма ши не раз ра бот чи ка

Сер вер раз ра бот ки, где про во дит ся ав то ма ти че ское или руч ное ин те гра ци он-

ное тес ти ро ва ние

Про ме жу точ ный (staging) сер вер, где ко ман да кон тро ля ка че ст ва и поль зо ва-

те ли осу ще ст в ля ют прие моч ное тес ти ро ва ние

Бое вой (production) сер вер

Да, су ще ст ву ют и дру гие сер ве ры и сер ви сы, на при мер для управ ле ния ис ход-

ным ко дом или де фек та ми ПО, но идея по нят на. В та кой мо де ли раз ра бот чик –

да же ве ду щий – ни при ка ких ус ло ви ях не дол жен иметь дос ту па даль ше сер ве-

ра раз ра бот ки. Ос нов ная раз ра бот ка про ис хо дит на ло каль ной ма ши не про грам-

ми ста с ис поль зо ва ни ем его лю би мых IDE, вир ту аль ных ма шин и не ко то рой

по лез ной для ус пе ха де ла чер ной ма гии.

По сле со хра не ния ко да в ре по зи то рий, будь то вруч ную или ав то ма ти че ски, код

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

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

в этой сре де. И на чи ная с это го мо мен та раз ра бот чи ку ос та ет ся толь ко на блю-

дать за про цес сом.

Этот код не трогать!

83

Ад ми ни ст ра то ру про ме жу точ но го сер ве ра сле ду ет упа ко вать и пе ре не сти код на

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

доб но то му как раз ра бот чи ки не долж ны иметь дос туп за пре де лы сер ве ра раз ра-

бот ки, груп па кон тро ля ка че ст ва и поль зо ва те ли не долж ны вы хо дить за пре де-

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

рай те вер сию и вы ка ты вай те ее: не пред ла гай те поль зо ва те лям «по-бы ст ро му

гля нуть вот на это» на сер ве ре раз ра бот ки. Пом ни те, за ис клю че ни ем си туа ций

«один во ин в по ле», на сер ве ре есть код и дру гих ав то ров, ко то рые мо гут быть не

го то вы к по ка зу его поль зо ва те лям. От вет ст вен ный за вы пуск вер сий – един ст-

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

Ни в ко ем слу чае – ни при ка ких об стоя тель ст вах – раз ра бот чик не дол жен быть

до пу щен к бое во му сер ве ру. Ес ли воз ник нут про бле мы, ко ман да под держ ки

долж на ли бо спра вить ся с ни ми са ма, ли бо пред ло жить вам вне сти ис прав ле-

ния. Ко гда вы со хра ни те ис прав ле ние в ре по зи то рий, ко ман да под держ ки возь-

мет «за плат ку» от ту да. Кое-ка кие ужас ней шие ос лож не ния на про ек тах с мо им

уча сти ем воз ни ка ли из-за то го, что кое-кто ( до га дай тесь, кто) на ру шил это пра-

ви ло. Ес ли при ло же ние сло ма лось, бое вой сер вер – не ме сто для вне се ния ис-

прав ле ний.

97 этюдов для программистов

Инкапсулируйте поведение,

а не только состояние

Эйнар Ландре

В­тео­рии­сис­тем­су­ще­ст­ву­ет­кон­цеп­ция­изо­ля­ции, ко то рая вхо дит в чис ло наи-

бо лее по лез ных, ес ли речь идет о круп ных и слож ных сис тем ных струк ту рах.

В ин ду ст рии раз ра бот ки ПО все хо ро шо по ни ма ют цен ность изо ля ции од ной

сущ но сти внут ри дру гой, ина че го во ря, ин кап су ля ции. В язы ках про грам ми ро-

ва ния для обес пе че ния изо ля ции при ме ня ют ся под про грам мы и функ ции, мо-

ду ли и па ке ты, клас сы и т. д.

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

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

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

тя же лее все го про грам ми стам да ет ся ин кап су ля ция в клас сах. Не ред ко встре ча-

ет ся класс, един ст вен ный ме тод main ко то ро го име ет 3000 строк, или же класс,

в ко то ром есть толь ко ме то ды set и get для его эле мен тар ных ат ри бу тов. Та кие

при ме ры по ка зы ва ют, что раз ра бот чи ки этих клас сов не впол не ос вои ли объ ект-

но-ори ен ти ро ван ное мыш ле ние и не уме ют вос поль зо вать ся мо щью объ ек тов как

мо де ли рую щих кон ст рук ций. Для тех, кто зна ком с тер ми на ми POJO (Plain Old

Java Object – про стой Java-объ ект в ста ром сти ле) и POCO (Plain Old C# Object или

Plain Old CLR Object), за ме чу: из на чаль но они вы ра жа ли воз врат к ос но вам ООП

как па ра диг мы мо де ли ро ва ния – по нят ным и про стым, но не ту пым объ ек там.

Объ ект ин кап су ли ру ет как со стоя ние, так и по ве де ние, при чем по ве де ние оп ре де-

ля ет ся фак ти че ским со стоя ни ем. Возь мем объ ект «дверь». У не го че ты ре со стоя-

ния: от кры та, за кры та, от кры ва ет ся, за кры ва ет ся. Он пре дос тав ля ет две опе ра-

ции: «от крыть», «за крыть». В за ви си мо сти от со стоя ния опе ра ции «от крыть»

и «за крыть» ве дут се бя по-раз но му. Это не отъ ем ле мое свой ст во объ ек та де ла ет

про цесс про ек ти ро ва ния кон цеп ту аль но про стым. Все сво дит ся к двум про стым

за да чам: на зна че нию и де ле ги ро ва нию обя зан но стей раз лич ных объ ек тов, вклю-

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

Луч ше все го по ка зать, как это ра бо та ет, на при ме ре. До пус тим, у нас есть три

клас са: Customer (По ку па тель), Order (Кор зи на) и Item (То вар). Объ ект Customer –

ес те ст вен ный ис точ ник пра вил про вер ки пла те же спо соб но сти и оп ре де ле ния

Инкапсулируйте поведение, а не только состояние

85

мак си маль ной сум мы, дос туп ной для спи са ния. Объ ект Order зна ет, ка кой Cus-

tomer с ним свя зан, так что опе ра ция addItem (до ба вить То вар) де ле ги ру ет фак ти-

че скую про вер ку пла те же спо соб но сти ме то ду customer.validateCredit(item.price())

(по ку па тель.про ве рить П ла те же спо соб ность(то вар.це на())). Ес ли по сту сло вие ме-

то да не вы пол не но, мож но сге не ри ро вать ис клю че ние и от ме нить по куп ку.

Ме нее опыт ные в ООП раз ра бот чи ки ино гда ре ша ют обер нуть все биз нес-пра ви-

ла в один объ ект, ко то рый час то на зы ва ют OrderManager (Ме нед жер За ка зов) или

OrderService (Служ ба За ка зов). В та кой ар хи тек ту ре объ ек ты Order, Customer и Item,

по су ти, слу жат таб лич ны ми ти па ми. Вся ло ги ка вы во дит ся из клас сов и увя зы-

ва ет ся в од ном боль шом про це дур ном ме то де, со дер жа щем мно же ст во кон ст рук-

ций if-then-else. В ме то ды та ко го ро да лег ко вкра ды ва ют ся ошиб ки, и со про во ж-

дать их поч ти не воз мож но. По че му? По то му что ин кап су ля ция на ру ше на.

За клю че ние на пос ле док: не на ру шай те ин кап су ля цию и ис поль зуй те мощь сво-

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

97 этюдов для программистов

Числа с плавающей запятой

недействительны

Чак Эллисон

Чис­ла­с­пла­ваю­щей­за­пя­той­не­яв­ля­ют­ся­«дей­ст­ви­тель­ны­ми­чис­ла­ми» в ма те-

ма ти че ском смыс ле, хо тя в не ко то рых язы ках про грам ми ро ва ния, на при мер

в Pascal и Fortran, но сят на зва ние та ко вых (real). Дей ст ви тель ные чис ла име ют

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

Чис ла с пла ваю щей за пя той име ют ог ра ни чен ную точ ность, а по то му ко неч ны

и по хо жи на «не по слуш ные» це лые, так как не рав но мер но рас пре де ле ны по все-

му сво ему диа па зо ну.

Что бы про ил лю ст ри ро вать это, по про буй те при сво ить 2 147 483 647 (са мое боль шое

32-раз ряд ное це лое со зна ком) 32-раз ряд ной пе ре мен ной ти па float (ска жем, x),

а по том на пе ча тай те его. Вы уви ди те 2 147 483 648. Те перь на пе ча тай те x – 64. Ре-

зуль тат – сно ва 2 147 483 648. Те перь вы ве ди те x – 65, и вы по лу чи те 2 147 483 520!

По че му? По то му что про ме жу ток меж ду со сед ни ми float со став ля ет в этом диа-

па зо не 128, и опе ра ции с та ки ми чис ла ми ок руг ля ют ся до бли жай ше го чис ла

с пла ваю щей за пя той.

В стан дар те IEEE чис ла с пла ваю щей за пя той име ют фик си ро ван ную точ ность

и за пи сы ва ют ся как чис ла по ос но ва нию 2 в на уч ной но та ции: 1.d d …d × 2 e, где

1 2

p 1

p – это точ ность (24 для ти па float, 53 для ти па double). Ин тер вал меж ду дву мя

по сле до ва тель ны ми чис ла ми – ве ли чи на 21– p+ e, ко то рая хо ро шо ап прок си ми ру-

ет ся ве ли чи ной ε| x|, где ε – ма шин ный эп си лон (21– p).

Зная ин тер вал меж ду со сед ни ми чис ла ми в ок ре ст но сти не ко то ро го чис ла с пла-

ва ю щей запятой, мож но из бе жать клас си че ских оши бок в вы чис ле ни ях. На-

при мер, при про ве де нии ите ра тив ных вы чис ле ний, та ких как по иск кор ня урав-

не ния, нет смыс ла тре бо вать боль шей точ но сти, чем спо соб на дать чи сло вая сис-

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

лась мень ше ин тер ва ла меж ду чис ла ми в ок ре ст но сти ре ше ния, ина че вы

вой де те в бес ко неч ный цикл.

По сколь ку чис ла с пла ваю щей за пя той – лишь при бли же ния дей ст ви тель ных

чи сел, не из беж но на ли чие не боль шой ошиб ки. Эта ошиб ка, на зы вае мая ошиб кой

Числа с плавающей запятой недействительны

87

ок руг ле ния, бы ва ет при чи ной не ожи дан ных ре зуль та тов. На при мер, при вы чи-

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

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

бы ли наи ме нее зна чи мы ми (и со дер жа ли в се бе ошиб ку ок руг ле ния). В сущ но-

сти, это не по пра ви мо ис ка жа ет все по сле дую щие вы чис ле ния. Та кое яв ле ние на-

зы ва ет ся раз мы ва ни ем ( smearing). Нуж но вни ма тель но сле дить за свои ми ал го-

рит ма ми, что бы пре дот вра тить это ка та ст ро фи че ское яв ле ние. Для ил лю ст ра-

ции возь мем ре ше ние урав не ния x 2 – 100000x + 1 = 0 по фор му ле кор ней квад-

рат но го урав не ния. По сколь ку опе ран ды вы ра же ния –b + sqrt(b 2 – 4) поч ти

рав ны по ве ли чи не, мож но вме сто это го вы чис лить ко рень r = –b – sqrt(b 2 – 4),

1

а за тем по лу чить r = 1/r , так как в квад рат ном урав не нии ax 2 + bx + c = 0 кор ни

2

1

удов ле тво ря ют со от но ше нию r r = c/a.

1 2

Раз мы ва ние мо жет про ис хо дить и бо лее скры тым об ра зом. До пус тим, что биб-

лио те ка в ко де на ив но вы чис ля ет ex по фор му ле 1 + x + x 2 /2 + x 3 /3! + …. Этот спо-

соб от лич но ра бо та ет для по ло жи тель ных x, но по смот ри те, что про изой дет, ес-

ли x бу дет боль шим от ри ца тель ным чис лом. Чле ны с чет ны ми сте пе ня ми ока-

жут ся боль ши ми по ло жи тель ны ми чис ла ми, а вы чи та ние зна че ний не чет ных

сте пе ней поч ти не ска жет ся на ре зуль та те. Про бле ма в дан ном слу чае в том, что

ок руг ле ние в боль ших по ло жи тель ных чле нах про ис хо дит в го раз до бо лее зна-

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

бес ко неч но сти! Про бле ма ре ша ет ся про сто: для от ри ца тель ных x ис поль зуй те

фор му лу ex = 1/e| x|.

Не че го и го во рить, что чис ла с пла ваю щей за пя той нель зя ис поль зо вать в фи-

нан со вых при ло же ни ях – для них в та ких язы ках, как Python и C#, есть клас сы

де ся тич ных чи сел. Чис ла с пла ваю щей за пя той пред на зна че ны для эф фек тив-

ных на уч ных рас че тов. Но эф фек тив ность бес по лез на, ес ли те ря ет ся точ ность,

по это му пом ни те, от ку да идут ошиб ки ок руг ле ния, и пи ши те со от вет ст вую щий

код!

97 этюдов для программистов

Удовлетворяйте свое честолюбие

через Open Source

Ричард Монсон-Хейфел

Как­пра­ви­ло,­про­грам­мы,­ко­то­рые­вы­пи­ше­те­на­ра­бо­те, не удов ле тво ря ют ва-

ши са мые чес то лю би вые меч ты про грам ми ста. Мо жет стать ся, вы раз ра ба ты ва-

е те ПО для ог ром ной стра хо вой ком па нии, а хо те ли бы ра бо тать в Google, App le,

Microsoft или на чать соб ст вен ный стар тап, ко то рый со вер шит сле дую щую ре во-

лю цию. Вы ни ко гда не при де те к сво ей це ли, раз ра ба ты вая про грам мы для сис-

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

К сча стью, для ва шей про бле мы есть ре ше ние: open source, то есть про ек ты с от-

кры тым ис ход ным ко дом. В ми ре ты ся чи про ек тов с от кры тым ис ход ным ко дом,

при чем мно гие весь ма ак тив ные, в ко то рых про грам мист мо жет по лу чить лю-

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

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

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

при ло же ния ми для ани ма ции, крип то гра фии, ро бо то тех ни ки, иг ра ми для ПК,

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

мать ся чем-то еще, вы поч ти на вер ня ка най де те по край ней ме ре один дей ст вую-

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

Ра зу ме ет ся, за все нуж но пла тить. Вам при дет ся по жерт во вать сво им лич ным

вре ме нем, ведь ед ва ли ваш ра бо то да тель по зво лит вам за ни мать ся раз ра бот кой

ви део иг ры с от кры тым ис ход ным ко дом в ра бо чее вре мя. Кро ме то го, уча стие

в от кры тых про ек тах очень ред ко при но сит до ход: не ко то рые за ра ба ты ва ют на

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

че ний (это не смер тель но, ес ли вы ста не те мень ше иг рать в ви део иг ры или смот-

реть те ле ви зор). Чем боль ше тру да вы бу де те вкла ды вать в про ект с от кры тым

ис ход ным ко дом, тем бы ст рее осоз нае те, где ле жат ва ши ис тин ные ам би ции как

про грам ми ста. Не об хо ди мо так же учи ты вать ус ло вия ва ше го кон трак та с ра бо-

то да те лем – ино гда ус ло вия кон трак та ог ра ни чи ва ют уча стие в по сто рон них

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

шать за ко ны об ин тел лек ту аль ной соб ст вен но сти в от но ше нии ав тор ских прав,

па тен тов, тор го вых зна ков и ком мер че ской тай ны.

Удовлетворяйте свое честолюбие через Open Source

89

От кры тые про ек ты да ют не ве ро ят ные воз мож но сти для мо ти ви ро ван но го про-

грам ми ста. Во-пер вых, вы мо же те уви деть, ка ким спо со бом кто-то дру гой реа-

ли зу ет ин те рес ные вам ве щи: очень мно го му мож но на учить ся, чи тая код, на пи-

сан ный дру ги ми людь ми. Во-вто рых, вы мо же те прив не сти в про ект свой код

и свои идеи; не все ва ши бле стя щие идеи бу дут при ня ты, но не ко то рые прой дут.

Да и про сто ре ше ние за дач про ек та и соз да ние ко да по зво лят вам уз нать что-то

но вое. В-треть их, вы по зна ко ми тесь с за ме ча тель ны ми людь ми, ко то рые на-

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

че рез open source мо жет про длить ся до кон ца жиз ни. В-чет вер тых, ес ли вы ком-

пе тент ны в сво ем де ле, то смо же те вне сти свой прак ти че ский опыт в тех но ло-

гию, ко то рая вам нра вит ся.

На чать ра бо тать в от кры тых про ек тах до воль но про сто. Су ще ст ву ет ог ром ный

объ ем до ку мен та ции по ин ст ру мен там, ко то рые вам по на до бят ся (сис те мам

управ ле ния ис ход ным ко дом, ре дак то рам, язы кам про грам ми ро ва ния, сис те мам

сбор ки и т. д.). Вы бе ри те про ект, с ко то ро го хо ти те на чать, и изу чи те ин ст ру мен-

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

бы ва ет скуд ной, но это ед ва ли име ет боль шое зна че ние, по то му что луч ше все го

учить ся, са мо стоя тель но ис сле дуя код. Для на ча ла мож но пред ло жить свою по-

мощь в со став ле нии до ку мен та ции. Ли бо вы звать ся на пи сать код для тес ти ро ва-

ния. Это мо жет вы гля деть не столь за ман чи во, но на пи са ние тес то во го ко да для

чу жих про грамм по зво ля ет учить ся го раз до бы ст рее, чем прак ти че ски все про-

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

хо ро ший тес то вый код. Ищи те де фек ты, пред ла гай те ис прав ле ния, за во ди те дру-

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

то лю би вые про грам ми ст ские же ла ния.

97 этюдов для программистов

Золотое правило

проектирования API

Майкл Фезерс

Про­ек­ти­ро­вать­ ин­тер­фей­сы­ при­клад­но­го­ про­грам­ми­ро­ва­ния­ (API)­ слож­но,

осо бен но в об щем слу чае. Раз ра ба ты вая API, у ко то ро го бу дут сот ни или ты ся чи

поль зо ва те лей, нуж но ду мать о том, что со вре ме нем его, ско рее все го, при дет ся

из ме нять, и эти из ме не ния спо соб ны на ру шить ра бо ту кли ент ско го ко да. Кро ме

то го, нуж но учесть воз мож ное воз дей ст вие на ваш API со сто ро ны его поль зо ва-

те лей. Ес ли класс API вы зы ва ет соб ст вен ный ме тод, сле ду ет пом нить, что поль-

зо ва тель спо со бен соз дать под класс ва ше го клас са и пе ре оп ре де лить этот ме тод,

а это мо жет при вес ти к ка та ст ро фе. И вы не смо же те из ме нить этот ме тод, по то-

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

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

реа ли за ции.

Раз ра бот чи ки API ре ша ют эту про бле му раз ны ми спо со ба ми, хо тя про ще все го

за бло ки ро вать свой API. Ска жем, в Java весь ма со блаз ни тель ной мо жет стать

идея на ве ши вать на боль шин ст во клас сов и ме то дов мо ди фи ка тор final. В C#,

в свою оче редь, клас сы и ме то ды мож но объ я вить как sealed. В лю бом язы ке мож-

но по про бо вать пред ста вить API с по мо щью синг л то на или вос поль зо вать ся фаб-

ри кой ста ти че ских ме то дов для за щи ты от тех, кто по пы та ет ся пе ре оп ре де лить

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

но сти в бу ду щем. Все это ка жет ся ра зум ным, но так ли это в дей ст ви тель но сти?

За по след ние 10 лет мы по сте пен но при шли к по ни ма нию то го, что мо дуль ное тес-

ти ро ва ние – край не важ ный эле мент прак ти ки, но этот урок еще не вез де ус во ен

в на шей от рас ли. Сви де тельств то му пре дос та точ но, и они во круг нас. Возь ми те

про из воль ный непро тес ти ро ван ный класс, ис поль зую щий API сто рон не го раз-

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

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

на мерт во. Не воз мож но эму ли ро вать клас сы API так, что бы мож но бы ло по нять,

как взаи мо дей ст ву ет с ни ми ваш код, или обес пе чить воз врат зна че ний для тес-

ти ро ва ния.

Золотое правило проектирования API

91

По ло же ние со вре ме нем улуч шит ся, но толь ко ес ли при про ек ти ро ва нии API мы

ста нем рас смат ри вать тес ти ро ва ние как ре аль ный сце на рий ис поль зо ва ния.

К со жа ле нию, это не сколь ко слож нее, чем про сто тес ти ро вать наш код. Здесь

уме ст но вспом нить зо­ло­тое­пра­ви­ло­про­ек­ти­ро­ва­ния­API: не дос та точ но на пи-

сать тес ты для раз ра ба ты вае мо го API; вы долж ны на пи сать мо дуль ные тес-

ты для ко да, ис поль зую ще го ваш API. Сле дуя это му пра ви лу, вы на соб ст вен ном

опы те уз нае те, ка кие труд но сти ожи да ют ва ших поль зо ва те лей, ко гда они по-

пы та ют ся про тес ти ро вать свой код са мо стоя тель но.

Нет ка ко го-то еди но го ре ше ния, об лег чаю ще го раз ра бот чи кам тес ти ро ва ние ко-

да на ос но ве ва ше го API. Клю че вые сло ва static, final и sealed по су ти сво ей не

яв ля ют ся пло хи ми кон ст рук ция ми. Ино гда они бы ва ют по лез ны. Но важ но пом-

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

толь ко это сде ла но, ее мож но ре шать так же, как лю бую дру гую про бле му про-

ек ти ро ва ния.

97 этюдов для программистов

Миф о гуру

Райан Браш

Ка­ж­до­му,­ кто­ дос­та­точ­но­ дав­но­ ра­бо­та­ет­ в­ ком­пь­ю­тер­ной­ от­рас­ли, при хо ди-

лось слы шать во про сы ти па:

У ме ня ге не ри ру ет ся ис клю че ние XYZ. Не знае те ли, в чем про бле ма?

За даю щие по доб ные во про сы ред ко ут ру ж да ют ся тем, что бы по ка зать трас си ров-

ку сте ка, жур нал при ло же ния или дать ка кой-ли бо кон текст, спо соб ст вую щий

по ни ма нию про бле мы. По-ви ди мо му, они счи та ют, что вы мыс ли те в ка кой-то

дру гой плос ко сти, где ре ше ния от кры ва ют ся вам без вся ко го ана ли за фак тов.

Они счи та ют вас гу ру.

Мы ожи да ем по доб ных во про сов от лю дей, не зна ко мых с про грамм ным обес пе-

че ни ем, от тех, ко му ра бо та сис те мы ка жет ся прак ти че ски вол шеб ст вом. Ме ня

бес по ко ит, что с этим мы стал ки ва ем ся и в со об ще ст ве про грам ми стов. Ана ло-

гич ные во про сы воз ни ка ют при про ек ти ро ва нии про грамм, на при мер: «Я пи шу

при ло же ние для управ ле ния скла дом. Сле ду ет ли мне ис поль зо вать оп ти ми сти-

че скую бло ки ров ку?». Иро ния со сто ит в том, что, как пра ви ло, спра ши ваю щий

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

про шаю щий, ве ро ят нее все го, зна ет кон текст, зна ет тре бо ва ния и спо со бен про-

честь ма те риа лы о пре иму ще ст вах и не дос тат ках тех или иных стра те гий. И при

этом от вас ждут ра зум но го от ве та безо вся ко го кон тек ста. Они ждут чу да.

По ра от рас ли раз ра бот ки по про щать ся с ми фом о гу ру. «Гу ру» – обыч ные лю ди.

Они при ме ня ют ло ги ку и сис те ма ти че ски ана ли зи ру ют про бле мы так же, как

все мы. Они об ра ща ют ся к прие мам бы ст ро го при ня тия ре ше ний и ин туи ции.

Возь ми те луч ше го про грам ми ста, ко то ро го вы ко гда-ли бо встре ча ли: бы ло вре-

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

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

тил уче бе и со вер шен ст во ва нию сво его мыс ли тель но го про цес са. «Гу ру» – это

про сто ум ный че ло век с не уто ли мым лю бо пыт ст вом.

Ко неч но, при род ные спо соб но сти лю дей силь но раз ли ча ют ся. Уро вень со об ра зи-

тель но сти, зна ний и про дук тив но сти мно гих жи ву щих на све те ха ке ров для ме ня

Миф о гуру

93

не дос ти жим. Не смот ря на это, раз ру ше ние ми фа о гу ру при не сет поль зу. На при-

мер, ес ли я ра бо таю с тем, кто ум нее ме ня, я дол жен бу ду про де лать ру тин ную

ра бо ту и снаб дить это го че ло ве ка дос та точ ным объ е мом кон тек ста, зная ко то-

рый, он смо жет эф фек тив но при ме нить свое мас тер ст во. Из бав ле ние от ми фа гу-

ру так же оз на ча ет раз ру ше ние ил лю зор но го барь е ра на пу ти к со вер шен ст во ва-

нию. Вме сто это го вол шеб но го барь е ра я бу ду ви деть не пре рыв ный мар шрут сво-

его раз ви тия.

На ко нец, од ной из глав ных по мех в раз ви тии про грамм но го про ек та яв ля ют ся

тол ко вые лю ди, умыш лен но рас про стра няю щие миф о гу ру. Они мо гут де лать

это из чес то лю бия или в рас че те по вы сить соб ст вен ную зна чи мость в гла зах кли-

ен тов или ра бо то да те лей. Иро ния в том, что та кое по ве де ние мо жет де лать тол-

ко вых лю дей ме нее цен ны ми, по сколь ку они не спо соб ст ву ют про фес сио наль но-

му рос ту сво их кол лег. Нам не нуж ны гу ру. Нам нуж ны спе циа ли сты, го то вые

раз ви вать дру гих спе циа ли стов в сво ей от рас ли. Мес та хва тит всем.

97 этюдов для программистов

Тяжелый труд

не оправдывает себя

Олве Маудал

Ка­ж­до­му­ про­грам­ми­сту­ пред­сто­ит­ убе­дить­ся, что на пря жен ная ра бо та за час-

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

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

ект. Но на са мом де ле, ра бо тая мень ше, мож но дос тичь боль ше го – ино гда ощу ти-

мо боль ше го. Ес ли вы ста рае тесь со сре до то чен но и «про дук тив но» ра бо тать бо-

лее 30 ча сов в не де лю, вы, ско рее все го, пе ре ра ба ты вае те. Сто ит по ду мать о том,

что бы умень шить свою ра бо чую на груз ку, бла го да ря че му вы смо же те ра бо тать

эф фек тив нее и сде лае те боль ше.

Мо жет по ка зать ся, что мое ут вер жде ние про ти во ре чит здра во му смыс лу и во об-

ще спор но. Од на ко оно яв ля ет ся пря мым след ст ви ем то го фак та, что про грам ми-

ро ва ние и во об ще раз ра бот ка про грамм но го обес пе че ния тре бу ют не пре рыв но го

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

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

дос ти же ния це ли. Что бы не за ни мать ся на прас ной ра бо той, не об хо ди мо вы де-

лять вре мя на изу че ние ре зуль та тов то го, что де лае те, раз мыш лять над уви ден-

ным и со от вет ст вую щим об ра зом кор рек ти ро вать свое по ве де ние.

Про фес сио наль ное про грам ми ро ва ние обыч но ма ло на по ми на ет бег на дис тан-

цию в не сколь ко ки ло мет ров, где в кон це ас фаль ти ро ван ной до ро ги вид на цель.

Боль шин ст во про грамм ных про ек тов мож но ско рее срав нить со спор тив ным ори-

ен ти ро ва ни ем. На ма ра фон скую дис тан цию. В тем но те. И вме сто кар ты ме ст но-

сти лишь на бро сок от ру ки. Ес ли вы со рве тесь с мес та и по бе жи те изо всех сил

в од ном на прав ле нии, это мо жет про из ве сти на ко го-то впе чат ле ние, но та ким

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

и кор рек ти ро вать свой курс по ме ре то го, как ста но вит ся по нят нее, где на хо ди-

тесь и ку да на прав ляе тесь.

Кро ме то го, нуж но по сто ян но рас ши рять свои зна ния о раз ра бот ке про грамм но го

обес пе че ния в це лом и прие мах про грам ми ро ва ния в ча ст но сти. По лез но чи тать

кни ги, уча ст во вать в кон фе рен ци ях, об щать ся с дру ги ми про фес сио на ла ми,

экс пе ри мен ти ро вать с но вы ми тех но ло гия ми и ос ваи вать мощ ные ин ст ру мен ты,

Тяжелый труд не оправдывает себя

95

уп ро щаю щие ра бо ту. Про фес сио наль ный про грам мист дол жен по сто ян но сле-

дить за про грес сом в сво ей от рас ли – так же как ней ро хи рург или лет чик долж-

ны это де лать в сво ей. Вы долж ны по свя щать сво бод ное вре мя (ве че ра, вы ход ные

и празд ни ки) са мо об ра зо ва нию, по это му нель зя тра тить сво бод ные ве че ра, вы-

ход ные и празд ни ки на сверх уроч ную ра бо ту над те ку щим про ек том. Вы же не

жде те, что ней ро хи рур ги бу дут опе ри ро вать по 60 ча сов в не де лю, а лет чи ки по

60 ча сов в не де лю пи ло ти ро вать? Ко неч но, нет. Под го тов ка и об ра зо ва ние – важ-

ней шая часть их про фес сии.

Со сре до точь тесь на сво ем про ек те, по ста рай тесь оты скать для не го как мож но

боль ше ин те рес ных ре ше ний, со вер шен ст вуй те мас тер ст во, об ду мы вай те свои

дей ст вия и кор рек ти руй те по ве де ние. Не по зорь те се бя и на шу про фес сию, дей ст-

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

тать ся со сре до то чен но и «про дук тив но» ра бо тать по 60 ча сов в не де лю – де ло не-

ра зум ное. Дей ст вуй те про фес сио наль но: го товь тесь, осу ще ст в ляй те, на блю дай-

те, об ду мы вай те и кор рек ти руй те.

97 этюдов для программистов

Как пользоваться системой

отслеживания ошибок

Мэтт Доар

Как­бы­вы­их­ни­на­зы­ва­ли­ба ги, де фек ты или да же по боч ные эф фек ты про ек-

ти ро ва ния, – из ба вить ся от них пол но стью не воз мож но. Что бы про ект ус пеш но

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

же знать, на что об ра щать в нем вни ма ние.

В хо ро шем от че те об ошиб ке долж ны быть опи са ны три ве щи:

Как вос про из ве сти ошиб ку – мак си маль но точ но – и как час то при этом про-

яв ля ет се бя ошиб ка.

Что долж но бы ло про изой ти – как вам это ви дит ся.

Что фак ти че ски про ис хо дит – хо тя бы те дан ные, ко то рые вы смог ли за фик-

си ро вать.

Объ ем и ка че ст во пре дос тав лен ной ин фор ма ции в та кой же ме ре ха рак те ри зу ет

со ста ви те ля от че та, как и са му ошиб ку. Ко рот кий злой от чет («Эта функ ция –

от стой!») ма ло что со об ща ет раз ра бот чи кам по ми мо то го, что у вас бы ло пло хое

на строе ние. От чет, со дер жа щий под роб ные све де ния о кон тек сте про ис шед ше го,

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

ес ли ошиб ка за дер жи ва ет вы пуск вер сии.

От чет об ошиб ке по хож на бе се ду, и всю ее, с са мо го на ча ла, мо жет ви деть ка ж-

дый. Не пе ре кла ды вай те ви ну на дру гих и не от ри цай те са мо су ще ст во ва ние

ошиб ки. Луч ше по про си те дать до пол ни тель ную ин фор ма цию или по ду май те,

что вы мог ли упус тить.

Из ме не ние со стоя ния ошиб ки, на при мер с от кры та на за кры та, яв ля ет ся пуб-

лич ным за яв ле ни ем ва ше го мне ния об ошиб ке. Не жа лей те вре ме ни, что бы сра-

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

из ба ви те се бя в бу ду щем от дол гих и уто ми тель ных объ яс не ний с не до воль ны ми

ме нед же ра ми и кли ен та ми. Из ме не ние при ори те та ошиб ки так же яв ля ет ся пуб-

лич ным за яв ле ни ем, и ес ли ошиб ка ка жет ся три ви аль ной лич но вам, для ко го-

то дру го го она мо жет ока зать ся по во дом пре кра тить поль зо вать ся про дук том.

Как пользоваться системой отслеживания ошибок

97

Не пе ре гру жай те по ля от че та ин фор ма ци ей, не об хо ди мой лич но вам. По мет ка

«ВАЖ НО:» в за го лов ке от че та, воз мож но, об лег чит вам сор ти ров ку ре зуль та тов

оп ре де лен но го от че та об ошиб ках, но в кон це кон цов и дру гие нач нут ко пи ро-

вать эту по мет ку, при чем обя за тель но с опе чат ка ми. А мо жет быть, ее по тре бу ет-

ся уда лить и при ме нить для дру го го от че та. Луч ше ис поль зо вать но вое зна че ние

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

вто рять ся.

Сде лай те так, что бы ка ж дый знал, над ка ки ми имен но ошиб ка ми долж на ра бо-

тать ко ман да. Обыч но для этих це лей при ме ня ет ся об ще дос туп ный за прос с оче-

вид ным на име но ва ни ем. Убе ди тесь, что этот за прос оди на ков для всех, а ес ли

не об хо ди мо из ме нить его, обя за тель но из вес ти те ко ман ду о том, что план ра бо-

ты ме ня ет ся.

На ко нец, пом ни те, что об на ру жен ная ошиб ка не яв ля ет ся стан дарт ной еди ни-

цей из ме ре ния тру да, точ но так же как чис ло строк ко да – точ ной оцен кой по-

тра чен ных уси лий.

97 этюдов для программистов

Улучшайте код, удаляя его

Пит Гудлиф

Мень­ше­–­зна­чит­боль­ше. Это из би тая ко рот кая мак си ма, но ино гда она дей ст-

ви тель но вер на.

За по след ние не сколь ко не дель в чис ле про ве ден ных мною улуч ше ний на ше го

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

Мы соз да ва ли про ект, сле дуя прин ци пам экс тре маль но го про грам ми ро ва ния,

в том чис ле YAGNI (You Aren’t Gonna Need It – Вам это не по на до бит ся). Но че ло-

ве че ская при ро да не со вер шен на, и в не ко то рых мес тах мы до пус ти ли про ма хи.

Я за ме тил, что на ше му про дук ту тре бо ва лось не оп рав дан но мно го вре ме ни, что-

бы вы пол нять не ко то рые за да чи – про стые за да чи, ко то рые долж ны бы ли бы

вы пол нять ся поч ти мгно вен но. Все по то му, что мы из лиш не ус лож ни ли их реа-

ли за цию – раз но го ро да фе неч ка ми и бан ти ка ми, ко то рые фак ти че ски не тре бо-

ва лись, но в ка кой-то мо мент ка за лись по лез ны ми.

Итак, я уп ро стил код, по вы сил про из во ди тель ность про дук та и умень шил уро-

вень гло баль ной эн тро пии ко да, и все бла го да ря уда ле нию из ко да про ек та лиш-

них функ ций. К сча стью, мои мо дуль ные тес ты по мог ли мне убе дить ся, что в ре-

зуль та те сво их дей ст вий я ни че го не сло мал.

Вот та кой про стой и весь ма при ят ный опыт.

Но от ку да же воз ник этот не нуж ный код? По че му один из про грам ми стов вдруг

ре шил на пи сать лиш не го и по че му это не вскры лось во вре мя ре цен зи ро ва ния

(code review) или пар но го про грам ми ро ва ния? Поч ти на вер ня ка де ло об стоя ло

так:

Эти до пол ни тель ные функ ции бы ли ин те рес ны про грам ми сту, и он с удо воль-

ст ви ем их на пи сал. ( Со вет: Пи ши те по лез ный код, а не при коль ный код. )

Кто-то ре шил, что это мо жет по на до бить ся в бу ду щем, так по че му не на пи-

сать код сра зу. ( Со вет: Это про ти во ре чит YAGNI. Не пи ши те пря мо сей час

то, что пря мо сей час не нуж но.)

Улучшайте код, удаляя его

99

«Из ли ше ст во» не вы гля де ло столь уж боль шим, и про ще бы ло схо ду реа ли зо-

вать эту функ цию, чем об ра щать ся к кли ен ту и вы яс нять, нуж на ли она ему.

( Со вет: Пи сать и со про во ж дать лиш ний код все гда доль ше. Да и кли ент –

слав ный ма лый. Ма лень кий ку со чек лиш не го ко да со вре ме нем раз рас та ет-

ся, как снеж ный ком, в ог ром ный ку сок ра бо ты по со про во ж де нию.)

Что бы оп рав дать до пол ни тель ную функ цию, про грам мист при ду мал но вые

тре бо ва ния, ко то рых не бы ло ни в до ку мен та ции, ни на об су ж де ни ях. Фак ти-

че ски это под дель ные тех ни че ские тре бо ва ния. ( Со вет: Тре бо ва ния к сис те-

ме ус та нав ли ва ют ся не про грам ми ста ми, а за каз чи ком.)

Так над чем вы сей час ра бо тае те? Это дей ст ви тель но нуж но?

97 этюдов для программистов

Установи меня!

Маркус Бэйкер

Мне­нис­коль­ко­не­ин­те­рес­на­ва­ша­про­грам­ма.

У ме ня пол но сво их про блем и длин ню щий спи сок за дач. На ваш сайт я за шел

лишь бла го да ря не про ве рен ным слу хам, буд то ва ша про грам ма ре шит все мои

про бле мы. Уж про сти те мне мое не до ве рие.

Ес ли ис сле до ва ния дви же ния взгля да вер ны, я уже про чел за го ло вок и ша рю по

стра ни це в по ис ках си ней под черк ну той ссыл ки За гру зить сей час. Кста ти, ес ли

я за шел на эту стра ни цу из брау зе ра, ра бо таю ще го под Linux, и мой IP при над-

ле жит Ве ли ко бри та нии, то мож но пред по ло жить, что мне нуж на вер сия для Li-

nux с зер ка ла в Ев ро пе, так что об этом, по жа луй ста, не спра ши вай те. Я так по-

ни маю, что диа ло го вое ок но за груз ки фай ла от кро ет ся сра зу, так что я от прав-

лю эту шту ку в свою пап ку для за гру жен ных фай лов и про дол жу чте ние.

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

Ес ли ва ша про грам ма хоть на се кун ду упа дет ни же при ем ле мо го для ме ня ка че-

ст ва, я тут же ее вы бро шу и най ду что-то дру гое. Не мед лен ное воз на гра ж де ние –

вот в чем си ла.

Пер вый барь ер – ус та нов ка. Ду мае те, не ве ли ка бе да? Так за гля ни те в свою пап-

ку за гру жен ных фай лов. Пол но фай лов .tar и .zip, вер но? Ка кую часть из них вы

рас па ко ва ли? Сколь ко ус та но ви ли? У ме ня, на при мер, лишь тре тья часть из них

слу жит чем-то, кро ме бал ла ста для же ст ко го дис ка.

Да же ес ли я хо чу по лу чить об слу жи ва ние на до му, я не же лаю, что бы вы вхо ди-

ли в мой дом без при гла ше ния. Пре ж де чем на брать ко ман ду install, я бы хо тел

точ но знать, где вы со би рае тесь раз ме щать свои дан ные. Это мой ком пь ю тер,

и я хо чу по воз мож но сти со блю дать на нем по ря док. Я хо чу так же иметь воз мож-

ность уда лить ва шу про грам му в ту же се кун ду, как я раз оча ру юсь в ней. За по-

доз рив, что это не воз мож но, я про сто не бу ду ее ус та нав ли вать. Моя ма ши на ра-

бо та ет ста биль но, и я хо чу, что бы так бы ло и впредь.

Ес ли у ва шей про грам мы гра фи че ский ин тер фейс, я хо тел бы вы пол нить ка кую-

ни будь про стую за да чу и уви деть ре зуль тат. «Мас те ра» тут не по мо гут, по то му

Установи меня!

101

что они де ла ют ка кие-то ве щи, ко то рых я не по ни маю. Весь ма ве ро ят но, что

я за хо чу про честь или за пи сать файл. Я не хо чу соз да вать про ект, им пор ти ро-

вать ка та ло ги или со об щать вам свой элек трон ный ад рес. Ес ли все ра бо та ет, пе-

ре хо дим к учеб ни ку (tutorial).

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

веб-стра ни цу в по ис ках крат ко го ру ко во дства для на чи наю щих. Мне нуж но что-

то вро де «Hello, World» в пя ти не за мы сло ва тых стро ках ко да, и что бы ре зуль тат

был точ но та ким, как опи сы ва ет ваш веб-сайт. Ни ка ких ог ром ных фай лов XML

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

Не за бы вай те, я за гру зил еще и про дукт ва ше го кон ку рен та. Ага, то го са мо го,

ко то рый на всех фо ру мах твер дит, на сколь ко его про дукт луч ше ва ше го. Ес ли

все ра бо та ет, пе ре хо дим к учеб ни ку.

У вас ведь есть учеб ник, да? На по нят ном мне язы ке?

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

я чи таю о том, что я смо гу де лать, мне ста но вит ся ин те рес но и да же ув ле ка тель-

но. Я от ки ды ва юсь в крес ле и при хле бы ваю чай – я ведь уже го во рил, что жи ву

в Ве ли ко бри та нии? Те перь я по иг раю с ва ши ми при ме ра ми и по про бую на учить-

ся поль зо вать ся ва шим тво ре ни ем. Ес ли оно ре шит мои про бле мы, я по шлю вам

бла го дар ст вен ное пись мо. Я бу ду так же по сы лать со об ще ния об ошиб ках, ко гда

при ло же ние па да ет, и пред ло же ния по но вым функ ци ям. Я да же рас ска жу сво-

им друзь ям, что ва ша про грам ма луч ше дру гих, да же ес ли не про бо вал про-

грам мы ва ших кон ку рен тов. И все по то му, что вы с та ким вни ма ни ем от не слись

к мо им пер вым роб ким ша гам.

И как толь ко я мог усом нить ся в вас?

97 этюдов для программистов

Межпроцессная коммуникация

влияет на время отклика

приложения

Рэнди Стэффорд

Вре­мя­от­кли­ка­име­ет­кри­ти­че­ское­зна­че­ние­для­эр­го­но­ми­ки­про­грамм. Ма ло

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

взаи мо дей ст вие с ней со сто ит из по вто ряю щих ся цик лов воз дей ст вия и от кли-

ка1. Воз ни ка ет ощу ще ние, буд то про грам ма кра дет у вас вре мя и сни жа ет про-

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

не все гда, осо бен но в со вре мен ных при ло же ни ях. В ли те ра ту ре, по свя щен ной

кон тро лю про из во ди тель но сти, по-преж не му мно го вни ма ния уде ля ет ся струк-

ту рам дан ных и ал го рит мам, то есть во про сам, спо соб ным ока зы вать влия ние

на про из во ди тель ность в не ко то рых слу ча ях, но ед ва ли в со вре мен ных мно го-

уров не вых при ло же ни ях кор по ра тив но го уров ня.

Мой опыт по ка зы ва ет, что ко гда в та ких при ло же ни ях воз ни ка ет про бле ма про-

из во ди тель но сти, по ис ки ее ре ше ния сле ду ет на чи нать не с изу че ния струк тур

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

мо дей ст вий меж ду уда лен ны ми про цес са ми (interprocess communications, IPC),

осу ще ст в ляе мых в от вет на воз дей ст вие. Да, встре ча ют ся и дру гие ло каль ные

уз кие мес та, но чис ло взаи мо дей ст вий меж ду уда лен ны ми про цес са ми обыч но

име ет ре шаю щее зна че ние. Ка ж дое взаи мо дей ст вие меж ду уда лен ны ми про цес-

са ми до бав ля ет не ко то рую не ну ле вую за держ ку в об щее вре мя от кли ка, и эти

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

Ка но ни че ским при ме ром слу жит пуль си рую щая на груз ка в при ло же ни ях, ис-

поль зую щих объ ект но-ре ля ци он ное ото бра же ние (ORM). Пуль си рую щая на-

груз ка опи сы ва ет по сле до ва тель ное вы пол не ние мно же ст вен ных об ра ще ний

к ба зе дан ных для чте ния дан ных, не об хо ди мых для по строе ния гра фа объ ек тов

1

Автор использует в статье биологические термины «раздражитель» (stimulus) и «ре-

акция» (response) в применении к программному обеспечению. В данной статье под

термином «воздействие» понимается взаимодействие пользователя с системой («раз-

дражитель»), которое запускает определенные ответные действия в системе («от-

клик»). – Прим. науч. ред.

Межпроцессная коммуникация влияет на время отклика приложения

103

(см. шаб лон Lazy Load1 в кни ге Мар ти на Фау ле ра «Patterns of Enterprise App li-

ca ti on Architecture»2, Addison-Wesley Professional). Ко гда кли ен том ба зы дан-

ных яв ля ет ся сер вер при ло же ний про ме жу точ но го уров ня (middle-tier), ко то-

рый ком по ну ет веб-стра ни цу, об ра ще ния к ба зе дан ных обыч но про ис хо дят по-

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

сум мар ное вре мя от кли ка. Да же ес ли ка ж дое об ра ще ние к ба зе дан ных длит ся

все го 10 мс, стра ни ца, тре бую щая 1000 об ра ще ний (что не ред кость), по явит ся

с за держ кой не ме нее чем в 10 се кунд. Дру ги ми при ме ра ми мо гут слу жить об ра-

ще ние к веб-служ бам, HTTP-за про сы веб-брау зе ра, вы зов рас пре де лен ных объ-

ек тов, шаб лон свя зи «за прос-от вет» и взаи мо дей ст вие с таб ли цей дан ных по спе-

ци аль ным се те вым про то ко лам. Чем боль ше уда лен ных IPC тре бу ет ся для от ве-

та на воз дей ст вие, тем боль шим бу дет вре мя от кли ка.

Су ще ст ву ет ряд от но си тель но оче вид ных и ши ро ко из вест ных стра те гий со кра-

ще ния ко ли че ст ва взаи мо дей ст вий меж ду уда лен ны ми про цес са ми в рас че те на

од но воз дей ст вие. Од на из та ких стра те гий за клю ча ет ся в при ме не нии прин ци-

па бе реж ли во сти – мы мо жем оп ти ми зи ро вать ин тер фейс меж ду про цес са ми,

что бы пе ре да ва лись толь ко те дан ные, ко то рые нуж ны не по сред ст вен но, а объ ем

взаи мо дей ст вия был ми ни ма лен. Дру гая стра те гия – как мож но бо лее ши ро кое

рас па рал ле ли ва ние свя зей меж ду про цес са ми, что бы об щее вре мя от кли ка оп-

ре де ля лось в ос нов ном IPC с наи боль шей за держ кой. Тре тья стра те гия – кэ ши-

ро вать ре зуль та ты пред ше ст вую щих IPC, что бы в бу ду щем вме сто IPC ис поль зо-

вать об ра ще ние к ло каль но му кэ шу.

Про ек ти руя при ло же ние, сле ди те за ко ли че ст вом взаи мо дей ст вий меж ду про-

цес са ми, про ис хо дя щих в от вет на ка ж дое воз дей ст вие. Ана ли зи руя при ло же-

ния с низ кой про из во ди тель но стью, я час то стал ки вал ся с тем, что от но ше ние

ко ли че ст ва IPC к воз дей ст вию со став ля ет 1000:1 и боль ше. Со кра ще ние это го

от но ше ния пу тем кэ ши ро ва ния, рас па рал ле ли ва ния или дру гих прие мов даст

зна чи тель но боль ший эф фект, чем из ме не ние струк ту ры дан ных или мо ди фи ка-

ция ал го рит ма сор ти ров ки.

1

http://martinfowler.com/eaaCatalog/lazyLoad.html.

2

Мар тин Фау лер др. «Шаб ло ны кор по ра тив ных при ло же ний». – Пер. с англ. – Виль-

ямс, 2010.

97 этюдов для программистов

Сборка должна быть чистой

Йоханнес Бродуолл

При­хо­ди­лось­ли­вам­ви­деть­спи­сок­пре­ду­пре­ж­де­ний­ком­пи­ля­то­ра (warnings)

раз ме ром с очерк на те му, как не сто ит пи сать код, и ду мать при этом: «Ко неч но,

с этим на до что-то де лать… толь ко сей час у ме ня нет на это вре ме ни»? И на обо-

рот, слу ча лось ли вам уви деть един ст вен ное пре ду пре ж де ние, по явив шее ся во

вре мя ком пи ля ции, и тут же ис пра вить его?

Ко гда я на чи наю но вый про ект с ну ля, нет ни ка ких пре ду пре ж де ний, нет бес по-

ряд ка, нет про блем. Но объ ем ко да рас тет, и, ес ли не при нять ме ры, не ис клю че но,

что бес по ря док, хлам, пре ду пре ж де ния и про бле мы нач нут по сте пен но на ка п -

ли вать ся. В боль шом по то ке «шу ма» зна чи тель но тя же лее оты скать дей ст ви-

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

Что бы пре ду пре ж де ния сно ва ста ли по лез ны ми, я ста ра юсь при дер жи вать ся по-

ли ти ки пол ной не до пус ти мо сти пре ду пре ж де ний во вре мя сбор ки. Да же ес ли

пре ду пре ж де ние не су ще ст вен но, я его уст ра няю. Ес ли оно не кри тич но, но все

же от но сит ся к де лу, я ис прав ляю код. Ес ли ком пи ля тор со об ща ет об опас но сти

ис клю че ния с ну ле вым ука за те лем, я ис прав ляю ис точ ник этой опас но сти, да же

ес ли «знаю», что в ре аль ной об ста нов ке эта про бле ма ни ко гда не воз ник нет. Ес-

ли встро ен ная в код до ку мен та ция (Javadoc или ее ана лог) ссы ла ет ся на па ра-

мет ры, ко то рые уда ле ны или пе ре име но ва ны, я ис прав ляю до ку мен та цию.

Ес ли мне не ин те рес но пре ду пре ж де ние и оно со всем не су ще ст вен ное, я со ве ту-

юсь с ко ман дой, не из ме нить ли нам по ли ти ку вы да чи пре ду пре ж де ний. На при-

мер, я счи таю, что до ку мен ти ро ва ние па ра мет ров и воз вра щае мо го зна че ния ме-

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

пре ду пре ж де ние об их от сут ст вии. Или вот еще: при пе ре хо де на но вую вер сию

язы ка про грам ми ро ва ния мо гут по явить ся пре ду пре ж де ния в ко де – там, где их

рань ше не бы ло. На при мер, ко гда в Java 5 по яви лись обоб ще ния (generics), ста-

рый код, не обо зна чав ший ти пы па ра мет ров обоб ще ний, за пе ст рил пре ду пре ж-

де ния ми. Мне не нуж ны та кие на зой ли вые пре ду пре ж де ния (по ка, во вся ком

слу чае). Пре ду пре ж де ния, не со гла со ван ные с ре аль но стью, бес по лез ны.

Сборка должна быть чистой

105

Обес пе чив не из мен но чис тую сбор ку, я уже не дол жен при рас смот ре нии ка ж до-

го пре ду пре ж де ния ре шать, су ще ст вен но оно или нет. Про иг но ри ро вать что-ли-

бо – это то же ра бо та мыс ли, а я ста ра юсь из бав лять ся от всей лиш ней мыс ли-

тель ной ра бо ты. Бла го да ря чис той сбор ке мне лег че пе ре дать свою ра бо ту дру го-

му че ло ве ку. Ес ли я ос тав лю все эти пре ду пре ж де ния, ко му-то дру го му при дет ся

раз би рать ся с ни ми и ре шать, ка кие из них важ ны, а ка кие нет. А еще ве ро ят нее,

что этот но вый че ло век про сто про иг но ри ру ет все пре ду пре ж де ния, вклю чая су-

ще ст вен ные.

Пре ду пре ж де ния во вре мя сбор ки по лез ны. Нуж но лишь из ба вить ся от бес по лез-

но го шу ма, что бы на чать из вле кать поль зу. Не от кла ды вай те это до «ге не раль-

ной убор ки» ко да. Ес ли что-то на чи на ет мо зо лить гла за, раз бе ри тесь с этим сра зу

же. Нуж но ли бо ис пра вить ис точ ник пре ду пре ж де ния, ли бо по да вить его вы вод,

ли бо из ме нить по ли ти ку вы во да пре ду пре ж де ний ва шей сре ды раз ра бот ки. Чис-

тая сбор ка нуж на не толь ко для про вер ки оши бок ком пи ля ции и «упав ших» тес-

тов. Пре ду пре ж де ния – важ ная и не из беж ная часть под дер жа ния ги гие ны ко да.

97 этюдов для программистов

Умей пользоваться утилитами

командной строки

Кэрролл Робинсон

Се­го­дня­мно­гие­сред­ст­ва­раз­ра­бот­ки­про­грамм­но­го­обес­пе­че­ния­по став ля ют ся

в ви де ин тег ри ро ван ных сред раз ра бот ки (IDE). По ми мо двух по пу ляр ных при-

ме ров – Visual Studio от Microsoft и Eclipse от со об ще ст ва от кры тых про ек тов –

су ще ст ву ет и мно же ст во дру гих. В поль зу IDE мож но ска зать мно гое. Ими лег ко

поль зо вать ся и они из бав ля ют про грам ми ста от не об хо ди мо сти вни кать во мно-

же ст во мел ких де та лей, вклю чая про цесс сбор ки.

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

лег ко поль зо вать ся, ко гда он при ни ма ет ре ше ния за про грам ми ста и ав то ма ти-

че ски про де лы ва ет боль шой объ ем ра бо ты за ку ли са ми. По это му ес ли в ка че ст ве

сре ды про грам ми ро ва ния вы ис поль зуе те толь ко IDE, впол не воз мож но, вы ни-

ко гда до кон ца не пой ме те, что фак ти че ски де ла ют ва ши ин ст ру мен ты. Жме те

на кноп ку, тво рит ся вол шеб ст во, и в пап ке ва ше го про ек та по яв ля ет ся ис пол ня-

е мый файл.

Ра бо тая с ин ст ру мен та ми в ко манд ной стро ке, вы го раз до боль ше уз нае те о том,

что де ла ют ва ши ин ст ру мен ты во вре мя сбор ки про ек та. Со став ле ние соб ст вен-

ных make-фай лов по мо жет ос мыс лить все эта пы сбор ки ис пол няе мо го фай ла

(ком пи ля ция, ас семб ли ро ва ние, ком по нов ка и т. д.). Экс пе ри мен ты с мно го чис-

лен ны ми клю ча ми ко манд ных строк этих ин ст ру мен тов – цен ная и по зна ва-

тель ная прак ти ка. На чать ра бо ту с ин ст ру мен та ми ко манд ной стро ки для сбор-

ки мож но со средств ко манд ной стро ки с от кры тым ис ход ным ко дом, та ких как

GCC, или тех, что по став ля ют ся в со ста ве ва шей ком мер че ской IDE. В кон це

кон цов, пра виль но спро ек ти ро ван ная IDE – это все го лишь гра фи че ский ин тер-

фейс к на бо ру ин ст ру мен тов ко манд ной стро ки.

Так вы об ре те те луч шее по ни ма ние про це ду ры сбор ки. Кро ме то го, оп ре де лен-

ные за да чи в ко манд ной стро ке вы пол ня ют ся про ще и эф фек тив нее, чем в IDE.

На при мер, воз мож но сти по ис ка и за ме ны та ких ути лит, как grep и sed, за час тую

пре вы ша ют ана ло гич ные функ ции IDE. Ин ст ру мен ты ко манд ной стро ки ори ен-

ти ро ва ны на сце нар ное вы пол не ние за дач, что по зво ля ет ав то ма ти зи ро вать, на-

при мер, вы пол не ние еже днев ной сбор ки в за дан ное вре мя, соз да ние не сколь ких

Умей пользоваться утилитами командной строки

107

вер сий про ек та и про гон на бо ров тес тов. В IDE ав то ма ти за ция та ко го ро да мо-

жет быть за труд не на (или во об ще не воз мож на), по то му что па ра мет ры сбор ки

обыч но ука зы ва ют ся че рез диа ло го вые ок на GUI, а про це ду ра сбор ки за пус ка ет-

ся щелч ком мы ши. Ес ли вы ни ко гда не вы хо ди ли за рам ки IDE, то, воз мож но,

не до га ды вае тесь о воз мож но сти ав то ма ти за ции та ких за дач.

Ми ну точ ку. Раз ве IDE су ще ст ву ют не для то го, что бы об лег чить раз ра бот ку и по-

вы сить про дук тив ность про грам ми ста? Что ж, все так. Я во все не пред ла гаю пре-

кра тить поль зо вать ся IDE. Про сто вам сле ду ет за гля нуть «под ка пот» и по нять,

ка кие за да чи IDE вы пол ня ет за вас. И наи луч ший спо соб это сде лать – на учить-

ся при ме нять ин ст ру мен ты ко манд ной стро ки. По сле это го, вер нув шись к сво ей

IDE, вы го раз до луч ше бу де те по ни мать, что она за вас де ла ет и как мож но управ-

лять про цес сом сбор ки. С дру гой сто ро ны, ос во ив ра бо ту с ин ст ру мен та ми ко-

манд ной стро ки и по знав их мощь и гиб кость, вы, воз мож но, пред поч те те поль-

зо вать ся ко манд ной стро кой вме сто IDE.

97 этюдов для программистов

Как следует изучи более

двух языков программирования

Рассел Уиндер

Пси­хо­ло­гия­про­грам­ми­ро­ва­ния: дав но уже из вест но, что про фес сио на лизм про-

грам ми ста не по сред ст вен но за ви сит от ко ли че ст ва раз лич ных па ра дигм про-

грам ми ро ва ния, ко то ры ми он вла де ет – не про сто что-то слы шал и зна ет о них,

но уме ет ре аль но ис поль зо вать их в ра бо те.

Ка ж дый про грам мист на чи на ет с ка ко го-то од но го язы ка. Этот язык ока зы ва ет

пре об ла даю щее влия ние на то, как про грам мист ви дит про грамм ное обес пе че-

ние. Но ка ким бы дол гим ни был опыт ра бо ты про грам ми ста с этим язы ком, ес-

ли он ра бо та ет толь ко с ним од ним, то и бу дет знать толь ко этот язык. Мыш ле-

ние про грам ми ста, знаю ще го лишь один язык, ог ра ни че но воз мож но стя ми это-

го язы ка.

Про грам мист, изу чаю щий вто рой язык, встре тит ся с труд но стя ми, осо бен но ес-

ли вы чис ли тель ная мо дель вто ро го язы ка от ли ча ет ся от пер во го. C, Pascal, Fort-

ran – все они ос но ва ны на од ной вы чис ли тель ной мо де ли. Пе ре ход с Fortran на C

вы зы ва ет не ко то рые труд но сти, но их не так мно го. Пе ре ход с C или Fortran на

C++ или Ada со про во ж да ет ся фун да мен таль ны ми труд но стя ми с по ни ма ни ем

по ве де ния про грамм. Пе ре ход с C++ на Haskell оз на ча ет су ще ст вен ные из ме не-

ния, а по то му су ще ст вен ные труд но сти. Пе ре ход с язы ка C на Prolog ста нет весь-

ма су ще ст вен ным ис пы та ни ем.

Мож но пе ре чис лить не ко то рые па ра диг мы вы чис ле ний: про це дур ная, объ ект но-

ори ен ти ро ван ная, функ цио наль ная, ло ги че ская, па ра диг ма по то ков дан ных

и т. д. Пе ре ход меж ду эти ми па ра диг ма ми соз да ет наи боль шие труд но сти.

Чем по лез ны та кие труд но сти? Здесь иг ра ют роль на ши пред став ле ния о реа ли-

за ци ях ал го рит мов, а так же идио мах и шаб ло нах этих реа ли за ций. В ча ст но-

сти, вза им ное обо га ще ние идея ми ле жит в ос но ве дос ти же ния мас тер ст ва. Идио-

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

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

луч ше по ни мать оба эти язы ка и за да чу, ко то рую ре ша ем.

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

109

Вза им ное обо га ще ние при ис поль зо ва нии раз ных язы ков про грам ми ро ва ния

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

рас ту щее при ме не ние дек ла ра тив ных ре жи мов опи са ния в сис те мах, реа ли зо-

ван ных по сред ст вом им пе ра тив ных язы ков. Лю бой зна ток функ цио наль но го

про грам ми ро ва ния мо жет лег ко при ме нить дек ла ра тив ный под ход, да же при

ра бо те с та ким язы ком, как C. При ме не ние дек ла ра тив ных ме то дов обыч но при-

во дит к соз да нию бо лее ко рот ких и по нят ных про грамм. Ска жем, C++ оп ре де-

лен но вы сту па ет за та кой под ход, обес пе чи вая все сто рон нюю под держ ку обоб-

щен но го (generic) про грам ми ро ва ния, в ко то ром дек ла ра тив ный ре жим опи са-

ния яв ля ет ся поч ти обя за тель ным.

Как след ст вие все го ска зан но го вы ше ка ж до му про грам ми сту над ле жит уметь

хо ро шо про грам ми ро вать хо тя бы в двух раз ных па ра диг мах, а в идеа ле хо тя бы

в пе ре чис лен ных пя ти. Про грам мист все гда дол жен стре мить ся к ос вое нию но-

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

в сво ей по все днев ной ра бо те он не из мен но ис поль зу ет один и тот же язык про-

грам ми ро ва ния, нель зя не до оце ни вать то бо лее ис кус ное при ме не ние это го язы-

ка, ко то рое ста нет воз мож ным бла го да ря иде ям из дру гих па ра дигм. Ра бо то да-

те лям сле ду ет это учесть и за кла ды вать в бюд жет обу че ние со труд ни ков язы-

кам, ко то рые в дан ное вре мя на про ек тах не ис поль зу ют ся, как сред ст во на учить

ра бот ни ков бо лее ис кус но при ме нять те язы ки, ко то рые ре аль но ис поль зу ют ся.

Не де ля на чаль но го кур са – это хо ро шо, но не дос та точ но для изу че ния но во го

язы ка. Что бы при об ре сти ра бо чие на вы ки при ме не ния язы ка, обыч но нуж но

по тра тить не сколь ко ме ся цев хо тя бы фа куль та тив но. Важ но прак ти че ское ос-

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

97 этюдов для программистов

Знай свою IDE

Хейнц Кабуц

В­вось­ми­де­ся­тые­го­ды­сре­да­про­грам­ми­ро­ва­ния, как пра ви ло, не силь но от ли-

ча лась от тек сто во го ре дак то ра с на во ро та ми – в луч шем слу чае. Это се го дня мы

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

вре мя она бы ла рос ко шью, дос туп ной да ле ко не ка ж до му. Сред ст ва фор ма ти ро-

ва ния ко да су ще ст во ва ли в ви де внеш них ин ст ру мен тов, при ме не ние ко то рых

кор рек ти ро ва ло рас ста нов ку про бе лов. От лад чи ки то же «жи ли» от дель но как

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

знать мас су за га доч ных со че та ний кла виш.

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

удоб ных и по лез ных ин ст ру мен тов раз ра бот ки. Ин тег ри ро ван ная сре да раз ра-

бот ки (Integrated Development Environment, IDE) объ еди ни ла уже пред ла гав-

шие ся ра нее функ ции ре дак ти ро ва ния с ком пи ля то ром, от лад чи ком, сред ст ва ми

фор ма ти ро ва ния и дру ги ми ин ст ру мен та ми. Как раз в это вре мя ста ли по пу ляр-

ны ме ню и мышь, а зна чит, от па ла на доб ность за учи вать раз ра бот чи кам слож-

ные ком би на ции кла виш для ра бо ты со сво им ре дак то ром. Дос та точ но бы ло вы-

брать ко ман ду из ме ню.

В два дцать пер вом ве ке IDE на столь ко рас про стра ни лись, что не ко то рые ком па-

нии, на це лен ные на до ли рын ка в дру гих об лас тях, раз да ют их бес плат но. Со-

вре мен ная IDE пред ла га ет мно же ст во вос хи ти тель ных функ ций. Мне осо бен но

нра вит ся ав то ма ти че ский ре фак то ринг, в ча ст но сти функ ция Extract Method,

по зво ляю щая вы де лить фраг мент ко да и сде лать из не го ме тод. Сред ст ва ре фак-

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

ста но вит ся чрез вы чай но про сто мо ди фи ци ро вать код. Моя IDE да же най дет дру-

гие фраг мен ты ко да, ко то рые мож но за ме нить вы зо вом это го ме то да, и спро сит

у ме ня, сле ду ет ли это сде лать.

Дру гая за ме ча тель ная воз мож ность со вре мен ных IDE – спо соб ность при ну ж дать

к со блю де нию сти ля, при ня то го в ком па нии. На при мер, в Java не ко то рые про-

грам ми сты ста ли объ яв лять все па ра мет ры final (на мой взгляд, это пус тая тра-

та вре ме ни). Тем не ме нее раз та кое пра ви ло ус та нов ле но, мне дос та точ но за дать

Знай свою IDE

111

его в на строй ках IDE, и я ста ну по лу чать пре ду пре ж де ния для всех па ра мет ров,

ко то рые не объ яв ле ны как final. С по мо щью пра вил сти ля мож но так же ис кать

воз мож ные ошиб ки, та кие как про вер ка ра вен ст ва ав то ма ти че ски упа ко ван ных

(autoboxed) объ ек тов по сред ст вом ссы лоч ной се ман ти ки, как в слу чае ис поль зо-

ва ния опе ра то ра == для при ми ти вов, упа ко ван ных в со от вет ст вую щие объ ек ты.

К со жа ле нию, со вре мен ные IDE не тре бу ют, что бы мы при ла га ли уси лия к ос во-

е нию этих са мых IDE. Ко гда я на чал про грам ми ро вать на C под UNIX, мне при-

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

обу слов ле но его кри вой обу че ния. Но по тра чен ное на стар те вре мя сто ри цей оку-

пи лось с го да ми. Да же чер но вик этой ста тьи на бран в vi. У со вре мен ных IDE

кри вая обу че ния та кая, что мы ни ко гда не вы хо дим за пре де лы ба зо вых прие-

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

Пер вое, что я де лаю при изу че нии IDE, – за по ми наю управ ляю щие со че та-

ния кла виш. Ко гда я на би раю код, паль цы ле жат на кла виа ту ре, и на жа тие

Ctrl+Shift+I по зво ля ет встро ить пе ре мен ную (опе ра ция ре фак то рин га Inline Va-

ri able), не на ру шая ра бо че го по то ка, то гда как на ви га ция по ме ню ука за те лем

мы ши от влек ла бы ме ня. Та кие от вле че ния соз да ют не нуж ные пе ре клю че ния

кон тек ста и зна чи тель но сни жа ют мою про дук тив ность, ес ли я пы та юсь де лать

все «ле ни вым» об ра зом. То же спра вед ли во в от но ше нии вла де ния кла виа ту рой:

ос вой те пе чать всле пую, и вы не по жа лее те о по тра чен ном вре ме ни.

На ко нец, у про грам ми стов есть про ве рен ные вре ме нем кон вей ер ные UNIX-ути-

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

ес ли при ре цен зи ро ва нии ко да я за ме чаю, что про грам ми сты на зва ли мно гие

клас сы оди на ко во, я лег ко мо гу об на ру жить эти по вто ре ния с по мо щью ути лит

find, sed, sort, uniq и grep, на при мер:

find . -name "*.java" | sed 's/.*\///' | sort | uniq -c | grep -v "^ *1 " | sort -r

Мы ожи да ем, что по се тив ший нас сан тех ник уме ет поль зо вать ся па яль ной лам-

пой. Да вай те же по тра тим не мно го вре ме ни и по учим ся бо лее эф фек тив но ра бо-

тать со свои ми IDE.

97 этюдов для программистов

Знай свои возможности

Грег Колвин

Нуж но знать пре дел сво их воз мож но стей.

«Гряз ный Гар ри»

Ва­ши­ре­сур­сы­ог­ра­ни­че­ны. От ве ден ные на вы пол не ние ра бо ты вре мя и день ги

оп ре де ле ны кон крет но, в том чис ле вре мя и день ги, не об хо ди мые для под дер жа-

ния ва ших зна ний, на вы ков и ин ст ру мен тов на со вре мен ном уров не. Су ще ст ву-

ет пре дел ин тен сив но сти, ско ро сти, изо бре та тель но сти и дли тель но сти для ва-

шей ра бо ты. Воз мож но сти ва ших ин ст ру мен тов ог ра ни че ны. Мощ ность ма шин,

для ко то рых вы пи ше те про грам мы, ог ра ни че на. По это му вы долж ны учи ты-

вать пре де лы сво их ре сур сов.

Как учесть эти гра ни цы? Нуж но знать се бя, сво их со труд ни ков, свой бюд жет

и свою тех ни ку. Ин же не ру-про грам ми сту нуж но знать про стран ст вен но-вре-

мен ную слож ность сво их струк тур дан ных и ал го рит мов, ар хи тек ту ру и по ка-

за те ли про из во ди тель но сти сво их сис тем. Ва ша за да ча – соз дать оп ти маль ное

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

Про стран ст вен ная и вре мен ная слож ность за да ют ся в ви де функ ции O( f( n)), где

n рав но раз ме ру вход ных дан ных. Эта функ ция оп ре де ля ет асим пто ти че ское по-

ве де ние па мя ти или вре ме ни для n, стре мя ще го ся

к бес ко неч но сти. Важ ные клас сы слож но сти для

y

f( n) – это ln( n), n, n ln( n), ne и en. Как яс но вид но из

10

гра фи ков этих функ ций, ко гда n рас тет, O( ln( n))

9

n ln(n)

ста но вит ся го раз до мень ше O( n) и O( n ln( n)), а те,

en

8

ne

в свою оче редь, ста но вят ся го раз до мень ше O( n

n

e)

7

и O( en). В фор му ли ров ке Шо на Пэ рен та (Sean Parent):

6

для прак ти че ски дос ти жи мых n все клас сы слож-

5

4

но сти близ ки к функ ци ям кон стант, ли ней ным

3

ln(n)

ли бо бес ко неч ным.

2

Ана лиз слож но сти осу ще ст в ля ет ся в тер ми нах не-

1

x

кой аб ст ракт ной ма ши ны, но про грам мы ра бо та ют 1 0 1 2 3 4 5 6 7 8 9 10 11

Знай свои возможности

113

на ре аль ных ком пь ю те рах. Со вре мен ные

Время доступа Емкость

ком пь ю тер ные сис те мы об ра зу ют це лые ие-

Регистр

<1 нс

64 бит

рар хии фи зи че ских и вир ту аль ных ма шин,

Уровень кэша

64 байт

вклю чаю щие биб лио те ки вре ме ни вы пол-

Кэш L1

1 нс

64 килобайт

не ния для язы ков про грам ми ро ва ния, опе-

Кэш L2

4 нс

8 мегабайт

ра ци он ные сис те мы, про цес со ры, кэш-па-

ОЗУ

20 нс

32 гигабайт

мять, опе ра тив ную па мять, же ст кие дис ки

и се ти. В при ве ден ной таб ли це по ка за ны

Диск

10 мс

10 терабайт

пре де лы вре ме ни про из воль но го дос ту па

Локальная сеть 20 мс

>1 петабайт

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

Интернет

100 мс

>1 зеттабайт

ти пич но го сер ве ра, под клю чен но го к се ти.

За ме тим, что ва риа тив ность па мя ти и ско ро сти со став ля ет не сколь ко по ряд ков.

Для ком пен са ции раз ли чий на всех уров нях сис те мы ин тен сив но при ме ня ет ся

кэ ши ро ва ние и уп ре ж даю щий про смотр, но они дей ст вен ны толь ко то гда, ко гда

дос туп пред ска зу ем. Ес ли час то про ис хо дят кэш-про ма хи, сис те ма бу дет тор мо-

зить. На при мер, слу чай ное чте ние ка ж до го бай та на же ст ком дис ке мо жет за-

нять 32 го да. Да же слу чай ное чте ние ка ж до го бай та опе ра тив ной па мя ти мо жет

за нять 11 ми нут. Слу чай ный дос туп не пред ска зу ем. А что пред ска зуе мо? За ви-

сит от сис те мы, но обыч но вы иг рыш при но сят по втор ный дос туп к не дав но счи-

тан ным дан ным и по сле до ва тель ный дос туп к эле мен там дан ных.

Ал го рит мы и струк ту ры дан ных раз ли ча ют ся эф фек тив но стью ис поль зо ва ния

кэ ша. На при мер:

Ли ней ный по иск эф фек тив но ис поль зу ет уп ре ж даю щий про смотр, но тре бу-

ет O( n) срав не ний.

Дво ич ный по иск в от сор ти ро ван ном мас си ве тре бу ет все го O( log( n)) срав не ний.

По иск по де ре ву ван Эм де Боа са (van Emde Boas) име ет слож ность O( log( n))

и не чув ст ви те лен к кэ шу.

Что вы брать? Для окон ча тель но го ана ли за нуж ны из ме ре ния. В таб ли це ни же

по ка за но вре мя по ис ка в мас си вах 64-раз ряд ных це лых чи сел с по мо щью этих

трех ме то дов. На мо ем ком пь ю те ре:

Ли ней ный по иск со став ля ет кон ку рен-

Время поиска (нс)

цию дру гим ме то дам на ма лых мас си-

8

50

90

40

вах, но про иг ры ва ет экс по нен ци аль но

на боль ших.

64

180

150

70

512

1200

230

100

По иск ван Эм де Боа са по бе ж да ет без ва-

4096 17000

320

160

ри ан тов бла го да ря схе ме пред ска зуе мо-

го дос ту па.

Линейный Двоичный ван Эмде Боас

Ка ж дый сам ре ша ет, что для не го луч ше.

— Punch

97 этюдов для программистов

Знай, что сохранишь

в репозиторий

Дэн Берг Джонссон

Я­по­хло­пал­трех­про­грам­ми­стов­по­пле­чу­и по ин те ре со вал ся, чем они за ня ты.

«Я про во жу ре фак то ринг этих ме то дов», – был от вет пер во го. «Я до бав ляю кое-

ка кие па ра мет ры в эту веб-опе ра цию», – от ве чал вто рой. Тре тий ска зал: «Я ра-

бо таю над этим сце на ри ем ис поль зо ва ния».

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

и толь ко тре тий ви дел кар ти ну ши ре, и его под ход луч ше. Я по ин те ре со вал ся,

ко гда и что они со би ра ют ся по мес тить в ре по зи то рий, и тут кар ти на рез ко из ме-

ни лась. Пер вые два впол не яс но пред став ля ли, ка кие это бу дут фай лы, и со би ра-

лись за кон чить ра бо ту при мер но в те че ние ча са. Тре тий ска зал: «Пред по ла гаю,

что за кон чу че рез не сколь ко дней. На вер ное, я до бав лю не ко то рые клас сы и как-

то мо ди фи ци рую служ бы».

Де ло не в том, что два про грам ми ста не об ла да ли цель ной кар ти ной про ис хо дя-

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

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

они вы бе рут но вую функ цию или ре фак то ринг для ра бо ты. Та ким об ра зом, они

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

ли стич ную цель.

Тре тий про грам мист ока зал ся не спо со бен про вес ти де ком по зи цию за да чи и ра-

бо тал сра зу по всем на прав ле ни ям. Он не имел пред став ле ния о том, во что это

выль ет ся, и в прин ци пе за ни мал ся рис ко ван ной ра бо той в на де ж де, что в ка кой-

то мо мент у не го по явит ся код для за пи си в ре по зи то рий. Ве ро ят нее все го, на пи-

сан ный на стар те это го дол го го пред при ятия код ока зал ся ма ло при год ным для

то го ре ше ния, ко то рое по лу чи лось в ито ге.

Как по сту пи ли бы пер вые два про грам ми ста, по тре буй их за да чи бо лее двух ча-

сов ра бо ты ка ж дая? По няв, что не рас счи та ли свои си лы, они, ско рее все го, от ка-

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

ча ла. Про дол жай они ра бо ту, про изош ла бы рас фо ку си ров ка, а в ре по зи то рий

Знай, что сохранишь в репозиторий

115

по пал бы со мни тель ный код. Луч ше от бро сить сде лан ные из ме не ния, но со хра-

нить по ни ма ние су ти.

Тре тий про грам мист, воз мож но, про дол жил бы свои га да ния и в от чая нии ста-

рал ся бы сшить из сво их за пла ток код, ко то рый мож но со хра нить в ре по зи то-

рий. В кон це кон цов, как же мож но вы бра сы вать вне сен ные из ме не ния – ведь

это бу дет оз на чать, что вы на прас но тру ди лись! К со жа ле нию, ес ли не вы бра сы-

вать та кой код, в ре по зи то рий по па да ет слег ка стран но ва тый код, не ре шаю щий

оп ре де лен ную за да чу.

Бы ва ют мо мен ты, ко гда да же про грам ми сты, ко то рые ори ен ти ро ва ны на час тое

со хра не ние ко да в ре по зи то рий, не мо гут най ти ни че го по лез но го, с чем бы они

мог ли спра вить ся за па ру ча сов. То гда они пе ре хо дят в ре жим на пи са ния не на-

деж но го ко да и ба лу ют ся с ко дом, но, ко неч но, вы ки ды ва ют свои из ме не ния, ко-

гда не кое оза ре ние воз вра ща ет их на путь ис тин ный. Да же та кие бес смыс лен-

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

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

Оп ре де ли те, что сда ди те в ре по зи то рий на сей раз. Ес ли не уда ет ся за вер шить

за да чу, уда ли те свои из ме не ния и оп ре де ли те но вую за да чу на ос но ве при об ре-

тен но го по ни ма ния. Зай ми тесь рис ко ван ны ми экс пе ри мен та ми, ес ли это не об-

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

на пи са ния со мни тель но го ко да. Не по ме щай те в ре по зи то рий пло ды рис ко ван-

ных экс пе ри мен тов.

97 этюдов для программистов

Место для больших наборов

взаимосвязанных данных –

в базе данных

Диомидис Спинеллис

Ес­ли­ва­ше­при­ло­же­ние­долж но об ра ба ты вать боль шой дол го веч ный на бор взаи-

мо свя зан ных эле мен тов дан ных, мо же те, не раз ду мы вая, по мес тить его в ре ля-

ци он ную ба зу дан ных. В про шлом РСУБД бы ло ма ло, они бы ли слож ны ми, до-

ро ги ми в со дер жа нии и не ук лю жи ми жи вот ны ми. Эти вре ме на ми но ва ли. Се го-

дня най ти РСУБД не труд но: впол не воз мож но, что на ва шей ма ши не уже ус та-

нов ле на РСУБД или да же две. Не ко то рые весь ма про дви ну тые РСУБД, та кие

как MySQL и PostgreSQL, дос туп ны в ис ход ном ко де, по это му во прос о за тра тах

на их по куп ку боль ше не сто ит. Бо лее то го, так на зы вае мые «встраи вае мые сис-

те мы баз дан ных» мож но под клю чать к ва ше му при ло же нию в ви де биб лио тек,

поч ти не тре бую щих на строй ки и ад ми ни ст ри ро ва ния; к та ким от но сят ся две

ин те рес ные от кры тые СУБД, SQLite и HSQLDB. По доб ные сис те мы край не эф-

фек тив ны.

Ес ли дан ные ва ше го при ло же ния не по ме ща ют ся в ОЗУ сис те мы, ин дек си ро ван-

ная таб ли ца РСУБД бу дет ра бо тать на не сколь ко по ряд ков бы ст рее, чем ас со циа-

тив ные мас си вы биб лио те ки язы ка, где уз ким ме стом ста нет за груз ка стра ниц

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

ют ся по ме ре рос та ва ших по треб но стей. При над ле жа щем под хо де вы смо же те

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

это по на до бит ся. За тем вы смо же те пе рей ти с бес плат ной ба зы с от кры тым ко-

дом на ком мер че скую сис те му, пред ла гаю щую бо лее раз ви тую под держ ку или

воз мож но сти.

Изу чив SQL дос та точ но хо ро шо, вы бу де те с удо воль ст ви ем соз да вать при ло же-

ния, по стро ен ные во круг баз дан ных. По сле то го как нор ма ли зо ван ные дан ные

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

ных с по мо щью про зрач но сфор му ли ро ван ных за про сов SQL; не нуж но пи сать

для это го слож ный код. Ана ло гич ным об ра зом в та кие на бо ры дан ных мож но

вно сить слож ные из ме не ния при по мо щи един ст вен ной ко ман ды SQL. Для ра зо-

вых мо ди фи ка ций, на при мер при не об хо ди мо сти из ме нить спо соб ор га ни за ции

хра ни мых дан ных, не нуж но да же пи сать код – дос та точ но за пус тить при ло же-

Место для больших наборов взаимосвязанных данных – в базе данных

117

ние пря мо го SQL-дос ту па к ба зе дан ных. Этот ин тер фейс по зво лит так же экс пе-

ри мен ти ро вать с за про са ми в об ход цик ла ре дак ти ро ва ния-ком пи ля ции обыч-

ных язы ков про грам ми ро ва ния.

Дру гое пре иму ще ст во ко да, ори ен ти ро ван но го на ис поль зо ва ние РСУБД, – это

под держ ка свя зей меж ду эле мен та ми дан ных. Мож но опи сать ог ра ни че ния ( con-

stra ints), обес пе чи ваю щие це ло ст ность дан ных, что по зво лит из бе жать рис ка

по яв ле ния ви ся чих ссы лок, ес ли вы за бу де те об но вить свои дан ные в слу чае с по-

гра нич ны ми ус ло вия ми. На при мер, ог ра ни че ние мож но сфор му ли ро вать так,

что при уда ле нии поль зо ва те ля бу дут уда ле ны и все со об ще ния, от прав лен ные

этим поль зо ва те лем.

Мож но так же в лю бой мо мент соз да вать бы ст рые свя зи меж ду хра ня щи ми ся

в ба зе за пи ся ми пу тем про стой ге не ра ции ин дек са. Не тре бу ет ся про во дить до-

ро го стоя щий и об шир ный ре фак то ринг по лей клас са. Кро ме то го, ко гда код по-

стро ен на ос но ве ба зы дан ных, к этим дан ным мо гут без опас но об ра щать ся дру-

гие при ло же ния. Бла го да ря это му лег ко до ба вить в ва ше при ло же ние па рал-

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

под хо дя щих язы ков или плат форм. На при мер, мож но на пи сать XML-сер вер

веб-при ло же ния на Java, не ко то рые сце на рии для ау ди та – на Ruby, а ин тер фейс

ви зуа ли за ции – с по мо щью Processing1.

На ко нец, сле ду ет пом нить, что РСУБД при ло жит мак си мум уси лий, что бы оп-

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

вать ся на функ цио наль но сти сво его при ло же ния, а не на тон кой на строй ке ал го-

рит мов. Бо лее раз ви тые ба зы дан ных спо соб ны да же ис поль зо вать пре иму ще ст-

ва мно го ядер ных про цес со ров, при чем со вер шен но без ва ше го уча стия. По ме ре

со вер шен ст во ва ния тех но ло гий бу дет рас ти и про из во ди тель ность ва ше го при-

ло же ния.

1

http://www.processing.org/

97 этюдов для программистов

Учите иностранные языки

Клаус Маркардт

Про­грам­ми­стам­нуж­но­об­щать­ся. И об щать ся мно го.

В жиз ни про грам ми ста бы ва ют пе рио ды, ко гда об ще ние в ос нов ном про ис хо дит

с ком пь ю те ром – точ нее, с вы пол няе мы ми на нем про грам ма ми. Это об ще ние

осно ва но на вы ра же нии идей в по нят ном ма ши не ви де. Воз мож ность пре вра-

щать идеи в ре аль ность по сред ст вом про грамм и прак ти че ски без ис поль зо ва-

ния фи зи че ско го ве ще ст ва по-преж не му вы зы ва ет вос торг.

Про грам мист дол жен бег ло вла деть язы ком ма ши ны – ре аль ной или вир ту аль-

ной – и аб ст рак ция ми, ко то рые мож но свя зать с этим язы ком с по мо щью ин -

стру мен тов раз ра бот чи ка. Важ но знать мно го раз ных аб ст рак ций, ина че не ко то-

рые идеи очень труд но вы ра зить. Хо ро ший про грам мист дол жен уметь вы хо дить

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

бо лее вы ра зи тель ные для дру гих за дач. В ка кой-то мо мент эти зна ния обя за-

тель но оку пят ся.

Про грам ми стам нуж но об щать ся не толь ко с ма ши на ми, но и со свои ми кол ле га-

ми. Со вре мен ный круп ный про ект – это боль ше со ци аль ное пред при ятие, чем

про сто при ло же ние ис кус ст ва про грам ми ро ва ния. В нем тре бу ет ся по нять и вы-

ра зить боль ше, чем по зво ля ют дос туп ные ма ши нам аб ст рак ции. Луч шие из из-

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

а час то так же и дру ги ми язы ка ми. И это важ но не толь ко для об ще ния: уме ние

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

че го не воз мож но аб ст ра ги ро вать за да чу. А это то же часть про грам ми ро ва ния.

Об щать ся при хо дит ся не толь ко с ма ши ной, са мим со бой и кол ле га ми, но и с мно-

ги ми дру ги ми свя зан ны ми с про ек том ли ца ми, ко то рые мо гут не иметь тех ни че-

ской под го тов ки. Они за ня ты тес ти ро ва ни ем и кон тро лем ка че ст ва, раз вер ты ва-

ни ем при ло же ний или мар ке тин гом и про да жей. Ино гда это ко неч ные поль зо ва-

те ли в ка ком-то офи се (или в ма га зи не, или у се бя до ма). Не об хо ди мо их по ни мать

и знать, с ка ки ми про бле ма ми они стал ки ва ют ся, а это поч ти не воз мож но, ес ли

вы не умее те го во рить с ни ми на од ном язы ке – язы ке их ми ра, их пред мет ной

Учите иностранные языки

119

об лас ти. Ко гда вам ка жет ся, что раз го вор с ни ми про шел удач но, они, воз мож но,

так не счи та ют.

Ес ли вы об щае тесь с бух гал те ра ми, нуж но при мер но пред став лять, что та кое

«учет за трат по мес там их воз ник но ве ния», «вло жен ный ка пи тал», «чис тые ак-

ти вы» и т. п. Ес ли вы бе се дуе те со спе циа ли ста ми по мар ке тин гу или юри ста ми,

их жар гон и язык (а зна чит, ми ро по ни ма ние) долж ны быть в ка кой-то ме ре из-

вест ны и вам. Все ми эти ми язы ка ми, спе ци фи че ски ми для пред мет ной об лас ти

про ек та, дол жен вла деть кто-то из про ек та – в идеа ле про грам ми сты. В ко неч-

ном сче те про грам ми сты от ве ча ют за прак ти че скую реа ли за цию идей по сред ст-

вом ком пь ю те ров.

И ко неч но, жизнь со сто ит не толь ко из про грамм ных про ек тов. Как за ме тил

Карл Ве ли кий, знать вто рой язык – зна чит иметь вто рую ду шу. Вы оце ни те

поль зу зна ния ино стран ных язы ков, ко гда при дет ся об щать ся со зна ко мы ми за

рам ка ми от рас ли про грамм ной раз ра бот ки. Пой ме те, ко гда луч ше слу шать, чем

го во рить. Уз нае те, что боль шая часть об ще ния про ис хо дит без слов.

О чем нель зя го во рить, о том сле ду ет мол чать.

Люд виг Вит ген штейн

97 этюдов для программистов

Учитесь делать оценки

Джованни Аспрони

Бу­ду­чи­ про­грам­ми­стом, вы долж ны уметь пре дос тав лять сво им ме нед же рам,

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

дос та точ но точ ное пред став ле ние о вре ме ни, стои мо сти, тех но ло ги ях и дру гих

ре сур сах, не об хо ди мых им для дос ти же ния сво их це лей.

Для про ве де ния надежной оцен ки необходимо вла деть не ко то ры ми прие ма ми.

Од на ко сначала сле ду ет ра зо брать ся, что со бой пред став ля ют оцен ки и для че го

они мо гут быть ис поль зо ва ны – как ни стран но, мно гие раз ра бот чи ки и ме нед-

же ры пло хо в этом раз би ра ют ся.

Вот ти пич ный диа лог меж ду ме нед же ром про ек та и про грам ми стом:

Ме нед жер: Мо жешь оце нить, сколь ко те бе нуж но вре ме ни, что бы раз ра бо-

тать функ цию X?

Про грам мист: Ме сяц.

Ме нед жер: Это слиш ком дол го! У нас есть все го не де ля.

Про грам мист: Мне нуж но хо тя бы три.

Ме нед жер: Боль ше двух я те бе дать не мо гу.

Про грам мист: По ру кам!

В ито ге про грам мист пред ла га ет «оцен ку», при ем ле мую для ме нед же ра. Но по-

сколь ку она как бы сде ла на про грам ми стом, ме нед жер бу дет счи тать, что про-

грам мист не сет за нее от вет ст вен ность. Для по ни ма ния то го, что не пра виль но

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

Оцен ка – это при бли зи тель ный под счет или су ж де ние от но си тель но зна че-

ния, чис ла, ко ли че ст ва или про тя жен но сти че го-ли бо. Это оп ре де ле ние пред-

по ла га ет, что оцен ка яв ля ет ся фак ти че ской ме рой, ос но ван ной на на деж ных

дан ных и преж нем опы те; меч ты и по же ла ния долж ны быть ис клю че ны при

ее рас че те. Это оп ре де ле ние пред по ла га ет так же, что оцен ка при бли зи тель на

и не мо жет быть да на точ но, на при мер, оцен ка про дол жи тель но сти раз ра бот-

ки не мо жет со ста вить 234,14 дня.

Учитесь делать оценки

121

Цель – это опи са ние биз нес-за да чи, ко то рую тре бу ет ся ре шить, на при мер

«сис те ма долж на под дер жи вать од но вре мен ную ра бо ту не ме нее 400 поль зо-

ва те лей».

Обя за тель ст во – это обе ща ние обес пе чить ука зан ную функ цио наль ность с оп-

ре де лен ным уров нем ка че ст ва к оп ре де лен но му сро ку или со бы тию. На при-

мер, «функ ция по ис ка бу дет дос туп на в сле дую щей вер сии про дук та».

Оцен ки, це ли и обя за тель ст ва не за ви сят друг от дру га, но це ли и обя за тель ст ва

долж ны ос но вы вать ся на на деж ных оцен ках. Как от ме ча ет Стив Мак кон нелл1,

«глав ная за да ча оце нок в про грам ми ро ва нии – не пред ска за ние ре зуль та та про-

ек та, а оп ре де ле ние реа ли стич но сти це лей про ек та и воз мож но сти их дос ти же-

ния при пра виль ном управ ле нии». Та ким об ра зом, по лу чен ные оцен ки долж ны

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

что по зво лит за ин те ре со ван ным уча ст ни кам про ек та брать обя за тель ст ва ис хо-

дя из реа ли стич ных це лей.

В при ве ден ном вы ше диа ло ге ме нед жер в дей ст ви тель но сти тре бо вал от про-

грам ми ста не оцен ки, а при ня тия обя за тель ст ва в от но ше нии не вы ска зан ной це-

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

жат сде лать оцен ку, убе ди тесь, что все сто ро ны хо ро шо пред став ля ют, о чем идет

речь, и то гда шан сы на ус пех ва ших про ек тов вы рас тут. А вот те перь по ра ос во-

ить не сколь ко прие мов…

1

Стив Мак кон нелл «Про фес сио наль ная раз ра бот ка про грамм но го обес пе че ния». – Пер.

с англ. – СПб.: Сим вол-Плюс, 2006.

97 этюдов для программистов

Научитесь говорить «Hello, World»

Томас Гест

Пол­Ли,­под­ни­ком­leep, более из вест ный под про зви щем Хоп пи, слыл ме ст ным

экс пер том по во про сам про грам ми ро ва ния. Мне по тре бо ва лась по мощь. Я по до-

шел к его ра бо че му сто лу и спро сил, не по смот рит ли он вме сте со мной кое-ка-

кой код.

«Ко неч но, – ска зал Хоп пи, – бе ри стул». Я ос то рож но при дви нул ся, ста ра ясь не

оп ро ки нуть пи ра ми ду пус тых ба нок из-под ко лы, гро моз див шую ся ря дом с ним.

«Что за код?»

«В функ ции в фай ле», – ска зал я.

«Лад но, по смот рим на эту функ цию». Хоп пи ото дви нул в сто ро ну эк зем п ляр

«K&R»1 и при дви нул ко мне кла виа ту ру.

«А где IDE?» Вы яс ни лось, что у Хоп пи не бы ло IDE, лишь не кий ре дак тор, в ко-

то ром я не умел ра бо тать. Он за брал кла виа ту ру об рат но. Не сколь ко на жа тий на

кла ви ши, и пе ред на ми пред стал файл – до воль но боль шой файл, а за тем и функ-

ция – до воль но боль шая функ ция. Он лис тал ее, по ка не до б рал ся до ус лов но

вы пол няе мо го бло ка, о ко то ром я хо тел спро сить.

«Что здесь про изой дет при от ри ца тель ном x? – спро сил я. – Здесь яв но ошиб ка».

Все то ут ро я пы тал ся за ста вить x при нять от ри ца тель ное зна че ние, но боль шая

функ ция в боль шом фай ле бы ла ча стью боль шо го про ек та, и ме ня со вер шен но

из мо та ла не об хо ди мость по втор но ком пи ли ро вать и по втор но за пус кать свои

экс пе ри мен ты. Мо жет быть, та кой экс перт, как Хоп пи, про сто со об щит мне вер-

ный от вет?

Хоп пи при знал ся, что он не впол не уве рен в ре зуль та тах. К мо ему удив ле нию,

он не по тя нул ся за «K&R». Вме сто это го он ско пи ро вал блок ко да в но вый бу фер

ре дак то ра, за но во рас ста вил от сту пы и обер нул его в функ цию. По сле это го он

1

Име ет ся в ви ду клас си че ская кни га Кер ни га на и Ри чи «Язык про грам ми ро ва ния C». –

Прим. ред.

Научитесь говорить «Hel o, World»

123

на пи сал функ цию main, вы пол няв шую бес ко неч ный цикл, в ко то ром она пред-

ла га ла поль зо ва те лю вве сти зна че ние, пе ре да ва ла его функ ции и вы во ди ла ре-

зуль тат. Он со хра нил бу фер в ви де но во го фай ла tryit.c.

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

был очень прост, и в то вре мя та кой спо соб ра бо ты был мне со вершенно незна ком:

$ cc tryit.c && ./a.out

На до же! Его про грам ма, при ду ман ная все го за не сколь ко ми нут до то го, ра бо та-

ла пол ным хо дом. Мы оп ро бо ва ли не сколь ко зна че ний, и мои по доз ре ния под-

твер ди лись (хоть в чем-то я ока зал ся прав!), и лишь за тем он до пол ни тель но све-

рил ся с со от вет ст вую щим раз де лом «K&R». Я по бла го да рил Хоп пи и ушел, сно-

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

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

боль ши ми про ек та ми в рам ках боль ших про дук тов, что стал ду мать, буд то имен-

но так и дол жен ра бо тать. А ведь ком пь ю тер, пред на зна чен ный для ре ше ния са-

мых гло баль ных про блем, мо жет ре шать и мел кие за да чи. Я от крыл тек сто вый

ре дак тор и на брал:

#include <stdio.h>

int main()

{

printf("Hello, World\n");

return 0;

}

97 этюдов для программистов

Пусть ваш проект

говорит сам за себя

Дэниэл Линднер

Ско­рее­все­го,­в­ва­шем­про­ек­те­име­ет­ся­сис­те­ма­управ­ле­ния­вер­сия­ми. Весь ма

ве ро ят но так же, что она под клю че на к сер ве ру не пре рыв ной ин те гра ции, ко то-

рый про ве ря ет кор рект ность про ек та с по мо щью ав то ма ти зи ро ван ных тес тов.

Это за ме ча тель но.

Мож но под клю чить сред ст ва ста ти че ско го ана ли за ко да к сер ве ру не пре рыв ной

ин те гра ции и по лу чать мет ри ки ко да. Эти мет ри ки со об ща ют спе ци фи че ские

ха рак те ри сти ки ва ше го ко да и их из ме не ния во вре ме ни. Ко гда вве де ны мет ри ки

ко да, все гда име ет ся крас ная чер та, ко то рую нель зя пе ре се кать. До пус тим, что

вна ча ле у вас по кры то тес та ми 20% ко да, и вы не хо ти те, что бы эта ве ли чи на

опус ка лась ни же 15%. Не пре рыв ная ин те гра ция по зво ля ет сле дить за все ми эти-

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

бы хо ро шо, ес ли бы про ект са мо стоя тель но вы пол нял эту ра бо ту и из ве щал вас

в слу чае ухуд ше ния си туа ции.

Вам нуж но дать сво ему про ек ту воз мож ность за го во рить. На при мер, с по мо щью

элек трон ной поч ты или мгно вен но го об ме на со об ще ния ми. Так вы смо же те ин-

фор ми ро вать раз ра бот чи ков о по след них ухуд ше ни ях или улуч ше ни ях по ка за-

те лей. Но еще бо лее эф фек тив но – ма те риа ли зо вать про ект в офи се по сред ст вом

око неч но го уст рой ст ва об рат ной свя зи ( extreme feedback device, XFD).

Идея XFD со сто ит в управ ле нии фи зи че ским уст рой ст вом – на при мер лам пой,

ми ниа тюр ным фон та ном, ро бо том или да же под клю чен ной к USB пус ко вой ра-

кет ной ус та нов кой – на ос но ве ре зуль та тов ав то ма ти че ско го ана ли за. Ко гда на-

ру ша ют ся до пус ти мые гра ни цы, уст рой ст во со об ща ет об этом, из ме няя свое со-

стоя ние. Ес ли это лам па, она за го рит ся, яр кая и бес при стра ст ная. Не воз мож но

про пус тить это со об ще ние, да же ес ли вы уже иде те к две ри, на прав ля ясь до мой.

В за ви си мо сти от ти па уст рой ст ва об рат ной свя зи вы ус лы ши те звук «ло маю щей-

ся» сбор ки, уви ди те крас ные сиг на лы не ка че ст вен но го ко да или да же по чув ст-

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

ес ли раз ра бот ка ве дет ся рас пре де лен но. Мож но по ста вить улич ный све то фор

Пусть ваш проект говорит сам за себя

125

в офи се ме нед же ра про ек та и сиг на ли зи ро вать с его по мо щью, в ка ком со стоя-

нии на хо дит ся ра бо та. Ме нед жер про ек та это оце нит.

Вы бор под хо дя ще го вам уст рой ст ва оп ре де ля ет ся ва ши ми твор че ски ми спо соб-

но стя ми. Ес ли куль ту ра про ек та «ги ков ская», мо же те по про бо вать снаб дить та-

лис ман сво ей ко ман ды ра дио управ ляе мы ми иг руш ка ми. Ес ли вам нра вит ся бо-

лее про фес сио наль ный под ход, по про буй те вос поль зо вать ся эле гант ны ми ди зай-

нер ски ми лам па ми. По ищи те вдох но ве ния в Ин тер не те. Все, что под клю ча ет ся

к се ти или име ет пульт управ ле ния, мо жет быть ис поль зо ва но как уст рой ст во

об рат ной свя зи.

Око неч ное уст рой ст во об рат ной свя зи как бы да ет го лос ва ше му про ек ту. Те перь

про ект фи зи че ски жи вет вме сте с раз ра бот чи ка ми. Он жа лу ет ся на них или хва-

лит их в со от вет ст вии с ус та нов лен ны ми ко ман дой пра ви ла ми. Та кое оче ло ве-

чи ва ние мож но раз вить да лее при по мо щи про грам мы син те за ре чи и па ры ди-

на ми ков. Те перь ваш про ект дей ст ви тель но го во рит сам за се бя.

97 этюдов для программистов

Компоновщик не таит

в себе никаких чудес

Уолтер Брайт

Уд­ру­чаю­ще­час­то­(со мной это сно ва слу чи лось как раз пе ред на пи са ни ем это го

тек ста) встре ча ет ся сле дую щий взгляд про грам ми стов на про цесс пре вра ще ния

ис ход но го ко да на ком пи ли руе мом язы ке в ста ти че ски ском по но ван ный вы пол-

няе мый мо дуль:

1. От ре дак ти ро вать ис ход ный код.

2. Ском пи ли ро вать ис ход ный код в объ ект ные фай лы.

3. Про ис хо дит вол шеб ст во.

4. За пус тить ис пол няе мый файл.

Шаг 3 – это, ко неч но, ком по нов ка ( linking). По че му же я го во рю та кие воз му ти-

тель ные ве щи? Я за ни ма юсь тех ни че ской под держ кой уже не пер вый де ся ток

лет, и ко мне ре гу ляр но при хо дят с од ни ми и те ми же про бле ма ми:

1. Ком по нов щик со об ща ет, что def оп ре де лен бо лее од но го раза.

2. Ком по нов щик со об ща ет, что сим вол abc не най ден (unresolved).

3. По че му мой ис пол няе мый файл та кой боль шой?

За тем сле ду ет во прос «Что мне те перь де лать?» с вкра п ле ния ми слов «вро де бы»

и «как-то там», и все это в ат мо сфе ре пол ней шей оза да чен но сти. Эти «вро де бы»

и «как-то там» сви де тель ст ву ют о том, что про цесс ком по нов ки вос при ни ма ет ся

как не кое вол шеб ст во, по нят ное толь ко кол ду нам и ча ро де ям. Про цесс ком пи-

ля ции не при во дит к фор му ли ров кам та ко го ро да, то есть про грам ми сты в це лом

по ни ма ют, как ра бо та ют ком пи ля то ры или хо тя бы в чем их на зна че ние.

Ком по нов щик – это ту пая, при зем лен ная и пря мо ли ней ная про грам ма. Ее за-

да ча – скле ить об ласть ко да и об ласть дан ных объ ект ных фай лов, со еди нить

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

из биб лио те ки и за пи сать ис пол няе мый файл. Все! Ни ка ких чу дес и ма гии! То,

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

Компоновщик не таит в себе никаких чудес

127

с де ко ди ро ва ни ем и ге не ра ци ей фай лов, фор мат ко то рых бы ва ет без образ но

слож ным, но суть ком по нов щи ка от это го не ме ня ет ся.

Итак, до пус тим, что ком по нов щик со об ща ет вам, что def оп ре де лен бо лее од но го

раза. Во мно гих язы ках про грам ми ро ва ния, вклю чая C, C++ и D, су ще ст ву ют

объ яв ле ния и оп ре де ле ния. Объ яв ле ния обыч но по ме ща ют ся в фай лы за го лов-

ков, на при мер:

extern int iii;

что ге не ри ру ет внеш нюю ссыл ку на сим вол iii. На про тив, оп ре де ле ние фак ти-

че ски от во дит па мять для хра не ния сим во ла, обыч но на хо дит ся в фай ле реа ли-

за ции и вы гля дит при мер но так:

int iii = 3;

Сколь ко оп ре де ле ний мо жет су ще ст во вать для ка ж до го сим во ла? Как в филь ме

«Го рец», «в жи вых ос та нет ся толь ко один». Что про изой дет, ес ли оп ре де ле ние

iii об на ру жит ся бо лее чем в од ном фай ле реа ли за ции?

// Файл a.c

int iii = 3;

// Файл b.c

double iii(int x) { return 3.7; }

Ком по нов щик со об щит о не од но крат ном оп ре де ле нии iii.

Оп ре де ле ние мо жет быть толь ко од но, бо лее то го, оно долж но быть обя за тель но.

Ес ли iii по яв ля ет ся толь ко в объ яв ле нии, но для не го нет оп ре де ле ния, ком по-

нов щик со об щит о том, что сим вол iii не най ден.

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

файл кар ты (map), ко то рый ком по нов щик мо жет вы вес ти по за про су. Этот файл

со дер жит пе ре чень всех сим во лов в ис пол няе мом мо ду ле с их ад ре са ми. Из не го

вы уз нае те, ка кие мо ду ли бы ли взя ты из биб лио тек и их раз ме ры. Те перь ста нет

яс но, по че му так раз ду лась ва ша про грам ма. Час то об на ру жи ва ют ся биб лио теч-

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

вре мен но уда ли те по доз ри тель ный мо дуль из биб лио те ки и по вто ри те ком по нов-

ку за но во. Ошиб ка «не оп ре де лен ный сим вол» по мо жет уз нать, кто об ра ща ет ся

к это му мо ду лю.

Хо тя не все гда оче вид но, по че му ком по нов щик вы во дит то или иное со об ще ние,

в ком по нов щи ках нет ни че го вол шеб но го. Ме ха ни ка про ста, а вот в кон крет ных

де та лях при хо дит ся раз би рать ся ка ж дый раз.

97 этюдов для программистов

Долговечность

временных решений

Клаус Маркардт

По­че­му­мы­соз­да­ем­вре­мен­ные­ре­ше­ния?

Обыч но ви ной то му сроч ная за да ча. Бы ва ет, что это внут рен няя за да ча раз ра-

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

за да ча внеш няя, ори ен ти ро ван ная на поль зо ва те лей, на при мер об ход ной путь

для вос пол не ния от сут ст вую щей функ цио наль но сти.

В боль шин ст ве сис тем и ко манд мож но най ти мо дуль, ко то рый ка ким-то об ра-

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

дет впо след ст вии пе ре де лать, по то му что он не со от вет ст ву ет стан дар там и пра-

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

жа ло бы раз ра бот чи ков по это му по во ду. При чи ны по яв ле ния та ко го ко да бы ва-

ют раз ны ми, но ос нов ная при чи на по яв ле ния на свет про ме жу точ ных ре ше ний –

это их по лез ность.

Од на ко про ме жу точ ные ре ше ния об ла да ют инерт но стью (или мо мен том инер-

ции, ес ли вам так боль ше нра вит ся). Вре мен ное ре ше ние уже есть – край не по-

лез ное и все ми при ня тое, – так что нет ост рой не об хо ди мо сти соз да вать что-то

вза мен. Ре шая, ка кие дей ст вия бо лее дру гих по вы сят цен ность про дук та, за ин-

те ре со ван ный уча ст ник про ек та най дет мно же ст во за дач, при ори тет ко то рых

бу дет вы ше, чем до ве де ние до ума вре мен но го ре ше ния. По че му? По то му что вре-

мен ное ре ше ние уже есть, оно ра бо та ет, и оно при ня то. Един ст вен ный его ви ди-

мый не дос та ток – оно не со от вет ст ву ет вы бран ным стан дар там и пра ви лам, но,

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

из ме не ний.

Вот так и ос та ет ся вре мен ное ре ше ние. На все гда.

А ес ли вре мен ное ре ше ние ста нет ис точ ни ком про блем, ма ло ве ро ят но, что при

по чин ке бу дет так же по став ле на за да ча при вес ти его в со от вет ст вие с при ня ты-

ми стан дар та ми ка че ст ва. Что же де лать? Бы строе про ме жу точ ное из ме не ние

вре мен но го ре ше ния час то уст ра ня ет про бле му и всех уст раи ва ет. У не го те же

дос то ин ст ва, что и у пер во на чаль но го вре мен но го ре ше ния, про сто оно… но вее.

Долговечность временных решений

129

Пред став ля ет ли это про бле му?

Все за ви сит от про ек та и ва ше го лич но го ин те ре са в под дер жа нии стан дар та ка-

че ст ва го то во го ко да. Ес ли в сис те ме слиш ком мно го вре мен ных ре ше ний, ее эн-

тро пия или внут рен няя слож ность воз рас та ет, а удоб ст во со про во ж де ния сни-

жа ет ся. Од на ко в пер вую оче редь, воз мож но, сле ду ет за да вать иной во прос. Не

за бы вай те, что мы об су ж да ем ре ше ние. Воз мож но, вы и са ми не ра ды та ко му ре-

ше нию – как вряд ли рад ему кто-то дру гой, – но сти мул пе ре ра ба ты вать ре ше-

ние слаб.

Так что же мож но сде лать, ес ли это для нас про бле ма?

1. Пре ж де все го, из бе гать вре мен ных ре ше ний.

2. Из ме нить фак то ры, влияю щие на ре ше ние ру ко во ди те ля про ек та.

3. Ос та вить все, как есть.

Рас смот рим эти ва ри ан ты бо лее под роб но:

1. Во мно гих слу ча ях от каз от вре мен но го ре ше ния не при ем лем. Есть ре аль ная

за да ча, ко то рую не об хо ди мо ре шить, и ока зы ва ет ся, что стан дар ты слиш ком

же ст кие для это го. Мож но по про бо вать из ме нить стан дар ты – дос той ное, хо-

тя и тру до ем кое свер ше ние, – но на это уй дет вре мя, а про бле му нуж но ре-

шать пря мо сей час.

2. Эти фак то ры ко ре нят ся в куль ту ре про ек та, а она про ти вит ся на силь ст вен-

ным из ме не ни ям. Ус пе ха мож но дос тичь лишь в очень ма лень ких про ек тах –

осо бен но ко гда ра бо та ешь один – и ес ли уда ст ся на вес ти по ря док, не спра ши-

вая раз ре ше ния. Ус пех воз мо жен и то гда, ко гда в ко де про ек та та кой бес по ря-

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

не ко то рое вре мя на на ве де ние по ряд ка.

3. Ес ли пре ды ду щий ва ри ант не дей ст ву ет, по ло же ние дел со хра ня ет ся ав то ма-

ти че ски.

Сре ди мно же ст ва соз дан ных ва ми ре ше ний не ко то рые бу дут вре мен ны ми и

в боль шин ст ве сво ем по лез ны ми. Луч ший спо соб из ба вить ся от вре мен ных ре-

ше ний – это сде лать их из бы точ ны ми, пред ло жив бо лее эле гант ные и по лез ные

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

мо же те из ме нить, и си лы из ме нить то, что мо же те, и муд рость, что бы от ли чить

од но от дру го го.

97 этюдов для программистов

Интерфейсы должно быть

легко использовать правильно

и трудно – неправильно

Скотт Мейерс

Од­на­из­наи­бо­лее­рас­про­стра­нен­ных­за­дач­в раз ра бот ке про грамм но го обес пе че-

ния – это спе ци фи ка ция ин тер фей са. Ин тер фей сы су ще ст ву ют на выс шем уров-

не аб ст рак ции (ин тер фей сы поль зо ва те ля), на низ шем (ин тер фей сы функ ций)

и на про ме жу точ ных уров нях (ин тер фей сы клас сов, биб лио тек и т. д.). Не за ви-

си мо от то го, чем вы за ня ты – со гла со вы вае те с ко неч ны ми поль зо ва те ля ми их

бу ду щее взаи мо дей ст вие с сис те мой, со труд ни чае те с раз ра бот чи ка ми, раз ра ба-

ты вая спе ци фи ка цию API, или объ яв ляе те за кры тые функ ции клас са, – про ек-

ти ро ва ние ин тер фей са со став ля ет важ ную часть ва шей ра бо ты. Ес ли вы спра ви-

тесь с ней хо ро шо, поль зо вать ся ва ши ми ин тер фей са ми бу дет сплош ное удо воль-

ст вие, а про из во ди тель ность поль зо ва те лей воз рас тет. Ес ли вы спра ви тесь с за-

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

Хо ро шие ин тер фей сы об ла да ют сле дую щи ми свой ст ва ми:

Их лег ко ис поль зо вать пра виль но

Поль зо ва те ли хо ро шо спро ек ти ро ван но го ин тер фей са поч ти все гда ис поль зу-

ют его пра виль но, по то му что та ков для это го ин тер фей са путь наи мень ше го

со про тив ле ния. Ес ли это гра фи че ский ин тер фейс поль зо ва те ля, они поч ти

все гда щел ка ют по нуж но му знач ку, кноп ке или пунк ту ме ню, по то му что это

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

при клад но го про грам ми ро ва ния, они поч ти все гда пе ре да ют вы зо вам пра-

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

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

виль но, все ра бо та ет са мо.

Их труд но ис поль зо вать не пра виль но

Хо ро шие ин тер фей сы учи ты ва ют, ка кие ошиб ки бы ва ют у поль зо ва те лей,

и ме ша ют их де лать, а в идеа ле во об ще это го не по зво ля ют. На при мер, гра фи-

че ский ин тер фейс поль зо ва те ля мо жет сде лать не ак тив ны ми или скрыть ко-

ман ды, не имею щие смыс ла в те ку щем кон тек сте, а ин тер фейс при клад но го

Интерфейсы должно быть легко использовать правильно и трудно – неправильно

131

про грам ми ро ва ния мо жет ре шить про бле му по ряд ка ар гу мен тов, раз ре шив

пе ре да вать па ра мет ры в лю бой по сле до ва тель но сти.

Хо ро ший под ход к про ек ти ро ва нию ин тер фей сов, ко то ры ми лег ко поль зо вать ся

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

гра фи че ско го ин тер фей са поль зо ва те ля (на при мер, на дос ке с мар ке ра ми или на

ос но ве раз ло жен ных на сто ле ли ст ков для за ме ток) и по иг рай те с ма ке том, пре-

ж де чем пи сать код. На пи ши те об ра ще ния к API, пре ж де чем объ яв лять функ-

ции. Раз бе ри те стан дарт ные сце на рии при ме не ния и оп ре де ли те, ка ко го по ве де-

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

щелк нуть? Ка кие па ра мет ры в ито ге хо те лось бы пе ре да вать? Про стые в ра бо те

ин тер фей сы ес те ст вен ны, по то му что по зво ля ют де лать имен но то, что вам нуж-

но. Та кие ин тер фей сы ча ще уда ют ся, ес ли раз ра ба ты вать их с точ ки зре ния

поль зо ва те ля. (Это од на из силь ных сто рон раз ра бот ки че рез тес ти ро ва ние, TDD.)

Что бы за труд нить не кор рект ное ис поль зо ва ние ин тер фей са, нуж ны две ве щи. Во-

пер вых, сле ду ет пре ду га ды вать, ка кие ошиб ки мо гут де лать поль зо ва те ли, и на-

хо дить спо со бы их пре дот вра щать. Во-вто рых, сле ду ет по на блю дать за ошиб ка-

ми, ко то рые до пус ка ют пер вые поль зо ва те ли пред ва ри тель ной вер сии ин тер фей-

са, и мо ди фи ци ро вать ин тер фейс – да-да, мо ди фи ци ро вать ин тер фейс! – с це лью

вос пре пят ст во вать та ким ошиб кам. Луч ший спо соб пре дот вра тить не кор рект ное

ис поль зо ва ние – это сде лать его не воз мож ным. Ес ли поль зо ва те ли упор но ста ра-

ют ся от ме нить не от ме няе мое дей ст вие, сде лай те это дей ст вие от ме няе мым. Ес ли

они по сто ян но пе ре да ют ин тер фей су при клад но го про грам ми ро ва ния не вер ное

зна че ние, по ста рай тесь мо ди фи ци ро вать этот API, что бы при ни мать те зна че-

ния, ко то рые хо тят пе ре дать поль зо ва те ли.

А са мое глав ное, пом ни те, что ин тер фей сы су ще ст ву ют для удоб ст ва их поль зо-

ва те лей, а не их соз да те лей.

97 этюдов для программистов

Пусть невидимое станет

более видимым

Джон Джаггер

Во­мно­гих­от­но­ше­ни­ях­не­ви­ди­мость­спра вед ли во по ощ ря ет ся как прин цип раз-

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

язы ке не ма ло ме та фор не ви ди мо сти, та ких как про зрач ность ме ха низ ма и ин-

кап су ля ция. Про грамм ное обес пе че ние и про цесс его раз ра бот ки мо гут, ес ли пе-

ре фра зи ро вать Ду гла са Адам са (Douglas Adams), ока зать ся в ос нов ном не ви ди-

мы ми 1:

Ис ход ный код не об ла да ет вро ж ден ным при сут ст ви ем или вро ж ден ным по ве-

де ни ем и не под чи ня ет ся фи зи че ским за ко нам. Его мож но уви деть, ко гда он

за гру жен в ре дак тор, но за крой те ре дак тор – и он ис чез нет. Ес ли дол го над

этим ду мать, то на чи на ешь со мне вать ся, су ще ст ву ет ли он во об ще – как де ре-

во, ко то рое упа ло, но не ко му бы ло это ус лы шать.

Ра бо таю щее при ло же ние об на ру жи ва ет свое при сут ст вие и по ве де ние, но ни-

че го не со об ща ет об ис ход ном ко де, на ос но ве ко то ро го соз да но. До маш няя

стра ни ца Google при ят но ла ко нич на, но за ку ли са ми, не со мнен но, скры то не-

ма ло серь ез но го.

Ес ли вы сде ла ли 90% ра бо ты и без на деж но увяз ли в от лад ке ос таль ных 10%,

то, ви ди мо, нель зя счи тать, что сде ла но 90%? Ис прав ле ние оши бок – это не

дви же ние впе ред. Вам не пла тят за от лад ку. От лад ка – пус тая тра та вре ме ни.

Хо ро шо, ес ли пус тая тра та вре ме ни бу дет бо лее за мет на, что бы мож но бы ло

ви деть ее ре аль ную це ну и, пре ж де все го, по ста рать ся не до пус кать это го.

Ес ли ка жет ся, что ваш про ект идет по гра фи ку, а че рез не де лю об на ру жи ва-

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

рых, воз мож но, не в том, что он опаз ды ва ет на пол го да, а в су ще ст во ва нии

1

От сыл ка к кни ге «Mostly Harmless» («В ос нов ном без вред на», АСТ, 2003) – пя той, за-

клю чи тель ной час ти се рии книг «The Hitchhiker’s Guide to the Galaxy» («Ав то сто пом

по га лак ти ке. Пу те во ди тель»). Сло во со че та ние «в ос нов ном без вред на» в кни гах се-

рии яв ля ет ся пол ной эн цик ло пе ди че ской стать ей о пла не те Зем ля. – Прим. ред.

Пусть невидимое станет более видимым

133

не ви ди мых си ло вых по лей, спо соб ных скрыть по лу го до вую за держ ку! От сут-

ст вие ви ди мо го про грес са – то же са мое, что от сут ст вие про грес са во об ще.

Не ви ди мость та ит в се бе опас ность. Рас су ж де ние ста но вит ся яс нее, ко гда есть

кон крет ный пред мет для об ду мы ва ния. Лег че управ лять ве ща ми, ко то рые мож-

но ви деть, и ви деть в не пре рыв ном из ме не нии:

При на пи са нии мо дуль ных тес тов вы уз нае те, на сколь ко лег ко про во дить мо-

дуль ное тес ти ро ва ние для кон крет но го мо ду ля ко да. Мо дуль ное тес ти ро ва ние

вы яв ля ет при сут ст вие (или от сут ст вие) ка честв, ко то рые же ла тель ны для ко-

да, та кие как сла бая свя зан ность ( coupling) и силь ная связ ность ( co he si on).

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

об на ру жить при сут ст вие (или от сут ст вие) ха рак те ри стик вре ме ни вы пол не-

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

С по мо щью дос ки и кар то чек мож но сде лать про гресс на гляд ным и кон крет-

ным. Мож но уви деть, что за да чи на хо дят ся в со стоя нии Не на ча та, В про-

цес се и За вер ше на, и при этом не при дет ся за хо дить в не оче вид ную сис те му

управ ле ния про ек том и не при дет ся уп ра ши вать про грам ми стов со став лять

фик тив ные от че ты о со стоя нии про ек та.

Ите ра тив ная раз ра бот ка по вы ша ет на гляд ность про грес са (или его от сут ст-

вия), по сколь ку ча ще фик си ру ют ся фак ты то го, что раз ра бот ка ве дет ся. Соз-

да ние про грамм но го обес пе че ния, го то во го к вы пус ку, от ра жа ет ре аль ное по-

ло же ние ве щей, в от ли чие от оце нок.

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

за те ли. На гляд ность да ет уве рен ность в том, что про гресс яв ля ет ся ре аль ным,

а не вы мыш лен ным; спла ни ро ван ным, а не не пред на ме рен ным; вос про из во ди-

мым, а не слу чай ным.

97 этюдов для программистов

Передача сообщений

улучшает масштабируемость

параллельных систем

Рассел Уиндер

Уже­на­пер­вых­лек­ци­ях­по­ин­фор­ма­ти­ке­про­грам­ми­стов­учат, что кон ку рент-

ные вы чис ле ния – и в осо бен но сти па рал лель ные как осо бый под вид кон ку рент-

ных – вещь труд ная, и что лишь луч шим да ет ся на де ж да спра вить ся с этой за-

да чей, и что да же луч шие не справ ля ют ся. При этом не из мен но уде ля ет ся боль-

шое вни ма ние по то кам, се ма фо рам, мо ни то рам и труд но стям ор га ни за ции по то-

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

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

Но в чем ко рень про блем? Об щая па мять. Прак ти че ски все про бле мы кон ку рент-

ных вы чис ле ний, о ко то рых по сто ян но при хо дит ся слы шать, ка са ют ся об щей

па мя ти с из ме няе мы ми дан ны ми: со стоя ние гон ки (race conditions), вза им ная

бло ки ров ка (deadlock), ак тив ная бло ки ров ка (livelock) и т. п. Ка жет ся, от вет оче-

ви ден: за будь те о кон ку рент но сти ли бо дер жи тесь по даль ше от об щей па мя ти!

От каз от кон ку рент но сти поч ти на вер ня ка не ва ри ант. Ко ли че ст во ядер в ком -

пью те рах воз рас та ет чуть ли не ка ж дый квар тал, по это му дос ти же ние на стоя-

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

не пре рыв ный рост так то вой час то ты про цес со ров как ос но ву про из во ди тель но-

сти при ло же ний. Про из во ди тель ность мо жет вы рас ти толь ко за счет па рал ле-

лиз ма. Ко неч но, мож но не за бо тить ся о про из во ди тель но сти при ло же ний, но ед-

ва ли это по нра вит ся поль зо ва те лям.

Так мож но ли от ка зать ся от об щей па мя ти? Оп ре де лен но, да.

Вме сто по то ков и об щей па мя ти мож но вос поль зо вать ся про цес са ми и пе ре да чей

со об ще ний. Под про цес сом здесь по ни ма ет ся за щи щен ное не за ви си мое со стоя ние

ис пол няю ще го ся ко да, а не обя за тель но про цесс опе ра ци он ной сис те мы. Та кие

язы ки, как Erlang (а до не го occam), по ка за ли, что про цес сы – весь ма удач ный

ме ха низм про грам ми ро ва ния кон ку рент ных и па рал лель ных сис тем. В та ких

сис те мах мень ше про блем син хро ни за ции, чем в мно го по точ ных сис те мах с об-

щей па мя тью. Кро ме то го, су ще ст ву ет фор маль ная мо дель взаи мо дей ст вую щих

Передача сообщений улучшает масштабируемость параллельных систем

135

по сле до ва тель ных про цес сов (Communicating Sequential Processes, CSP), ко то-

рую мож но при ме нять при раз ра бот ке та ких сис тем.

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

по то ком дан ных ( dataflow system). В та кой сис те ме нет яв но за про грам ми ро ван-

но го по то ка управ ле ния. Вме сто это го соз да ет ся на прав лен ный граф опе ра то-

ров, со еди нен ных пу тя ми пе ре да чи дан ных, а за тем в сис те му по да ют ся дан ные.

Кон троль вы чис ле ний осу ще ст в ля ет ся по го тов но сти дан ных внут ри сис те мы.

И ни ка ких про блем син хро ни за ции.

При этом для сис тем ной раз ра бот ки при ме ня ют ся глав ным об ра зом та кие язы-

ки, как C, C++, Java, Python и Groovy, о ко то рых про грам ми стам го во рят, что

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

быть? Ре ше ние в том, что бы ис поль зо вать – или соз да вать, ес ли их не су ще ст ву-

ет, – биб лио те ки и сре ды, ко то рые пред ла га ют схе мы про цес сов и пе ре сыл ки со-

об ще ний, пол но стью ис клю чаю щие при ме не ние об щей из ме няе мой па мя ти.

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

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

па рал ле лизм, по лу чив ший се го дня по все ме ст ную про пис ку в ком пь ю тер ном же-

ле зе. За ни ма тель но вы хо дит – про цес сы как еди ни ца кон ку рент но го ис пол не-

ния по яви лись рань ше по то ков, но в бу ду щем, по-ви ди мо му, по то ки ста нут ис-

поль зо вать ся для реа ли за ции про цес сов.

97 этюдов для программистов

Послание потомкам

Линда Райзинг

Воз­мож­но,­де­ло­в­том,­что­в­боль­шин­ст­ве­сво­ем­про­грам­ми­сты­–­ум­ные­лю­ди,

но за мно гие го ды мое го пре по да ва ния и тес ной со вме ст ной ра бо ты с ни ми у ме-

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

оп рав ды ва ет для них соз да ние ре ше ний столь же слож ных (воз мож но, и для них

са мих спус тя не сколь ко ме ся цев по сле на пи са ния ко да) для по ни ма ния и со про-

во ж де ния.

Пом ню один слу чай с Джо, слу ша те лем мое го кур са по струк ту рам дан ных, ко-

то рый при шел по ка зать мне ре зуль тат сво его тру да.

– Дер жу па ри, вы не до га дае тесь, что де ла ет этот код! – ра до ст но вос клик нул он.

– Ты прав, – со гла си лась я, не слиш ком вгля ды ва ясь в его текст и ду мая, как до-

не сти до не го важ ную мысль. – Уве ре на, ты хо ро шо по тру дил ся над этим при ме-

ром. Бо юсь, прав да, ты упус тил не что важ ное. Ска жи, Джо, у те бя есть млад-

ший брат?

– Да, ко неч но! Его зо вут Фил, и он слу ша ет ваш ввод ный курс. Он то же учит ся

про грам ми ро вать! – гор до объ я вил Джо.

– Это за ме ча тель но, – от ве ча ла я. – Ин те рес но, смо жет ли он по нять этот код?

– Ни за что, – ска зал Джо, – это слож ная шту ка!

– Да вай пред по ло жим, – про дол жи ла я, – что это ре аль ный ра бо чий код и что

че рез не сколь ко лет Фи лу пред ло жат ра бо ту по вне се нию из ме не ний в этот код.

Что ты сде лал для Фи ла?

Джо мор гал, гля дя на ме ня.

– Мы зна ем, что Фил – тол ко вый па рень, вер но?

Джо кив нул.

– И не хо чу хва стать ся, но я то же до воль но тол ко вая!

Джо ух мыль нул ся.

Послание потомкам

137

– Итак, мне не лег ко по нять, что ты тут сде лал, и твое му очень спо соб но му млад-

ше му бра ту то же. Ско рее все го, при дет ся по ло мать над этим го ло ву. В та ком слу-

чае, что мож но ска зать о на пи сан ном то бой ко де?

Как мне по ка за лось, Джо уви дел свой код в но вом све те.

– Пред ста вим се бе де ло так, – ска за ла я, ста ра ясь как мож но луч ше иг рать роль

доб ро го на став ни ка. – Ка ж дая стро ка твое го ко да – это по сла ние че ло ве ку бу ду-

ще го, ко то рым мо жет ока зать ся твой млад ший брат. По про буй объ яс нить это му

ум но му че ло ве ку, как ре шить эту труд ную за да чу. Так ли ты ви дишь это бу ду-

щее? Что этот ум ный про грам мист уви дит твой код и вос клик нет: «Ни че го се бе!

Как здо ро во! Мне со вер шен но по нят но, что здесь про ис хо дит, и я по ра жен эле-

гант но стью – нет, кра со той – это го ко да. На до не мед лен но по ка зать его кол ле-

гам по ко ман де. Это же ше девр!»

– Джо, мо жешь ли ты на пи сать код, ко то рый ре ша ет эту за да чу, но при том пре-

кра сен, как пес ня? Да, как за пав шая в па мять ме ло дия. Я ду маю, что тот, кто

су мел най ти та кое слож ное ре ше ние, как пред ло жен ное то бой се го дня, мо жет

так же на пи сать что-ни будь кра си вое. Гм-м… Не на чать ли мне вы став лять оцен-

ки за кра со ту? Как ты счи та ешь, Джо?

Джо за брал свою ра бо ту и по смот рел на ме ня. Лег кая улыб ка про бе жа ла по его

ли цу.

– Я все по нял, про фес сор. Пой ду улуч шать мир для Фи ла. Спа си бо.

97 этюдов для программистов

Упущенные возможности

применения полиморфизма

Кирк Пеппердин

По­ли­мор­физм­–­ од­на­ из­ гран­ди­оз­ных­ идей, ле жа щих в фун да мен те ООП. Это

сло во, за им ст во ван ное из гре че ско го язы ка, оз на ча ет мно же ст во ( poly) форм

( morph). В кон тек сте про грам ми ро ва ния по ли мор физм оз на ча ет мно го об ра зие

форм не ко то ро го ме то да или клас са объ ек тов. Но по ли мор физм – это не про сто

аль тер на тив ные реа ли за ции. Уме ст ное при ме не ние по ли мор физ ма соз да ет ми-

ниа тюр ные ло ка ли зо ван ные кон тек сты ис пол не ния и по зво ля ет обой тись без гро-

мозд ких бло ков if-then-else. На хо дясь в кон тек сте, мы мо жем на пря мую вы пол-

нять нуж ные дей ст вия, то гда как, на хо дясь вне это го кон тек ста, мы вы ну ж де ны

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

ис поль зо ва ние аль тер на тив ных реа ли за ций по зво ля ет вы де лить кон текст, а зна-

чит, ре шить ту же за да чу че рез мень ший объ ем бо лее удо бо чи тае мо го ко да. Луч-

ше все го про де мон ст ри ро вать это на при ме ре. Возь мем сле дую щий код для (не-

ре аль но) про стой кор зи ны по ку пок:

public class ShoppingCart {

private ArrayList<Item> cart = new ArrayList<Item>();

public void add(Item item) { cart.add(item); }

public Item takeNext() { return cart.remove(0); }

public boolean isEmpty() { return cart.isEmpty(); }

}

До пус тим, не ко то рые то ва ры в на шем ин тер нет-ма га зи не мож но ска чать из се ти

Ин тер нет, а дру гие тре бу ют дос тав ки. Соз да дим дру гой класс, ко то рый под дер-

жи ва ет эти опе ра ции:

public class Shipping {

public boolean ship(Item item, SurfaceAddress address) { ... }

public boolean ship(Item item, EMailAddress address) { ... }

}

Упущенные возможности применения полиморфизма

139

Ко гда кли ент рас счи тал ся, нуж но дос та вить по куп ки:

while (!cart.isEmpty()) {

shipping.ship(cart.takeNext(), ??? );

}

Па ра метр ??? – это не ка кой-то оче ред ной опе ра тор Эл ви са1; это не раз ре шен ный

во прос о том, как нуж но дос та вить то вар – элек трон ной или обыч ной по чтой.

Кон тек ста для от ве та на этот во прос уже нет. Мож но бы ло со хра нить ме тод до-

став ки в ви де boolean или enum, а за тем ис поль зо вать if-then-else, что бы за пол нить

зна че ние не дос таю ще го па ра мет ра. А дру гое ре ше ние – соз дать два клас са, рас-

ши ряю щих Item. На зо вем их DownloadableItem и SurfaceItem. Те перь на пи шем не-

мно го ко да. Я сде лаю из Item ин тер фейс, ко то рый под дер жи ва ет един ст вен ный

ме тод ship (дос та вить). Что бы дос та вить со дер жи мое кор зи ны, вы зы ва ем item.

ship(shipper). Оба клас са, DownloadableItem и SurfaceItem, реа ли зу ют ship:

public class DownloadableItem implements Item {

public boolean ship(Shipping shipper, Customer customer) {

shipper.ship(this, customer.getEmailAddress());

}

}

public class SurfaceItem implements Item {

public boolean ship(Shipping shipper, Customer customer) {

shipper.ship(this, customer.getSurfaceAddress());

}

}

В этом при ме ре мы де ле ги ро ва ли от вет ст вен ность за Shipping (дос тав ку) ка ж до му

Item (то ва ру). По сколь ку ка ж дый то вар зна ет, как его сле ду ет дос тав лять, та кая

ор га ни за ция по зво ля ет спра вить ся с дос тав кой, не при бе гая к if-then-else. Этот

код так же де мон ст ри ру ет при ме не ние двух шаб ло нов про ек ти ро ва ния, ко то рые

час то хо ро шо со че та ют ся меж ду со бой: Command и Double Dispatch. Эф фек тив-

ное при ме не ние этих шаб ло нов ос но ва но на пра виль ном ис поль зо ва нии по ли-

мор физ ма. При вы пол не нии этих ус ло вий чис ло бло ков if-then-else со кра ща ет ся.

В не ко то рых си туа ци ях го раз до прак тич нее ис поль зо вать не по ли мор физм, а if-

then-else, од на ко при на пи са нии ко да в сти ле по ли мор физ ма он име ет мень ший

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

стей не слож но под счи тать – оно сов па да ет с чис лом опе ра то ров if-then-else в ко де.

1

Опе ра тор Эл ви са – это опе ра тор ?: в Groovy. Он по явил ся в вер сии 1.5 язы ка и по лу-

чил на зва ние бла го да ря сходству с фир мен ной при чес кой Эл ви са. – Прим. ред.

97 этюдов для программистов

Невероятно, но факт:

тестировщики – ваши друзья

Берк Хафнагель

Са­ми­се­бя­они­мо­гут­на­зы­вать­ кон тро лем ка че ст ва или обес пе че ни ем ка че ст-

ва, но мно гие про грам ми сты зо вут их про сто на па стью. Мой опыт по ка зы ва ет,

что у про грам ми стов час то вра ж деб ные от но ше ния с те ми, кто тес ти ру ет их про-

грам мы. «Они слиш ком при дир чи вы» или «Они хо тят, что бы все бы ло иде аль-

но» – вот обыч ные жа ло бы. Зна ко мо, да?

Не знаю, по ка кой при чи не, но у ме ня все гда был дру гой взгляд на ра бо ту тес ти-

ров щи ков. Мо жет быть по то му, что «тес ти ров щи ком» на мо ей пер вой ра бо те бы-

ла сек ре тарь фир мы. Весь ма при ят ная да ма Мар га рет за ни ма лась де ло про из вод-

ст вом и пы та лась на учить па ру мо ло дых про грам ми стов про фес сио наль но му

по ве де нию в при сут ст вии кли ен тов. Она так же об ла да ла да ром в счи тан ные се-

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

В то вре мя я ра бо тал над про грам мой, ко то рую на пи сал бух гал тер, счи тав ший

се бя про грам ми стом. Ес те ст вен но, с ней бы ли боль шие про бле мы. Ко гда мне ка-

за лось, что я ис пра вил ка кой-то ку сок, Мар га рет пы та лась по ра бо тать с ним,

и ча ще все го по сле не сколь ких на жа тий на кла ви ши ока зы ва лось, что про грам-

ма не пра виль но ра бо та ет, но уже ка ким-то но вым об ра зом. Вре ме на ми это при-

во ди ло в от чая ние и вы зы ва ло не лов кость, но Мар га рет бы ла на столь ко при ят-

ным че ло ве ком, что мне ни ко гда не при хо ди ло в го ло ву об ви нить ее в мо ем жал-

ком по ло же нии. На ко нец, на стал день, ко гда Мар га рет смог ла без про блем за-

пус тить про грам му, соз дать счет-фак ту ру, рас пе ча тать ее и вый ти из про грам мы.

Я ис пы тал вос торг. Бо лее то го, ко гда мы ус та но ви ли про грам му на ма ши не кли-

ен та, все за ра бо та ло пра виль но. Кли ент не столк нул ся с про бле ма ми, по то му что

сна ча ла Мар га рет по мог ла мне об на ру жить и ис пра вить эти про бле мы.

Вот по че му я го во рю, что тес ти ров щи ки – ва ши дру зья. Мо жет ка зать ся, буд то

тес ти ров щи ки пор тят ва шу ре пу та цию, со об щая о ма ло зна чи тель ных про бле-

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

все эти «до сад ные ме ло чи», ко то рые груп па кон тро ля ка че ст ва за ста ви ла вас ис-

пра вить, вы на вы со те. Мысль по нят на?

Невероятно, но факт: тестировщики – ваши друзья

141

Пред ставь те се бе та кую си туа цию: вы тес ти руе те про грам му, ис поль зую щую

«сногс ши ба тель ные ал го рит мы ис кус ст вен но го ин тел лек та» для на хо ж де ния

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

и об на ру жи вае те, что на за став ке сло во «ин тел лект» на пи са но с ошиб кой. Не-

сколь ко дур ное пред зна ме но ва ние, но ведь это лишь опе чат ка, вер но? За тем вы-

яс ня ет ся, что эк ран на строй ки пред ла га ет флаж ки (checkboxes) вме сто пе ре клю-

ча те лей (radiobuttons), а не ко то рые со че та ния кла виш не ра бо та ют. Все это ме ло-

чи, но по ме ре их на ко п ле ния вы на чи нае те за ду мы вать ся, что за лю ди соз да ва-

ли про грам му. Ес ли они неспо соб ны спра вить ся с про сты ми ве ща ми, ка ко вы

шан сы, что их ис кус ст вен ный ин тел лект дей ст ви тель но су ме ет най ти и ис пра-

вить та кие за мы сло ва тые ве щи, как про бле мы кон ку рент но го дос ту па?

Воз мож но, эти ге нии на столь ко по гру зи лись в за да чи раз ра бот ки ис кус ст вен но-

го ин тел лек та, что не об ра ти ли вни ма ния на ме ло чев ку, а «при дир чи вых тес ти-

ров щи ков» у них не бы ло, так что вам при хо дит ся стал ки вать ся с этой са мой ме-

ло чев кой. Од на ко в ре зуль та те вы на чи нае те со мне вать ся в ком пе тент но сти этих

про грам ми стов.

Сле до ва тель но, как ни стран но, тес ти ров щи ки, пол ные ре ши мо сти най ти все

мел кие не дос тат ки ва ше го ко да, в дей ст ви тель но сти – ва ши дру зья.

97 этюдов для программистов

Один бинарный файл

Стив Фримен

Мне­при­хо­ди­лось­встре­чать­про­ек­ты, где при сбор ке пе ре пи сы ва лась часть ко-

да, что бы для ка ж дой сре ды ис пол не ния ге не ри ро вал ся соб ст вен ный би нар ный

файл. Та кой под ход все гда из лиш не ус лож ня ет ве щи и соз да ет риск по яв ле ния

не со вмес ти мых вер сий при ка ж дой ус та нов ке. Как ми ни мум при этом со би ра ет-

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

пред на зна чен для ус та нов ки в со от вет ст вую щей ему сре де. Воз ни ка ет слиш ком

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

Од на ж ды я ра бо тал в ко ман де, где по сле ка ж до го из ме не ния свой ст ва нуж но бы-

ло со хра нять код и про во дить пол ный цикл сбор ки, по это му тес ти ров щи ки про-

стаи ва ли вся кий раз, как на хо ди лась ма лей шая не точ ность (я уже го во рил, что

к то му же про ект со би рал ся не ве ро ят но дол го?). Ра бо тал я и в та кой ко ман де, где

сис тем ные ад ми ни ст ра то ры тре бо ва ли пол ной пе ре сбор ки про грам мы при вво де

ее в экс плуа та цию (с по мо щью на ших же сце на ри ев сбор ки), так что не воз мож но

бы ло га ран ти ро вать, что в экс плуа та цию по па да ла та вер сия, ко то рая про шла

тес ти ро ва ние. И так да лее.

Пра ви ло про стое: соз да вать един ст вен ный би нар ный файл, ко то рый мож но

точ но иден ти фи ци ро вать и про вес ти че рез все эта пы кон вей е ра вы пус ка про-

дук та. Все спе ци фи че ские осо бен но сти сре ды ис пол не ния долж ны ос та вать ся

ча стью сре ды. На при мер, их мож но хра нить в кон тей не ре с ком по нен та ми (com-

po nent container), в за ра нее со гла со ван ном фай ле или в оп ре де лен ных пап ках.

Ес ли во вре мя сбор ки ва ше го про ек та про из во дят ся ма ни пу ля ции с ко дом или

на строй ки це ле вой сре ды хра нят ся в са мом ко де, зна чит, при ло же ние бы ло

спро ек ти ро ва но не дос та точ но хо ро шо: клю че вые функ ции при ло же ния не от де-

ле ны от функ ций, оп ре де ляе мых плат фор мой. Или еще ху же: ко ман да зна ет,

как нуж но по сту пить, но не счи та ет вне се ние нуж ных из ме не ний дос та точ но

при ори тет ной за да чей.

Бы ва ют, ко неч но, ис клю че ния: ино гда при хо дит ся де лать сбор ку для не сколь-

ких ва ри ан тов це ле вой сре ды, в ко то рых ог ра ни че ния по ре сур сам су ще ст вен но

Один бинарный файл

143

раз нят ся. Од на ко это не от но сит ся к тем из нас (и та ких боль шин ст во), кто соз-

дает при ло же ния ти па «от пра вить дан ные из ба зы дан ных на эк ран и об рат но».

Дру гой ва ри ант – ра бо та с пло хо на пи сан ным унас ле до ван ным (legacy) ко дом,

в ко то ром на вес ти по ря док сра зу слиш ком тя же ло. В та ких слу ча ях сле ду ет дви-

гать ся по сте пен но, но на чи най те это дви же ние как мож но рань ше.

И еще од но: хра ни те ин фор ма цию о сре де вы пол не ния в сис те ме управ ле ния вер-

сия ми, как и код. Нет ни че го ху же, чем ис пор тить кон фи гу ра цию сре ды и не

иметь воз мож но сти уз нать, ка кие в нее бы ли вне се ны из ме не ния. На строй ки

сре ды долж ны хра нить ся в от дель ном ре по зи то рии, так как они ме ня ют ся с дру-

гой ско ро стью и по дру гим при чи нам, чем код. Не ко то рые ко ман ды ис поль зу ют

для это го рас пре де лен ные сис те мы управ ле ния вер сия ми (на при мер, bazaar

и git), по сколь ку в них про ще со хра нять в ре по зи то рий из ме не ния, сде лан ные

в про из вод ст вен ной (production) сре де – а они не из беж но слу ча ют ся.

97 этюдов для программистов

Правду скажет только код

Петер Зоммерлад

В­ко­неч­ном­сче­те­се­ман­ти­ка­про­грам­мы­оп ре де ля ет ся ра бо таю щим ко дом. Ес ли

он есть у вас толь ко в ви де би нар но го фай ла, его бу дет не про сто про честь! Од на ко

ис ход ный код, как пра ви ло, дос ту пен, ес ли это ва ша соб ст вен ная про грам ма,

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

про грам ма на ди на ми че ски ин тер пре ти руе мом язы ке. При чте нии ис ход но го ко-

да смысл про грам мы дол жен быть оче ви ден. Мож но с уве рен но стью уз нать, что

де ла ет про грам ма, толь ко гля дя в ис ход ный код. Да же са мое точ ное опи са ние

тех ни че ских тре бо ва ний не ска жет всей прав ды: в нем со дер жит ся не де таль ное

опи са ние то го, что фак ти че ски де ла ет про грам ма, а об щие по же ла ния со ста ви-

те ля тре бо ва ний. До ку мент с ар хи тек ту рой мо жет со дер жать опи са ние пла ни-

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

Эти до ку мен ты мо гут ус та реть в срав не нии с те ку щей реа ли за ци ей… или про сто

по те рять ся. Быть мо жет, их да же и не пи са ли. Воз мож но, един ст вен ное, что ос-

та лось, – это ис ход ный код.

Уч тя все ска зан ное, за дай те се бе во прос, на сколь ко по нят но ваш код мо жет рас-

ска зать вам или дру го му про грам ми сту, что он де ла ет.

Вы мо же те ска зать: «О, так в мо их ком мен та ри ях есть все, что нуж но знать». Но

уч ти те, что ком мен та рии – это не ра бо таю щий код. Они мо гут вво дить в за блу ж-

де ние так же, как лю бая дру гая до ку мен та ция. Тра ди ци он но счи та лось, что

ком мен та рии – без ус лов но хо ро шая прак ти ка, по это му не ко то рые про грам ми-

сты без вся ких раз ду мий пи шут об шир ные ком мен та рии, да же по вто ряя и разъ-

яс няя в них фак ты, и без то го оче вид ные из соб ст вен но ко да. Это пло хой спо соб

сде лать код по нят ным.

Ес ли ваш код ну ж да ет ся в ком мен та ри ях, по про буй те про вес ти ре фак то ринг

так, что бы они ста ли не нуж ны. Про стран ные ком мен та рии за гро мо ж да ют эк-

ран, а ва ша IDE мо жет ав то ма ти че ски их скры вать. Ес ли нуж но по яс нить из ме-

не ние, сде лай те это не в ко де, а с по мо щью со об ще ния при со хра не нии ко да в сис-

те му управ ле ния вер сия ми.

Правду скажет только код

145

Что мож но сде лать, что бы ваш код дей ст ви тель но го во рил прав ду и как мож но

яс нее? Ста рай тесь вы би рать хо ро шие име на. Струк ту ри руй те код с уче том силь-

но свя зан ной (cohesive) функ цио наль но сти, что так же об лег ча ет вы бор имен.

Умень ши те (decouple) свя зан ность ко да, что бы дос тичь ор то го наль но сти. На пи-

ши те ав то ма ти зи ро ван ные тес ты, рас кры ваю щие за пла ни ро ван ное по ве де ние,

и про верь те ин тер фей сы. Без жа ло ст но пе ре де лы вай те код, ес ли най де те спо соб

на пи сать про ще и луч ше. Ста рай тесь, что бы ваш код был как мож но про ще для

чте ния и по ни ма ния.

От но си тесь к сво ему ко ду как к лю бо му дру го му твор че ско му тек сту – сти хо тво-

ре нию, эс се, за пи си в от кры том бло ге или важ но му элек трон но му пись му. Тща-

тель но фор му ли руй те то, что хо ти те вы ра зить, что бы код де лал то, для че го

пред на зна чен, и как мож но про ще со об щал, что он де ла ет, – так, что бы ва ши на-

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

Пом ни те, что по лез ным ко дом поль зу ют ся го раз до доль ше, чем пред по ла га ют его

ав то ры. Те, кто бу дут со про во ж дать ваш код, ос та нут ся вам бла го дар ны. А ес ли

вы са ми за ни мае тесь со про во ж де ни ем, и код, с ко то рым вы ра бо тае те, не спе шит

рас крыть свои тай ны, как мож но рань ше нач ни те при ме нять вы ше упо мя ну тые

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

вый рас су док.

97 этюдов для программистов

Возьмите сборку

(и ее рефакторинг) на себя

Стив Берчук

Не­столь­уж­ред­ки­слу­чаи, ко гда ко ман ды, в це лом дис ци п ли ни ро ван но со блю-

даю щие хо ро шие прак ти ки на пи са ния ко да, пре неб ре жи тель но от но сят ся к сце-

на ри ям сбор ки. Их счи та ют ли бо ма ло зна чи тель ны ми, ли бо на столь ко слож ны-

ми, что об слу жи вать их мо жет толь ко сек та спе циа ли стов по вы пус ку про дук та

(release engineers). Ес ли сце на рии сбор ки слож ны в со про во ж де нии, со дер жат

дуб ли ро ва ние и ошиб ки, это при во дит к про бле мам то го же мас шта ба, что и пло-

хо спро ек ти ро ван ный код.

По че му от вет ст вен ные и гра мот ные раз ра бот чи ки счи та ют сбор ку про ек та не кой

вто ро сте пен ной ра бо той? Од но из объяс не ний – сце на рии сбор ки час то пи шут на

ином язы ке, чем ис ход ный код. Вто рое – сце на рии сбор ки не яв ля ют ся «ко дом».

Та кие объ яс не ния про ти во ре чи вы, ведь боль шин ст во раз ра бот чи ков с удо воль-

ст ви ем изу ча ет но вые язы ки, а имен но в ре зуль та те сбор ки по яв ля ют ся ис пол-

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

вать и за пус кать. Код бес по ле зен, ес ли из не го не со би ра ет ся ис пол няе мый мо-

дуль, а ведь имен но сбор ка оп ре де ля ет ком по нент ную ар хи тек ту ру при ло же ния.

Сбор ка – важ ная часть про цес са раз ра бот ки, и ре ше ния в об лас ти сбор ки спо соб-

ны уп ро щать и сам код, и про цесс его на пи са ния.

Ес ли в сце на ри ях сбор ки ис поль зу ют ся не вер ные идио мы, та кие сце на рии тя же-

ло со про во ж дать и, что ху же, тя же ло улуч шать. Сто ит по тра тить не ко то рое вре-

мя, что бы ра зо брать ся, как пра виль но вно сить из ме не ния. Ес ли при ло же ние со-

би ра ет ся с не вер ны ми вер сия ми за ви си мых биб лио тек или во вре мя сбор ки за-

да ны не вер ные па ра мет ры кон фи гу ра ции, это мо жет вы звать ошиб ки в са мом

при ло же нии.

Тра ди ци он но тес ти ро ва ние все гда воз ла га лось на груп пу кон тро ля ка че ст ва. Сей-

час мы по ни ма ем, что тес ти ро ва ние в про цес се на пи са ния ко да – не об хо ди мое ус-

ло вие для по лу че ния пред ска зуе мо го ре зуль та та. Ана ло гич но и вла дель цем про-

цес са сбор ки долж на быть ко ман да раз ра бот чи ков.

Возьмите сборку (и ее рефакторинг) на себя

147

По ни ма ние про цес са сбор ки мо жет уп ро стить весь жиз нен ный цикл раз ра бот ки

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

да ет воз мож ность но во му раз ра бот чи ку бы ст ро и лег ко вклю чить ся в ра бо ту. Ес-

ли кон фи гу ра цию при ло же ния ав то ма ти зи ро вать в рам ках про цес са сбор ки, это

по мо жет га ран ти ро вать по лу че ние оди на ко вых ре зуль та тов, ко гда над про ек том

ра бо та ет не сколь ко че ло век, и из бе жать ре п лик в ду хе «А у ме ня все ра бо та ет».

Мно гие ин ст ру мен ты сбор ки ге не ри ру ют от че ты о ка че ст ве ко да, за бла го вре мен-

но вскры ваю щие по тен ци аль ные про бле мы. По тра тив вре мя и на учив шись са-

мо стоя тель но управ лять про цес сом сбор ки, вы об лег чи те жизнь се бе и всем ос-

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

ке но вой функ цио наль но сти, что при не сет поль зу кли ен там и сде ла ет ва шу ра-

бо ту бо лее при ят ной.

Изу чи те про цесс сбор ки дос та точ но хо ро шо, что бы знать, ко гда и как из ме нять

его. Сце на рии сбор ки – это то же код. Они слиш ком важ ны, что бы до ве рить их

ко му-то дру го му, хо тя бы по той при чи не, что при ло же ние не за кон че но, по ка

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

ра бо таю щее при ло же ние поль зо ва те лю.

97 этюдов для программистов

Программируйте парами

и входите в поток

Гудни Хаукнес, Кари Россланд и Анн Кэтрин Гэгнат

Пред­ставь­те­се­бе,­что­вы­со­вер­шен­но­по­гло­ще­ны­сво ей ра бо той: со сре до то че ны,

ув ле че ны и за ня ты. Вы по те ря ли счет вре ме ни. Вы сча ст ли вы. Вы в со стоя нии

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

вать со стоя ние по то ка из-за мно го чис лен ных по мех, от вле че ний и про чих пре-

пят ст вий, ко то рые лег ко мо гут его на ру шить.

Ес ли вы уже уча ст во ва ли в пар ном про грам ми ро ва нии, то, ве ро ят но, знае те, как

оно спо соб ст ву ет дос ти же нию со стоя ния по то ка. Ес ли нет, то мы хо тим по де-

лить ся сво им опы том, что бы по бу дить вас за нять ся пар ным про грам ми ро ва ни-

ем не мед лен но! Что бы пар ное про грам ми ро ва ние бы ло ус пеш ным, тре бу ют ся

не ко то рые уси лия со сто ро ны от дель ных уча ст ни ков ко ман ды и всей ко ман ды

в це лом.

Бу ду чи ча стью ко ман ды, про яв ляй те тер пе ние по от но ше нию к ме нее опыт ным

раз ра бот чи кам. Пре одо лей те свой страх пе ред бо лее опыт ны ми раз ра бот чи ка-

ми. Осоз най те, что все лю ди раз ные, и на учи тесь это це нить. Пом ни те о силь ных

и сла бых ка че ст вах – как сво их, так и дру гих чле нов ко ман ды. Вас мо жет уди-

вить, сколь мно го му спо соб ны на учить кол ле ги.

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

сре ди всех уча ст ни ков про ек та. За да чи нуж но ре шать па ра ми и час то про из во-

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

но ви те пра ви ло для та кой ро та ции. Ес ли нуж но, от ка жи тесь от это го пра ви ла

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

до кон ца, пре ж де чем пе ре дать ее сле дую щей па ре. Мо жет по ка зать ся, буд то это

не ра зум но, од на ко на прак ти ке мы об на ру жи ли, что это эф фек тив но.

Су ще ст ву ет мно же ст во си туа ций, ко гда со стоя ние по то ка мо жет быть на ру ше-

но, но пар ное про грам ми ро ва ние по зво ля ет его со хра нить:

Сни жа ет ся роль «фак то ра гру зо ви ка». Вот слег ка пу гаю щий мыс лен ный экс-

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

стал не воз мож ным вы пуск ко неч но го про дук та? Ины ми сло ва ми, на сколь ко

Программируйте парами и входите в поток

149

вы пуск ва ше го ко неч но го про дук та за ви сит от оп ре де лен ных уча ст ни ков ко-

ман ды? Яв ля ют ся ли зна ния при ви ле ги ей или на хо дят ся в об щем дос ту пе?

Ес ли вы осу ще ст в ляе те ро та цию за дач меж ду па ра ми, все гда най дет ся кто-то

еще, об ла даю щий зна ния ми, не об хо ди мы ми для за вер ше ния ра бо ты. На со-

стоя ние по то ка ва шей ко ман ды «фак тор гру зо ви ка» не по влия ет.

Эф фек тив но ре ша ют ся про бле мы. Ес ли вы про грам ми руе те в па ре и стал ки-

вае тесь со слож ной про бле мой, вам все гда есть с кем ее об су дить. В та ком диа-

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

бле мой в оди но че ст ве. В ре зуль та те ро та ции за дач внут ри ко ман ды ва ше ре-

ше ние бу дет по втор но рас смот ре но и кри ти че ски оце не но сле дую щей па рой,

по это му не столь важ но, ес ли ва ше пер во на чаль ное ре ше ние ока жет ся не оп-

ти маль ным.

Плав но про хо дит ин те гра ция. Ес ли ва ша те ку щая за да ча тре бу ет об ра ще-

ния к дру го му фраг мен ту ко да, мож но на де ять ся, что на зва ния ме то дов, до-

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

о том, что этот код де ла ет. Ес ли это не так, то, ра бо тая в па ре с ав то ром это го

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

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

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

Мож но без бо лез нен но пре ры вать ся. Ес ли кто-то по до шел к вам с во про сом,

или зво нит те ле фон, или нуж но сроч но от ве тить на пись мо, или нуж но при-

нять уча стие в со ве ща нии, ваш парт нер по пар но му про грам ми ро ва нию мо-

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

еще бу дет в со стоя нии по то ка, и вы смо же те бы ст ро на вер стать упу щен ное

и при сое ди нить ся к не му.

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

при ме ня ет ся пар ное про грам ми ро ва ние и пра виль но ор га ни зо ва на ро та ция

пар и за дач, но вич ки бы ст ро зна ко мят ся как с ко дом, так и с дру ги ми чле на-

ми ко ман ды.

По ток да ет не ве ро ят ную про дук тив ность. Но это со стоя ние лег ко ут ра тить. Ста-

рай тесь все ми си ла ми вой ти в ра бо чий по ток, а за тем, ко гда это по лу чи лось,

удер жи вай тесь в нем!

97 этюдов для программистов

Предпочитайте примитивам

предметно-ориентированные

типы данных

Эйнар Ландре

23­ сен­тяб­ря­ 1999­го­да­ кос ми че ский ап па рат Mars Climate Orbiter стои мо стью

327,6 мил лио нов дол ла ров по те рял ся при вы хо де на ор би ту Мар са из-за про-

грамм ной ошиб ки на Зем ле. Ошиб ку впо след ст вии ок ре сти ли сме ше ни ем еди-

ниц из ме ре ний ( metric mix-up). Про грамм ное обес пе че ние на зем ной стан ции про-

из во ди ло рас че ты в фун тах си лы, а кос ми че ский ап па рат ожи дал ука за ний

в нью то нах1, в ре зуль та те че го на зем ная стан ция не до оце ни ла мощ ность ус ко ри-

те лей ап па ра та в 4,45 раза.

Это один из мно гих при ме ров от ка зов про грамм но го обес пе че ния, ко то рых мож-

но бы ло из бе жать бла го да ря бо лее стро гой и пред мет но-ори ен ти ро ван ной ти пи-

за ции. Это так же на гляд ная де мон ст ра ция на зна че ния мно гих воз мож но стей

язы ка Ada, спро ек ти ро ван но го пре иму ще ст вен но для соз да ния встраи вае мо го

от ка зо устой чи во го про грамм но го обес пе че ния. В Ada при ме ня ет ся стро гая ти-

пи за ция со ста ти че ской про вер кой как при ми тив ных, так и оп ре де лен ных поль-

зо ва те лем ти пов:

type Velocity_In_Knots is new Float range 0.0 .. 500.00;

type Distance_In_Nautical_Miles is new Float range 0.0 .. 3000.00;

Velocity: Velocity_In_Knots;

Distance: Distance_In_Nautical_Miles;

Some_Number: Float;

Some_Number:= Distance + Velocity; -- Ком пи ля тор от ло вит здесь

оши боч ное ис поль зо ва ние ти пов.

Раз ра бот чи ки при ло же ний, сбои в ко то рых ме нее кри тич ны, так же мо гут вы иг-

рать от бо лее ши ро ко го при ме не ния пред мет но-ори ен ти ро ван ной ти пи за ции.

Пред мет но-ори ен ти ро ван ные ти пы мож но ис поль зо вать вме сто имею щих ся в язы-

ках про грам ми ро ва ния и биб лио те ках ба зо вых ти пов дан ных, та ких как стро ки

и чис ла с пла ваю щей за пя той. В Java, C++, Python и дру гих со вре мен ных язы-

ках аб ст ракт ный тип дан ных из вес тен как class. При ме не ние та ких клас сов,

1

1 нью тон ра вен 0,224808943 фун та си лы. – Прим. ред.

Предпочитайте примитивам предметно-ориентированные типы данных

151

как Velocity_In_Knots (ско рость в уз лах) и Distance_In_Nautical_Miles (рас стоя ние

в мор ских ми лях) зна чи тель но по вы ша ет ка че ст во ко да:

Та кой код лег че чи тать, по сколь ку он вы ра жа ет по ня тия пред мет ной об лас-

ти, а не про сто опи сы ва ет стро ки (String) или дей ст ви тель ные чис ла (Float).

Та кой код лег че тес ти ро вать, по то му что он ин кап су ли ру ет по ве де ние, ко то-

рое лег ко про ве рить.

Та кой код об лег ча ет по втор ное ис поль зо ва ние в раз ных при ло же ни ях или

сис те мах.

Этот под ход в рав ной ме ре при го ден для ис поль зо ва ния в язы ках как со ста ти че-

ской, так и с ди на ми че ской ти пи за ци ей. Един ст вен ное от ли чие в том, что в язы-

ках со ста ти че ской ти пи за ци ей раз ра бот чик по лу ча ет не ко то рую по мощь от ком-

пи ля то ра, то гда как при ди на ми че ской ти пи за ции боль ше при хо дит ся по ла-

гать ся на мо дуль ное тес ти ро ва ние. Мо гут раз ли чать ся сти ли про вер ки, но под-

ход и стиль вы ра же ния оди на ко вы.

Мо раль: на чи най те про бо вать пред мет но-ори ен ти ро ван ные ти пы с це лью по вы-

ше ния ка че ст ва раз ра ба ты вае мых про грамм.

97 этюдов для программистов

Предотвращайте

появление ошибок

Жиль Колборн

Со­об­ще­ния­об­ошиб­ках­– наи бо лее от вет ст вен ный вид взаи мо дей ст вия меж ду

поль зо ва те лем и сис те мой. Они воз ни ка ют, ко гда об ще ние поль зо ва те ля с сис те-

мой на хо дит ся на гра ни раз ры ва.

Про ще все го счи тать, буд то ошиб ки воз ни ка ют по ви не поль зо ва те лей в ре зуль-

та те вво да не вер ных дан ных. Но ошиб ки, ко то рые лю ди со вер ша ют, пред ска зуе-

мы и про ис хо дят сис тем но. По это му мож но «от ла жи вать» взаи мо дей ст вие меж-

ду поль зо ва те лем и сис те мой так же, как вы от ла жи вае те взаи мо дей ст вие меж ду

дру ги ми ком по нен та ми сис те мы.

До пус тим, поль зо ва тель дол жен вве сти да ту в оп ре де лен ном диа па зо не. Чем по-

зво лять ему вве сти лю бую да ту, не луч ше ли пре дос та вить сред ст во вро де спи ска

или ка лен да ря, ко то рое по ка жет толь ко до пус ти мые да ты? Это ис клю чит вся-

кую воз мож ность вво да да ты за пре де ла ми раз ре шен но го диа па зо на.

Дру гая рас про стра нен ная про бле ма – ошиб ки фор ма ти ро ва ния. На при мер, ес ли

поль зо ва тель ви дит тек сто вое по ле для да ты и вво дит од но знач но трак туе мую да-

ту «29 ию ля 2012», не пра виль но бу дет за бра ко вать ее толь ко по то му, что дан ные

име ют не тот фор мат, ко то рый пред по чи тае те вы (на при мер, «ММ/ДД/ГГГГ»).

Еще ху же от кло нить да ту «29 / 07 / 2012» толь ко из-за лиш них про бе лов; та кие

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

ет вер ный фор мат.

Ошиб ка воз ни ка ет по то му, что нам про ще от кло нить дан ные, чем раз би рать три

или че ты ре фор ма та да ты, по лу чив ших ши ро кое рас про стра не ние. По доб ные

мел кие ошиб ки раз дра жа ют поль зо ва те ля, так что ему слож но со сре до то чить ся,

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

к же ла нию поль зо ва те ля вво дить имен но ин фор ма цию, а не дан ные.

Дру гой спо соб из бе жать ошиб ки фор ма ти ро ва ния – пред ло жить поль зо ва те лю

под сказ ку, на при мер, с по мо щью мет ки в по ле вво да, ко то рая по ка зы ва ет нуж-

ный фор мат («ДД/ММ/ГГГГ»). Дру гой спо соб под ска зать – раз де лить по ле на

три час ти по два, два и че ты ре сим во ла.

Предотвращайте появление ошибок

153

Под сказ ки – это не то же са мое, что ин ст рук ции: под сказ ки не на вяз чи вы и ла-

ко нич ны, а ин ст рук ции мно го слов ны. Под сказ ки по яв ля ют ся в мо мент взаи мо-

дей ст вия, а ин ст рук ции – до это го мо мен та. Под сказ ки под чер ки ва ют кон текст,

а ин ст рук ции дик ту ют по ве де ние.

Обыч но ин ст рук ции ма ло эф фек тив ны в пре дот вра ще нии оши бок. Поль зо ва те-

ли склон ны счи тать, что ин тер фей сы долж ны дей ст во вать со глас но их преж не-

му опы ту («Лю бо му долж но быть по нят но, что оз на ча ет 29 ию ля 2012!»). По это му

ин ст рук ции ни кто не чи та ет. Под сказ ки уво дят поль зо ва те лей от со вер ше ния

оши бок.

Еще один спо соб из бе жать оши бок – пред ла гать зна че ния по умол ча нию. На при-

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

се го дня, зав тра, мой день ро ж де ния, срок сда чи мое го про ек та или да те, ука зан-

ной в этой же фор ме в про шлый раз. В за ви си мо сти от кон тек ста од на из этих дат

впол не мо жет ока зать ся хо ро шим ва ри ан том для зна че ния по умол ча нию.

Ка ко ва бы ни бы ла при чи на ошиб ки, со вер шен ной поль зо ва те лем, сис те ма долж-

на ошиб ки про щать. Это му мож но со дей ст во вать, обес пе чив воз мож ность мно го-

уров не вой от ме ны ( undo) всех вы пол нен ных опе ра ций – в осо бен но сти тех, ко то-

рые мо гут уда лить или из ме нить дан ные поль зо ва те ля.

За пись ка ж дой опе ра ции от ме ны в файл жур на ла и его по сле дую щий ана лиз мо-

гут про лить свет на то, ка кие осо бен но сти ин тер фей са за став ля ют поль зо ва те лей

бес соз на тель но со вер шать ошиб ки, на при мер по сто ян но на жи мать «не на ту»

кноп ку. Час то ока зы ва ет ся, что та кие ошиб ки вы зва ны не удач ны ми под сказ ка-

ми, ко то рые вво дят поль зо ва те ля в за блу ж де ние, или не про ду ман ным по ряд ком

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

по яв ле ние оши бок.

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

и воз ни ка ют из вза им но го не допо ни ма ния меж ду поль зо ва те лем и при ло же ни-

ем. Ес ли вы пой ме те, как поль зо ва те ли ду ма ют, как они вос при ни ма ют ин фор-

ма цию, как при ни ма ют ре ше ния и вво дят дан ные, то гда вы смо же те от ла дить

взаи мо дей ст вие меж ду ва ши ми про грам ма ми и ва ши ми поль зо ва те ля ми.

97 этюдов для программистов

Профессиональный программист

Роберт Мартин (Дядюшка Боб)

Ко­го­мож­но­счи­тать­про­фес­сио­наль­ным­про­грам­ми­стом?

Са мая глав ная чер та про фес сио наль но го про грам ми ста – лич ная от вет ст вен-

ность. Про фес сио наль ные про грам ми сты от ве ча ют за свою карь е ру, свои оцен-

ки, свои обя за тель ст ва по сро кам, свои ошиб ки и свое мас тер ст во. Про фес сио-

наль ный про грам мист не пе ре кла ды ва ет эту от вет ст вен ность на дру гих.

Про фес сио нал сам от ве ча ет за свою карь е ру. Чте ние и обу че ние – ва ша от-

вет ст вен ность. Быть в кур се по след них дос ти же ний от рас ли и тех но ло гий –

ва ша от вет ст вен ность. Слиш ком час то про грам ми сты счи та ют, что обу чать

их – за да ча ра бо то да те ля. Из ви ни те, это со вер шен но не вер но. Как вы ду мае-

те, вра чи то же так счи та ют? А юри сты? Нет, они учат ся в свое сво бод ное вре-

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

вре ме ни, изу чая жур на лы и ре ше ния су да. Они под дер жи ва ют свой про фес-

сио наль ный уро вень. Так долж ны по сту пать и мы. От но ше ния меж ду ва ми

и ра бо то да те лем хо ро шо опи са ны в ва шем кон трак те. Ес ли ко рот ко, ра бо то-

да тель обе ща ет вам пла тить, а вы обе щае те хо ро шо ра бо тать.

Про фес сио нал от ве ча ет за на пи сан ный код. Он не вы пус ка ет код, ес ли не

уве рен в его ра бо те. За ду май тесь на ми ну ту. Как вы мо же те счи тать се бя про-

фес сио на лом, ес ли го то вы вы пус тить код, в ко то ром у вас нет уве рен но сти?

Про фес сио наль ные про грам ми сты ожи да ют, что от дел кон тро ля ка че ст ва ни-

че го не най дет в их ко де, по то му что они вы пус ка ют его не рань ше, чем тща-

тель но про тес ти ру ют. Ко неч но, груп па кон тро ля ка че ст ва что-ни будь да

об на ру жит, ведь иде аль ных лю дей нет. Но как про фес сио на лы мы долж ны

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

Про фес сио нал – это ко манд ный иг рок. Он от ве ча ет за ре зуль тат всей ко ман-

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

друг дру га, учат ся друг у дру га и да же при кры ва ют друг дру га при не об хо ди-

мо сти. Ко гда один уча ст ник ко ман ды спо ты ка ет ся, дру гие всту па ют ся за не-

го, зная, что ко гда-ни будь им са мим по на до бит ся при кры тие.

Профессиональный программист

155

Про фес сио нал не при ем лет длин ных спи сков де фек тов. Ог ром ный спи сок де-

фек тов – это при знак не ряш ли вой ра бо ты. Сис те мы, в ко то рых сис те ма управ-

ле ния де фек та ми со дер жит ты ся чи за пи сей, – это тра ге дия бес печ но сти. Бо-

лее то го, в боль шин ст ве про ек тов са ма по треб ность в ав то ма ти зи ро ван ной сис-

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

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

ими тре бу ет ся ав то ма ти за ция.

Про фес сио нал под дер жи ва ет по ря док. Он гор дит ся сво им мас тер ст вом. Его

код по ня тен, хо ро шо струк ту ри ро ван и лег ко чи та ет ся. Про фес сио на лы сле-

ду ют ого во рен ным стан дар там и луч шим прак ти кам. Они ни ко гда, ни при

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

же те по ки нуть соб ст вен ное те ло и на блю дать, как врач де ла ет вам опе ра цию

на от кры том серд це. У это го вра ча есть край ний (в бу к валь ном смыс ле) срок

за вер ше ния ра бо ты. Он дол жен за кон чить опе ра цию до то го, как ап па рат ис-

кус ст вен но го серд ца по вре дит слиш ком мно го кро вя ных кле ток в ва шем ор-

га низ ме. Как, по-ва ше му, он дол жен се бя вес ти? Вы бы хо те ли, что бы он вел

се бя как ти пич ный про грам мист, пи шу щий код в спеш ке и бес по ряд ке? Хо-

ти те ли вы ус лы шать от не го: «Как-ни будь по том все это ис прав лю»? Или все

же он дол жен тща тель но при дер жи вать ся пра вил сво ей нау ки, рас счи ты вать

вре мя и быть уве рен ным, что из бран ный им под ход – луч ший из дос туп ных

ему? Че го хо ти те вы – бес по ряд ка или про фес сио на лиз ма?

Про фес сио на лы об ла да ют чув ст вом от вет ст вен но сти. Они от ве ча ют за соб ст вен-

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

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

них да вят сро ки. На са мом де ле, ко гда дав ле ние рас тет, про фес сио на лы еще креп-

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

97 этюдов для программистов

Держите все

в системе управления версиями

Диомидис Спинеллис

Хра­ни­те­все,­что­ка­са­ет­ся­лю­бых­ва­ших­про­ек­тов, в сис те ме управ ле ния вер-

сия ми. Не об хо ди мые для это го ре сур сы уже име ют ся: бес плат ные ин ст ру мен ты

ти па Subversion, Git, Mercurial и CVS, вдо воль дис ко во го про стран ст ва, де ше вые

и мощ ные сер ве ры, по все ме ст ный дос туп в Ин тер нет и да же служ бы хос тин га

про ек тов. По сле то го как вы ус та но ви ли сис те му управ ле ния вер сия ми, со хра-

нить ва ши тру ды в ре по зи то рий очень про сто: дос та точ но лишь вы пол нить со от-

вет ст вую щую ко ман ду в чис том ка та ло ге с ко дом. А ос во ить нуж но все го две но-

вые ос нов ные опе ра ции: за пись ( commit) в ре по зи то рий из ме не ний, сде лан ных

ва ми в ко де, и об нов ле ние ( update) ва шей ра бо чей вер сии про ек та до той, ко то рая

на хо дит ся в ре по зи то рии.

По сле то го как про ект по ме щен в сис те му управ ле ния вер сия ми, мож но без тру-

да про смот реть его ис то рию, уз нать, кто на пи сал ка ж дый фраг мент ко да, и об-

ра тить ся к кон крет ной вер сии фай ла или про ек та с по мо щью уни каль но го иден-

ти фи ка то ра. А что еще важ нее – те перь вы мо же те де лать рис ко ван ные из ме не-

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

ес ли он по тре бу ет ся в бу ду щем. Ведь ста рая вер сия на деж но хра нит ся в ре по зи-

то рии. Мож но (и нуж но) по ме чать ( tag) ста биль ные вер сии по нят ны ми вам име-

на ми, что бы по том бы ст ро по лу чить имен но ту вер сию, ко то рая ра бо та ет у ва ше-

го кли ен та. Мож но соз да вать от дель ные вет ви ( branches) и раз ра ба ты вать их

па рал лель но: в боль шин ст ве про ек тов есть ак тив но раз ра ба ты вае мая ветвь и од-

на или не сколь ко вет вей бо лее ран них вер сий, для ко то рых осу ще ст в ля ет ся ак-

тив ная под держ ка.

Сис те ма управ ле ния вер сия ми ми ни ми зи ру ет тре ния меж ду раз ра бот чи ка ми.

Ко гда про грам ми сты ра бо та ют над не за ви си мы ми час тя ми про грамм но го обес-

пе че ния, их ин те гра ция про хо дит «на ура». Ко гда они од но вре мен но из ме ня ют

од ни и те же фай лы, сис те ма со об щит об этом и по зво лит раз ре шить кон флик ты.

Мож но на стро ить сис те му так, что бы она опо ве ща ла всех раз ра бот чи ков о ка ж-

дом вне сен ном из ме не нии, что даст ка ж до му об щее пред став ле ние о хо де раз ви-

тия про ек та.

Держите все в системе управления версиями

157

Ор га ни зуя ра бо ту над про ек том, не жад ни чай те: по мес ти те в сис те му управ ле-

ния вер сия ми все, что от но сит ся к про ек ту. По ми мо ис ход но го ко да за не си те

в ре по зи то рий до ку мен та цию, ин ст ру мен ты, сце на рии для сбор ки, опи са ния тес-

то вых сце на ри ев, гра фи че ский ма те ри ал и да же биб лио те ки. Ко гда весь про ект

на деж но по ме щен в ре по зи то рий (для ко то ро го ре гу ляр но де ла ет ся ре зерв ная ко-

пия), воз мож ный ущерб от по те ри дис ка или дан ных ста но вит ся ми ни маль ным.

Что бы на чать раз ра бот ку на но вой ма ши не, дос та точ но по лу чить ко пию (check

out) про ек та из ре по зи то рия. Это уп ро ща ет рас про стра не ние, сбор ку и тес ти ро ва-

ние ко да на раз ных плат фор мах: на лю бой ма ши не един ст вен ная ко ман да об нов-

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

По сле то го как вы оце ни те пре лес ти ра бо ты с сис те мой управ ле ния вер сия ми,

при смот ри тесь к сле дую щим пра ви лам, ко то рые сде ла ют ва шу ра бо ту и ра бо ту

ва шей ко ман ды еще бо лее эф фек тив ной:

Со хра няй те ка ж дое ло ги че ское из ме не ние в ви де от дель ной опе ра ции. Ес ли

вы объ еди ни те боль шую ку чу из ме не ний в од ну за пись (commit), вам бу дет

труд но раз де лить их впо след ст вии. Это осо бен но важ но, ко гда про во дит ся ре-

фак то ринг или из ме не ние сти ля в рам ках все го про ек та, что мо жет лег ко

скрыть дру гие мо ди фи ка ции.

Со про во ж дай те ка ж дое из ме не ние по яс няю щим со об ще ни ем. Как ми ни мум

крат ко опи ши те, что вы из ме ни ли. И ес ли вам тре бу ет ся со хра нить на бу ду-

щее при чи ны сде лан ных из ме не ний, луч ше го мес та не най ти.

На ко нец, не сто ит со хра нять в ре по зи то рий та кой код, ко то рый ло ма ет сбор-

ку про ек та, ина че вы бы ст ро на вле че те на се бя не до воль ст во дру гих уча ст ни-

ков про ек та.

Жизнь с сис те мой управ ле ния вер сия ми слиш ком при ят на, что бы пор тить ее

ошиб ка ми, ко то рых лег ко из бе жать.

97 этюдов для программистов

Брось мышь и медленно

отойди от клавиатуры

Берк Хафнагель

Вы­уже­не­сколь­ко­ча­сов­ра­бо­тае­те­над ка кой-то не под даю щей ся за да чей, а ре-

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

ма ту по про да же на пит ков, а на об рат ном пу ти от вет вдруг ста но вит ся оче ви ден.

Слу ча лось ли с ва ми та кое? При хо ди лось ли вам за ду мы вать ся, по че му так про-

ис хо дит? Все де ло в том, что, ко гда вы пи ше те код, ак тив на ло ги че ская часть

ва ше го моз га, а твор че ская от клю че на. Она ни как не смо жет се бя про явить, по-

ка ло ги че ская сто ро на не сде ла ет пе ре рыв в ра бо те.

Вот вам при мер из жиз ни. Я при че сы вал кое-ка кой ста рый код и на ткнул ся на

«за нят ный» ме тод. Он пред на зна чал ся для про вер ки пра виль но сти фор ма та вре-

ме ни в стро ке ви да hh:mm:ss xx, где hh – это ча сы, mm – ми ну ты, ss – се кун ды,

а xx при ни ма ет зна че ние AM или PM.

Ме тод со дер жал сле дую щий код для пре об ра зо ва ния двух сим во лов (пред став-

ляю щих час) в чис ло и про вер ки, что час на хо дит ся в за дан ном диа па зо не:

try {

Integer.parseInt(time.substring(0, 2));

} catch (Exception x) {

return false;

}

if (Integer.parseInt(time.substring(0, 2)) > 12) {

return false;

}

Тот же са мый код по яв лял ся еще два ж ды с со от вет ст вую щи ми из ме не ния ми

в сме ще нии сим во лов и в зна че нии верх ней гра ни цы, что бы про ве рить пра виль-

ность ми нут и се кунд. За кан чи вал ся ме тод сле дую щи ми стро ка ми, про ве ряю-

щи ми AM и PM:

Брось мышь и медленно отойди от клавиатуры

159

if (!time.substring(9, 11).equals("AM") &

!time.substring(9, 11).equals("PM")) {

return false;

}

Ес ли ни од но из это го ря да ус ло вий не ока зы ва лось лож ным (при этом воз вра ща-

ет ся false), ме тод воз вра щал true.

Ес ли при ве ден ный код ка жет ся слиш ком мно го слов ным и труд ным для по ни ма-

ния, не вол нуй тесь. Мне то же так по ка за лось, и я ре шил, что на шел код, ко то-

рый сто ит под чис тить. Я пе ре ра бо тал его и на пи сал не сколь ко мо дуль ных тес-

тов, что бы про ве рить, по-преж не му ли пра виль но ра бо та ет но вый код.

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

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

верх нюю гра ни цу ча сов, ми нут и се кунд.

Ко гда я со би рал ся на ра бо ту на сле дую щий день, ме ня по се ти ла идея: а по че му

бы не про ве рить пра виль ность стро ки с по мо щью ре гу ляр но го вы ра же ния? Че-

рез не сколь ко ми нут у ме ня бы ла ра бо чая реа ли за ция, со стоя щая все го из од ной

стро ки ко да:

public static boolean validateTime(String time) {

return time.matches("(0[1-9]|1[0-2]):[0-5][0-9]:[0-5][0-9] ([AP]M)");

}

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

а в том, что по ка я не ото шел от ком пь ю те ра, мне ка за лось, что мой пер вый ва ри-

ант был луч шим ре ше ни ем за да чи.

По это му, ко гда вы в сле дую щий раз столк не тесь с не по дат ли вой за да чей, сде лай-

те се бе одол же ние. По-на стоя ще му ра зо брав шись в су ти про бле мы, зай ми тесь

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

на бу ма ге, по слу шай те му зы ку или про сто вый ди те из до ма. Ино гда луч шее, что

вы мо же те сде лать, что бы ре шить за да чу, – это бро сить мышь и отой ти от кла-

виа ту ры.

97 этюдов для программистов

Читайте код

Карианне Берг

Мы,­про­грам­ми­сты,­стран­ные­соз­да­ния. Мы лю бим пи сать код. Но что ка са ет-

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

го раз до ув ле ка тель ней, а чи тать код труд но – ино гда поч ти не воз мож но. Осо бен-

но тя же ло чи тать код, на пи сан ный дру ги ми. Не все гда из-за то го, что он пло хо

на пи сан, но по то му, что дру гой че ло век ду ма ет и ре ша ет за да чи ина че, чем вы.

А вам не при хо ди ло в го ло ву, что чте ние чу жо го ко да мо жет по мочь улуч шить

ваш соб ст вен ный код?

Ко гда вы в сле дую щий раз бу де те чи тать ка кой-ни будь код, ос та но ви тесь и за ду-

май тесь. Труд но его чи тать или лег ко? Ес ли труд но, то по че му? Он пло хо от фор-

ма ти ро ван? Сис те ма име но ва ния не по сле до ва тель на или не ло гич на? Не сколь ко

за дач сме ша лись в од ном фраг мен те ко да? Воз мож но, вы бран ный язык за труд-

ня ет чте ние ко да. Ста рай тесь учить ся на чу жих ошиб ках, что бы не по вто рять их

в сво ем ко де. Вас мо гут ожи дать сюр при зы. На при мер, прие мы раз ры ва за ви си-

мо стей мо гут быть по лез ны для вве де ния сла бо го свя зы ва ния, но они мо гут так-

же за труд нить чте ние ко да. А код, ко то рый од ни счи та ют эле гант ным, дру гие

мо гут на звать не чи тае мым.

Ес ли код чи та ет ся лег ко, об ра ти те на не го вни ма ние и по смот ри те, нель зя ли че-

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

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

Или он со дер жит ме то ды бо лее ко рот кие и бо лее точ но име но ван ные, чем ва ши.

В не ко то рых про ек тах с от кры тым ис ход ным ко дом мож но встре тить мас су при-

ме ров ве ли ко леп но го, по нят но го ко да, то гда как в дру гих вы столк не тесь с пря-

мо про ти во по лож ным! Ска чай те не мно го ко да из ре по зи то ри ев та ких про ек тов

и по изу чай те его.

Чте ние соб ст вен но го ста ро го ко да из про ек та, над ко то рым вы боль ше не ра бо тае-

те, то же мо жет ока зать ся по учи тель ным опы том. Нач ни те с ка ко го-ни будь са мо-

го ста ро го ко да и по сте пен но про дви гай тесь к ко ду, ко то рый пи ше те се го дня. Воз-

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

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

Читайте код

161

сму ще ние, ти па то го, ко то рое ис пы ты ва ешь, ко гда те бе рас ска зы ва ют о том, что

ты го во рил на ка ну не ве че ром, вы пи вая в па бе. По смот ри те, как с го да ми рос ло

ва ше мас тер ст во; это мо жет стать весь ма обод ряю щим от кры ти ем. Вы яс ни те, ка-

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

же сти ле се го дня.

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

мас тер ст во про грам ми ро ва ния, не бе ри тесь за кни ги. Чи тай те код.

97 этюдов для программистов

Читайте гуманитарные книги

Кейт Брэйтуэйт

Во­всех­про­ек­тах,­кро­ме­са­мых­ма­лень­ких, лю ди ра бо та ют с дру ги ми людь ми.

Во всех ис сле до ва тель ских об лас тях, кро ме са мых аб ст ракт ных, лю ди пи шут

про грам мы для лю дей, что бы по мочь им дос тичь оп ре де лен ную цель. Лю ди пи-

шут про грам мы вме сте с людь ми и для лю дей. Этот биз нес стро ит ся во круг лю-

дей. К со жа ле нию, про грам ми стов обу ча ют то му, что ма ло по мо га ет им в об ще-

нии с людь ми, для ко то рых и с ко то ры ми они ра бо та ют. К сча стью, су ще ст ву ет

це лая об ласть зна ний, ко то рая мо жет в этом по мочь.

К при ме ру, Люд виг Вит ген штейн (Ludwig Wittgenstein) в сво ей кни ге «Phi loso-

phi cal Investigations»1 (Wiley-Blackwell) и дру гих ра бо тах весь ма убе ди тель но

ут вер жда ет, что ни один че ло ве че ский язык не яв ля ет ся – и не мо жет яв лять-

ся – фор ма том се риа ли за ции для пе ре да чи идей или об ра зов из го ло вы од но го

че ло ве ка в го ло ву дру го го. Нам сле ду ет пом нить об этом уже то гда, ко гда мы «со-

би ра ем тре бо ва ния». Вит ген штейн так же по ка зы ва ет, что на ша спо соб ность по-

ни мать друг дру га свя за на не с об щи ми оп ре де ле ния ми, а с еди ным опы том и об-

ра зом жиз ни. Воз мож но, по этой при чи не у про грам ми стов, глу бо ко вни каю щих

в пред мет ную об ласть, все по лу ча ет ся луч ше, чем у тех, кто дер жит ся от нее

в сто ро не.

Ла кофф (Lakoff) и Джон сон (Johnson) в сво ей кни ге «Metaphors We Live By»2

(Uni versity of Chicago Press) ут вер жда ют, что язык в зна чи тель ной сте пе ни ме-

та фо ри чен и что ме та фо ры язы ка по зво ля ют нам за гля нуть в соб ст вен ное вос-

при ятие ми ра. Да же та кой на пер вый взгляд кон крет ный тер мин, как де неж ный

по ток ( cash flow), упот реб ляе мый на ми в раз го во ре о фи нан сах, мо жет быть по-

нят ме та фо рич но: «день ги – это жид кость». А как эта ме та фо ра влия ет на на ши

пред став ле ния о сис те мах, опе ри рую щих день га ми? Или дру гой при мер: мы го-

во рим об уров нях в сте ке про то ко лов, где есть про то ко лы вы со ко уров не вые,

1

Людвиг Витгенштейн «Философские исследования», АСТ, 2011.

2

Лакофф Дж. и Джонсон М. «Метафоры, которыми мы живем», ЛКИ, 2008.

Читайте гуманитарные книги

163

а есть низ ко уров не вые. Это силь ная ме та фо ра: поль зо ва тель – «ввер ху», а тех но-

ло гии «вни зу». Ме та фо ра вскры ва ет на ше пред став ле ние о струк ту ре сис те мы,

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

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

Мар тин Хай дег гер (Martin Heidegger) вни ма тель но изу чал пу ти по зна ния че ло-

ве ком ин ст ру мен тов че рез опыт их при ме не ния. Про грам ми сты соз да ют и ис-

поль зу ют ин ст ру мен ты, мы ду ма ем об ин ст ру мен тах, соз да ем ин ст ру мен ты, мо-

ди фи ци ру ем и пе ре де лы ва ем их. Ин ст ру мен ты – это объ ек ты на ше го ин те ре са.

Но для их поль зо ва те лей, как по ка зы ва ет Хай дег гер в сво ей кни ге «Being and

Time»1 (Harper Perennial), ин ст ру мент – не ви ди мая сущ ность, по сти же ние ко то-

рой про ис хо дит толь ко во вре мя ее при ме не ния. Для поль зо ва те лей ин ст ру мен-

ты ста но вят ся объ ек та ми ин те ре са толь ко то гда, ко гда они не ра бо та ют. Об этой

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

Эле о но ра Рош (Eleanor Rosch) оп ро верг ла мо дель ка те го ри за ции Ари сто те ля, упо-

ря до чи ваю щую на ше по ни ма ние ми ра. Ко гда мы, про грам ми сты, спра ши ва ем

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

де ле ния, ос но вы ваю щие ся на пре ди ка тах. Нам это очень удоб но. Тер мы в пре ди-

ка тах лег ко пре вра ща ют ся в ат ри бу ты клас са или ко лон ки таб ли цы. По доб ные

ка те го рии яв ля ют ся точ ны ми, не пе ре се каю щи ми ся и ло ги че ски вер ны ми. Но,

к со жа ле нию, как по ка зы ва ет Рош в «Natural Categories»2 (Ес те ст вен ные ка те-

го рии) и бо лее позд них сво их ра бо тах, лю ди пред став ля ют се бе мир ины ми спо-

со ба ми. Пред став ле ние людь ми ми ра ос но ва но на при ме рах. Не ко то рые из та-

ких при ме ров, так на зы вае мые про то ти пы, луч ше дру гих, и по это му ос но ван-

ные на них ка те го рии раз мы ты, пе ре се ка ют ся од на с дру гой, мо гут об ла дать на-

сы щен ной внут рен ней струк ту рой. По ка мы не пе ре ста нем на стаи вать на от ве-

тах в ду хе сис те мы ка те го рий Ари сто те ля, мы не смо жем за дать поль зо ва те лям

пра виль ные во про сы об их ми ре, и нам бу дет труд но до бить ся не об хо ди мо го об-

ще го по ни ма ния.

1

Мартин Хайдеггер «Время и бытие», Наука, 2007.

2

«Cognitive Psychology» (Когнитивная психология) 4: 328-50 (1973).

97 этюдов для программистов

Почаще изобретайте колесо

Джейсон П. Сэйдж

Поль зуй тесь го то вы ми ре ше ния ми – глу по сно ва изо бре тать ко ле со…

При­хо­ди­лось­вам­слы­шать­по­доб­ный­со­вет? Ну, еще бы! Ка ж дый раз ра бот чик

или сту дент час то слы шит та кие вы ска зы ва ния. Но по че му? По че му на по втор-

ное изо бре те ние ко ле са так ко со смот рят? По то му что су ще ст вую щий код, как

пра ви ло, ра бо та ет. Он уже в ка кой-то фор ме про шел кон троль ка че ст ва и стро гое

тес ти ро ва ние и те перь ус пеш но при ме ня ет ся. Кро ме то го, вре мя и си лы, по тра-

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

поль зо ва ние го то во го про дук та или ко да. Сто ит ли брать ся за изо бре те ние ко ле-

са? За чем? В ка ких слу ча ях?

Ве ро ят но, вы зна ко мы с пуб ли ка ция ми о шаб ло нах в раз ра бот ке или с кни га ми,

по свя щен ны ми про ек ти ро ва нию про грамм но го обес пе че ния. Ка кой бы за ме ча-

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

В ка кой ме ре про смотр филь ма о па рус ном спор те от ли ча ет ся от са мо стоя тель-

но го хо ж де ния под па ру сом, в та кой же ме ре ис поль зо ва ние го то во го ко да от ли-

ча ет ся от про цес са, ко гда вы раз ра ба ты вае те соб ст вен ное при ло же ние с ну ля,

тес ти руе те его, ло мае те, чи ни те и по сте пен но улуч шае те его.

Изо бре те ние ко ле са – это не про сто уп раж не ние в пра виль ном раз ме ще нии кон-

ст рук ций ко да: оно тре бу ет глу бо ко го по ни ма ния внут рен не го уст рой ст ва раз-

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

Вир ту аль ные стра ни цы? Мо же те са ми их реа ли зо вать? А как на счет дву на прав-

лен ных связ ных спи сков? Клас сов ди на ми че ских мас си вов? Кли ен тов ODBC?

Мо же те на пи сать гра фи че ский ин тер фейс поль зо ва те ля, ко то рый ра бо та ет так

же, как тот, что вы сей час ис поль зуе те, и ко то рый вам нра вит ся? Мо же те са ми

соз дать вид жет для брау зе ра? Знае те, ко гда нуж но пи сать сис те му с муль ти п лек-

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

в фай ле или в па мя ти?

Почаще изобретайте колесо

165

Боль шин ст ву раз ра бот чи ков ни ко гда не при хо ди лось соз да вать та кие ба зо вые

про грамм ные ком по нен ты, а по то му они лишь по верх но ст но раз би ра ют ся в ра-

бо те этих «ко лес». В ре зуль та те все по доб ные мо ду ли и биб лио те ки счи та ют ся та-

ин ст вен ным чер ным ящи ком, ко то рый ка ким-то об ра зом ра бо та ет. Ес ли вы ви-

ди те толь ко по верх ность во ды, это го не дос та точ но для по ни ма ния опас но стей,

тая щих ся в ее глу би не. Ес ли вы ни че го не знае те о соз да нии бо лее низ ко уров не-

во го про грамм но го обес пе че ния, это ог ра ни чи ва ет ва шу спо соб ность соз да вать

дей ст ви тель но вы даю щие ся про дук ты.

По пы тать ся изо брес ти ко ле со и по тер петь не уда чу по лез нее ус пе ха с пер вой же

по пыт ки. Уро ки, по лу чен ные ме то дом проб и оши бок, име ют эмо цио наль ную

со став ляю щую, ко то рую про стое чте ние тех ни че ской кни ги не спо соб но соз дать!

За по ми нать фак ты и чи тать ум ные кни ги важ но, но в ста нов ле нии вы даю ще го-

ся про грам ми ста при об ре те ние опы та име ет та кое же зна че ние, как на ко п ле ние

фак тов. Изо бре те ние ко ле са так же важ но для об ра зо ва ния и мас тер ст ва про-

грам ми ста, как под ня тие тя же стей для куль ту ри ста.

97 этюдов для программистов

Не поддавайтесь очарованию

шаблона Singleton

Сэм Сааристе

Шаб­лон­ Singleton­ ре­ша­ет­ мно­гие­ ва­ши­ про­бле­мы. Вы знае те, что вам ну жен

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

ини циа ли зи ро ван пе ред ис поль зо ва ни ем. Ар хи тек ту ра ос та ет ся про стой бла го-

да ря на ли чию гло баль ной точ ки дос ту па. Все пре крас но. Ну что мо жет не по нра-

вить ся в этом клас си че ском шаб ло не про ек ти ро ва ния?

Ес ли по ду мать, то весь ма мно гое. Как ни со блаз ни тель но при ме не ние синг л то нов,

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

тес ти ро ва ние и ус лож ня ют со про во ж де ние. К со жа ле нию, это по ни ма ние не

столь рас про стра не но, как хо те лось бы, и синг л то ны со хра ня ют свое обая ние для

мно же ст ва про грам ми стов. Хо тя есть ос но ва ния за ду мать ся, так ли они хо ро ши:

Ог ра ни че ние на чис ло эк зем п ля ров клас са час то ил лю зор но. Во мно гих слу-

ча ях ут вер жде ние, что в бу ду щем не по на до бят ся до пол ни тель ные эк зем п ля-

ры, ни чем не под кре п ле но. До мыс лы в ос но ве ар хи тек ту ры при ло же ния обя-

за тель но при ве дут к не при ят но стям в бу ду щем. Тех ни че ские тре бо ва ния ме-

ня ют ся. Хо ро шая ар хи тек ту ра это учи ты ва ет. Синг л то ны – нет.

Синг л то ны соз да ют не яв ные за ви си мо сти меж ду кон цеп ту аль но не за ви си-

мы ми мо ду ля ми ко да. Бе да в том, что, во-пер вых, эти за ви си мо сти не за мет-

ны, а во-вто рых, соз да ют не нуж ные свя зи меж ду мо ду ля ми. Этот за па шок

в ко де ста но вит ся ост рее, ко гда вы пы тае тесь пи сать мо дуль ные тес ты, ос но-

ван ные на сла бом свя зы ва нии и воз мож но сти вы бо роч но при ме нять реа ли за-

ции-ма ке ты вме сто на стоя щих. Синг л то ны не да ют осу ще ст в лять та кое про-

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

Синг л то ны не яв но хра нят со стоя ние, что опять-та ки пре пят ст ву ет мо-

дуль но му тес ти ро ва нию. Мо дуль ное тес ти ро ва ние пред по ла га ет, что тес ты

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

ряд ке, а про грам му мож но воз вра щать в из вест ное со стоя ние пе ред вы пол-

не ни ем ка ж до го мо дуль но го тес та. Как толь ко по яв ля ют ся синг л то ны с из-

ме няе мым (mutable) со стоя ни ем, обес пе чить та кие ус ло вия мо жет ока зать ся

Не поддавайтесь очарованию шаблона Singleton

167

за труд ни тель но. Кро ме то го, та кое гло баль но дос туп ное дол го жи ву щее со-

стоя ние за труд ня ет ин тер пре та цию ко да че ло ве ком, осо бен но в мно го по точ-

ной сре де.

Мно го по точ ность соз да ет до пол ни тель ные кап ка ны в ис поль зо ва нии шаб-

ло на синг л то на. По сколь ку про стая бло ки ров ка дос ту па не очень эф фек тив-

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

кой (DCLP). К не сча стью, ино гда это про сто дру гая раз но вид ность ро ко во го

вле че ния. Ока за лось, что во мно гих язы ках DCLP не яв ля ет ся по то ко во-без-

опас ной, и да же в тех, где она яв ля ет ся по то ко во-без опас ной, со хра ня ют ся

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

Из бав ле ние от синг л то нов мо жет стать в окон ча тель ном ито ге слож ной за да чей:

Яв ное унич то же ние объ ек тов синг л то нов не под дер жи ва ет ся. В от дель ных

кон тек стах это мо жет ока зать ся про бле мой, на при мер в ар хи тек ту ре с под-

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

все его объ ек ты уда ле ны из па мя ти.

При за вер ше нии про грам мы по ря док не яв ной за чи ст ки синг л то нов не оп ре-

де лен. Это мо жет вы звать про бле мы в при ло же ни ях, со дер жа щих синг л то ны

с вза им ны ми за ви си мо стя ми. При за вер ше нии та ких при ло же ний од ни синг л-

то ны мо гут про дол жать об ра щать ся к дру гим, ко то рые к то му мо мен ту уже

унич то же ны.

Не ко то рые из пе ре чис лен ных не дос тат ков мож но пре одо леть с по мо щью спе ци-

аль ных ме ха низ мов. Од на ко за это при хо дит ся рас пла чи вать ся ус лож не ни ем

ко да, че го уда лось бы из бе жать, ес ли бы в про ек те ис поль зо ва лись иные под хо-

ды к ар хи тек ту ре.

По это му ог ра ничь те ис поль зо ва ние шаб ло на Singleton те ми клас са ми, для ко то-

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

сто ит поль зо вать ся гло баль ной точ кой вхо да в сингл тон в про из воль ных уча ст-

ках ко да. Пря мое об ра ще ние к синг л то ну долж но про ис хо дить лишь в не сколь-

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

уз кий ин тер фейс. Весь ос таль ной код не зна ет, как реа ли зо ван ин тер фейс – че-

рез сингл тон или ка кой-то дру гой класс, – а по то му не за ви сит от реа ли за ции.

В ре зуль та те все го это го раз ру ша ют ся свя зи, ме шаю щие мо дуль но му тес ти ро ва-

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

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

сто ит ли это де лать.

97 этюдов для программистов

Путь к повышению

эффективности программ

заминирован грязным кодом

Кирк Пеппердин

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

ход но го ко да. Ко гда не об хо ди мо из ме нить код, ка ж дый его фраг мент, слиш ком

слож ный или силь но свя зан ный с дру ги ми, ока зы ва ет ся «бом бой гряз но го ко-

да», спо соб ной све сти на нет все ва ши уси лия. Пер вой жерт вой гряз но го ко да

ста но вит ся гра фик ра бот. Ес ли дви же ние впе ред про ис хо дит рав но мер но, лег ко

пред ска зать, ко гда за кон чит ся ра бо та. Но не ожи дан ные столк но ве ния с гряз-

ным ко дом де ла ют весь ма за труд ни тель ным ра зум ное пла ни ро ва ние.

До пус тим, вы об на ру жи ли ме сто, где те ря ет ся про из во ди тель ность. В этом слу-

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

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

жем, три-че ты ре ча са. Ра бо тая над ис прав ле ния ми, вы об на ру жи вае те, что пе ре-

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

за ны друг с дру гом, что вы зва но объ ек тив ной не об хо ди мо стью, и та кое на ру ше-

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

что ес ли ис прав ле ние этой за ви си мо сти при ве дет к на ру ше нию ра бо ты и дру гих

за ви си мых час тей? Бо лее то го, чем даль ше эти за ви си мо сти на хо дят ся от ис ход-

ной точ ки, тем ме нее ве ро ят но, что вы их об на ру жи те и уч те те в сво ей оцен ке.

Вне зап но на чаль ная оцен ка раз ду ва ет ся от трех-че ты рех ча сов до трех-че ты рех

не дель. Час то од на по доб ная не ожи дан ность уве ли чи ва ет сро ки сра зу на 1–2 дня.

Не столь уж ред ко «не боль шой» ре фак то ринг за тя ги ва ет ся на не сколь ко ме ся-

цев. В та ких си туа ци ях ущерб, на не сен ный до ве рию к дей ст вую щей ко ман де

и ее «по ли ти че ско му ка пи та лу», мо жет быть тя же лым и да же смер тель ным. Вот

ес ли бы у нас был ин ст ру мент, по зво ляю щий об на ру жить и оце нить та кой риск…

На са мом де ле, су ще ст ву ет мно го спо со бов из ме рить и про кон тро ли ро вать сте-

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

мет рик мож но по счи тать встре чае мость в ко де оп ре де лен ных ха рак те ри стик.

Эти ко ли че ст вен ные по ка за те ли кор ре ли ру ют с ка че ст вом ко да. От ме тим две

мет ри ки из тех, ко то рые оце ни ва ют свя зан ность ко да: чис ло вхо дов ( fan-in) и чис-

ло вы хо дов ( fan-out). На при мер, для клас сов fan-out оп ре де ля ет ся как ко ли че ст-

Путь к повышению эффективности программ заминирован грязным кодом

169

во клас сов, к ко то рым пря мо или кос вен но об ра ща ет ся оце ни вае мый класс. Это

мож но пред ста вить се бе как ко ли че ст во всех клас сов, ко то рые нуж но ском пи ли-

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

fan-in – это ко ли че ст во клас сов, ко то рые за ви сят от дан но го клас са. Зная fan-out

и fan-in, мож но по фор му ле I = fo /(fi + fo) рас счи тать ко эф фи ци ент не ста биль но-

сти. Чем бли же I к ну лю для кон крет но го клас са или мо ду ля, тем он ста биль нее.

Ко гда зна че ние I близ ко к 1, мо дуль ста но вит ся не ста биль ным. Из ме не ние ко да

ста биль ных мо ду лей со пря же но с мень шим рис ком, то гда как в не ста биль ных

мо ду лях бо лее ве ро ят но на ли чие бомб гряз но го ко да. За да ча ре фак то рин га –

при бли зить I к ну лю.

При ис поль зо ва нии мет рик нуж но пом нить, что это все го лишь эм пи ри че ские

пра ви ла. Ис хо дя из чис той ма те ма ти ки мы уви дим, что уве ли чи вая fi, не из ме-

няя при этом fo, мы при бли жа ем I к ну лю. Од на ко слиш ком боль шая ве ли чи на

fan-in име ет и об рат ную сто ро ну: та кие клас сы труд нее из ме нить, не на ру шая

ра бо ту клас сов, за ви си мых от них. Кро ме то го, не ре шая про бле мы fan-out, вы

на са мом де ле не сни жае те свои рис ки, по это му нуж но со блю дать не ко то рое рав-

но ве сие.

Не дос тат ком про грамм ных мет рик яв ля ет ся то, что ог ром ное ко ли че ст во цифр,

вы да вае мых ин ст ру мен та ми для сня тия мет рик, мо жет про из ве сти уст ра шаю-

щее впе чат ле ние на не по свя щен ных. Тем не ме нее про грамм ные мет ри ки спо-

соб ны стать мощ ным сред ст вом в борь бе за чис тый код. Они по мо га ют об на ру-

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

опе ра ций по по вы ше нию про из во ди тель но сти.

97 этюдов для программистов

Простота достигается

сокращением

Пол У. Гомер

«Де­лай­за­но­во…», – ска зал мне на чаль ник, твер до удер жи вая паль цем кла ви шу

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

код – стро ка за стро кой.

Мой на чаль ник Сте фан не от ли чал ся осо бой крас но ре чи во стью, но оп ре де лял

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

Я по сту пил на ту ра бо ту в ка че ст ве че ло ве ка, изу чаю ще го про грам ми ро ва ние, –

с за па са ми энер гии и эн ту зи аз ма, но без ма лей ше го по ня тия, как пи сать код.

Я пре бы вал в ужас ном за блу ж де нии, буд то лю бые про бле мы ре ша ют ся пу тем

до бав ле ния еще од ной пе ре мен ной в по до баю щем мес те ли бо пу тем до бав ле ния

еще од ной стро ки ко да. В пло хие дни мой код де гра ди ро вал – его ло ги ка не со вер-

шен ст во ва лась, бо лее то го, он ста но вил ся все про стран нее, слож нее и не ус той -

чи вее.

Же ла ние ре шить во прос по сред ст вом ми ни маль ных из ме не ний в бло ке ко да –

да же ес ли они ужас ны – впол не ес те ст вен но, осо бен но при не дос тат ке вре ме ни.

Боль шин ст во про грам ми стов со хра ня ет пло хой код, опа са ясь, что, ес ли на чать

все за но во, по тре бу ет ся го раз до боль ше уси лий, чем ес ли про сто вер нуть ся к на-

ча лу. Это бы ва ет вер но для поч ти ра бо че го ко да, но встреча ет ся и та кой код, ко-

то ро му уже ни что не по мо жет.

Слиш ком мно го вре ме ни впус тую тра тит ся на по пыт ки спа сти плохую ра бо ту.

Ес ли что-то на чи на ет вы са сы вать ре сур сы, от это го сле ду ет из ба вить ся. И по-

бы ст рее.

Не хо чу ска зать, что так уж лег ко рас стать ся с на бран ным тек стом, вы бран ны ми

име на ми, фор ма ти ро ва ни ем. Ре ак ция мое го на чаль ни ка бы ла из лиш не же ст кой,

од на ко она за став ля ла ме ня пе ре ос мыс ли вать свой код во вре мя вто рой (а ино гда

и треть ей) по пыт ки. Тем не ме нее луч ший спо соб ис пра вить пло хой код – при го-

то вить ся без жа ло ст но его пе ре ра ба ты вать, пе ре но сить ту да-сю да или уда лять.

Код дол жен быть про стым. Ко ли че ст во пе ре мен ных, функ ций, объ яв ле ний

и про чих син так си че ских эле мен тов язы ка долж но быть ми ни маль ным. Лиш ние

Простота достигается сокращением

171

стро ки, лиш ние пе ре мен ные… все лиш нее долж но не мед лен но унич то жать ся.

А то го, что ос та лось, долж но быть ми ни маль но дос та точ но, что бы вы пол нить за-

да ние, реа ли зо вать ал го ритм или осу ще ст вить вы чис ле ния. Все про чее – бес по-

лез ный, не нуж ный шум, по явив ший ся по ошиб ке. Он за пу ты ва ет ал го ритм ра-

бо ты и скры ва ет дей ст ви тель но важ ные ве щи в ко де.

Ко неч но, ес ли это го ока жет ся не дос та точ но, уда ли те во об ще все и нач ни те сна-

ча ла. Та кое «ри со ва ние по па мя ти» час то по зво ля ет из ба вить ся от не нуж но го

хла ма.

97 этюдов для программистов

Принцип единственной

ответственности

Роберт Мартин (Дядюшка Боб)

Вот­один­из­наи­бо­лее­фун­да­мен­таль­ных­прин­ци­пов­ка­че­ст­вен­но­го­про­ек­ти­ро-

ва­ния:

Со брать вме сте те ве щи, ко то рые из ме ня ют ся по од ной и той же при чи не, и раз-

де лить те, ко то рые из ме ня ют ся по раз ным при чи нам.

Этот прин цип ина че из вес тен как прин цип един ст вен ной от вет ст вен но сти,

или SRP (single responsibility principle). Ес ли ко рот ко, он гла сит, что при чи на

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

Клас си че ский при мер – класс с ме то да ми для ра бо ты с биз нес-пра ви ла ми, от че-

та ми и ба за ми дан ных:

public class Employee {

public Money calculatePay() ...

public String reportHours() ...

public void save() ...

}

Кое-кто из про грам ми стов счи та ет, что со че та ние этих трех функ ций в од ном

клас се впол не уме ст но. В кон це кон цов, клас сы и долж ны со би рать вме сте функ-

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

все три функ ции из ме ня ют ся по со вер шен но раз ным при чи нам. Функ ция calcu-

latePay (рас счи тать зар пла ту) из ме ня ет ся вме сте с биз нес-пра ви ла ми рас че та за-

пла ты. Функ ция reportHours (от чи тать ся о ча сах) из ме ня ет ся, ко гда тре бу ет ся

дру гой фор мат от че та. Функ ция save (со хра нить) из ме ня ет ся, ко гда ад ми ни ст ра-

тор ба зы дан ных ме ня ет схе му ба зы дан ных. В со во куп но сти эти три при чи ны

де ла ют Employee очень не ус той чи вым клас сом. Он бу дет ме нять ся по ка ж дой из

этих при чин. И что еще важ нее, эти из ме не ния за тро нут лю бые клас сы, ко то рые

за ви сят от Employee.

В хо ро шей ар хитек ту ре сис те ма раз де ле на на ком по нен ты, ко то рые мож но раз-

вер нуть не за ви си мо. Не за ви си мость раз вер ты ва ния оз на ча ет, что из ме не ние од-

но го ком по нен та не тре бу ет по втор но го раз вер ты ва ния дру гих. Но ес ли Employee

Принцип единственной ответственности

173

ин тен сив но ис поль зу ет ся мно ги ми клас са ми в дру гих ком по нен тах, ка ж дое из-

ме не ние Employee мо жет тре бо вать по втор но го раз вер ты ва ния дру гих ком по нен-

тов, что сво дит на нет ос нов ное пре иму ще ст во ком по нент но го под хо да к про ек-

ти ро ва нию (или SOA, ес ли вам нра вит ся это бо лее мод ное на зва ние). Сле дую щее

про стое раз де ле ние ре ша ет про бле му:

public class Employee {

public Money calculatePay() ...

}

public class EmployeeReporter {

public String reportHours(Employee e) ...

}

public class EmployeeRepository {

public void save(Employee e) ...

}

Ка ж дый класс мож но по мес тить в от дель ный ком по нент. Или, вы ра жа ясь точ-

нее, все клас сы, соз даю щие от че ты, по мес тить в ком по нент от че тов. Все клас сы,

свя зан ные с ба за ми дан ных, мож но по мес тить в ком по нент хра ни ли ща. А все

биз нес-пра ви ла по мес тить в ком по нент биз нес-пра вил.

Вни ма тель ный чи та тель за ме тит, что в при ве ден ном ре ше нии ос та ют ся за ви си-

мо сти. Дру гие клас сы по-преж не му за ви сят от Employee. По это му ес ли Employee

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

и раз вер нуть. Та ким об ра зом, Employee не воз мож но мо ди фи ци ро вать, а по том

раз вер нуть не за ви си мо. Од на ко дру гие клас сы мож но мо ди фи ци ро вать и не за-

ви си мо раз вер нуть. Ни ка кая их мо ди фи ка ция не тре бу ет пе ре ком пи ля ции и по-

втор но го раз вер ты ва ния ос таль ных клас сов. Да же Employee мож но не за ви си мо

раз вер нуть, ес ли тща тель но при ме нить прин цип ин вер сии за ви си мо сти (DIP,

de pen dency inversion principle), но это уже те ма для дру гой кни ги.1

Про ду ман ное при ме не ние прин ци па един ст вен ной от вет ст вен но сти, то есть раз-

де ле ние тех сущ но стей, ко то рые из ме ня ют ся по раз ным при чи нам, яв ля ет ся од-

ной из ос нов соз да ния ар хи тек тур со струк ту рой не за ви си мо раз вер ты вае мых

ком по нен тов.

1

http://www.amazon.com/dp/0135974445/

97 этюдов для программистов

Сначала скажите «да»

Алекс Миллер

Не­дав­но­я­был­в­про­дук­то­вом­ма­га­зи­не­и обы скал ся там эда ма ме, зе ле ных со-

евых бо бов (я лишь при бли зи тель но до га ды вал ся, что это ка кие-то ово щи). Я не

знал, где мне ис кать этот про дукт: в овощ ном от де ле, в от де ле за мо ро жен ных

про дук тов или на пол ках с кон сер ва ми? На ко нец я сдал ся и об ра тил ся за по мо-

щью к со труд ни це ма га зи на. Она то же не зна ла!

Со труд ни ца ма га зи на мог ла от реа ги ро вать на мою прось бу по-раз но му. Она мог-

ла дать мне по нять, что толь ко ду рак не зна ет, где это ис кать, или от де лать ся

ту ман ны ми на ме ка ми, или да же про сто ска зать, что у них нет та ко го то ва ра. Но

она по счи та ла воз мож ным най ти ре ше ние и по мочь по ку па те лю. По звав дру гих

со труд ни ков, она уже че рез па ру ми нут от ве ла ме ня к нуж но му то ва ру. Эда ма ме

ока за лись в от де ле за мо ро жен ных про дук тов.

В дан ной си туа ции со труд ни ца вы слу ша ла прось бу и ста ла ис хо дить из то го, что

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

ла да вме сто нет.

Ко гда мне впер вые при шлось за нять долж ность тех ни че ско го ру ко во ди те ля, мне

ка за лось, что глав ное в мо ей ра бо те – за щи щать мои пре крас ные про грам мы от

по то ка не ле пых тре бо ва ний, ис хо див ше го от ме нед же ров по про дук ту и биз нес-

ана ли ти ков. В боль шин ст ве раз го во ров я рас смат ри вал лю бую прось бу как ата-

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

В ка кой-то мо мент на ме ня сни зош ло про зре ние, и я уви дел, что воз мо жен дру-

гой под ход к ра бо те, ко то рый от ли ча ет ся от мое го все го лишь на чаль ным да вме-

сто на чаль но го нет. Я при шел к убе ж де нию, что на чи нать раз го вор с по ло жи-

тель но го от ве та – важ ней шая часть ра бо ты тех ни че ско го ру ко во ди те ля.

Эта про стая пе ре ме на ра ди каль но из ме ни ла мой под ход к ра бо те. Ока за лось, су-

ще ст ву ет мно го спо со бов го во рить. Ко гда слы шишь: «По слу шай, это при ло же-

ние ста нет в сто раз кру че, ес ли мы сде ла ем все ок на круг лы ми и про зрач ны ми!»,

мож но от верг нуть это пред ло же ние как не ле пое. Но обыч но луч ше сна ча ла спро-

сить: «А по че му?». Час то су ще ст ву ет ре аль ный и убе ди тель ный до вод, по че му

Сначала скажите «да»

175

этот че ло век тре бу ет круг лые про зрач ные ок на. На при мер, ве дут ся пе ре го во ры

с но вым круп ным кли ен том, у ко то ро го ко мис сия по стан дар ти за ции тре бу ет

эти са мые круг лые про зрач ные ок на.

Обыч но, оз на ко мив шись с кон тек стом прось бы, об на ру жи ва ешь, что от кры ва-

ют ся но вые воз мож но сти. За час тую прось ба мо жет быть вы пол не на в рам ках су-

ще ст вую ще го про дук та ка ким-то дру гим спо со бом, что по зво ля ет от ве тить да,

нис коль ко не на пря га ясь: «Соб ст вен но го во ря, вы мо же те за гру зить в поль зо ва-

тель ских на строй ках «шкур ку» (skin) с круг лы ми про зрач ны ми ок на ми и ак ти-

ви зи ро вать ее».

Ино гда у лю дей по яв ля ют ся идеи, ко то рые ка жут ся не со вмес ти мы ми с ва шим

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

с во про сом «по че му» к са мо му се бе. По рой са ма по пыт ка объ яс нить се бе при чи-

ну по мо га ет по нять оши боч ность пер вой ре ак ции. Ес ли это не так, то мож но об-

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

что цель все го это го – ска зать да дру го му че ло ве ку и по пы тать ся сде лать так,

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

Ес ли вы смо же те убе ди тель но объ яс нить, по че му пред ло жен ная функ ция не со-

вмес ти ма с су ще ст вую щим про дук том, это даст воз мож ность кон ст рук тив но об-

су дить, нуж ный ли про дукт вы соз дае те. Не за ви си мо от ре зуль та тов об су ж де-

ния ка ж дый уча ст ник бо лее чет ко осоз на ет, чем про дукт яв ля ет ся, а чем не яв-

ля ет ся.

На чи нать с да – зна чит ра бо тать вме сте со свои ми кол ле га ми, а не про тив них.

97 этюдов для программистов

Шаг назад. Теперь автоматизируй,

автоматизируй, автоматизируй…

Кэй Хорстман

Я­ра­бо­тал­с­про­грам­ми­ста­ми, ко то рые в от вет на прось бу по счи тать ко ли че ст во

строк ко да в мо ду ле от кры ва ли фай лы в тек сто вом про цес со ре и поль зо ва лись

функ ци ей «счет чик строк». То же са мое они по вто ря ли че рез не де лю. И еще че-

рез не де лю. Это бы ло ужас но.

Я уча ст во вал в про ек те с не ук лю жей про це ду рой раз вер ты ва ния: тре бо ва лось

под пи сать код, ско пи ро вать под пи сан ный код на сер вер, вы пол нить мно же ст во

щелч ков мы шью. Кто-то ав то ма ти зи ро вал про це ду ру, и этот сце на рий за пус кал-

ся сот ни раз во вре мя фи наль но го тес ти ро ва ния – го раз до ча ще, чем ожи да лось.

Это бы ло за ме ча тель но.

Так по че му же лю ди де ла ют од ну и ту же ра бо ту мно го крат но, вме сто то го что бы

ос та но вить ся и по тра тить вре мя на ее ав то ма ти за цию?

Рас про стра нен ное за блу ж де ние №1: ав то ма ти за ция нуж на толь ко для тес-

ти ро ва ния

Да, ав то ма ти за ция тес ти ро ва ния – это класс но, но за чем ос та нав ли вать ся на

этом? Лю бой про ект изо би лу ет по вто ряю щи ми ся за да ча ми: управ ле ние вер-

сия ми, ком пи ля ция, сбор ка JAR-фай лов, ге не ра ция до ку мен та ции, раз вер-

ты ва ние сис те мы и со став ле ние от че тов. Для мно гих из пе ре чис лен ных за дач

эф фек тив нее ис поль зо вать сце на рий, а не ука за тель мы ши. Вы пол не ние ру-

тин ных за дач ус ко ря ет ся и ста но вит ся на деж ным.

Рас про стра нен ное за блу ж де ние №2: у ме ня есть IDE, по это му мне не нуж на

ав то ма ти за ция

При хо ди лось ли вам уча ст во вать в спо рах с кол ле га ми на те му «А на мо ей ма-

ши не все ком пи ли ру ет ся (все за гру жа ет ся из ре по зи то рия, все тес ты про хо-

дят)»? Со вре мен ные IDE пред ла га ют ты ся чи на стро ек, и фак ти че ски не воз-

мож но га ран ти ро вать, что у всех уча ст ни ков ко ман ды на строй ки бу дут оди на-

ко вы ми. Сис те мы ав то ма ти за ции сбор ки, та кие как Ant или Autotools, обес-

пе чи ва ют кон троль и по вто ряе мость.

Шаг назад. Теперь автоматизируй, автоматизируй, автоматизируй…

177

Рас про стра нен ное за блу ж де ние №3: для ав то ма ти за ции при дет ся изу чать

экзо ти че ские ин ст ру мен ты

Мож но ус пеш но по стро ить сис те му ав то ма ти за ции на ба зе хо ро ше го язы ка

ко манд ной обо лоч ки (на при мер, bash или PowerShell). Ес ли тре бу ет ся взаи мо-

дей ст во вать с веб-сай та ми, вос поль зуй тесь та ки ми ин ст ру мен та ми, как iMac-

ros или Selenium.

Рас про стра нен ное за блу ж де ние №4: я не мо гу ав то ма ти зи ро вать эту за да чу,

по то му что не смо гу ра бо тать с фай ла ми это го фор ма та

Ес ли ваш про цесс тре бу ет ра бо ты с до ку мен та ми Word, элек трон ны ми таб ли-

ца ми или гра фи кой, ав то ма ти за ция дей ст ви тель но мо жет стать слож ной про-

бле мой. Но так ли вам не об хо ди мы эти фор ма ты? А нель зя ли ис поль зо вать

обыч ный текст? Зна че ния, раз де ляе мые за пя той? XML? Сред ст ва ге не ра ции

гра фи ки из тек сто вых фай лов? Час то дос та точ но не мно го из ме нить про цесс,

что бы по лу чить хо ро шие ре зуль та ты и рез ко со кра тить ру тин ные опе ра ции.

Рас про стра нен ное за блу ж де ние №5: у ме ня нет вре ме ни со всем этим раз би-

рать ся

Что бы на чать, вам не обя за тель но дос ко наль но изу чать bash или Ant. Учи-

тесь на хо ду. Ко гда вы ви ди те за да чу, ко то рую мож но и нуж но ав то ма ти зи ро-

вать, изу чи те свои ин ст ру мен ты лишь на столь ко, на сколь ко тре бу ет ся в дан-

ный мо мент. И за ни май тесь этим в са мом на ча ле про ек та, ко гда обыч но лег че

най ти вре мя. По сле пер во го удач но го опы та вы (и ваш на чаль ник) убе ди тесь,

что ав то ма ти за ция оку па ет по тра чен ные уси лия.

97 этюдов для программистов

Пользуйтесь инструментами

для анализа кода

Сара Маунт

Важ­ность­ тес­ти­ро­ва­ния­ вко ла чи ва ют в го ло вы раз ра бот чи ков про грамм но го

обес пе че ния, ко гда они де ла ют свои пер вые ша ги на этом по при ще. Ши ро ко рас-

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

но ве тес ти ро ва ния и ме то ды гиб ко го про грам ми ро ва ния сви де тель ст ву ют о рос-

те ин те ре са к мак си маль но эф фек тив но му ис поль зо ва нию тес ти ро ва ния на всех

ста ди ях цик ла раз ра бот ки. Од на ко тес ти ро ва ние – лишь один из мно го чис лен-

ных ин ст ру мен тов, с по мо щью ко то рых мож но по вы сить ка че ст во ко да.

В те да ле кие вре ме на, ко гда язык C еще был мо лод, про цес сор ное вре мя и па мять

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

по это му ко ли че ст во про хо дов по ко ду со кра ща лось за счет от ка за от не ко то рых

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

шую часть тех оши бок, ко то рые мож но бы ло об на ру жить на эта пе ком пи ля ции.

Что бы ком пен си ро вать этот не дос та ток, Сти вен Джон сон на пи сал ин ст ру мент

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

в нем не ко то рые ме то ды ста ти че ско го ана ли за, ис клю чен ные из ком пи ля то ра C.

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

ко ли че ст во лож ных сра ба ты ва ний и час то пре ду пре ж да ли о на ру ше нии сти ли-

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

Се го дняш ний пей заж язы ков, ком пи ля то ров и средств ста ти че ско го ана ли за

весь ма от ли ча ет ся от преж не го. Па мять и про цес сор ное вре мя ста ли от но си тель-

но де ше вы ми, по это му ком пи ля то ры мо гут по зво лить се бе про вер ку боль ше го

чис ла оши бок. Поч ти для ка ж до го язы ка су ще ст ву ет хо тя бы один ин ст ру мент,

вы яв ляю щий на ру ше ния сти ли сти че ских пра вил, стан дарт ные ошиб ки и ино гда

труд ные для об на ру же ния ошиб ки ти па воз мож но го ра зы ме но ва ния ну ле во го

ука за те ля. Бо лее слож ные ин ст ру мен ты, та кие как Splint для C или Pylint для

Python, до пус ка ют на строй ку, то есть воз мож ность вы брать ошиб ки и пре ду пре-

ж де ния, о ко то рых бу дет со об щать ин ст ру мент, с по мо щью фай ла кон фи гу ра ции,

па ра мет ров ко манд ной стро ки или на стро ек IDE. Splint да же по зво ля ет ан но ти-

ро вать код ком мен та рия ми, по яс няю щи ми ра бо ту про грам мы.

Пользуйтесь инструментами для анализа кода

179

Ес ли эти сред ст ва не по мо га ют, и вам при хо дит ся ис кать про стые ошиб ки или

на ру ше ния стан дар тов, ко то рые не об на ру жи ва ют ваш ком пи ля тор, IDE или ин-

ст ру мент ти па lint, мож но на пи сать соб ст вен ный ста ти че ский ана ли за тор. Это

не так труд но, как мо жет по ка зать ся. Боль шин ст во язы ков, осо бен но ди на ми че-

ских, в со ста ве стан дарт ной биб лио те ки пред ла га ют аб ст ракт ное син так си че-

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

ние угол ки стан дарт ных биб лио тек, ис поль зуе мых раз ра бот чи ка ми язы ка, с ко-

то рым вы ра бо тае те, так как там встре ча ют ся со кро ви ща, по лез ные для ста ти че-

ско го ана ли за и ди на ми че ско го тес ти ро ва ния. Так, в стан дарт ной биб лио те ке

Python есть ди зас семб лер, ко то рый со об щит вам, ка кой байт-код ис поль зо вал ся

для ге не ра ции не ко то ро го ском пи ли ро ван но го ко да или объ ек та. Мно гим по ка-

жет ся, буд то это ка кой-то за га доч ный ин ст ру мент для ко ман ды раз ра бот чи ков

python-dev, раз ра ба ты ваю щей ком пи ля тор Python, но для по все днев ной ра бо ты

он уди ви тель но по ле зен. На при мер, с по мо щью этой биб лио те ки мож но ди зас-

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

байт-ко да сге не ри ро ва ла по след нее не об ра бо тан ное ис клю че ние.

Так что не ог ра ни чи вай те свой кон троль ка че ст ва од ним тес ти ро ва ни ем – ис-

поль зуй те ин ст ру мен ты для ана ли за и не бой тесь соз да вать свои соб ст вен ные.

97 этюдов для программистов

Тестируйте требуемое,

а не случайное поведение

Кевлин Хенни

Ти­пич­ное­за­блу­ж­де­ние­при­тес­ти­ро­ва­нии­– во об ра жать, что тес ти ро вать не об-

хо ди мо имен но то, что де ла ет реа ли за ция. На пер вый взгляд в этом не вид но ни-

че го дур но го. Од на ко ес ли сфор му ли ро вать эту про бле му ина че, она ста но вит ся

по нят нее: час той ошиб кой при тес ти ро ва нии яв ля ет ся при вяз ка тес тов к осо бен-

но стям реа ли за ции, то гда как эти осо бен но сти яв ля ют ся слу чай ны ми и не име-

ют от но ше ния к тре буе мой функ цио наль но сти.

Ко гда тес ты же ст ко свя за ны с осо бен но стя ми реа ли за ции, из ме не ния в реа ли за-

ции, ко то рые в дей ст ви тель но сти со вмес ти мы с тре буе мым по ве де ни ем, мо гут

при вес ти к от ка зу тес тов. Из-за это го бу дут воз ни кать лож ные со об ще ния об

ошиб ках. Обыч но про грам ми сты реа ги ру ют на это ис прав ле ни ем тес та или ис-

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

ст вие стра ха, не уве рен но сти и со мне ний. Это рав но силь но при ня тию слу чай но-

го по ве де ния за тре буе мое. При ис прав ле нии тес та про грам мист ли бо из ме ня ет

тест так, что бы он про ве рял тре буе мое по ве де ние (что хо ро шо), ли бо при вя зы ва-

ет тест к но вой реа ли за ции (что пло хо). Тес ты долж ны быть дос та точ но точ ны-

ми, но они долж ны быть и пра виль ны ми.

На при мер, тре бо ва ния к трой ст вен но му срав не нию, та ко му как String.compareTo

в Java или strcmp в C, та ко вы: ре зуль тат дол жен быть от ри ца тель ным, ес ли ле вая

часть мень ше пра вой, по ло жи тель ным, ес ли ле вая часть боль ше пра вой, и ну-

лем, ес ли они рав ны. Та ко го ро да срав не ние ис поль зу ет ся во мно гих API, вклю-

чая функ цию срав не ния для qsort в C и compareTo в ин тер фей се Java Comparable.

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

крет ные зна че ния –1 и +1, в свя зи с чем про грам ми сты ино гда оши боч но пред по-

ла га ют, что имен но эти зна че ния и вы ра жа ют дей ст ви тель ное тре бо ва ние, и пи-

шут тес ты, ос но ван ные на этом пред по ло же нии.

По хо жая про бле ма воз ни ка ет, ко гда тес ты же ст ко при вя за ны к ко ли че ст ву про-

бе лов, на ли чию оп ре де лен ных слов и дру гим ас пек там фор ма ти ро ва ния и пред-

став ле ния тек ста, ко то рые яв ля ют ся осо бен но стью реа ли за ции. На ли чие про бе-

лов не долж но вли ять на ре зуль тат, ес ли толь ко вы не пи ше те, ска жем, XML-ге-

Тестируйте требуемое, а не случайное поведение

181

не ра тор с на строй кой фор ма ти ро ва ния. Ана ло гич ным об ра зом же ст ко фиксиро-

ванное расположение кнопок и меток на элементах управления поль зо ватель -

ского интерфейса умень ша ет воз мож ность в бу ду щем ме нять эти не су ще ст вен -

ные де та ли. Мел кие из ме не ния в реа ли за ции и не су ще ст вен ные из ме не ния

в фор ма ти ро ва нии вне зап но при во дят к то му, что про ект не со би ра ет ся.

Слиш ком кон крет ные тес ты час то соз да ют про бле му при мо дуль ном тес ти ро ва-

нии по прин ци пу бе ло го ящи ка. Тес ты бе ло го ящи ка ис поль зу ют струк ту ру ко-

да, что бы оп ре де лить, ка кие тес ты нуж ны. Ти пич ная ошиб ка при та ком тес ти-

ро ва нии – соз да ние тес тов, ко то рые в ко неч ном ито ге про ве ря ют, что код де ла ет

то, что он де ла ет. Про стое под твер жде ние то го, что и так оче вид но из ко да, не

име ет ни ка кой цен но сти и при во дит к воз ник но ве нию лож но го чув ст ва про грес-

са и на деж но сти.

Что бы быть эф фек тив ны ми, тес ты долж ны про ве рять обя за тель ст ва по кон трак-

ту, а не бес смыс лен но по вто рять реа ли за цию. Они долж ны рас смат ри вать тес ти-

руе мые мо ду ли как чер ные ящи ки, опи сы вая кон трак ты ин тер фей са в ис пол-

няе мой фор ме. По это му сле ди те, что бы про ве ряе мое по ве де ние сов па да ло с тре-

буе мым по ве де ни ем.

97 этюдов для программистов

Тестируйте точно и конкретно

Кевлин Хенни

При­тес­ти­ро­ва­нии­мо­ду­ля­ко­да­важ­но­про­ве­рять его тре буе мое и су ще ст вен ное

по ве де ние, а не слу чай ное по ве де ние кон крет ной реа ли за ции. Но из это го не сле-

ду ет, что тес ты мо гут быть не оп ре де лен ны ми. Тес ты долж ны быть точ ны ми

и кон крет ны ми.

В ка че ст ве ил лю ст ра ции мож но взять тес ти ро ва ние про ве рен ных и на деж ных

клас си че ских про це дур сор ти ров ки. Про грам ми сты не так час то пи шут код ал-

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

ре зуль тат. Ведь сор ти ров ка так хо ро шо всем зна ко ма. Од на ко это по верх но ст ное

зна ком ст во мо жет по ме шать об на ру жить оп ре де лен ные не вер ные до пу ще ния.

Ес ли спро сить у про грам ми ста, что он со би ра ет ся тес ти ро вать, в по дав ляю щем

боль шин ст ве слу ча ев он от ве тит что-то вро де: «Нуж но про ве рить, что ре зуль тат

бу дет от сор ти ро ван ной по сле до ва тель но стью эле мен тов». Это прав да, но не вся

прав да. Ес ли про грам ми сту пред ло жить уточ нить про ве ряе мое ус ло вие, то мно-

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

ны, что и ис ход ная. Вер но, но и это го ма ло. Возь мем, на при мер, по сле до ва тель-

ность:

3 1 4 1 5 9

По сле до ва тель ность, при ве ден ная ни же, удов ле тво ря ет по сту сло вию сор ти ров-

ки в не убы ваю щем по ряд ке и ус ло вию ра вен ст ва длин ис ход ной и ре зуль ти рую-

щей по сле до ва тель но стей:

3 3 3 3 3 3

Хо тя ре зуль тат со от вет ст ву ет спе ци фи ка ции, ед ва ли это то, что мы хо те ли по-

лу чить! При мер взят из ре аль но го про из вод ст вен но го ко да (к сча стью, ошиб ка

бы ла об на ру же на до его вы пус ка). В этом слу чае опе чат ка или се кунд ная по те ря

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

зуль тат пер вым эле мен том ис ход но го мас си ва.

Тестируйте точно и конкретно

183

Пол ное по сту сло вие со сто ит в том, что ре зуль тат от сор ти ро ван и со дер жит пе ре-

ста нов ку ис ход ных зна че ний. Оно на кла ды ва ет пра виль ные ог ра ни че ния на тре-

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

ми, оче вид но и не тре бу ет по вто ре ния.

Да же та кая фор му ли ров ка по сту сло вия не га ран ти ру ет, что это хо ро ший тест.

Хо ро ший тест дол жен лег ко чи тать ся. Он дол жен быть дос та точ но по нят ным

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

нет го то во го ко да для про вер ки то го, что по сле до ва тель ность от сор ти ро ва на и что

од на по сле до ва тель ность со дер жит пе ре ста нов ку зна че ний дру гой, не ис клю че но,

что тес ти рую щий код ока жет ся слож нее, чем тес ти руе мый. Как за ме тил То ни

Хо ар (Tony Hoare):

Есть два спо со ба кон ст руи ро вать про грамм ное обес пе че ние: мож но сде лать его

та ким про стым, что бы от сут ст вие де фек тов бы ло оче вид но, а мож но сде лать

та ким слож ным, что в нем не бу дет оче вид ных де фек тов.

Ис поль зо ва ние кон крет ных при ме ров уст ра ня ет та кую слу чай но вне сен ную

слож ность и воз мож ность слу чай но сти во об ще. Пусть, на при мер, да на по сле до-

ва тель ность:

3 1 4 1 5 9

Ре зуль тат сор ти ров ки та ков:

1 1 3 4 5 9

Ни ка кой дру гой ре зуль тат не по дой дет. Дру го го от ве та быть не мо жет.

Кон крет ные при ме ры по мо га ют про ил лю ст ри ро вать об щее по ве де ние дос туп ным

и од но знач ным спо со бом. Ре зуль та том до бав ле ния эле мен та в пус тую кол лек-

цию бу дет не толь ко то, что она ста нет не пус той: в кол лек ции дол жен по явить ся

один эле мент, при чем он бу дет ра вен до бав лен но му. Два или бо лее эле мен тов то-

же озна ча ют, что кол лек ция не пус та, но это ошиб ка. Один эле мент в кол лек-

ции, но с дру гим зна че ни ем – то же ошиб ка. Ре зуль та том до бав ле ния стро ки

в таб ли цу яв ля ет ся не про сто то, что в ней ста но вит ся на од ну стро ку боль ше;

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

И так да лее.

Опи сы вая по ве де ние, тес ты долж ны быть не толь ко пра виль ны ми – они долж ны

быть точ ны ми.

97 этюдов для программистов

Тестируйте во сне (и по выходным)

Раджит Аттапатту

Ус­по­кой­тесь. Я имею в ви ду не офф шор ные цен тры раз ра бот ки про грамм но го

обес пе че ния, не сверх уроч ную ра бо ту по вы ход ным и не ноч ные сме ны. Я про сто

хо чу об ра тить ва ше вни ма ние на то, ка кая ог ром ная вы чис ли тель ная мощь на-

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

не мно го об лег чить жизнь про грам ми ста. Вы по сто ян но стал ки вае тесь с не хват-

кой вы чис ли тель ной мощ но сти в те че ние ра бо че го дня? Ес ли так, то чем за ня ты

ва ши сер ве ры тес ти ро ва ния в не ра бо чее вре мя? Очень час то тес то вые сер ве ры

про стаи ва ют но чью и по вы ход ным. Вы мо же те ис поль зо вать этот ре зерв.

Был ли за ва ми гре шок со хра нить из ме не ния в ре по зи то рий, не про гнав все

тес ты? Од на из глав ных при чин, по ко то рой про грам ми сты не про го ня ют

на бо ры тес тов пе ред со хра не ни ем из ме не ний в ре по зи то рий, – тес ти ро ва ние

вы пол ня ет ся слиш ком дол го. Ко гда го рят сро ки и рас тет дав ле ние, про грам-

мист впол не ес те ст вен но на чи на ет сре зать уг лы. Од но из ре ше ний этой про-

бле мы – раз бить на бор тес тов хо тя бы на два про фи ля. Соз дай те мень ший

обя за тель ный про филь тес тов, ко то рый бы ст ро от ра ба ты ва ет и ко то рый мож-

но бу дет за пус кать пе ред ка ж дым со хра не ни ем. Все ос таль ные про фи ли

(и обя за тель ный на вся кий слу чай то же) мож но ав то ма ти зи ро вать и за пус-

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

У вас бы ла воз мож ность про ве рить ста биль ность ра бо ты ва ше го про дук та?

Для вы яв ле ния уте чек па мя ти и дру гих про блем со ста биль но стью кри ти че-

ски важ но про во дить тес ты, ко то рые вы пол ня ют ся ча са ми и сут ка ми. Их ред-

ко за пус ка ют в днев ное вре мя, по то му что они от ни ма ют вре мя и ре сур сы. За-

то мож но ав то ма ти че ски вы пол нять на гру зоч ное тес ти ро ва ние в ноч ное вре-

мя и по вы ход ным. С 6 ве че ра пят ни цы до 6 ут ра по не дель ни ка у вас есть

60 ча сов, ко то рые мож но за нять тес ти ро ва ни ем.

Уда ет ся ли вам по лу чить дос туп к сре де для тес ти ро ва ния про из во ди тель-

но сти в удоб ное для вас вре мя? Мне при хо ди лось ви деть, как ко ман ды ру га-

ют ся од на с дру гой, вы би вая се бе дос туп к сре де для тес ти ро ва ния про из во ди-

тель но сти. Ма ло ко му уда ет ся по лу чить в дос та точ ном ко ли че ст ве удоб ное

Тестируйте во сне (и по выходным)

185

вре мя для тес ти ро ва ния в ра бо чие ча сы, хо тя по окончании ра бо че го дня сер-

ве ры прак ти че ски про стаи ва ют. В то же вре мя сер ве ры и сеть не так силь но

за гру же ны но чью и по вы ход ным. Это иде аль ное вре мя для вы пол не ния тес-

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

Не слиш ком ли мно го у вас раз ных кон фи гу ра ций, что бы тес ти ро вать их

вруч ную? Час то про дукт рас счи тан на ра бо ту на не сколь ких плат фор мах. На-

при мер, 32-раз ряд ные и 64-раз ряд ные вер сии для Linux, Solaris и Windows

или про сто для не сколь ких вер сий од ной опе ра ци он ной сис те мы. Де ло ос лож-

ня ет ся еще и тем, что со вре мен ные при ло же ния до пус ка ют при ме не ние мно-

же ст ва транс порт ных ме ха низ мов и про то ко лов (HTTP, AMQP, SOAP, CORBA

и т. д.). Про вер ка всех воз мож ных со че та ний тре бу ет очень мно го вре ме ни

и ча ще все го вы пол ня ет ся бли же к вы пус ку про дук та в си лу ог ра ни чен но сти

ре сур сов. Увы, не ко то рые ужас ные ошиб ки об на ру жи ва ют ся лишь на этой

ста дии, ко гда уже слиш ком позд но.

За пуск ав то ма ти зи ро ван ных тес тов по но чам или на вы ход ных по зво лит ча ще

про ве рять все эти со че та ния. Сто ит чуть по рас ки нуть моз га ми и при ло жить не-

ко то рые по зна ния в на пи са нии сце на ри ев, и вы смо же те соз дать с по мо щью пла-

ни ров щи ка cron не сколь ко за да ний, ко то рые бу дут за пус кать тес ты по но чам

и на вы ход ных. Су ще ст ву ет так же мно же ст во по лез ных ин ст ру мен тов для тес-

ти ро ва ния. В не ко то рых ор га ни за ци ях соз да ны да же сер вер ные сет ки, рас пре-

де ляю щие сер ве ры меж ду раз ны ми от де ла ми и ко ман да ми с це лью бо лее эф фек-

тив но го ис поль зо ва ния ре сур сов. Ес ли в ва шей ор га ни за ции есть та кие сред ст-

ва, вы мо же те от дать тес ты на вы пол не ние в ноч ное вре мя или на вы ход ных.

97 этюдов для программистов

Тестирование – это инженерная

строгость в разработке

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

Нил Форд

Раз­ра­бот­чи­ки­про­грамм­но­го­обес­пе­че­ния­обо­жа­ют­ис поль зо вать вы му чен ные

ме та фо ры, пы та ясь рас ска зать о сво ей ра бо те род ст вен ни кам, суп ру гам и про-

чим да ле ким от тех ни ки лю дям. Час то мы ссы ла ем ся на та кие об лас ти, как

строи тель ст во мос тов, или дру гие «стро гие» ин же нер ные дис ци п ли ны. Но все

эти ме та фо ры бы ст ро раз ва ли ва ют ся на час ти, сто ит их шат нуть чуть силь нее.

Ока зы ва ет ся, что раз ра бот ка про грамм но го обес пе че ния во мно гих клю че вых

ас пек тах от ли ча ет ся от «стро гих» ин же нер ных дис ци п лин.

В срав не нии с «ре аль ной» ин же не ри ей раз ра бот ка про грамм на хо дит ся при мер-

но на том уров не, где бы ли строи те ли мос тов в да ле ком про шлом. В те дни стан-

дарт ный под ход был та кой: сна ча ла по стро ить мост, а по том пус тить по не му тя-

же лую по воз ку. Ес ли вы дер жит, зна чит, мост хо ро ший. Ес ли нет – что ж, воз-

вра ща ем ся к чер теж ной дос ке. За по след ние не сколь ко ты сяч лет ин же не ры раз-

ви ли ма те ма ти ку и фи зи ку до та кой сте пе ни, что от па ла не об хо ди мость стро ить

объ ект, что бы по нять, как он ра бо та ет, – для по ис ка на деж ных ре ше ний строи-

тель ст во уже не тре бу ет ся. Ни че го по доб но го в про грам ми ро ва нии нет и, ве ро ят-

но, не бу дет, по то му что про грамм ное обес пе че ние име ет очень су ще ст вен ные от-

ли чия. Клас си че ское ис сле до ва ние раз ни цы меж ду про грамм ной и обыч ной ин-

же не ри ей про вел Джек Ривс (Jack Reeves) в ста тье «What is Software De sign?»1,

опуб ли ко ван ной в «C++ Journal» в 1992 го ду. Ста тья, на пи сан ная поч ти два де-

ся ти ле тия на зад, и се го дня на удив ле ние вер на. Ривс в сво ем срав не нии на ри со-

вал мрач ную кар ти ну, но в 1992 го ду еще не бы ло од ной ве щи: серь ез но го и по-

все ме ст но го под хо да к тес ти ро ва нию про грамм но го обес пе че ния.

Тес ти ро вать «ре аль ные» объ ек ты тя же ло, по то му что, пре ж де чем тес ти ро вать,

их нуж но по стро ить, а это от би ва ет охо ту воз во дить рис ко ван ную по строй ку толь-

ко для то го, что бы по смот реть, что из это го по лу чит ся. Но в от рас ли про грамм-

но го обес пе че ния «строи тель ст во» об хо дит ся сме хо твор но де ше во. Мы соз да ли

це лую эко си сте му ин ст ру мен тов, с по мо щью ко то рых его лег ко осу ще ст вить:

1

http://www.developerdotstar.com/mag/articles/reeves_design.html

Тестирование – это инженерная строгость в разработке программного обеспечения 187

мо дуль ное тес ти ро ва ние, объ ек ты-ма ке ты, сред ст ва тес ти ро ва ния и мно гое дру-

гое. Дру гие ин же не ры бы ли бы бе зум но ра ды воз мож но сти что-то по стро ить

и про тес ти ро вать в ре аль ных ус ло ви ях. Мы, раз ра бот чи ки про грамм но го обес-

пе че ния, долж ны при нять тес ти ро ва ние в ка че ст ве глав но го (но не един ст вен но-

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

ро да «выс шей ма те ма ти ки» для про грам ми ро ва ния, по то му что в на шем рас по-

ря же нии уже есть ин ст ру мен ты, га ран ти рую щие хо ро шую ин же нер ную прак-

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

что «нет вре ме ни для тес ти ро ва ния». Строи тель мос та ни ко гда не ус лы шит от

сво его на чаль ни ка: «Не трать вре мя на рас чет проч но сти это го зда ния – мы не

ук ла ды ва ем ся в гра фик». Ес ли при знать, что тес ти ро ва ние – это ре аль ный спо-

соб до бить ся вос про из во ди мо сти и ка че ст ва в от рас ли ПО, это по зво лит нам, раз-

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

фес сио наль ной точ ки зре ния.

Тес ти ро ва ние точ но так же тре бу ет вре ме ни, как его тре бу ет и рас чет проч но сти

мос та. Оба про цес са слу жат га ран тии ка че ст ва ко неч но го про дук та. Раз ра бот чи-

кам про грамм но го обес пе че ния по ра взять на се бя от вет ст вен ность за то, что они

про из во дят. Од но го тес ти ро ва ния не дос та точ но, но оно не об хо ди мо. Тес ти ро ва-

ние и есть ин же нер ная стро гость в раз ра бот ке про грамм но го обес пе че ния.

97 этюдов для программистов

Думайте состояниями

Никлас Нильссон

У­тех,­кто­жи­вет­в­ре­аль­ном­ми­ре, стран ные пред став ле ния о том, что та кое со-

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

ред но му дню пе ре ра бот ки ко феи на в код. Я пред по чи таю это де лать за ча шеч кой

лат те, а по сколь ку я не на шел в про да же мо ло ка, то об ра тил ся к со труд ни це ма-

га зи на.

«У нас аб со лют но, ну со вер шен но аб со лют но за кон чи лись за па сы мо ло ка».

Про грам ми сту стран но слы шать та кое вы ска зы ва ние. Ли бо у вас за кон чи лось

мо ло ко, ли бо нет. Не су ще ст ву ет ка ких-то про ме жу точ ных сте пе ней от сут ст вия

мо ло ка. Воз мож но, мне пы та лись со об щить, что мо ло ка не бу дет це лую не де лю,

но ре зуль тат тот же: при дет ся весь день пить эс прес со.

В боль шин ст ве прак ти че ских си туа ций та кое лег ко мыс лен ное от но ше ние лю-

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

ми сты то же име ют весь ма смут ное пред став ле ние о со стоя ни ях, а это уже про-

бле ма.

Рас смот рим про стой ин тер нет-ма га зин, ко то рый при ни ма ет к оп ла те толь ко кре-

дит ные кар ты и не вы пи сы ва ет кли ен там сче та. При этом класс Order (за каз) со-

дер жит та кой ме тод:

public boolean isComplete() {

return isPaid() && hasShipped();

}

Ра зум но, так? Так вот, хоть это вы ра же ние и вы де ле но в ак ку рат ный ме тод, а не

раз бро са но по все му ко ду пу тем ко пи ро ва ния и встав ки, его во об ще не долж но

су ще ст во вать. А то, что оно су ще ст ву ет, ука зы ва ет на про бле му. Ка кую? Нель зя

дос та вить за каз, пре ж де чем он оп ла чен. По это му hasShipped не мо жет вер нуть

true, по ка isPaid не вер нет true, а в этом слу чае часть вы ра же ния из бы точ на.

Воз мож но, вам все же ну жен ме тод isComplete для яс но сти ко да, но то гда он дол-

жен вы гля деть как-то так:

Думайте состояниями

189

public boolean isComplete() {

return hasShipped();

}

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

про вер ка ми. Я при вел кро шеч ный при мер, но ес ли до ба вить сю да от ме ну за ка за

и воз врат де нег, де ло ус лож ня ет ся, и по треб ность в пра виль ной об ра бот ке со-

стоя ний воз рас та ет. В дан ном слу чае за каз мо жет на хо дить ся толь ко в од ном из

трех раз ных со стоя ний:

• В­ про­цес­се: мож но до бав лять и уда лять то ва ры. Нель зя осу ще ст в лять до-

став ку.

• Оп­ла­чен: нель зя до бав лять и уда лять то ва ры. Мож но дос тав лять.

• Дос­тав­лен: ко нец. Боль ше ни ка ких из ме не ний.

На ли чие этих со стоя ний важ но, и пе ред вы пол не ни ем опе ра ций сле ду ет про ве-

рять, что вы в нуж ном со стоя нии, а так же про ве рять, что из те ку ще го со стоя ния

вы пе рей де те в до пус ти мое. Ко ро че, нуж но за щи щать объ ек ты тща тель но и в пра-

виль ных мес тах.

Но как на чать ду мать со стоя ния ми? Вы де лить вы ра же ния в ос мыс лен ные ме то-

ды – очень хо ро шее на ча ло, но это лишь на ча ло. Глав ное – по ни мать ко неч ные

ав то ма ты. Знаю, у вас со хра ни лись не при ят ные вос по ми на ния о них из кур са

ин фор ма ти ки, но ос тавь те это в про шлом. Ко неч ные ав то ма ты – это не осо бен но

слож но. Ри суй те их, то гда их лег че по нять и об су ж дать. За пус кай те свой код

в тес то вом ре жи ме, что бы раз де лить до пус ти мые и не до пус ти мые со стоя ния,

а так же пе ре хо ды меж ду ни ми, и под дер жи вать их кор рект ность. Изу чи те шаб-

лон State. Ос во ив шись с ним, по чи тай те о кон тракт ном про грам ми ро ва нии (de-

sign by contract). Оно по мо га ет обес пе чить до пус ти мость со стоя ния пу тем про-

вер ки дан ных и са мо го объ ек та на вхо де и вы хо де из ка ж до го от кры то го ме то да.

Ес ли со стоя ние не кор рект но, зна чит, в ко де ошиб ка, и вы рис куе те по те рять дан-

ные, ес ли не пре рве те вы пол не ние. Ес ли вам ка жет ся, что про вер ки со стоя ний

за му со ри ва ют код, на учи тесь скры вать их с по мо щью спе ци аль ных ин ст ру мен-

тов, ге не ра ции ко да, впле те ний (weaving) или ас пек тов. Не за ви си мо от то го, ка-

кой ме тод вы вы бе ре те, под ход на ос но ве со стоя ний сде ла ет ваш код бо лее про-

стым и на деж ным.

97 этюдов для программистов

Одна голова хорошо,

но две – часто лучше

Эдриан Уайбл

Про­грам­ми­ро­ва­ние­тре­бу­ет­вдум­чи­во­сти, а вдум чи вость мо жет су ще ст во вать

толь ко в уе ди не нии. Та кой сте рео тип при сущ мно гим про грам ми стам.

Но стиль «оди но ко го вол ка» в про грам ми ро ва нии уже дав но от сту па ет пе ред ко-

манд ным под хо дом, ко то рый, смею ут вер ждать, улуч ша ет ка че ст во ра бо ты, по-

вы ша ет про из во ди тель ность и по зво ля ет раз ра бот чи кам по лу чать боль шее удо-

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

с дру гом тес нее, а так же ра бо тать с те ми, кто не уча ст ву ет в раз ра бот ке, – сис тем-

ны ми и биз нес-ана ли ти ка ми, спе циа ли ста ми в об лас ти кон тро ля ка че ст ва и поль-

зо ва те ля ми.

Что это оз на ча ет для раз ра бот чи ков? Уже не дос та точ но быть экс пер том в об лас-

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

с дру ги ми людь ми.

Со труд ни че ст во на ра бо те – это не иг ра в во про сы и от ве ты и не дол гие со ве ща-

ния. Со труд ни че ст во – это за су чить ру ка ва вдво ем с кол ле гой и при сту пить

к труд ной за да че.

Я боль шой по клон ник пар но го про грам ми ро ва ния. Мож но на звать это «экс тре-

маль ным со труд ни че ст вом». Ко гда я ра бо таю в па ре, мое мас тер ст во про грам ми-

ста рас тет. Ес ли я сла бее сво его парт не ра в пред мет ной об лас ти или в ка кой-ли бо

тех но ло гии, то про сто учусь на его опы те. Ко гда я силь нее в ка ком-то ас пек те, то

на чи наю луч ше по ни мать, что я знаю и че го не знаю, по сколь ку мне при хо дит ся

да вать объ яс не ния. В лю бом слу чае мы оба вно сим свой вклад и учим ся друг

у дру га.

Ра бо та я в па ре, мы прив но сим свой кол лек тив ный опыт – как опыт в пред мет-

ной об лас ти, так и тех ни че ский – для ре ше ния стоя щей пе ред на ми за да чи. Вме-

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

нам ре шать за да чи эф фек тив но и ра цио наль но. Да же при на ли чии зна чи тель-

ной раз ни цы в уров не зна ний пред мет ной об лас ти или в тех но ло ги че ских во про-

сах, бо лее опыт ный парт нер все рав но че му-то учит ся у вто ро го – ну, ска жем,

Одна голова хорошо, но две – часто лучше

191

уз на ёт о но вых «го ря чих кла ви шах» ли бо встре ча ет ся с но вым ин ст ру мен том

или биб лио те кой. Для ме нее опыт но го парт не ра та кая ра бо та – за ме ча тель ный

спо соб «на брать ско рость».

Пар ное про грам ми ро ва ние по пу ляр но у сто рон ни ков гиб кой раз ра бот ки, хо тя

и не толь ко у них. Ино гда про тив ни ки пар ной ра бо ты ин те ре су ют ся: «А по че му

я дол жен пла тить двум про грам ми стам за вы пол не ние ра бо ты од но го?» Ко неч но,

не долж ны. Но де ло в том, что ра бо та в па ре по вы ша ет ка че ст во, улуч ша ет по ни-

ма ние пред мет ной об лас ти, тех но ло гий и прие мов ра бо ты (ска жем, не оче вид ных

прие мов ра бо ты с ин тег ри ро ван ной сре дой раз ра бот ки, IDE), а так же умень ша ет

от ри ца тель ное влия ние ло те рей но го рис ка (ко гда один из ва ших спе циа ли стов-

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

Ка ко ва дол го сроч ная вы го да от то го, что вы уз нае те о но вой «го ря чей кла ви ше»?

Ка кой ме рой мы из ме рим улуч ше ние ка че ст ва про дук та, дос тиг ну тое ра бо той

в па ре? Ка кой ме рой из ме рить поль зу от то го, что ваш парт нер не дал вам зай ти

в ту пик в ре ше нии слож ной про бле мы? Од но ис сле до ва ние сви де тель ст ву ет о при-

рос те эф фек тив но сти и ско ро сти на 40%.1 А как оце нить умень ше ние «ло те рей но-

го рис ка»? Боль шин ст во плю сов ра бо ты в па ре труд но из ме рить.

Кто дол жен ра бо тать в па ре и с кем? Ес ли вы но ви чок в ко ман де, то важ но, что бы

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

об ла дал хо ро ши ми на вы ка ми об ще ния и на став ни че ст ва. Ес ли у вас не дос та точ-

но зна ний в пред мет ной об лас ти, ра бо тай те в па ре с тем, кто ее хо ро шо зна ет.

Ес ли нет уве рен но сти, экс пе ри мен ти руй те: со труд ни чай те с кол ле га ми. Соз да-

вай те па ры для ре ше ния ин те рес ных слож ных про блем. По смот ри те, что у вас

по лу чит ся. По про буй те не сколь ко раз.

1

J. T. Nosek «The Case for Collaborative Programming», Communications of the ACM,

March 1998.

97 этюдов для программистов

Две ошибки могут гасить

одна другую (и тогда

их трудно исправлять)

Аллан Келли

Код­ни­ко­гда­не­лжет,­но­мо­жет­быть­внут­рен­не­про­ти­во­ре­чи­вым. Ино гда про-

ти во ре чия вы зы ва ют не до уме ние: как это во об ще мо жет ра бо тать?

В сво ем ин тер вью1 Ал лан Клампп (Allan Klumpp), ве ду щий раз ра бот чик про-

грамм но го обес пе че ния для лун но го мо ду ля Apollo, рас крыл тот факт, что ПО

управ ле ния дви га те ля ми со дер жа ло де фект, из-за ко то ро го спус кае мый мо дуль

дол жен был вес ти се бя не ус той чи во. Од на ко в про грам ме бы ла еще од на ошиб ка,

ком пен си ро вав шая пер вую, и при по сад ке Apol lo 11 и 12 на Лу ну это ПО ус пеш-

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

Рас смот рим функ цию, ко то рая воз вра ща ет код за вер ше ния. До пус тим, она воз-

вра ща ет false, ко гда долж на бы ла бы вер нуть true. Те перь пред ста вим, что в вы-

зы ваю щей функ ции не реа ли зо ва на про вер ка воз вра щае мо го зна че ния. Все ра-

бо та ет пре крас но, по ка од на ж ды кто-то не об на ру жит от сут ст вие про вер ки и не

вста вит ее.

Или рас смот рим при ло же ние, ко то рое хра нит со стоя ние в ви де до ку мен та XML.

До пус тим, что один из уз лов не кор рект но за пи сы ва ет ся как TimeToLive (вре мя

жиз ни) вме сто TimeToDie (вре мя смер ти), как сле до ва ло бы, ес ли ве рить до ку мен-

та ции. Все бу дет хо ро шо, по ка код за пи си и код чте ния со дер жат од ну и ту же

ошиб ку. Но ис правь те ее в од ном мес те или до бавь те но вое при ло же ние, чи таю-

щее тот же до ку мент, и сим мет рия рух нет, как и весь код.

Ко гда в ко де два де фек та, а от каз на вид толь ко один, мо жет стать бес по лез ным

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

раз ра бот чик об на ру жи ва ет де фект, ис прав ля ет его и про во дит тес ти ро ва ние. Воз-

ни ка ет тот же са мый от каз, но уже в си лу дей ст вия вто ро го де фек та. То гда от ме-

ня ет ся пер вое ис прав ле ние, код сно ва ис сле ду ет ся, и об на ру жи ва ет ся вто рой де-

фект, ко то рый и ис прав ля ет ся. Но пер вый де фект сно ва на мес те, сно ва воз ни ка ет

тот же от каз, и то гда от ка ты ва ет ся вто рое ис прав ле ние. Про цесс по вто ря ет ся, но

1

http://www.netjeff.com/humor/item.cgi?file=ApolloComputer

Две ошибки могут гасить одна другую (и тогда их трудно исправлять)

193

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

ему ни ко гда не уда ст ся.

Взаи мо дей ст вие двух де фек тов в ко де, про яв ляю щих се бя оди на ко вым сбо ем, не

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

они об на ру жи ва ют, что их ран ние ре ше ния про бле мы бы ли пра виль ны ми.

Та кое слу ча ет ся не толь ко с ко дом: про бле мы встре ча ют ся в до ку мен тах, со дер-

жа щих тех ни че ские тре бо ва ния. И они спо соб ны рас про стра нять ся, по доб но ви-

ру су, из од но го мес та в дру гое. Ошиб ка в ко де ком пен си ру ет ошиб ку в пись мен-

ной спе ци фи ка ции.

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

грам ма го во рит «ле вая», она име ет в ви ду «пра вая», и под страи ва ют под нее свои

дей ст вия. Они да же со об ща ют о про бле ме но вым поль зо ва те лям: «За пом ни, ко-

гда при ло же ние го во рит, что нуж но щелк нуть ле вой кноп кой, это зна чит, что

нуж но щелк нуть пра вой». Сто ит ис пра вить ошиб ку, и поль зо ва те лям при дет ся

пе ре учи вать ся.

Оди ноч ные ошиб ки, как пра ви ло, лег ко об на ру жи ва ют ся и ис прав ля ют ся. Про-

бле мы воз ни ка ют в слу чае мно же ст ва оши бок, тре бую щих мно же ст ва ис прав ле-

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

то му их обыч но не от кла ды ва ют, а бо лее слож ные про бле мы ко пят ся до луч ших

вре мен.

Нет про сто го от ве та на во прос, как ре шать про бле мы, воз ни каю щие в свя зи с род-

ст вен ны ми де фек та ми. Нуж но пом нить об их су ще ст во ва нии, иметь яс ную го ло-

ву и го тов ность при не об хо ди мо сти рас смот реть все воз мож но сти.

97 этюдов для программистов

Написание кода

в духе Убунту для друзей

Аслам Хан

Очень­час­то­мы­про­грам­ми­ру­ем­в­изо­ля­ции, и на ши про грам мы от ра жа ют как

на шу лич ную ин тер пре та цию про бле мы, так и очень лич ное ее ре ше ние. Мы мо-

жем ра бо тать в ко ман де, но и то гда мы изо ли ро ва ны как ко ман да. Мы лег ко за-

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

и рас ши рять дру гие лю ди. Лег ко упус тить из ви да со ци аль ную сто ро ну про-

грам ми ро ва ния. Соз да ние про грамм – од но вре мен но и тех ни че ское, и со ци аль-

ное за ня тие. Нам сле ду ет ча ще ог ля ды вать ся во круг, что бы по нять, что мы ра бо-

та ем не изо ли ро ван но и что мы не сем об щую от вет ст вен ность за воз мож ный ус-

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

Мож но на пи сать код вы со ко го ка че ст ва в от ры ве от ре аль но сти, пол но стью уй дя

в се бя. С од ной сто ро ны, это эго цен трич ный под ход ( эго не в смыс ле вы со ко ме-

рия, а в смыс ле лич но сти). Это фи ло со фия Дзен, и в мо мент соз да ния про грам мы

в этом слу чае дей ст ви тель но су ще ст вуе те толь ко вы. Я все гда ста ра юсь жить

в те ку щем мо мен те, по сколь ку это по мо га ет при бли зить ся к луч ше му ка че ст ву,

но при этом я жи ву в сво ем те ку щем мо мен те. А как же быть с те ку щим мо мен-

том мо ей ко ман ды? Мой мо мент и мо мент мо ей ко ман ды – сов па да ют ли они?

На язы ке зу лу фи ло со фия Убун ту оп ре де ля ет ся как «Умун ту нгу мун ту нга бан-

ту», что в пер вом при бли же нии мож но пе ре вес ти так: «Лич ность – это лич ность

че рез (дру гие) лич но сти». Я ста нов люсь луч ше, по сколь ку ты де ла ешь ме ня луч-

ше свои ми до б ры ми по ступ ка ми. Но, с дру гой сто ро ны, вы ху же де лае те свое де-

ло, ес ли я пло хо де лаю свое. Для раз ра бот чи ков это сво дит ся к то му, что «раз ра-

бот чик – это раз ра бот чик че рез (дру гих) раз ра бот чи ков». Ес ли опус тить ся до

«же ле за», то «код – это код че рез (дру гой) код».

Ка че ст во ко да, ко то рый пи шу я, влия ет на ка че ст во ко да, ко то рый пи ше те вы.

А что ес ли мой код низ ко го ка че ст ва? Да же ес ли вы на пи ше те очень чис тый код,

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

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

что бы ог ра ни чить ущерб, но пол но стью от не го уже не из ба вить ся. Я за ста вил

Написание кода в духе Убунту для друзей

195

вас де лать боль ше, чем тре бо ва лось, про сто по то му, что не ду мал о вас, ко гда

жил в сво ем мо мен те.

Я мо гу счи тать свой код чис тым, но все же мож но сде лать его еще луч ше, при-

дер жи ва ясь ду ха Убун ту. Как вы гля дит код в ду хе Убун ту? Он вы гля дит, как

хо ро ший, яс ный код. И речь идет да же не о ко де как ар те фак те. Все де ло в ак те

соз да ния это го ар те фак та. Про грам ми ро ва ние для сво их дру зей в ду хе Убун ту

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

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

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

Дзен – это де ло лич ное. Убун ту – это Дзен для груп пы лю дей. Край не ред ко мы

пи шем про грам мы ис клю чи тель но для са мих се бя.

97 этюдов для программистов

Утилиты UNIX – ваши друзья

Диомидис Спинеллис

Ес­ли­бы,­от­прав­ля­ясь­в­из­гна­ние­на­не­оби­тае­мый­ост­ров, я дол жен был вы би-

рать меж ду IDE и на бо ром ин ст ру мен тов UNIX, я бы, не ко леб лясь, вы брал ути-

ли ты UNIX. Вот при чи ны, по ко то рым сле ду ет ов ла деть ис кус ст вом ра бо ты с ути-

ли та ми UNIX.

Во-пер вых, IDE ори ен ти ро ва ны на кон крет ные язы ки, а ути ли ты UNIX мо гут

ра бо тать с лю бым ма те риа лом в тек сто вом ви де. В со вре мен ных ус ло ви ях раз ра-

бот ки, ко гда но вые язы ки и но та ции по яв ля ют ся ка ж дый год, за тра ты на изу че-

ние ра бо ты с ути ли та ми UNIX оку пят ся мно го крат но.

Кро ме то го, IDE пред ла га ют толь ко те ко ман ды, ко то рые ре ши ли реа ли зо вать

их соз да те ли, то гда как сред ст ва ми UNIX мож но вы пол нить лю бую мыс ли мую

за да чу. Их мож но пред ста вить се бе как клас си че ские (до по яв ле ния Bionicle)

бло ки Lego: вы соз дае те соб ст вен ные ко ман ды, про сто ком би ни руя ма лень кие,

но уни вер саль ные ути ли ты UNIX. К при ме ру, сле дую щая по сле до ва тель ность

пред став ля ет со бой тек сто вую реа ли за цию ана ли за сиг на ту ры по Кан нин ге му –

по сле до ва тель ность ис поль зо ва ния точ ки с за пя той, фи гур ных ско бок и ка вы-

чек в лю бом фай ле мо жет мно гое ска зать о его со дер жи мом:

for i in *.java; do

echo -n "$i: "

sed 's/[^"{};]//g' $i | tr -d '\n'

echo

done

Да лее, ка ж дая изу чен ная ва ми опе ра ция IDE спе ци фич на для дан ной за да чи,

на при мер до бав ле ние но во го ша га в кон фи гу ра цию от ла доч ной сбор ки про ек та.

На про тив, бо лее глу бо кое изу че ние ути лит UNIX по вы ша ет ва шу эф фек тив-

ность при ре ше нии лю бых за дач. На при мер, я при ме нил ути ли ту sed, ис поль зо-

ван ную в при ве ден ной вы ше по сле до ва тель но сти ко манд, что бы пре об ра зо вать

про це ду ру сбор ки про ек та для кросс ком пи ля ции на мно го про цес сор ных ар хи-

тек ту рах.

Утилиты UNIX – ваши друзья

197

Ути ли ты UNIX бы ли раз ра бо та ны в ту эпо ху, ко гда мно го поль зо ва тель ские ком-

пь ю те ры рас по ла га ли ОЗУ раз ме ром в 128 Кбайт. При их соз да нии бы ла про яв-

ле на та кая изо бре та тель ность, что сей час они мо гут очень эф фек тив но об ра ба ты-

вать ог ром ные на бо ры дан ных. Боль шин ст во ути лит пред став ля ет со бой фильт-

ры, об ра ба ты ваю щие по од ной стро ке за раз, а по то му нет верх ней гра ни цы объ-

е ма дан ных, ко то рые они мо гут об ра бо тать. Вы хо ти те уз нать, сколь ко ре дак ций

хра нит ся в дам пе анг лий ской Ви ки пе дии, имею щем раз мер пол те ра бай та? Про-

стой вы зов ко ман ды

grep ‘<revision>’ | wc –l

без тру да даст вам от вет. Ес ли ка кая-то по сле до ва тель ность ко манд по ка жет ся

вам по лез ной в об щем слу чае, мож но соз дать на ее ос но ве сце на рий ин тер пре та-

то ра ко манд, при ме нив в нем не ко то рые ис клю чи тель но мощ ные про грамм ные

кон ст рук ции, та кие как на прав ле ние дан ных в цик лы и ус лов ные опе ра то ры.

Еще бо лее впе чат ля ет, что кон вей ер ное вы пол не ние ко манд UNIX (как в пре ды-

ду щем при ме ре) ес те ст вен ным об ра зом рас пре де ля ет на груз ку по не сколь ким

кон вей е рам об ра бот ки со вре мен ных мно го ядер ных про цес со ров.

Прин цип «пре крас ное в ма лом» и от кры тость реа ли за ций ути лит UNIX де ла ют

их дос туп ны ми по все ме ст но, да же на плат фор мах с ог ра ни чен ны ми ре сур са ми,

та ких как ме диа-про иг ры ва тель, под клю чае мый к те ле ви зо ру, или мар шру ти за-

тор DSL. Та кие уст рой ст ва ед ва ли рас по ла га ют мощ ным гра фи че ским ин тер-

фей сом поль зо ва те ля, но час то со дер жат при ло же ние BusyBox, пред ла гаю щее

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

Win dows, сре да Cygwin пред ло жит вам все мыс ли мые ути ли ты UNIX как в ви де

ис пол няе мых фай лов, так и в ви де ис ход но го ко да.

На ко нец, ес ли вас не удов ле тво ря ют су ще ст вую щие ути ли ты UNIX, вы мо же те

лег ко рас ши рить их на бор. На пи ши те про грам му, ко то рая ре ша ет нуж ную вам

за да чу, на лю бом по нра вив шем ся вам язы ке, со блю дая сле дую щие про стые пра-

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

со стан дарт но го вво да в ви де строк тек ста и пе ча тать ре зуль тат на стан дарт ный

вы вод без вся ких за го лов ков и про чих ук ра ша тельств. Па ра мет ры, влияю щие

на функ цио ни ро ва ние ути ли ты, за да ют ся в ко манд ной стро ке. Сле дуй те этим

пра ви лам, и то гда «Зем ля – твое, мой маль чик, дос то я нье».

97 этюдов для программистов

Правильно выбирайте алгоритмы

и структуры данных

Ян Кристиаан ван Винкель

Круп ный банк с боль шим ко ли че ст вом фи лиа лов по жа ло вал ся, что ку п лен-

ные для кас си ров но вые ком пь ю те ры ра бо та ют слиш ком мед лен но. Это бы ло

еще до по все ме ст но го ис поль зо ва ния ин тер нет-бан кин га, и бан ко ма ты то же

не бы ли так ши ро ко рас про стра не ны, как сей час. Лю ди хо ди ли в банк го раз до

ча ще, а из-за мед лен но ра бо таю щих ком пь ю те ров вы страи ва лись оче ре ди. Че-

рез ка кое-то вре мя банк при гро зил ра зо рвать кон тракт с по став щи ком.

По став щик на пра вил в банк спе циа ли ста по ана ли зу и на строй ке про из во-

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

на тер ми на ле про грам му, съе дав шую поч ти всю про из во ди тель ность про цес-

со ра. По сред ст вом ин ст ру мен та про фи ли ро ва ния он на шел в этой про грам-

ме функ цию, ви нов ную в про ис хо дя щем. Ее ис ход ный код вы гля дел так:

for (i=0; i<strlen(s); ++i) {

if (... s[i] ...) ...

}

При этом стро ка s обыч но со дер жа ла не сколь ко ты сяч сим во лов. Код (ко то-

рый был на пи сан в са мом бан ке) бы ст ро из ме ни ли, и с тех пор бан ков ские

кас си ры за жи ли сча ст ли во...

По­че­му­ про­грам­ми­сту­ не­ при­шло­ в­ го­ло­ву­ ни че го ум нее, чем на пи сать код

с квад ра тич ной слож но стью без вся кой не об хо ди мо сти?

При ка ж дом вы зо ве strlen про грам ма про смат ри ва ет ка ж дый из не сколь ких ты-

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

Стро ка при этом не ме ня ет ся. За ра нее вы чис лив ее дли ну, про грам мист из ба вил-

ся бы от ты сяч вы зо вов strlen (и мил лио нов ите ра ций цик ла):

n=strlen(s);

for (i=0; i<n; ++i) {

if (... s[i] ...) ...

}

Правильно выбирайте алгоритмы и структуры данных

199

Всем из вес тен прин цип «сде лай так, что бы код ра бо тал, по том сде лай так, что бы

он ра бо тал бы ст ро», ко то рый на прав лен про тив оп ти ми за ций на мик ро уров не.

Но по при ве ден но му при ме ру мож но ре шить, что про грам мист ис пол нил ма киа-

вел лев ское ада жио «сна ча ла сде лай так, что бы код ра бо тал мед лен но».

По доб ная без дум ность встре ча ет ся, и не ред ко. И де ло не толь ко в том, что не нуж-

но «за но во изо бре тать ко ле со». Ино гда мо ло дые про грам ми сты бро са ют ся, не осо-

бо раз ду мы вая, пи сать код и вдруг «изо бре та ют» пу зырь ко вую сор ти ров ку. При

этом они, слу ча ет ся, еще и хва ста ют этим.

Об рат ной сто ро ной вы бо ра пра виль но го ал го рит ма яв ля ет ся вы бор струк ту ры

дан ных. Этот вы бор мо жет серь ез но по вли ять на ско рость ра бо ты: ес ли для хра-

не ния кол лек ции в мил ли он объ ек тов, по ко то рой нуж но вы пол нять по иск, вы

ис поль зуе те связ ный спи сок – а не струк ту ру с хе ши ро ва ни ем дан ных ли бо дво-

ич ное де ре во, – поль зо ва те лю най дет ся что ска зать на счет ва ше го уме ния про-

грам ми ро вать.

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

имею щие ся биб лио те ки. Но, что бы из бе жать та ких про блем, как у вы ше упо мя-

ну то го бан ка, они долж ны так же об ла дать зна ния ми об ал го рит мах и воз мож но-

стях их мас шта би ро ва ния. Что де ла ет со вре мен ные тек сто вые ре дак то ры та ки-

ми же мед ли тель ны ми, как ста рые про грам мы 1980-х ти па WordStar – толь ко

ли на во ро чен ный ин тер фейс? Мно гие го во рят, что в про грам ми ро ва нии важ ней-

шее зна че ние име ет по втор ное ис поль зо ва ние ко да. Но пре ж де все го про грам-

мист дол жен знать, ко гда, что и как ис поль зо вать по втор но. Для это го ему нуж но

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

Хо ро ший про грам мист дол жен так же знать, ко гда сто ит ис поль зо вать пло хой

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

боль ше пя ти эле мен тов (ска жем, ко ли че ст во кос тей в по ке ре на кос тях), вы по-

ни мае те, что сор ти ро вать при дет ся не бо лее пя ти эле мен тов. В та ком слу чае пу-

зырь ко вая сор ти ров ка дей ст ви тель но мо жет ока зать ся наи бо лее ра зум ным вы-

бо ром. На ка ж дой ули це бы ва ет празд ник.

По это му про чти те не сколь ко хо ро ших книг – и хо ро шень ко в них раз бе ри тесь.

А ес ли вы глу бо ко изу чи те «Ис кус ст во про грам ми ро ва ния» До наль да Кну та,

вам мо жет да же по вез ти: най ди те у ав то ра ошиб ку, и вы по лу чи те от не го чек на

один ше ст на дца те рич ный дол лар ($2.56).

97 этюдов для программистов

Многословный журнал

лишит вас сна

Йоханнес Бродуолл

Ко­гда­я­встре­чаю­сис­те­му, ко то рая дос та точ но дав но раз ра ба ты ва ет ся или функ-

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

«гряз ный» жур нал. Вы знае те, о чем я го во рю: это ко гда пе ре ход по ссыл ке при

нор маль ной ра бо те с веб-стра ни цей при во дит к це ло му по то ку со об ще ний, за пи-

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

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

Ес ли ва ши сис те мы по хо жи на мои, то ко гда за кан чи ва ет ся ва ша ра бо та, на чи-

на ет ся ра бо та дру гих лю дей. По сле за вер ше ния раз ра бот ки сис те ма бу дет дол го

и ус пеш но об слу жи вать кли ен тов (ес ли вам по ве зет). Как вы уз нае те о про бле-

мах, ес ли сис те ма в экс плуа та ции, и что вы бу де те с ни ми де лать?

Воз мож но, кто-то осу ще ст в ля ет мо ни то ринг сис те мы вме сто вас, а воз мож но, это

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

жур на лов. Ес ли что-то слу чи лось, и вас бу дят сре ди но чи, же ла тель но, что бы

при чи на бы ла вес кой. Ес ли моя сис те ма при смер ти, я дол жен знать об этом. Но

ес ли она про сто ик ну ла, я бы пред по чел, что бы мой слад кий сон не на ру ша ли.

Во мно гих сис те мах пер вым при зна ком не при ят но стей слу жит за пись со об ще-

ния в ка кой-ни будь жур нал. Обыч но это жур нал ре ги ст ра ции оши бок. Так что

ока жи те се бе ус лу гу: ор га ни зуй те про цесс та ким об ра зом, что бы с пер во го же

дня раз ра бот ки, как толь ко что-то по яв ля ет ся в жур на ле оши бок, вас бу ди ли

сре ди но чи те ле фон ным звон ком. Ес ли во вре мя сис тем но го тес ти ро ва ния вы

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

рее все го, за сви де тель ст ву ет на деж ность ва шей сис те мы, а «гряз ный» по слу жит

пер вым сиг на лом тре во ги.

Рас пре де лен ные сис те мы соз да ют до пол ни тель ный уро вень слож но сти. Вы долж-

ны ре шить, как дей ст во вать в слу чае от ка за внеш них за ви си мо стей. Ес ли сис те-

ма силь но рас пре де ле на, это мо жет про ис хо дить час то. Уч ти те это об стоя тель ст-

во при вы бо ре по ли ти ки ве де ния жур на ла.

Многословный журнал лишит вас сна

201

В це лом, луч шим сви де тель ст вом то го, что все в по ряд ке, слу жит ре гу ляр ное по-

яв ле ние со об ще ний низ ко го при ори те та. Ме ня уст раи ва ет, ко гда на ка ж дое су-

ще ст вен ное со бы тие в при ло же нии по яв ля ет ся при мер но од но со об ще ние уров-

ня INFO.

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

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

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

что-то все-та ки по явит ся.

97 этюдов для программистов

WET размазывает узкие

места производительности

Кирк Пеппердин

Зна­чи­мость­прин­ци­па­DRY (Don’t Repeat Yourself – не по вто ряй ся) со сто ит в том,

что он фор ма ли зу ет сле дую щую идею: ка ж дый эле мент зна ний в сис те ме дол жен

иметь един ст вен ное пред став ле ние. Ины ми сло ва ми, зна ние долж но ог ра ни чи-

вать ся един ст вен ной реа ли за ци ей. Пол ную про ти во по лож ность DRY пред став-

ля ет WET (Write Every Time – пи ши ка ж дый раз). Наш код мож но на звать «сы-

рым» (WET), ко гда зна ние пред став ле но в ко де од но вре мен но не сколь ки ми спо со-

ба ми. Скры тое влия ние DRY и WET на про из во ди тель ность ста но вит ся по нят-

ным по сле рас смот ре ния их мно го чис лен ных эф фек тов на кон крет ном при ме ре.

Рас смот рим не ко то рую функ цио наль ность на шей сис те мы (на зо вем ее X), яв-

ляю щую ся уз ким ме стом для про цес со ра. До пус тим, что функ ция X по треб ля ет

30% мощ но сти про цес со ра. Те перь пред по ло жим, что у функ ции X есть 10 раз-

лич ных реа ли за ций. В сред нем ка ж дая реа ли за ция по треб ля ет 3% про цес сор-

но го вре ме ни. По сколь ку та кой уро вень ис поль зо ва ния про цес со ра не вы зы ва ет

бес по кой ст ва, при бег лом ана ли зе мож но не за ме тить, что эта функ ция соз да ет

уз кое ме сто. Но до пус тим, что мы ка ким-то об ра зом вы яс ни ли, что функ ция X

уз кое ме сто. То гда ставится задача най ти и ис пра вить ка ж дую реа ли за цию. Для

WET у нас есть 10 раз ных реа ли за ций, ко то рые нуж но най ти и ис пра вить. В слу-

чае DRY мы сра зу уви дим за груз ку про цес со ра в 30%, а раз мер ко да для ис прав-

ле ния бу дет в 10 раз мень ше. К то му же не по тре бу ет ся вы ис ки вать все мно го-

чис лен ные реа ли за ции.

Есть один сце на рий, в ко то ром мы час то на ру ша ем DRY, а имен но при ра бо те

с кол лек ция ми. Стан дарт ный при ем реа ли за ции за про са за клю ча ет ся в про хо де

по кол лек ции и при ме не нии за про са к ка ж до му ее эле мен ту:

public class UsageExample {

private ArrayList<Customer> allCustomers = new ArrayList<Customer>();

// ...

public ArrayList<Customer> findCustomersThatSpendAtLeast(Money amount) {

ArrayList<Customer> customersOfInterest = new ArrayList<Customer>();

for (Customer customer: allCustomers) {

WET размазывает узкие места производительности

203

if (customer.spendsAtLeast(amount))

customersOfInterest.add(customer);

}

return customersOfInterest;

}

}

Сде лав эту кол лек цию на пря мую дос туп ной кли ен там, мы на ру ши ли прин цип

ин кап су ля ции. Это не толь ко сни жа ет по тен ци ал ре фак то рин га, но и за став ля ет

поль зо ва те лей ко да на ру шать DRY, по сколь ку ка ж до му из них при дет ся за но во

реа ли зо вы вать по тен ци аль но иден тич ный за прос. Та кой си туа ции лег ко из бе-

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

но вый пред мет но-ори ен ти ро ван ный тип кол лек ции с име нем CustomerList. Этот

класс се ман ти че ски луч ше со гла со ван с пред мет ной об ла стью. Ес те ст вен ным об-

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

На ли чие это го но во го ти па-кол лек ции по зво лит так же лег ко вы яс нить, яв ля ют-

ся ли эти за про сы уз ким ме стом в смыс ле про из во ди тель но сти. Вклю чив за про-

сы в класс, мы уст ра ня ем не об хо ди мость от кры вать кли ен там ва ри ан ты пред-

став ле ния, та кие как ArrayList. Это да ет нам сво бо ду для по сле дую ще го из ме не-

ния реа ли за ций без на ру ше ния кон трак тов с кли ен та ми:

public class CustomerList {

private ArrayList<Customer> customers = new ArrayList<Customer>();

private SortedList<Customer> customersSortedBySpendingLevel =

new SortedList<Customer>();

// ...

public CustomerList findCustomersThatSpendAtLeast(Money amount) {

return new CustomerList(

customersSortedBySpendingLevel.elementsLargerThan(amount));

}

}

public class UsageExample {

public static void main(String[] args) {

CustomerList customers = new CustomerList();

// ...

CustomerList customersOfInterest =

customers.findCustomersThatSpendAtLeast(someMinimalAmount);

// ...

}

}

В этом при ме ре сле до ва ние прин ци пу DRY по зво ли ло нам вве сти из ме нен ную

сис те му ин дек си ро ва ния, в ко то рой ис поль зу ет ся SortedList, а клю чом слу жит

объ ем трат на ших по ку па те лей. И, ес ли аб ст ра ги ро вать ся от дан но го при ме ра,

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

Пи ши мы код по прин ци пу WET, сде лать это бы ло бы труд нее.

97 этюдов для программистов

Когда программисты

и тестировщики сотрудничают

Джанет Грегори

Ко­гда­тес­ти­ров­щи­ки­и­про­грам­ми­сты­на­чи­на­ют­со­труд­ни­чать, про ис хо дят чу-

де са. Мень ше вре ме ни ухо дит на иг ру в пинг-понг де фек та ми в сис те ме от сле жи-

ва ния де фек тов. Мень ше вре ме ни тра тит ся на об су ж де ние то го, яв ля ет ся ли по-

ве де ние ошиб кой или но вой функ ци ей, а боль ше – на раз ра бот ку ка че ст вен но го

про грамм но го обес пе че ния, от ве чаю ще го ожи да ни ям за каз чи ков. Су ще ст ву ет

мно го воз мож но стей на ла дить со труд ни че ст во еще до то го, как нач нет ся на пи-

са ние ко да.

Тес ти ров щи ки мо гут по мочь за каз чи кам на пи сать прие моч ные тес ты на язы ке

их пред мет ной об лас ти с по мо щью та ких ин ст ру мен тов, как Fit (Framework for

Integrated Test). Ес ли пе ре дать эти тес ты про грам ми стам пе ред тем, как они нач-

нут пи сать код, те смо гут при ме нить прак ти ку раз ра бот ки на ос но ве прие моч но-

го тес ти ро ва ния ( acceptance test-driven development, ATDD). Про грам ми сты пи-

шут фрейм вор ки для про го на тес тов, а по том код с про вер кой на про хо ж де ние

этих тес тов. Да лее эти тес ты вхо дят в на бор рег рес си он ных тес тов. При та кой

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

и ос та ет ся боль ше вре ме ни на экс пе ри мен таль ное тес ти ро ва ние гра нич ных ус-

ло вий или сце на ри ев бо лее изо щрен ных ра бо чих про цес сов.

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

ра же ния по тес ти ро ва нию еще до то го, как про грам ми сты нач нут пи сать код но-

вой функ ции. Ес ли я ин те ре су юсь со об ра же ния ми про грам ми стов, они поч ти

все гда пре дос тав ля ют мне све де ния, по зво ляю щие мне до бить ся луч ше го по кры-

тия ко да или со кра тить за тра ты вре ме ни на не нуж ные тес ты. Час то нам уда ва-

лось пре дот вра тить по яв ле ние де фек тов за счет то го, что тес ты про яс ня ют мно-

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

я пе ре да ла про грам ми стам Fit-тес ты, ко то рые по ка зы ва ли, ка кие ре зуль та ты

ожи да ют ся при по ис ке по мас ке. Про грам мист до это го твер до на ме ре вал ся реа-

ли зо вать толь ко по иск по кон крет ным сло вам. Нам уда лось по об щать ся с за каз-

чи ком, и мы смог ли до го во рить ся о пра виль ной ин тер пре та ции по ис ка до то го,

Когда программисты и тестировщики сотрудничают

205

как на чать пи сать код. В ре зуль та те мы пре дот вра ти ли воз ник но ве ние де фек та

и сэ ко но ми ли всем уй му вре ме ни.

Про грам ми сты мо гут со труд ни чать с тес ти ров щи ка ми и в де ле ав то ма ти за ции.

Они зна ко мы с хо ро шей прак ти кой на пи са ния ко да и спо соб ны по мочь тес ти-

ров щи кам соз дать на деж ный ком плекс ав то ма ти зи ро ван ных тес тов, что по слу-

жит ин те ре сам всей ко ман ды. Мне час то при хо ди лось ви деть, как про ек ты по

ав то ма ти за ции тес ти ро ва ния за вер ша лись не уда чей из-за не уме ло го про ек ти ро-

ва ния тес тов. Ли бо тес ты пы та ют ся про ве рить слиш ком мно гое, ли бо тес ти ров-

щи ки не дос та точ но раз би ра ют ся в тех но ло гии, что бы сде лать тес ты не за ви си-

мы ми от ко да. Тес ти ров щи ки час то соз да ют уз кие мес та, по это му по лез но, ко гда

про грам ми сты ра бо та ют с ни ми вме сте над та ки ми за да ча ми, как ав то ма ти за-

ция. Оп ре де лив вме сте с тес ти ров щи ка ми, что мож но про тес ти ро вать на ран нем

эта пе – воз мож но, с по мо щью ка ко го-ни будь про сто го ин ст ру мен та, – про грам-

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

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

Ес ли тес ти ров щи ки пе ре ста нут ду мать лишь о том, как бы им сло мать про грам-

му или най ти ошиб ки в ко де раз ра бот чи ков, то и про грам ми сты пе ре ста нут счи-

тать, что тес ти ров щи ки ста ра ют ся толь ко «дос тать» их, и бу дут бо лее склон ны

к со труд ни че ст ву. Ко гда про грам ми сты по ни ма ют, что они от ве ча ют за ка че ст во

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

ным ка че ст вом, и ко ман да мо жет со вме ст но ав то ма ти зи ро вать боль ше рег рес си-

он ных тес тов. Та ко во чу до ус пеш ной груп по вой ра бо ты.

97 этюдов для программистов

Пишите код так, как будто

вам предстоит сопровождать

его всю оставшуюся жизнь

Юрий Зубарев

Мож­но­за­дать­во­прос­о том, что дол жен знать и уметь лю бой про грам мист, 97 раз-

ным лю дям и по лу чить 97 раз ных от ве тов. Это мо жет од но вре мен но оше ло мить

и на пу гать. Все со ве ты хо ро ши, все прин ци пы здра вы, все ис то рии убе ди тель-

ны, но с че го на чать? И, что еще бо лее важ но, как, од на ж ды на чав при ме нять

луч шие прак ти ки, ос та вать ся на долж ном уров не и сде лать их со став ной ча стью

сво ей прак ти ки про грам ми ро ва ния?

Я ду маю, что от вет – в ва шем на строе или про сто в ва шем под хо де. Ес ли вам без-

раз лич ны ва ши кол ле ги-раз ра бот чи ки, тес ти ров щи ки, ме нед же ры, со труд ни ки

от де лов про даж и мар ке тин га, а так же ко неч ные поль зо ва те ли, у вас не воз ник-

нет по бу ж де ния вес ти, к при ме ру, раз ра бот ку на ос но ве тес тов или пи сать по нят-

ные ком мен та рии в ко де. Ду маю, что есть про стой спо соб из ме нить свое от но ше-

ние и раз вить в се бе стрем ле ние вы пус кать про дук ты са мо го луч ше го ка че ст ва:

Пи ши те код так, как буд то вам пред сто ит со про во ж дать его всю ос тав-

шую ся жизнь.

Вот и все. Ес ли вы при ме те эту мысль, нач нут про ис хо дить уди ви тель ные ве щи.

Со гла сив шись с тем, что лю бой из ва ших преж них или ны неш них ра бо то да те-

лей име ет пра во по зво нить вам сре ди но чи и по про сить объ яс нить, на чем ос но-

ва ны ре ше ния, сде лан ные ва ми при на пи са нии не кое го ме то да fooBar, вы нач не-

те свой путь к мас тер ст ву в про грам ми ро ва нии. Вам са мим за хо чет ся при ду мы-

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

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

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

код и не пре рыв но осу ще ст в лять его ре фак то ринг. Под дер жи вать весь на пи сан-

ный ва ми код в те че ние всей ос тав шей ся жиз ни? Эта за да ча бу дет ста но вить ся

все бо лее гран ди оз ной. У вас про сто не ос та нет ся ино го вы бо ра, кро ме как ра бо-

тать луч ше, изо бре та тель нее и эф фек тив нее.

Ес ли вду мать ся, то код, на пи сан ный ва ми мно го лет на зад, про дол жа ет вли ять

на ва шу карь е ру, нра вит ся вам это или нет. Ка ж дый ме тод, класс или мо дуль,

Пишите код так, как будто вам предстоит сопровождать его всю оставшуюся жизнь

207

ко то рый вы спро ек ти ро ва ли или на пи са ли, хра нит от пе ча ток ва ших зна ний, от-

но ше ния к ра бо те, упор ст ва, про фес сио на лиз ма, сте пе ни во вле чен но сти и уров-

ня удо воль ст вия. Лю ди фор ми ру ют о вас свое мне ние на ос но ве ко да, ко то рый

они ви дят. Ес ли это мне ние по сто ян но ока зы ва ет ся от ри ца тель ным, ва ша карь е-

ра не бу дет раз ви вать ся так бы ст ро, как вам хо те лось бы. Ка ж дая стро ка ва ше го

ко да долж на быть на бла го ва шей карь е ре, ва ших кли ен тов и ва ших поль зо ва те-

лей – пи ши те код так, как ес ли бы вам при шлось со про во ж дать его всю ос тав-

шую ся жизнь.

97 этюдов для программистов

Пишите маленькие функции

на основе примеров

Кейт Брэйтуэйт

Мы­хо­тим­пи­сать­пра­виль­ный­код и иметь на ру ках сви де тель ст во его пра виль-

но сти. В обо их слу ча ях бу дет по лез ным при нять во вни ма ние «раз мер» функ-

ции. Не в смыс ле объ е ма ко да, ко то рый реа ли зу ет функ цию – хо тя и это ин те рес-

но, – а как раз мер ма те ма ти че ской функ ции, ко то рую де мон ст ри ру ет наш код.

На при мер, в иг ре го есть по ло же ние, на зы вае мое ата ри, в ко то ром фиш ки иг ро-

ка мо гут быть за хва че ны про тив ни ком: фиш ка с дву мя и бо лее сво бод ны ми со-

сед ни ми клет ка ми (на зы вае мы ми сте пе ня ми сво бо ды), не на хо дит ся в по ло же-

нии ата ри. Под счи тать ко ли че ст во сте пе ней сво бо ды у фиш ки бы ва ет не лег ко,

но, ко гда оно из вест но, оп ре де лить ата ри лег ко. Мож но для на ча ла на пи сать та-

кую функ цию:

boolean atari(int libertyCount)

libertyCount < 2

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

цию мож но рас смат ри вать как мно же ст во – не ко то рое под мно же ст во де кар то ва

про из ве де ния об лас ти оп ре де ле ния (здесь это int) и об лас ти при ни мае мых зна че-

ний (здесь – boolean). Будь эти мно же ст ва оди на ко во го раз ме ра, как в Java, в мно-

же ст ве int × boolean бы ло бы 2L*(Integer.MAX_VALUE+(–1L*Integer.MIN_VALUE)+1L), или


8 589 934 592 эле мен тов. По ло ви на из них при над ле жит под мно же ст ву, яв ляю-

ще му ся на шей функ ци ей, по это му для пол но го до ка за тель ст ва кор рект но сти на-

шей функ ции нуж но про ве рить око ло 4,3 ×109 слу ча ев.


На этом и ос но вы ва ет ся ут вер жде ние, что тес та ми нель зя до ка зать от сут ст вие

де фек тов. Тес ты спо соб ны про де мон ст ри ро вать, что функ цио наль ность реа ли зо-

ва на. Но про бле ма раз ме ра со хра ня ет ся.

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

сво бо ды фиш ки яв ля ет ся не лю бым це лым чис лом, а од ним из чи сел {1,2,3,4}.

По это му мож но на пи сать дру гой ва ри ант ко да:

Пишите маленькие функции на основе примеров

209

LibertyCount = {1,2,3,4}

boolean atari(LibertyCount libertyCount)

libertyCount == 1

Это уже го раз до лег че под да ет ся об ра бот ке: вы чис ляе мая функ ция – это мно же-

ст во, в ко то ром мак си мум во семь эле мен тов. Фак ти че ски про вер ка че ты рех слу-

ча ев мо жет дать пол ную уве рен ность, что функ ция кор рект на. Это од на из при-

чин, по че му при на пи са нии про грамм луч ше ис поль зо вать ти пы, тес но свя зан-

ные с пред мет ной об ла стью, а не встро ен ные ти пы язы ка. Ис поль зо ва ние пред-

мет но-ори ен ти ро ван ных ти пов час то по зво ля ет зна чи тель но умень шить раз мер

функ ций. Один из спо со бов вы яс нить, ка ки ми долж ны быть эти ти пы, – это

най ти при ме ры и оп ре де лить тер ми ны пред мет ной об лас ти до то го, как пи сать

функ цию.

97 этюдов для программистов

Тесты пишутся для людей

Джерард Мезарос

Вы­по­кры­вае­те­ав­то­ма­ти­зи­ро­ван­ны­ми­тес­та­ми­весь го то вый код или его фраг-

мен ты. По здрав ля ем! Пи ше те сна ча ла тес ты, а по том код? Еще луч ше! Уже бла-

го да ря это му вас мож но при чис лить к про грам ми стам, прак ти кую щим пе ре до-

вые под хо ды в раз ра бот ке про грамм но го обес пе че ния. Но хо ро ши ли ва ши тес-

ты? Как это оп ре де лить? Один из спо со бов – спро сить се бя: «А для ко го я пи шу

эти тес ты?». Ес ли от ве том бу дет «я пи шу их для се бя, что бы со кра тить за тра ты

на ис прав ле ние оши бок» или «для ком пи ля то ра, что бы их мож но бы ло вы пол-

нить», то впол не воз мож но, что вы пи ше те не са мые луч шие тес ты. Так для ко го

же нуж но пи сать тес ты? Для то го, кто бу дет пы тать ся по нять ваш код.

Хо ро шие тес ты иг ра ют роль до ку мен та ции для тес ти руе мо го ими ко да. Они опи-

сы ва ют, как ра бо та ет код. Для ка ж до го сце на рия ис поль зо ва ния тес ты де ла ют

сле дую щее:

Опи сы ва ют кон текст, на чаль ную точ ку или пре ду сло вия, ко то рые долж ны

удов ле тво рять ся.

Ил лю ст ри ру ют, как вы зы ва ет ся при ло же ние.

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

про ве рить.

В раз лич ных сце на ри ях ис поль зо ва ния ва ри ан ты этих дей ст вий бу дут слег ка

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

по смот реть на не сколь ко тес тов и, срав нив эти три час ти рас смат ри вае мых тес-

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

по-раз но му. Ка ж дый тест дол жен яс но ил лю ст ри ро вать при чин но-след ст вен ные

свя зи меж ду эти ми тре мя час тя ми.

От сю да сле ду ет, что не ви ди мая часть тес та столь же важ на, как и ви ди мая. Оби-

лие ко да в тес те от вле ка ет вни ма ние чи та те ля на не су ще ст вен ные ме ло чи. По

воз мож но сти скры вай те та кие ме ло чи в по нят ных вы зо вах ме то дов, и в этом вам

здо ро во по мо жет при ем ре фак то рин га Extract Method (Из влечь ме тод). И по ста-

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

Тесты пишутся для людей

211

крет ный сце на рий ис поль зо ва ния, а чи таю ще му тес ты че ло ве ку не при шлось

ана ли зи ро вать ка ж дый тест в по пыт ке по нять, в чем за клю ча ют ся раз ли чия

меж ду сце на рия ми. Во всех слу ча ях имя клас са тес та и имя ме то да клас са долж-

ны со дер жать хо тя бы на чаль ную точ ку и спо соб вы зо ва при ло же ния. Это по зво-

лит про стым про чте ни ем имен ме то дов про ве рить по кры тие ко да тес та ми. В име-

на ме то дов тес тов по лез но бы ва ет вклю чить ожи дае мые ре зуль та ты, ес ли толь ко

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

Тес ти ро вать са ми тес ты – то же хо ро шая идея. Мож но про ве рить, смо гут ли они

об на ру жить ошиб ки, ко то рые долж ны на хо дить, ес ли вве сти эти ошиб ки в про-

из вод ст вен ный (production) код (ра зу ме ет ся, в ло каль ную ко пию ко да, ко то рую

вы по том вы ки не те). Про верь те, что тес ты вы да ют по лез ные и ос мыс лен ные от-

че ты. Нуж но так же про ве рить, что ва ши тес ты го во рят язы ком, по нят ным то му,

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

тес ты про грам ми сту, ко то рый не зна ком с ва шим ко дом, и вы слу шать его впе-

чат ле ния. Ес ли ему что-то не по нят но, не свя зы вай те это с не хват кой ум ст вен-

ных спо соб но стей. Бо лее ве ро ят но, что это вы не су ме ли на пи сать яс ный код.

(По про буй те по ме нять ся ро ля ми и по чи тать его тес ты!)

97 этюдов для программистов

Нужно заботиться о коде

Пит Гудлиф

Не­нуж­но­быть­Шер­ло­ком­Хол­мсом, что бы по нять, что хо ро шие про грам ми сты

пи шут хо ро ший код. Ну, а пло хие – нет. Они соз да ют урод ли вые ве щи, ко то рые

всем ос таль ным при хо дит ся до во дить до ума. Но вы-то хо ти те пи сать хо ро ший

код, прав да? То гда вам нуж но стре мить ся стать хо ро шим про грам ми стом.

Хо ро ший код не воз ни ка ет сам по се бе из ни че го. Его по яв ле ние не вы зва но бла-

го при ят ным рас по ло же ни ем пла нет. Что бы сде лать код хо ро шим, нуж но над

ним ра бо тать, и не ма ло. Вы соз да ди те хо ро ший код толь ко то гда, ко гда дей ст ви-

тель но к это му стре ми тесь.

Хо ро шее про грам ми ро ва ние не яв ля ет ся ре зуль та том од ной лишь тех ни че ской

ком пе тент но сти. Я встре чал очень ум ных про грам ми стов, ко то рые спо соб ны

соз да вать силь ные и впе чат ляю щие ал го рит мы, в со вер шен ст ве зна ют стан дар-

ты сво его язы ка и пи шут при этом со вер шен но от вра ти тель ный код. Его тя же ло

чи тать, с ним тя же ло ра бо тать и его тя же ло мо ди фи ци ро вать. Я встре чал и про-

грам ми стов с бо лее скром ны ми спо соб но стя ми, ко то рые тя го те ют к очень про-

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

ры ми од но удо воль ст вие.

Опыт ра бо ты в от рас ли раз ра бот ки про грамм но го обес пе че ния при вел ме ня

к за клю че нию, что на прак ти ке раз ни ца меж ду про сто ком пе тент ны ми про-

грам ми ста ми и вы даю щи ми ся про грам ми ста ми за клю ча ет ся в од ном: это от но-

ше ние к ра бо те. Хо ро шее про грам ми ро ва ние тре бу ет про фес сио наль но го под хо-

да и стрем ле ния на пи сать как мож но луч ший код с уче том ог ра ни че ний, на кла-

ды вае мых ок ру жаю щей дей ст ви тель но стью и тре бо ва ния ми от рас ли.

Код, ве ду щий в ад, вы мо щен бла ги ми на ме ре ния ми. Что бы стать от лич ным про-

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

за бо ту о ко де – вос пи ты вать в се бе по зи тив ный взгляд на на пи са ние ко да и вы-

ра ба ты вать здо ро вое от но ше ние к ра бо те. Вы даю щий ся код есть плод тща тель-

ных уси лий ис кус ных мас те ров, а не по дел ка, не бреж но сля пан ная про грам ми-

стом, или та ин ст вен ное соз да ние са мо про воз гла шен ных гу ру от ко ди ро ва ния.

Нужно заботиться о коде

213

Вы хо ти те пи сать хо ро ший код. Вы хо ти те быть хо ро шим про грам ми стом. То гда

вы долж ны стре мить ся к сле дую ще му:

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

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

код, кор рект ность ко то ро го оче вид на (и до ка зы ва ет ся хо ро шо на пи сан ны ми

тес та ми).

Вы пи ше те код, дос туп ный для по ни ма ния (дру гие про грам ми сты мо гут бы ст-

ро ра зо брать ся в нем и про дол жить ра бо ту), лег кий в со про во ж де нии (вы или

дру гие про грам ми сты лег ко смо же те мо ди фи ци ро вать его в бу ду щем) и вер-

ный (вы сде ла ли все воз мож ное, что бы по ка зать, что вы дей ст ви тель но ре ши-

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

Вы хо ро шо ла ди те с дру ги ми про грам ми ста ми. Про грам мист не дол жен быть

от шель ни ком. Ред кий про грам мист ра бо та ет в оди ноч ку: боль шин ст во тру-

дит ся в со ста ве ко ман ды про грам ми стов, будь то в рам ках ком па нии или

про ек та с от кры тым ис ход ным ко дом. Вы учи ты вае те осо бен но сти дру гих

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

тесь по мочь ко ман де соз дать как мож но луч ший про дукт, а не по ка зать, ка-

кой вы ум ный.

Ко гда к вам в ру ки по па да ет код, вы ста рае тесь, что бы по сле вас он стал не-

мно го луч ше (луч ше ор га ни зо ван, луч ше про тес ти ро ван, бо лее по ня тен…).

Вы лю би те код и про грам ми ро ва ние, по это му вы по сто ян но изу чае те но вые

язы ки, идио мы и но вые прие мы. Но при ме няе те их толь ко то гда, ко гда это

уме ст но.

К сча стью, вы чи тае те эти со ве ты по то му, что дей ст ви тель но лю би те код. Вам это

ин те рес но. Это ва ше ув ле че ние. По лу чай те удо воль ст вие от про грам ми ро ва ния.

Ра дуй тесь, на пи сав код для ре ше ния слож ной за да чи. Пи ши те про грам мы, ко-

то ры ми мож но гор дить ся.

97 этюдов для программистов

Ваши заказчики имеют

в виду не то, что говорят

Нэйт Джексон

Я­еще­не­встре­чал­за­каз­чи­ка, ко то рый не был бы рад воз мож но сти рас ска зать

мне, что ему нуж но – обыч но до мель чай ших под роб но стей. Про бле ма в том, что

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

они го во рят на сво ем язы ке за каз чи ков, а не на язы ке раз ра бот чи ков. У них свой

сло варь и свой кон текст. Они опус ка ют важ ные де та ли. Они го во рят так, буд то

вы то же про ра бо та ли в их ком па нии лет два дцать. А ос лож ня ет ся это все тем,

что на са мом де ле за каз чи ки час то са ми не зна ют, что им нуж но! У од них есть

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

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

зна ют, че го им не нуж но. Так как же мож но раз ра бо тать про грамм ный про ект

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

дос та точ но прост. Нуж но боль ше взаи мо дей ст во вать с за каз чи ком.

На чи най те за да вать сво им за каз чи кам во про сы как мож но рань ше, и за да вай те

во про сы ча ще. Не сто ит по вто рять их же сло ва ми то, что они ска за ли о сво их по-

же ла ни ях. Пом ни те: они име ли в ви ду не то, что ска за ли вам. Я час то про во жу

та кую про вер ку: в раз го во ре с за каз чи ком за ме няю тер ми ны за каз чи ка свои ми

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

за каз чик име ет смысл, со вер шен но от лич ный от тер ми на кли ент. Тем не ме нее

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

счи та ет эти сло ва взаи мо за ме няе мы ми и уве рен, что вы по ни мае те, ка кой свой

ста тус он име ет в ви ду в кон крет ный мо мент. А вас это дез ори ен ти ру ет, и ка че ст-

во ва шей про грам мы стра да ет.

Об су ж дай те ра бо чие те мы со свои ми за каз чи ка ми бес чис лен ное ко ли че ст во раз

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

бу ет ся. По про буй те вме сте с ни ми пе ре фор му ли ро вать за да чу два-три раза. Об су-

ж дай те с ни ми то, что про ис хо дит не по сред ст вен но пе ред вы пол не ни ем за да чи,

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

есть воз мож ность, об су ди те ту же те му с раз ны ми людь ми в раз ное вре мя. Рас-

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

Ваши заказчики имеют в виду не то, что говорят

215

Рас ска зы вая об од ном и том же, два че ло ве ка час то про ти во ре чат друг дру гу. Луч-

ше все го ра зо брать ся с эти ми рас хо ж де ния ми, пре ж де чем при сту пать к сверх-

слож ной за да че раз ра бот ки.

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

как дос ка во вре мя со ве ща ния или про стой ма кет на ста дии про ек ти ро ва ния, ли-

бо та кие слож ные, как дей ст вую щий про то тип. Об ще из ве ст но, что ис поль зо ва-

ние на гляд ных средств во вре мя об су ж де ния по мо га ет удер жать вни ма ние и за-

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

пе чить ус пех сво его про ек та.

В преж нюю эпо ху сво ей жиз ни мне до ве лось по ра бо тать «муль ти ме дий ным про-

грам ми стом» в ко ман де, вы пус кав шей гла мур ные про дук ты. Од на на ша за каз-

чи ца очень под роб но опи са ла, как она пред став ля ет се бе внеш ний вид про ек та.

Цве то вая схе ма, об су ж дав шая ся на про ект ных со ве ща ни ях, пред по ла га ла про-

ве де ние пре зен та ции на чер ном фо не. Мы ду ма ли, что все ого во ре но. Це лые ко-

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

лов. Уй му вре ме ни мы уби ли на фор ми ро ва ние ко неч но го про дук та. В тот день,

ко гда мы по ка за ли кли ент ке пло ды сво его тру да, нас жда ла оше ло ми тель ная

но вость. Уви дев про дукт и цвет фо на, она про из нес ла: «Ко гда я го во ри ла „чер-

ный“, я име ла в ви ду „бе лый“». Как ви ди те, «чер ное» не все гда зна чит «чер ное».

97 этюдов для программистов

97 этюдов для программистов

Авторы

Алан Гриффитс (Alan Griffiths)

Алан Гриф фитс про шел че рез мно гие мод ные по вет рия в про цес сах

раз ра бот ки, тех но ло ги ях и язы ках про грам ми ро ва ния. За эти го ды

он соз дал ра бо то спо соб ные про грам мы и про цес сы раз ра бот ки для

мно гих ор га ни за ций, пе ча тал ся в ря де жур на лов, вы сту пал на кон-

фе рен ци ях и под ру жил ся со мно ги ми людь ми. Твер до убе ж ден ный

в том, что здра вый смысл – ред кий и цен ный ры ноч ный то вар, Алан сей час ра-

бо та ет не за ви си мым кон суль тан том в соб ст вен ной ком па нии Octopull Limited.

«Не полагайтесь на “автоматические чудеса”», стр. 78

Алекс Миллер (Alex Miller)

Алекс Мил лер – тех ни че ский ру ко во ди тель и ин же нер в Terracotta,

Inc., спе циа ли зи рую щей ся на раз ра бот ке ре ше ний кла сте ри за ции

с от кры тым ис ход ным ко дом на Java. До Terracotta Алекс ра бо тал

в BEA Systems над ли ней кой про дук тов AquaLogic и был глав ным

ар хи тек то ром в MetaMatrix. В сфе ру его ин те ре сов по па да ют Java,

кон ку рент ные вы чис ле ния, рас пре де лен ные сис те мы, язы ки за про сов и про ек-

ти ро ва ние про грамм но го обес пе че ния.

Алекс с удо воль ст ви ем ве дет свой блог http://tech.puredanger.com. Вме сте с дру ги-

ми раз ра бот чи ка ми Terracotta он на пи сал вы пу щен ное в 2008 го ду «The De fi ni-

ti ve Guide to Terracotta» (Пол ное ру ко во дство по Terracotta), Apress. Алекс час то

вы сту па ет на встре чах поль зо ва те лей и кон фе рен ци ях и яв ля ет ся од ним из ос но-

ва те лей кон фе рен ции Strange Loop в Сент-Льюи се ( http://thestrangeloop.com).

«Сначала скажите “да”», стр. 174

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

Авторы

217

Аллан Келли (Allan Kelly)

Ал лан Кел ли – про фес сио нал в об лас ти раз ра бот ки про грамм но го

обес пе че ния, но сей час ра бо та ет в ро ли ме нед же ра ко ман ды раз ра-

бот ки. Он по мо га ет ко ман дам раз ра бот чи ков по вы шать эф фек тив-

ность сво его тру да и вне дрять ме то ды гиб ко го про грам ми ро ва ния.

Ал лан ра бо та ет в Лон до не, пред ла га ет мел ким и круп ным ком па ни-

ям ус лу ги по обу че нию, ко учин гу и кон суль ти ро ва нию.

Ал лан час то пуб ли ку ет ся в жур на лах, по яв ля ет ся на кон фе рен ци ях и яв ля ет ся

со ав то ром «Changing Software Development: Learning to Be Agile» (John Wiley &

Sons). У Кел ли сте пень ба ка лав ра по ин фор ма ти ке и MBA по ад ми ни ст ри ро ва-

нию. В на стоя щее вре мя он пи шет кни гу о шаб ло нах биз нес-стра те гий для ком-

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

на сай те http://www.allankelly.net.

«Прежде чем пенять на других, проверь собственный код», стр. 38

«Две ошибки могут гасить одна другую (и тогда их трудно исправлять)», стр. 192

Андерс Норас (Anders Nora°s)

Ан дерс Но рас – за ка лен ный раз ра бот чик про грамм но го обес пе че ния

и ора тор. «Эн тер прайз ность» EJB под толк ну ла его к Microsoft .NET

в 2002 го ду. Он бы ст ро про сла вил ся в со об ще ст ве Microsoft, по сколь-

ку опыт ра бо ты с Java дал ему хо ро шую фо ру. В 2006 он вос ста но вил

свои от но ше ния с быв шей лю бо вью – Java, и се го дня он – по ли глот,

от би раю щий луч шие ре ше ния обе их плат форм для соз да ния бо лее ка че ст вен-

ных про грамм. Ан дерс – ос но ва тель про ек та Quaere и уча ст ник не сколь ких про-

ек тов с от кры тым ис ход ным ко дом. Он вы сту па ет на мно гих кон фе рен ци ях

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

ко да. Ан дерс жи вет в Нор ве гии, где ра бо та ет глав ным тех но ло ги че ским еван ге-

ли стом в Objectware. Ве дет свой блог по ад ре су http://andersnoras.com.

«Не просто учите язык, поймите его культуру», стр. 74

Анн Кэтрин Гэгнат (Ann Katrin Gagnat)

Анн Кэт рин Гэг нат че ты ре го да ра бо та ет с Java и за ни ма ет долж-

ность сис тем но го раз ра бот чи ка в Steria AS в Нор ве гии. Про фес сио-

наль но ин те ре су ет ся гиб кой раз ра бот кой, шаб ло на ми и на пи са ни ем

лег ко чи тае мо го ко да.

«Программируйте парами и входите в поток», стр. 148

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

218

Авторы

Аслам Хан (Aslam Khan)

Ас лам Хан боль ше по ло ви ны сво ей жиз ни за ни мал ся соз да ни ем

про грамм но го обес пе че ния. Он по-преж не му ве рит, что ис ти на за-

клю ча ет ся в ис пол няе мом ко де, но трез во урав но ве ши ва ет эту ве ру

дру гим сво им ба зо вым прин ци пом: лю ди важ нее ком пи ля то ров. Как

ар хи тек тор про грамм но го обес пе че ния и ин ст рук тор Ас лам за ни ма-

ет ся тем, что по мо га ет ко ман дам про ек ти ро вать и вы пус кать хо ро шее про грамм-

ное обес пе че ние, не упус кая при этом воз мож но сти раз вле кать ся и за во дить хо-

ро ших дру зей. Ас лам вхо дит в ко ман ду factor10 и ра бо та ет ре дак то ром в со об ще-

ст ве ар хи тек то ров на DZone. Ад рес его бло га: http://aslamkhan.net.

«Написание кода в духе Убунту для друзей», стр. 194

Берк Хафнагель (Burk Hufnagel)

С 1978 го да Берк Хаф на гель как ар хи тек тор и раз ра бот чик про-

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

ва тель ских ин тер фей сов. Про ве дя боль шую часть сво ей жиз ни за

про ек ти ро ва ни ем и соз да ни ем про грамм, Берк вы ра бо тал при выч ку

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

Он – биб лио фил и тех но фил, ин те ре су ет ся эзо те ри че ской те ма ти кой.

Берк был од ним из со ав то ров кни ги «97 Things Every Software Architect Should

Know»1, O’Reilly. Он вы сту пал в 2008 го ду на кон фе рен ции JavaOne с ре чью, по-

свя щен ной улуч ше нию ус ло вий ра бо ты поль зо ва те ля, и на ре гио наль ных кон-

фе рен ци ях Ме ж ду на род ной ас со циа ции про грамм ных ар хи тек то ров в 2007

и 2009 го дах. Он так же на пи сал ста тью для биб лио те ки IASA Skills Library на

те му «не за мет но го сло на», а имен но свя зи меж ду опы том взаи мо дей ст вия поль-

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

«Невероятно, но факт: тестировщики – ваши друзья», стр. 140

«Брось мышь и медленно отойди от клавиатуры», стр. 158

Верити Стоб (Verity Stob)

Ве ри ти Стоб – это псев до ним про грам ми ст ки, жи ву щей в Лон до не.

Хо тя она де мон ст ри ру ет зна ние C++ и обыч ных ин тер пре ти руе мых

язы ков с фи гур ны ми скоб ка ми, а так же про ек ти ру ет и пи шет код

для раз лич ных плат форм, по жа луй, наи бо лее удач ны и без вред ны

ее про грам мы для Windows, на пи сан ные на CodeGear Delphi.

Свы ше 20 лет Ве ри ти пи са ла яко бы за ни ма тель ные ста тьи и ко лон ки для раз-

ных жур на лов, га зет и веб-сай тов, вклю чая ле ген дар ный (т. е. дав но по чив ший)

1

Сбор ник «97 этю дов для ар хи тек то ров про грамм ных сис тем», Сим вол-Плюс, 2010.

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

Авторы

219

«.EXE Magazine», раз би ваю щий об щие пред став ле ния (т. е. по чив ший не сколь-

ко позд нее) «Dr. Dobb’s Journal» и не при стой ный (т. е. дей ст ви тель но при но ся-

щий до ход) «The Register». В 2005 го ду она опуб ли ко ва ла со б ра ние сво их тру дов

под на зва ни ем «The Best of Verity Stob» (Apress), дос тиг нув тем са мым глав ной

це ли сво ей жиз ни – два ж ды по лу чить го но рар за од ну и ту же ра бо ту.

Ве ри ти счи та ет по свя щен ную ей в Ви ки пе дии ста тью ка ри ка ту рой на крат кость.

«Не прибивайте программу гвоздями к стене», стр. 76

Грег Колвин (Greg Colvin)

Грег Кол вин ус пеш но за ни ма ет ся «ко де жом» с 1972 го да. В сво бод-

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

гу ля ет со сво ей со ба кой по пля жу или иг ра ет блюз в ме ст ных ка бач-

ках.

«Знай свои возможности», стр. 112

Грегор Хоп (Gregor Hohpe)

Гре гор Хоп – ин же нер-про грам мист, ра бо таю щий в Google. Из вест-

ность при об рел бла го да ря сво им иде ям на счет асин хрон ной пе ре да-

чи со об ще ний и сер вис но-ори ен ти ро ван ной ар хи тек ту ры, ко то ры ми

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

«En ter pri se Integration Patterns»1 (Addison-Wesley Professional). По-

д роб нее о его ра бо те мож но уз нать на сай те http://www.eaipatterns.com.

«Удобство – не атрибут качества», стр. 58

Гудни Хаукнес (Gudny Hauknes)

Гуд ни Ха ук нес – ве ду щий раз ра бот чик про грамм но го обес пе че ния

в нор веж ском от де ле нии кон суль та тив ной фир мы Steria. За кон чив

в 1987 го ду Нор веж ский Тех но ло ги че ский уни вер си тет (NTH/NTNU),

она за ни ма ла раз лич ные долж но сти в сис тем ных раз ра бот ках, управ-

ле нии про ек та ми и кон тро ле ка че ст ва.

Осо бен но ее ин те ре су ют спо со бы ор га ни за ции спо кой ной со вме ст ной ра бо ты, при-

ят ной и эф фек тив ной, а так же, ра зу ме ет ся, соз да ние ка че ст вен но го про грамм но-

го обес пе че ния.

«Программируйте парами и входите в поток», стр. 148

1

Гре гор Хоп, Боб би Вульф «Шаб ло ны ин те гра ции кор по ра тив ных при ло же ний». –

Пер. с англ. – Виль ямс, 2007.

97 этюдов для программистов

97 этюдов для программистов

220

Авторы

Диомидис Спинеллис (Diomidis Spinellis)

Дио ми дис Спи нел лис – про фес сор фа куль те та нау ки и тех но ло гии

управ ле ния в Уни вер си те те эко но ми ки и биз не са го ро да Афи ны, Гре-

ция. Он ве дет ис сле до ва ния в об лас ти раз ра бот ки про грамм но го обес-

пе че ния, ком пь ю тер ной без опас но сти и язы ков про грам ми ро ва ния.

Ав тор двух от ме чен ных на гра да ми книг из се рии «Open Source Per-

spective»: «Code Reading: The Open Source Perspective»1 и «Code Quality» (обе из да-

ны в Addison-Wesley Professional), а так же де сят ков на уч ных ста тей. Его по след-

няя ра бо та – сбор ник «Beautiful Architecture»2 (O’Reilly). Дио ми дис вхо дит в ред-

кол ле гию IEEE Software и ве дет по сто ян ную ко лон ку «Tools of the Tra de». Он уча-

ст ву ет в раз ра бот ке FreeBSD, а так же UMLGraph и дру гих про грамм ных па ке тов,

биб лио тек и ин ст ру мен тов с от кры тым ис ход ным ко дом. По лу чил сте пень ма ги-

ст ра в об лас ти раз ра бот ки ПО и док то ра ин фор ма ти ки в Им пер ском кол лед же

Лон до на. Дио ми дис – старший член ACM и IEEE, а так же член Usenix Association.

«Место для больших наборов взаимосвязанных данных – в базе данных», стр. 116

«Держите все в системе управления версиями», стр. 156

«Утилиты UNIX – ваши друзья», стр. 196

Джанет Грегори (Janet Gregory)

Со ав тор «Agile Testing: A Practical Guide for Agile Testers and Teams»

(Addison-Wesley Professional), Джа нет Гре го ри – кон суль тант, по мо-

гаю щий ко ман дам соз да вать ка че ст вен ные сис те мы с по мо щью ме-

то дов гиб ко го про грам ми ро ва ния. Джа нет жи вет и ра бо та ет в Ка на-

де, и ее глав ная страсть – вне дре ние гиб ких ме то дов соз да ния ка че-

ст вен но го про грамм но го обес пе че ния. В ка че ст ве ин ст рук то ра и тес ти ров щи ка

она по мо га ла ком па ни ям вне дрять прак ти ки гиб ко го про грам ми ро ва ния и ус-

пеш но пе ре ве ла не сколь ко ко манд тра ди ци он но го тес ти ро ва ния в мир гиб ко го

про грам ми ро ва ния. Ее цель – по мочь биз нес-поль зо ва те лям и тес ти ров щи кам

осоз нать свою роль в про ек тах с гиб ким про грам ми ро ва ни ем. Джа нет чи та ет

кур сы на те му гиб ко го тес ти ро ва ния и час то вы сту па ет на меж ду на род ных кон-

фе рен ци ях, по свя щен ных гиб ко му про грам ми ро ва нию и тес ти ро ва нию. По-

дроб но сти см. по ад ре су http://janet gre go ry.ca.

«Когда программисты и тестировщики сотрудничают», стр. 204

1

Дио ми дис Спи нел лис «Ана лиз про грамм но го ко да на при ме ре про ек тов Open Sour-

ce». – Пер. с англ. – Виль ямс, 2004.

2

Дио ми дис Спи нел лис, Ге ор ги ос Гу си ос «Иде аль ная ар хи тек ту ра. Ве ду щие спе циа ли-

сты о кра со те про грамм ных ар хи тек тур». – Пер. с англ. – СПб.: Сим вол-Плюс, 2010.

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

Авторы

221

Джейсон П. Сэйдж (Jason P. Sage)

Джей сон П. Сэйдж – кон суль тант по ком пь ю те рам и вла де лец пред-

при ятия. Его ос нов ные ин те ре сы – сис тем ное про ек ти ро ва ние, ин те-

гра ция, управ ле ние от но ше ния ми с кли ен та ми (CRM), ори ги наль-

ное сер вер ное про грамм ное обес пе че ние, об ра бот ка дан ных и про-

грам мы для трех мер ной гра фи ки. Джей сон – на стоя щий эн ту зи аст

про грам ми ро ва ния; он от пра вил ся в свое пу те ше ст вие в 1981 го ду в воз рас те

10 лет при по мо щи Timex Sinclair с дву мя ки ло бай та ми па мя ти и кас сет ным

маг ни то фо ном. За про шед шее вре мя он на пи сал мно же ст во раз но об раз ных про-

грамм, на чи ная с игр и кон чая опе ра ци он ной сис те мой для про грамм но го обес-

пе че ния управ ле ния склад ски ми за па са ми в од ной из круп ней ших ком па ний

стра ны, тор гую щей про до воль ст вен ны ми то ва ра ми. Он час то по яв ля ет ся в се те-

вых фо ру мах, по мо гая кол ле гам-про грам ми стам и уча щим ся раз но го воз рас та.

«Почаще изобретайте колесо», стр. 164

Джерард Мезарос (Gerard Meszaros)

Дже рард Ме за рос – не за ви си мый кон суль тант, ин ст рук тор и пре по-

да ва тель в об лас ти про грамм но го обес пе че ния с 25-лет ним опы том

соз да ния про грамм и поч ти 10-лет ним опы том при ме не ния ме то дов

гиб ко го про грам ми ро ва ния, та ких как Scrum, eXtreme Programming

и Lean. Он ре гу ляр но вы сту па ет на та ких кон фе рен ци ях по раз ра бот-

ке и тес ти ро ва нию про грамм но го обес пе че ния, как OOPSLA, Agile200x и STAR.

На пи сал кни гу «xUnit Test Patterns: Refactoring Test Code»1 (Addison-Wes ley)

и ве дет сайт http://xunitpatterns.com.

«Тесты пишутся для людей», стр. 210

Джованни Аспрони (Giovanni Asproni)

Джо ван ни Ас про ни – не за ви си мый контр агент и кон суль тант, про-

жи ваю щий в Ве ли ко бри та нии. Не смот ря на то, что он час то ра бо та-

ет ар хи тек то ром, ру ко во ди те лем ко ман ды, пре по да ва те лем или на-

став ни ком, в ду ше он ос та ет ся про грам ми стом, ко то рый пред по чи-

та ет про стой код. Он ре гу ляр но вы сту па ет на кон фе рен ци ях, вхо дит

в ко ми тет кон фе рен ции London XPDay и ру ко во дит кон фе рен ци ей ACCU. Джо-

ван ни яв ля ет ся чле ном ACCU, AgileAlliance, ACM и IEEE.

«Тщательно выбирайте инструменты», стр. 40

«Учитесь делать оценки», стр. 120

1

Дже рард Ме за рос «Шаб ло ны тес ти ро ва ния xUnit. Ре фак то ринг ко да тес тов». – Пер.

с англ. – Виль ямс, 2009.

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

222

Авторы

Джон Джаггер (Jon Jagger)

Джон Джаг гер – не за ви си мый кон суль тант/ин ст рук тор/про грам-

мист/на став ник/эн ту зи аст, спе циа ли зи рую щий ся на гиб ком про-

грам ми ро ва нии (лю ди и про цесс), раз ра бот ке на ос но ве тес тов, UML,

про ек ти ро ва нии, ана ли зе, объ ект но-ори ен ти ро ва нном программи-

ровании и язы ках с фи гур ны ми скоб ка ми (C#, C, C++, Java). Он член

бри тан ской ко мис сии по C, быв ший член бри тан ской ко мис сии по C++, а так же

член и глав ный экс перт (PUKE – Principal UK Expert) бри тан ской ко мис сии по

ECMA-стан дар ти за ции C#.

Джон так же при ду мал иг ру «Average Time To Green», опуб ли ко вал мно же ст во

ста тей в Ин тер не те и жур на лах и вы сту пил со ав то ром двух книг: «Microsoft®

Visu al C#® .NET Step by Step» (Microsoft Press) и «C# Annotated Standard»

(Morgan Ka uf mann).

Джон же нат на пре ле ст ной На та ли, он сча ст ли вый отец Эл ли, Пен ни и Пат ри ка.

Бе зум но ув ле ка ет ся ры бал кой в про точ ной во де.

«Больше осознанной практики», стр. 64

«Пусть невидимое станет более видимым», стр. 132

Дэн Берг Джонссон (Dan Bergh Johnsson)

Дэн Берг Джонс сон – ве ду щий кон суль тант, парт нер и офи ци аль ный

пред ста ви тель Omegapoint AB. Эн ту зи аст про ек ти ро ва ния на ос но ве

пред мет ной об лас ти, дав ний по клон ник гиб ко го про грам ми ро ва ния,

на след ник тра ди ций ис кус ст ва в про грам ми ро ва нии и «шко лы раз-

ра бот ки OOPSLA». Один из ос но ва те лей швед ской груп пы пред мет но-

ори ен ти ро ван но го про ек ти ро ва ния DDD Sverige, ре гу ляр но уча ст ву ет в ра бо те

http://domaindrivendesign.org/ и час то вы сту па ет на меж ду на род ных кон фе рен-

ци ях. О сво ей люб ви к про фес сии он рас ска зы ва ет в бло ге «Dear Junior: Letters

to a Junior Programmer» по ад ре су http://dearjunior.blogspot.com.

«Отличайте исключения в бизнес-логике от технических», стр. 62

«Знай, что сохранишь в репозиторий», стр. 114

Дэн Норт (Dan North)

Дэн Норт пи шет про грам мы и кон суль ти ру ет ко ман ды по ме то дам

гиб ко го и уп ро щен но го про грам ми ро ва ния. Он ста вит во гла ву уг ла

хо ро шее от но ше ние к лю дям и на пи са ние про стых, прак тич ных

про грамм. Он так же счи та ет, что боль шин ст во про блем, с ко то ры ми

стал ки ва ют ся ко ман ды, вы зва но пло хо на ла жен ным об ще ни ем –

как, впро чем, и все ос таль ные про бле мы то же.

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

Авторы

223

По это му он уде ля ет та кое вни ма ние «пра виль но му вы бо ру слов» и так ув ле чен

раз ра бот кой на ос но ве по ве де ния, про бле ма ми об ме на ин фор ма ци ей и ме то да ми

обу че ния. Дэн ра бо та ет в IT-от рас ли с мо мен та окон ча ния уче бы в 1991 го ду

и ино гда пи шет в бло ге http://dannorth.net.

«Пишите код на языке предметной области», стр. 42

Дэниэл Линднер (Daniel Lindner)

Дэ ни эл Линд нер раз ра ба ты вал про грамм ное обес пе че ние в те че ние

15 лет – как ра ди де нег, так и за ин те рес (про ек ты с от кры тым ис ход-

ным ко дом). Яв ля ет ся од ним из ос но ва те лей ком па нии по раз ра бот-

ке про грамм но го обес пе че ния в Кар лс руэ (Гер ма ния) и чи та ет лек-

ции по раз ра бот ке про грамм но го обес пе че ния. Он так же уча ст ву ет

в об ще ст вен ной жиз ни.

«Пусть ваш проект говорит сам за себя», стр. 124

Жиль Колборн (Giles Colborne)

Жиль Кол борн в те че ние двух де ся ти ле тий за ни мал ся во про са ми эр-

го но ми ки в British Aerospace, Institute of Physics Publishing и Euro

RSCG. За это вре мя он про вел сот ни ча сов, на блю дая за поль зо ва те-

ля ми в ла бо ра тор ных и ре аль ных ус ло ви ях. В 2004 го ду он ос но вал

cxpartners – про ект ную ком па нию, ори ен ти ро ван ную на поль зо ва-

те ля, ко то рая ис сле ду ет по ве де ние поль зо ва те ля и про ек ти ру ет поль зо ва тель-

ские ин тер фей сы для за каз чи ков со все го све та, вклю чая Nokia, Marriott и eBay.

Кол борн был пре зи ден том бри тан ской ас со циа ции про фес сио на лов в об лас ти

юза би ли ти в те че ние 2003–2007 го дов и ра бо тал в Бри тан ском ин сти ту те стан-

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

дос ту па.

«Выясните, как поступит пользователь (и вы – не пользователь)», стр. 26

«Предотвращайте появление ошибок», стр. 152

Йехиль Кимхи (Yechiel Kimchi)

Йе хиль Ким хи – ма те ма тик (док тор ская сте пень Ев рей ско го уни вер-

си те та в Ие ру са ли ме за ра бо ту в тео рии мно жеств), ис сле до ва тель

в об лас ти ин фор ма ти ки (бо лее 10 лет пре по да ет на фа куль те те ин-

фор ма ти ки в Тех нио не, Из ра иль) и раз ра бот чик про грамм но го обес-

пе че ния – бо лее 15 лет ра бо та ет на боль шие «хай-те ков ские» ком па-

нии и как кон суль тант в соб ст вен ной не боль шой фир ме.

97 этюдов для программистов

97 этюдов для программистов

224

Авторы

На чав пи сать на C, а по том пе рей дя на C++, он ин те ре су ет ся ООП и спо со ба ми

раз ра бот ки про грамм, ко то рые бы ли бы од но вре мен но кор рект ны ми, лег ки ми

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

эф фек тив но го ре ше ния NP-слож ных за дач, но сво им ве ли чай шим дос ти же ни ем

счи та ет влия ние, ока зан ное на тех ни че ское об ра зо ва ние ты сяч из ра иль ских ин-

же не ров-про грам ми стов.

«Пиши код с умом», стр. 50

Йорн Ольмхейм (Jo/rn Ølmheim)

Йорн Ольм хейм про фес сио наль но за ни ма ет ся про грам ми ро ва ни ем

уже бо лее 10 лет: по ра бо тал и раз ра бот чи ком, и ар хи тек то ром, и ав-

то ром/док лад чи ком. В на стоя щее вре мя ра бо та ет в Statoil, соз да вая

про грамм ное обес пе че ние для ря да ис сле до ва тель ских про ек тов –

в ос нов ном с ис поль зо ва ни ем Java, Ruby и Python, а ино гда до бав ляя

Fort ran и C/C++, ес ли тре бу ют ся вы со ко ско ро ст ные вы чис ле ния. В чис ле его

глав ных ин те ре сов – прак ти ка гиб ко го про грам ми ро ва ния с упо ром на мас тер-

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

В сво бод ное вре мя Йорн ув ле ка ет ся лы жа ми, гор ным ве ло си пе дом и об ще ни ем

со свои ми близ ки ми.

«Красота – следствие простоты», стр. 30

Йоханнес Бродуолл (Johannes Brodwall)

Йо хан нес Бро ду олл – ведущий на уч ный спе циа лист нор веж ско го от-

де ле ния кон суль та тив ной ком па нии Steria. Он лю бит взгля нуть на

про ект с об щей точ ки зре ния, что бы по нять, как со че та ние раз лич-

ных дис ци п лин и тех но ло гий мо жет (и мо жет ли) пред став лять цен-

ность для поль зо ва те лей про грамм ных сис тем. Он ак тив но уча ст ву-

ет в ра бо те со об ще ст ва гиб кой раз ра бот ки в Ос ло. Боль ше все го вре ме ни от ни ма-

ют у не го Oslo Extreme Programming Meetup и еже год ные кон фе рен ции Smidig

200x ( smidig на нор веж ском оз на ча ет «agile» – гиб кий). Он ре гу ляр но вы сту па ет

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

грамм но го обес пе че ния в сво ем бло ге по ад ре су http://johannesbrodwall.com.

«Сборка должна быть чистой», стр. 104

«Многословный журнал лишит вас сна», стр. 200

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

Авторы

225

Кари Россланд (Kari Ro/ssland)

Ка ри Росс ланд – раз ра бот чик про грамм но го обес пе че ния в нор веж-

ском от де ле нии кон суль та тив ной ком па нии Steria. За три го да, про-

шед шие по сле по лу че ния сте пе ни ма ги ст ра ин фор ма ти ки в NTNU

(Трон хейм, Нор ве гия), Ка ри при ня ла уча стие в не сколь ких про ек тах.

Ее осо бен но ин те ре су ют гиб кая раз ра бот ка и при ят ное и эф фек тив-

ное со труд ни че ст во меж ду уча ст ни ка ми про грамм ных про ек тов.

«Программируйте парами и входите в поток», стр. 148

Карианне Берг (Karianne Berg)

Ка ри ан не Берг по лу чи ла ди плом ма ги ст ра в Уни вер си те те Бер ге на,

Нор ве гия, и в дан ное вре мя ра бо та ет в нор веж ской кон суль та ци он-

ной фир ме Objectware. Ей нра вит ся по мо гать лю дям дос ти гать ус пе-

ха в раз ра бот ке; она уча ст ву ет в ор га ни за ции кон фе рен ций ROOTS

и Smidig, а так же Oslo XP Meetup. Ка ри ан не вы сту па ла на не сколь-

ких кон фе рен ци ях, и по след ний раз ее ви де ли на Smidig 2009. Ос нов ные сфе ры

ее ин те ре сов вклю ча ют гиб кую раз ра бот ку, шаб ло ны и фрейм ворк Spring.

«Читайте код», стр. 160

Кевлин Хенни (Kevlin Henney)

Кев лин Хен ни – не за ви си мый кон суль тант и ин ст рук тор. В ос нов ном

он за ни ма ет ся шаб ло на ми и ар хи тек ту рой, прие ма ми про грам ми ро-

ва ния и язы ка ми, про цес са ми и прак ти кой раз ра бот ки. Вел ко лон ки

в раз ных жур на лах и се те вых из да ни ях, вклю чая «The Re gis ter»,

«Better Software», «Java Report», «CUJ» и «C++ Report». Кев лин – со-

ав тор двух книг се рии «Pattern-Oriented Software Architecture» (Ар хи тек ту ра

ПО, ори ен ти ро ван ная на шаб ло ны): «A Pattern Language for Dis tri bu ted Com pu-

ting» и «On Patterns and Pattern Languages» (Wiley). Он так же уча ст во вал в на-

пи са нии кни ги «97 Things Every Software Architect Should Know»1.

«Комментируйте только то, о чем не скажет код», стр. 54

«Тестируйте требуемое, а не случайное поведение», стр. 180

«Тестируйте точно и конкретно», стр. 182

1

Сбор ник «97 этю дов для ар хи тек то ров про грамм ных сис тем». – Пер. с англ. – СПб.:

Сим вол-Плюс, 2010.

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

226

Авторы

Кейт Брэйтуэйт (Keith Braithwaite)

Кейт Брэй ту эйт – один из глав ных кон суль тан тов Zuhlke. Он так же

ру ко во дит в этой ор га ни за ции Цен тром прак ти ки гиб ко го про грам-

ми ро ва ния. Эта груп па осу ще ст в ля ет обу че ние, ин ст рук ти ро ва ние,

на став ни че ст во, сис тем ное про грам ми ро ва ние и пря мо ли ней ную

раз ра бот ку с це лью уси ле ния спо соб но стей кли ент ских ко манд. Кейт

за ни мал ся со про во ж де ни ем ком пи ля то ров, мо де ли ро ва ни ем се тей GSM и пор ти-

ро ва ни ем сис тем спут ни ко вой на ви га ции для стар та пов, про мыш лен ных ком па-

ний и гло баль ных сер вис ных ор га ни за ций. Он за ра ба ты вал день ги на пи са ни ем

ко да на C, C++, Java, Python и Smalltalk. Кейт все бо лее со сре до то чи ва ет ся на ис-

поль зо ва нии «про ве рен ных при ме ров» или «ав то ма ти зи ро ван ных тес тов» как

эф фек тив ных ин ст ру мен тов для сбо ра и ана ли за тех ни че ских тре бо ва ний, сис-

тем но го про ек ти ро ва ния и управ ле ния про ек та ми.

Его блог см. по ад ре су http://peripateticaxiom.blogspot.com; его пре зен та ции на

кон фе рен ци ях мож но най ти здесь: http://www.keithbraithwaite.demon.co.uk/pro-

fes sional/presentations/.

«Читайте гуманитарные книги», стр. 162

«Пишите маленькие функции на основе примеров», стр. 208

Кирк Пеппердин (Kirk Pepperdine)

Кирк Пеп пер дин ра бо та ет не за ви си мым кон суль тан том и пред ла га-

ет ус лу ги, свя зан ные с оп ти ми за ци ей про из во ди тель но сти ко да на

Java. Пре ж де чем уг лу бить ся в Java, Кирк раз ра ба ты вал и до во дил

до ума сис те мы, на пи сан ные на C/C++, Smalltalk и ря де дру гих язы-

ков. Кирк на пи сал мно го ста тей и вы сту пал на ря де кон фе рен ций,

по свя щен ных на строй ке про из во ди тель но сти. Он спо соб ст во вал пре вра ще нию

http://www.javaperformancetuning.com в ре сурс, по свя щен ный ин фор ма ции и ре-

ко мен да ци ям по на строй ке про из во ди тель но сти.

«Упущенные возможности применения полиморфизма», стр. 138

«Путь к повышению эффективности программ заминирован грязным кодом»,

стр. 168

«WET размазывает узкие места производительности», стр. 202

Клаус Маркардт (Klaus Marquardt)

Опыт Клау са Мар кард та в раз ра бот ке про грамм но го обес пе че ния

вклю ча ет в се бя сис те мы жиз не обес пе че ния, меж ду на род ные про ек-

ты, фрейм вор ки и ли ней ки про дук тов, а так же гиб кую раз ра бот ку на

ре жим ных объ ек тах. Он опи сал ряд ди аг но зов и те ра пев ти че ских

мер для про грамм ных сис тем ис хо дя из соб ст вен но го ин те ре са к вза-

97 этюдов для программистов

97 этюдов для программистов

Авторы

227

им но му влия нию тех но ло гий, лю дей, про цес сов и ор га ни за ции; их мож но най ти

на сай те http://www.sustainable-architecture.eu. Кро ме то го, Кла ус лю бит соз да вать

шаб ло ны, вес ти на кон фе рен ци ях встре чи, где ис сле ду ют ся но вые воз мож но сти,

и ин те ре со вать ся в жиз ни чем-то еще по ми мо про грам ми ро ва ния.

«Учите иностранные языки», стр. 118

«Долговечность временных решений», стр. 128

Клинт Шэнк (Clint Shank)

Клинт Шэнк – раз ра бот чик про грамм но го обес пе че ния, кон суль тант

и на став ник в Sphere of Influence, Inc. – ком па нии, ко то рая ли ди ру ет

в про ект ных ин но ва ци ях, при ме няя не стан дарт ные под хо ды для

соз да ния не ве ро ят ных про грамм, по тря саю щих во всех смыс лах.

Обыч но он кон суль ти ру ет по во про сам про ек ти ро ва ния и кон ст руи-

ро ва ния при ло же ний про мыш лен но го мас шта ба.

Осо бен но его при вле ка ют прак ти ки гиб ко го про грам ми ро ва ния, та кие как не-

пре рыв ная ин те гра ция и раз ра бот ка на ос но ве тес ти ро ва ния, язы ки про грам ми-

ро ва ния Java, Groovy, Ruby и Scala, фрейм вор ки Spring и Hibernate, а так же

про ек ти ро ва ние и ар хи тек ту ра при ло же ний в це лом.

Клинт ве дет блог по ад ре су http://clintshank.javadevelopersjournal.com, он один

из ав то ров сбор ни ка ста тей «97 Things Every Software Architect Should Know»1.

«Непрерывное обучение», стр. 56

Кэй Хорстман (Cay Horstmann)

Кэй Хорст ман вы рос в се вер ной Гер ма нии и учил ся в Уни вер си те те

им. Кри стиа на Альб рех тса в Ки ле – пор то вом го ро де на Бал тий ском

мо ре. По лу чил сте пень ма ги ст ра ин фор ма ти ки в Си ра куз ском уни-

вер си те те и док то ра ма те ма ти ки в Уни вер си те те шта та Ми чи ган

в Энн-Ар бор. Че ты ре го да Кэй вы сту пал в ро ли ви це-пре зи ден та

и тех ни че ско го ди рек то ра ин тер нет-стар та па, раз рос ше го ся с трех че ло век в кро-

шеч ном офи се до от кры той ак цио нер ной ком па нии. Сей час он пре по да ет ин фор-

ма ти ку в Уни вер си те те Сан-Хо се. Рас по ла гая мас сой сво бод но го вре ме ни, Кэй пи-

шет кни ги и ста тьи, по свя щен ные язы ку Java и обу че нию ин фор ма ти ке.

«Шаг назад. Теперь автоматизируй, автоматизируй, автоматизируй…», стр. 176

1

Сборник «97 этю дов для ар хи тек то ров про грамм ных сис тем». – Пер. с англ. – СПб.:

Сим вол-Плюс, 2010.

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

228

Авторы

Кэл Эванс (Cal Evans)

Кэл Эванс – ди рек тор экс перт но го цен тра PHP (PCE, PHP Center of

Expertise) ком па нии Ibuildings. Он про грам ми ро вал на раз лич ных

язы ках бо лее 25 лет. Пи шет кни ги и жур наль ные ста тьи, по свя щен-

ные не сколь ким язы кам про грам ми ро ва ния. Кэл – аме ри ка нец, но

сей час жи вет в Ут рех те (Гол лан дия), где вы сту па ет, пуб ли ку ет ся,

пи шет код и уча ст ву ет в ра бо те гло баль но го со об ще ст ва PHP. У не го есть блог:

http://blog.calevans.com.

«Комментарий о комментариях», стр. 52

«Этот код не трогать!», стр. 82

Кэрролл Робинсон (Carroll Robinson)

Кэр ролл Ро бин сон – раз ра бот чик про ши вок встраи вае мых сис тем

с прак ти че ским опы том по ряд ка 20 лет. Он пи сал мик ро про грам мы

на C и ас семб ле ре для са мых раз ных про цес со ров (в том чис ле 8051,

80x86, 68k, ARM7 и C2000), при ме няв ших ся в ме ди цин ском обо ру до-

ва нии, ла бо ра тор ных при бо рах и сис те мах бес про вод ной свя зи. Кэр-

рол лу при хо ди лось соз да вать и при ло же ния на C++, Java и Python. Он пред по чи-

та ет поль зо вать ся ин ст ру мен та ми с от кры тым ис ход ным ко дом (GCC, GAS, GDB)

на раз лич ных плат фор мах Linux и соз дал не сколь ко встро ен ных Linux-сис тем.

Кэр ролл за кон чил ма ги ст ра ту ру Уни вер си те та Case Western Reserve (Клив ленд,

Огайо) по спе ци аль но сти ком пь ю тер ная ин же не рия.

«Умей пользоваться утилитами командной строки», стр. 106

Линда Райзинг (Linda Rising)

Лин да Рай зинг по лу чи ла док тор скую сте пень в Уни вер си те те шта та

Ари зо на, а ее ре зю ме вклю ча ет и пре по да ва ние в уни вер си те те, и ра-

бо ту в ря де про мыш лен ных от рас лей. Лин ду зна ют во мно гих стра-

нах бла го да ря ее вы сту п ле ни ям, по свя щен ным шаб ло нам, рет ро-

спек ти вам, гиб кой раз ра бот ке и про цес сам пе ре мен. Она яв ля ет ся

ав то ром мно же ст ва ста тей и че ты рех книг, по след нюю из ко то рых, «Fearless

Chan ge: Patterns for Introducing New Ideas» (Addison-Wesley), на пи са ла в со ав-

тор ст ве с Мэ ри Линн Маннс (Mary Lynn Manns).

«Послание потомкам», стр. 136

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

Авторы

229

Майк Льюис (Mike Lewis)

Майк Льюис ра бо та ет сей час ин же не ром-про грам ми стом в Lutron

Elec tronics, а в сво бод ное вре мя – не за ви си мым кон суль тан том по

про грамм но му обес пе че нию. Его бо лее чем 10-лет ний опыт про грам-

ми ро ва ния по мо га ет ему соз да вать эле гант ные и ин туи тив но по нят-

ные про грамм ные ре ше ния. Он про па ган ди ру ет со вер шен ст во ва ние

про цес сов и стра ст но стре мит ся улуч шать поль зо ва тель ские ин тер фей сы вез де,

где толь ко воз мож но.

У Май ка сте пе ни ба ка лав ра и ма ги ст ра по раз ра бот ке ПО, по лу чен ные в Ро че-

стер ском тех но ло ги че ском ин сти ту те. Сей час он жи вет в Ал лен тау не, штат Пен-

силь ва ния, у гра ни цы Нью-Йор ка и Фи ла дель фии.

«Не бойтесь что-нибудь сломать», стр. 68

Майкл Фезерс (Michael Feathers)

Майкл Фе зерс – кон суль тант в Object Mentor International. Он за нят

ра бо той с раз ны ми ко ман да ми по все му ми ру, их обу че ни ем и на став-

ле ни ем. Майкл раз ра бо тал CppUnit, пер вый порт JUnit на C++,

и FitCpp, пор ти ро ван ную на C++ сре ду ин те гра ци он но го тес ти ро ва-

ния Fit. Майкл – ав тор кни ги «Working Effectively with Legacy Co de»1

(Pren tice Hall).

«Золотое правило проектирования API», стр. 90

Маркус Бэйкер (Marcus Baker)

Мар кус Бэй кер обо жа ет за ни мать ся про грам ми ро ва ни ем и по ра жа-

ет ся, что за это ему еще пла тят день ги. Его обо жа ние рас про стра ня-

ет ся на те ле фо нию, ана лиз дан ных, ро бо то тех ни ку и веб-раз ра бот-

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

ет груп пы поль зо ва те лей и кон фе рен ции. В на стоя щее вре мя он, од-

на ко, за нят ухо дом за деть ми.

«Установи меня!», стр. 100

1

Майкл Фе зерс «Эф фек тив ная ра бо та с унас ле до ван ным ко дом». – Пер. с англ. – Виль-

ямс, 2009.

97 этюдов для программистов

97 этюдов для программистов

230

Авторы

Маттиас Карлссон (Mattias Karlsson)

Мат ти ас Кар лс сон боль шую часть вре ме ни за ни ма ет ся раз ра бот кой

про грамм но го обес пе че ния для фи нан со во го сек то ра, а так же ру ко-

во дит груп пой поль зо ва те лей Java (JUG, Java User Group) в Сток-

голь ме (Шве ция). Мат ти ас за ни ма ет ся объ ект но-ори ен ти ро ван ны-

ми раз ра бот ка ми с 1993 го да. С го да ми он при об рел опыт ра бо ты

в раз ных ка че ст вах, в том чис ле раз ра бот чи ка, ар хи тек то ра, ру ко во ди те ля ко-

ман ды, ин ст рук то ра, ме нед же ра и пре по да ва те ля. Во всех этих ро лях его спо соб-

ность вдох нов лять и мо ти ви ро вать сво их со труд ни ков по лу чи ла вы со кую оцен-

ку. Груп па JUG еже год но про во дит от шес ти до вось ми пред ста ви тель ных со ве-

ща ний с чис лом уча ст ни ков бо лее 200. Мат ти ас так же вы сту пил од ним из ор га-

ни за то ров Jfokus, круп ней шей еже год ной кон фе рен ции по Java в Сток голь ме.

В сво бод ное вре мя Мат ти ас иг ра ет с деть ми или ка та ет ся на мо то цик ле, а так же

по мо га ет стро ить жи лье для не иму щих в рам ках ор га ни за ции Habitat for Huma-

ni ty. Мат ти ас так же под дер жи ва ет ор га ни за цию вза им но го мик ро кре ди то ва ния

Ki va. Уз най те, как при сое ди нить ся к его ста ра ни ям улуч шить мир, на http://

www.kiva.org/team/jug.

«Рецензирование кода», стр. 48

Микаэль Хунгер (Michael Hunger)

Ми ка эль Хун гер ув лек ся про грам ми ро ва ни ем еще в дет ские го ды

в Вос точ ной Гер ма нии. Осо бен но ин те ре су ет ся людь ми, ко то рые раз-

ра ба ты ва ют про грамм ное обес пе че ние, мас тер ст вом про грам ми ро ва-

ния, язы ка ми про грам ми ро ва ния и со вер шен ст во ва ни ем ко да. Ему

нра вит ся за ни мать ся ин ст рук ти ро ва ни ем и внут ри про ект ны ми раз-

ра бот ка ми в ка че ст ве не за ви си мо го кон суль тан та («еван ге лист раз ра бот ки луч-

ших про грамм» – http://jexp.de), но в его жиз ни есть и дру гие лю би мые про ек ты.

По ло ви ну жиз ни он от да ет се мье (у Ми ка эля трое де тей), дав ней за ви си мо сти от

тек сто вой мно го поль зо ва тель ской иг ры в под зе ме лье (MUD MorgenGrauen), чте-

нию книг, ко гда это воз мож но, ра бо те в соб ст вен ной ко фей не «die-buchbar», где

есть мас тер ская для пе ча ти на раз ных ма те риа лах, и вся ким по дел кам с Lego®

или без не го. Дру гая по ло ви на за ня та ра бо той с од ни ми язы ка ми про грам ми ро-

ва ния и изу че ни ем дру гих, про слу ши ва ни ем IT-под кас тов (осо бен но Software

En gi neering Radio; http://se-radio.net/), уча сти ем в ин те рес ных и ам би ци оз ных

про ек тах ти па qi4j, соз да ни ем DSL (jequel, squill и xmldsl), об шир ным ре фак то-

рин гом и уча сти ем в на пи са нии и ре цен зи ро ва нии книг. Не дав но он стал вы сту-

пать на кон фе рен ци ях.

«Предметно-ориентированные языки», стр. 66

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

Авторы

231

Мэтт Доар (Matt Doar)

Мэтт До ар ра бо та ет кон суль тан том по ин ст ру мен там про грам ми ро ва-

ния, та ким как сис те мы управ ле ния вер сия ми (CVS, Subversion), сис-

те мы сбор ки (make, Scons) и сис те мы от сле жи ва ния оши бок (Bug zil-

la, JIRA). Боль шая часть его кли ен тов – не боль шие стар та пы в Крем-

ние вой до ли не. Мэтт – ав тор вы шед шей в O’Reilly кни ги «Prac ti cal

Development Environments».

«Как пользоваться системой отслеживания ошибок», стр. 96

Никлас Нильссон (Niclas Nilsson)

Ник лас Нильс сон – на став ник по раз ра бот ке про грамм но го обес пе-

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

про фес си ей и влюб лен ный в кра си вые ар хи тек тур ные ре ше ния. Он

стал раз ра бот чи ком в 1992 го ду. Ник лас по соб ст вен но му опы ту зна-

ет, ка кое ог ром ное зна че ние для раз ра бот ки ПО мо жет иметь вы бор

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

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

ро ва ние и ме то ды гиб кой раз ра бот ки. Ник лас вхо дит в чис ло соз да те лей factor10

и ра бо та ет ре дак то ром со об ще ст ва ар хи тек то ров в InfoQ. Его блог на хо дит ся по

ад ре су http://niclasnilsson.se.

«Думайте состояниями», стр. 188

Нил Форд (Neal Ford)

Нил Форд – ар хи тек тор про грамм но го обес пе че ния и ме ме тик в Tho-

ught Works, гло баль ной кон суль та тив ной ком па нии в об лас ти IT, уде-

ляю щей ис клю чи тель ное вни ма ние сквоз ной раз ра бот ке и по став ке

про грамм но го обес пе че ния. Он про ек ти ру ет/раз ра ба ты ва ет при ло-

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

пишет жур наль ные ста тьи, яв ля ет ся ав то ром и/или ре дак то ром пя ти книг1. Он

так же час то вы сту па ет на кон фе рен ци ях. Удов ле тво рить свой жад ный ин те рес

к лич но сти Ни ла вы смо же те на сай те http://www.nealford.com.

«Тестирование – это инженерная строгость в разработке программного обеспече-

ния», стр. 186

1

Нил Форд «Продуктивный программист». – Пер. с англ. – СПб.: Символ-Плюс, 2009.

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

232

Авторы

Нэйт Джексон (Nate Jackson)

Нэйт Джек сон – стар ший ар хи тек тор про грамм но го обес пе че ния

в Буф фа ло, штат Нью-Йорк. За ни ма ет ся на пи са ни ем ко да с 1979 го -

да, ко гда у не го по явил ся TI-99 и кар тридж с эму ля то ром Бэй си ка.

Сле дуя соб ст вен но му со ве ту, он удов ле тво рил всех сво их кли ен тов –

да же ту да му, ко то рая по же ла ла иметь бе лый фон.

«Ваши заказчики имеют в виду не то, что говорят», стр. 214

Олве Маудал (Olve Maudal)

Ол ве Мау дал жи вет в Нор ве гии. Же нат. Двое де тей. Убе ж ден ный

ком пь ю тер ный гик. В дан ное вре мя в ос нов ном пи шет код на C и C++.

В уни вер си те те Ол ве изу чал раз ра бот ку ПО и ис кус ст вен ный ин тел-

лект. Про фес сио наль ную карь е ру он на чал в неф тя ной от рас ли в ком-

па нии, раз ра ба ты вав шей сис те мы раз вед ки неф ти и га за. За тем не-

сколь ко лет за ни мал ся сис те ма ми де неж ных пе ре во дов. Се го дня ра бо та ет в те ле-

ком му ни ка ци он ной ком па нии, соз да вая сис те мы для эф фек тив ной свя зи меж ду

людь ми.

Ол ве – ак тив ный член энер гич но го со об ще ст ва ги ков в Ос ло, где, сре ди про че го,

яв ля ет ся ор га ни за то ром груп пы поль зо ва те лей C++ в Ос ло. Его блог см. по ад ре-

су http://olvemaudal.wordpress.com.

«Тяжелый труд не оправдывает себя», стр. 94

Петер Зоммерлад (Peter Sommerlad)

Пе тер Зом мер лад – про фес сор и гла ва Ин сти ту та про грамм но го обес-

пе че ния в HSR Rapperswil. Пе тер – со ав тор кни ги «Pattern-Ori en ted

Software Architecture», Volume 1 и «Security Patterns» (обе из да ны

Wiley). Его дол го сроч ная за да ча – сде лать про грамм ное обес пе че ние

про ще бла го да ря дек ре мент ной раз ра бот ке: ре фак то рин гу про-

грамм до 10% их раз ме ра бла го да ря луч шей ар хи тек ту ре, лег ко сти тес ти ро ва-

ния, ка че ст ву и функ цио наль но сти.

«Правду скажет только код», стр. 144

Пит Гудлиф (Pete Goodliffe)

Пит Гуд лиф – раз ра бот чик про грамм но го обес пе че ния, ора тор и пи-

са тель, ко то рый ни ко гда дол го не за дер жи ва ет ся на од ной ро ли в от-

рас ли про грамм но го обес пе че ния. Он пи сал на мно гих язы ках во

мно гих про ек тах. Он так же пре по да ет и обу ча ет про грам ми стов и ве-

97 этюдов для программистов

97 этюдов для программистов

Авторы

233

дет по сто ян ную ко лон ку «Professionalism in Programming» в жур на ле ACCU

«CVu» ( http://accu.org/).

На пи сан ная Пи том по пу ляр ная кни га «Code Craft»1 (No Starch Press) слу жит

прак тич ным и ув ле ка тель ным ис сле до ва ни ем са мо го за ня тия про грам ми ро ва-

ни ем. Пит лю бит пи сать пре вос ход ный код, в ко то ром от сут ст ву ют ошиб ки, бла-

го да ря че му мо жет боль ше вре ме ни про во дить со свои ми деть ми. Он обо жа ет

кар ри и не но сит обувь.

«Не проходите мимо ошибки!», стр. 72

«Улучшайте код, удаляя его», стр. 98

«Нужно заботиться о коде», стр. 212

Пол У. Гомер (Paul W. Homer)

Пол У. Го мер – раз ра бот чик про грамм но го обес пе че ния, пи са тель

и не мно го фо то граф, ко то рый за нял ся раз ра бот кой про грамм не-

сколь ко де ся ти ле тий на зад и с тех пор стре мит ся стро ить все бо лее

слож ные сис те мы. Его опыт вклю ча ет в се бя ра бо ту в фир ме, кон-

суль ти ро ва ние и ком мер че ские раз ра бот ки в са мых раз но об раз ных

долж но стях, вклю чая ана ли ти ка, ар хи тек то ра, про грам ми ста, ме нед же ра и да-

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

лом, на прав лен ным на соз да ние и вы пуск сис тем.

В по след ние не сколь ко лет он стал уде лять боль ше вни ма ния об ще нию с кол ле-

га ми-раз ра бот чи ка ми, в свя зи с чем опуб ли ко вал кни гу, ве дет блог и очень мно-

го вы сту па ет в на де ж де по мочь про грамм ной от рас ли луч ше по нять се бя и до-

стичь но вых вы сот.

«Простота достигается сокращением», стр. 170

Раджит Аттапатту (Rajith Attapattu)

Рад жит Ат та пат ту – стар ший ин же нер-про грам мист в ко ман де MRG

Red Hat. Рад жит – эн ту зи аст от кры тых про ек тов и уча ст ник ря да

про ек тов Apache, в том чис ле Apache Qpid, Apache Synapse, Apache

Tus ca ny и Apache Axis2. В по след нее вре мя он со сре до то чил ся на

раз ра бот ке мас шта би руе мо го и на деж но го про грамм но го обес пе че-

ния про ме жу точ но го уров ня для пе ре да чи со об ще ний и во шел в груп пу AMQP

(Advanced Mes sa ge Queuing Protocol).

Он опуб ли ко вал не сколь ко ста тей и вы сту пил на ря де кон фе рен ций и встреч

групп поль зо ва те лей, в том чис ле ApacheCon, Colorado Software Summit и Toronto

1

Пи тер Гуд лиф «Ре мес ло про грам ми ста. Прак ти ка на пи са ния хо ро ше го ко да». – Пер.

с англ. – СПб.: Сим вол-Плюс, 2009.

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

234

Авторы

JUG. В об ласть на уч ных ин те ре сов Рад жи та вхо дит улуч ше ние мас шта би руе мо-

сти и вы со кой дос туп но сти рас пре де лен ных сис тем. В сво бод ное вре мя Рад жит

лю бит ри со вать и иг рать в кри кет.

С ним мож но свя зать ся по ад ре су rajith@apache.org, а так же най ти на http://

rajith.2rlabs.com.

«Прежде чем приступать к рефакторингу», стр. 32

«Тестируйте во сне (и по выходным)», стр. 184

Райан Браш (Ryan Brush)

Рай ан Браш – ди рек тор и за слу жен ный ин же нер (Distinguished

Engi neer) в Cerner Corpo ra ti on, где он ра бо та ет с 1999 го да. Его глав-

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

«Код – это проектирование», стр. 44

«Миф о гуру», стр. 92

Рассел Уиндер (Russel Winder)

Рас сел Уин дер – парт нер в Concertant LLP, пре дос тав ляю щей ус лу ги

ана ли ти ки и кон суль та ций по всем про бле мам па рал лель ных и кон-

ку рент ных вы чис ле ний и мно го ядер ным сис те мам. Он так же вы сту-

па ет в ка че ст ве не за ви си мо го кон суль тан та, ав то ра и пре по да ва те ля

по про грам ми ро ва нию, язы кам про грам ми ро ва ния (Java, Groovy

и Py thon), сис те мам управ ле ния вер сия ми (Subversion, Bazaar и Git) и фрейм-

вор кам сбор ки (Gant, SCons, Gradle, Ant и Maven). Рас сел – ав тор кни ги «De ve-

lop ing C++ Software» (Wiley), со ав тор книг «Developing Java Software» (Wiley)

и «Python for Rookies» (Cengage Learning Business Press).

«Как следует изучи более двух языков программирования», стр. 108

«Передача сообщений улучшает масштабируемость параллельных систем»,

стр. 134

Ричард Монсон-Хейфел (Richard Monson-Haefel)

Ри чард Мон сон-Хей фел – не за ви си мый раз ра бот чик про грамм но го

обес пе че ния, со ав тор всех пя ти из да ний «Enterprise JavaBeans»1

и обо их из да ний «Java Message Service» (O’Reilly), а так же ав тор

1

Ри чард Мон сон-Хей фел «Enterprise JavaBeans», 3-е из да ние. – Пер. с англ. – СПб.:

Сим вол-Плюс, 2002.

97 этюдов для программистов

Авторы

235

«J2EE Web Services» (Addison-Wesley). Ри чард – ре дак тор кни ги «97 Things

Every Software Architect Should Know»1. Яв ля ет ся од ним из ос но ва те лей про ек-

та OpenEJB (про ект с от кры тым ис ход ным ко дом), кон тей не ра EJB для Apache

Geronimo, а сей час кон суль ти ру ет раз ра бот ки iPhone и Mic ro soft Surface.

«Удовлетворяйте свое честолюбие через Open Source», стр. 88

Роберт Мартин «Дядюшка Боб» (Robert C. Martin «Uncle Bob»)

Ро берт Мар тин (Дя дюш ка Боб) про фес сио наль но за ни ма ет ся раз ра-

бот кой про грамм но го обес пе че ния с 1970 го да и яв ля ет ся ос но ва те-

лем и пре зи ден том Object Mentor, Inc. в Гер ни, штат Ил ли нойс. Obj-

ect Mentor, Inc. – меж ду на род ная ком па ния, где ра бо та ют раз ра бот-

чи ки и ме нед же ры с боль шим опы том, ко то рые по мо га ют ком па ни-

ям до во дить их про ек ты до за вер ше ния. Object Mentor пред ла га ет кон суль та ции

по со вер шен ст во ва нию про цес сов, обу че ние, кон суль та ции и по вы ше ние ква ли-

фи ка ции в объ ект но-ори ен ти ро ван ном про грам ми ро ва нии для круп ных ми ро-

вых ком па ний.

Боб опуб ли ко вал де сят ки ста тей в раз лич ных от рас ле вых жур на лах и час то вы-

сту па ет на меж ду на род ных кон фе рен ци ях и вы став ках. Яв ля ет ся ав то ром и ре-

дак то ром мно гих книг, вклю чая «Designing Object-Oriented C++ Applications

Using the Booch Method» (Prentice Hall), «Patterns Languages of Program De sign 3»

(Addison-Wesley Professional), «More C++ Gems» (Cambridge University Press),

«Extreme Programming in Practice» (Addison-Wesley Professional), «Agile Soft-

ware Development: Principles, Patterns, and Practices»2, «UML for Java Pro gram-

mers» и «Clean Code»3 (все вы шли в Prentice Hall).

Бу ду чи од ним из ли де ров от рас ли раз ра бот ки ПО, Боб в те че ние трех лет вы пол-

нял обя зан но сти глав но го ре дак то ра «C++ Report» и был пер вым пре зи ден том

«Agile Alliance».

«Правило бойскаута», стр. 36

«Профессиональный программист», стр. 154

«Принцип единственной ответственности», стр. 172

1

Сборник «97 этю дов для ар хи тек то ров про грамм ных сис тем». – Пер. с англ. – СПб.:

Сим вол-Плюс, 2010.

2

Ро берт К. Мар тин, Джеймс В. Нью кирк, Ро берт С. Косс «Бы ст рая раз ра бот ка про-

грамм. Прин ци пы, при ме ры, прак ти ка». – Пер. с англ. – Виль ямс, 2004.

3

Ро берт Мар тин «Чис тый код. Соз да ние, ана лиз и ре фак то ринг». – Пер. с англ. – СПб.:

Пи тер, 2011.

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

236

Авторы

Род Бегби (Rod Begbie)

Род Бег би ве дет свой род из Шот лан дии, но сей час его серд це по ко-

рил го род Сан-Фран ци ско.

Днем он ра бо та ет ведущим проектировщиком в Sli de, Inc., а вечером

уха жи ва ет за пан да ми. Ранее он тру дил ся ар хи тек то ром API в Cur-

rent TV, скры вал ся в ис сле до ва тель ской ла бо ра то рии Bose Cor po ra-

tion, кон суль ти ро вал Sapient и ус пеш но спас ся от (пер во го) лоп нув ше го пу зы ря

дот ко мов в под ва ле бан ка, где раз ра ба ты вал сис те мы для ана ли за еже год ных

рент с фик си ро ван ным до хо дом, что бы ло ин те рес но на столь ко же, на сколь ко

ин те рес но зву чит.

«Не прикалывайтесь с тестовыми данными», стр. 70

Рэнди Стэффорд (Randy Stafford)

Рэн ди Стэф форд – про фес сио нал в об лас ти про грамм но го обес пе че-

ния с 20-лет ним опы том ра бо ты в ка че ст ве про грам ми ста, ана ли ти ка,

ар хи тек то ра, ме нед же ра, кон суль тан та и ав то ра/док лад чи ка. Сей час

он ра бо та ет в Oracle, в ко ман де A-Team, где за ни ма ет ся про ек та ми

POC, ре цен зи ро ва ни ем ар хи тек ту ры и про из вод ст вен ны ми кри зи са-

ми. Он спе циа ли зи ру ет ся на грид-вы чис ле ни ях, SOA, про из во ди тель но сти, HA

и JEE/ORM.

Рэн ди ра бо тал тех ни че ским кон суль тан том в Rally Software, глав ным ар хи тек то-

ром в IQNavigator, ди рек то ром по раз ви тию в SynXis, кон суль тан том в Gem Sto ne

и Smalltalk, а так же спе циа ли стом по мо де ли ро ва нию в аэ ро кос ми че ской от рас-

ли и CASE-ин ду ст рии. Он со ав тор книг: «97 Things Every Software Ar chi tect Sho-

uld Know»1 (O’Reilly), «Patterns of Enterprise Application Archi tec tu re»2 (Wiley)

и «EJB Design Patterns» (Addison-Wesley Professional).

«Межпроцессная коммуникация влияет на время отклика приложения», стр. 102

Сара Маунт (Sarah Mount)

Са ра Ма унт – стар ший пре по да ва тель ин фор ма ти ки в Уни вер си те те

Вул вер хем пто на. Она ин те ре су ет ся язы ка ми и ин ст ру мен та ми про-

грам ми ро ва ния, осо бен но для бес про вод ных се тей дат чи ков и дру-

гих рас пре де лен ных сис тем. Са ра чи та ла сту ден там ввод ный курс

1

Сбор ник «97 этю дов для ар хи тек то ров про грамм ных сис тем». – Пер. с англ. – СПб.:

Сим вол-Плюс, 2010.

2

М. Фау лер, Д. Райс, М. Фом мел, Э. Хай ет, Р. Ми, Р. Стэф форд «Шаб ло ны кор по ра тив-

ных при ло же ний». – Пер. с англ. – Виль ямс, 2010.

97 этюдов для программистов

97 этюдов для программистов

Авторы

237

про грам ми ро ва ния в те че ние 9 лет и яв ля ет ся со ав то ром учеб ни ка «Python for

Rookies» (Cengage Learning Business Press).

«Пользуйтесь инструментами для анализа кода», стр. 178

Себ Роуз (Seb Rose)

Себ Ро уз – глав ный ин же нер-про грам мист в эдин бург ской ко ман де

Ra ti onal DOORS. Он на чал про грам ми ро вать в 1980 го ду, соз да вая

при ло же ния для аген тов по не дви жи мо сти и ад во ка тов на ком пи ли-

руе мом BASIC для Apple IIe. Окон чив Эдин бург ский уни вер си тет

в 1987 го ду, он сна ча ла уча ст во вал в про ек те REKURSIV, а по том стал

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

ре са ми яв ля ют ся ме то ди ки гиб ко го про грам ми ро ва ния и реа ни ма ция «унас ле-

до ван ных» про грамм.

«Будьте благоразумны», стр. 22

Скотт Мейерс (Scott Meyers)

Скотт Мей ерс – ав тор, пре по да ва тель, ора тор и кон суль тант. Его опыт

в раз ра бот ке и на уч ной ра бо те пре вы ша ет три дцать лет. Он на пи сал

де сят ки жур наль ных ста тей, а так же кни ги «Effective C++»1, «Mo re

Ef fec ti ve C++»2 и «Effective STL»3 (все вы шли в Addison-Wesley

Professional). Он так же про ек ти ро вал и кон тро ли ро вал их пуб ли ка-

цию в фор ма тах HTML и PDF. Скотт – ре дак тор-кон суль тант из да вае мой Ad di-

son-Wesley се рии «Effective Soft wa re Development» и был од ним из пер вых чле-

нов кон суль та тив но го со ве та се те во го жур на ла «The C++ Source» ( http://www.ar-

ti ma.com/cppsource). Он по лу чил док тор скую сте пень по ин фор ма ти ке в Уни вер-

си те те Брау на. Ад рес его сай та http://www.aristeia.com.

«Интерфейсы должно быть легко использовать правильно и трудно – неправиль-

но», стр. 130

1

Скотт Мей ерс «Эф фек тив ное ис поль зо ва ние С++. 55 вер ных со ве тов улуч шить струк-

ту ру и код ва ших про грамм». – Пер. с англ. – ДМК Пресс, 2006.

2

Скотт Мей ерс «Эф фек тив ное ис поль зо ва ние С++. 35 но вых спо со бов улуч шить стиль

про грам ми ро ва ния». – Пер. с англ. – СПб.: Пи тер, 2006.

3

Скотт Мей ерс «Эф фек тив ное ис поль зо ва ние STL». – Пер. с англ. – СПб.: Пи тер, 2002.

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

238

Авторы

Стив Берчук (Steve Berczuk)

Стив Бер чук – ин же нер-про грам мист в Humedica, где за ни ма ет ся

раз ра бот кой ин тел лек ту аль ных биз нес-при ло же ний для ме ди ци ны.

Раз ра бот кой про грамм ных при ло же ний он за ни ма ет ся свы ше 20 лет.

Стив – ав тор кни ги «Software Configuration Management Pat terns:

Effective Teamwork, Practical Integration» (Addison-Wesley Pro fes si o-

n al). По ми мо раз ра бот ки при ло же ний он лю бит по мо гать ко ман дам бо лее эф-

фек тив но ор га ни зо вать свою ра бо ту на ос но ве ме то дов гиб ко го про грам ми ро ва-

ния и управ ле ния кон фи гу ра ция ми про грамм но го обес пе че ния. Ад рес его сай та

http://www.berczuk.com.

«Развертывание приложения: раннее и регулярное», стр. 60

«Возьмите сборку (и ее рефакторинг) на себя», стр. 146

Стив Смит (Steve Smith)

Стив Смит – раз ра бот чик про грамм но го обес пе че ния, ора тор, ав тор

и на став ник. Он про фес сио наль но за ни ма ет ся раз ра бот кой про грамм-

но го обес пе че ния с 1997 го да и уча ст во вал в на пи са нии не сколь ких

книг, в ос нов ном в об лас ти ASP.NET. Ре гу ляр но вы сту па ет на встре-

чах поль зо ва те лей и та ких про фес сио наль ных кон фе рен ци ях, как

Dev Connections и Microsoft TechEd. Стив – быв ший ка пи тан ин же нер ных войск

ар мии США и ве те ран бое вых дей ст вий в Ира ке, где ко ман до вал взво дом, за-

ни мав шим ся обез вре жи ва ни ем не ра зо рвав ших ся бо е при па сов и са мо дель ных

взрыв ных уст ройств. Стив жи вет в Огайо с же ной и дву мя деть ми и яв ля ет ся од-

ним из ко ор ди на то ров груп пы Hudson Software Craftsmanship.

«Не повторяй свой код», стр. 80

Стив Фримен (Steve Freeman)

Стив Фри мен – не за ви си мый кон суль тант, спе циа ли зи рую щий ся на

ме то дах гиб кой раз ра бот ки. Он воз глав лял, ин ст рук ти ро вал и обу чал

ко ман ды во всех угол ках ми ра. Стив – со ав тор кни ги «Growing Obj-

ect-Oriented Software, Guided by Tests» (Addison-Wesley). В 2006 го ду

Стив по лу чил на гра ду Agile Alliance Gordon Pask. Он уча ст ву ет в про-

ек тах jMock и Hamcrest и соз дал NMock. Он член-ос но ва тель eXtre me Tuesday

Club и был ру ко во ди те лем пер во го London XpDay. Стив вы пол нял роль ор га ни за-

то ра и уча ст ни ка мно гих меж ду на род ных про фес сио наль ных кон фе рен ций. По-

лу чил док тор скую сте пень в Кем бридж ском уни вер си те те, а еще рань ше по лу-

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

про бле мы соз да ния хо ро ше го ко да и ис сле до ва ние слож но сти ор га ни за ций.

«Важность форматирования кода», стр. 46

«Один бинарный файл», стр. 142

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

Авторы

239

Сэм Сааристе (Sam Saariste)

Сэм Саа ри сте – ди пло ми ро ван ный ма гистр элек тро тех ни ки, за ни ма-

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

с 1995 го да. Сэм от ме тил ся в раз лич ных пред мет ных об лас тях – от об-

ра бот ки ре чи в ре аль ном вре ме ни в те ле ком му ни ка ци он ной сфе ре до

трей дер ских при ло же ний в ин ве сти ци он ных бан ках. Его лю би мый

язык – C++, он член ко мис сии BSI C++ с 2005 го да. Сэм – по клон ник ме то дов

гиб кой раз ра бот ки с то го мо мен та, как в 2000 го ду от крыл для се бя экс тре маль-

ное про грам ми ро ва ние. Его за бо тит ка че ст во про грамм но го обес пе че ния, и он

уве рен, что с по мо щью «agile» и «lean» мож но од но вре мен но дос тичь как вы со-

ко го ка че ст ва, так и вы со кой про дук тив но сти.

«Не поддавайтесь очарованию шаблона Singleton», стр. 166

Томас Гест (Thomas Guest)

То мас Гест – опыт ный и энер гич ный про грам мист. Он пред по чи та ет

язы ки вы со ко го уров ня и про стые ре ше ния. Его тек сты опуб ли ко ва-

ны в ря де се те вых и пе чат ных из да ний, а так же на его лич ном сай те

http://www.wordaligned.org.

«Научитесь говорить «Hello, World»», стр. 122

Уди Дахан (Udi Dahan)

Уди Да хан – «The Software Simplist» (про грамм ный зна харь), все-

мир но из вест ный спе циа лист по ар хи тек ту ре и про ек ти ро ва нию

про грамм но го обес пе че ния. MVP (Most Valuable Professional) в об-

лас ти ар хи тек ту ры ре ше ний и свя зан ных сис тем в те че ние че ты рех

лет под ряд, Уди так же вхо дит в чис ло 33 ев ро пей ских экс пер тов,

при знан ных меж ду на род ной ас со циа ци ей .NET, яв ля ет ся ав то ром и пре по да ва-

те лем в International Association of Software Architects, а так же гу ру SOA, Web

Ser vices и XML, ре ко мен до ван ным жур на лом DDJ.

В сво бод ное от кон суль та ций, вы сту п ле ний и пре по да ва ния вре мя Уди ру ко во-

дит раз ра бот кой NServiceBus, са мой по пу ляр ной сер вис ной ши ной пред при ятия

на ос но ве .NET с от кры тым ис ход ным ко дом. Его мож но най ти по ад ре су http://

www.UdiDahan.com.

«Осторожно: общий код», стр. 34

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

240

Авторы

Уолтер Брайт (Walter Bright)

Уол тер Брайт – соз да тель ком пи ля то ров, на пи сав ший их для C, C++,

ECMAScript, ABEL, Java и не дав но для язы ка про грам ми ро ва ния D.

Он так же из вес тен как изо бре та тель иг ры-стра те гии Empire.

«Компоновщик не таит в себе никаких чудес», стр. 126

Филип ван Лаенен (Filip van Laenen)

Фи лип ван Лае нен – ве ду щий ин же нер в нор веж ской соф твер ной

ком па нии Computas AS, ко то рая раз ра ба ты ва ет IT-ре ше ния в об ще-

ст вен ном и ча ст ном сек то ре Нор ве гии. Он на чи нал раз ра бот чи ком

в ма лых и боль ших ко ман дах, и за 10 лет ра бо ты в от рас ли Фи лип

вы рос до ве ду ще го раз ра бот чи ка и ру ко во ди те ля, от ве чаю ще го за

без опас ность и про грамм ную ин же не рию це лой ком па нии. В сво ей про фес сио-

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

вклю чая Smalltalk, Java, Perl, Ruby и PL/SQL. Осо бый ин те рес Фи лип про яв ля-

ет к без опас но сти ком пь ю те ров и крип то гра фии и не сколь ко лет за ни мал в Com-

pu tas долж ность от вет ст вен но го за без опас ность.

У Фи ли па сте пе ни ма ги ст ра элек тро ни ки и ма ги ст ра ин фор ма ти ки, по лу чен ные

в Ка то ли че ском уни вер си те те Ле ве на. Он ро дом из Флан д рии, но пе ре ехал

в 1997 го ду в Нор ве гию и те перь вме сте с семь ей жи вет в Кол со се око ло Ос ло.

«Автоматизируйте свой стандарт форматирования кода», стр. 28

Хейнц Кабуц (Heinz Kabutz)

Хейнц Ка буц – ав тор «The Java Specialists’ Newsletter» (Бюл ле тень

спе циа ли стов по Java), из да ния, ко то рое чи та ют 50 000 спе циа ли-

стов по Java в 120 стра нах. Боль шую часть вре ме ни он пи шет код на

Java в ка че ст ве под ряд чи ка мно го чис лен ных ком па ний. Кро ме то го,

он чи та ет в ком па ни ях лек ции о том, как эф фек тив нее пи сать про-

грам мы на Java, ис поль зуя раз ви тые функ ции это го язы ка.

Хейнц вхо дит в со об ще ст во «Java Champions», ин тер вью с ним опуб ли ко ва но

Sun Microsystems (см. http://java.sun.com/developer/technicalArticles/Interviews/

com munity/kabutz_qa.html).

«Знай свою IDE», стр. 110

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

Авторы

241

Чак Эллисон (Chuck Allison)

Чак Эл ли сон – адъюнкт-профессор ин фор ма ти ки в Уни вер си те те

Юта Вэл ли. Пред ше ст вую щие два де ся ти ле тия он ра бо тал ин же не-

ром-про грам ми стом на за па де США. Чак ак тив но уча ст во вал в раз-

ра бот ке стан дар та C++98, был ве ду щим ре дак то ром «C/C++ Users

Journal» и вме сте с Брю сом Эк ке лем (Bruce Eckel) уча ст во вал в на-

пи са нии 2-го то ма «Thinking in C++». Он так же ос но вал «The C++ Source» и яв-

ля ет ся пи шу щим ре дак то ром «Better Software Magzine». Под роб нее о Ча ке мож-

но уз нать на его сай те http://www.chuckallison.com.

«Числа с плавающей запятой недействительны», стр. 86

Эдвард Гарсон (Edward Garson)

Ув ле че ние Эд вар да Гар со на ком пь ю те ра ми на ча лось с изу че ния Logo

для Apple II. Се го дня он не за ви си мый кон суль тант по раз ра бот ке

про грамм но го обес пе че ния, по мо га ет ком па ни ям пе ре хо дить на ме-

то ды гиб ко го про грам ми ро ва ния.

В чис ло тех ни че ских ин те ре сов Эд вар да вхо дят ар хи тек ту ра и про ек ти ро ва ние

про грамм но го обес пе че ния, язы ки про грам ми ро ва ния, а так же GNU/Linux. Он

энер гич ный ора тор и вы сту пал в Бри тан ском ком пь ю тер ном об ще ст ве, Со ве те

ар хи тек то ров Microsoft и на раз лич ных кон фе рен ци ях. Эд вард уча ст во вал в на-

пи са нии кни ги «97 Things Every Software Architect Should Know»1.

Эд вард жи вет в Мон реа ле с же ной и дву мя сы новь я ми. В сво бод ное вре мя лю бит

ка тать ся на лы жах, хо дить в го ры и пу те ше ст во вать на ве ло си пе де.

«Применяйте принципы функционального программирования», стр. 24

Эдриан Уайбл (Adrian Wible)

Эд ри ан сам се бе при сво ил ти тул «ка та ли за тор раз ра бот ки ПО». Он

ра бо та ет в ThoughtWorks, Inc. в ос нов ном как ру ко во ди тель про ек-

тов, но ста ра ет ся оп ро вер гать об ви не ния в от ры ве от ре аль но сти тем,

что вре мя от вре ме ни сам за ни ма ет ся прак ти че ской раз ра бот кой

про грамм. Ра бо тая в IBM, он ус во ил ме то ди ку кас кад ной раз ра бот ки

(Wa terfall/SDLC) и вне дрял ее в управ ле ние про ек та ми, людь ми и про цес са ми

на про тя же нии сво ей бо лее чем 20-лет ней карь е ры в IBM и Dell Computer Corpo-

ra tion.

1

Сбор ник «97 этю дов для ар хи тек то ров про грамм ных сис тем». – Пер. с англ. – СПб.:

Сим вол-Плюс, 2010.

97 этюдов для программистов

242

Авторы

С пе ре хо дом в 2005 го ду в ThoughtWorks Эд ри ан от крыл для се бя «Ма ни фест

гиб кой раз ра бот ки» (Agile Manifesto), а так же экс тре маль ное про грам ми ро ва-

ние, Scrum и про чее и по нял, что от уча стия в про ек те и от ру ко во дства про ек том

мож но по лу чать удо воль ст вие, вос торг и удов ле тво ре ние. К преж ним под хо дам

он уже не вер нул ся.

Свя зать ся с Эд риа ном мож но по ад ре су awible@thoughtworks.com.

«Одна голова хорошо, но две – часто лучше», стр. 190

Эйнар Ландре (Einar Landre)

Эй нар Ланд ре – прак ти кую щий про фес сио нал в об лас ти про грамм-

но го обес пе че ния, про ра бо тал 25 лет в ка че ст ве раз ра бот чи ка, ар хи-

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

та ет в служ бе биз нес-при ло же ний StatoilHydro, где за нят раз ра бот-

кой кри ти че ски важ ных для биз не са при ло же ний, ре цен зи ро ва ни ем

ар хи тек ту ры и со вер шен ст во ва ни ем про цес сов раз ра бот ки про грамм но го обес-

пе че ния.

До по сту п ле ния в StatoilHydro Эй нар ра бо тал в ка че ст ве раз ра бот чи ка, кон суль-

тан та и ме нед же ра, за ни ма ясь про ек ти ро ва ни ем и реа ли за ци ей ком му ни ка ци-

он ных про то ко лов, опе ра ци он ных сис тем и тес ти ро ва ни ем про грамм но го обес-

пе че ния для меж ду на род ной кос ми че ской стан ции.

В по след ние го ды Эй нар стал ак тив но уча ст во вать в про фес сио наль ном со об ще-

ст ве, на пи сал или вы сту пил со ав то ром ря да док ла дов, пред став лен ных на

OOPSLA и SPE (Society of Petroleum Engineers). Сре ди его про фес сио наль ных

ин те ре сов объ ект но-ори ен ти ро ван ное про грам ми ро ва ние, про ек ти ро ва ние ав то-

ном ных сис тем, при ме не ние прак ти ки сис тем ной ин же не рии, ме то до ло гии гиб-

кой раз ра бот ки и ли дер ст во в вы со ко тех но ло ги че ских ор га ни за ци ях.

У Эй на ра сте пень ма ги ст ра ин фор ма ти ки, по лу чен ная в Уни вер си те те Страт-

клай да, и ди плом сер ти фи ци ро ван но го IEEE про фес сио наль но го раз ра бот чи ка

про грамм но го обес пе че ния (CSDP). Он жи вет вме сте с семь ей в Ста ван ге ре (Нор-

ве гия).

«Инкапсулируйте поведение, а не только состояние», стр. 84

«Предпочитайте примитивам предметно-ориентированные типы данных»,

стр. 150

97 этюдов для программистов

97 этюдов для программистов

Авторы

243

Юрий Зубарев (Yuriy Zubarev)

Юрий Зу ба рев – ар хи тек тор про грамм ных сис тем и ру ко во ди тель

ко ман ды в YachtWorld.com, под раз де ле нии Dominion Enterprises.

Его дея тель ность со сре до то че на на ин те гра ции про грамм ных сис-

тем, тех но ло ги ях сбо ра зна ний и сле же ния, а так же на по вы ше нии

тех ни че ской эф фек тив но сти и уров ня мас тер ст ва в его ком па нии.

Юрий жи вет и ра бо та ет в кра си вей шем го ро де Ван ку ве ре в ка над ской про вин-

ции Бри тан ская Ко лум бия. По ми мо на пи са ния ко да он ув ле ка ет ся ла ти но аме-

ри кан ски ми тан ца ми.

«Пишите код так, как будто вам предстоит сопровождать его всю оставшуюся

жизнь», стр. 206

Ян Кристиаан ван Винкель (Jan Christiaan «JC» van Winkel)

Ян Кри стиа ан ван Вин кель – ин ст рук тор и раз ра бот чик учеб ных кур-

сов для не боль шой гол ланд ской учеб ной и кон суль та тив ной фир мы

AT Computing. В его ра бо те пре об ла да ют сис те мы UNIX/Linux (сис-

тем ное ад ми ни ст ри ро ва ние, без опас ность, ана лиз эф фек тив но сти)

и язы ки про грам ми ро ва ния (в ос нов ном C, C++ и Python). Он так же

пред став ля ет Гол лан дию в про цес се стан дар ти за ции C++. Две на дцать лет «JC»

вхо дил в со став ру ко во дства гол ланд ской груп пы поль зо ва те лей UNIX (Ne ther-

lands UNIX User’s group, NLUUG), шесть из ко то рых за ни мал пост пред се да те ля.

«Правильно выбирайте алгоритмы и структуры данных», стр. 198

Алфавитный указатель

A

Extreme Feedback Device, XFD – оконеч-

Ada, 108, 150

ное устройство обратной связи, 124

Ant, система автоматизации сборки, 176

Autotools, система автоматизации сборки,

F

176

Fit (Framework for Integrated Test), 204

Fortran, 108

B

bash, 177

G

bazaar, система управления версиями, 143

Git, система управления версиями, 143,

BusyBox, приложение, 197

156

Groovy, 135

C

C, 108

H

C#, 74, 87, 90

Haskell, 108

C++, 76, 108, 135, 150

HSQLDB, 116

COBOL, 46, 78

CSP (Communicating Sequential Processes),

I

модель взаимодействующих последова-

IDE, интегрированные среды разработки,

тельных процессов, 135

106

CVS, система управления версиями, 156

iMacros, 177

Cygwin, среда, 197

IntelliSense, 67

IPC (Interprocess Communications),

D

взаимодействия между удаленными

DRY (Don’t Repeat Yourself – «не повто-

процессами, 102

ряйся»), один из важнейших принципов

программирования, 80

J

и «один и только один раз» (Once and

Java, 66, 75, 90, 104, 110, 117, 135, 150

Only Once), принцип ПО, 81

DSL, 67

L

E

LINQ, 75

lint, 178

Erlang, 75, 134

Алфавитный указатель

245

M

А

Mercurial, система управления версиями,

автоматизированные тесты, 124, 145, 205

156

анализ сложности, 112

MySQL, 116

аспектно-ориентированное программиро-

вание, 189

O

Аспрони, Джованни

occam, 134

биография, 221

Once and Only Once – «один и только один

Тщательно выбирайте инструменты,

раз», принцип ПО, 81

40

open source (программы с открытым

Учитесь делать оценки, 120

исходным кодом), 88

Аттапатту, Раджит

биография, 233

P

Прежде чем приступать к рефакторин-

гу, 32

Pascal, 108

Тестируйте во сне (и по выходным),

PostgreSQL, 116

184

PowerShell, 177

Processing, 117

Б

Prolog, 108

Pylint, 178

Банда Четырех, 75

Python, 75, 87, 135, 150, 178

Бегби, Род

биография, 236

R

Не прикалывайтесь с тестовыми

данными, 70

Ruby, 66, 75, 117

Берг, Карианне

биография, 225

S

Читайте код, 160

Scala, 66, 75

Берчук, Стив

Selenium, 177

биография, 238

SOA, 173

Возьмите сборку (и ее рефакторинг)

Splint, 178

на себя, 146

SQL, 116

Развертывание приложения: раннее

SQLite, 116

и регулярное, 60

Subversion, система управления версия-

биография

ми, 156

Аспрони, Джованни, 221

Аттапатту, Раджит, 233

W

Бегби, Род, 236

WET (Write Every Time – пиши каждый

Берг, Карианне, 225

раз), 202

Берчук, Стив, 238

Брайт, Уолтер, 240

Y

Браш, Райан, 234

Бродуолл, Йоханнес, 224

YAGNI (You Arent Gonna Need It – вам это

Брэйтуэйт, Кейт, 226

не понадобится), 98

Бэйкер, Маркус, 229

Винкель, Ян Кристиаан ван, 243

Гарсон, Эдвард, 241

Гест, Томас, 239

Гомер, Пол У. , 233

Грегори, Джанет, 220

Гриффитс, Алан, 216

246

Алфавитный указатель

Гудлиф, Пит, 232

Хафнагель, Берк, 218

Гэгнат, Анн Кэтрин, 217

Хенни, Кевлин, 225

Дахан, Уди, 239

Хоп, Грегор, 219

Джаггер, Джон, 222

Хорстман, Кэй, 227

Джексон, Нэйт, 232

Хунгер, Микаэль, 230

Джонссон, Дэн Берг, 222

Шэнк, Клинт, 227

Доар, Мэтт, 231

Эванс, Кэл, 228

Зоммерлад, Петер, 232

Эллисон, Чак, 241

Зубарев, Юрий, 243

блокировка с двойной проверкой (DCLP),

Кабуц, Хейнц, 240

167

Карлссон, Маттиас, 230

Брайт, Уолтер

Келли, Аллан, 217

биография, 240

Кимхи, Йехиль, 223

Компоновщик не таит в себе никаких

Колборн, Жиль, 223

чудес, 126

Колвин, Грег, 219

Браш, Райан

Лаенен, Филип ван, 240

биография, 234

Ландре, Эйнар, 242

Код – это проектирование, 44

Линднер, Дэниэл, 223

Миф о гуру, 92

Льюис, Майк, 229

Бродуолл, Йоханнес

Маркардт, Клаус, 226

биография, 224

Мартин, Роберт, 235

Многословный журнал лишит вас сна,

Маудал, Олве, 232

200

Маунт, Сара, 236

Сборка должна быть чистой, 104

Мезарос, Джерард, 221

Брэйтуэйт, Кейт

Мейерс, Скотт, 237

биография, 226

Миллер, Алекс, 216

Пишите маленькие функции на основе

Монсон-Хейфел, Ричард, 234

примеров, 208

Нильссон, Никлас, 231

Читайте гуманитарные книги, 162

Норас, Андерс, 217

Бэйкер, Маркус

Норт, Дэн, 222

биография, 229

Ольмхейм, Йорн, 224

Установи меня! , 100

Пеппердин, Кирк, 226

Райзинг, Линда, 228

В

Робинсон, Кэрролл, 228

взаимодействия между удаленными

Россланд, Кари, 225

процессами (IPC), 102

Роуз, Себ, 237

Винкель, Ян Кристиаан ван

Сааристе, Сэм, 239

биография, 243

Смит, Стив, 238

Правильно выбирайте алгоритмы

Спинеллис, Диомидис, 220

и структуры данных, 198

Стоб, Верити, 218

Витгенштейн, 162

Стэффорд, Рэнди, 236

время отклика приложения, 102

Сэйдж, Джейсон П. , 221

Уайбл, Эдриан, 241

Г

Уиндер, Рассел, 234

Фезерс, Майкл, 229

Гарсон, Эдвард

Форд, Нил, 231

биография, 241

Фримен, Стив, 238

Применяйте принципы функциональ-

Хан, Аслам, 218

ного программирования, 24

Хаукнес, Гудни, 219

Гест, Томас

биография, 239

Алфавитный указатель

247

Научитесь говорить «Hello, World»,

Как пользоваться системой отслежива-

122

ния ошибок, 96

глобальные переменные, 51

допущения, 39

Гомер, Пол У.

дублирование кода, 80

биография, 233

Простота достигается сокращением,

З

170

Зоммерлад, Петер

Грегори, Джанет

биография, 232

биография, 220

Правду скажет только код, 144

Когда программисты и тестировщики

Зубарев, Юрий

сотрудничают, 204

биография, 243

Гриффитс, Алан

Пишите код так, как будто вам

биография, 216

предстоит сопровождать его всю

Не полагайтесь на «автоматические

оставшуюся жизнь, 206

чудеса», 78

Гудлиф, Пит

И

биография, 232

Не проходите мимо ошибки! , 72

идиомы языка, 108

Нужно заботиться о коде, 212

изменяемые переменные, 24

Улучшайте код, удаляя его, 98

инкапсуляция, 132

Гэгнат, Анн Кэтрин

инструменты для работы с грамматика-

биография, 217

ми, 67

Программируйте парами и входите

интегрированная среда разработки (IDE),

в поток, 148

106, 110

интерфейсы

Д

удобство использования, 130

исключения, 62

Дахан, Уди

биография, 239

К

Осторожно: общий код, 34

действительные числа, 86

Кабуц, Хейнц

десятичные числа, 87

биография, 240

Джаггер, Джон

Знай свою IDE, 110

биография, 222

Карл Великий, 119

Больше осознанной практики, 64

Карлссон, Маттиас

Пусть невидимое станет более види-

биография, 230

мым, 132

Рецензирование кода, 48

Джексон, Нэйт

Келли, Аллан

биография, 232

биография, 217

Ваши заказчики имеют в виду не то,

Две ошибки могут гасить одна другую

что говорят, 214

(и тогда их трудно исправлять), 192

Джонссон, Дэн Берг

Прежде чем пенять на других, проверь

биография, 222

собственный код, 38

Знай, что сохранишь в репозиторий,

Керниган и Плоджер «Элементы стиля

114

программирования», 54

Отличайте исключения в бизнес-логи-

Кимхи, Йехиль

ке от технических, 62

биография, 223

динамическая типизация, 151

Пиши код с умом, 50

Доар, Мэтт

классы исключений, 62

биография, 231

Кнут, Дональд, 199

248

Алфавитный указатель

Колборн, Жиль

Мартин, Роберт

биография, 223

биография, 235

Выясните, как поступит пользователь

Правило бойскаута, 36

(и вы – не пользователь), 26

Принцип единственной ответственнос-

Предотвращайте появление ошибок,

ти, 172

152

Профессиональный программист, 154

Колвин, Грег

Маудал, Олве

биография, 219

биография, 232

Знай свои возможности, 112

Тяжелый труд не оправдывает себя, 94

командная строка и IDE, 106

Маунт, Сара

комментарии, 144

биография, 236

как балласт, 54

Пользуйтесь инструментами для

как часть кода, 55

анализа кода, 178

компилятор, редкость ошибок в, 38

Мезарос, Джерард

компоновка, 126

биография, 221

конечные автоматы, 189

Тесты пишутся для людей, 210

конкурентные вычисления, 134

Мейерс, Скотт

контрактное программирование, 189

биография, 237

корректность программного обеспечения,

Интерфейсы должно быть легко

50

использовать правильно и трудно –

неправильно, 130

Л

метрики кода, 124

Лаенен, Филип ван

Миллер, Алекс

Автоматизируйте свой стандарт

биография, 216

форматирования кода, 28

Сначала скажите «да», 174

биография, 240

модель взаимодействующих последова-

Ландре, Эйнар

тельных процессов, 135

биография, 242

модульное тестирование, 133, 151, 166,

Инкапсулируйте поведение, а не

181

только состояние, 84

Монсон-Хейфел, Ричард

Предпочитайте примитивам предмет-

биография, 234

но-ориентированные типы данных,

Удовлетворяйте свое честолюбие через

150

Open Source, 88

Линднер, Дэниэл

биография, 223

Н

Пусть ваш проект говорит сам за себя,

невидимость как принцип разработки

124

качественного ПО, 132

лицензия GNU, 41

инкапсуляция, 132

Льюис, Майк

прозрачность механизма, 132

биография, 229

«не повторяйся» – DRY (Don’t Repeat

Не бойтесь что-нибудь сломать, 68

Yourself), один из важнейших принци-

пов программирования, 80

М

Нильссон, Никлас

Маркардт, Клаус

биография, 231

биография, 226

Думайте состояниями, 188

Долговечность временных решений,

Норас, Андерс

128

биография, 217

Учите иностранные языки, 118

Не просто учите язык, поймите его

культуру, 74

Алфавитный указатель

249

Норвиг, Питер, 64

принципы ПО

Норт, Дэн

«не повторяйся» – DRY (Don’t Repeat

биография, 222

Yourself), 202

Пишите код на языке предметной

«один и только один раз» (Once and

области, 42

Only Once), 81

«открыт/закрыт» (Open/Closed), 81

О

принцип единственной ответственнос-

обобщения (Java 5), 104

ти (Single Responsibility Principle),

общая память, 134

81, 172

общий код, 34

принцип инверсии зависимости (DIP),

объектно-ориентированный подход, 25

173

объектно-реляционное отображение

программные метрики, 168

(ORM), 102

проектирование хороших API, 58

«один и только один раз» (Once and Only

прозрачность механизма, 132

Once), принцип ПО, 81

производительность корпоративных

оконечное устройство обратной связи, 124

приложений, время отклика, 102

Ольмхейм, Йорн

простота кода, 31, 39

биография, 224

процессы, 134

Красота – следствие простоты, 30

пульсирующая нагрузка, 102

операторы goto, 50

«открыт/закрыт» (Open/Closed), принцип

Р

ПО, 81

размывание в вычислениях, 87

отладка, приемы, 38

разработка на основе приемочного

ошибка округления, 87

тестирования (ATDD), 204

разработка через тестирование, 131, 146

П

Райзинг, Линда

парадигмы программирования, 108

биография, 228

параллелизм, 134

Послание потомкам, 136

парное программирование, 148, 190

распределенные системы управления

Пеппердин, Кирк

версиями, 143

WET размазывает узкие места произ-

регулярные выражения, 159

водительности , 202

рефакторинг, 32, 68, 110, 144, 157, 168, биография, 226

169, 203, 210

Путь к повышению эффективности

рецензирование кода, 48

программ заминирован грязным

Ривс, Джек, 186

кодом, 168

Робинсон, Кэрролл

Упущенные возможности применения

биография, 228

полиморфизма, 138

Умей пользоваться утилитами команд-

побочные эффекты, 24

ной строки, 106

повторение в логике и шаблоны проекти-

Россланд, Кари

рования, 81

биография, 225

повторение процессов в разработке ПО, 80

Программируйте парами и входите

полиморфизм, 138

в поток, 148

пользовательский интерфейс

Роуз, Себ

всплывающие подсказки, 27

биография, 237

наблюдение за пользователями, 27

Будьте благоразумны, 22

Поппендик, Мэри, 64

Рош, Элеонора, 163

предметно-ориентированные типы

РСУБД, 116

и примитивы, 150

250

Алфавитный указатель

С

У

Сааристе, Сэм

Уайбл, Эдриан

биография, 239

биография, 241

Не поддавайтесь очарованию шаблона

Одна голова хорошо, но две – часто

Singleton, 166

лучше, 190

связующее программное обеспечение, 41

Убунту, философия, 194

сильная связность кода, 133, 145

Уиндер, Рассел

синглтон, 90, 167

биография, 234

система управления версиями, 124, 156

Как следует изучи более двух языков

системы автоматизации сборки, 176

программирования, 108

слабая связанность кода, 133, 145, 160

Передача сообщений улучшает

Смит, Стив

масштабируемость параллельных

биография, 238

систем, 134

Не повторяй свой код, 80

управление потоком данных, 135

состояние потока, 148

Спинеллис, Диомидис

Ф

биография, 220

Фаулер, Мартин, 22, 103

Держите все в системе управления

Фезерс, Майкл

версиями, 156

биография, 229

Место для больших наборов взаимо-

Золотое правило проектирования API,

связанных данных – в базе данных,

90

116

Форд, Нил

Утилиты UNIX – ваши друзья, 196

биография, 231

ссылочная прозрачность, 24

Тестирование – это инженерная

стандарт форматирования кода,

строгость в разработке программно-

автоматизация, 28

го обеспечения, 186

статическая типизация, 151

форматеры кода, 47

Стоб, Верити

форматирование кода

биография, 218

автоматическое, 47

Не прибивайте программу гвоздями

важность, 46

к стене, 76

Фримен, Стив

Стэффорд, Рэнди

биография, 238

биография, 236

Важность форматирования кода, 46

Межпроцессная коммуникация

Один бинарный файл, 142

влияет на время отклика приложе-

функциональная парадигма, 24

ния, 102

функциональное программирование, 24,

сценарии сборки, их важность, 146

25, 109

Сэйдж, Джейсон П.

биография, 221

Х

Почаще изобретайте колесо, 164

Хайдеггер, Мартин, 163

Т

Хан, Аслам

биография, 218

термины предметной области, 43

Написание кода в духе Убунту для

технический долг, 22

друзей, 194

непреднамеренный, 22

Хаукнес, Гудни

умышленный, 22

биография, 219

Программируйте парами и входите

в поток, 148

Алфавитный указатель

251

Хафнагель, Берк

Числа с плавающей запятой недей-

биография, 218

ствительны, 86

Брось мышь и медленно отойди от

эргономика программ, 102

клавиатуры, 158

эффект ложного согласия, 26

Невероятно, но факт: тестировщики –

ваши друзья, 140

Хенни, Кевлин

биография, 225

Комментируйте только то, о чем не

скажет код, 54

Тестируйте точно и конкретно, 182

Тестируйте требуемое, а не случайное

поведение, 180

Хоар, Тони, 183

Хоп, Грегор

биография, 219

Удобство – не атрибут качества, 58

Хорстман, Кэй

биография, 227

Шаг назад. Теперь автоматизируй,

автоматизируй, автоматизируй...,

176

Хунгер, Микаэль

биография, 230

Предметно-ориентированные языки,

66

Ц

целостность стека, 39

Ч

числа с плавающей запятой, 86

Ш

шаблоны проектирования, 75, 80, 81, 139

Singleton, 166

Шэнк, Клинт

биография, 227

Непрерывное обучение, 56

Э

Эванс, Кэл

биография, 228

Комментарий о комментариях, 52

Этот код не трогать! , 82

экстремальное программирование, 98

Эллисон, Чак

биография, 241

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

97 этюдов для программистов

Издательство “СИМВОЛПЛЮС”

Основано в 1995 году

Наша специализация – книги компьютерной и деловой тематики.

О нас

Наши из да ния – плод сотрудничества известных зарубежных

и оте чест вен ных авторов, высококлассных переводчиков

и компе тент ных науч ных редакторов. Среди наших деловых

парт не ров из да тель ст ва: O’Reilly, Pearson Education, NewRiders,

Addison Wesley, Wiley, McGrawHill, No Starch Press, Packt, Dorset

House, Apress и другие.

Где купить

Наши книги вы можете купить во всех крупных книжных ма га зи­

нах России, Украины, Белоруссии и других стран СНГ. Однако

по минималь ным ценам и оптом они продаются:

СанктПетербург:

главный офис издательства –

В. О. 16 линия, д. 7 (м. Василеостровская),

тел. (812) 380­5007

Москва:

московский филиал издательства –

ул. 2­я Магистральная, д. 14В

(м. Полежаевская/Беговая),

тел. (495) 6385305

Заказ книг

через Интернет http://www.symbol.ru


Бесплатный каталог книг высылается по запросу.

Приглашаем к сотрудничеству

Мы приглашаем к сотрудничеству умных и талантливых авторов,

переводчиков и редакторов. За более подробной информацией

обращайтесь, пожалуйста, на сайт издательства www.symbol.ru.

Также на нашем сайте вы можете высказать свое мнение

www.symbol.ru

и замечания о наших книгах. Ждем ваших писем!

Document Outline

Оглавление

Статьи по категориям

Предисловие

Будьте благоразумны

Себ Роуз

Применяйте принципы функционального программирования

Эдвард Гарсон

Выясните, как поступит пользователь (и вы – не пользователь)

Жиль Колборн

Автоматизируйте свой стандарт форматирования кода

Филип ван Лаенен

Красота – следствие простоты

Йорн Ольмхейм

Прежде чем приступать к рефакторингу

Раджит Аттапатту

Осторожно: общий код

Уди Дахан

Правило бойскаута

Роберт Мартин, известный также как «Дядюшка Боб»

Прежде чем пенять на других, проверь собственный код

Аллан Келли

Тщательно выбирайте инструменты

Джованни Аспрони

Пишите код на языке предметной области

Дэн Норт

Код – это проектирование

Райан Браш

Важность форматирования кода

Стив Фримен

Рецензирование кода

Маттиас Карлссон

Пиши код с умом

Йехиль Кимхи

Комментарий о комментариях

Кэл Эванс

Комментируйте только то, о чем не скажет код

Кевлин Хенни

Непрерывное обучение

Клинт Шэнк

Удобство – не атрибут качества

Грегор Хоп

Развертывание приложения: раннее и регулярное

Стив Берчук

Отличайте исключения в бизнес-логике от технических

Дэн Берг Джонссон

Больше осознанной практики

Джон Джаггер

Предметно-ориентированные языки

Микаэль Хунгер

Не бойтесь что-нибудь сломать

Майк Льюис

Не прикалывайтесь с тестовыми данными

Род Бегби

Не проходите мимо ошибки!

Пит Гудлиф

Не просто учите язык, поймите его культуру

Андерс Норас

Не прибивайте программу гвоздями к стене

Верити Стоб

Не полагайтесь на «автоматические чудеса»

Алан Гриффитс

Не повторяй свой код

Стив Смит

Этот код не трогать!

Кэл Эванс

Инкапсулируйте поведение, а не только состояние

Эйнар Ландре

Числа с плавающей запятой недействительны

Чак Эллисон

Удовлетворяйте свое честолюбие через Open Source

Ричард Монсон-Хейфел

Золотое правило проектирования API

Майкл Фезерс

Миф о гуру

Райан Браш

Тяжелый труд не оправдывает себя

Олве Маудал

Как пользоваться системой отслеживания ошибок

Мэтт Доар

Улучшайте код, удаляя его

Пит Гудлиф

Установи меня!

Маркус Бэйкер

Межпроцессная коммуникация влияет на время отклика приложения

Рэнди Стэффорд

Сборка должна быть чистой

Йоханнес Бродуолл

Умей пользоваться утилитами командной строки

Кэрролл Робинсон

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

Рассел Уиндер

Знай свою IDE

Хейнц Кабуц

Знай свои возможности

Грег Колвин

Знай, что сохранишь в репозиторий

Дэн Берг Джонссон

Место для больших наборов взаимосвязанных данных – в базе данных

Диомидис Спинеллис

Учите иностранные языки

Клаус Маркардт

Учитесь делать оценки

Джованни Аспрони

Научитесь говорить «Hello, World»

Томас Гест

Пусть ваш проект говорит сам за себя

Дэниэл Линднер

Компоновщик не таит в себе никаких чудес

Уолтер Брайт

Долговечность временных решений

Клаус Маркардт

Интерфейсы должно быть легко использовать правильно и трудно – неправильно

Скотт Мейерс

Пусть невидимое станет более видимым

Джон Джаггер

Передача сообщений улучшает масштабируемость параллельных систем

Рассел Уиндер

Послание потомкам

Линда Райзинг

Упущенные возможности применения полиморфизма

Кирк Пеппердин

Невероятно, но факт: тестировщики – ваши друзья

Берк Хафнагель

Один бинарный файл

Стив Фримен

Правду скажет только код

Петер Зоммерлад

Возьмите сборку (и ее рефакторинг) на себя

Стив Берчук

Программируйте парами и входите в поток

Гудни Хаукнес, Кари Россланд и Анн Кэтрин Гэгнат

Предпочитайте примитивам предметно-ориентированные типы данных

Эйнар Ландре

Предотвращайте появление ошибок

Жиль Колборн

Профессиональный программист

Роберт Мартин (Дядюшка Боб)

Держите все в системе управления версиями

Диомидис Спинеллис

Брось мышь и медленно отойди от клавиатуры

Берк Хафнагель

Читайте код

Карианне Берг

Читайте гуманитарные книги

Кейт Брэйтуэйт

Почаще изобретайте колесо

Джейсон П. Сэйдж

Не поддавайтесь очарованию шаблона Singleton

Сэм Сааристе

Путь к повышению эффективности программ заминирован грязным кодом

Кирк Пеппердин

Простота достигается сокращением

Пол У. Гомер

Принцип единственной ответственности

Роберт Мартин (Дядюшка Боб)

Сначала скажите «да»

Алекс Миллер

Шаг назад. Теперь автоматизируй, автоматизируй, автоматизируй…

Кэй Хорстман

Пользуйтесь инструментами для анализа кода

Сара Маунт

Тестируйте требуемое, а не случайное поведение

Кевлин Хенни

Тестируйте точно и конкретно

Кевлин Хенни

Тестируйте во сне (и по выходным)

Раджит Аттапатту

Тестирование – это инженерная строгость в разработке программного обеспечения

Нил Форд

Думайте состояниями

Никлас Нильссон

Одна голова хорошо, но две – часто лучше

Эдриан Уайбл

Две ошибки могут гасить одна другую (и тогда их трудно исправлять)

Аллан Келли

Написание кода в духе Убунту для друзей

Аслам Хан

Утилиты UNIX – ваши друзья

Диомидис Спинеллис

Правильно выбирайте алгоритмы и структуры данных

Ян Кристиаан ван Винкель

Многословный журнал лишит вас сна

Йоханнес Бродуолл

WET размазывает узкие места производительности

Кирк Пеппердин

Когда программисты и тестировщики сотрудничают

Джанет Грегори

Пишите код так, как будто вам предстоит сопровождать его всю оставшуюся жизнь

Юрий Зубарев

Пишите маленькие функции на основе примеров

Кейт Брэйтуэйт

Тесты пишутся для людей

Джерард Мезарос

Нужно заботиться о коде

Пит Гудлиф

Ваши заказчики имеют в виду не то, что говорят

Нэйт Джексон

Авторы

Алфавитный указатель



home | my bookshelf | | 97 этюдов для программистов |     цвет текста   цвет фона