A self-healing system is one that is flexible enough to allow for corrections - mistakes or problems can be undone or fixed on the fly.
Manual or human systems tend to be self-healing by default. As we automate systems we make them more deterministic, only capable of acting in ways explicitly included in the systems' design.
Unless "undoing" and "fixing on the fly" are part of the analysis and design, the self-healing quality is lost.
A few points to keep in mind:
- Self-healing can be messy and uncontrollable so eliminating it via automation/determinism may be considered beneficial
- Designing a self-healing system can be expensive and time-consuming - you must think through unlikely or rare occurances
- Ignoring the self-healing aspect can be just as expensive if you must add flexibility to a system after its been designed and built
Demarco and Lister advise against automation in some cases:
If the business policy governing the new system has a sufficient degree of natural ad hoc-racy, it's a mistake to automate it. Determinism will be no asset then; the system will be in constant need of maintenance