This is very true for my school. CS is a part of the Arts and Sciences program and it is fairly common for 3 or 4th year students to not be able to use gdb, write a makefile or assemble a header. They will have fairly decent experience with various algorithms and data structures, just not a lot of experience implementing them in actual systems. In this sense it definitely feels that most CS courses should just be math courses.
What most people want from CS, they actually would probably get in SE and CE degrees. Whereas in CS, you get dropped into python or java and told to create a linked list, in CE or SE you start with something low level like C and then go even lower into x86 or ARM.
You might say that knowing algorithms is a lot more important than "coding experience", but there are algorithms, data structures and security courses in the engineering program too. On the other hand, it is very possible to go through CS without knowing what an ALU is, or how multipath cpus work, or parallelization for GPU/MPI. I truly think that most people who go into CS, don't fully understand that it really is a Science- a subset of Math, even.
Really here is my advice:
If you want to be a good programmer, get an undergrad in something like Math or Physics where you will learn most of the math you'll ever need as a programmer. On the side, dabble in some C or even python - maybe take some computational physics classes where you'll be forced to learn basic linux commands and you'll get some coding experience. Read some fun language books like sicp and c book Then go for an MS or PhD(feel free to drop out with an MS) in Systems, Computer or Software Engineering and take whatever sounds interesting.