TDD Zealot. Clean coder. Dotnet dev. Full stack. Helping the modern world go round. @BrookNovak
Building good designs is a continuous journey that requires practice, experimentation and reflection. Look at diagram below. Google the keywords. Practice one thing at a time. Understand patterns and guidelines before using them. Engage your brain when designing and coding to relate it back to desirable properties of good system design.
And the answer to "what makes a system design good?" is .. drum roll ... it depends.
"There is no silver bullet". Even then, there is no perfect design.
Theoritcally maybe, but the cost of perfection it so high. So we have a vast body of knowledge that is continuously evolving on this topic in our industry.
Whether you learnt a lot of this stuff formally in acamedia or not - it's something that no one ever masters, and it is something we should strive to continuouly reflect upon.
Disclaimer: this is a picture of my personal journey which I have been on and will be always growing my entire career. It is not a comprehensive daigram that will stand the test of time, or be effective for everyone. It leans towards an OOP background.
Rather than regurgitating the meaning of each topic when there are so blogs and articles covering all these design-related topics and more, I will let you google.
A few points from the diagram:
I would recommend starting at SOLID. Read around the design topics that underly the principles to gain deeper understanding of why they are their to help us, then work your way up to patterns (or just try your own patterns that satify the principles).
Dont be afraid to experiment - how else do we learn!? Pick one thing at a time and see how yor codebases / systems can improve by applying them. Reflect on your experience and outcome.
You have a senior / lead architect? It's not all their responsbility: it's everyone's. They are not the gatekeepers of design - these senior roles are just human and are on their journey too.