I have been trying to practice some design skills by making things beautiful and simple. My domain of work is very narrow, so all I can do to design is writing my code in a more elegant way. That is, providing useful comments and structure, and breaking down functions in a succinct way.
And I enjoy doing that. I think it makes code much more readable, and it shows a sign of maturity. I can see myself improving on this over time.
On the other hand, I’m also learning a new technique to better estimate software tasks. I find that this is a underrated skill. This is important when people ask you how much time you think it takes to implement a feature, as giving an estimate shows that you’ve spent a great deal of time to think about the problem at hand.
I get a better sense of software design by learning that the core of a system is the object data model. Everything, the UI and the external storage, are representations of the model. Any time you want to extend the system or add a feature, you should start from the core, unit test it to make sure it works as it is meant, then write the peripherals to finish off the system.