Table Of Content97 programmers.indd 1 15.02.2012 13:56:36
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
Кирк Пеппердин