There is a compelling argument that, in the age of nearly limitless computing resources, it doesn't matter anyway. You will in all likelihood be a glue programmer: you'll rely on APIs and libraries, most of which have been written by someone else, and you will simply string them together by applying the functions that most obviously address whatever problem you're trying to solve. Who cares, really, if you're using Quicksort or heap sort, you're just going to call sort() on your array (or map, or key-value store, or whatever), and define a callback function that will evaluate any two given values in the array to be sorted, and that's it. Who cares if one requires a little more memory than the other, or a little more time to execute?
I'd argue that such a programmer does not need a degree in computer science to do this work. How do I know? Because I don't have a degree in CS, and that's mostly what I do. And if I can sit down and learn, say, C# for a job, certainly someone that has come out of a good CS program can, too. A CS degree shouldn't be about learning a single language (or three).
I agree that a programmer doesn't need a degree in CS, but to have a CS degree doesn't mean you're a programmer. A topic earlier showed that 26 of the ACM Turing Award winners had degrees in mathematics, and a lot of the theoretical CS is math anyways.
If a student in college wants to acquire a CS degree, they should be exposed to fundamental ideas in CS, not just what they'll need to be a professional programmer.
This is really the root of the problem. Computer science/programming is immature as a profession. There are not clear, broadly accepted rules for what roles exist and what requirements there are for one to fill the role.
Looking at building houses (just the construction side, not the mechanical systems), we have:
- Architect
- Structural Engineer
- Architectural Technologist
- Carpenter
plus construction employees not officially certified.
Each of these has a specific test, both written and practical (apprenticeship), and specific roles in the building process.
In software, we have no standardized tests, so companies substitute "BSCS" for "Software Engineer" in the requirements. And there is only ever one role officially defined; there is no separate "Software Programmer". Internally every companies has "Software Engineer I", "Software Engineer II", etc however this is rarely exposed in job postings and requirements and is never standard between companies.
The software industry could solve all this hand-wringing by creating a set of standardized roles, testing to create Certificates of Qualification for each, and getting HR departments to require these. And it would be possible, even with an established industry. Canada has added several new Professionals over the last decade, working with the existing industry to define the job, requirements, and build a phase-in plan that allowed the industry to continue operating.
It's a specific field within mathematics, with its own emphases and body of knowledge, much like how podiatry is distinct from general human physiology.
Really, though, all mathematicians specialize once they reach a certain level, for the same reasons all physicians specialize. It's just that you only happen to know the name of one of those specialties.
I'd argue that such a programmer does not need a degree in computer science to do this work. How do I know? Because I don't have a degree in CS, and that's mostly what I do. And if I can sit down and learn, say, C# for a job, certainly someone that has come out of a good CS program can, too. A CS degree shouldn't be about learning a single language (or three).