None. The best way to get way better at programming is to work on code bases written by people that are much more skilled than you. You cant learn math by purely reading a math book, you have to work the exercises. Go find an expert code base on github and hack on it, or work at a company on a team with very high programming standards
+1. I can nod my head while reading many books. It isn't until I encounter situations and apply solutions that I really learn things. More than specific books, the greatest thing I've learned is how to view a system. Thinking about underlying constraints (e.g. database) or boundaries communicating with other systems are the hard-points. All the stuff that happens in-between is mostly plumbing with a small bit of (hopefully) well factored key logic implementation.
Learning different kinds of things, e.g. distributed databases, functional languages, metaprogramming methods, etc makes you appreciate what they can do and makes you better because you can choose to apply some of those structures in more popular environments when they are beneficial (e.g. use of immutability vs shared mutable states).
Working on larger codebases with many developers, and for a long duration lets you grow from programming to software engineering for longer term goals that optimize effectiveness both in implementations but also the people processes that can work well or poorly depending on the choices made.
work on code bases written by people that are much more skilled than you
Two problems here. First, you can’t really be sure if they are skilled or publicly confident. Although learning confidence is useful too, for the same reason.
Second, you can only see what they do, not what they learned to avoid. The best way to get better is to write your own code, assuming you’re at least fluent. That will teach you what to avoid and you also learn your general predispositions and code anxiety/perfectionism levels. Good reflection on that will improve you a lot. I don’t think just parroting someone’s code makes you better, unless you’re very beginner.
I once had to work the codebase of a consultant who build up his business by having less of a T profile and more of a slightly thick, incredibly long _____ profile. His code was attrocious and borderline impossible to refactor because he never stuck to a language long and consistently enough to actually learn anything resembling code discipline or hygiene. He was always too busy learning the quirks of the language and framework, which took precedence over elegance
Usually you can go to GitHub, find a project with a lot of stars for the language you want and start browsing the code. It is worth paying attention to the general attributes of good codebase: tests, documentation, build automation. If all this is there, then most likely you will definitely find something interesting or new for yourself.