Saturday, December 27, 2008

Обзоры книг

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

С. Макконнелл, "Совершенный код"

Книга посвящена конструированию, т.е. собственно написанию кода. Прекрасный свод советов и правил по написанию "совершенного" кода. Для начинающего программиста незаменимый учебник, но и самому опытному программисту будет полезна для систематизации знаний.

Мартин Фаулер. Архитектура корпоративных программных приложений

Основательный труд по систематизации типовых решений (patterns) для проектирования корпоративных приложений. Автор рассматривает общие проблемы, т.е. на что вообще нужно обращать внимание при разработке архитектуры, и затем предлагает серию типовых решений для каждой проблемы. Книга полезна и как введение в область проектирования корпоративных приложений, и как справочник. К сожалению, автор в основном рассматривает Web-based приложения, и вопросы, типичные для приложений с "толстым клиентом", не рассматривает.

Недостатком книги, на мой взгляд, является порядок изложения. В первой части автор дает обзор проблем, стоящих перед архитектором корпоративных систем, ссылаясь при этом на типовые решения, которые рассматриваются только во второй части. Т.о. понять первую часть зачастую трудно. Рекомендую читать книгу в таком порядке: сначала вводную главу 1, потом вторую часть, где рассматриваются типовые решения, и затем остальные главы первой части, проясняющие где, когда и зачем применять эти типовые решения.

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

Gamma, Helm, Johnson, Vlissides. Design Patterns

Классическая книга по Design Patterns, известная также как "Gang of Four". Написана в академической манере, подробно и основательно. В книге три основных части. В первой части объясняется, что такое Design Patterns и для чего они нужны. Во второй части на примере проектированя текстового редактора объясняется как Design Patterns возникают в реальной жизни. Третья часть представляет собой каталог 23-х базовых Design Patterns общего назначения. Описание каждого объясняет, откуда этот pattern взялся, когда его следует применять, как реализовывать, для пояснения используются диаграммы и примеры кода. Книгу можно использовать и как учебник, и как справочное пособие.

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

Гради Буч и др. Объектно-ориентированный анализ и проектирование с примерами приложений

Книга считается классическим трудом по объектно-ориентированному анализу и проектированию. Тем не менее, меня разочаровала. Книга состоит из трех частей: Концепции, Метод и Приложения. Первая часть содержит глубокий разбор основных концепций объектно-ориентированного анализа и проектирования: абстрация, объектная модель, классы, иерархия и т.п. Не совсем понятно, на кого ориентировано это изложение. Опытный программист уже знаком с этими концепциями, а начинающему будет сложно их понять из-за весьма тяжелого научного стиля изложения. Скорее всего, авторы ориентируются на тех, кто занимается computer science именно как science.

Вторая часть, Метод, посвящена методологии и процессу объектно-ориентированной разработки. Опять-таки непонятно, на кого ориентировано изложение. Как введение в этот круг вопросов книга слишком тяжело читается, а отсутствие примеров делает многие утверждения непонятными. При этом широта охвата не позволяет авторам серьезно углубиться в какой-либо конкретный вопрос.

Третья часть, Приложения, описывает применение описанных ранее подходов для проектирования нескольких приложений. Эта часть наиболее интересна. Рассматриваются следующие системы:

  • Система спутниковой навигации. Проделывается очень высокоуровневое проектирование систем
  • Система контроля движения поездов. Рассматривается выработка требований
  • Криптоаналитическая система. Рассматривается более детальное проектирование. Интересно с точки зрения ознакомления с системами искусственного интеллекта
  • Система сбора данных с метеостанции. Рассматриваются вопросы embedded систем
  • Web-система планирования отпусков. Рассматриваются вопросы web-систем.

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

Fritz Onion. Essential ASP.NET with Examples in C#

Книга последовательно и доходчиво объясняет принципы технологии ASP.NET. Мне понравилась тем, что описывает архитектуру и "как это работает внутри". Освещаются такие темы как веб-формы, конфигурация (web.config), диагностика и обработка ошибок, валидация, data binding, custom controls, кеширование, state management и безопасность.

Для понимания книги нужно знать немного C#, предварительных знаний по .NET не требуется.

К сожалению, книга посвящена ASP.NET версии 1.1, а в 2.0 уже много поменялось. Также хочу отметить, что прочтя эту книгу уже понимаешь, как работает ASP.NET, но еще не можешь писать ASP.NET-сайты сам; для этого нужно еще прочесть какую-нибудь более практическую книгу, например "ASP.NET 2.0 Website Programming" (см. ниже).

Marco Bellinaso. ASP.NET 2.0 Website Programming: Problem - Design - Solution

Книга по программированию на ASP.NET 2.0, построенная на примерах. Автор описывает создание веб-сайта для вымышленного пивного кабака (!), последовательно добавляя к нему функциональность, т.о. демонстрируя возможности ASP.NET 2.0 и как их использовать.

Помимо прочего демонстрируется использование master pages, membership (системы пользователей/групп и их прав), создание новостей, статей, опросов, email-рассылки, форумов, электронного магазина, персонализация и локализация. В завершение обсуждается deployment сайтов на ASP.NET 2.0.

Для понимания книги необходимо уметь читать код на C# и иметь базовое представление о ASP.NET.

Как Касперский тормозит почту

С некоторых пор стал наблюдать следующую картину на почтовом сервере: в очереди sendmail'а стоят письма, адресованные локальным пользователям, но не доставляются. Более того, письмо часто адресовано целой группе пользователей, но доставка затыкается на ком-то одном, и все, кто в списке после него, письмо не получают.

Посмотрим, нет ли блокировок почтовых ящиков:


# cd /var/spool/mail
# ls *.lock
lz.lock
# 

Ага, один ящик заблокирован (здесь я описываю на примере моего ящика lz, хотя в жизни это были ящики других пользователей). Посмотрим, кто его использует:

# fuser -v lz
                     USER        PID ACCESS COMMAND
lz:                  lz        20384 F.... pop3
                     lz        20476 F.... procmail
# 

Похоже, процесс pop3-сервера занял ящик, поэтому procmail не может открыть его на запись. Проверим:

# lsof -p 20384 
COMMAND   PID USER   FD   TYPE   DEVICE     SIZE     NODE NAME
...
pop3    20384   lz    9uR  REG    253,3 11922701 16680817 /var/spool/mail/lz

(здесь число послее опции -p команды lsof - это PID, который вывела команда fuser; и я опустил все строки в выводе lsof, кроме интересующей меня).

Действительно, файл заблокирован на чтение (о чем говорит большая буква R в колонке FD). Но с какой стати процесс pop3 это сделал? Казалось бы, он должен выдать клиенту все сообщения и "отвалить". С помощью strace'а я посмотрел, чем был занят процесс pop3 - оказалось, периодически получает от клиента команды NOOP, и все. Зачем клиент посылает эти команды и не отключается? Я проверил поведение Outlook Express'а на своем компьютере - как и ожидалось, он подключался, забирал почту и отключался, т.е. не висел и команд NOOP не посылал.

Далее я заметил, что пользователи, чьи ящики таким странным образом блокировались, были все время одни и те же. Это побудило меня тщательно обследовать их компьютеры. И тут на сцене появился герой этой заметки - антивирус Касперского. На компьютерах всех пользователей, страдавших от блокировки, работал почтовый антивирус. Отключили почтовый антивирус - проблема ушла.

И черт с этим почтовым антивирусом, все равно почту проверяет ClamAV