I don't think I learn much from books. They're good for exposure and direction but haven't made so much an impact on the things I've internalized that let me think about and solve problems.
What has done the most for me is actually running into lots of problems and solving them by digging deep, finding the cause, and a good way to solve it. One thing that's been invaluable is the idea that any problem can be solved, any system can be understood (as well as necessary to solve a problem), and that everything is fair game and in scope for solving the problem (thinking outside the box? there's only the box you put yourself in).
Nowadays, I'm mostly learning how to better explain the thought processes behind good software engineering that is all about tradeoffs and not about following rules or applying patterns without assessing applicability.
Another superpower is always to think of the simplest thing that will work. Avoid using fancy words or creating abstractions that make software seem sophisticated and complex when unnecessary. That only lowers the limit of how complex a problem you can solve. If you get really good at thinking and solving problems in simple ways, you can solve much more complex ones when called for.
I would suggest an entirely different path: play Go, the board game. The rules are incredibly few and easy to learn. The tactics and strategy limited only by imagination and ability to count/execute while balancing priorities (important vs urgent). Another thing that it teaches is the counter-productivity of ego. There's odd parallel I've noticed where getting good at Go makes you better at other things and vice versa. I've taken a year or more off playing and when returning to the game, find I quickly get back to my past level and beyond. Alternatively, if a bit masochistic play StarCraft 2 ladder ;-)
What has done the most for me is actually running into lots of problems and solving them by digging deep, finding the cause, and a good way to solve it. One thing that's been invaluable is the idea that any problem can be solved, any system can be understood (as well as necessary to solve a problem), and that everything is fair game and in scope for solving the problem (thinking outside the box? there's only the box you put yourself in).
Nowadays, I'm mostly learning how to better explain the thought processes behind good software engineering that is all about tradeoffs and not about following rules or applying patterns without assessing applicability.
Another superpower is always to think of the simplest thing that will work. Avoid using fancy words or creating abstractions that make software seem sophisticated and complex when unnecessary. That only lowers the limit of how complex a problem you can solve. If you get really good at thinking and solving problems in simple ways, you can solve much more complex ones when called for.
I would suggest an entirely different path: play Go, the board game. The rules are incredibly few and easy to learn. The tactics and strategy limited only by imagination and ability to count/execute while balancing priorities (important vs urgent). Another thing that it teaches is the counter-productivity of ego. There's odd parallel I've noticed where getting good at Go makes you better at other things and vice versa. I've taken a year or more off playing and when returning to the game, find I quickly get back to my past level and beyond. Alternatively, if a bit masochistic play StarCraft 2 ladder ;-)