8. A Few More Lessons From Fetchmail
Before we go back to general software-engineering issues, there are a couple
more specific lessons from the fetchmail experience to ponder.
The rc file syntax includes optional `noise' keywords that are entirely
ignored by the parser. The English-like syntax they allow is considerably
more readable than the traditional terse keyword-value pairs you get when
you strip them all out.
These started out as a late-night experiment when I noticed how much
the rc file declarations were beginning to resemble an imperative minilanguage.
(This is also why I changed the original popclient `server' keyword to
`poll').
It seemed to me that trying to make that imperative minilanguage more
like English might make it easier to use. Now, although I'm a convinced
partisan of the ``make it a language'' school of design as exemplified
by Emacs and HTML and many database engines, I am not normally a big fan
of ``English-like'' syntaxes.
Traditionally programmers have tended to favor control syntaxes that
are very precise and compact and have no redundancy at all. This is a cultural
legacy from when computing resources were expensive, so parsing stages
had to be as cheap and simple as possible. English, with about 50% redundancy,
looked like a very inappropriate model then.
This is not my reason for normally avoiding English-like syntaxes; I
mention it here only to demolish it. With cheap cycles and core, terseness
should not be an end in itself. Nowadays it's more important for a language
to be convenient for humans than to be cheap for the computer.
There are, however, good reasons to be wary. One is the complexity cost
of the parsing stage -- you don't want to raise that to the point where
it's a significant source of bugs and user confusion in itself. Another
is that trying to make a language syntax English-like often demands that
the ``English'' it speaks be bent seriously out of shape, so much so that
the superficial resemblance to natural language is as confusing as a traditional
syntax would have been. (You see this in a lot of so-called "fourth generation"
and commercial database-query languages.)
The fetchmail control syntax seems to avoid these problems because the
language domain is extremely restricted. It's nowhere near a general-purpose
language; the things it says simply are not very complicated, so there's
little potential for confusion in moving mentally between a tiny subset
of English and the actual control language. I think there may be a wider
lesson here:
16. When your language is nowhere near Turing-complete, syntactic
sugar can be your friend.
Another lesson is about security by obscurity. Some fetchmail users
asked me to change the software to store passwords encrypted in the rc
file, so snoopers wouldn't be able to casually see them.
I didn't do it, because this doesn't actually add protection. Anyone
who's acquired permissions to read your rc file will be able to run fetchmail
as you anyway -- and if it's your password they're after, they'd be able
to rip the necessary decoder out of the fetchmail code itself to get it.
All .fetchmailrc password encryption would have done is give a false
sense of security to people who don't think very hard. The general rule
here is:
17. A security system is only as secure as its secret. Beware of
pseudo-secrets.
|