Why do so few people major in computer science? (2017)
danwang.co
danwang.co
CS is really a mathematics major, if you become a good engineer in the process of getting a CS degree it's purely accidental on the part of the CS department. It's like getting an astrophysics degree in hopes of getting a job in the telescope industry.
Universities should really emphasize software engineering as a major rather than CS. CS is great, don't get me wrong, you'll come out of that program with a galaxy brain for problem solving. In addition, there's definitely overlap between the two areas. However, it's often totally irrelevant to the real work in the software engineering industry.
Without hesitation, computer science is certainly not a mathematics major.
Having some knowledge of some aspects of a subject, doesn't make you qualified in that subject. At least, not at the university level.
Mathematics is an enormous and ancient subject. The maths that a CS student is exposed to is really a very small sliver of a few topics; applied to certain uses. Many other subjects (almost all numerate ones) have a similar relationship to maths.
Consider economics: aspects of it also make use of (applied) mathematics, but no one could seriously make the claim that an economics major, even one who has extensive capabilities in numerical modelling, is basically a mathematics major.
Theoretical CS could be described as "a form of applied mathematics"; but Theoretical CS is only a component of a CS degree; and, from what I see with young graduates today, a decreasingly smaller part of it (I am not making a value judgement - just an empirical observation).
I should have made a clearer distinction between theoretical computer science and a computer science degree.
Theoretical computer science is a topic in applied mathematics but a computer science degree isn't, typically composed only of classes in theoretical computer science. The extent to which it is varies from course to course and from university to university. In much the same way as in a mathematics degree there are pure maths topics (number theory, analysis, graph theory etc.) and applied topics.
I expect that eventually we'll have "applied CS" and "pure CS", as with mathematics. And statistics. And possibly architecture. (In engineering, pure engineering is "engineering science", it seems.)
"Eventually" is doing a bit of work there. It might take a hundred years.
Where I got my degree, a degree was 120 credit hours and typically 30 credit hours of that would be in your major. For economics, there were those 30 credit hours and also a requirement for calculus (a dummied down calculus class that didn't require trig) and an upper level stats class.
For CS, there were 30 credit hours of CS and an additional 30 credit hours of math. You end up with a major in CS and a minor in math. Looks like it would have taken 3 more upper level math classes to do a double major.
My only real criticism of the course I did that it was just maths and CS for four years - which meant there was very little flexibility for people to do other things for the people who wanted to change subject.
They want programmers, who will write code they can sell as quickly and cheaply as possible. Trying to raise a software engineering discipline to the standard of the real engineers would leave you with an employee too expensive to do what his professional ethics wouldn't allow him to.
Nah. The vast majority of software projects are of the lower echelon variety e.g., the slapdash shopping cart web apps. Considering JavaScript is still the language of choice in that realm, engineering rigors can’t exactly be of any real consideration.
No, it’s not the expense keeping real engineering away, it’s the culture.
I would say the same is true of most undergraduate math majors.
The Computer Science program was part of the College of Science and Mathematics at my university (not the School of Engineering). The stated goal of the program was to give students enough of a theoretical background in math and computer science to pursue an advanced degree in CS. Most students probably had other ideas, but that was the way the curriculum was structured. And there was enough overlap between Math and CS majors that most CS majors ended up with enough credits for a dual CS/math degree pretty much by accident.
To be clear I am under no illusion that meeting the minimum requirements for a math degree makes me a great mathematician. But neither were the majority of “pure” math majors in our classes. In fact, I would say the CS students tended to be stronger in math, as that was the more competitive major at my university.
Topology and a few others may make the cut, but it’s much easier to share requirements with other programs so a Math degree may include courses that are required or attract students from a Physics, CS, Engineering, Music, Economics, Chemistry, Philosophy, History, etc degrees.
Depending on how you set it up “History of Mathematics” could attract students from several different majors which means you can offer it more often etc. But the same applies in reverse so CS programs can end up with more overlap than ideal.
However, the definition of a mathematics major is, I think we'd agree, "someone who has majored in mathematics". So, regardless of how much of the corpus we manage to cover, having a degree in mathematics means that you majored in mathematics (if I am understanding US terms correctly).
The original post was, I think, equivocating a degree in computer science with being a mathematics major. Which could be regarded as being incorrect, perhaps pedantically, merely by definition alone.
However, also, I am making a distinction (although I wasn't very clear, I admit) between theoretical computer science (the topic) and a computer science degree. It is generally accepted that theoretical computer science is a topic in applied mathematics, but it doesn't then follow that having a computer science degree means that you are a mathematics major.
Computer science degrees have theoretical computer science (the topic) as a component; the extent to which that component makes up the degree syllabus varies greatly from university to university and, perhaps, has also changed over time.
And what we need is for CS and Software Engineering to split, with Software Engineering being part of the School of Engineering. (Similar to the way Chemistry is split from Chemical Engineering.) And we need Software Engineering to be ten times as large as Computer Science. (Of the people who get CS degrees, 90% of them are going to work as software engineers, not as computer scientists.)
I’m curious what sorts of things would you like to drop from a CS degree, and add to a computer engineering degree?
To me, software engineering is about creating larger-scale software that adequately meets the need, and doing so as efficiently as possible - which is not to say that it's efficient. When there's six steps in the communication path between the need and the programmer, how do you minimize the amount of time the programmer is implementing the wrong thing? This is a far bigger problem than choice of language or algorithm, but I doubt you'll ever find it in a CS curriculum. I might even say it's the fundamental problem of software engineering - or perhaps of software engineering management.
Along those lines, they should teach clarity of writing technical information, and ability to read less-than-stellar technical information.
"That adequately meets the need" - that's not perfection. How do you evaluate and triage bugs? How do you manage the bug list? For that matter, how do you even know what bugs you have? Testing strategy should be part of a software engineering curriculum.
Working with a version control system. They might get that in a CS degree, but probably around the edges and by accident. For a software engineering degree, they should get it in some depth and on purpose.
I don't know what I'd cut to make room for that kind of thing. But I think that kind of thing needs to be there for an actual software engineering degree.
This is already the case with classical engineering degrees. The majority of undergraduate engineering coursework is science, calculus, or some form of applied mathematics specific to the discipline you're majoring in.
However, there’s considerably more to it than that. With a few rare exceptions, the overwhelming majority of CS programs in the USA are “telescope science” and not astronomy. One of the more telling, and to my mind obnoxious, evidences of this is how even in the academy the CS types literally appear to believe that “formal” means machine checkable while at the same time balking at learning basic first order predicate calculus to actually specify what is to be computer by a given program. Clearly they are studying the machine and not the mathematical sub-discipline.
I emphasize the USA, because having done many many FAANG technical interviews there is a discernible pattern of graduates from continental European CS programs being considerably more mathematically literate.
Theoretical computer science is generally regarded as a topic in applied mathematics. However, it doesn't follow that, therefore, a computer science major is basically a mathematics major.
Theoretical computer science (the topic) is a component of a degree in computer science. How large of a component it is varies greatly from university to university and, perhaps, has changed over time.
Properly taught it definitely is.
The issue here is that an average undergraduate mathematics major in the USA learns a ridiculously low amount of mathematics so I guess a CS one does even less. I did more maths during my two years of prépa in France that the American who majored in mathematics I met during my postgraduate study.
I think you're getting to the crux of the point. A few years in university (for undergrad) is not nearly enough time to cover the entirety of mathematics. The sheer fact of time constraints requires a survey and a selection of a fraction of the field for study.
I would argue that economics degrees are also, essentially, math degrees for the same reason. Neither economics degrees nor computer science degrees will cover the same topics as a "pure" mathematics degree (or else they would simply be known as mathematics degrees), and I will grant to you that they are "applied" math degrees if I must. But the point remains: a "pure" math undergrad degree cannot include all of mathematics, and thus is perhaps best renamed as theoretical mathematics, commensurate with branding economics and consumer science as "applied".
Even at the time, however, there were divisions in the faculty about the core curriculum, since we had two graduate CS tracks: software engineering and theory.
I went to large state school where the CS department was part of and eventually split off from the math department at some point. Their original degree was computer science and applied math. It was very much “math with computers” when I was there 25 years ago.
I imagine things have changed a lot, but schools have a variety of approaches and states of transition that are probably difficult to know about.
A lot of computer scientists actually struggle with this and don't fully get it. As a result, software engineering education isn't all that great in a typical computer science curriculum. One reason is that most computer scientists actually lack the experience of having worked in large software companies and don't actually know a lot about how that works. It's something I realized while doing my Ph. D. in this area and I fixed it by leaving academia. I learned a lot since then.
One thing I learned is that a lot of good software engineers exist that never studied computer science. I know people with physics, geology, micro biology, philosophy degrees that ended up working as software engineers and that are very good at what they do. Most scientific work involves some level of programming these days. So, it's quite common to meet people with some python or even machine learning experience that never studied computer science. Things like formal methods, linear algebra, etc. are useful to know of course for some things. But you don't need to have a any of that to learn python, javascript, or any of the other popular languages. In the same way, knowing a lot about type systems is nice if you build compilers or design your own languages. But you don't need to know much about that to use a language.
This was me exactly. I started a Ph. D. simultaneously with two other students and our supervisor had us working on separate aspects of a common overall problem, each of which required a lot of software development, in C, because we were chasing performance. The supervisor had an academic background and all of us had only just graduated. Needless to say this was a total disaster and we never even managed to complete our separate parts let alone integrate a usable system. I bailed out and got an M.Phil for my efforts, but on the basis of the experience managed to get the job that I wanted, so it wasn't a complete write-off.
As soon as I encountered some actual software engineers in a well structured research department, I realised how bad our approach in Uni had been. My job involved a similar problem area, and using better tools (Common Lisp on a Lisp machine) I managed to build in about six months what I had failed to do in three+ years in academia.
My thoughts on the feudal nature of the Ph.D system at my Uni are a whole separate post!
On the other hand, without the formal underpinning there is an enormous risk you assume your intuitions are correct about stuff where it turns out there's just unyielding mathematics (or occasionally physics) that disagrees. The formal instruction would either outright tell you about that or at least give you the right lenses to see for yourself.
For example it's not at all rare to see programmers who think about floating point as just the Real Numbers, because they superficially resemble real numbers you've seen - but it's not, it's the modulo integers again but wearing a trench coat. Formally it's obvious we're not getting the Real Numbers, Almost All of which aren't even computable. But without that formal underpinning people have nasty surprises.
People's intuitions about concurrency and parallelism are all wrong too. Amdahl's law matches reality but doesn't match how people intuitively expect this to work out. The insight that makes Rust and several modern languages work (that you can't incur a data race if you don't have multiple references and mutation) is not at all intuitive.
Another thing is that languages and tools that require a lot of formal background are a hard sell in industry because it means having to hire more scarce and expensive people. It's a reason that functional programming was a hard sell for a long time until languages got good enough that normal people could figure it out. Scala was an early example that did not quite get that right maybe. Too difficult for people without a CS degree and a good understanding of type systems. Indeed the whole language became a bit of a playground for type system nerds. It got a bad reputation for being hard and a bit over engineered.
Javascript and python, both of which now have some level of functional programming support, are much easier to pick up by other people. Which is why those languages are so popular. Any high school kid can work with this. I currently have a couple of summer interns in my team. These two languages are what they know.
Well said.
Which seems perfectly reasonable? I reckon most astrophysicists could work in the “telescope industry” just fine, and their background in astrophysics would prove pretty useful. And likewise, CS graduates are perfectly suited to difficult engineering jobs. I’d rather hire a smart CS grad with no knowledge of FactoryFactoryFactory than the reverse.
A better rejoiner would've have pointed out the optics-like bending and focusing of all wavelengths about gravitational wells, eg:
https://news.stanford.edu/press-releases/2022/05/02/gravity-...
works for more than just the visible wavelengths.
Reflective and refractive optical telescopes are still important (and still being built.)
Of course each of those areas is filled with decades of progress that requires in-depth expertise, but if there's a discipline that can go deep enough into each of them, it's probably EE.
https://www.ga.gov.au/scientific-topics/disciplines/geophysi...
– Edsger W. Dijkstra (source: https://www.cs.utexas.edu/~EWD/ewd10xx/EWD1036.PDF)
"if we wish to count lines of code, we should not regard them as "lines produced" but as "lines spent": the current conventional wisdom is so foolish as to book that count on the wrong side of the ledger."
It turns out in most jobs you do use things like soft skills, version control, SQL, etc. more than number theory, formal verification, Forth or UML.
Not really, and it's not really an engineering major either unless your CS is also part of the engineering school like MIT's is. Compared to mathematics curricula, you are doing a lot less complex stuff, there are few proofs and the classes are much easier than math ones.
If you can’t prove things and don’t cheat, you can’t get a UWaterloo CS degree. Can’t get past first year.
This isn’t a flex tho, cuz there’s so much optional advanced math that isn’t required. Everything in the combinatorics and optimization department at UWaterloo basically. Most of us UW CS grads are normies who didn’t do any of the hardest stuff including me :-)
CSE at UW was unique too in being the only program that had a degree in both the college of engineering and the college of arts and sciences, which meant they literally had different deans and budgets, but the same program advisors and such.
Unless something has changed, I believe the original idea was to merge the computer engineering degrees from both departments, not sure how that panned out. I left before it was even ECE!
We covered data structures & algorithms, concurrency, schedulers and virtual memory but it wasn't very math heavy. We have one full semester on software dev cycle and one for UI and mobile app development. Our final project was a group project to assess applying software dev cycle in a team. As far as I'm aware the CS department has a sizable HCI group.
I remember in first year with Python they taught the students to parse integers with `eval`.
Although my datapoint is 15 years old now. I’ve heard they’ve dumbed down CS at the behest of tech companies looking for base level talent factories.
But I was early on in computers. I took a FORTRAN course for another engineering major and otherwise never used computers undergrad.
Could you maybe expand on which programs you're talking about, specifically? I'm always comparing other programs to ours. I haven't seen one I'd call "math-adjacent" in a while, as most programs have gone the way that ours has in emphasizing hands-on experience.
We took intro to cs (boolean algebra), algorithms (definitely math-adjacent), databases (relational algebra), computer architecture (math but with 1s and 0s), theory of computation (finite state machines, context-free grammars, set theory, more algo).
That on top of the math requirements (linear algebra, Calculus, probability & statistics)
Does your program not have those things?
When I look at CS majors, they are heavy on practice, and these days lighter and lighter in theory with every passing hour.
We have all those things you listed, but they are not emphasized as much. We don’t go into theory as much as we used to because there’s so much more to cover that people want to learn these days.
But as for a list of topics, of course you can fit a lot of CS topics into a “math-adjacent” category. But what I said was about the major not the class topics. There’s more to a major than a union of classes.
In fact I have many math majors in my CS class. There are many CS majors who take math classes. But come graduation time, the CS major will be prepared to go directly into a software engineering role and be a productive member of a team. They will have worked with technologies like git and visual studio extensively. They’ll know half a dozen languages. They’ll have worked with a team on a real software project for 1.5 years.
The math major will not have any of these experiences.
Let me put it this way, as someone with a physics and a cs degree, I would call the physics degree math-adjacent, and the ca degree engineering-adjacent.
What constitutes "software engineering" is a lot more subjective than what constitutes CS, partially due to the relative lack of mathematical foundations. At the university I attended, "software engineering" meant waterfall, enterprise-style Java and lots of UML diagrams, arguably it'd make anyone who attended the software engineering degree a worse engineer if they didn't know any better.
Software engineering, or informatics engineering, are 5 year degree[0] with a mix of CS theory, actual practical projects, and engineering.
So at least from the point of view this tiny country, it seems like an issue on how US universities structure their offerings.
[0] - Bologna treaty for EU universities changed this a bit, however universities got around it by now offering integrated masters, allowed former students to upgrade their degrees for legal compatibility, so hardly anyone picks the bare bones 3 years as per Bologna.
Also, you vote for this kind of thing both in your national elections and in the European Parliament elections. It's representative rather than direct democracy (I do agree that it should be more direct, but not to the point of a referendum on the Bologna process).
Speaking as someone who didn't really notice any difference, I'd like to understand what changed for you.
Depends on what your school considers to be CS. I did two compulsory mathematics papers for my degree and I've heard that in the years since that they've been axed. My resume still says I have a CS degree despite for all intents and purposes studying software engineering.
That's not a problem with the CS degree. I mean it's the same for every industry and degree then.
You study years of law only to spend most of it helping people exchange real estate contracts etc.
The average <any role> often degenerates into a boring repetitive task. The average doctor at a local clinic likely repeats the same diagnosis every day.
Take a look at medicine for example, by far the most practical of the original set of sciences the organisational pattern of universities was designed for: we know almost infinitely more than 100 years ago, but very little of 1920ies medicine would be considered objectively wrong today. The part of software engineering that struggles to fit in with "CS and a bit of coding" from 2003? Much of that knowledge would be considered more harmful than helpful today, even in an org that does mostly legacy maintenance. ("at this point in the waterfall we will have defined the class hierarchy")
That doesn't happen with medicine. You don't become a cardiologist without doing the whole 10 years of studying. It reminds me of the medieval guild system: quality assurance. But corporations will settle for quantity. They need warm bodies to code and they need it pronto.
It was common question why we didn’t offer software engineering instead of computer science. The simple answer was an “engineering “ degree required non-applicable physical sciences, like heat transfer and an statics. Interesting, but not applicable to shipping software products.
Before Bologna, all Portuguese engineering degrees with 5 years, with masters and Phd, coming on top with additional 2 and 3 years respectively.
There were exceptions like polytechnics being 4 years, but they were a small subset.
With Bologna agreement reducing the standard set of years down to 3 years, that was felt like a downgrade, and so "integrated masters" degree was born to match the original 5 year degree, and everything remains as it was.
Was it similar in UK?
This was roughly half the courses, the other half were the usual stuff like logic circuits, algorithms, operative systems, databases, computer architectures , etc.
Universities probably prefer that, given all things considered, it's better to teach NP than heat transfer, because it's more related to computers? Also big tech like to ask about CS stuff in the interviews.
Purdue seems to have had founded one of the first CS departments (1962) and it was originally part of the Mathematical Sciences division along with Statistics.
In most departments, I that expect systems courses will generally be more aligned with engineering (and industry practice) while theory courses will generally be more aligned with mathematics.
Given the origins of CS, it is disappointing that software practice typically seems to lack both engineering rigor (vs. circuits with predictable behavior) and mathematical rigor (vs. theory with provable results.) The math and engineering parts of CS seem to apply primarily to tiny components rather than the large, complex software systems that people actually build.
> CS is really a mathematics major,
This is true in many departments, and it's wrong imo. The reasons for the math focus are historical and they perpetuated, probably due to the way hiring was done -- the current math-inclined profs hired other math-inclined profs.
But it should change. I would argue that CS degrees should decrease the math focus and should really train for SWE.
Edit: The match-centric major should just be a subfield of CS, say Theoretical Computer Science.
The CS I'm familiar with has aspects of mathematics, engineering, science, and even social sciences. It's a field that studies things related to computers and computing by any means necessary. Most CS programs are narrower in scope, because students only have a few years to study, and studying something in depth is generally better than covering a little bit of everything.
I will say tho, one thing I liked about my university was that paid internships at companies in your field was a requirement for graduation. I think this better prepared me more than anything for the job market. And it's something that you can bolt on to really any degree program without major curriculum changes.
Source: I spent the first 10 years of my career without a degree in the valley then got top honors at a top school as a return student, and am a distinguished engineer level engineer at top tech and tech aligned companies.
Regarding relevance to jobs, I think CS is, de facto, the major that employers see as more relevant in candidates in the US, though I think this is much less about the content and more about CS being seen as more prestigious and selecting for more ambitious/capable students who may make better employees in the long term. I don’t think the reason for the relative decline in the popularity of CS was that students really wanted to do software engineering (but ended up doing physics/math instead).
I told my academic advisor I wanted to be a computer programmer, and she put me in CompSci. No one ever told me that that was the wrong discipline. My school didn't even have a Software Engineering program. I had graduated and was trying to find work before I fully realized that my degree had barely taught me anything useful and I was going to have to learn most of it myself.
It's the system that's misguided.
If you just want to build telescopes, then you don't probably need any degree. If you want to engineer telescopes, then astrophysics, optical physics, etc. might matter.
We often use the term "software engineer" when we really just mean "programmer". But actually engineering software is going to rely on CS knowledge a lot more than simply programming a computer.
I missed out on some of the CS concepts I think, like I hadn’t heard the term “Bloom Filter” until I was asked about it in a TripleByte interview… but it’s nothing a free, online course can’t solve.
My college courses taught me about networking, operating systems, computer architecture, algorithms and data structures, and more. I use knowledge from all these areas on a nearly daily basis in my job as an embedded software engineer.
For the front end developers who studied theory of computing, I agree.
They already do, it's called a "systems emphasis". Features cool stuff like data races, scheduling, IPC, consistency guarantees, cache coherence
And wrt this:
> However, it's often totally irrelevant to the real work in the software engineering industry.
I can't imagine someone working in backend and not understanding something basic like how to avoid data races
There are lots and lots if programmers in the world. Some are focused on UI (even on the backend), some on low-level things like graphics, so on hardware some on libraries, and yes, some on data.
I say this not to pick on you, but to point out that there are lots of universities, with lots of curricula, all called "computer science". The focus of each is widely diverse, and its likely that my CS degree and your CS degree are very dissimilar.
Nowadays they have a software engineering track, data science, and even one focused on entrepreneurship.
It isn't even close.
Why do you think a CS major is like a mathematics major? Just because proofs and logic may be used in some curriculums doesn't make it a mathematics major.
Many people have a different opinion of what CS is. Seems like you enjoy theory, so you went to a program that is heavy on theory. Smart move for you, not the same move others would make for equally smart reasons.
Personally I think all of the theory is fine, but computer science is about doing science. You can do theory science, but there is a wide world of science that needs to be done beyond that. For instance, an HCI researcher may not work much with algorithms, but that doesn’t make them any less of computer scientist, although some jerks might like to think so.
As for programs, most only have a core of 5-7 core required courses, along with a dozen or more other elective and general liberal arts courses. If more than a couple of the required courses are devoted to theory, then it’s probably tailored toward people who know they want that kind of thing. That’s neither good nor bad, but it doesn’t mean that other programs that don’t require more theory are necessarily bad. It may be that they just want to give students a broad overview of the field, and allow them to dive deep into theory with electives.
Regarding your example, that's exactly why I mentioned that, where I'm from, we have a software engineering degree that is more common than computer science exactly because people want more practical courses rather than jerking about theory for three years.
We even have a distinction between "Informatique" (computer science but more practical), "Mathématiques et Informatique" (more of a classical computer science course with tons of math theory). I think this is the best way to actually provide a diverse education path for different types of people. Otherwise you get a CS degree that basically sucks imo
I'd say the bulk of my CS degree was discrete maths adjacent to computation theory.
Honestly too much maths made me not like doing the degree (nothing against maths, I like it but I hate the way it's taught)
- Algebra and discrete mathematics
- Two papers in data structures and algorithms (including theorems/proofs, using CLRS as the textbook)
- Secure systems (cryptography)
- Programming languages (parser/compiler theory etc)
- Theory of Computation
- Logic
Then I studied machine learning, which is a subfield of AI, which is a subfield of CS. That is a deeply mathematical subject, requiring knowledge of linear algebra and probability.
Software engineering is as much engineering as it is, say, mechanical and civil engineering: some applications explicitly require it, but others don't.
Computer science has a solid math foundation. Lambda calculus, graph theory, category theory, process calculus, computational complexity,etc etc etc.
This doesn't even take onto account stuff like numerical analysis and applied linear algebra, which is the core of high performance computing.
It all comes down to what exactly you believe math is, and what it really is.
But what is under debate is the comment that "CS is really a mathematics major". An undergraduate computer science degree program is no more a mathematics program than an electrical engineering, physics, or statistics or data science one.
But yes, there's no question that mathematics is highly applicable.
In some universities, CS is under the Math faculty, like in University of Waterloo (one of the top programs in the world), so there's some official recognition to this idea.
It was published in 2017. By 2019, the NYTimes was publishing articles like this, about the shortage of spaces in classes for people interested in CS: so popular students literally could't sign up.
https://www.nytimes.com/2019/01/24/technology/computer-scien...
Here's an article from 2023, about a 12x increase (!) in CS enrollments at UC Berkeley from 2011 to 2021. The trend at other unis was also strongly, like double-digit percentage increase yearly, up.
https://eighteenthelephant.com/2023/02/12/10-double-the-numb...
I think there was a brief cultural moment where for whatever reason - uncool? nerdy? math anxiety? - CS wasn't where you'd expect it to be, in terms of enrollment. But the culture changed & now it's very popular.
2013-14 2014-15 2015-16 2016-17 2017-18 2018-19 2019-20 2020-21
55,271 59,586 64,402 71,416 79,597 88,638 97,054 104,874
Source (same as TFA): https://nces.ed.gov/programs/digest/d22/tables/dt22_322.10.a...Remarkably, it's the field with the highest growth from that table, by far.
Which means we're due for possibly the biggest cohort of fresh CS grads in about 3 more years. Fun times
Not every school has peaked, but many have.
It will drop for the next 5 to 10 years.
(FAANG hiring freezes will disincentive students...)
Meaning last year may have been the largest CS enrolment class, but we won't see the largest fresh graduate class for a few years still
Most of what I learned in universities I forgot. What stuck around and I still leverage today was appreciation for quantities and statistics. Understanding of basic dynamics in linear vs. non-linear systems. A vague feel for frequency and transition responses. An appreciation for materials, their limitations and trade-offs involved in their selection. Not much but very useful and valid forever.
When hiring I admit I prefer engineering and physics majors over CS (provided they can code) as former often seem to have more focus on results outside the box while CS are more focuses on the insides. The key to good software with impact are getting the requirements right and that needs negotiations with people outside of the box and making trade-offs.
EE robotics had demos of real, industrial robots, 100k+ eur machines, filling glasses from a bottle, making pancakes, sorting stuff etc, while the CS labs had most of the robots based on some lego-like kit where the robots were clearly toys and made just for education.
Technically it doesn't matter, it's all math, metrices, rotations, axes, sensors, feedbacks, derivations and integrations of numbers etc. but the difference of "real" vs "toys" was obvious.
Software development isn't high status field. All of IT is just seen as an army of pee-ons whom you only need when something is wrong, and want them to disappear when the fire is put out.
People out there are fed up with slow computers that have become incomprehensibly complicated, and the vast ocean of garbage that is the Web.
When people are introduced to programming, there is a mountain of shit there now between them and their first hello, world.
The products, tools and the whole scene of computing must be uninspiring and discouraging to newcomers.
It's hard to imagine what people outside of our field associate with "computer science". Like, what do they imagine the content of a CS degree to be. Their view is directly influenced by their everyday experience.
CS? That's four years of in-depth-studying that churning toilet bowl full of shit that has to do with why I can't connect to my Wi-Fi printer half the time? Or why Facebook feeds garbage into my timeline? Like, ewww ...
Money. That's what normal people associate with computer science. They don't understand what it is but they are well aware of the pay scales.
>Software development isn't high status field.
It wasn't before the money arrived. It is now.
These people potentially make decent money:
- self-employed bathroom tiler
- drug kingpin
- pornographer
And the reason people like Musk, Zuckerberg, and Bezos are unpopular is because of their activities, comments, and things like that. That is: specific concrete things, not general "because they're a techie" kind of stuff.
What do they have to do with CS?
Zuck... I mean you're kidding right? Facebook literally wrote their own c++ strings that's optimized for their specific use case, made their own php interpreter, have open source c++ libraries, etc.
Also I just don't think normies differentiate between tech in general and computer science.
Even if you are mediocre (or not even that) you can get a job that pays more than most jobs do. That counts a lot.
Real high status is law, medicine, etc.
Is that still true? For what group are those professions high status? I feel like it's a thing the previous generation brags about to their peers, but I have a pretty cynical view on the state of justice (in the States, anyway) and thus on lawyers for participating in it. Yes, it's a difficult profession to get into, but that's not enough at least for me to perceive it as high status.
If by "medicine" you mean doctors in particular, and not clinical researchers or nurses, I have to similarly disagree; similarly to getting a J.D., it requires a ton of work to earn an M.D., but in my mind the highest-status subgroup in medicine (not to downplay the amount of education that's required, because it is almost equal to what's required to be a doctor) is nursing.
Ya no wonder I wouldn’t like CS with these peers.
You have to be a nerd and supremely interested in status and money apparently. I don’t know many like that. Makes me think of Zuck and Elon. But they are minorities in the grand scheme. Maybe the author is exactly right, right here, why CS falters.
I understand hard work in a professional context, but the constant learning and tinkering that „nerds“ display stems from fun and curiosity.
Many people, who do not understand the most basic computer things, still think of "nerds" as "monkeys" sitting at a computer all day, doing something less relevant, not "having a life". Most people don't understand the profession of computer jobs. They see it as something inscrutable of dubious value. (And to be fair, often the greater picture our software serves to achieve is of dubious value.) It is not really like many other jobs, of which you could explain roughly to the next person on the street how the job is done. Before for example a software engineer gets to explain how some code they wrote works, the other person has long zoomed out. And before one gets to explain that it is a craft and what the art about it is, most people have fled. Not many are willing to listen to what fascinates a "nerd".
With that lack of understanding often come tendencies to wanting to associate with other people, rather than that person, whose job one does not even understand. And those "nerds" they have weird interests anyway, right? One couldn't engage in social activities with them, right? You may say those are superficial people and you may be right. But the world is full of such people.
In the end "nerd" is just a bag of stereotypes, that don't apply as often as most people think. Perhaps a "geek" is a friendlier word.
Also, nobody at the high school level has any idea what CS is. I had a bit of a leg up (in 1982) because my mom had taken a bunch of CS courses, and was teaching programming at a nearby community college. But she thought I'd be better off studying a traditional field. I chose math, and taught myself to program.
When I started college in 1982, I'd argue that nobody knew. For instance, at that time my parents were also mid-career in STEM. Well, my mom was teaching programming at a community college, and her students were getting jobs after 1 year of her course. Based on where we lived, near Detroit, most of them were getting hired up by the car companies.
But I don't believe anybody knew what was going to happen next. My mom thought that programmin was too easy to spend time learning at the college level, and that the market for programmers would soon be flooded. What happened next was the personal computer. I was keenly interested, but at my college, the CS majors used a mainframe computer. Most expected to work for banks, insurance companies, utilities, etc.
Non-STEM parents, sure. I'll grant you that. I'm lucky to have been raised by two scientists. But they weren't thinking about money when they talked to me about careers and college majors.
Imho, SWE and “Computation Science” should be separated.
You can treat the former as a computer oriented form of engineering, making it rigorous and produce SWEs that are actually good, and in the latter, you can put all the theoretical things and treat it as the branch of math it rightfully deserves to be.
> Ya no wonder I wouldn’t like CS with these peers.
Yeah I'd switch out of cs again to avoid those peers :)
Though in the proper setting I would have loved sticking with cs as an undergrad.
You would expect that but it is not the reality. I've seen many students that were excellent at math, but just could not get their head around CS. I'm not sure why this is and having asked some of them, they also couldn't explain it. They just couldn't 'see' it, and found creating the programs very hard.
Meanwhile they breezed through math classes that most CS minded students failed or found extremely hard (over here in the old days CS was a specialization of a Math degree before it became a degree in its own, so the CS undergraduate curricullum was very heavy on math)
Concluding paragraph:
"Therefore, the data tabulated is sufficient to allow this study to draw several conclusions and inferences. First, it is reasonable to conclude that Mathematical ability of the students could be the basis of admissions for BSCS program. Second, students who performed well in math can, therefore, performed (sic) well in programming courses. Third, the Mathematical ability could be a predictor of student performance in programming courses."
Of course, it'd be nice to see some other studies confirming/disconfirming this conclusion.
Most graduating high school students don’t really know what CS is, so choosing a CS major feels risky.
I think my junior class had legitimately 50% go straight on to become CSci majors. I was lucky and I feel lucky.
I get that that's a hot take for HN, but they need more time learning the basics of critical thinking, communication, and emotional intelligence before learning what the hell time and memory complexity are.
I think we should be teaching kids how to code but the science side of it can stay put in higher learning. We're terrible at teaching young adults it, let alone children.
I don’t propose to require CS in high school but it’d be great if it was an high quality option for more people. Lots of people do AP math, and many of them could do well with CS as an alternative if it was available. Also, some other people who are better programmers than mathematicians (like me) would benefit from this option.
Sadly, the number of good CS grads that would choose to teach at high school will stay very small as long as other opportunities are so much more attractive.
I agree that a lot of college CS teaching is not very good, for similar reasons.
They don’t need more time. They need a serious curriculum.
Unfortunately I think it's about the same, not many teachers, let alone good ones.
Ontop of this, the author is way too contractual about people's degree choices. He completely ignores various other factors:
- What career do I think I'd enjoy and be good at?
- What am I actually interested in learning about?
- What are my school, friends and parents recommending?
High schoolers should be taught how to cook, how to exercise, how to think for themselves, and basic history and math. Anything above that like Calculus is a huge waste of time if they don’t know how to fry a fucking egg.
I think one of the major reasons is not that many people are interested in it. We like to sit and invert binary trees all day, so we naturally assume everyone else should be just as excited about this wonderful activity; and if they are not, something is wrong, we should worry, and figure out some way to trick them to switch majors.
Imagine what programming looks like to a kid: "Oh wow, sitting all day looking at text on a screen? I can't wait to do just that for the rest of my life!". Compare that to being a doctor, a construction worker, nurse, engineer, or even a lawyer. Any of those other professions just look a lot more exciting.
Mostly sit all day looking at text on a screen. Diagrams if you're lucky.
> lawyer
Sits all day looking at text on a screen.
Sits all day looking at text on a screen.
This is the reality but not the perception people have. Most people’s exposure to lawyers is from shows like Better Call Saul. What’s funny is that if they paid attention to the show, they’d see real work being done, in the form of endless hours of looking at documents.
But those scenes are all done as montages with sexy music, so people don’t realize how boring they can be.
A smaller contingent dropped out in the later years, but still by the time I was at the 400 level, class sizes were quite small.
Other sciences were like this (but not Biology or Psychology for some reason).
The pointer abstraction is the first big mental leap in CS.
I often catch flack for this view, but I think it's that crafts and trades are considered lower status. Anyone doing the work to keep things running and improving them where they can is doing honest labor.
Academic CS programs make sense for people who want to go into research, the sciences, or theory heavy application, but I never understood the inflated college programs across the pond.
Indeed, if you actually talk to people working in a lot of them you’ll hear stories about alcoholics and drug addicts who barely manage to show up to work. You’ll have 1-2 highly experienced, highly skilled trades workers who can get all the work done, and the rest are useless trouble-makers.
This perception bleeds over into the public eye and the entire field is treated with disdain. Even higher level trades like electricians are caught in it, and so it’s seen that going to vocational school is low status so there must be something wrong with you. The problem is entirely cultural!
The CPA exam was a mix of practical information and a bit of unnecessary gatekeeping in my opinion. I felt that I had already learned most of that information during my undergrad degree and that my graduate degree was overkill. Having to spend more time studying for the exam after two degrees and then spend a year working under someone was too much in total. I believe that accounting is a craft that can be learned while working under a master. I feel similar about my software engineering career now.
My experience with all of the credentials to become a CPA is a big reason why I decided to self-teach computer science rather than pursuing another degree. I recognized that if I studied the fundamentals and then worked underneath someone highly skilled, I would be able to build up my skill set as a developer. So far I think that direction has worked out.
That said, there are about 70,000 reasons I can think of why someone would want to do something else for those 4-5 years.
The first job I got out of college also wanted me to quit college and work full-time about 2 years before.. I knew full well I was getting the degree as a hobby.
If I do go further.. it would be for fun. I did enjoy uni. But maybe not so much for the classes.
When my son was studying Electrical Engineering, he told me a story about how, at the beginning of every semester, a student would ask the professor if there was any programming involved in the course. The class would heave a huge sigh of relief if the answer was no.
It's not that students were stupid. Rather, they had a big course load, were pressed for time, and could not afford the bottomless time hole of programming assignments. They knew that the time they invested in lab work or math assignments, would surely result in success. Not so with programming bugs.
It is one of those things that people either love or don't.
Based on my personal experience in the late 2000s, this was not true at all. People majored in CS because they liked solving the logic puzzles CS represents regardless of salary or stays
I think this time period is a slight outlier - for our parents the dotcom bust was recent memory and a lot were discouraged from going into the field. Mostly only those who really wanted to, like for the logic puzzles you suggest, went ahead anyway.
This is a really underappreciated perspective. Few things are more disheartening than wanting to share understanding of a neat CS concept and have it fall on deaf ears.
Given enough experience and depth of knowledge, there comes a time where the gulf becomes insurmountable.
The theory is important. You can often tell the difference between someone that's been through it and someone that hasn't.
It's not just a copy and paste job without implications.
To the outside it is often a case of: "But this works too!"
Of course this could be mostly correlation, perhaps the type of people that seek degrees also enjoy learning more broadly in general.
What are the jobs where this kind of thing comes up? I've never had to do anything with multithreading or C++, and I'd estimate that the jobs where that stuff comes up is a tiny minority. I think it'd be cool to encounter these kinds of problems, but it just seems more like a niche thing to me these days.
If you take any specific domain of CS, there are only going to be few hundred good professors on that topic at most in entire world. Them spending their time on teaching undergrads industry skills is wasteful IMO.
Profs should focus on creating next generation of researchers. Bootcamps/Corps/Youtubers should focus on next generation of developers.
It seems to me that a formal CS education is wasted on those who don't have the urge to code in their spare time, and only get into the field for the money.
Also, despite the annoying claims of many that they are "engineers", most people in the field are programmers with title inflation. Actual engineering requires far more attention to detail, and just plain drudgery than we programmers can put up with. You can't automate your job away if you're an actual State Licensed Professional Engineer... lives are on the line.
[Edit/Expand] Would you blindly trust a program an engineer whipped up in his spare time to do all the appropriate checks on a design, instead of requiring him to check the math? Of course not.
Actual Engineering demands far more rigor than programming. Strong agree with the comments of shrimp_emoji
On the other hand, we're free to make build systems, and do whatever we want to make our jobs easier, because lives aren't on the line. [/Edit]
So, no actual state license, no actual need to get a CS degree, why spend the money?
Now, if you're going to be an actual State Licensed Engineer, a formal 4 year degree is worth the money.
I've found that your sentiment that software engineering is less rigorous is common among those that haven't done "real engineering" though.
There is some truth that in software you have the option to push out risky code and have it fail and then course correct quickly, while in "real engineering" you can't take risks like that because there is a higher potential negative severity/outcome but that depends on the cost of software downtime and bugs.
In "real engineering" you can also develop models and test things in a safer environment before the equivalent of "pushing out to prod" but often the feedback loop is longer, and so you have more time to consider your test, but that doesn't mean that reasoning about that system is any harder, or easier necessarily.
I'm sure you could be like Albert Hofmann for Chemical Engineering, or Electroboom for EE
The application of the rules and procedures reliably, every time, every day, for every little change, just seems so damned boring and yet terrifying. Knowing that if you're wrong, one or perhaps many people will die, is a strong incentive to do things right.
Take the walkway collapse caused by a seemingly small change to make construction easier[1]. Or, the institutional failure when Engineers are over-ridden by management with spread-sheets who don't actually understand the problem at hand.[2]
But... The day in, day out grind, it's so tempting to be clever and creative, and do the thing that programmers do all to often when they write code so cleaver they can't debug it. Give in to the temptation once, and someone else could die.
What a grind... It's like being an accountant with a sword dangling over your head.
Engineering is about being methodical and prudent, not about being the sharpest tool in the shed.
[1] https://en.wikipedia.org/wiki/Hyatt_Regency_walkway_collapse
[2] https://en.wikipedia.org/wiki/Space_Shuttle_Challenger_disas...
There are equations well known for hundreds of years on how to design a bridge that doesn't collapse. And the fact that most bridges don't actually collapse is not mainly due to the ingenuity of the engineer that built it, but rather, allowing liberal margins of errors for safety. If you use materials twice as strong as the minimum requirement, things don't break if you made a 50% error in your calculations.
In fact, I'd be very concerned if "actual engineering" is hard. Given that most people are mediocre in ability ("licensing" is just about formal requirements, whether one can jump through the hoops, as opposed to actually being super smart), it's really scary if building a bridge or a building is "hard".
On the other hand, building robust yet complex software is actually hard. There's no software equivalent of "just spend more money on materials to allow for a 10000% margin of error to ensure it doesn't break". Spending more money stops working at a certain point, for example, hiring more people doesn't work, per Mythical Man Month; spending more effort on handling edge cases don't always work, because writing more code with minimal utility means an even less maintainable project in the long run. Correct code almost has to be "mathematically perfect" in order to be small, simple-as-need-be, and robust. And then even if your own code is 100% error free, you have potential bugs all the way down from frameworks, compilers, to even the CPU (eg. Spectre).
Software development definitely has one of the highest skill ceiling among the trades that I know of. Sure this doesn't apply to whoever wrote your CRUD app, but think about it -- let's say you're thinking of building a skyscraper that requires extremely difficult engineering (whatever that means) to properly build, nothing short of the most brilliant engineer would be capable of planning and executing the project, any mistakes would lead to a complete collapse of the building... would you want to proceed with this project?
Yet people start software projects like these for fun. Precisely because it doesn't necessarily have to involve "blood".
---
Why the gatekeeping? Because Software "Engineering" isn't really what most of those with the title are capable of doing.
Let's talk about Electrical Engineering for a moment... a typical house in the US has many circuits supplying 120 volts at 15 amps, 60 Hz. You can plug any combination of loads into any of the outlets, and, if they are installed and maintained properly, you won't damage the wiring in the walls, nor are you likely to start a fire.
This is accomplished with engineering (the design of breaker panels, outlets, etc) a strict set of rules, (the electrical code) licenses for the electricians, and state inspection of the circuits before they are put into use.
---
Programming is the wild west compared to this. You have no way to run a piece of code on a machine without risking all the data on the machine, and/or all the machines networked to it. Our hardware is sub-standard (RowHammer shouldn't ever have worked), our operating systems give everything ambient authority. It's actually less secure now than it was in 1982, when you at least had write protectable media that the OS couldn't over-ride.
There's no way to take a random executable piece of code and run it safely. There is NO ENGINEERING in software engineering. It's all band aids and bailing wire.
Right, because there is actual computer science theory that explains why this is difficult.
The temptation is to cite the halting problem, but that's not it.
The Bell-LaPadula model[0] has been proven to be able to provide security, but due to historical accident, you generally can't implement it in Linux, MacOS, Linux, etc al.
The necessary CS theory was developed to make things safe in the 1970s, as I've stated, over and over in various threads here[1-4] and elsewhere on the internet[5], ad nauseum. But we, the programmers, "software engineers", hackers, whatever you want to call us, don't apply those systems, and continue to pile layer upon layer of band-aid to systems that are insecure by design.
It's like building all of your bunkers out of crates of TNT, and wonder why they keep blowing up at the first rifle shot, then concluding you need thicker walls.
[0] https://en.wikipedia.org/wiki/Bell%E2%80%93LaPadula_model
[1] https://news.ycombinator.com/item?id=36717861
[2] https://news.ycombinator.com/item?id=36652789
[3] https://news.ycombinator.com/item?id=36623992
[4] https://news.ycombinator.com/item?id=36442874
[5] https://twitter.com/mikewarot/status/1607769510542544899
Think of capabilities as cash in your wallet... fairly easy to manage, as long as you can secure the wallet.
It's a hell of an expensive (and difficult!) credential when, these days, it seems you can do the most plentiful && easiest && high paying dev work (web) without it.
For example in my own career. Back in the 1990s we used to have so called "technical high-schools" in my part of the world. These had a final year project, and upon finishing it one got an official "technician" diploma (in addition to the normal high school graduation stuff). I was always interested in electronics/computing etc so it made complete sense for me to go there which I did. I already knew few functional programming languages, but I can credit this school for making me finally understand OO programming concepts. I was quite happy that my official title I could put on my cv was "Electronics Technician specialised in Object Programming in C++"
I then got accepted for a CS university course, but before it started I looked for a summer job. Which turned out into a 20+ year long career in IT. During subsequent time I did finish my remote B.Sc,but realistically the only reason why I needed it was not to loose out on future job opportunities that require a CS major. When I graduated I was already 8 years into my career.
So is university pointless if you think you already have all the skills for the job? I wouldn't say that. I did learn _stuff_ during my course, but it wasn't programming that I already knew. I learned some design and math mostly. Also thanks to the "CS major" (despite it only being a B.Sc) I successfully applied for jobs that paid double of what I was getting at the time and I could work for much bigger companies (in my experience smaller businesses care less about formal education and more about what you can do, big companies for some senior positions have a prerequisite like "a CS major" and you can be a programming genius, but your application will get shredded if you don't have that CS major).
Compounding factors:
0. CS is a heavily male major and far fewer men (%) attend college than 25-30 years ago. The only major worse is EE. Finding a woman with EE PhD is like finding a real live US Navy SEAL or a monopole magnet.
1. General university enrollment is down by ~10% since 2010.
2. You don’t need a CS degree to be a developer.
3. People aren’t so market-driven when they’re considering majors.
4. Immigrants are taking all the jobs.
5. Anti-women culture.
6. Reactionary faculty.
7. Anti-nerd culture.
8. Skill mismatch and lack of training from startups.
9. Quality gradient.
10. Psychological burn from the dotcom bubble.
11. No pipeline issues anymore.
They are not filled with obnoxious asshole nerds.
I would generally stereotype a CS student from my memory as a timid high school graduate with an inflated ego from being "better" at computers than their HS peers, but this feels a bit disaligned with the "tech bros" you describe so I'm curious how things may have changed in 5 years.
As it happens, I subsequently veered into AI and “Deep Learning” before it had the name. That also seemed useless and very theoretical until about a year ago, at which point it became the most important skill in the industry out of nowhere. I might need to dust off the books again!
Contrast with my bro who studied ME where they had a toy robot competition in the first month.
Where was this?
In the end... most of us work as software developer/engineer, not computer scientist in the academia. We usually built products for consumers (typically the usual database and networking, not fancy stuff like AI, formal method, high performance cryptography bla bla bla). In this context, well yep "You don’t need a CS degree to be a developer".
Funnily enough, most engineers I know (mechanical, civil, aerospace, etc) are now coding for a living, sometimes at engineering companies but oftentimes at tech companies.
Since then, computer science has certainly been growing: “The number of students nationwide seeking four-year degrees in computer and information sciences and related fields shot up 34 percent from 2017 to 2022, to about 573,000, according to the National Student Clearinghouse Research Center.” https://www.washingtonpost.com/education/2023/05/19/college-...
Even at that rate, colleges cannot meet demand and CS majors are difficult to be admitted to even for the most competitive college applicants: https://www.geekwire.com/2022/it-is-not-acceptable-uw-comput...
The major is so sought-after that as of last year, UIUC has closed computer science for transfer from other majors: https://cs.illinois.edu/admissions/undergraduate/transfer-st...
This is terrible advice. However, I don't think my experience is unique and have to believe that many university applicants were given (and maybe are still given?!) similar guidance.
1) CS is not a vocational qualification like Law.
2) Other qualifications are just as good a route into the jobs described. Arguably maths and statistics is a _better_ route. These qualifications also offer more flexibility.
3) Of the standard routes into tech jobs, CS is the lowest status.
Maybe it has lost its magic since then?
3 years ago