I still remember a trip I took a few years backs to a furniture store that purported to sell "Amish" furniture. If you are unfamiliar with the Amish, they are a much caricatured religious group that disdains modern technologies such as electricity. The notion of the store is that Amish furniture is better since it is hand-made (although from the looks of it, the Amish people who made this furniture probably had a router table and some other pretty modern equipment, so I suppose that they meant Amish-style furniture or perhaps the furniture itself had been converted to follow the teachings of Jacob Amman). While I was browsing I overheard a curious conversation between a salesperson and one of the customers. The salesperson pulled out the drawer from a one-drawer oak writing table and showed the customer the high-quality dovetail joints on the rear drawer panel. He then spent about fifteen minutes explaining how great these joints were and how you just couldn't find that kind of attention to detail in the "mass-produced" furniture world. After the pitch the customer inspected the desk for a bit and then, with a kind of "I caught you" expression, asked why the legs didn't have dovetail joints.
Sometimes certain kinds of table legs can make use of dovetail joints, but the preferred joint for this particular table leg was probably the mortise and tenon. To me that was obvious, but if you consider it from the standpoint of the customer his question makes perfect sense. Here was a person newly empowered with information, ready to understand the world in a new and better way. He had just learned that the dovetail joint is the best joint in the world and so he had expected that to be good the table should have the best joint used throughout. This is the kind of situation that proves the old adage that "a little bit of knowledge is a dangerous thing."
Of course, you need to cut the poor guy a break. Joint type selection is actually a pretty complicated problem. As it turns out, different types of joints (lap, mortise-and-tenon, dovetail, biscuit, dowel, finger, etc) are used in different situations depending on such factors as joint location, appearance, required strength against different types of stresses (static and dynamic), proximity to other joints and stress points, expected lifespan of the joint (glue weakens over very long spans of time), availability and cost of hardware, and the type of manufacturing process involved (factory vs custom, etc). Sadly there is no universal joint in woodworking, which is why a fifteen minute conversation with a twenty-year-old salesman can't be expected to lead to full enlightenment.
I find that the dovetailing presumption (thinking there is one right solution to an entire class of problems) is a pretty common mistake in software. A good example of this is in the area of workflow tools. A workflow tool is a powerful tool; it can do a ton of things for you. Generically, people think of a workflow as being analogous to a business process: first person A does something then person B, then either person C or D depending on what B did, etc. The problem is that the word "workflow" is like the word "joint" it describes something at too high a level of abstraction to be useful for someone actually doing work. If you ask a woodworker, "what kind of joint should I use, a mortise and tenon or a rabbet?" they'll probably look at you funny and ask you, "what are you using the joint for?" The question simply lacks enough context to be meaningful. Workflows have the same problem as joints in this regard. The more you know about workflow systems the more you realize that there are many kinds of workflows and while they share some commonalities they share just as many important differences. Workflows can be either single or massively-distributed (where hundreds or thousands take place at the same time and need to be aggregated back together). They can be predefined or dynamic. They can be simple, complex or compound. They can be data-dependent or data-independent. In short, there are at least a dozen import characteristics and that's just at the surface level of distinction.
Unfortunately most workflow tools sell themselves as universal workflow solutions. Workflow vendors want to think of themselves as being analogous to Database vendors: they've got the only tool you'll ever need. If they didn't think that way they'd have to realize that their plans to become a $2 Billion/year company probably wont succeed and that they should be content with options worth about $0.50/share. So instead of building simple and easy to use products that do a specific kind of workflow really well, they build swiss-army-knife workflow tools with integrated toothpick and cup-holder. This is great for managers and engineers who think that they can invest in the product before they've invested in figuring out what they need to build, but it sucks when it comes time to build anything.
A good part of this problem is wed to the recent death of the tool-maker software company model. No one wants to become Visigenics or RogueWave and see their business model come crashing down after people can get what you offer for free elsewhere. People want to build product companies (or better yet service companies) instead. These companies provide long-term lock-in that keeps people coming back for more (even after their product is no longer better than what other people offer). This is too bad since a tools approach would be exactly right for the workflow arena where you need a set of relatively independent tools that work together seamlessly. Of course this also doesn't lend itself to the cool GUI demo and the workflow in 10 seconds demo, but it's probably the right answer for all but the most trivial of "workflow" problems.
I don't want to single out workflow, however. The problem of the dovetail presumption is everywhere. People make this mistake with database servers and programming languages and processes. They think that since Oracle is more powerful than MySQL they should even use it when the problem doesn't require the added flexibility. They think that because C is faster than Ruby they should write tools that don't need performance in C, or on the flip side they think that because C# is more robust than C it should be used to write code that is performance critical. The web is baked through and through with people making the dovetail presumption. AJAX is cool so it gets used when the requirements would have been better suited to Flex or Laszlo. Since XML can model almost any data we break its back to make it into a programming language.
There are a number of reasons that people fall into the trap of the dovetail presumption. First, people want problems to be simple. They don't want to take the time to learn what the alternatives are for a given problem or they feel they simply can't afford to take the time to do so. Unfortunately, the time they save by not learning to understand their options frequently gets used back up later when they make bad choices. The solution to this is to ask yourself the most specific questions you can about what you need to do. If you are building a system to help automate a business process, walk through a few examples of how you will be using the tool and what you would actually have to do to make it work in your environment. If you can design the workflow entirely within a tool then do it, if you cannot then at least perform the mental exercise of figuring out how you would integrate with it. Basically, just don't be lazy. This shouldn't be taken as a license for excess either. Making mistakes is inevitable, spending TOO much time thinking through all the possibilities will get you too invested in your final choice which can make backing out much more mentally and politically difficult.
The second common reason that people make the dovetail presumption is a lack of information about the problem they are trying to solve. When a problem is loosely defined there is a tendency to look for the most "universal" solution possible with the hope that it can be molded as the problem itself comes in to better focus. This makes sense on the surface, but my practical experience has taught me that it's better to find the narrowest solution possible when a problem is poorly defined since it will be the easiest to replace. Picking the broadest solution creates up-front costs that cannot be recovered. This is an example of the YAGNI principle (You Aren't Going to Need It) as applied to added functionality in your tools.
The third reason people make the dovetail presumption deserves special attention. Sometimes people choose to over-simplify a problem because they don't think that other people will understand the complexities. This is what companies do when they sell their products. It's what standards makers do when they advocate their standards, and its what tool makers do when they hype their tools. What would your marketing materials look like if you said you made the worlds best database for small applications that are read-intensive, don't require transactions and have a predefined set of queries? All of this oversimplification is fine when it stays at the level of rhetoric, but it rarely stays at that level. Companies actually DO try to build fully generic tools to support their business plans and standards makers actually DO try to make universal standards to increase the mass-marketability of their standard. This dumbing down of problem domains (while beefing up the complexity of the actual tools) means that programmers frequently get stuck with a host of overly generic options (none of which quite fit) and a marketplace telling them (and their managers) that the problem has been "solved" for them. It is a vicious political cycle with very real technical implications. It's like going shopping at a clothing store that just sells XXXL and having your boss tell you to buy a belt and suspenders.
This last cause is by far the most insidious. The first two have a natural self-correction built in: you make a mistake and you learn from it. The last is a virtual necessity of the market, especially when you throw Venture Capital into the mix. The kinds of small tools that people REALLY need don't offer the return on investment that VC companies need. Even when someone does build such a tool they can't afford to market it (other than via guerrilla marketing) and so they can be hard to find as a consumer. In the present business climate this means that small tools are a virtually dead industry and your only hope is that you can find an open source option. While I am a pretty big open source advocate (of the pragmatic but not religious variety), I still think it's a shame that the small tool vendor business model is such a loser. A lot of really bright people with cool ideas for useful but focused tools basically have the choice of giving away their work (and getting complaints rather than a pat on the back for their efforts) or not bothering. A lot of them choose the latter.
Regardless of why people fall victim to the dovetail presumption the effect is that a lot of really bad code gets written. The thing to remember is that in programming there are very few magic bullets or universal truths. Programming is the way of balance, the way of the gentle middle. People who want the universal answer are either selling something or buying something. A good crafts-person knows to let the task of the day suffice.
P.S. As a totally tangential side point, my ultimate solution to the death of the software tools business model is for someone to build a big company that does nothing but provide a lot of different small and focused tools well tailored to specific needs. They could either acquire or appropriately license various existing small tools, act as a marketplace for people wishing to write such tools, and add a generalized marketing component along with quality assurance, custom development and support. In essence this company would exist to ensure that people were getting not just a concrete and specific solution, but one that is of high enough quality that it can and will be supportable. I'm not exactly sure how this business model would work out, but I know I'd be willing to do some shopping at that kind of company (as long as they provided full source code). On a really, really side note: if you feel like funding this business model give me a call and I'll see who I can find to help get it under way :)









