This is a weird article. On one hand, they seem to be basing their opinion off of an extremely lackluster program to begin with (What self respecting CS program doesn't expose students to at least a half dozen languages? Or fails to teach their students to write?), But then they turn around and reject the parts of a CS degree that are actually valuable.
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.
What this person wants is a trade school for software developers, which is not unreasonable; building software is becoming a trade rather than a profession. However, it's not reasonable to expect colleges and university to become trade schools; that's not what they're for.
It's certainly reasonable to expect colleges to be 'trade schools' for many skilled trades, traditionally that was the main purpose of universities. A traditional classical university has/had four faculties - medicine, law, theology and philosophy (some centuries later separated in many subfields from natural science to humanities), and the first three of them quite explicitly were there to prepare "skilled tradesmen" to work as doctors, lawyers and clergy. Afterwards in the industrial age many other colleges and academies were explicitly formed to prepare various disciplines of engineers that the growing industry needed, again, the primary focus being skilled workers not science.
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.
The above isn't correctly distinguishing between the meanings of "trade" versus "profession". It's not a value judgment; the words simply have different meanings.
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.
Many computer scientists are developers as well. But yes, many developers are just software developers who lack foundational concepts of CS. They often learn the CS concepts gradually while working at a programming job in order to tackle different problems. I believe the author will also appreciate CS education once faced with difficult problems.
I think the point is exactly what you brought up in your car example:
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.
> What this person wants is a trade school for software developers, which is not unreasonable...
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.
They can teach these as a supplement, but CS definitely is not meant to be a i “learned to code degree”. Learning the underlying theory, how the software interfaces with the hardware, data structures and algorithms, these are all important things to understand.
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.
The author seems to want universities to create Software Engineering departments. Maybe it's a good idea. But arguing that these topics should replace mathematically rigorous CS education is absurd. It's like arguing that we should stop teaching physics and only teach engineering.
This is a very US centric view of the education problem.
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.
At one time there was a exam for the Principles and Practice of Engineering with the discipline of Software Engineering from NCEES. The same organization that has the tests for all of your proper engineering disciplines. The issue was that so few individuals took the exam that it was discontinued. Meaning that if you were to have taken the exam, passed, and gotten your license, you could have been a licensed Professional Engineer with a discipline of Software Engineering.
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.
> "At one time there was a exam for the Principles and Practice of Engineering with the discipline of Software Engineering from NCEES. ... The issue was that so few individuals took the exam that it was discontinued."
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.
Go to a bootcamp if you want that. Computer Science shows people that there are various ways of thinking about problems and evaluating solutions. The fact that there is some maths in it is good - it's not as if its particularly difficult maths either. The experience of bending your head around a functional paradigm or comparing 2 sorting algorithms shows you how "the commonsense way to do something" is a prejudice that blinds you to more powerful approaches.
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.
Well nothing listed the article is actually computer-science, however I do think that most Computer-Science programs (or at-least the ones I have seen) are far from what they could be.
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.
The math is the curious one. I don't really see a good argument for it. The author does mention discrete, which is really important, but the other maths are also. Okay, maybe not for every developer/software engineer, but it is important because of the breadth of the field. Graphics programming, like in a physics simulation or game development, requires heavy use of matrix operations. In my program, we really were not introduced to matrix operations until Linear Algebra. Then there is Calculus, while on the surface may seem useless, but it is still the gateway to understanding higher level maths. Which in some industries, may be pretty important. I did a career fair awhile back and the Idaho National Research Laboratory folks were there. They hire software engineers that write code to simulate nuclear reactors (that was at least the gist I got). Calculus is also pretty fundamental to Machine Learning.
I am started to get annoyed at these developer children, as someone who has majored in CS at a university.
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.”
I agree with many points mentioned in the blog, but these are more "How to do x". CS Program teach fundamentals, not individual use cases. Also on a different note, I believe that going to college is not needed for all this. All these are freely available and one can study. We must get there.
Learning programming languages and being able to implement some business logic is different from learning "computer science". I agree for just programming and maybe some design patterns you don't need to know CS. However that does not take anything away from a CS course taught at some university.
Weary and wary are different. But I should understand what you meant and not what you said. But I should pay attention to what you say. But . . . ugh! This is tiresome.
This is why I don't hire CS grads to program. They are not taught what they need to know. They spend most of their time on things they would need to know to get into grad school to learn to be professors, and then not teach what people I would hire need to know.
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.
Personally, the hardest thing I had to deal with in school were English classes. Had I been in a technical writing course instead I might have actually been able to engage with the material in a way that just didn't work for me in school. Having to write bullshit about imagery in novels that I really didn't believe in was an exercise akin to pulling teeth for me. I wonder how many other technically inclined people had the same issue.
In Germany we have two distinct college types: Universities of Applied Science (polytechnic) and Universities. They both offer bachelor’s and master’s degrees; however, they do differ in their curriculum and the expectations of their graduates.
Universities of Applied Science have a practical attitude whereas Universities clearly prepare for a career in research. There are way more lab classes and programming sessions in the University of Applied Science.
> It’s a skilled trade, much like finished carpentry, plumbing, or dentistry
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?
> 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).
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.
Most scientist in any field don't really push the state of the art. But yes it is their job to push it. If you take a look at computer security, then cryptographers and computer security scientist constantly push 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.
My interpretation is that the article is just talking about people with a bachelor's or master's degree in computer science. In the same vein I just call them computer scientists, but they are different from people that do science at a university. I expect scientists at universities to push the state of the art.
> "My interpretation is that the article is just talking about people with a bachelor's or master's degree in computer science."
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.
One of the exciting things about the immaturity of software engineering is that you don't need a Ph.D. and years of study to push the state of the art. You just need to get pissed at that stupid library why is it doing it this way UGH FINE I'LL WRITE MY OWN!
Grats, you're pushing the boundary of the discipline.
This piece seems to assume that CS is the same (or tech school for) commercial software engineering. Sorry if your guidance counselors told you that, but no. Just no.
> 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:
The title says "Computer Science", then it for some reason assumes it is more about "Software Engineering".
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.
Hey I was wondering what maths are at the foundation of computer science. Could you explain which ones you think are at the foundation?
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?)
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.
A background in "pure maths" is extremely useful. You don't necessarily have to remember many (or perhaps any) of the particular definitions and theorems, but the ability to formulate definitions and prove results about them is valuable. I've seen software documentation that actually assumes it. This is what mathematicians call "mathematical sophistication".
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.
We are in the age of machine learning, whenever you search for something online, take a photo with your phone, drive in your (diver assisted) car, filter out spam, get a product or video recommendation, you are using a system that is founded on calculus.
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.
I'm pretty certain that the systems of today have the same foundations as those of yesterday, we've just abstracted them away so we don't directly see it as often.
That doesn't make a lot of sense given the novel hardware that runs in a lot of chips these days. TPUs, neural accellerators, perceptron branch prediction, flash based neural networks.
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.
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 ^^'.
Yeah these are good points. I guess we could also add AI to the list (AI before ML), since it also has use of calculus I think.
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).
Boolean math (building the computing device), then discrete maths (combinatorics for algorithms and DS), followed by probability and statistics (for algorithms as well as ML/AI).
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.