I have 3 years of work experience and I feel that I still hack things together till they work. Its the same as when I started programming. What did change is that I do it much faster and with fewer mistakes.
I read Clean Code, Refactoring, DDD and others. My impression is they just provide patterns to apply in existing design/code, they don't provide guidance in creating the design in the first place.
I looked for online courses but none looks promising.
Did anyone experience the same issue and found helpful resources?
The key to writing better code is to write more of it, then refactor it once you've discovered what actually works to solve the problem. Spend time making sure you document it, and don't ever take pride in "clever" code. Pride go'eth before the fall.
Always be willing to throw code away, and be willing to rewrite it, at least once.
For creating design, it helps to be mentored actually. Reading books about design patters and architecture helped me but nothing worked as much as a good mentor. You can always start with 'how would I desing a software that does X?' and think 'how would it change if I add Y' or 'how much can this scale?'. Find people around you or on the internet to discuss your ideas, that helps a lot,
Look up system design software. Personally I like [aws this is my architecture series](https://www.youtube.com/watch?v=IP03SkGbP-U&list=PLhr1KZpdzu...). In general what you say it is true. It is very hard to do software design right, you need practice and there is very little material on it.
Good luck!
think about it as a business (whether it is or not) every action has a price, in cash or in time or in both. aim for low hanging fruits. adapt to changes when they happen. experiment in small scale.
no person in the world can come up with design in their head and that would be it. software is never ending cycle of improving, layering, adapting. more often than not, stillness means death. design evolves with the code, what makes good design is how easy it is to evolve, and that takes skills and experience. sounds like you have the skills ("hack together until they work") and 3 years experience is no joke. to sum it up, my advice to you is to look at case studies of success and failure, these lessons often reflect on more than just programming
https://blog.codinghorror.com/quantity-always-trumps-quality...
The change of thinking that is needed to deal with immutability transformed the way how I approach software design.