- Designing Data Driven Applications - Kleppmann
- The Art of Unix Programming - Raymond
- Pretty much any of the programming books published by No Starch Press
And more pieces of advice.
1) Learn SQL. I mean really, really learn SQL. And then learn the basics of how relational databases work. I'd recommend Postgres for the dialect because of its quality and maturity.
2) Absorb everything you possibly can by Rich Hickey and Stu Halloway. "Simple Made Easy" is a talk that you can watch dozens of times over a decade (I have) and still come away with new insights at different levels of experience. The Clojure community has very mature engineers and they work on extremely hard problems. They're concerned with fundamentals.
3) https://www.ribbonfarm.com/2013/07/10/you-are-not-an-artisan...
4) You're going to learn most by immersion in an ecosystem, and the best way to learn is to find a job at a solid tech organization. It doesn't have to be a FAANG (and probably shouldn't be honestly), but find practitioners working on problems you like and show up to help. There is no shame in having entry level grunt work on unglamorous projects: you will learn the most on messy projects other people do not want to work on.
5) Do the work. I've worked in software for 20+ years and my first job was in a tiny cube making $5.15 an hour and I retired a year ago. It's popular to talk about work+life balance and lots of creature comforts, but the truth is hard work and forcing yourself to constantly solve harder problems (depth) and learn more languages/techniques/practices (breadth) is what you need. There is no substitute to persistence and pushing yourself to accomplish harder things. Have pride in your work and humility in what you do not know, which for all of us is quite a lot :-)