Hi Florin,
you're in for some interesting questions :)
First, I did not have a methodology for finding the issue (or explaining the algorithm) when I started, and I didn't have one afterwards; you need to look into the WhyLine stuff for that (they do a lot better, but I don't have the time to reimplement their tool).
But I noticed that understanding an algorithm is easy (relatively) when:
- You can easily move repeatedly to any point in an execution stream of that algorithm (i.e. ubiquitous debugging: step forward, backward, jump at any point back and forth, any number of times).
- At each point, you are given the precise point in the source code (debugger-like)
- At each point, you get significant values: assignments, arguments, return values
Representation is easy: an execution is a tree. A sequence in this execution is items at the same level in the tree. Calls are subtrees, as well as iterations. Gui is simple: a tree on the left, code pane on the right. See an example underway: I'm trying to find a bug in LayoutFrame, so I traced LayoutFrame>>transform: (without breaking Morphic).

This is for exploration at the moment, and not comparing values. And on a single method, and highlighting is broken in Pharo 4 :(