I have a philosophy that I try to adhere to in all of life. I try to make questions meaningless. Let me explain. For example, people get confused when they ask, if the Universe is finite, what is on the "other side"? If you make the universe a sphere (n-dimensional) the question becomes meaningless. The Universe would then be finite, but boundless. There is no edge. This is similar to when early people that believed the Earth was flat, were confused when they asked, what happens when we reach the end of the world? Do we fall off the end?Quote from rosy2:
whats your recommendation to test/debug realtime event driven and threaded systems? I have no trouble testing individual pieces but the whole is different
In programming, I use this philosophy which is in the same spirit, imo:
Rather than fixing bugs, agile methods strive to prevent them.
Test-driven development structures work into easily-verifiable steps. Pair programming provides instant peer review, enhances brainpower, and maintains self-discipline. Energized work reduces silly mistakes. Coding standards and a "done done" checklist catch common errors.
On-site customers clarify requirements and discover misunderstandings. Customer tests communicate complicated domain rules. Iteration demos allow stakeholders to correct the team's course.
Simple design, refactoring, slack, collective code ownership, and fixing bugs early eliminates bug breeding grounds. Exploratory testing discovers teams' blind spots, and root-cause analysis allows teams to eliminate them.
http://www.freebookzone.com/goto.php?bkcls=se&bkidx=53&lkidx=1
Even more appropos in that book is the section called "Invert Your Expectations" but I cannot link to it.
I am assuming that you are talking about systems that have a non-deterministic program paths, as otherwise they are relatively easy to test with Unit Testing, imo.
Hence, I try to achieve a situation where if the components work correctly, the whole must. For example, I have become more convinced that threading is too hard in a complex interacting system, so I try to minimize the problem by using immutable data in the functional style. Other ideas are to use cores for processes, not threads. The problem then disappears.
