@vinitcool76 while I appreciate all of your points as being excellent advice. I don't think all of them "make you better at writing GOOD code" mostly just 1, 3 and 6.
I maintain the single fastest and most reliable way to become a better programmer is to attempt to fix bugs and contribute to a MATURE open source library where your code is scrutinized by many seasoned developers and compared against a stable codebase presumably already using good design patterns etc...
Depending on the community around the project, the feedback from the senior contributors will make you a better programmer out of sheer necessity.
That said, design pattern and core language books should be within arms reach at all times. (and SO)