* Dimension 1: Code layout (organization) structure
* Dimension 2: Execution (data-flow) structure
* Dimension 3: Evolution (change over time) structure
All three dimensions try to capture some of the intent of the implementer, and understanding that intent is very important when improving upon the work. Along with that comes a perspective on what assumptions the author had. Code last modified 5 years ago very likely had different assumptions than code written last week -- Being able to see which lines in a function came from which era can illuminate things nicely, and that is only scratching the surface of this evolution-dimension.