The way we categorize programming is actually one of the biggest problems I have our current educational models. I wouldn’t necessarily suggest that most students be exposed to Computer Science as such. The reality is that you don’t have to learn big-O notation or advanced data structures in order to learn how to program. In fact, most programming languages have features and libraries that will abstract away any need to learn these things. You use a built-in function/method, and you’re already working with a highly-optimized sorting algorithm, etc. “Knowing what results X produces” is all that’s required for computer programming. “Knowing how X produces that result” or “how to make a Y yourself that will produce the same results as X” is within the larger scope of Computer Science.
I have a huge problem with how learning to program, on an institutional level, is almost always tied to a larger Computer Science track. The reality is that most people don’t need to know how to optimize algorithms if they’re already going to be using algorithms that have been iterated to mathematical perfection by proper Computer Science experts already. There is value in having a bare-bones understanding of the various search and sort algorithms, for example, but it’s not exactly essential. If you’re already working with these functions in libraries, it’s as simple as reading the documentation to find out which one would be best to use for your specific case.
I really wish, at the institutional level, we would stop treating programming as an entree to Computer Science (very few people actually want to be academic gearheads, though I have tons of respect of course for people who do), and allow it to exist as its own educational subset, an educational package that CS people will obviously need to go through, but which people who don’t plan on going into hardcore CS can essentially use as a terminal point. This isn’t to say that you learn the fundamentals of programming and then you stop learning, of course. The best programmers will always be learning something, whether it’s a new language, or a new stylistic flair in languages they already know. But the whole point of abstracting things in the first place is so not everyone has to be a CS geek to use what are often incredibly advanced algorithms. There is no reason why we have to marry programming and CS as tightly as we do.