You learn programming to get results from a computer system. For example, you might intend on making a web page. This web page needs to get data from an API somewhere and needs to store user data.
Once you start having goals like these, loops, arrays, OOP concepts suddenly become wildly, extremely insufficient. You’re thrown into a world of protocols, abstractions, state, each with their own rules and procedures that need to be followed.
Once you go and figure out all that crap, you become minimally dangerous. You need to keep building things in order to learn enough to make more and more happen.
Eventually you start coding your first big project. At this point, things you thought you knew, you realize you didn’t really know. You start really biting into the meat of programming. You start obsessing over maintainability, documentation, code cleanliness.
After some amount of obsession you go work on a business-critical project, and then you have to learn exactly how much time to sink into the previous higher-level code concepts. You finally truly grasp what a design pattern is and what makes them important.
After you’ve done all that, then you go look at the basics of a programming language, syntax and semantics, and it’s like you’ve never seen or really understood them in the past.