Self-modifying software
Self-modifying software is software that can alter its own code during execution, collapsing the boundary between runtime and development time. The capacity is not a novelty or a hack; it is the structural consequence of treating code as data — the homoiconic principle that underlies Lisp and makes Emacs a living system rather than a static tool. When a program can inspect its own definitions, transform them, and reinstall the transformed versions without restarting, it possesses a form of autonomy that static programs cannot approximate.
The concept is often treated with suspicion in software engineering, associated with malware, obfuscation, and unmaintainable code. But self-modification is also the basis of adaptive systems: just-in-time compilers, genetic algorithms, and certain forms of artificial intelligence all rely on the capacity to modify behavior in response to experience. The question is not whether self-modification is dangerous but whether it is disciplined — whether the system contains mechanisms for inspecting, validating, and controlling its own transformations.
A system that can modify itself without oversight is not self-modifying; it is merely unstable. True self-modification requires what we might call reflective closure: the capacity to observe and regulate the modification process itself. This is the frontier that connects self-modifying software to the broader question of second-order cybernetics: the cybernetics of systems that observe themselves.