> while many practical skills are at best learned as a side effect.
I strongly disagree, that’s the intent not a side effect.
It’s IMO a common misconception that early algorithm classes are just designed around learning algorithms. Instead basic algorithms are the simplest thing to turn abstract requirements into complex code. The overwhelming majority of what students learn are the actual tools of programming, debugging, etc while using the training wheels of a problem already broken up into bite sized steps.
Ramping up the complexity is then more about learning tradeoffs and refining those skills than writing an ever more efficient sorting algorithm or whatnot.
That is true, in the sense that the 100/200 level classes are covering programming basics in addition to whatever algorithmic theory is being presented. But beyond that that, programs really seem to differ pretty strongly on applied projects and software engineering practices (basic stuff like source control) and more theoretical/mathematical concepts. One type of capstone style class commonly seen is compiler design. To a certain extent, a good school will teach you how to learn, and give you enough of a background, class projects, internships, electives with applied options, that you get a well rounded education and can quickly ramp up in a more typical software organization after graduation. But as someone who has hired many new grads over the years, it always surprises me what sort of gaps exist. It rarely is about programming basics, and almost always about "software engineering" as a discipline.
My experience is graduates of schools focused on the more practical aspects tend to make better Jr developers on day one but then stagnate. Meanwhile graduates of the more theoretical programs people pick up those same practical skills on the job leaving them better prepared for more demanding assignments.
This then feeds into the common preference for CS degrees even if they may not actually be the best fit for the specific role.
Interesting. I did my undergraduate in Germany and my graduate in the US, so my experience might be unusual here and different from what you get in the US. My undergraduate algorithms classes in Germany and my advanced algorithms classes in the US involved zero actual coding. It was all pseudocode as you'd find in the Knuth books or in Cormen, Leiserson and Rivest.
I strongly disagree, that’s the intent not a side effect.
It’s IMO a common misconception that early algorithm classes are just designed around learning algorithms. Instead basic algorithms are the simplest thing to turn abstract requirements into complex code. The overwhelming majority of what students learn are the actual tools of programming, debugging, etc while using the training wheels of a problem already broken up into bite sized steps.
Ramping up the complexity is then more about learning tradeoffs and refining those skills than writing an ever more efficient sorting algorithm or whatnot.