I believe a CS student should learn C and C++ for imperative programming, and Python/Ruby as well for dynamic programming. That is the way I see it, with no balanced view, political correctness or anything of the sort.
I don't doubt that Java and C# are more than adequate, as they contain most if not everything good about C++, but you have to be more responsible without a garbage collector, and if you then need to work as a programmer you can go managed or unmanaged. Starting
off managed with C# means it is difficult for most to then go unmanaged.
I think the most pertinent question is why the CS student does not use what is there already, be it C++ or Java books. Don Syme says this in a recent video. Instead of saying "where can I find a F# Math library", you should find a C# library (or whatever
.NET langauge) and use that instead.
Oh I agree with that. CS students should learn about the unmanaged side of things too. Whether it's sane to start out with C++ though, I don't know. My university was strictly C++ in first year, and way too much time was spent by people trying to figure
out C++ the language rather than the problem they were trying to solve. This was even more apparent when I was assistant for that very same first year class a few years later.
However, the main issue I was getting at before is that you said you exclude C# because it's managed, yet you did put Java on the list in an earlier post.