Defining the “Engine”
Engines in the automotive industry (and pretty much all other vehicle industries) have a very strict definition. The word is so strictly defined that just about every engine manufacturer will produce a component that performs pretty much the exact same task; most of them even have roughly the same dimensions. They all burn (or otherwise consume) fuel to create torque. Basically, they make something turn. Engines don’t deal with the wheels (the drive belt is a separate part), or how the fuel is passed in; all they do is generate power. We can very specifically identify what an engine is when we look under the hood of a car, and we know exactly where the engine stops and where the other parts begin.
In the software world, “engines” don’t have nearly as strict a definition. The term comes up a lot, but it is never strictly bound by a specific functionality. In software, we tend to consider an engine as anything that “powers” something else. The problem with that definition is that, in the right context, anything “powers” something else. It might allow for more abstraction (something we developers love), but it also makes an engine no more meaningful more than calling it a “component”, or a “thing”. At some point, it’s important to set a strict definition of where the responsibilities of one component end and another begin.
Blogs are Engines(?)
I often hear WordPress described as a “blogging engine”. In the sense that it powers blogs by allowing people to post bits of text and media, sure. But how do we define the boundaries of WordPress as an engine? WordPress is also a full fledged blogging tool, something the end user touches directly. When we say “WordPress the engine”, do we mean just the bits that handle blog posting, or are we talking about the admin interface too? In my opinion, calling WordPress an engine would be like calling a whole car the “engine” and saying the cupholders are plugins.
So does WordPress just consist of an engine inside of it, or is it all a big engine?
Games are Engines(?)
3D engines have the same definition problem. Back in the day, Id was the king of licensing 3D “engines”. They were very simplistic, though still quite functional relative to our real world “engine” counterpart. They basically handled the OpenGL abstraction, but handled a bit of game logic too. Nowadays we have engines like the Far Cry engine, which not only do 3D graphics, the entirety of game logic, but they now come with map editors and modelers built in. We’re hardly talking about an engine anymore, this is practically a full development environment. Where is the line?
We do have examples of words that have very explicit meanings. For instance, when we hear the word “drivers”, we tend to understand that we’re talking about a kernel extension that interfaces a hardware component. The boundaries of a device driver is usually quite specific, and we know exactly where the component fits into our system. There are others, but we could use more of these guys.
What’s an Engine to You?
I think it’s interesting how much leeway we give our words (for the most part) in the software industry. We always like to shy away from committing to any assumptions whatsoever. This sounds nice, but perhaps our inability to strictly define component boundaries is why we have so much trouble defining what software is, and perhaps more so, why we have so much trouble managing software projects. It would be extremely helpful to project scope if we could say “I’m building X which means you will get functionality Y” without having to redefine “Y” each time.