Some excellent advice here about "tracing in":<p>> I start with a feature or use case, and start from the outside in to trace the codepath that the feature follows. During this process, I take notes about the files, lines, and functions I’m going through, but I do not yet attempt to understand how anything works. This is the “trace down” phase.<p>In my opinion this is what makes it easy to discover how programs written in Go, Rust and C work, while it typically is not easy to discover how programs written in Java or C# [1] work typically - abstracted wireup via IOC containers often makes it difficult to to determine which code is likely to run.<p>[1]: Yes, yes, not all Java etc etc...
I can only speak for myself here, but why would step 1 be "become a user"? I ask because I don't fully grok why I would want to contribute to a project I don't use (either in my personal time, or work time)?