Thursday, September 20, 2007

Turbulent Waters

I've been here before. The howling winds keep forcing me backwards. I'm drowning in a raging sea of technological insecurities. I hit a few highs from interesting features, only to be tumbled back by deep lows for bad implementation choices. The ups and downs of a perfect storm born of weak technology.

I'm back, again. At that initial point in a new project where I am seeking new technologies. But instead of enjoying my evaluations, I am being tossed about by broken features and annoying flaws. All of the bad ideas over the years come together to produce unstable tools and awkward libraries. And I keep coming across more horrible things. Bad, really deplorable things. Things we learned not to do so long ago, but somehow we forgot. It is a nasty wind lashing at my attempts to find ways to work-around the problems. I long for the peace and quiet of a more stable technology base.

Unfortunately, I'm sure I've surpassed my quota for ranting lately. I don't want to be negative anymore. At least not for a little while. I don't want to talk about any of the technologies or any of their specific weaknesses. I figured I could use my time a little more productively by describing the types of things "I want" in technology. There are a few common attributes that I think are desirable, but get lost in that endless race to dish out the latest and greatest.

Simple things should be simple. Nothing, I think states elegance more than this property. If you want to use a technology for something simple, hey, it is simple to do. If you want more depth, then you have to invest more. No other attribute has value over this one. Often claimed, rarely duplicated. It can be measured by the amount of time you need to spend reading the documentation or fiddling with the functionality.

Once I get it, I should really get it. I don't want to have to reach for the manual for every little function and I don't want to have to go to the Internet for each problem I encounter. If I use the technology enough, I should be able to understand it, guess at how it works, and it should be consistent enough to allow me to do that. The farther away I can sit from the manuals, the better it is. If I can't grok it, after nearly twenty years of working with similar things, well, it probably ain't me.

I can use it out of the box. If I need it, I need it now. Package it up for me in a way that I can use it. I don't want to have to wire up twenty more modules before it actually works. Or change twenty configuration parameters. It's not fun spending all day setting up software. Why, if you built it to do something for me, should I have to go to some site to download a bunch of common plugins that everyone needs in order to do anything useful. Package it up for me. If its a distribution or licensing problem, fix it. The more crap we depend on, the more we pay for it.

I can set it up my way. My chief complaint for most IDEs is that some guy (or gal) is making a lot of choices about how I work when I code. Turns out, mostly they are wrong choices, and I end up hating the interfaces because of that. I'd rather someone just integrate vim, Perl and tk and let me set up my own functions mapped to keys and buttons. I want a couple of editor windows (not a lousy split one), and a couple of bars of buttons that are hooked to frequently used scripts. I'd like to share scripts with my friends, and possibly the rest of the world. Check the share option, and it is done. I want it to be that simple.

The ability to automate. If I can do it with the GUI, I should be able to automate it in the command line. Why do we have to do the same 30 clicks over and over again, while worrying about forgetting one or two of them, when you can harness the power of a computer to remember the number and order of the steps for you. Computers are this powerful tool that we constantly fail to leverage. Progress in automation has been backwards.

Meaningful documentation. How much time has been spent on documentation that is entirely useless? Unreadable. It always boggles my mind. Reference backed FAQs or answers to questions are best. Give me MAN page syntax: a quick reference, a bit of an overview and then more detail on the references. Don't try to impress me with your writing, save that for your blog. If I get one more programmer bragging about how "great" their lame technology is, I'm going to lose it (again).

Simple abstractions and common terminology. My first ever attempt to put words to this problem were 'mystical worlds'. Programmers keep creating their own customized worlds with their own terms and structures and whatnot. Hey, this ain't science fiction. You don't need to invent your own elf language. You start reading about something like a "foo-flow demarcating its reverse bounding anti-reduction pattern", and you start thinking "These guys are crazy. They really are". Its easy to make up new demented terms, but its avoiding the problem and just making software worse for the ware. I don't want real-world brute force, but then I don't want over-the-top different either. Give me something that looks like the problem or looks like an abstraction of the problem. If you can't explain how the problem maps back to the abstraction, you may have been able to code it, but you really don't get it. And it probably ain't going to work correctly for me.

Real Encapsulation. Man, if nothing bugs me more than some encapsulating layer that still leaves all of the original stuff visible and accessible. Usually because the designer was too worried about restricting the freedoms of others, or something lame like that. Why do I want to use your 'thing' if it only saves me a couple of weeks of coding, but requires months of reading the crappy docs to get it. Ahhh. You figure it out, encapsulate it, and then give me a simple way to access it. If I wanted to learn about the details I wouldn't be using your stuff.

A clean, simple, consistent and complete interface. Ohh, these horrible programmers that embed all of this so called 'functionality' into annoying mini-widgets, incomprehensible icons or other dancing baloney. They get some kick from packing it so densely onto the screen that even twenty years of staring at the thing still won't shed light on all of the stupid trivial hidden functionality. We could call them: plain-sight easter-eggs packed into fugly interfaces. Blaa. I want simple and I want complete. If I can add, then I should be able to delete. All of the yins are balanced with opposing yangs. If I can cut, then I can paste, and I can cut it if I can see it. And I don't want to read any documentation "at all" in order to understand how it works. It should be self evident. It should match the popular conventions of the day. Highly creative, but awkward interfaces are really just annoying and awkward interfaces.

Well, I'd better stop there. The storm rages on, and I need to get back to feeling battered and helpless. I'm sure there is a lot more angst buried deep down, just waiting for the next stupid bug to give it energy and meaning.

I did a poor job of not ranting, but it is so hard not too, particularly when so many technologies are dedicated to disappointing their users. It is just an endless array of examples of what elegance is not, and never will be. You get those rare moments of being caught up in the eye of the storm --- thinking just for a moment that you could use the technology for good -- only to find yourself thrown right back into the fury. You lucky if you can just make something work fairly reliably.

Strangely enough, you'd figure that at least programmers would be able to build excellent tools for other programmers, given the obvious fact that they are expert users in the same field. But something odd, drives them to short cut their solutions and produce rather lame tools. Editors for instance have declined, not improved over the years. Scripting has as well. IDEs are better, but still badly designed and implemented.

The newer crop of coders seem dedicated to reinventing all of the problems of old, while ignoring all of the innovations. In some cases I suspect that the Internet is acting as crutch to allow really bad technologies that should have died a natural death, to carry on torturing their users. Feeding -- because of the easy availability of information -- the storms that plague our industry.

3 comments:

  1. Well, as you said: you did a poor job not ranting. Me like! :-)

    You have some good points. I especially liked this:

    "I'd like to share scripts with my friends, and possibly the rest of the world. Check the share option, and it is done."

    Does this feature exist in any environment you know of?

    ReplyDelete
  2. Thanks, the problem with ranting is it is just too easy :-)

    Perl has CPAN, which has all of the elements of a common resource for sharing. But it's not simple.

    Way back, my 'bin' directory in UNIX would generally have hundreds of custom scripts, for instance several wrappers for grep that search specific project files. One for text, one for config items, one for code, etc.

    Mix that with a GUI, and then add a 'share with friends', 'share with the world' set of checkboxes and we'd have something interesting.

    I'm willing to invest time into setting up my environment, it is part of the old saying 'work smarter, not harder'. I don't want some other programmer to 'guess' at how I work. I want the computer to figure it out for me. If, as a programmer I can't find ways to leverage the technology I have, how can I write things for other people to do the same?

    ReplyDelete
  3. Well, if the "other programmer" does a good job guessing, I have no problems with someone setting my environment up for me - as long as I have the possibility of adjust it to fit my needs. Give me clever defaults.

    The sharing thing sounds really sweet. It can be done, it should be done. All that's needed is a central repository (like CPAN) and a linked IDE. Push the Share with the World button, give the script a name and description, push Submit. Voila! Of course it's not an easy implementation, but it could be done.

    ReplyDelete

Thanks for the Feedback!