Here's a concete example of an imperfect indicator.
A while back, I was investigating a piece of hardware for home automation. You may have seen these doo-dads at Radio Shack under the name Powerhouse, but the root technology is called X-10. In this case, I was testing a a programmable controller for turning on and off devices in a client's house.
Being programmable, that meant it came with software that you ran on your computer to teach the controller about the things it's controlling. You could also leave the software running and have your computer control the devices, turning them on or off with a few keystrokes.
This is where the imperfect indicators come in. You see, a light (for example) could be on or off. You can send the command to turn on, and the light would turn on. Send the command to turn off, and the light would be off. That's just fine... except the software wanted to create a status "dashboard", showing which devices had been turned on and which had been turned off. Since the X-10 units don't (well, didn't) tell you whether they're on or off, it was up to the software to remember each device's state. If it sent an On command, the software remembered that the device was on; when the Off command was sent, the software kept track of that, too.
Two problems should be obvious:
- If you turn on the device locally (for example, use an X-10 light switch to turn on a light) the controller, and thus the software, would not be aware of this.
- If you start the software while some lights are already on, it would have no way of knowing this fact, so the on/off indicators in the software wouldn't reflect reality.
In this case, the software created imperfect indicators—its own repertoire of device states—which weren't closely-enough coupled to the actual states to be reliable.
Imperfect indicators usually spawn awkward work-arounds in order to minimize the disparity between the two states... (and when some seemingly-crazy behavior is evident in something you use, consider that it might be a bandage over one of these.) For example, the software designers might have reasoned that they could have obviated the second item above by imposing the awkward imposition of forcing the real world to reflect the state of the software when it started up: that is, turning everything off whenever you launched the software. But that still doesn't solve problem 1...