Мало что может сравниться с общением в своем круге. Вот и книга, взятая мною с полки, доставляет радость, которой непременно хочется поделиться. Причина в том, что на темы программирования издается много книг, но они по большей части не для мастеров, а для учеников и подмастерьев. В них учат азам или в лучшем случае наставляют по овладению известным. Но вот, чтобы авторы рассказывали о стиле программирования, таких работ мало. А между тем нужда в них велика как среди программистов-профессионалов, так и среди преподавателей, при этом она усугубляется в наши времена бизнеса, когда под давлением маркетологов из-за шор на глазах разработчиков рождаются продукты и технологии с большим количеством недоработок. В питерском издательстве «Невский Диалект» затеяли выпуск серии книг «Библиотека программиста», что радует вдвойне, по причине восстановления культурной традиции, возобновляются животворные информационные ресурсы для отечественных программистов, соответствующие библиотекам издательств «Мир» и «Наука. Физматлит».
Последние тридцать лет немногие книги по программированию вызывали такой интерес как «Алгоритмы и структуры данных» Никлауса Вирта, поэтому появление перевода на русский язык нового издания, пусть и с большим опозданием, событие большого значения. Тем более что в ней сделан значительный акцент на культуре программирования.
Как и в первом издании, основные разделы книги посвящены структурам данных и алгоритмам. Рассматриваются вопросы типизации данных, представления и использования в алгоритмах. Следуя известной формуле: «Алгоритмы + структуры данных = программы», автор большую часть книги посвящает алгоритмам. При этом демонстрируется работа с основными структурами: массивами, записями, множествами и последовательностями, а также поиск в них. Автор описал наиболее часто используемые алгоритмы: сортировки и рекурсии — для данных со статической структурой, списки и различного рода деревья — для динамической. Завершает книгу раздел о расстановке ключей (хэшировании) — обработке множеств, на которых задано упорядочение элементов.
В чем же отличия второго издания? Прежде всего, заменена «лошадь» — теперь алгоритмы изложены не на языке Паскаль, а на Модула-2, что связано с более простой синтаксической структурой языка. Добавлены сведения о проблеме поиска в строке данных и деревьях приоритетного поиска. Отсутствует глава о построении трансляторов. Также автор не преминул сообщить о чувстве глубокого удовлетворения, в связи с тем, что при подготовке книги он смог использовать последние программно-технические достижения.
Нельзя не отметить приятного оформления книги, добротной авторской работы над терминологией и убедительно-доказательного характера изложения материала, когда автор прибегает к помощи математических представлений, а не «оконных подглядываний». Так, читатели, кроме всего прочего, учатся на материале книги содружеству программирования и математики, когда в языке программистов востребованы количественные оценки рассматриваемых алгоритмов и подлинно оптимальные алгоритмы.
Издатели снабдили книгу предисловием Дмитрия Подшивалова, которое заслуживает самостоятельного осмысления, а его комментарии, часто носящие исторические характер, соотносят авторские сведения с отечественными разработками.
Вторая книга из этой же серии посвящена практике программирования. Вышедшая на английском языке три года назад, монография Брайана Кернигана и Роберта Пайка «Практика программирования» вполне отвечает современным представлениям и может быть использована как молодыми программистами, принимающими участие в первых проектах, так и опытными. При этом каждая глава книги сопровождается текстом с дополнительной литературой, которая позволит углубить понимание прочитанного.
Данная книга, надеюсь, понравится читателям, прежде всего глубиной авторской концепции — программа есть текст с присущим ему единством формы и содержания, поэтому разговор о практике программирования начинается с обсуждения его стиля. Дело в том, что под практикой авторы понимают написание обычных программ, и она должна изначально опираться на правила, как если бы писались подобные тексты на естественном языке. Так, в главе о стиле программирования рассмотрено использование имен, выражений, стилевого единства и идиом, макрофункций, особенностей числовых данных и комментариев, а также отмечено, как все это определяет качество программ. Естественно, что текст программы в смысловом отношении привязан к описанию алгоритмов и структур данных. И в обычных программах от этого не уйти — на практике на такие занятия тратится львиная доля рабочего времени. В связи с этим авторы продемонстрировали полезные приемы на ряде алгоритмов и структур данных. Среди них поиск и сортировка, динамически расширяемые массивы и др.
Особое место в книге отведено проектированию структур данных — каркасу для описания алгоритма, существенно упрощающему кодирование. Далее среди проблем, решаемых при программировании, в отдельной главе рассмотрены выбор интерфейса, организация доступа к информации, управление ресурсами и обработка ошибок. Ну и какая же практика без отладки и тестирования программ, которые играют важную роль в стиле. Дело не только в выборе отладчика, работы с ошибками своими и чужими, но и в необходимости разнообразного тестирования, как в процессе написания кода, так систематического, автоматизированного и в стрессовых условиях. Почти в каждой программе возникает проблема ее производительности; авторы на ряде примеров обсуждают как вести себя в конкретной ситуации. И, наконец, в последних главах излагаются взгляды на переносимость программ и их нотацию или способы записи, облегчающие работу с ними.
Изящным решением авторов книги следует признать публикацию в приложении свода правил для практикующих программистов, которые появились в ходе обсуждения тем в соответствующих главах. Книга обязательно встретит в России благодарного читателя, что не в последнюю очередь связано с ее полезностью для практиков.
Никлаус Вирт, Алгоритмы и структуры данных. СПб.: Невский Диалект, 2001. — 352 с.: ил.
Брайан Керниган, Роб Пайк. Практика программирования. СПб.: Невский Диалект, 2001. — 381 с.: ил.