So. DSA is relatively straightforward to get good at: methodically go through some common patterns and train yourself on the variations. However, system design is a completely different beast.
There's the hard science component of "this DB cluster will probably handle 10K QPS at this scale", eventual consistency, etc. System. And then... there is the art. Design.
I understand there's some level of mentorship/guidance involved, but I'd rather be a mostly hands-off self-improving machine like Jonathan Chiou.
As far as I see it, this is what makes DSA straightforward to improve in: rigorously measure your own work against an objective set of metrics, rinse and repeat.
So my question is: How do you audit your own work when you do system design?
Honestly most of my improvement outside of coding skills has been repeated pratice in a broader group. For system design, I started with:
I also try to design systems to be simple. My prioritiy is breaking down the system into a hierarchy of smaller pieces (needs to be small enough to describe in 1 phrase or 1 word). Ideally I'm going for a structure like somewhat balanced tree or a list. Then I focus on the implementation of each piece.
Good question! I highly recommend going through this related discussion: "How to upskill effectively, especially with the software design aspect?"
You are 100% correct in that system design is very different from DSA when it comes to evaluation and improvement. DSA is pretty cut-and-dry. System design is super fuzzy. When it comes to system design, there are 2 main ways to get better:
#1 and #2 are both very important. #1 generally yields the deepest learning as it's the most hands-on. However, #2 in particular is important as you need company/org-specific context for system design. What's good system design in one company could be terrible in another. It's important as an engineer to flow like water and adjust to where you are working.
In terms of measuring your progress with system design growth, it's also relatively straightforward: