Adios to “computer programming”

Have you noticed how seldom people put the modifier “computer” in front of “programming” nowadays?

This may be because our formerly esoteric discipline is now so mainstream that it needs no elaboration.

It may be that we’re all growing lazy.

But I think there’s something deeper.

“Software Engineering” isn’t good enough

The set of things besides traditional computers that need to be programmed is growing by leaps and bounds: TV remotes, holiday light displays, e-readers, smartphones and tablets, Arduino boards, fuel injectors, point-of-sale terminals, MRI machines, 3D printers, LEGO MindStorm robots, networks (software-defined networking / SDN), storage (software-defined storage / SDS), nanobots, social networks, clouds…

Nanobots replicating in a petri dish. Is it fair to say we “program” nanobots? Photo credit: PhOtOnQuAnTiQuE (Flickr)

“Right,” I hear you say. “That’s why I like the term software engineering. Wherever you see programming, it’s software that’s in play. And engineering implies a more sophisticated approach than mere hackish programming.”


I think that’s true, but it misses the really big insight. Continue reading

6 Strategies to Simplify Software

How do you make things simple?

I’ve written that simplicity is powerful, and that it undergirds many deep architectural breakthroughs. In posts about pragmatism and balance, I’ve quoted Oliver Wendell Holmes about the simplicity on the other side of complexity.

But I’ve never talked about how to achieve it.

photo credit: hurley gurley (Flickr)

This is not an easy question; if we knew how to make things simple, we’d do it more often and more quickly. It takes some serious effort (and genius) to go from centuries of experiments and volumes of equations to e = mc2. I’ve been pondering simplicity in software architecture for a decade, and I’m certain I’ve only scratched the surface.

Still, simplicity is a learnable skill, and some strategies are consistently helpful… Continue reading

The 8th Characteristic

Biologists will tell you that life has 7 characteristics: organization, metabolism, irritability, reproduction, homeostasis, adaptation, and growth.

I think this list is missing something. It’s foundational, indisputable, and familiar even to kindergartners. But perhaps only kindergartners would call it out; several generations of biologists seem not to notice it enough to add it to their short list. Pick up a biology textbook, and you are unlikely to find a single chapter devoted to it.

Are you ready?

The 8th characteristic of life: mortality.

All living things die.

We see without seeing… Photo credit: John O’Neil (Wikimedia Commons)

Think about the consequences for a few moments. Would any of the ecosystems that you see on nature documentaries be possible without death? Would human civilization, as we know it? Read Orson Scott Card’s short story, “Mortal Gods,” and ponder.

Community blindness

Why am I writing about this as a software guy?

Continue reading

Progressive Disclosure Everywhere

If you google “progressive disclosure,” you’ll get hits that describe the phrase as an interaction design technique. UI folks have long recognized that it’s better to show a simple set of options, and allow users to drill into greater detail only when they need it. (Thanks to James Russell–a brilliant UI designer–for teaching me PD years ago.)

But calling progressive disclosure a “technique” is, I think, a serious understatement. Progressive disclosure aligns with a profound cognitive principle, and its use is (and should be) pervasive, if you have eyes to see.

The Principle

Here’s my best attempt to distill the operative rule behind progressive disclosure:

Focus on essence. Elaborate on demand.

In other words, begin by addressing fundamentals without cluttering detail. When more detail is needed, find the next appropriate state, and move there. Repeat as appropriate.

Stated that way, perhaps you’ll see the pattern of progressive disclosure in lots of unexpected places. I’ve listed a few that occur to me…


The scientific method is an iterative process in which hypotheses gradually align to increasingly detailed observation. We learn by progressive disclosure.

Good conversationalists don’t gush forever on a topic. They throw out an observation or a tidbit, and wait to see if others are interested. If yes, they offer more info.

The development of a complex organism from a one-celled zygote, through differentiation and all subsequent phases, into adulthood, could be considered a progressive disclosure of the patterns embedded in its DNA. The recursive incorporation of the golden mean in many morphologies is another tie to biology.

A nautilus grows–progressively discloses–the protective covering it requires over its lifespan. The golden mean, repeated and repeated… Photo credit: Wikimedia Commons.

In journalism, the inverted pyramid approach to storytelling is a form of progressive disclosure. So are headlines.

Depending on how you’re reading this post, you might see a “Read more…” link that I’ve inserted right after this paragraph. Making below-the-fold reading optional is progressive disclosure at work. TLDR…

Continue reading

Are You Designing an Apex Predator?

(This post is an excerpt from my forthcoming book, Lifeware. Follow my blog [see right sidebar] to catch the publication announcement.)

A paleontologist walks along a canyon. She finds part of a fossilized crocodilian skull in a layer of sandstone. She immediately knows that this creature’s environment was wet and warm, with an abundance of animal and plant life at all layers in the energy pyramid. In fact, that single clue implies an entire ecosystem with an amazing amount of detail.

Crocodylus Porosus: eats competitors for lunch. Photo credit: Molly Ebersold (Wikimedia Commons)

Her predictions derive from the fact that adult crocodiles are apex predators. They’re at the top of a food chain which stretches down through medium-sized herbivores, omnivores, or carnivores (in modern times, a zebra or jackal, for example), to smaller omnivores and herbivores (fish, turtles), to insects and nematodes and molluscs and arachnids, to plants in a thousand varieties… At every trophic level in the energy pyramid, there’s roughly 10x the biomass of the layer above it, so one crocodile implies a lot of bugs and reeds and mangroves.

Ask a kid for his favorite animal, and you’re likely to hear about an apex predator: tiger, orca, polar bear, great white shark, eagle. The freedom, fearlessness, and power of these animals captures our imagination.

Kids who grow into software engineers have an affinity for complex software “organisms” with highly developed competitive advantage. They still love apex predators.

As my friend Chris was pointing out to me yesterday, a highly evolved design comes naturally in software. Structural engineers are constrained by gravity and tensile properties of steel to not attempt bridges across the ocean; software, on the other hand, has much fuzzier (and more poorly understood) limits.

But here’s an important lesson from biology: apex predators require a rich, layered ecosystem in which their adaptations can shine. Take a crocodile and plop it down in the middle of the Sahara or the artic tundra; how long will it survive?

Software is the same way. If you are designing an enterprise application that offers rich reporting, seamless transitions to and from the cloud, sophisticated licensing, integration with management frameworks and directory services, single sign-on, and industrial-strength security, you are designing an apex predator. That’s cool. But is there enough “biomass” in the environment to sustain your killer app? The enabling environment has to include trained support and sales staff, analysts, VARs, professional IT organizations with time and budget, a friendly legal climate, whitepapers, a developer community, and so on and so on. If you don’t have this, your apex predator will die. Make sure you understand the ecosystem implied by your design; addressing the environment is as much a part of the design and development as the UML diagrams and the WSDL.

Cheating is possible. You can keep crocodiles alive in a zoo without an acre of mangrove swamp, and you can short-circuit VARs and skimp on whitepapers and so forth. But cheating is expensive and suboptimal. And even cheating requires plenty of planning and investment.

An alternative to cheating is to not try to build your apex predator until the ecosystem evolves. Maybe you should settle for a handful of snapping turtles and a snake, until the swamp’s big enough to house a crocodile. Snapping turtles might not be a bad business… This choice isn’t the same as abandoning a vision–it’s just realizing that ignoring the timetable of evolution may be unwise.

Action Item

Look at your roadmap. Is the next round of releases going to drop an “apex predator” on the market like a crocodile in the arctic? What must be true of the ecosystem for the product to succeed, and how can you make those things true?