This article has got me really conflicted. On one hand, I am a CS graduate, but on the other hand, I work in theory, and I would always point out to people that computer science and computer engineering are two completely different things. Unfortunately the two are often conflated in almsot all CS curricula. Maybe there ought to be two different majors, one that focuses on building systems and implementing algorithms (as suggested) and the second that focuses on the basic stuff, designing algorithms, working on math applied to computer science (crypto, AI, etc.)
Yeah in my experience (both personal and from interviewing people), you end up getting a poor introduction to both (at least at the undergraduate level) since in many universities the major can't decide which it wants to be. You have cases where people know of NP (but have never done a reduction), and simultaneously know of version control (but have never actually used svn or git). This is really unfortunate because I feel similar majors (like math and EE) probably prepare you better for these fields (math perhaps being a better precursor to real CS and EE giving you great fundamentals for programming/comp engineering). It seems more and more like there needs to be a clearer separation, something like how econ or finance is separate from math, where math majors don't really have to learn excel or financial formulas, and econ/finance majors don't have to learn linear algebra, and both can go pretty deeply into the things they actually care about.
The counter argument to this is that we often see computer engineers that lack a basic grasp of the importance of algorithmic complexity and theoretical folks who write terrible code. You have only to read some discussions on "JS performance" to see the ridiculous attention paid to making sure variables are local, when in almost all cases user programs are actually being slowed down by O(n^2) algorithms being used. Similarly, a lot of theoretical work takes a long time to make it into the "real world" because they are inaccessible to engineers (being written completely "in math"), and often when they do provide actual sample code for their work its written in a very sloppy way (from a "code organization" standpoint). It really would be ideal if you could have a major that covered both of these really well (and I'm sure there exist some that do, I obviously have not gone through every CS/CECS/EECS major in every university).
At University of Waterloo we make that distinction by having a Software Engineering program that's part of both the Math department (the department CS belongs to) and the Engineering department.
We also have Computer Engineering, which is a middle ground between Electrical Engineering and SoftEng. :)