Why do you expect students who are essentially going through a math program to be able to do that? now that is reason for concern.I started meeting people coming out of computer science programs who had never designed a CPU, programmed in assembly language, written a compiler or basic operating system or even programmed in C
implemented basic data structures themselves, and it's like everything below the level of what their programming language of choice and its runtime expose is magical to them
Yeah, I've read Dijkstra too. He was brilliant and his aloofness was admirable but he still wrote programs. The great thing about computing is that the machine is the best teacher anyone could ask for. Sure, everything we do is applied logic and combinatorics, but we can render our objects of study concrete and poke at them, we can see where our understanding is flawed because the machine throws it in our faces. That is what is distinct about computing, that we get to work halfway between the ideal and the real. If you don't want to do that then you're better off studying logic in the philosophy department or combinatorics in the math department.Why do you expect students who are essentially going through a math program to be able to do that?
Well, that's what I'm doing. It's pretty fun. Anyway, I think what you're doing is claiming that being "close to the metal" is somehow purer. This isn't really the case. I've done plenty of work in assembler, so I know that it's messy, prone to human error, and boring as hell. The only reason anyone should ever program in assembly rather than C is that they are making an application that needs to be extremely high-performance, or that a decent C compiler isn't available for their platform. Designing a CPU is only tangentially related to programming, it's more of an engineering problem than a programming one. If you mean understanding a CPU, that's probably worthwhile, but actually making one isn't something I'd ever expect a CS or SE grad to know how to do. I will agree with you that CS grads should know the realities of how their interpreters work, how to write C/C++, and how to make data structures. But CS is a very wide field, even if you take the view that it's just math, and you can't expect new graduates to have experience in the lowest levels of computers. It's like telling me I must be a shitty math student because I don't derive everything from first principles, or telling a bio grad they must have been in a terrible program because they don't know how to synthesize proteins. There's so much more than the lowest levels, and all of it is interesting and all of it is worthwhile, and there's only so much a single person can really be good at.If you don't want to do that then you're better off studying logic in the philosophy department or combinatorics in the math department.
Designing a basic CPU was a week long project at the end of my first undergraduate logic design class. Logic design is computer science as much as it is engineering; below that, when you start to talk about the physical implementation of your gates, is another matter. Logic gates are a model of computation, just like Turing machines, the lambda calculus and your favorite programming language. At that level designing a CPU is just a funny way of writing an interpreter. You're imagining it to be harder than it is because you've never gotten down that far, but it's turtles all the way down (and all the way up). Only paying attention to the high level is a mistake; you miss out on the unity, and the low level looks magical to you. Only paying attention to the low-level stuff is also a mistake; you miss out on the high level and more abstract models look magical to you. Learn category theory and logic design, artificial intelligence and operating systems, the theory of computation and computer architecture. And actually write programs, because you can fake it to your professors but you can't fake it to your computer, and because you're missing out on the fun part if you don't.