I like to try two impractical tasks (impractical in the sense that they might not be possible, which is fine).
1. Access some data in the highest level component from one of the lowest level components
2. Access some data in one of the lowest level components from one of the highest level components
In a lot of cases, good architecture will prevent one or both of these from being possible, but identifying how data flows through the app seems to be a good way to understand the general architecture, limitations and strengths of most apps. These two tasks give concrete starting points for tracing the data flow.
1. Access some data in the highest level component from one of the lowest level components
2. Access some data in one of the lowest level components from one of the highest level components
In a lot of cases, good architecture will prevent one or both of these from being possible, but identifying how data flows through the app seems to be a good way to understand the general architecture, limitations and strengths of most apps. These two tasks give concrete starting points for tracing the data flow.