CS majors learn to really program
I can't really point to anything I learned while getting my CS degree that was particularly instrumental to being able to "really program", and for that matter I don't think I could "really program" until some time after I had graduated. Practice counts for a lot here, especially considering how ungrounded and unreliable the current pedagogy of "software engineering" is. Practice and perfectionism did much more for me as a programmer than any course I took in college.
I grew intellectually through that study, but I've upped my practical effectiveness enormously in the last few years by working with great CS people and absorbing all I can of their mindset.
From my vantage point as a CS grad who maybe wishes he majored in math, physics, or chemistry instead, it looks to me like you're getting the best of both worlds. CS programs tend to be very focused on producing capable programmers, but programming is largely an operational set of knowledge that can't yet be reliably taught in a classroom. My wife is currently pursuing a chemistry degree, and I'm downright jealous of the information density in her courses compared to mine. CS pedagogy is simply immature compared to older fields, full of conflicting opinion, heuristics, and transient industry buzzwords. An exercise: Ask three randomly chosen CS majors what object-orientation is and why it's so great, and compare their answers.
I'm waffling on the regret because the degree did lead directly to an enjoyable, well-paying job. But most of the time I spent in CS classes feels wasted in comparison to the maturity and density of math and science classes.
Programming is maths in a way. As evidence I give you the Curry-Howard Correspondence
I really wish my CS degree had included type theory and Coq and the like.
I talk to many ABDs in math, physics, engineering, economics, and various other technical fields.
I work with exceptional people from all those backgrounds.
I would like to unreservedly say to any collegians out there, whether choosing an undergrad major or considering fields of study for grad school: if you know you want a technical major but you're not sure which, choose Computer Science.
Unless you're extremely talented and motivated, relative to your extremely talented and motivated peers, you probably aren't going to make a career in academia even if you want to. And if you want a technical major but you're not sure which, you shouldn't want to! Academia is a huge drag in many ways. When a math ABD starts telling me about how she really likes her work but is sick of the slow pace and the fact that only six people in the world understand her work, I get to take a nice minute alone with my thoughts: I've heard it over and over again, in the same words and the same weary, beaten-down tone. You shouldn't be considering a career in academia unless you're passionately in love with your field, unless you think about it in the shower and over lunch and as you drift off to sleep, unless the problem sets are a weekly joy. A lesser love will abandon you and leave you stranded and heartbroken, four years into grad school.
What's so great about CS, then? Isn't it just a bunch of glorified not-real-math and hundreds of hours of grimy debugging?
Let's start with several significant, but peripheral, reasons:
None of that gets to my real point, which is the modes of thought that CS majors build. Working with intransigent computer code for years upon years, the smart ones learn a deeply careful, modular, and reductionist mindset that transfers shockingly well to all kinds of systems-oriented thinking--
And most significantly to building and understanding human systems. The questions they learn to ask about a codebase--"What invariants must this process satisfy? What's the cleanest way to organize this structure? How should these subsystems work together?"--are incredibly powerful when applied to a complex human process. If I needed a CEO for my enterprise, not just my software company but my airline, my automaker, my restaurant chain, I would start by looking for candidates with a CS background.
You can see some of this relevance in the multitude of analogies CS people are able to apply to non-CS areas. When's the last time you heard a math person refer to some real-world situation as "a real elliptic curve"? The CS people I know have a rich vocabulary of cached concepts that address real-world situations: race conditions, interrupts, stacks, queues, bandwidth, latency, and many more that go over my head, because...
I didn't major in CS. I saw it as too "applied," and went for more "elevated" areas. I grew intellectually through that study, but I've upped my practical effectiveness enormously in the last few years by working with great CS people and absorbing all I can of their mindset.