1

How can I learn the seemingly countless technologies that were used to build my team's services?

Profile picture
Software Engineer I at Amazon7 days ago

I am joining a team a backend team at Amazon that I have interned for twice before. Both times I delivered my project but did not deeply understand the codebase.

I know Rahul and Alex have talked about not going deep into the code at a monolithic application like Facebook / Instagram but each of my team's services are less than 5 years old and are large but can definitely be understood indepth. And as the scope of my projects increases I feel like I need a deeper understanding.

We are also having some initatives in the next year where large parts of the codebase will need to be redesigned / rewritten so having more context will be very useful soon.

The issue is that each service has:

  1. Language specifics (ex. Intermediate/Advanced Java)
    • I know basics of language but not familar with the industry level code I see in codebase
  2. Language specific library / frameworks (ex. Lombok / Guice)
    • not familar with at all
  3. Dependency Injection framework (ex. Dagger)
    • not familar with (understand basics)
  4. Build tools (ex. Ant)
    • not familar with at all
  5. Unit Testing / mocking frameworks (ex. Mockito / Junit)
    • not familar with (understand basics)
  6. Cloud Technologies (ex. CDK / Terraform)
    • not familar with (understand basics and can use console)
  7. Numerous internal specific tools with their own documentation
    • not familar with at all

I have made code changes in the past by referencing other code examples in the code and trying my best to understand them. But to be honest this has lead to very limited understanding myself: I'm just copy and pasting. Lately, I have been using AI to understand the code and concepts while working which is a lot better - but even AI chat will only give you answers to what you ask and will only provide limited depth.

When I've ask team members, they tell me to keep completing tickets / finishing my stories and I will slowly gain an understanding of how everything works. But I feel like I can never go deep and I'm just rushing to finish stories. The best advice I've gotten so far is to finish your stories as fast as possible so you have the time and mental energy to go deep and learn.

I have gained deep understanding from writing code from scratch after going through documentation or a course or a textbook. Not by copy pasting.

Would love any feedback on how to tackle this!

26
1

Discussion

(1 comment)
  • 1
    Profile picture
    Tech Lead @ Robinhood, Meta, Course Hero
    6 days ago

    I think you have already found the answer: Remove as many helpers as possible.

    Instead of doing the standard strategy of copy-pasting a 90% similar code sample and then tweaking the parameters, try to write the code from scratch. Whenever your memory fails to produce something from scratch, then you can use some aid (AI, documentation, Googling, looking at another code sample) to unblock you just enough to get you to the next step where you then try again to write the code from scratch.

    Another piece of advice I have is to be curious and dig deeper as necessary. Are you running into some bug which you know can be fixed with lines of code XYZ, but you don't actually know what's going on underneath with XYZ that makes it fix the issue? Then go find out! Command + click a bunch and read through the layers and how they harmonize with each other. The tricky part is making sure you don't go to deep and unwrap the entire abstraction (this is death at a company like Amazon). Follow the advice here on striking a balance: "How to avoid going down the rabbit holes when learning new things?"

    Your teammates are also correct in that depth takes time and patience. You are just starting your career, so you shouldn't place too much pressure on yourself. It will take an engineer a minimum of 6 months to be regarded as an expert, often 12+, which is usually the case for an SDE 1.