If a system is isolated, it can be replaced, errors can be reproduced, and intrusions can be tracked. What often happens, especially with hand coded set of print statements, is that a system is not fully isolated. It is easy enough to imagine a language with a run-time that could ensure full isolation. One improvement we can make is to record the state / heap / context periodically. That way it is not necessary to rerun a program from the start. The next improvement is to capture the state incrementally. Then the overhead is much less intrusive. It is just a matter of modifying a garbage collection algorithm. Notice that capturing the state incrementally interweaves monitoring an interface with copying variable values (which moves the interface / boundary). That allows us to adjust the granularity (and overhead). The big problem that remains is that we cannot move the system boundary. That means that we are hit with overhead every time data crosses that boundary. We can mitigate that because we can enlarge the system via components. Setup the run-time to use and to be used by multiple component frameworks, so the system can be expanded. That is the future of computing.