You can certainly get the big picture if you abstract the codebase in such a way that top level operations are abstracted by functions.
But of course it depends on the context and what you're trying to do.
React/Vue is a good example. You have some Application component that has a set of sub components representing different regions of the page, which have their own subcomponents and so on.
Makes it very easy to dive in from top down and drop into lower level abstractions as needed.
With some error handling code, for example, briefly commenting what conditions lead to what exceptions goes a long way.