(\* \Answered \Flagged \Deleted \Draft \Seen)]
Permanent flags
fetchmaiclass="underline" IMAP< * OK [UNSEEN 2] first unseen in /var/spool/mail/esr
fetchmaiclass="underline" IMAP< A0002 OK [READ-WRITE] SELECT completed
fetchmaiclass="underline" IMAP> A0003 EXPUNGE
fetchmaiclass="underline" IMAP< A0003 OK Mailbox checkpointed, no messages expunged
fetchmaiclass="underline" IMAP> A0004 SEARCH UNSEEN
fetchmaiclass="underline" IMAP< * SEARCH 2
fetchmaiclass="underline" IMAP< A0004 OK SEARCH completed
2 messages (1 seen) for esr at hurkle.thyrsus.com.
fetchmaiclass="underline" IMAP> A0005 FETCH 1:2 RFC822.SIZE
fetchmaiclass="underline" IMAP< * 1 FETCH (RFC822.SIZE 2545)
fetchmaiclass="underline" IMAP< * 2 FETCH (RFC822.SIZE 8328)
fetchmaiclass="underline" IMAP< A0005 OK FETCH completed
skipping message esr@hurkle.thyrsus.com:1 (2545 octets) not flushed
fetchmaiclass="underline" IMAP> A0006 FETCH 2 RFC822.HEADER
fetchmaiclass="underline" IMAP< * 2 FETCH (RFC822.HEADER {1586}
reading message esr@hurkle.thyrsus.com:2 of 2 (1586 header octets)
fetchmaiclass="underline" SMTP< 220 snark.thyrsus.com ESMTP Sendmail 8.12.5/8.12.5;
Mon, 9 Dec 2002 08:41:41 -0500
fetchmaiclass="underline" SMTP> EHLO localhost
fetchmaiclass="underline" SMTP< 250-snark.thyrsus.com
Hello localhost [127.0.0.1], pleased to meet you
fetchmaiclass="underline" SMTP< 250-ENHANCEDSTATUSCODES
fetchmaiclass="underline" SMTP< 250-8BITMIME
fetchmaiclass="underline" SMTP< 250-SIZE
fetchmaiclass="underline" SMTP> MAIL FROM:<mutt-dev-owner@mutt.org> SIZE=8328
fetchmaiclass="underline" SMTP< 250 2.1.0 <mutt-dev-owner@mutt.org>... Sender ok
fetchmaiclass="underline" SMTP> RCPT TO:<esr@localhost>
fetchmaiclass="underline" SMTP< 250 2.1.5 <esr@localhost>... Recipient ok
fetchmaiclass="underline" SMTP> DATA
fetchmaiclass="underline" SMTP< 354 Enter mail, end with "." on a line by itself
#
fetchmaiclass="underline" IMAP< )
fetchmaiclass="underline" IMAP< A0006 OK FETCH completed
fetchmaiclass="underline" IMAP> A0007 FETCH 2 BODY.PEEK[TEXT]
fetchmaiclass="underline" IMAP< * 2 FETCH (BODY[TEXT] {6742}
(6742 октета тела сообщения)
*********************.**************************.
*******************************.************************.*******
*********.
***********************.***************
fetchmaiclass="underline" IMAP< )
fetchmaiclass="underline" IMAP< A0007 OK FETCH completed
fetchmaiclass="underline" SMTP>. (EOM)
fetchmaiclass="underline" SMTP< 250 2.0.0 gB9ffWo08245 Message accepted for delivery
flushed
fetchmaiclass="underline" IMAP> A0008 STORE 2 +FLAGS (\Seen \Deleted)
fetchmaiclass="underline" IMAP< * 2 FETCH (FLAGS (\Recent \Seen \Deleted))
fetchmaiclass="underline" IMAP< A0008 OK STORE completed
fetchmaiclass="underline" IMAP> A0009 EXPUNGE
fetchmaiclass="underline" IMAP< * 2 EXPUNGE
fetchmaiclass="underline" IMAP< * 1 EXISTS
fetchmaiclass="underline" IMAP< * 0 RECENT
fetchmaiclass="underline" IMAP< A0009 OK Expunged 1 messages
fetchmaiclass="underline" IMAP> A0010 LOGOUT
fetchmaiclass="underline" IMAP< * BYE hurkle IMAP4rev1 server terminating connection
fetchmaiclass="underline" IMAP< A0010 OK LOGOUT completed
fetchmaiclass="underline" 6.1.0 querying hurkle.thyrsus.com (protocol IMAP)
at Mon, 09 Dec 2002 08:41:42 -0500: poll completed
fetchmaiclass="underline" SMTP> QUIT
fetchmaiclass="underline" SMTP< 221 2.0.0 snark.thyrsus.com closing connection
fetchmaiclass="underline" normal termination, status 0
Параметр -v делает программу fetchmail воспринимаемой (предоставляя возможность просмотреть обмен данными протокола). Это чрезвычайно полезно. Я посчитал это настолько важным, что написал специальный код для маскирования паролей учетных записей в распечатках транзакций, выполненных благодаря параметру -v, так чтобы распечатки можно было отправлять без необходимости редактирования секретной информации в них.
Это оказалось хорошим сигналом. По крайней мере восемь из десяти проблем, представленных в отчетах, диагностировались хорошо осведомленными специалистами в течение нескольких секунд при просмотре распечаток сеансов. В списке рассылки fetchmail числится несколько знающих людей. По существу, ввиду того, что большинство программных сбоев легко диагностируются, автору редко приходилось разбираться с ними самостоятельно.
Со временем fetchmail приобрела репутацию "пуленепробиваемой" программы. Ее можно неправильно настроить, однако полные отказы происходят очень редко. Это ничто по сравнению с возможностью быстро получить точную информацию по поводу восьми из десяти ошибок.
Из данного примера можно извлечь следующий урок: не следует с опозданием реализовывать отладочные инструменты или рассматривать их как одноразовое средство. Они являются окнами в код. Не достаточно просто "пробивать грубые отверстия в стенах", их необходимо "отделывать и остеклять". Если код должен быть сопровождаемым, то всегда приходится "пускать в него свет".
6.1.3. Учебный пример: GCC
Программа GCC, GNU C-компилятор, применяемый в большинстве современных Unix-систем, возможно, наилучшим образом демонстрирует преимущества проектирования с учетом прозрачности. Программа GCC организована как последовательность стадий обработки, связанных вместе программой драйвера: стадии препроцессора, синтаксического анализатора, генератора кода, ассемблера и линкера.
На каждой из первых трех стадий принимается и генерируется читабельный текстовый формат (ассемблер должен создавать, а линкер принимать двоичные форматы, почти по определению). С помощью различных параметров командной строки для драйвера gcc(1) можно получить не только результаты после обработки C-кода препроцессором, сборки и создания объектного кода, но и отслеживать результаты множества промежуточных этапов синтаксического анализа и генерации кода.