On Tue, 04 Oct 2011 05:20:48 +0100, Walter Bright <newshou...@digitalmars.com> wrote:
I've been only a casual user of std.getopt, barely scratching the surface of what it can do. But I do have a few general thoughts on this.

One of the very hardest things in design is knowing when to say "no" to a new feature. The feature is desired by some subset of the users, it can be ignored by those who have no use for it, so it seems like an unequivocal win, right?

But:

1. It adds to the "cognitive load" of the product. The cognitive load is how thick the manual is. The bigger it is, the more intimidating it is, and the fewer will dare to even open it. There is immense attraction in simple to understand products. std.getopt is supposed to make life easier for programmers - pages and pages and pages of documentation, options, complex examples, etc., just lead one to say "screw it, I'll roll my own" and it has failed.

Steve Jobs is famously successful for paring down feature sets to the bare minimum that works for 90% of the users, and then doing those features very well.

2. Once a feature is there, it stays forever. It's very hard to judge how many people rely on a feature that turns out in hindsight to be baggage. Removing it arbitrarily will break existing code and tick off people. C++ has a number of hare-brained features (like trigraphs) that everyone hates but prove impossible to remove, despite it mucking up progress with language.

3. Increasing the complexity means more maintenance, cognitive load for the maintenance programmer, and bugs, bugs, bugs.

4. If a user really needs a special case not supported by std.getopt, it is straightforward to roll his own.

5. Supporting (well) only a reduced feature set means that apps will tend to have command line behavior that is more consistent and predictable, which is a good thing.


It's why I have rather bull-headedly resisted adding feature after feature to D's unittest facility. The unittest feature has been a home run for D, and I suspect a lot of its success has been its no-brainer simplicity and focus on doing one thing well.

One technique for avoiding a lot of the problems with "feature creep" is to create new things using existing things, instead of modifying the existing thing. In this way the cognitive load of the original remains the same, and don't increase it's complexity or add bugs.

But, this is only possible if the original thing is written in an "orthogonal" manner:
http://en.wikipedia.org/wiki/Orthogonality#Computer_science

Meaning, typically, that the parts of the thing need to be encapsulated, so that they can be re-used by the more complex thing without introducing any side-effects to the original thing, or uses of the original thing.

In this particular case, because these std,.getopt options are global variables, building something which uses them, or std.getopt will introduce side effects to other uses of std.getopt. Meaning the current design makes it impossible to build upon in an orthogonal manner. This is the 'problem' people have with it.

--
Using Opera's revolutionary email client: http://www.opera.com/mail/

Reply via email to