What Computer Science Programs Should Teach
michaeldehaan.substack.com
michaeldehaan.substack.com
Anybody can teach themselves to program. That's why the "teaching you to program" bit of a CS education is completed in 2-3 semesters. It's significantly harder to build up one's own groundwork of underlying theory, for the simple reason that you don't know what you don't know. Structured learning environments solve that problem by showing students a broad range of theory-based concepts, providing at the very least a substrate for further learning. For that reason, rejecting Math in a CS education is just as ridiculous as rejecting it in a Physics one. It's fundamental to actually understanding why you're doing anything.
And automotive engineering is not even a scholarly discipline.
Now what's fair? (Actually none of that, given that the problem is usually some kind of inequality and not a kind of qualification.)
A mechanic is not an engineer is not a physicist.
A developer is not an engineer is not a computer scientist.
The problem is that CS is a young field, who lacks both trade schools (ie, places to train working developers) AND struggles with the engineer/scientist divide within universities.
Although there are code boot camps and the like, they arent as recognised as unis.
Of course, there is a place for liberal arts colleges and research-focused universities, but that's far from being the only role of universities; and IMHO our society needs a dozen software engineers for each computer scientist, so universities can't focus only on the latter.
https://en.wikipedia.org/wiki/Tradesman
https://en.wikipedia.org/wiki/Profession
Doctors, lawyers, clergy, and (non-software) engineers are considered professions, requiring lengthy and wide-ranging education. The blogpost author is advocating much narrower vocational training in practical topics, which is characteristic of a trade.
This is a booming business, and indeed billion dollar startups exist just to teach programming and interviewing skills. So, I guess author isn't far off from wanting Universities to also have a similar program.
Learning programming languages is one small portion of how computers/software work. What is important on the coding front is being good at a language, and it could be any language provided that you’re really proficient at it. Learning other programming languages later on on your own time becomes very easy once you learn a language well, as you can transfer the bulk of your existing knowledge just to a modified syntax. That said, teaching languages like C/C++ is specially important as it helps people understand the underlying assembly instructions behind the code as well as how the memory and OS work.
Writing good code is not something you can just teach to people aside from basic “rules of thumb”, it’s way too vague. It’s something that requires good judgment when programming which comes with lots of experience writing lots of code. You know the coding paradigms that work. You discover the shortcuts that help you writes code faster. You can identify potentially troublesome or unsafe areas of code. I think these are best learned simply from observing other peoples code and people critiquing other code.
In Portugal, Informatics Engineering content is quite diverse mixing theory with practice, the degrees are protected, and there is enough industry related content in optional classes (many of which need to be taken for the yearly credits).
For the typical CS content mostly theory that often gets discussed in these posts, then path is via math degree with specilization in either applied maths or computing.
Having had contact with other European universities on past life at CERN, I am quite sure many other European countries follow similar approaches to enginnering and computers.
Naturally they aren't the place to learn the latest tech that head hunters are currently looking for, for that we have polytechnics and technical schools.
Software Engineering is still a program at some universities and is within the Engineering college. Computer Science is a different program and is usually within the college of Technology.
If you would like a program that doesn't have the actual science aspects - mathematical reasoning, multiple proper-science courses, etc. You can enroll at a community college or career-tech center.
Even in the post software engineers were described as plumbers. So what is the insistence on going to a university and complaining about the requirements that are put in place where some individuals go for Masters and Doctorates. When you could enroll in a Software Development 2 year program and learn Java and JavaScript as pretty much the only courses. Calculus not required.
Write a tutorial. In my opinion everyone has the capability to write a tutorial if they get into university, it's the lack of interest in doing so. Look at your job, how many people actually document well? It's not because they can't it's because they have no interest to.
Business. That's another university program. Art and Graphics. That's another university program.
No, no one took the PE exam for software engineering because it was effectively impossible.
To become a PE, first the candidate has to pass one of the Fundamentals of Engineering exam to become an engineer-in-training. Except there wasn't ever a software specific FE exam; the most relevant one is the EE/Comp. E. exam. Take a look at the list of topics: https://ncees.org/wp-content/uploads/FE-Ele-CBT-specs.pdf. Most developers aren't going to pass that even with a CS degree.
After that, the candidate needed 4-8 years of job experience while supervised by another licensed engineer. But, whoops, there are barely any software developers with a PE license, so who would they get to supervise them?
Only then does the candidate get to take the PE exam for software engineering and become a licensed professional engineer. Frankly, the situation was so absurd that one has to suspect that NSPE/NCEES didn't want to certify software developers as PEs.
Everyone can do with a bit of maths when it comes to cryptography too - and it's critical to understand enough about crypto in this age (even if what you learn is to stay far away from trying to implement it).
It's really about thinking at the level above programming which helps the programming that you do to be more effective. Even if your life is about duct-taping various libraries together to achieve something you still need to know how they work, how they solve the classic problems and whether your use of them is going to be effective.
All proper CS programs have the usual Discrete-Mathematics, data-structures & algorithms and a course in logic/computability.
I do think that there is value in courses were there is a real project actually much more value than the pure theoretical ones even through strictly speaking they are less about Computer-Science.
The courses that I would have listed that are not normal required classes would be:
Compilers: Similar to Modern Compiler Implementation in ML
Operating-Systems: Often OS-classes does not get the love they deserve.
Cryptography + abstract-algebra: Many good resources.
(elective) Computer-Graphics: Controversial, but from all fields I have seen no area/industry utilize as much computer-science theory as Computer-Graphics, from Computational-Geometry to Computer-Architecture. Having a hard Computer-Graphics course really changed me both a Computer-Scientist and a Software-Engineer.
There are some genuinely interesting things to write about in software engineering and development. Instead they choose to rant about degrees that either are from a bad university, or one which they never completed.
Reminds me of this quote by Mark Twain; “It is better to keep your mouth closed and let people think you are a fool than to open it and remove all doubt.”
#humblebrag!
My first question is always about effects of caches, and what-all kinds of caches affect what their program does. It is not all a programmer needs to know, but it separates those who care about what affects their programs from those who don't.
This shows this person has absolutely no idea what software engineers do, which is ironic since he criticized Universities for the same thing. If you ever solve the exact same problem three times, you're a bad software engineer (or are being put under harsh constraints to make you equivalent to a bad software engineer). I cannot imagine the state of confusion about software development one would have to be in to make this ridiculous statement.
The skilled trades are almost defined by getting very good at solving a select few problems over and over again, whereas engineering can almost be defined as constantly solving new problems (or problems in new or ever-changing contexts).
Please, we don't need any more React JS code-mill workers who copy/paste JSX from Stack Overflow hundreds of times. We need people who actually understand what the hell they're doing and have an actual chance at advancing the state of the discipline -- because right now it's very immature. Doing that requires understanding the abstractions, the mathematics, the foundations -- all those things he seems to think Universities should not teach.
He's arguing Universities should not teach CI/CD, Agile, MVP, whatever -- okay, great: they don't. They don't teach any of that, at least not when I was in University. They teach math, algorithm analysis, Big-O, recursion, programming language fundamentals, database fundamentals, electrical engineering, embedded systems ... you know, the shit you actually need to know if you want to advance the state of the discipline and not just be a code monkey. So what exactly is he arguing against?
Skilled workers don't solve the same problems over and over again, they solve variations of them based on the same principles. In that sense I'm not sure it's all that different from what most computer scientists actually do. Most don't advance the state of the art.
Some areas of CS are already very much polished compared to others. For example computer networks is much stable than machine learning.
Grats, you're pushing the boundary of the discipline.
Like Linus Torvalds or Theo de Raadt, both BS holders IIRC? A bachelor's degree from a good CS program is enough to prepare anyone who studies well to do what they did.
or you have moved between 3 different companies and weren't allowed to keep any code with you because it belonged to employers.
> Computer science isn’t about Math.
Says someone who clearly doesn't understand math, computer science, or history, for that matter. Whether it's Knuth or Shannon or even Hamming, the electrical engineer's work in the field, or many others, it's math. That's where CS came from.
Garbage opinions, of which the author himself says:
> Take them or leave them.
So I think I'll leave them.
For context, I’m not sure something like calculus would be a foundational math (though it could be), but something like Boolean logic would be (right?)
Just because computer science started with file systems and regexes (discrete math) doesn't mean that the systems of today or tomorow don't have very different foundations.
Thise are not abstractions over existing posix APIs or von neumann architectures, they are novel ways to do computation from a different branch of math.
Heck we don't even know if some of these are not breaking the church turing thesis by computing with true real numbers and not the computable subset that turing machines can handle.
Analog computers MIGHT.
It really depends on how quantized our universe is. If you have papers that show full quantization including tunneling probabilities e.t.c please share them! The physical existence of the reals has been a white whale of mine for some time ^^'.
I’m now wondering whether to consider both of these subjects foundational to CS or a CS degree. My gut says yes since so much relies on ML and AI is used a bunch (e.g. games and stuff).
For example, proof by induction is the same basic idea as terminating recursion.
Other things in computing were designed by mathematicians and kind of assume you see things a bit that way. The pointer arithmetic and "inside out" declarations of C are perfectly sensible if you think mathematically – Dennis Ritchie was a mathematician. Likewise, Stroustrup's use of 0 for the nil pointer in C++ would have been understood without explanation by the people down the corridor from him at Bell Labs. Mathematicians often use 0 to represent some distinguished element of a set that is not necessarily a set of numbers.
An example of a specific use of maths in computing is relational databases. Relations are kinds of sets.
Some results in cooperating processes and distributed computing that software engineers should know are proven mathematically. If you can't read a proof, you can't read the paper/textbook and are reduced to "remembering" the result rather than internalising it.
Specifically : Logic(Propositional and Predicate), Boolean Algebra, Proofs(Inductive, Deductive, Transformational), Set Theory, Relations, Functions, Lambda Calculus, Formal Systems.
They are all interrelated but some are foundational. Thus for example Set Theory and Logic are foundational while the others are built on top; Set Theory leads to Relations and Functions, Proofs are the process of applying Logic, Lambda Calculus is Function Abstraction taken to extreme and Formal Systems teach you how to build Symbolic Systems (Models) without reference to any specific Domain of Discourse.
To me the objective of a CS undergrad course is very simple. If the entire world lost all computers then you should be able to build one from scratch ( with the help of your electronics undergrad friend). In my undergrad CS course I learnt how to built a computer from basic logic gates, how to make it execute assembly like codes, how to design an operating system and other things like how to build the internet starting from some wires. The course is named "Computer Science and Engineering" for a reason.