Arsenal Thinking

I don’t want a silver bullet, I want an arsenal. –Ed

I’ve observed a common mind set in my consulting gigs - “silver bullet thinking” - where the community clutches a new paradigm and forcibly applies it to every problem they encounter. This has happened over and over with object oriented computing, service oriented architectures, message passing architectures, remote procedure calls, the Web, and others. Paradigms that are suitable to one class of problems rarely perform well on other classes.

Examples of misapplied paradigms include:

  • Distributed computing, RPC, enterprise objects, or web services used as the fine grained internal architecture of an application

  • Uniform memory access applied to strongly non-uniform memory access (NUMA) architectures.

  • Enterprise architecture principles applied to systems built for a small number of users.

All of these have easy counter examples where the inappropriate paradigm can work. Those that promote these arguments are committing a kind of fraud. They are representing exceptional cases as suitable for common application. Extrapolation from a single case is a slippery slope that is readily embraced by the lazy and counter-example justifications for best practices begins a steady path to gross inefficiency.

The only problem is that most people are already faced with overwhelming complexity and being given solutions that have complex rules about where they work drags the adoption process and introduces huge overheads. This is the problem with searching for silver bullets.

    “As simple as possible but no simpler” — Einstein

An alternative practices is to view paradigms and frameworks as weapons in an arsenal. The key to an arsenal is having enough weapons of enough different kinds for anticipated challenges while keeping the number of weapons to a manageable level. Another critical skill is knowing when to apply which tool.

A good computer scientist should have an understanding of the established paradigms to anticipate their suitability to addressing problems. The computer scientist should also know their own depth of skill well enough to know when to reach to an expert instead applying the paradigm on his or her own.