Skip Navigation
16 comments
  • Get it up and running in a dev environment and start inserting changes to see what breaks where.

    Revert and retry until you’ve learned where you’re supposed to be meddling.

    • Another big advantage of getting a dev environment setup is if you can get step by step debugging in place as well. You can then use that to follow the trail of a user action from the UI triggers all the way down.

  • I have two key points to understand any large codebase:

    • Start with the entry point. Check the initialization process. It will most likely tell you what other parts of the code are crucial to the application. Start digging into those parts that are mentioned in the initialization process. Rinse and repeat for their dependencies which might look important. Just read and take notes if necessary. Try to understand how the application gets its stuff running. Don't spend too much time on a specific part, just get a broad understanding and how it all flows.
    • After the first step, you should start seeing some sort of patterns to how the software is made: repeating principles, common practices, overall architecture. This is the point when you should be confident enough to introduce changes to the software, therefore you should have a build environment which guarantees the application works. If it doesn't, have someone in the team help you to get it running without any changes to the codebase. Don't make changes until you have a working build environment.

    With both done, you should already be comfortable enough to start modifying the application.

    I cannot stress enough how many developers I've seen trying to dig into random parts of the code knowing nothing where or how it all begins, making it super-problematic to add new features. Yeah they can fix a bug or two, but the biggest issues start when they try to implement something new.

  • Depends on what I want or need to "understand".

    I've worked for many years on a project (it's a whole project ecosystem tbh with multiple projects; desktop winforms app, server app, SQL server, asp.net MVC app, asp.net blazor app, mobile wpf app, sync service app). On the main project (client + server) I haven't visited one major area, and another I confidently know that it's not understandable to me without specific deep effort.

    I recently had to work on the latter. I take a localized approach. Explore what I have to do, without opening the full scoped understanding that'd lead me to architecture refacs. I write out the method call stacks to get an overview of who calls what when. To then know what I have to inspect and analyze further.

    I take notes where necessary, or improve and comment code where appropriate for better understanding and obviousness.

    I create documentation - about concepts and architecture as appropriate and necessary.

    Code should be obvious and intuitive. Concept docs should document the broader concepts.

    When those concept docs exist, those are what you look at to understand app intention and behavior. And it should give you an introduction to architecture. From there, exploring the code should be self-explanatory (but may require specific, repeated, and iterative analysis). And I take notes about what's relevant and I need for understanding or task.

    Afterwards, those notes should have, or should then integrate into the code base or docs, or be determined irrelevant for that. If I had to write them out and down, it's more likely they should be part of something than not.

16 comments