51 comments

[ 3.2 ms ] story [ 111 ms ] thread
Because actual Computer Science is not writing a VBA script, or putting together your own PC. There is some common misconception that Computer Science = Being good with computers.

At RIT, the Introduction to CS cources (CSCI 140 & 141) were designed to be hard to get people who assumed CS was "computers" to switch to SWE, GameDev, IT, Security, EE, or Systems. The courses weeded people out who thought CS was just programming, because the upper level courses get heavy into math, science, and theory.

There is no easy way for people to figure out if they are just interested in computers (IT), like to write software (SWE), like to make games (GameDev), or are actually into the lower level concepts such as memory management (and others). You need weed out courses to get people to think about what they actually want to do.

In that case, I admire (from the outside looking in) RIT's program because my own college conflated CS and SWE together. We did get into theory, but it was largely rooted in writing code and SWE.
When I went there were two tracks. CS or CE. CE was taught out of the engineering department and was more focused on people who were going to write device drivers or FPGAs. It overlapped considerably with EE.

CS was quite math heavy. In fact you only needed 1 extra elective to get a math minor. That said there was a fair bit of practical developer classes as well, like Networking and Graphics (this was before GPUs so the graphics class was mostly about matrix math).

Is it really admirable though? If you remove the tether of software engineering, then CS is just math.

I think what I like most in CS is when theory comes in support of SWE. Having something that is elegant and practically useful.

(And I don't know about RIT, but overwhelming, schools don't teach pure CS theory, but rather CS/SWE.)

At RIT, this statement holds true: "You don't learn how to write software in CS, you just learn it by proxy." The CS course is focused on concepts, involving writing assembly programs to understand how stuff works. And yeah, it turns into heavy mathematics towards the end, which is why I gave it up after the first year. It turned into applied theory. If the course was in Networking (for example), you would spend your time learning the theory behind it while implementing something to apply the theory. My friend did a whole bunch of this stuff in C++/Java. He never learned how to write practical software, just enough to complete the assignments.

Most people move to Software Engineering- the first two years of the CS/SWE program are virtually the same. You fairly quickly figure out which side of the fall you want to fall onto.

I didn't exactly take a full normal CS curriculum, but I did get the impression, back in the 90s, that there tends to be a cultural bias against any language you would use in industry. If there's any excuse not to use something practical, they won't. Knuth and (M)MIX is the extreme example. My college did all assembly language in MIPS.
My CS dept liked to say "We don't teach programming".
I thing it was Niklaus Wirth (Turing award winner, inventor of Pascal/Modula/LoLa/Oberon, and general CS hero) who once said something like "I am a programmer who is a professor, and a professor who is a programmer."
Having a programmer's knowledge is very valuable for CS. But CS is not about programming, it's about the fundamental mathematical structures that underlie computation.

CS and SWE are definitely related but distinct. Knowing both is best, but knowing one well and having a very cursory and elementary knowledge of the other is perfectly fine and useful.

It's like studying the Maxwell's theory does not make you a qualified electrician, nor even requires you to already be one.

> You need weed out courses to get people to think about what they actually want to do.

In my experience, "weed out" courses are usually a) very poorly taught and b) much more work than a normal course.

I'm sort of OK with (b) with full disclosure, but there is no excuse for (a).

Science, engineering and math departments should have high-quality onramp courses that do their best to help beginners master the material and discover how fun, interesting, and challenging the subject is.

Personally I've had experience with some fantastic introductory courses where basically everyone succeeded, had a great time, and learned a huge amount; a big part of this seemed to be instructors who actually cared about student learning. This stands in bleak contrast to other courses where the course staff seemed to actively work against any attempts by the students to learn the material.

I took night/weekend college classes in CS, often alongside teenagers. For our computer graphics class, one kid was excited, anticipating he was going to find out how to point and click his way to make a dragon appear in a video game and that sort of thing. In class, we learned things like the Phong reflection model to calculate the illumination of a surface point. Or matrix addition, multiplication and transposition to reorient the points of an object in three dimensional space.

Even for myself, we spent a semester learning graph theory, and I had no idea why we were doing so. I understood the next semester as we worked with tree and graph data structures like heaps, DAWGs, Dijkstra's algorithm etc.

I'm going to guess it's because lots of people took it just because programming careers pay well, then realised they hate it or are terrible at it.
I think so too. the other side of this question is why do so many people sign up for cs majors
I'm not sure if I buy the interest bit. It's common knowledge that CS is lucrative and lot of students will grind through programs they don't enjoy for the paycheck at the end.

My experience was that some people are cut out to be programmers and some people are not. I wish I had a more comfortable explanation but I really don't. Some students will breathe through CS101 like it was second nature, others spend every evening in the computer lab and just barely get through it. Many more just drop out half way through.

I encountered a lot of 4.0 highschool valedictorians who struggled to get their homework done by the third or fourth week. They could memorize all the tools and intricacies of the language but were completely unable to figure out the steps between knowing what their program was supposed to do and implementing the code to do it. It's something about problem solving, I think. I suspect the real unifying trait among programmers is the ability to solve puzzles more than anything else.

I don't think our CS101 class was particularly tough although I do think our school did them a favor by not babying them through the basics so they could go on to fail their data structures class. I'll stress that these kids were very smart and most went on to have very successful careers in other majors. It's not about intelligence or ability to work hard. I think we just have a very poor understanding of what makes programming so obvious to some and so inscrutable to others.

I don't think programming is something binary - either obvious or inscrutable - but there are certainly environments which make programming seem more like one or the other to the vast majority of people who would fall in between those two extremes on the spectrum.

One such finding by Cantwell Wilson and Schrock:

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88....

Math background and formal programming classes before their CS101 class helped, but the dominant factor was "comfort level"

* how they perceived the difficulty of the course

* how they perceived the difficulty of completing the assignments

* how they perceived understanding the concepts of the course compared to their classmates

* asking questions in class, in labs, and in office hours

Students who felt "comfortable" in these areas compared to those who did not had a strong positive correlation with grade performance.

From my own experience you get a looooot of mileage when teaching others programming or even basic computer literacy skills out of:

* making "mistakes" yourself to show them the machine won't (literally or figuratively) break

* tell them that error messages are actually the wise words of a sherpa left behind by the developers to help you up the mountain

* Following all the awesome advice in Phil Agre's How to help someone use a computer ( https://pages.gseis.ucla.edu/faculty/agre/how-to-help.html )

I studied chess quite a bit, and one time I complained to my instructor that I was great at tactics but couldn't apply it in my games. He wisely pointed out, "That's because you know when you're in a tactical puzzle that there is a concrete solution."

For people who find computer science "obvious" I think it's in large part because they are "convinced" - by assumption, by proof, by experience - that the thing in front of them was designed to do things ... that you're in a puzzle, basically. So no matter how many wrong things you enter, bugs you encounter, hacks you endure, logic bombs you build ... there's an answer, and you can find it, key by painful key if needed.

And a lot of people feel more like they've been flung into the middle of a chess game, and there's no certainty at all that what's being asked of them can even be done.

"Convincing" people of that they're in a puzzle is the first step. If you fail it, they will always feel that computer science and software development and all things computers are "inscrutable."

A big factor people haven't mentioned yet is that job prospects for non-graduates are extremely good. I know plenty of extremely talented people who got >£100k/y offers with half a degree.
One reason is it's a discipline that you can't really start in college. Unless you have a fair amount of tech experience of some sort under your belt by then, you'll never be more than mediocre. Ideally, it's experience you got by scratching and clawing. If someone served it up to you on a platter, it's not going to be worth much.

It probably doesn't help that people are being directed into the field for reasons other than that they simply really want to do it. Those people will fail at a high rate.

Finally, as many have observed, there's a knack to it. If you don't have it, you're not going to do well. (I lack the knack for a lot of other fields, and having tried a bit, there's not much way to get past that.)

What kind of post is this? This question presupposes that CS dropout rates are "so high," but I am not convinced.
I think it comes down to students having a different expectation of what CS is all about. Students think that if they like to use and troubleshoot computers then they will like CS. Well, surprise, CS has a lot of math and a lot of theoretical work which is a drag if you are not ready for it. Even if you are ready it's still a drag.

Math is a large component of the degree. I remember that most CS students in my school would minor in math since it only took 1 or 2 more classes to complete the minor. Any way you look at it, it's a lot of math. Many people aren't ready for it.

I think economics is one of those majors that has a large dropout rate too. Again, the amount of math is a huge reason why people drop out.

I’d be surprised that it would be because of the math - I’d think some math would be expected, I’d guess it’s because you have to think for yourself and problem solve basically immediately.

Pretty much every other class just has you follow rote steps until you get to upper classman years or even graduate school. Some form of recognize the problem type and then implement the procedure of explicitly taught steps for that problem.

In computer science introductory classes you get introduced to programming languages as tools, but you have to figure out the procedures largely on your own.

I think this is the first time a lot of students have had to actually think for themselves when solving a problem, and I suspect the transition is too much for a lot of them and they drop out.

That's a good point. If you can't figure out how to solve a problem, then it's very hard to move forward in CS so dropping out is the only option.
All of my friends who dropped out did so because of the math. The actual computer science courses were enjoyable. Discrete math was particularly challenging on purpose and so was our specific calculus classes we had to take. This was just to weed people out I heard. I would have guessed your reason too as that’s why people didn’t like AP computer science when I took that, but in my experience it seemed like math is what gets people and honestly that’s what I struggled the most with too. It was just an absurd amount of work on top of my other classes and it wasn’t enjoyable work either.
That’s interesting - I would expect CS drop out rates to not be significantly different than engineering/STEM in general if that’s the case since any of those are likely to have similar levels of math.

If CS rates are higher then I’d expect something unique to CS, if they’re not then CS isn’t really unique among more difficult degrees anyway.

If the person is comparing engineering degrees/dropout percentage to liberal arts degrees, well - there’s a reason the liberal arts stereotype exists. Those classes are way easier.

> That’s interesting - I would expect CS drop out rates to not be significantly different than engineering/STEM in general if that’s the case since any of those are likely to have similar levels of math.

The level of math in most engineering fields stays within the bounds of applying techniques from calculus, and rarely involves proving much if anything. Most engineering degrees don't require any math courses beyond calculus and statistics. CS is one of a small number of degree programs where undergrads are likely to be exposed to a significant amount of proof theory, along with topics like algebra and graphs.

The theory and math may account for some of it but The dropout rate is high on the Intro classes though, which are usually just ‘java 101’

I think a lot of people start CS without having coded before, find it more difficult than expected, look around and see half the class have been coding a few years and are way ahead and decide it’s not for them

Yeah, some people just don't have the head even for regular programming. One of the people I started CS with really just wanted to make games. He was creative, and wasn't a dummy, but he hated programming once he tried it. He could squeak through on the assignments but it was just miserable for him. He switched majors long before we got to the really abstract stuff.
I think high school courses are a great way to solve this problem. I took two years of computer science before setting foot on a college campus, so I knew for sure what I wanted to be doing.

For the record, I was never super interested in the really abstract theory and math, and I was just okay at it, but I could do it well enough and was motivated to push through by my love of SWE. I don't think I'm alone in that.

Because 2 years of experience is worth more on the job market than a degree about math concepts that are abstracted away by compilers, so why waste the time and money?
A paper linked in the comments there suggests that dropout rates aren't relatively super high for STEM [0]

>Attrition rates in non-STEM fields were as high as or higher than those in STEM fields. At the bachelor’s degree level, students in humanities, education, and health sciences had higher attrition rates (56−62 percent) than did those in STEM fields (48 percent), and students in business and social/behavioral sciences had comparable attrition rates (50 and 45 percent, respectively) as did students in STEM fields. A closer look at how students left their fields reveals that proportionally more students in education (42 percent) and health sciences (35 percent) switched majors than did students in STEM fields (28 percent).

It goes against the trope of "STEM is just super hard and I'm smart because I made it through."

[0] https://nces.ed.gov/pubs2014/2014001rev.pdf

or STEM has a selection bias that pre filters those who would drop out.
I think the paradox of programming is that it's both easy and hard. It's easy for a few people who manage to get over the "hump" and become self sufficient at it. But it's prohibitively hard for most people, even very bright people with technical degrees. Nobody knows why. It doesn't matter whether it's "just" programming, or the theory of programming.

"Because math" isn't a good explanation, because most programmers I've known are average at math, and yet are good programmers.

Because it’s hard, and a lot of people think it’s about computers.

Computer science is a cleverly disguised math degree.

A Professor in 101 put it as: "Programming is just a tool, CS is a study that just so happens to use that tool now and then."

Without reading through every year's syllabus you will come across supprises (and very few students seem to do this)

Its expectation versus reality, CS seems to be taught very differently depending on where you go ie different levels of maths focus is a big one, another is if they teach "reality" like common industry tools, software development methodologies, software ethics etc

Often there can a problem with elitism "this course is for knowledge, not your career" that changes many students minds on if this huge amount of debt is worth it vs just finding a job right away.

As my professor put it: "Computer science is as much about computers as astronomy is about telescopes."
So it's science that happens to involve a computer? Maybe I misunderstood what CS truly is. I thought it was the science of computing. And while I used a lot of books and paper to study it, without the machines it would not have been of much use.
It is the Science of Computing. Memory Management is a great example of this. You learn the theory behind memory management, physical vs virtual memory, pages, swapping, with the goal of being able to understand how modern computing handles memory. And down at that level, it's all theory and math. You don't actually need to use a computer to understand it. Something like sorting lists at an algorithmic level can be applied without a computer. Part of CS is understanding the most efficient way to sort or traverse a data structure- a computer isn't needed to apply it.

It's like Medicine. You can know how the human body works down to a cellular level without ever touching another human. It's not very useful without another human to apply it to, but the science and application of that science can be two distinct topics.

While technically true my experience is that doing makes learning easier. Whether it's chemistry labs or running modified examples through a computer the process helps things click for me.
Oh agree 100%. Theory doesn't help much if you can't apply it.
So your professor was Dijkstra?
There was a non sarcastic asshole way of pointing out that this quote should be attributed to Dijkstra. Maybe try it out next time.
Pardon the transgression.

The full quote reads "Computer science is not about machines, in the same way that astronomy is not about telescopes. There is an essential unity of mathematics and computer science" and is disputatively attributed to Mike Fellows and Dijkstra although Fellows also indicates Dijkstra said it in a '93 publication.

I think your point about different universities giving different focuses on math/real world tool, etc is a great point. I’ve heard of an incredibly broad range of “computer science” degrees from various universities.
Over the years I've heard that a number of people mistakenly go into CS, thinking they'll learn how to program and develop stuff like games and cool programs. I can imagine how disillusioned some people can become after they realize what CS really is.
Society tends to aggrandize kids these days as the “technology generation” and so on, but those kids don’t have an understanding of all the devices they’re using. It’s just rote learning of applications and interfaces.

If you ask them how they think the underlying systems work, you’ll get a simplistic estimate or something that amounts to “magic.”

That’s why entry level courses are designed to weed out candidates who don’t know what they’re getting into.

It’s working as intended.

> It’s working as intended.

By whom, to what end? Who is served by poorly-taught courses designed to turn students away instead of helping them become enthusiastic learners?

What's the point of a "course" that can only be passed by students who either already know the material or learn it entirely on their own without assistance?

Where I went those courses weren’t exactly difficult. But they started at a low enough level to say “this is how things are built.” It’s not intended to frustrate students, but to help them realize what the major is about, and removes illusions they might have had about it.
As someone who just finished their undergrad in CS I can say that the majority of the people I know who dropped did so because of the workload and the nature of it. Coding up a robust LZW compression algo or a small version of BASH in a week and a half on top of other classes can make for a stressful time. But every school is different of course.
This seems like a great litmus test for who actually reads the articles on HN, because if you do you will notice the article actually says that dropout rates aren't high relative to other STEM fields and even those fields aren't drastically higher than the average among all fields.
When I studied ECE (focused more on EM), it seemed like anyone who couldn't manage the math/physics/engineering/etc. moved into CS.
CS requires a lot of practice. Both in terms of theory and practical aspect.

Without it is difficult to make connection between theory and actual stuff you can run on computers.

And the subject is vast, making it difficult.