<p>I think there is a element where people are picking up on this 'everyone in the future must be able to code' attitude that has become fashionable in the last ten years or so. This is of course as ridiculous as saying everyone must be an engine mechanic or concert pianist. Everyone should be computer-literate, able to be safe online, spot malware and so on. The young men and women with a natural ability for coding should be spotted early and put into educational streams that encourage and support them and probably into decent apprenticeships\internships afterward.</p>
<p>Also these days so much of the coding world revolves around web applications and one look at that insanely over-complicated mess would put anyone off.</p>

CC BY-SA 4.0
2020-11-19T07:33:16.077Z
2020-11-19T07:33:16.077Z
Alan B
<p>Maybe computer science is hard, because it gets lost in translation. Consider the following:</p>
<ul>
<li>The processor that you are writing code for is a bunch of logic blocks</li>
<li>the language that you are using is a set of logic blocks as well.</li>
</ul>
<p>Maybe the correct way to write software manuals is to simply show the logic block behind each keyword, and restrict human language to aftermarket tutorials, and how to manuals.</p>

CC BY-SA 4.0
2021-05-02T02:23:40.487Z
I am not quite grasping, but I think you are saying something like: two similar-seeming conceptualizations are actually about very different things, and this is never made explicit. If it was, the reaction of students might reasonably be: "just teach me the one thing that works instead of two things that I have to learn how to connect together." This is why I often say, teach how the computer actually works instead of teaching a language-focused approach, like with Lisp or other machine-independent methods. Teach about the machine, then how the language is a tool to work with the machine.
Scott Rowe
CC BY-SA 4.0
2020-11-21T20:18:21.463Z
2020-11-22T10:50:30.037Z
2020-11-22T10:50:30.037Z
R Dent
<p>I would say the answer is shifting from &quot;the strangeness of the platform&quot; to &quot;the raw number of operations that have to be perfect.&quot;</p>
<p>In the past, when computers were weaker, what made CSci so hard is that the tools did not fit the problems as well as we might like.  There's something very unintuitive about how you had to work with them.  And there's some real beauty in seeing how people grappled with this with cunning intuitions.  The greats like Alan Turing and Grace Hopper truly revolutionized things with cunning shifts in intuition.</p>
<p>Nowdays, what I think makes CSci so hard is that the primary thing we do is operations that have to get repeated many many many many times.  As I type this, in the USA, we are dealing with the 2020 national elections.  There's great frustration in the handling of 330,000,000 slips of paper (give or take, depending on voter turnout) and getting them into the right places and making sure they're all done right.  Its hard.  And it has to be done 330 million times.  We can afford to make a few mistakes here and there, we just try to keep them small so that they don't change the result of the election.</p>
<p>A while back, I did a computer science task which involved 4,000,000,000,000 operations, all of which had to be done absolutely perfectly in order for the answer to be valid.  Four <em>trillion</em> operations.</p>
<p>For me, it was a Tuesady.  There was nothing weird about these requirements.  That was just sort of the usual daily expectations.  I didn't even warm up a grid, which would have added a few zeros to that.  That kind of perfection is just part of the job.</p>
<p>The tools you use to immaculately manage 4 trillion operations while you sit back and sip your coffee are, obviously, rather exacting.  And its rare that we find places to use them outside of CSci, so there's not much room to develop intuition.  I don't care how fast radix sort is, if you have to sort a bunch of numbers, you'll typically do it the intuitive way rather than the theoretically optimal way.  And, having done it both ways, the theoretically optimal way is often slower (until you get to very large numbers of records).</p>

CC BY-SA 4.0
2020-11-21T05:55:47.820Z
2020-11-21T16:24:23.940Z
2020-11-21T16:24:23.940Z
Cort Ammon
<p>The <a href="https://cseducators.stackexchange.com/a/6613/1293">answer of jmoreno</a> states:
Compare those topics to <a href="https://en.wikipedia.org/wiki/List_of_unsolved_problems_in_computer_science" rel="nofollow noreferrer">https://en.wikipedia.org/wiki/List_of_unsolved_problems_in_computer_science</a>, and try to figure out how those topics even get you started on the path to figuring out how you might even frame those questions, let alone solve them.</p>
<p>Computer science is hard because it’s a branch of symbolic logic and logic is hard. End excerpt.</p>
<p>Two comments: the List of Unsolved Problems (after having read the Wikipedia item) are considered within the context of classical digital computing -- using integers or perhaps natural numbers, and within the Church-Turing hypothesis, on a Universal Turing Machine (UTM) or, for parallel architectures, on a Parallel Random-Access Machine (PRAM).  There are models different from either of these (with unsolved problems and conjectures); two of the most promising are quantum computers (and information transfer) and a rather more empirical approach, neurosynaptic computing (that has other names for similar concept).  Quantum computing has a formal theory and is just starting to develop working hardware that instantiates quantum architectures.  Neurosynaptic computing is a much more empirical approach to producing something akin to actual &quot;artificial intelligence&quot;.</p>
<p>For example, one model uses an empirical connectome (at a specific scale of detail, not necessarily at each neuron and other brain components), observed from a non-human primate.  This connectome is then modeled with solid-state electronic components (e.g., VLSI circuits that actually are fabricated).  If the original biological brain has &quot;intelligence&quot;, then the neurosynaptic electronic solid-state instantiation (model) is envisioned to have similar intelligence.  The understanding of &quot;how&quot; the machine works, that is, a provably correct classical or quantum algorithm does not necessarily apply, but the empirical observations are intended to emulate what the biological brain would have done, including learning and adaptation to new &quot;stimuli&quot;.</p>
<p>My point is this:  in addition to the stated classical unsolved problems, completely different approaches to computation are being proposed and actually developed into physical machines (with the understanding that biological systems are, in this sense, physical machines -- no supernatural invocations involved). The issues that make computer science &quot;hard&quot; are now harder. The other point is that computer science uses logic (the first-order classical predicate calculus or perhaps higher orders), but in many ways goes beyond such logic.  It requires mathematics (including &quot;arithmetic&quot;) to establish algorithms; however, once one accepts that, one is beyond logic that provably is consistent and complete, and faces instead the problem of Gödel's incompleteness theorems.</p>

CC BY-SA 4.0
2020-11-24T13:30:50.963Z
"because it’s a branch of symbolic logic". That is only a part of CS. There is much more.
Buffy
CC BY-SA 4.0
2020-11-24T07:02:56.897Z
2020-11-24T13:32:21.603Z
2020-11-24T13:32:21.603Z
Yasha Karant
<p>I don’t see anyone mentioning the fact that programming ≠ computer science.  These are two entirely different disciplines, and it seems to me that there isn’t enough emphasis on this fact.</p>
<p>Take a look at Stanford’s CS 101 <a href="https://online.stanford.edu/courses/soe-ycscs101-sp-computer-science-101" rel="nofollow noreferrer">https://online.stanford.edu/courses/soe-ycscs101-sp-computer-science-101</a> and the list of topics covered.  Not a single one has anything to do with computer science.  Compare those topics to <a href="https://en.wikipedia.org/wiki/List_of_unsolved_problems_in_computer_science" rel="nofollow noreferrer">https://en.wikipedia.org/wiki/List_of_unsolved_problems_in_computer_science</a>, and try to figure out how those topics even get you started on the path to figuring out how you might even frame those questions, let along solve them.</p>
<p>Computer science is hard because it’s a branch of symbolic logic and logic is hard.</p>

CC BY-SA 4.0
2020-11-24T13:35:46.010Z
"because it’s a branch of symbolic logic". This is the "CS is misspelled math" fallacy. There is much more to CS than that.
Buffy
CC BY-SA 4.0
2020-11-24T23:49:52.487Z
@Buffy: yes, there is.  But CS isn’t about what an Ethernet cable does.
jmoreno
CC BY-SA 4.0
2020-11-24T23:52:13.307Z
Hmmm. Given that I taught CS for about 40 years, I understand that and, moreover, what it does include.
Buffy
CC BY-SA 4.0
2020-11-20T00:44:43.323Z
2020-11-20T00:44:43.323Z
jmoreno
<p>This discussion may soon be moot.</p>
<p>Consider the following article from the New York Time Tech section:</p>
<p>&quot;Meet GPT-3. It Has Learned to Code (and Blog and Argue)&quot;</p>
<p><a href="https://www.nytimes.com/2020/11/24/science/artificial-intelligence-ai-gpt3.html" rel="nofollow noreferrer">https://www.nytimes.com/2020/11/24/science/artificial-intelligence-ai-gpt3.html</a></p>
<p>That article links to this one: Where an English interpreter writes code on the fly...</p>
<p><a href="https://twitter.com/sharifshameem/status/1283322990625607681" rel="nofollow noreferrer">https://twitter.com/sharifshameem/status/1283322990625607681</a></p>
<p>Just FYI.</p>

CC BY-SA 4.0
2020-11-30T15:23:58.887Z
Can it write FizzBuzz? Can it write FizzBuzz in a special version that prints "manziel" for every number divisible by 13? While this code generation tool is impressive, I have serious doubts that it can be applied to actually relevant problems. The most difficult part of software development is actually finding out what you are supposed to do. Finding a fast and efficient algorithm or data structure to solve you problem is - while certainly challenging - the simpler part of it
Manziel
CC BY-SA 4.0
2020-11-30T12:49:32.240Z
2020-11-30T12:49:32.240Z
R Dent
<p>The difficulty of CS (true or imagined) and the drop out rates are not the same thing. Let me start an answer, but it might take several iterations to get all my thoughts together on the two ideas.</p>
<p>Two themes come immediately to mind.</p>
<p>The first is periodic and I don't know where we are in the period at the moment. But in certain combinations of economic factors and media hype, a lot of students go in to CS not really understanding what they are getting in to but are lured by the, perhaps elusive, draw of big salaries. There is a lot of hype out there about AI at the moment, and self driving cars, and going to Mars, etc. People get in for the wrong reasons and decide they really didn't understand what it was and that they don't really like it. It doesn't need to be hard to drive people away, just boring.</p>
<p>The second major theme is that there is a lot of bad teaching around CS as has always been the case. Some people teach it as misspelled mathematics, which it is not. Some people in elementary and secondary schools are forced to teaching CS and especially Advanced Placement CS when they have little understanding of the topic and just try to stay &quot;one week ahead&quot; of the students. This is, and has always been a recipe for disaster. I don't blame the teachers who have to do this as many are forced in to it (in the US) simply because schools are underfunded and understaffed with too few specialist teachers.</p>
<p>WRT the second theme, it might even be that the current push to teach &quot;CS&quot; in elementary schools is actually part of the problem, not the solution. A serious college level course in CS might be shocking to someone who has only dabbled in trivial elements of programming. In particular CS is NOT programming, though skill in programming is needed.</p>
<p>Too many beginning students and teachers think that programming is &quot;if&quot; and &quot;while&quot; and &quot;assignment&quot; and nothing else. The current AP curriculum, I think, is seriously flawed (dropping interfaces, in particular). Students program in &quot;rich&quot; languages and environments using only the lowest level concepts, never really understanding abstraction or (gasp) polymorphism. Compare that with big ideas that you find in a philosophy or (hopefully) history course.</p>
<p>And if you combine that with asking them to write programs that they find boring, they aren't likely to stick around for long.</p>

CC BY-SA 4.0
2020-11-17T08:01:12.230Z
I can relate about teachers in early schools (I don't know the American education enough to know which levels) not knowing programming enough. My first programming lessons were with a math teacher who was good in algorithm but came to me regularly when a student has an issue because I started programming by myself before going to this class.
I have also seen some people who thought "CS / programming is easy I go on Facebook everyday", these people did not last a long time in the programming school I went on...
f222
CC BY-SA 4.0
2020-11-18T12:03:28.077Z
Right, students are not dropping out mostly because it is hard, it is hard because they are not engaged, which is because they personally do not find it interesting / motivating / fascinating / worthwhile etc. People will work very hard with very little help or teaching to learn something that they want to learn. If they want it, they will persist until they either gain some ability, or find that for whatever reason, it does not come to them. Either way, they will probably be ok with it. Not so much if someone pushes them, in or out.
Scott Rowe
CC BY-SA 4.0
2020-11-18T14:25:06.697Z
"Students program in "rich" languages and environments using only the lowest level concepts, never really understanding abstraction or (gasp) polymorphism. Compare that with big ideas that you find in a philosophy or (hopefully) history course." - Read SICP.
Cees Timmerman
CC BY-SA 4.0
2020-11-18T14:31:53.053Z
@CeesTimmerman, absolutely, but few people read it and fewer use it.
Buffy
CC BY-SA 4.0
2020-11-18T15:28:31.253Z
The introductory AP computer science class (at least at my school) is _awful_. It spends more time talking about niche aspects of programming (image manipulation, databases, and so on) than it does about functions, loops, syntax, string and list manipulation. Even worse, AWS basically sponsors it so half the course is just learning to use one particular company's AI stuff. No wonder people do so badly later on...
rydwolf
CC BY-SA 4.0
2020-11-18T15:39:50.193Z
@RedwolfPrograms DBAdmin isn't so niche as you think. It's not CS, certainly, but there's a pretty big market for those skills in industry. I'm not trying to defend your AP "CS" class, which sounds pretty awful, but being able to use and manage a database is a pretty valuable skill if you want to go into IT or certain fields of software engineering or web development.
OpenAI was the last straw
CC BY-SA 4.0
2020-11-18T15:51:39.903Z
@AndrewRay I agree it's a useful skill, but not for a beginner when that time could be spent on more common skills.
rydwolf
CC BY-SA 4.0
2020-11-18T17:20:23.827Z
Also, there are a lot of advertisements and programs that, for whatever reason, make it seem like it's easy and something anybody can do.  "Learn to code in 30 days", etc. I don't think it's hard as much as just harder than it's made out to be
Kevin
CC BY-SA 4.0
2020-11-18T19:01:21.990Z
@CeesTimmerman I was in a college course that used SICP almost 40 years ago. Lisp seemed interesting up to around page 300 where they basically said, "But this won't actually work, so we need to use this big hammer to make it work." Just teach me the big hammer right away and skip the interesting digression. I lost all interest in Lisp after that. C worked from page 1.
Scott Rowe
CC BY-SA 4.0
2020-11-18T20:07:43.067Z
@ScottRowe And many, many problems faced by the industry stem from the very questionable things C lets you do in order to work from page 1. We would be a lot better off if more software were written in languages that forced you to do things the *right* way rather than letting you get sloppy in exchange for apparent success.
chepner
CC BY-SA 4.0
2020-11-18T21:21:17.807Z
I agree with your observations that CS is grossly misunderstood and teaching CS is grossly underestimated. But I'd like to remark none of this is new: [E.W. Dijkstra already made these observations back in the 80's](https://www.cs.utexas.edu/%7EEWD/ewd10xx/EWD1036.PDF). (I think a summary of Dijkstra's essay is worth an answer on its own, as he has more interesting hypotheses on why CS is hard as well, but I unfortunately cannot afford to spend the time on it, so this comment will have to do. )
Discrete lizard
CC BY-SA 4.0
2020-11-18T21:26:42.420Z
Incidentally, while I'm not sure what you mean by "misspelled mathematics", [the classes Dijkstra taught back in the day under the name of CS](https://cs.stackexchange.com/questions/54143/on-on-the-cruelty-of-really-teaching-computing-science) could certainly be called "mathematics" nowadays, and they perhaps should have been even back then. (In fact, the people currently responsible for teaching "programming" at the same university likely would feel the need to add "pedantic" to the description of Dijkstra's course)
Discrete lizard
CC BY-SA 4.0
2020-11-18T21:28:55.667Z
@Discretelizard: Wow, it's hand-written!
Daniel R. Collins
CC BY-SA 4.0
2020-11-20T00:04:45.517Z
You also give school CS quite a benefit of the doubt it seems to me - or it is region specific^^ All school CS below the last year(s) in what internationally would be high school was tinkering with Word, Powerpoint and perhaps Excel in my experience (personal and what I hear from younger ones^^). Few exceptions of CS oriented schools aside perhaps.
Frank Hopkins
CC BY-SA 4.0
2020-11-20T00:11:19.833Z
Another reason might be low penalty for dropping out. If you drop out from a biology, chemistry or medical college program, who needs a half-educated person? But a CS dropout can still get a relevant programming job.
IMil
CC BY-SA 4.0
2020-11-21T10:05:58.467Z
+1 for the media hype, students considering higher education are being constantly told that an ability to code in python/js/perl/<insert whatever language they are trying to sell courses for here>, is essential in standing out/getting a job/getting a better salary etc. I know of people who went into a cs course without knowing how to use their os to do little more than check emails, write a document in word and print the document, and they only did that when there was no alternative
B-K
CC BY-SA 4.0
2020-11-16T22:07:10.753Z
2020-11-16T22:07:10.753Z
Buffy
<p>Maybe some of those who &quot;fail&quot; should have been somewhere else rather than funneled into computer science.</p>
<p>There needs to be a differentiation between those who want to study computer science (advance the state of the art) and those who just want to write programs (make use of existing techniques and tools.)</p>
<p>I'm in the &quot;just write programs&quot; camp.  I don't belong in computer science.</p>
<hr />
<p>I'm going to present the view from someone who left computer science early  - one of those from the &quot;failure and dropout&quot; group.</p>
<p>Me.</p>
<p>I am a programmer.  I make a good living writing programs.</p>
<p>Way back when I was young, I learned to program on home computers.  Early 1980s.</p>
<p>Telling a machine what to do isn't difficult.  It has a limited vocabulary that you can &quot;speak&quot; to it in, and it has a limited ability to give you responses.  You break the task down to pieces and phrase it in the vocabulary the computer has and tell it how to assemble its response.  No big deal, though you do have to understand the task yourself first.</p>
<p>When I started taking university courses, the options were MIS (management information systems - managing computer systems) and computer science.  I didn't want to baby sit the machines, I wanted to program them and ended up in computer science.</p>
<p>Computer science at the time was more about the theory, the mathematics of how computer logic and algorithms work.  That is, studying things that would let you make better computers or discover new algorithms.</p>
<p>That wasn't what I wanted at all.  I wanted to learn how to be a better programmer.</p>
<ol>
<li>Better approaches to breaking down problems.</li>
<li>Better ways to organize my work.</li>
<li>Learn more about other languages.</li>
<li>Learn how to make an easy to use program (user interfaces.)</li>
</ol>
<p>None of that was taught in the courses available to me.</p>
<p>We were exposed to other programming languages - there were several courses that were dedicated to specific languages.</p>
<p>All I wanted was to be a better programmer, and all I could get was things that I'd need to (someday) be able to do computer science research.</p>
<p>I'm not in the least interested in designing a hashing algorithm.  I'm interested in writing a program that makes some task easier - and that might involve using hashes or dictionaries or linked lists or what have you.</p>
<p>What I wanted wasn't available at that time and place, so I quit.  I went off and joined the US Air Force, then got a job working in electronics, then cycled my way back to programming through my work experience.</p>
<p>My experience with computer science was that I want to make things, but all I was learning was how to someday be qualified for research.</p>
<p>Imagine somebody who is good with a hammer and a saw, and he wants to be a carpenter.  He tells the folks in school that he'd like to build things - houses or furniture or bridges - and they send him to college to study mechanical engineering.  Mechanical engineering teaches him how to design the things, but that's not what this guy wants.  He wants to be out there on the construction site, driving nails and cutting wood.  He drops out of college, and goes off looking for a way to do what he's interested in.</p>
<p>That's me and computer science.  I want to make things with the tools and materials available, not develop new tools and materials.</p>
<p>It takes some theory (of course it does) to be able to write programs.  You need some idea of how the machines work, and how things get from code to execution.  You don't need to be able to design a CPU in order to use it.</p>
<p>Could it be that many of the dropouts just don't want what computer science has to offer?</p>
<p>We <strong>need</strong> computer science, just like we <strong>need</strong> mathematicians and physicists and architects.  We also <strong>need</strong> people who write programs just like we <strong>need</strong> people who pick up a hammer and a saw and build the things the architects and engineers design.</p>
<p>Is there a better place to learn programming than in a computer science setting?  Maybe that's where some of those &quot;failures&quot; and &quot;dropouts&quot; need to be - learning to do things with today's tools rather than looking for tomorrow's tools.</p>
<p>Maybe those folks who fail just needed to directed to a more appropriate place so that they can succeed at the underlying task that brought them to computer science.</p>

CC BY-SA 4.0
2020-11-18T17:09:37.100Z
I agree that there's a long-time institutional failure to distinguish between "computer science" and "software engineering". But even if we cut out the heavy research/math components: many or most students can't pass even the introductory programming course that you're talking about. Nowadays there are indeed "coding bootcamps" to provide the non-theoretical training. But, they have little oversight, and an interesting tidbit in this article: "only 12% of bootcamp grads didn’t previously complete a four-year college degree" https://www.thepennyhoarder.com/make-money/side-gigs/coding-bootcamp/
Daniel R. Collins
CC BY-SA 4.0
2020-11-18T17:28:09.677Z
I can't access the article - the operators block my country.
JRE
CC BY-SA 4.0
2020-11-18T17:29:56.283Z
I don't doubt your quote that "only 12% of bootcamp grads didn’t previously complete a four-year college degree," but I'm trying to figure out why you need to go to a programming boot camp if you've got a degree.
JRE
CC BY-SA 4.0
2020-11-18T17:41:50.427Z
The prior degree is probably in a non-CS subject, and they want retraining for a new career. Example given in article is someone with a prior economics degree. This may possibly support my argument that CS people need a wide domain knowledge in many areas to succeed.
Daniel R. Collins
CC BY-SA 4.0
2020-11-18T17:57:33.683Z
It's been 35 years since I implemented a non-trivial hashing algorithm, b-tree, or invert index, and almost as long since I implemented a linked list.  I also was a DP programmer (now a DBA), but even still that background has bee very useful in choosing the best library or database design to use.
RonJohn
CC BY-SA 4.0
2020-11-18T18:47:44.963Z
The best way to get a second degree is to get the first one first. (Sounds like Yogi Berra, or something) The best way to be able to master computer topics is to be able to master topics. If you can get a degree, you can probably do what you did to get the degree.
Scott Rowe
CC BY-SA 4.0
2020-11-19T16:12:30.583Z
I don't understand why you don't think knowing how algorithms work doesn't make you a better programmer.  Understanding concepts like graphs and time complexity have definitely made me a better programmer.  A lot of people who I've worked with who claim CS isn't helpful for programming make very naive choices that lead to inefficient, overly complex, and inefficient solutions and have no idea how poor their choices were or why.
JimmyJames
CC BY-SA 4.0
2020-11-19T16:19:56.510Z
@JimmyJames:  I'm **not** saying that you don't have to understand how an algorithm works.  I'm saying I don't want to do research on better ones.  Just like a mechanic needs to know when to use a flare nut wrench instead of an open end wrench, a programmer needs to know when to use a hash table, or a dictionary or a list.  To do that, you have to know something about how they work, though you don't necessarily need to be able to design the hashing mechanism behind the dictionary.
JRE
CC BY-SA 4.0
2020-11-19T16:39:23.013Z
I just found this to be a bit of a non-sequitur "... the theory, the mathematics of how computer logic and algorithms work. That is, studying things that would let you make better computers or discover new algorithms."  i.e. "... the *physics, the engineering* of how *engines and combustion* work. That is, studying things that would let you make better *cars* or discover *new automotive technologies*."  Knowing how things work definitely makes you a better technician.  It's not just for research.
JimmyJames
CC BY-SA 4.0
2020-11-19T16:42:03.370Z
But overall, I agree with your sentiment.   I personally think CS programs need to get serious about having a software engineering track/degree.  A lot of CS programs are pretty much already there, they just don't call it that.   Maybe your program was a more rigorous CS program that what I experienced.  I also started in Physics and used credits from that program to fulfill some CS requirements so my experience was somewhat unique.
JimmyJames
CC BY-SA 4.0
2020-11-19T16:47:41.813Z
A mechanic needs to know about combustion.  He doesn't need to know enough about it to develop a stratified charge combustion chamber.  His job is to fix the motor, not design one.  In the same way, a carpenter building a house needs to know what width of board to use as the joists under a floor for a particular span - but he doesn't have to know how to calculate it from the underlying physics and material  properties.
JRE
CC BY-SA 4.0
2020-11-19T18:10:40.853Z
@JRE If that's your point, I agree.  The way it's written in the answer seemed to imply that knowing how algorithms work isn't helpful for development.  My experience is that a distressing number of people think that is the case.  The amount of unnecessary electricity and hardware that is used because of that reason is staggering.
JimmyJames
CC BY-SA 4.0
2020-11-18T16:11:57.353Z
2020-11-18T16:11:57.353Z
JRE
<p>First, I somewhat dispute the premise of the question.  I don't necessarily believe that it <em>is</em> harder.  I think there may be some other elements at play.</p>
<p>Unlike many other college fields, students often have little to no formal background in the topic prior to entry -- in fact, many have little to no relevant background at all.  That means that they're coming in blind.  By contrast, many college majors come populated with students who have years of background in a topic, and are fairly certain that they like aspects of the field.  (Consider majors like mathematics, music, or English, in which students will typically enter in with many, many years of built-up skills.)</p>
<p><em>(As an aside, there is a small added difficulty.  Using modern apps on phones and websites not only teaches students little about computer science, but in my experience, it has almost been a negative.  It gives students the feeling that they are mastering aspects of computing, but hides away so many details that I believe it can actually <em>add</em> to the frustrations of students once they are faced with actual programming, working with command lines, importing libraries, etc.)</em></p>
<p>Additionally, CS has also, and fairly suddenly, become a wildly popular major.  They come, I think, largely because they believe that this is where the jobs are.  Few of them come because they have deep enthusiasm about the field.  In reality, most of the students entering have little to no practical experience.</p>
<p>This will make for some frustrating mismatches.  To use an example from above, if a large population of students who had literally never read an eighth note (quaver) suddenly enter into college music majors, do you expect that the results would be very different from what you are seeing among your computer science population?  Certainly, a fair number of them will be able to pick up and get things sorted out, but there will absolutely be a sizeable population who will find that wall too hard to climb.</p>

CC BY-SA 4.0
2020-11-18T11:53:31.747Z
This is somewhat the answer I was going to write - why do people begin a course of study at 18 with no experience? That seems bananas to me, and is the real issue that needs to be addressed. For most complex subjects, apprenticeship is what has worked, historically, and what will work for human beings. The formula is: get people to do simple but useful things when they are young, and gradually raise the level of difficulty so that they gain expertise in a reasonable way. They each top out somewhere and you have the normal range of mastery. The only problem is: you can't package and sell that.
Scott Rowe
CC BY-SA 4.0
2020-11-18T13:22:14.023Z
@ScottRowe Apprenticeships work well when there are enough unskilled tasks that someone can do whilst learning the skill. The problem with software engineering is that there is so much to learn to be sufficiently competent for the reletively unskilled tasks that apprenticeship style teaching only really becomes relevant once you reach the level that CS undergraduate course teach to.
user1937198
CC BY-SA 4.0
2020-11-18T13:23:44.677Z
As to why people don't have enough prior experiance, a big part is that software engineering salaries are high enough compared to educators salaries that you really need some other compensation to provide a comparable package to industry, and only academia can offer that where teachers are primarily researchers. And even that is hit and miss.
user1937198
CC BY-SA 4.0
2020-11-19T13:20:04.900Z
"They come, I think, largely because they believe that this is where the jobs are." Which is not wrong. CS is one of the fields where it is common to hire dropouts and not too hard to land a job even if you didn't finish the degree. So why would students that are mostly interested in the money side of the equation keep studying when they are already offered well paid jobs long before they reach the end of the program?
blues
CC BY-SA 4.0
2020-11-19T15:48:29.457Z
@blues I think that this question mostly refers to the students who are dropping out from cs1, because they either didn't like it or couldn't keep up.  But that's certainly a good observation about upperclassmen, and also about graduate students who don't finish because they are specialized enough in something like AI to earn mid-6-figure salaries even without their PhD.
Ben I.
CC BY-SA 4.0
2020-11-23T19:30:18.943Z
Do, e.g., business students really come in with a lot of past experience? Engineering students? It seems like they might have some idea of what it is, but maybe more of a Hollywood idea than knowing what actually goes into a degree in the subject.
user3067860
CC BY-SA 4.0
2020-11-18T02:28:24.350Z
2020-11-18T02:28:24.350Z
Ben I.
<p>Here's an attempt at an answer, with some reflections, and then hopefully at the end a concise reply that we could deliver to an introductory student. For the purposes of this answer, I'll assume that in the first year or so, teaching computer science is synonymous with teaching software engineering.</p>
<p><strong>Motivating Quote</strong></p>
<p>Edsger Dijkstra wrote in his paper, <a href="https://www.cs.utexas.edu/users/EWD/transcriptions/EWD10xx/EWD1036.html" rel="nofollow noreferrer"><em>On the cruelty of really teaching computer science</em></a> (1988):</p>
<blockquote>
<p>From a bit to a few hundred megabytes, from a microsecond to a half an
hour of computing confronts us with the completely baffling ratio of
<span class="math-container">$10^9$</span>! The programmer is in the unique position that his is the only
discipline and profession in which such a gigantic ratio, which
totally baffles our imagination, has to be bridged by a single
technology. He has to be able to think in terms of conceptual
hierarchies that are much deeper than a single mind ever needed to
face before.</p>
</blockquote>
<p><strong>An Open Question</strong></p>
<p>Prelude A: This is an area of ongoing research, and there's no consensus theory at this time. While the difficulty (as evidenced by high fail rates) has been known for decades, no predictive educational theory as to why this is the case has garnered significant evidence. (<a href="https://cte-blog.uwaterloo.ca/?p=5153" rel="nofollow noreferrer">Intriguing example from 2015</a> that ultimately did not support its hypothesis.)</p>
<p><strong>STEM, but Moreso</strong></p>
<p>Prelude B: Of course, CS is in the STEM meta-discipline, and those programs are commonly more demanding than non-STEM courses. Like any STEM field, CS is technical, detail-oriented, and has objectively right and wrong answers (at least in terms of what counts as a syntactically valid program, a program that produces logically correct results, and so forth).</p>
<p>That said, the data seems to show that CS has even higher non-success rates than other STEM courses, so from this point on we'll inspect what makes CS even more challenging.</p>
<p><strong>A Deep Stack</strong></p>
<p>As Dijkstra alluded to, CS has a uniquely &quot;deep stack&quot; of technologies and systems in which the practitioner must work, master, and smoothly adjust conceptual level of abstracted thought within the course of a work day. Some have called the computer the most complex creation of mankind; e.g., in the title of David Eck's introductory CS textbook, <a href="http://math.hws.edu/TMCM.html" rel="nofollow noreferrer"><em>The Most Complex Machine</em></a>.</p>
<p>Likewise, consider Joel Spolsky's <a href="https://en.wikipedia.org/wiki/Leaky_abstraction" rel="nofollow noreferrer">Law of Leaky Abstractions</a>: &quot;All non-trivial abstractions, to some degree, are leaky.&quot; As much as we would <em>like</em> to encapsulate computing technologies into neatly abstracted layers, this turns out to not be completely feasible. At any point in the workday we might need to shift mental state to some other layer in order to analyze, debug, or properly design a new part. E.g.: It's just a few conversational steps from thinking about worldwide internet protocols, to the need for check codes and error-handling, to the existence of cosmic rays in the physical universe that might corrupt transmitted data.</p>
<p>In this regard, I sometimes point students to this image (I believe first originating from a website that no longer exists, but e.g., <a href="https://electronics.stackexchange.com/questions/353915/what-is-the-role-of-isa-instruction-set-architecture-in-the-comp-arch-abstract">referenced here</a>).</p>
<p><a href="https://i.sstatic.net/KICI7.png" rel="nofollow noreferrer"><img src="https://i.sstatic.net/KICI7.png" alt="Computing Layers of Abstraction; in 10 layers from physics to applications" /></a></p>
<p><strong>Syntactical Strictness</strong></p>
<p>In CS, the work is mediated by the computer system itself, which is fairly demanding in its syntactical strictness. Compare to work written in math, physics, chemistry, etc.: it will likely be read by a human instructor, who may be able to forgive or fill in some smaller errors in spelling, grammar, punctuation, etc. But with computer syntax no such flexibility is possible: if a single symbol is misplaced, then no defined program exists. Particularly for students with ID's such as dyslexia, this may be a significant extra challenge.</p>
<p><strong>Need for Language Skills</strong></p>
<p>The computing student also needs fairly high-end reading, writing, and communication skills. Problems are almost never delivered in purely symbolic form, as may sometimes be done in math, physics, chemistry, etc. Everything is a &quot;word problem&quot;, and students must be proficient at reading, interpreting, asking for clarification (in a natural language, e.g., English), then designing, implementing, and testing, and finally documenting and explaining the design and code (again in English). Interfaces to the user must likewise be clearly expressed. For students with weak English skills, possibly still learning the language for many foreign students, this is another significant challenge (probably more than other STEM fields).</p>
<p><strong>Wide Domain Knowledge</strong></p>
<p>Related to the English communication skills noted above, the student likewise needs a lot of &quot;domain specific knowledge&quot;. Introductory problems are likely to come from many different fields -- e.g., in my own course, book exercises involve geometry, statistics, savings interest, sound waves, biological population growth, workplace employment rules, taxation, meteorology, sports, corporate finance, etc. If a student has been deprived of a wide range of learning opportunities about the world, then they will be further disadvantaged.</p>
<p><strong>Technologies for Teams</strong></p>
<p>The other thing that I personally find challenging in teaching introductory programming is that so many of the core features of modern languages are designed to support large teams working cooperatively on long-term projects (see Brooks, et. al.). But for many reasons (such as the need to master all the basics), students are working on assignments and tests in isolation. Features such as modular functions, scope rules, local variables, classes and objects, encapsulation and data-hiding, etc., really only make sense in terms of a large team of programmers, engaged in a division of labor, communicating in a structured way so as to not corrupt the overall system. This is a story that I'm constantly trying to tell to my students and want them to visualize, but I fear that the lack of concrete experiences with this &quot;large team, complex software&quot; reality makes it hard to fully appreciate.</p>
<p><strong>Conclusion</strong></p>
<p>So here's my stab at a brief answer to the inquiring student: <em>Computer science is something of an everything-discipline.</em> One needs to develop good skills in the entire STEM spectrum (science, technology, engineering, and math), as well as top-end reading, writing, and human communication skills, and be able to work well both alone and in a team. The computing professional must be detail-oriented (to the level of individual symbols), simultaneously be able to keep the big-picture in mind, and adjust the level of conceptual abstraction at any time. One also needs to be able to digest a fairly large amount of new technical detail at a rapid pace, learn about other arbitrary domains in the world to interface with them, and be committed to continually learning new fields and technologies throughout one's career.</p>

CC BY-SA 4.0
2020-11-18T11:58:39.373Z
So: don't try to write a symphony if you can't write for any single instrument. Don't try to be a Conductor if you can't play any instruments. CS requires, as you say, ability in many areas at once. Why would we think that it is something that can be easily and directly taught? Or that many people could develop a flotilla of abilities at the same time? Because the initial success was with a few very motivated and 'gifted' people. That does not generalize. Let people choose, by doing some of it when they are young. And if they don't like it, they can do something else.
Scott Rowe
CC BY-SA 4.0
2020-11-18T17:48:17.580Z
Saying much the same thing, I think: computer programming is hard because "math is hard". Even though there's precious little math in most programming, there's a **LOT** of the same analytical skill required for geometry proofs -- and not only do geometry proofs require skills that most people hate (because apparently most people's brains aren't wired that way), but also because apparently children aren't being taught proofs like I was 40 years ago.
RonJohn
CC BY-SA 4.0
2020-11-18T21:31:10.543Z
Upvoted for pointing out that many of the techniques we learn only make sense when working on big systems and/or teams.  Managing 1,000,000 lines of code is very different from managing 100 — and much harder to demonstrate…
gidds
CC BY-SA 4.0
2020-11-19T08:29:33.790Z
@RonJohn Computer programming per se is not CS. I can program most everyday business applications using existing tools and libraries, but I would be hard pressed if I had to attend university CS, which deals with the math underlying many of the libraries.
Gnudiff
CC BY-SA 4.0
2020-11-19T14:00:03.490Z
@Gnudiff maybe I just went to the "wrong" University for a Comp Sci degree.  It was all about algorithms, evaluating them and using them.  (Then again, it was a mid-tier State school in the mid 1980s.  I've done quite well by it, though.)
RonJohn
CC BY-SA 4.0
2021-08-06T02:20:06.920Z
I wasn't aware of Dijkstra comment, but I completely support it.  The range and scope of what I need to be aware of is incredible in the time domain alone.  When tweaking circuits on a wafer, I need to think in femtoseconds.  When working with signals on a PCB, I'm usually in nanoseconds.  For communication within a room, microseconds.  Network hardware signaling works in milliseconds.  Human reaction times in deciseconds.  Long-range networks in seconds.  And from there the time grows longer.  Subsystem processing times.  Backup retrieval times.  Earth-Mars-Earth comm times. 1::10^18 already.
cmm
CC BY-SA 4.0
2020-11-17T21:03:18.147Z
2021-07-21T14:50:00.727Z
2021-07-21T14:50:00.727Z
Daniel R. Collins
<p>From my experiences (I studied about 15-20 years ago, and my cohort lost 50% of students within the first four semesters), the main reasons are these:</p>
<ul>
<li>Many students do not really know what CS is about. They might think that it's about learning how to work with computers, or become &quot;power users&quot;, or programmers, or something along these lines. I don't think the general public generally knows what CS is. I daresay this is not much different from an electrical engineering student expecting to weild a solder iron a lot; or a mechanical engineering student expecting to work with a metal lathe. At least in my western country, there really was no good way for a young pupil to really find out about this.</li>
<li>Some topics actually <em>are</em> really hard; for example if you leave the mainstream programming languages and dig into functional, logic or constraint programming, or theoretical CS topics.</li>
<li>Some topics are maybe not very hard, but unless somone is really interested in them already, the university might not necessarily present the topic in a way that creates interest. In my time, there were the classic lectures like how to build a compiler for a programming language; or more theoretical topics like automatons, temporal correctness and such. I think I can count the number of students in &quot;my&quot; class who were really interested in the topic on one hand, amongst dozens or in some courses hundreds.</li>
<li>I don't know how this is these days, but in my country, in the 1990's, CS was strongly coupled to maths - we had plenty of obligatory maths lectures which we shared with beginning maths or physics students; hardcore linear algebra, functional analysis, statistics etc. - totally irrelevant for 99% of all CS students, but there was no way to avoid it. This most certainly got rid of quite a few students for better or worse.</li>
</ul>
<p>By the way, this does not end in the university; the same phenomenon happens in IT companies - you get a few high-flyers who really live and breathe IT and CS (as far as CS applies to IT in modern software projects at all...), and plenty of people who just do their job on most days, or eventually find out that it's just not for them.</p>

CC BY-SA 4.0
2020-11-18T18:49:36.457Z
Your last paragraph, is true in general. To get to the 10,000 hour mastery mark, you need to put in those first 9999 hours.
Scott Rowe
CC BY-SA 4.0
2020-11-18T22:36:27.433Z
This answer matches my experience pretty exactly. I studied CS from the mid-1980s to the early 1990s in a European country. 50% of the students in my cohort dropped out during the first two years as well. The last bullet point in particular rings true for me: I almost failed due to the stringent math requirements, despite doing well in math back in high school.
njuffa
CC BY-SA 4.0
2020-11-19T03:06:51.953Z
I've always wondered why corporate IT recruiters believe CS is relevant to most of the positions they are trying to fill. The only answer I have been able to think of is: *it has 'computer' in the name*
Z4-tier
CC BY-SA 4.0
2020-11-20T01:09:11.167Z
Your last bullet point is THE reason in my experience, and is still very true in the US today! As a current CS student, I'd love nothing more than to have a computer science class that actually challenged me, but 95% of my time has been spent on the associated math and physics requirements, which is why I'm currently in my 4th year of a "2-year" college, hoping to transfer to a "4-year" college next fall.
Patronics
CC BY-SA 4.0
2020-11-18T15:43:42.453Z
2020-11-20T07:49:10.160Z
2020-11-20T07:49:10.160Z
AnoE
<p>In addition to the many good answers on here, as a past student, TA and instructor in CS — most programming assignments and projects often take large amount of time, even if slimmed down to just fundamentals. There is a definite learning curve to build the skills, and personal mental model surrounding syntax, compilation, building, layout, debugging and deciphering build errors, and that’s before the more interesting data structures and algorithms kick in.</p>
<p>At my uni, there were the “Big 3” 4th year courses that were advised a) not to take more than one a term, b) to take a lighter course load if possible. Despite this, all nighters were a given, and some labs even had couches to crash on. The graphics course was hands down one of these, given the involved and highly detailed work required to get things working. And it is the same effort and work ethic that is essential to eg. the games industry which still motivates many people to register in CS.</p>
<p>Some people realize this time commitment and determine they either don’t have, or don’t want to spend their time this way.</p>

CC BY-SA 4.0
2020-11-19T06:06:39.077Z
2020-11-19T06:06:39.077Z
Erika
<p>Computer science demands a set of qualities, some of which are somewhat antithetical.   One is the attention to detail.  Another is the creative ability to build strong abstractions that are both powerful and useful.  This involves some pretty heavy lifting in the big picture thinking department.  However, it is hard to get off the ground in programming if you are unable to manage the syntactical exigencies of the language you are programming in.   It is also hard to get off the ground if you cannot walk through a complex chain of logic.</p>
<p>In short, it requires some very serious effort and a very special mix of skills to become a good programmer.</p>

CC BY-SA 4.0
2020-11-18T22:20:06.247Z
2020-11-18T22:20:06.247Z
ncmathsadist
<p>Looking back on my experience and education as a software engineer, I think the largest <em>inherent</em> contributors of difficulty in computer science are that it has exceptionally strict and unforgiving standards for correctness, and that solving problems in it often requires an exceptional degree of questioning or ignoring &quot;common sense&quot; basic assumptions.</p>
<p>In many (or most?) other fields, getting something wrong by a small margin usually has an effect that is worse than desired by a correspondingly small margin. There are exceptions, of course, but there's usually a region of tolerable error. In software source code, it is not only <em>not rare</em>, but actually <em>common</em> for small mistakes to have large or even catastrophic consequences.</p>
<p>Those small mistakes in software source code often appear superficially to be completely correct. That apparent correctness tends to rest on an assumption so basic that programmers don't even realize they've made it. Logical reasoning as typically practiced by humans involves an enormous number of unstated assumptions, all predicated on a life experience in a world governed by physics and inhabited by other humans. Computers don't have those assumptions, and operate by their own internal logic that was artificially created by legions of computer scientists. To find and fix software errors, or to prevent them, a software engineer needs to be skilled at examining those assumptions and stripping them away to correctly follow the computer's logic, and that is a skill that actively opposes many people's instincts.</p>
<p>In short, to succeed well in computer science, a student needs to master a counterintuitive skill, and the bar for mastery is close to being pass/fail.</p>

CC BY-SA 4.0
2020-11-18T22:49:17.413Z
2020-11-18T22:49:17.413Z
Douglas
<p>Computer Science, as taught, is a combination of Mathematics and Computer Programming.  Mathematics is the part that is the theory of computing, and programming is the art of applying it.</p>
<p>I'll dub the Mathematics party &quot;theoretical&quot;, and the programming part &quot;applied&quot;.</p>
<p>Now, both parts are hard.  But are hard for somewhat different reasons.</p>
<h2>Applied Computer Science</h2>
<p>Programming is hard for a few reasons.  Every programming problem is judged first not by your instructor, but by the world's most harsh marker; the compiler/interpreter.  Every program you write ends up being instructions for some idiot-savant computer to follow.</p>
<p>It is like trying to write an essay in English, but if your letters aren't formed right, you have any spelling mistakes, or there is any grammar errors, the teacher isn't able to actually read your essay.  Instead, they are forced to examine each word in isolation, then after verifying them themselves they can look at each sentence in isolation, etc.</p>
<p>This creates a sharp discontinuity in your initial ability to get things done.  The syntax of the languages you are using is, almost unavoidably, harsh on relative beginners.</p>
<p>Once you pass that tier, you end up with yet another situation where there are discontinuous errors that are harsh on relative beginners.</p>
<p>Programming is the art of managing insane amounts of complexity while telling a complete idiot how to solve a problem, exactly.</p>
<p>The ability for computers to do things exactly as described, extremely quickly, means programs are some of the most complex things humanity has ever designed on purpose.  As someone learning programming, you end up building increasingly complex things.  Each stage of this effort has to not only be good, but perfect, as errors in a lower tier of complexity will compound and make the next one impossible to do.</p>
<p>When you write a statement, your variables and operators can't have errors, or the statement won't work.</p>
<p>When you write a function, your statements can't have errors, or the function won't work.</p>
<p>When you write an algorithm, your functions can't have errors, or the algorithm won't work.</p>
<p>When you connect algorithms into a simple program, the algorithms can't have errors, or the program won't work.</p>
<p>You have to reach near-100% reliability on each tier, and learn how to deal with the less-than-100% reliability, before you can get any kind of reliability on the next.</p>
<p>To handle this, programmers have come up with increasingly abstract patterns.  Each of these patterns is [b]hard[/b] to master, as they encapsulate extremely complex problems with seemingly arbitrary rules.</p>
<p>A short list of these patterns that programming students find hard to master might include:</p>
<ul>
<li>Variables</li>
<li>Assignment vs Equality</li>
<li>Control flow and looping</li>
<li>Recursion</li>
<li>Sub procedures/functions</li>
<li>Pointers and indirection</li>
<li>Code generation and macros</li>
<li>Resource management and lifetime</li>
<li>Threading</li>
<li>Encapsulation</li>
<li>Purity</li>
<li>Mutability</li>
<li>Asynchronicity</li>
</ul>
<p>(in no particular order, and not comprehensive).</p>
<p>People learning programming often run into one of these, and just can't get it.  And unless you get it, you can't get past that barrier, and often fail out.  (One of the advantages of Java and other managed languages to teach programming is that you can neglect much of pointers and resource management and teach other stuff at beginner levels; the downside is you graduate people who don't have to learn that stuff.)</p>
<p>These are all levels of abstraction programmers have developed to manage increasingly complex programs.  Strategies that work at lower levels of complexity fail at higher ones, so students who are using &quot;ill advised&quot; strategies can easily pass a course then fall apart in the next one.</p>
<h2>Theoretical Computer Science</h2>
<p>This branch is all about understanding the idea of computation, as opposed to the art.  You do need it in order to do certain kinds of applied computer science problems, so even in &quot;professional&quot; courses it is taught.  And as academics are teaching it, often it is included anyhow, as the theoretical computer science often is needed to expand the entire field of knowledge of computer science.</p>
<p>This is a branch of mathematics, and like most kinds of mathematics requires iterative mastery.  In order to do multiplication effectively, you have to not only be able to do addition, but you have to master it.  That very simple step is mirrored along the entire tower of mathematical knowledge.</p>
<p>In many other fields, you can muddle along with the previous foundation layer having issues, and maybe patch it up later.  But when you try to do that in mathematics things just fall apart.</p>
<p>Mathematics in much of the world is initially taught by people who hate and are bad at mathematics -- elementary school teachers.  So we end up with a lot of people with a poor foundation in ciphering showing up in secondary education, then muddling though classes without every achieving mastery, then deciding to go into a lucrative field (programming).  And without mastery of the previous tiers of mathematics, the theoretical computer science they teach is extremely difficult.</p>
<p>The student, whose goal was &quot;get a highly paid programming job&quot;, finds this abstract computer science both hard and difficult to connect to their goal.  Their problems with the material are foundational; they don't have the background required.  The educators problem is that teaching that background requires fixing their 10 years of primary and secondary mathematics the student came in with.</p>
<p>Cutting theoretical computer science for applied computer science courses is plausible, but then the students aren't able to predict very well how to make programs do new tasks without taking forever to do them (programming efficiency, algorithmic complexity), or deal with logic problems surrounding multi-threaded programming, or a myriad of other important skills in the applied field.</p>
<h2>Real World</h2>
<p>Programming is currently a lucrative, expanding field.  This has a number of impacts.</p>
<ol>
<li><p>Students are drawn to it not out of intrinsic interest or inclination, but because they want to make money at it.</p>
</li>
<li><p>Experts are harder to convince to be teachers, as not-teaching is lucrative, and teaching is difficult.</p>
</li>
<li><p>The number of students grows over time, so the previous generation of students (who supply the teachers) is smaller.  This makes the problem of finding teachers harder.</p>
</li>
<li><p>The field itself is young.  With other fields, we know millions of ways not to teach it; with computer science, we haven't had time to make as many mistakes and refine our education.</p>
</li>
</ol>
<p>On top of that, the profession is a relatively solitary one.  So it draws introverts; convincing introverts to have a career teaching students is an extra problem, reducing the pool of potential teachers further.</p>

CC BY-SA 4.0
2020-11-20T16:05:42.793Z
Actually, computer science is much more than what you suggest. This presents a very narrow view.
Buffy
CC BY-SA 4.0
2020-11-20T15:48:51.067Z
2020-11-20T15:48:51.067Z
Yakk
<p>My head of department posed a question at a staff meeting, &quot;how can we reward those students that work really hard?&quot;. My colleagues suggested cinema tokens, shop vouchers, prizes, ..., you get the picture.</p>
<p>When it was my turn I said &quot;extra homework&quot;. There was a silence, then the head of department asked me if I &quot;was serious&quot;. To which I replied yes, because the students that work hard like the subject and have intrinsic motivation, so they want to learn more, and so, the best reward we can offer is extra homework.</p>
<p>I was really thinking about Bem's theory of self perception. <a href="https://en.wikipedia.org/wiki/Self-perception_theory" rel="nofollow noreferrer">Self perception theory</a>. Our political representatives and managers want to see success in STEM subjects generally, so many false promises, bribes and other forms of encouragement are applied to 'encourage' learners into STEM. I believe that particularly in CS our learners are being driven by the promise of <em>extrinsic</em> rewards.</p>
<p>Whether it is the promise of a large salary, the association of CS with 'fun' technologies or the social kudos associated with the movie images of hackery, none of the drivers are really about the subject. On arrival, instead of slick, fun and cool our learners find it takes 200 lines of C coding to put a dot on a screen, three years of pure maths courses to understand why neural networks don't work really and after reading a pile of books 2m high, countless RFCs and a half the UNIX manual pages they are still unable to understand what's wrong with their sendmail.conf or build a stable kernel, or use <em>vim</em>.</p>
<p>And why would they bother? Afterall, they are here for the salary, the fun, the kudos. They want to drive sports cars whilst playing CODwars and wearing hoodies. They don't want <a href="https://ftp.gnu.org/old-gnu/Manuals/m4-1.4/html_chapter/m4_5.html" rel="nofollow noreferrer">this</a>. And they aren't interested in <a href="http://www.optimization-online.org/DB_FILE/2009/03/2266.pdf" rel="nofollow noreferrer">that</a> either. Our basic problem is that they are the wrong students with the wrong motivations.</p>
<p>Out teaching strategies don't help either. Nobody is going to get taught CS. A few might learn if they're motivated though. If the teacher hasn't read Vygotsky and the class isn't based on some constructivist learning principles you can forget it. It was hard enough to learn CS forty years ago when it was <a href="https://previews.123rf.com/images/rtdesignstudio/rtdesignstudio0912/rtdesignstudio091200311/6133572-showing-small-thing-gesture.jpg" rel="nofollow noreferrer">this big</a>. Now its like <a href="https://www.macmillandictionary.com/thesaurus-category/british/complicated-and-difficult-to-understand" rel="nofollow noreferrer">...</a>.</p>
<p>The problem isn't that computer science is hard, its too easy. At least until you get to University when the truth finally kicks in (I am somewhat reminded of WW1 heroes off to 'give the old hun a kicking, hoorah' who then find themselves waiting to go over the top at Passchendaele). Out students are totally unprepared for the actual reality. CS <em>is</em> maths, plus compiler design, the vim editor, gray codes, the use of tensor algebra to model shapes (Bookstein), the use of analytical topology to prove results about Perceptrons (Minsky and Pappert), the Godel incompleteness theorem, using gdb effectively, engineering philosophy, automated theorem proving, why this <code>b = (b * 0x0202020202ULL &amp; 0x010884422010ULL) % 1023</code> reverses a byte in three machine operations and with solving the integer knapsack using intelligent backtracking we get the tip of the iceberg.</p>
<p>Great! There's loads of fun to be had in CS, infinities of it. But it isn't easy. We should return to teaching our young learners assembly language, get them editing real source code, throw all the maths from the trapezium rule to matrix inversions to axioms for semi-groups with unity <em>at school</em>. Its hard and maddening - work in groups,  overclock the CPUs and watch them melt, rebuild kernels. Lets make it hard but lets have our students wanting to do actual CS. Failing that we will have no choice but to make it illegal, then we'll be seeing talent everywhere.</p>

CC BY-SA 4.0
2021-05-02T02:24:28.627Z
The successful students get to keep working with computers. They actually get *paid* to do it.
Scott Rowe
CC BY-SA 4.0
2020-11-28T21:21:47.447Z
2020-11-28T21:21:47.447Z
Jon Guiton
<p>I have been a professor of computer science and engineering (CSE) in the USA for a number of years in ABET accredited CAC and EAC undergraduate programs (graduate programs do not have ABET accreditation in CSE as I recall).  Reading these comments, I have a few things to mention.</p>
<p>The first is the economic motivation -- accumulation of wealth or even gainful employment.  Most of such accumulation is based upon technology, not basic science or engineering.  Many of the students I have met do not understand the difference between Information Technology (IT) and CSE.</p>
<p>Why is CSE much more difficult than IT?  CSE is a highly abstract intellectual field that nonetheless has very concrete instantiations.  CSE uses, develops, and requires &quot;higher&quot; mathematics.  Does an IT person who is &quot;information security certified&quot; (typically with a vendor-based credential) understand encryption in terms of the actual mathematics (for example, I use both the declassified Shannon monograph as well the details of AES as explained in the original Rijndael exposition), or quantitative threat estimation, Nash game theory and what goes beyond Nash, etc.?</p>
<p>Admittedly, this is beyond what is covered in an ACM CS-1 course, but the issue is &quot;why&quot; do students find CSE &quot;hard&quot; (that is, a discipline in which many cannot demonstrate understanding proficiency).</p>
<p>IT is by comparison &quot;easy&quot; -- CSE requires mathematics, some of it developed by CSE persons, not &quot;mathematicians&quot;, and the use of other fields to understand CSE whereas most IT-trained (and vendor &quot;certified&quot;) persons know specifics of installing and &quot;maintaining&quot; a particular technology from a particular vendor (more or less the equivalent of &quot;how-tos&quot;). As an example: why does a real computer create heat?  Because it produces information and thus reduces entropy, that requires work that in turn produces waste heat (increasing the entropy external to the created information) -- and requires an understanding of at least classical thermodynamics, or preferably an understanding of statistical mechanics and how entropy arises.</p>
<p>Coding is not too difficult, but algorithm design and then establishing that the algorithm is provably correct is not as easy.  As neurosynaptic or quantum processors become more readily deployed, the issues will only increase.  An IT person working on a quantum processor will memorize rules, but will most likely not have an understanding of quantum mechanics (and the underlying mathematics).</p>
<p>Some may interpret these statements as &quot;elitist&quot;; the issues are reality, not elitism.  With intensive tutoring and dedication on the part of both the student and the tutors, many students who currently do not &quot;survive&quot; to a CSE ABET-accredited or equivalent diploma, can graduate.  I have seen it and done it (with help from my TAs and myself) -- but those who dispense resources (funds, personnel, facilities) do not provide those resources, and students who could &quot;swim&quot; instead &quot;sink&quot;.</p>

CC BY-SA 4.0
2020-11-20T17:12:57.300Z
2020-11-20T17:35:01.263Z
2020-11-20T17:35:01.263Z
Yasha Karant
<p>Data pretty regularly shows that computer science programs have among the highest failure and dropout rates of any college program. A number of sources all echo the finding that roughly one-third of incoming CS majors do not progress to a second year, higher than most other majors.</p>
<ul>
<li><a href="https://www.computerweekly.com/news/252467745/Computer-science-undergraduates-most-likely-to-drop-out" rel="noreferrer">Computer science undergraduates most likely to drop out</a> (ComputerWeekly.com, 2019)</li>
<li><a href="https://www.irishtimes.com/news/education/concern-over-drop-out-rates-in-computer-science-courses-1.2491751" rel="noreferrer">Concern over drop-out rates in computer science courses</a> (The Irish Times, 2016)</li>
<li><a href="http://trinitynews.ie/2016/02/why-are-computer-science-drop-out-rates-so-high/" rel="noreferrer">Why are computer science drop-out rates so high?</a> (Trinity News, 2016)</li>
</ul>
<p>I teach computer science majors at a U.S. community college, and the non-passing rates are even higher in this context. A few times in my introductory programming course, I will mention this fact (that computer science is among the hardest majors), partly to set expectations that students will need to work hard to succeed.</p>
<p>This semester I had a student in my virtual office hour ask, &quot;Why is computer science harder than other majors, as you say?&quot;, and I was a bit flat-footed for a good response.</p>
<p>So: What would be the best reply to a beginning CS student who asks, &quot;Why is CS hard?&quot;</p>

CC BY-SA 4.0
2020-11-16T22:02:00.443Z
I would question if it is harder (compered to engineering). I don't know exactly the difference, but in England we have Honers degrees for Engineering (Does this indicate the higher content, or something). Is CS harder than Engineering? Maybe the programming part is. However I suspect that this is because of the way we teach it.
ctrl-alt-delor
CC BY-SA 4.0
2020-11-17T18:36:21.720Z
many factors but maybe a big one is the high mathematical content, and some abstraction, etc. and lets not forget that simply _science itself_ is "hard" and there are a lot of indicators pointing to erosion in societal widespread scientific focus, awareness, literacy etc... there is also an old expression "nothing very worthwhile is easy...!" _building really great things is hard..._ also there is a well recognized phenomenon of _historical waves_ of students entering the field based on mass media/ hype, eg "social network" movie etc!
vzn
CC BY-SA 4.0
2020-11-18T11:42:59.800Z
The first link says that the drop out rate is 10% for CS, 7% for Business or Engineering, so not a huge difference. It also says that 53% dropped out because they weren't getting enough value for their money, 50% because they were not interested, and 33% because it was too hard. So, the first two causes are the important ones, showing that... these students chose a major that didn't actually fit for them. This is not the fault of CS. Why are we still kicking this can?
Scott Rowe
CC BY-SA 4.0
2020-11-18T17:24:20.057Z
@ScottRowe: That specific number is for HESA in the UK. On the other hand, the subtitle to the second link is: "Up to 80% of students in some courses are failing to progress to second year ", and shows overall dropout figures at about one-quarter to one-third (which are about the numbers I usually see for 4-year programs; and likely higher than that in 2-year programs).
Daniel R. Collins
CC BY-SA 4.0
2020-11-18T17:35:47.757Z
I'm speculating that many people go into it because they perceive that this will lead them to great careers, until they realize it's something they're absolutely not into at all. In some countries, like India, computer work has been touted as the way to earn a lot of money and many people rushed into it without being interested in the topic one bit.
Thomas
CC BY-SA 4.0
2020-11-18T18:43:26.240Z
@Thomas The big advice these days is "Fake it 'til you make it" Or, forever, if you just don't care for the work, I guess. What is the talk about internal vs external motivations? Not being a pauper is a strong motivation in some parts of the world.
Scott Rowe
CC BY-SA 4.0
2020-11-18T21:10:44.910Z
@ScottRowe, some subjects really require at least some interest to gain enough proficiency. I think tech is one of them.
Thomas
CC BY-SA 4.0
2020-11-18T22:32:47.533Z
I have a healthy fear of competing with people, because they are often quite clever.  Computer science from the get-go has been solving a set of problems that only need to be illuminated once, and all who follow have a trail marked out for them.  Computer science chops aren't subject to the same laws of supply and demand as other skills. Always be careful to not get into situations where you need to learn how to read something written by a gifted person who just worked for a couple decades on it, pulling their hair out and drinking coffee.
Justin Stafford
CC BY-SA 4.0
2020-11-18T22:33:04.597Z
Because schools no longer teach how to _think logically_ - even as little as they used to do that they don't bother anymore - and sharing good feelz just don't go too far when it is a computer you're trying to get to do what you want it to.  (I am not joking. Just look around at the questions asked by 1-rep-point newcomers on SO and you'll see a complete inability to even ask a relevant question about stuff so basic it doesn't even qualify as programming, just thinking about how do you something one step at a time.  You'll see plenty of confirmation of my point.)
davidbak
CC BY-SA 4.0
2020-11-20T00:35:52.577Z
CS is not hard, it is boring and unfulfilling. I have a CS master and it was the worst thing I could have done. I would much rather be a carpenter, MD - in fact, most other professions where you either work with people or use your body, would've been better. You will realise that I am right on your deathbed because you are never gonna regret that you socialized too much during your life but you will regret spending too much time alone in front of a screen. And some people realise this after just a short while at a CS program. There is your explanation.
d-b
CC BY-SA 4.0
2020-11-20T00:59:36.023Z
Also keep in mind there is more demand than supply for CS programs, so some people who might've otherwise continued might end up being forced to drop out (e.g. via grade cutoffs) just due to the lack of room. (I don't have numbers on this unfortunately.)
user541686
CC BY-SA 4.0
2020-11-20T01:00:12.643Z
In my experience as a current computer science student and tutor (and what I've heard from other faculty and students), hoping to soon transfer from a 2 year college to a 4 year one, It's not the computer science that's hard, but all the other requirements given for a computer science degree. I've had to spend at least an order of magnitude more time on advanced math classes (Calculus, DE, LA, physics etc), than I have on any computer science class. From what I've heard, CS is too popular and too easy, so they're requiring less relevant math and physics courses to weed out the less motivated
Patronics
CC BY-SA 4.0
2020-11-20T03:59:54.830Z
Another consideration in the statement that dropout rate is linked to difficulty is that I know a lot of CS dropouts that work in the CS field, and are very good at it. So a more appropriate question might be "why are these students dropping out?". I've also met a lot of people who have absolutely no business being near a career in CS, yet graduated with a CS major.
phemmer
CC BY-SA 4.0
2020-11-20T05:03:04.270Z
Probably related to how accessible Computer Science is.  Some fields, especially those with expensive lab equipment (medicine, chemistry, engineering, physics, etc.) would be difficult for a student to home-study in full.  By contrast, colleges offer relatively little to Computer Science students that they can't get elsewhere, and the tech industry tends to be far less strict about requiring college degrees (as opposed to most STEM fields where various regulations and norms prohibit anyone without a college+ degree).
Nat
CC BY-SA 4.0
2020-11-20T05:19:45.190Z
Probably some misalignment between curriculums and student goals, too.  For example, students often want to go into programming, data-science, or other tech job, whereas Computer Science majors often focus on other stuff.
Nat
CC BY-SA 4.0
2020-11-20T09:57:49.837Z
@d-b Both, Computer Scientists and (good) Programmers spend plenty of time socializing. There's even a derogatory term for those programmers who don't "think" and "talk" but just "produce": Code Monkeys. I'm sorry for you that you had such a bad experience in your CS Master, at my uni we are quite a social bunch.
ljrk
CC BY-SA 4.0
2020-11-20T10:33:00.117Z
This is an interesting question. I don't mean in any way to disagree or disrespect those with CS degrees (sometimes I wonder if I'd have been better doing one given my current line of work!). However, as a UK maths grad it was a bit of banter we had with the CS department that it was for those who couldn't get onto the maths program!
Gamora
CC BY-SA 4.0
2020-11-20T11:41:09.303Z
@ljrk You and I have different opinions about what constitutes "plenty". Code monkeys produce simple code, that is the main meaning of that word.
d-b
CC BY-SA 4.0
2020-11-20T17:40:28.427Z
@ScottRowe Isn't that saying that 30% less people fail business than comp sci?
TankorSmash
CC BY-SA 4.0
2020-11-20T21:57:06.107Z
@d-b Or we just had different experiences. Our department is *famous* on my uni for being quite one of the most sociable people and hosting the best parties.  We also have many who don't like programming and spent more time in front of the black board than the PC.
ljrk
CC BY-SA 4.0
2020-11-21T02:22:49.633Z
@PatrickL - "all the other requirements given for a computer science degree" "Calculus, DE, LA, physics etc". To make the most money, you need to know how to do all that math, and if you can, then why not make even more money as an engineer or w/e. Google says (after an entire page of 'you don't need it'): "**In Computer Science, Calculus is used** for machine learning, data mining, scientific computing, image processing, and creating the graphics and physics engines for video games, including the 3D visuals for simulations." - all those 'new' things that you want to do but require calculus.
Mazura
CC BY-SA 4.0
2020-11-21T04:14:26.700Z
@ljrk If you have to tell people you, you aren't. You are missing the point. A nurse's work is to interact with a human, a CS work is to interact with a screen. At your deathbed you are never gonna regret that you interacted too much with humans, you are gonna regret that you spent too much time in front of a screen.
d-b
CC BY-SA 4.0
2020-11-21T08:29:30.460Z
@d-b Wow, condescending much. For the record, I only told you because you baselessly claimed otherwise. Anyway, regarding "interacting with the screen": That's where you are wrong. I told ypu so in the initial comment. CS work is *not* to interact with a screen. Again, I feel sorry for you if that was your experience, but judging from your tone, I'm happy I don't have to interact more with you, goodbye.
ljrk
CC BY-SA 4.0
2020-11-21T10:49:02.100Z
@ljrk Yes it is indeed. If anything "code monkeys" (who said anything about being "condescending"?) interact with other people (they have to discuss interpretations of requirements with colleagues, the people working in production and so on). If you really work with computer _science_ and, e.g., develop algorithms, you will spend a lot of time alone in front of a screen thinking (preferably in a separate room so you aren't disturbed).
d-b
CC BY-SA 4.0
2020-11-23T17:24:07.457Z
@davidbak Have you ever tried to "explain computers" to people born back when schools did (supposedly) teach logical thinking? It doesn't seem to have made them any better at dealing with the unrelenting literalness and attention to detail of computers.
user3067860
CC BY-SA 4.0
2020-11-23T17:36:56.933Z
@user3067860 - Back when I started programming college was not required and the vast majority of people did _not_ go to college and did just fine in life (single income families too were the norm).  Grade schools _did_ teach logical thinking, especially in "advanced placement" courses - which were primarily offered only to the college bound.  So yes, once you were in college you were, generally, able to think reasonably logically, especially if you survived the first year.  We no longer have that selection bias in colleges, and grade school no longer teaches thinking to _anyone_.
davidbak
CC BY-SA 4.0
2020-11-25T19:18:13.653Z
@davidbak It doesn't seems like that's anything about schools teaching better, though. Weeding out isn't the same as teaching. We still have CS students who find things easy, I was one, and I had enough classmates who also found things easy. The question is how they teach the students who don't find it easy.
user3067860
<struggling-students><student-perceptions>
Why is computer science hard?
# Why is computer science hard?

(Asked by: username_0 on 2020-11-16)

Data pretty regularly shows that computer science programs have among the highest failure and dropout rates of any college program. A number of sources all echo the finding that roughly one-third of incoming CS majors do not progress to a second year, higher than most other majors.

* [Computer science undergraduates most likely to drop out](https://www.computerweekly.com/news/252467745/Computer-science-undergraduates-most-likely-to-drop-out) (ComputerWeekly.com, 2019)
* [Concern over drop-out rates in computer science courses](https://www.irishtimes.com/news/education/concern-over-drop-out-rates-in-computer-science-courses-1.2491751) (The Irish Times, 2016)
* [Why are computer science drop-out rates so high?](http://trinitynews.ie/2016/02/why-are-computer-science-drop-out-rates-so-high/) (Trinity News, 2016)

I teach computer science majors at a U.S. community college, and the non-passing rates are even higher in this context. A few times in my introductory programming course, I will mention this fact (that computer science is among the hardest majors), partly to set expectations that students will need to work hard to succeed.

This semester I had a student in my virtual office hour ask, "Why is computer science harder than other majors, as you say?", and I was a bit flat-footed for a good response.

So: What would be the best reply to a beginning CS student who asks, "Why is CS hard?"

**Tags:** struggling-students, student-perceptions

> **Comments:**
> **username_1**: I would question if it is harder (compered to engineering). I don't know exactly the difference, but in England we have Honers degrees for Engineering (Does this indicate the higher content, or something). Is CS harder than Engineering? Maybe the programming part is. However I suspect that this is because of the way we teach it.  
> **username_2**: many factors but maybe a big one is the high mathematical content, and some abstraction, etc. and lets not forget that simply _science itself_ is "hard" and there are a lot of indicators pointing to erosion in societal widespread scientific focus, awareness, literacy etc... there is also an old expression "nothing very worthwhile is easy...!" _building really great things is hard..._ also there is a well recognized phenomenon of _historical waves_ of students entering the field based on mass media/ hype, eg "social network" movie etc!  
> **username_3**: The first link says that the drop out rate is 10% for CS, 7% for Business or Engineering, so not a huge difference. It also says that 53% dropped out because they weren't getting enough value for their money, 50% because they were not interested, and 33% because it was too hard. So, the first two causes are the important ones, showing that... these students chose a major that didn't actually fit for them. This is not the fault of CS. Why are we still kicking this can?  
> **username_0**: @ScottRowe: That specific number is for HESA in the UK. On the other hand, the subtitle to the second link is: "Up to 80% of students in some courses are failing to progress to second year ", and shows overall dropout figures at about one-quarter to one-third (which are about the numbers I usually see for 4-year programs; and likely higher than that in 2-year programs).  
> **username_4**: I'm speculating that many people go into it because they perceive that this will lead them to great careers, until they realize it's something they're absolutely not into at all. In some countries, like India, computer work has been touted as the way to earn a lot of money and many people rushed into it without being interested in the topic one bit.  
> **username_3**: @username_4 The big advice these days is "Fake it 'til you make it" Or, forever, if you just don't care for the work, I guess. What is the talk about internal vs external motivations? Not being a pauper is a strong motivation in some parts of the world.  
> **username_4**: @ScottRowe, some subjects really require at least some interest to gain enough proficiency. I think tech is one of them.  
> **username_5**: I have a healthy fear of competing with people, because they are often quite clever.  Computer science from the get-go has been solving a set of problems that only need to be illuminated once, and all who follow have a trail marked out for them.  Computer science chops aren't subject to the same laws of supply and demand as other skills. Always be careful to not get into situations where you need to learn how to read something written by a gifted person who just worked for a couple decades on it, pulling their hair out and drinking coffee.  
> **username_6**: Because schools no longer teach how to _think logically_ - even as little as they used to do that they don't bother anymore - and sharing good feelz just don't go too far when it is a computer you're trying to get to do what you want it to.  (I am not joking. Just look around at the questions asked by 1-rep-point newcomers on SO and you'll see a complete inability to even ask a relevant question about stuff so basic it doesn't even qualify as programming, just thinking about how do you something one step at a time.  You'll see plenty of confirmation of my point.)  
> **username_7**: CS is not hard, it is boring and unfulfilling. I have a CS master and it was the worst thing I could have done. I would much rather be a carpenter, MD - in fact, most other professions where you either work with people or use your body, would've been better. You will realise that I am right on your deathbed because you are never gonna regret that you socialized too much during your life but you will regret spending too much time alone in front of a screen. And some people realise this after just a short while at a CS program. There is your explanation.  
> **username_8**: Also keep in mind there is more demand than supply for CS programs, so some people who might've otherwise continued might end up being forced to drop out (e.g. via grade cutoffs) just due to the lack of room. (I don't have numbers on this unfortunately.)  
> **username_9**: In my experience as a current computer science student and tutor (and what I've heard from other faculty and students), hoping to soon transfer from a 2 year college to a 4 year one, It's not the computer science that's hard, but all the other requirements given for a computer science degree. I've had to spend at least an order of magnitude more time on advanced math classes (Calculus, DE, LA, physics etc), than I have on any computer science class. From what I've heard, CS is too popular and too easy, so they're requiring less relevant math and physics courses to weed out the less motivated  
> **username_10**: Another consideration in the statement that dropout rate is linked to difficulty is that I know a lot of CS dropouts that work in the CS field, and are very good at it. So a more appropriate question might be "why are these students dropping out?". I've also met a lot of people who have absolutely no business being near a career in CS, yet graduated with a CS major.  
> **username_11**: Probably related to how accessible Computer Science is.  Some fields, especially those with expensive lab equipment (medicine, chemistry, engineering, physics, etc.) would be difficult for a student to home-study in full.  By contrast, colleges offer relatively little to Computer Science students that they can't get elsewhere, and the tech industry tends to be far less strict about requiring college degrees (as opposed to most STEM fields where various regulations and norms prohibit anyone without a college+ degree).  
> **username_11**: Probably some misalignment between curriculums and student goals, too.  For example, students often want to go into programming, data-science, or other tech job, whereas Computer Science majors often focus on other stuff.  
> **username_12**: @username_7 Both, Computer Scientists and (good) Programmers spend plenty of time socializing. There's even a derogatory term for those programmers who don't "think" and "talk" but just "produce": Code Monkeys. I'm sorry for you that you had such a bad experience in your CS Master, at my uni we are quite a social bunch.  
> **username_13**: This is an interesting question. I don't mean in any way to disagree or disrespect those with CS degrees (sometimes I wonder if I'd have been better doing one given my current line of work!). However, as a UK maths grad it was a bit of banter we had with the CS department that it was for those who couldn't get onto the maths program!  
> **username_7**: @username_12 You and I have different opinions about what constitutes "plenty". Code monkeys produce simple code, that is the main meaning of that word.  
> **username_14**: @ScottRowe Isn't that saying that 30% less people fail business than comp sci?  
> **username_12**: @username_7 Or we just had different experiences. Our department is *famous* on my uni for being quite one of the most sociable people and hosting the best parties.  We also have many who don't like programming and spent more time in front of the black board than the PC.  
> **username_15**: @PatrickL - "all the other requirements given for a computer science degree" "Calculus, DE, LA, physics etc". To make the most money, you need to know how to do all that math, and if you can, then why not make even more money as an engineer or w/e. Google says (after an entire page of 'you don't need it'): "**In Computer Science, Calculus is used** for machine learning, data mining, scientific computing, image processing, and creating the graphics and physics engines for video games, including the 3D visuals for simulations." - all those 'new' things that you want to do but require calculus.  
> **username_7**: @username_12 If you have to tell people you, you aren't. You are missing the point. A nurse's work is to interact with a human, a CS work is to interact with a screen. At your deathbed you are never gonna regret that you interacted too much with humans, you are gonna regret that you spent too much time in front of a screen.  
> **username_12**: @username_7 Wow, condescending much. For the record, I only told you because you baselessly claimed otherwise. Anyway, regarding "interacting with the screen": That's where you are wrong. I told ypu so in the initial comment. CS work is *not* to interact with a screen. Again, I feel sorry for you if that was your experience, but judging from your tone, I'm happy I don't have to interact more with you, goodbye.  
> **username_7**: @username_12 Yes it is indeed. If anything "code monkeys" (who said anything about being "condescending"?) interact with other people (they have to discuss interpretations of requirements with colleagues, the people working in production and so on). If you really work with computer _science_ and, e.g., develop algorithms, you will spend a lot of time alone in front of a screen thinking (preferably in a separate room so you aren't disturbed).  
> **username_16**: @username_6 Have you ever tried to "explain computers" to people born back when schools did (supposedly) teach logical thinking? It doesn't seem to have made them any better at dealing with the unrelenting literalness and attention to detail of computers.  
> **username_6**: @username_16 - Back when I started programming college was not required and the vast majority of people did _not_ go to college and did just fine in life (single income families too were the norm).  Grade schools _did_ teach logical thinking, especially in "advanced placement" courses - which were primarily offered only to the college bound.  So yes, once you were in college you were, generally, able to think reasonably logically, especially if you survived the first year.  We no longer have that selection bias in colleges, and grade school no longer teaches thinking to _anyone_.  
> **username_16**: @username_6 It doesn't seems like that's anything about schools teaching better, though. Weeding out isn't the same as teaching. We still have CS students who find things easy, I was one, and I had enough classmates who also found things easy. The question is how they teach the students who don't find it easy.  

---

## 17 answers

### Answer by username_21 on 2020-11-16. Score: 57

The difficulty of CS (true or imagined) and the drop out rates are not the same thing. Let me start an answer, but it might take several iterations to get all my thoughts together on the two ideas.

Two themes come immediately to mind.

The first is periodic and I don't know where we are in the period at the moment. But in certain combinations of economic factors and media hype, a lot of students go in to CS not really understanding what they are getting in to but are lured by the, perhaps elusive, draw of big salaries. There is a lot of hype out there about AI at the moment, and self driving cars, and going to Mars, etc. People get in for the wrong reasons and decide they really didn't understand what it was and that they don't really like it. It doesn't need to be hard to drive people away, just boring.

The second major theme is that there is a lot of bad teaching around CS as has always been the case. Some people teach it as misspelled mathematics, which it is not. Some people in elementary and secondary schools are forced to teaching CS and especially Advanced Placement CS when they have little understanding of the topic and just try to stay "one week ahead" of the students. This is, and has always been a recipe for disaster. I don't blame the teachers who have to do this as many are forced in to it (in the US) simply because schools are underfunded and understaffed with too few specialist teachers.

WRT the second theme, it might even be that the current push to teach "CS" in elementary schools is actually part of the problem, not the solution. A serious college level course in CS might be shocking to someone who has only dabbled in trivial elements of programming. In particular CS is NOT programming, though skill in programming is needed.

Too many beginning students and teachers think that programming is "if" and "while" and "assignment" and nothing else. The current AP curriculum, I think, is seriously flawed (dropping interfaces, in particular). Students program in "rich" languages and environments using only the lowest level concepts, never really understanding abstraction or (gasp) polymorphism. Compare that with big ideas that you find in a philosophy or (hopefully) history course.

And if you combine that with asking them to write programs that they find boring, they aren't likely to stick around for long.

> **Comments:**
> **username_24**: I can relate about teachers in early schools (I don't know the American education enough to know which levels) not knowing programming enough. My first programming lessons were with a math teacher who was good in algorithm but came to me regularly when a student has an issue because I started programming by myself before going to this class. I have also seen some people who thought "CS / programming is easy I go on Facebook everyday", these people did not last a long time in the programming school I went on...  
> **username_3**: Right, students are not dropping out mostly because it is hard, it is hard because they are not engaged, which is because they personally do not find it interesting / motivating / fascinating / worthwhile etc. People will work very hard with very little help or teaching to learn something that they want to learn. If they want it, they will persist until they either gain some ability, or find that for whatever reason, it does not come to them. Either way, they will probably be ok with it. Not so much if someone pushes them, in or out.  
> **username_25**: "Students program in "rich" languages and environments using only the lowest level concepts, never really understanding abstraction or (gasp) polymorphism. Compare that with big ideas that you find in a philosophy or (hopefully) history course." - Read SICP.  
> **username_21**: @CeesTimmerman, absolutely, but few people read it and fewer use it.  
> **username_26**: The introductory AP computer science class (at least at my school) is _awful_. It spends more time talking about niche aspects of programming (image manipulation, databases, and so on) than it does about functions, loops, syntax, string and list manipulation. Even worse, AWS basically sponsors it so half the course is just learning to use one particular company's AI stuff. No wonder people do so badly later on...  
> **username_27**: @RedwolfPrograms DBAdmin isn't so niche as you think. It's not CS, certainly, but there's a pretty big market for those skills in industry. I'm not trying to defend your AP "CS" class, which sounds pretty awful, but being able to use and manage a database is a pretty valuable skill if you want to go into IT or certain fields of software engineering or web development.  
> **username_26**: @AndrewRay I agree it's a useful skill, but not for a beginner when that time could be spent on more common skills.  
> **username_28**: Also, there are a lot of advertisements and programs that, for whatever reason, make it seem like it's easy and something anybody can do.  "Learn to code in 30 days", etc. I don't think it's hard as much as just harder than it's made out to be  
> **username_3**: @CeesTimmerman I was in a college course that used SICP almost 40 years ago. Lisp seemed interesting up to around page 300 where they basically said, "But this won't actually work, so we need to use this big hammer to make it work." Just teach me the big hammer right away and skip the interesting digression. I lost all interest in Lisp after that. C worked from page 1.  
> **username_29**: @ScottRowe And many, many problems faced by the industry stem from the very questionable things C lets you do in order to work from page 1. We would be a lot better off if more software were written in languages that forced you to do things the *right* way rather than letting you get sloppy in exchange for apparent success.  
> **username_30**: I agree with your observations that CS is grossly misunderstood and teaching CS is grossly underestimated. But I'd like to remark none of this is new: [E.W. Dijkstra already made these observations back in the 80's](https://www.cs.utexas.edu/%7EEWD/ewd10xx/EWD1036.PDF). (I think a summary of Dijkstra's essay is worth an answer on its own, as he has more interesting hypotheses on why CS is hard as well, but I unfortunately cannot afford to spend the time on it, so this comment will have to do. )  
> **username_30**: Incidentally, while I'm not sure what you mean by "misspelled mathematics", [the classes Dijkstra taught back in the day under the name of CS](https://cs.stackexchange.com/questions/54143/on-on-the-cruelty-of-really-teaching-computing-science) could certainly be called "mathematics" nowadays, and they perhaps should have been even back then. (In fact, the people currently responsible for teaching "programming" at the same university likely would feel the need to add "pedantic" to the description of Dijkstra's course)  
> **username_0**: @Discretelizard: Wow, it's hand-written!  
> **username_31**: You also give school CS quite a benefit of the doubt it seems to me - or it is region specific^^ All school CS below the last year(s) in what internationally would be high school was tinkering with Word, Powerpoint and perhaps Excel in my experience (personal and what I hear from younger ones^^). Few exceptions of CS oriented schools aside perhaps.  
> **username_32**: Another reason might be low penalty for dropping out. If you drop out from a biology, chemistry or medical college program, who needs a half-educated person? But a CS dropout can still get a relevant programming job.  
> **username_33**: +1 for the media hype, students considering higher education are being constantly told that an ability to code in python/js/perl/<insert whatever language they are trying to sell courses for here>, is essential in standing out/getting a job/getting a better salary etc. I know of people who went into a cs course without knowing how to use their os to do little more than check emails, write a document in word and print the document, and they only did that when there was no alternative  

---

### Answer by username_37 on 2020-11-18. Score: 40

First, I somewhat dispute the premise of the question. I don't necessarily believe that it *is* harder. I think there may be some other elements at play.

Unlike many other college fields, students often have little to no formal background in the topic prior to entry -- in fact, many have little to no relevant background at all. That means that they're coming in blind. By contrast, many college majors come populated with students who have years of background in a topic, and are fairly certain that they like aspects of the field. (Consider majors like mathematics, music, or English, in which students will typically enter in with many, many years of built-up skills.)

*(As an aside, there is a small added difficulty. Using modern apps on phones and websites not only teaches students little about computer science, but in my experience, it has almost been a negative. It gives students the feeling that they are mastering aspects of computing, but hides away so many details that I believe it can actually *add* to the frustrations of students once they are faced with actual programming, working with command lines, importing libraries, etc.)*

Additionally, CS has also, and fairly suddenly, become a wildly popular major. They come, I think, largely because they believe that this is where the jobs are. Few of them come because they have deep enthusiasm about the field. In reality, most of the students entering have little to no practical experience.

This will make for some frustrating mismatches. To use an example from above, if a large population of students who had literally never read an eighth note (quaver) suddenly enter into college music majors, do you expect that the results would be very different from what you are seeing among your computer science population? Certainly, a fair number of them will be able to pick up and get things sorted out, but there will absolutely be a sizeable population who will find that wall too hard to climb.

> **Comments:**
> **username_3**: This is somewhat the answer I was going to write - why do people begin a course of study at 18 with no experience? That seems bananas to me, and is the real issue that needs to be addressed. For most complex subjects, apprenticeship is what has worked, historically, and what will work for human beings. The formula is: get people to do simple but useful things when they are young, and gradually raise the level of difficulty so that they gain expertise in a reasonable way. They each top out somewhere and you have the normal range of mastery. The only problem is: you can't package and sell that.  
> **username_38**: @ScottRowe Apprenticeships work well when there are enough unskilled tasks that someone can do whilst learning the skill. The problem with software engineering is that there is so much to learn to be sufficiently competent for the reletively unskilled tasks that apprenticeship style teaching only really becomes relevant once you reach the level that CS undergraduate course teach to.  
> **username_38**: As to why people don't have enough prior experiance, a big part is that software engineering salaries are high enough compared to educators salaries that you really need some other compensation to provide a comparable package to industry, and only academia can offer that where teachers are primarily researchers. And even that is hit and miss.  
> **username_39**: "They come, I think, largely because they believe that this is where the jobs are." Which is not wrong. CS is one of the fields where it is common to hire dropouts and not too hard to land a job even if you didn't finish the degree. So why would students that are mostly interested in the money side of the equation keep studying when they are already offered well paid jobs long before they reach the end of the program?  
> **username_37**: @username_39 I think that this question mostly refers to the students who are dropping out from cs1, because they either didn't like it or couldn't keep up.  But that's certainly a good observation about upperclassmen, and also about graduate students who don't finish because they are specialized enough in something like AI to earn mid-6-figure salaries even without their PhD.  
> **username_16**: Do, e.g., business students really come in with a lot of past experience? Engineering students? It seems like they might have some idea of what it is, but maybe more of a Hollywood idea than knowing what actually goes into a degree in the subject.  

---

### Answer by username_0 on 2020-11-17. Score: 23

Here's an attempt at an answer, with some reflections, and then hopefully at the end a concise reply that we could deliver to an introductory student. For the purposes of this answer, I'll assume that in the first year or so, teaching computer science is synonymous with teaching software engineering.

**Motivating Quote**

Edsger Dijkstra wrote in his paper, [*On the cruelty of really teaching computer science*](https://www.cs.utexas.edu/users/EWD/transcriptions/EWD10xx/EWD1036.html) (1988):

> From a bit to a few hundred megabytes, from a microsecond to a half an
> hour of computing confronts us with the completely baffling ratio of
> $10^9$! The programmer is in the unique position that his is the only
> discipline and profession in which such a gigantic ratio, which
> totally baffles our imagination, has to be bridged by a single
> technology. He has to be able to think in terms of conceptual
> hierarchies that are much deeper than a single mind ever needed to
> face before.

**An Open Question**

Prelude A: This is an area of ongoing research, and there's no consensus theory at this time. While the difficulty (as evidenced by high fail rates) has been known for decades, no predictive educational theory as to why this is the case has garnered significant evidence. ([Intriguing example from 2015](https://cte-blog.uwaterloo.ca/?p=5153) that ultimately did not support its hypothesis.)

**STEM, but Moreso**

Prelude B: Of course, CS is in the STEM meta-discipline, and those programs are commonly more demanding than non-STEM courses. Like any STEM field, CS is technical, detail-oriented, and has objectively right and wrong answers (at least in terms of what counts as a syntactically valid program, a program that produces logically correct results, and so forth).

That said, the data seems to show that CS has even higher non-success rates than other STEM courses, so from this point on we'll inspect what makes CS even more challenging.

**A Deep Stack**

As Dijkstra alluded to, CS has a uniquely "deep stack" of technologies and systems in which the practitioner must work, master, and smoothly adjust conceptual level of abstracted thought within the course of a work day. Some have called the computer the most complex creation of mankind; e.g., in the title of David Eck's introductory CS textbook, [*The Most Complex Machine*](http://math.hws.edu/TMCM.html).

Likewise, consider Joel Spolsky's [Law of Leaky Abstractions](https://en.wikipedia.org/wiki/Leaky_abstraction): "All non-trivial abstractions, to some degree, are leaky." As much as we would *like* to encapsulate computing technologies into neatly abstracted layers, this turns out to not be completely feasible. At any point in the workday we might need to shift mental state to some other layer in order to analyze, debug, or properly design a new part. E.g.: It's just a few conversational steps from thinking about worldwide internet protocols, to the need for check codes and error-handling, to the existence of cosmic rays in the physical universe that might corrupt transmitted data.

In this regard, I sometimes point students to this image (I believe first originating from a website that no longer exists, but e.g., [referenced here](https://electronics.stackexchange.com/questions/353915/what-is-the-role-of-isa-instruction-set-architecture-in-the-comp-arch-abstract)).

[![Computing Layers of Abstraction; in 10 layers from physics to applications](https://i.sstatic.net/KICI7.png)](https://i.sstatic.net/KICI7.png)

**Syntactical Strictness**

In CS, the work is mediated by the computer system itself, which is fairly demanding in its syntactical strictness. Compare to work written in math, physics, chemistry, etc.: it will likely be read by a human instructor, who may be able to forgive or fill in some smaller errors in spelling, grammar, punctuation, etc. But with computer syntax no such flexibility is possible: if a single symbol is misplaced, then no defined program exists. Particularly for students with ID's such as dyslexia, this may be a significant extra challenge.

**Need for Language Skills**

The computing student also needs fairly high-end reading, writing, and communication skills. Problems are almost never delivered in purely symbolic form, as may sometimes be done in math, physics, chemistry, etc. Everything is a "word problem", and students must be proficient at reading, interpreting, asking for clarification (in a natural language, e.g., English), then designing, implementing, and testing, and finally documenting and explaining the design and code (again in English). Interfaces to the user must likewise be clearly expressed. For students with weak English skills, possibly still learning the language for many foreign students, this is another significant challenge (probably more than other STEM fields).

**Wide Domain Knowledge**

Related to the English communication skills noted above, the student likewise needs a lot of "domain specific knowledge". Introductory problems are likely to come from many different fields -- e.g., in my own course, book exercises involve geometry, statistics, savings interest, sound waves, biological population growth, workplace employment rules, taxation, meteorology, sports, corporate finance, etc. If a student has been deprived of a wide range of learning opportunities about the world, then they will be further disadvantaged.

**Technologies for Teams**

The other thing that I personally find challenging in teaching introductory programming is that so many of the core features of modern languages are designed to support large teams working cooperatively on long-term projects (see Brooks, et. al.). But for many reasons (such as the need to master all the basics), students are working on assignments and tests in isolation. Features such as modular functions, scope rules, local variables, classes and objects, encapsulation and data-hiding, etc., really only make sense in terms of a large team of programmers, engaged in a division of labor, communicating in a structured way so as to not corrupt the overall system. This is a story that I'm constantly trying to tell to my students and want them to visualize, but I fear that the lack of concrete experiences with this "large team, complex software" reality makes it hard to fully appreciate.

**Conclusion**

So here's my stab at a brief answer to the inquiring student: *Computer science is something of an everything-discipline.* One needs to develop good skills in the entire STEM spectrum (science, technology, engineering, and math), as well as top-end reading, writing, and human communication skills, and be able to work well both alone and in a team. The computing professional must be detail-oriented (to the level of individual symbols), simultaneously be able to keep the big-picture in mind, and adjust the level of conceptual abstraction at any time. One also needs to be able to digest a fairly large amount of new technical detail at a rapid pace, learn about other arbitrary domains in the world to interface with them, and be committed to continually learning new fields and technologies throughout one's career.

> **Comments:**
> **username_3**: So: don't try to write a symphony if you can't write for any single instrument. Don't try to be a Conductor if you can't play any instruments. CS requires, as you say, ability in many areas at once. Why would we think that it is something that can be easily and directly taught? Or that many people could develop a flotilla of abilities at the same time? Because the initial success was with a few very motivated and 'gifted' people. That does not generalize. Let people choose, by doing some of it when they are young. And if they don't like it, they can do something else.  
> **username_35**: Saying much the same thing, I think: computer programming is hard because "math is hard". Even though there's precious little math in most programming, there's a **LOT** of the same analytical skill required for geometry proofs -- and not only do geometry proofs require skills that most people hate (because apparently most people's brains aren't wired that way), but also because apparently children aren't being taught proofs like I was 40 years ago.  
> **username_40**: Upvoted for pointing out that many of the techniques we learn only make sense when working on big systems and/or teams.  Managing 1,000,000 lines of code is very different from managing 100 — and much harder to demonstrate…  
> **username_41**: @username_35 Computer programming per se is not CS. I can program most everyday business applications using existing tools and libraries, but I would be hard pressed if I had to attend university CS, which deals with the math underlying many of the libraries.  
> **username_35**: @username_41 maybe I just went to the "wrong" University for a Comp Sci degree.  It was all about algorithms, evaluating them and using them.  (Then again, it was a mid-tier State school in the mid 1980s.  I've done quite well by it, though.)  
> **username_42**: I wasn't aware of Dijkstra comment, but I completely support it.  The range and scope of what I need to be aware of is incredible in the time domain alone.  When tweaking circuits on a wafer, I need to think in femtoseconds.  When working with signals on a PCB, I'm usually in nanoseconds.  For communication within a room, microseconds.  Network hardware signaling works in milliseconds.  Human reaction times in deciseconds.  Long-range networks in seconds.  And from there the time grows longer.  Subsystem processing times.  Backup retrieval times.  Earth-Mars-Earth comm times. 1::10^18 already.  

---

### Answer by username_43 on 2020-11-18. Score: 17

From my experiences (I studied about 15-20 years ago, and my cohort lost 50% of students within the first four semesters), the main reasons are these:

* Many students do not really know what CS is about. They might think that it's about learning how to work with computers, or become "power users", or programmers, or something along these lines. I don't think the general public generally knows what CS is. I daresay this is not much different from an electrical engineering student expecting to weild a solder iron a lot; or a mechanical engineering student expecting to work with a metal lathe. At least in my western country, there really was no good way for a young pupil to really find out about this.
* Some topics actually *are* really hard; for example if you leave the mainstream programming languages and dig into functional, logic or constraint programming, or theoretical CS topics.
* Some topics are maybe not very hard, but unless somone is really interested in them already, the university might not necessarily present the topic in a way that creates interest. In my time, there were the classic lectures like how to build a compiler for a programming language; or more theoretical topics like automatons, temporal correctness and such. I think I can count the number of students in "my" class who were really interested in the topic on one hand, amongst dozens or in some courses hundreds.
* I don't know how this is these days, but in my country, in the 1990's, CS was strongly coupled to maths - we had plenty of obligatory maths lectures which we shared with beginning maths or physics students; hardcore linear algebra, functional analysis, statistics etc. - totally irrelevant for 99% of all CS students, but there was no way to avoid it. This most certainly got rid of quite a few students for better or worse.

By the way, this does not end in the university; the same phenomenon happens in IT companies - you get a few high-flyers who really live and breathe IT and CS (as far as CS applies to IT in modern software projects at all...), and plenty of people who just do their job on most days, or eventually find out that it's just not for them.

> **Comments:**
> **username_3**: Your last paragraph, is true in general. To get to the 10,000 hour mastery mark, you need to put in those first 9999 hours.  
> **username_44**: This answer matches my experience pretty exactly. I studied CS from the mid-1980s to the early 1990s in a European country. 50% of the students in my cohort dropped out during the first two years as well. The last bullet point in particular rings true for me: I almost failed due to the stringent math requirements, despite doing well in math back in high school.  
> **username_45**: I've always wondered why corporate IT recruiters believe CS is relevant to most of the positions they are trying to fill. The only answer I have been able to think of is: *it has 'computer' in the name*  
> **username_9**: Your last bullet point is THE reason in my experience, and is still very true in the US today! As a current CS student, I'd love nothing more than to have a computer science class that actually challenged me, but 95% of my time has been spent on the associated math and physics requirements, which is why I'm currently in my 4th year of a "2-year" college, hoping to transfer to a "4-year" college next fall.  

---

### Answer by username_34 on 2020-11-18. Score: 12

Maybe some of those who "fail" should have been somewhere else rather than funneled into computer science.

There needs to be a differentiation between those who want to study computer science (advance the state of the art) and those who just want to write programs (make use of existing techniques and tools.)

I'm in the "just write programs" camp. I don't belong in computer science.

---

I'm going to present the view from someone who left computer science early - one of those from the "failure and dropout" group.

Me.

I am a programmer. I make a good living writing programs.

Way back when I was young, I learned to program on home computers. Early 1980s.

Telling a machine what to do isn't difficult. It has a limited vocabulary that you can "speak" to it in, and it has a limited ability to give you responses. You break the task down to pieces and phrase it in the vocabulary the computer has and tell it how to assemble its response. No big deal, though you do have to understand the task yourself first.

When I started taking university courses, the options were MIS (management information systems - managing computer systems) and computer science. I didn't want to baby sit the machines, I wanted to program them and ended up in computer science.

Computer science at the time was more about the theory, the mathematics of how computer logic and algorithms work. That is, studying things that would let you make better computers or discover new algorithms.

That wasn't what I wanted at all. I wanted to learn how to be a better programmer.

1. Better approaches to breaking down problems.
2. Better ways to organize my work.
3. Learn more about other languages.
4. Learn how to make an easy to use program (user interfaces.)

None of that was taught in the courses available to me.

We were exposed to other programming languages - there were several courses that were dedicated to specific languages.

All I wanted was to be a better programmer, and all I could get was things that I'd need to (someday) be able to do computer science research.

I'm not in the least interested in designing a hashing algorithm. I'm interested in writing a program that makes some task easier - and that might involve using hashes or dictionaries or linked lists or what have you.

What I wanted wasn't available at that time and place, so I quit. I went off and joined the US Air Force, then got a job working in electronics, then cycled my way back to programming through my work experience.

My experience with computer science was that I want to make things, but all I was learning was how to someday be qualified for research.

Imagine somebody who is good with a hammer and a saw, and he wants to be a carpenter. He tells the folks in school that he'd like to build things - houses or furniture or bridges - and they send him to college to study mechanical engineering. Mechanical engineering teaches him how to design the things, but that's not what this guy wants. He wants to be out there on the construction site, driving nails and cutting wood. He drops out of college, and goes off looking for a way to do what he's interested in.

That's me and computer science. I want to make things with the tools and materials available, not develop new tools and materials.

It takes some theory (of course it does) to be able to write programs. You need some idea of how the machines work, and how things get from code to execution. You don't need to be able to design a CPU in order to use it.

Could it be that many of the dropouts just don't want what computer science has to offer?

We **need** computer science, just like we **need** mathematicians and physicists and architects. We also **need** people who write programs just like we **need** people who pick up a hammer and a saw and build the things the architects and engineers design.

Is there a better place to learn programming than in a computer science setting? Maybe that's where some of those "failures" and "dropouts" need to be - learning to do things with today's tools rather than looking for tomorrow's tools.

Maybe those folks who fail just needed to directed to a more appropriate place so that they can succeed at the underlying task that brought them to computer science.

> **Comments:**
> **username_0**: I agree that there's a long-time institutional failure to distinguish between "computer science" and "software engineering". But even if we cut out the heavy research/math components: many or most students can't pass even the introductory programming course that you're talking about. Nowadays there are indeed "coding bootcamps" to provide the non-theoretical training. But, they have little oversight, and an interesting tidbit in this article: "only 12% of bootcamp grads didn’t previously complete a four-year college degree" https://www.thepennyhoarder.com/make-money/side-gigs/coding-bootcamp/  
> **username_34**: I can't access the article - the operators block my country.  
> **username_34**: I don't doubt your quote that "only 12% of bootcamp grads didn’t previously complete a four-year college degree," but I'm trying to figure out why you need to go to a programming boot camp if you've got a degree.  
> **username_0**: The prior degree is probably in a non-CS subject, and they want retraining for a new career. Example given in article is someone with a prior economics degree. This may possibly support my argument that CS people need a wide domain knowledge in many areas to succeed.  
> **username_35**: It's been 35 years since I implemented a non-trivial hashing algorithm, b-tree, or invert index, and almost as long since I implemented a linked list.  I also was a DP programmer (now a DBA), but even still that background has bee very useful in choosing the best library or database design to use.  
> **username_3**: The best way to get a second degree is to get the first one first. (Sounds like Yogi Berra, or something) The best way to be able to master computer topics is to be able to master topics. If you can get a degree, you can probably do what you did to get the degree.  
> **username_36**: I don't understand why you don't think knowing how algorithms work doesn't make you a better programmer.  Understanding concepts like graphs and time complexity have definitely made me a better programmer.  A lot of people who I've worked with who claim CS isn't helpful for programming make very naive choices that lead to inefficient, overly complex, and inefficient solutions and have no idea how poor their choices were or why.  
> **username_34**: @username_36:  I'm **not** saying that you don't have to understand how an algorithm works.  I'm saying I don't want to do research on better ones.  Just like a mechanic needs to know when to use a flare nut wrench instead of an open end wrench, a programmer needs to know when to use a hash table, or a dictionary or a list.  To do that, you have to know something about how they work, though you don't necessarily need to be able to design the hashing mechanism behind the dictionary.  
> **username_36**: I just found this to be a bit of a non-sequitur "... the theory, the mathematics of how computer logic and algorithms work. That is, studying things that would let you make better computers or discover new algorithms."  i.e. "... the *physics, the engineering* of how *engines and combustion* work. That is, studying things that would let you make better *cars* or discover *new automotive technologies*."  Knowing how things work definitely makes you a better technician.  It's not just for research.  
> **username_36**: But overall, I agree with your sentiment.   I personally think CS programs need to get serious about having a software engineering track/degree.  A lot of CS programs are pretty much already there, they just don't call it that.   Maybe your program was a more rigorous CS program that what I experienced.  I also started in Physics and used credits from that program to fulfill some CS requirements so my experience was somewhat unique.  
> **username_34**: A mechanic needs to know about combustion.  He doesn't need to know enough about it to develop a stratified charge combustion chamber.  His job is to fix the motor, not design one.  In the same way, a carpenter building a house needs to know what width of board to use as the joists under a floor for a particular span - but he doesn't have to know how to calculate it from the underlying physics and material  properties.  
> **username_36**: @username_34 If that's your point, I agree.  The way it's written in the answer seemed to imply that knowing how algorithms work isn't helpful for development.  My experience is that a distressing number of people think that is the case.  The amount of unnecessary electricity and hardware that is used because of that reason is staggering.  

---

### Answer by username_48 on 2020-11-18. Score: 8

Looking back on my experience and education as a software engineer, I think the largest *inherent* contributors of difficulty in computer science are that it has exceptionally strict and unforgiving standards for correctness, and that solving problems in it often requires an exceptional degree of questioning or ignoring "common sense" basic assumptions.

In many (or most?) other fields, getting something wrong by a small margin usually has an effect that is worse than desired by a correspondingly small margin. There are exceptions, of course, but there's usually a region of tolerable error. In software source code, it is not only *not rare*, but actually *common* for small mistakes to have large or even catastrophic consequences.

Those small mistakes in software source code often appear superficially to be completely correct. That apparent correctness tends to rest on an assumption so basic that programmers don't even realize they've made it. Logical reasoning as typically practiced by humans involves an enormous number of unstated assumptions, all predicated on a life experience in a world governed by physics and inhabited by other humans. Computers don't have those assumptions, and operate by their own internal logic that was artificially created by legions of computer scientists. To find and fix software errors, or to prevent them, a software engineer needs to be skilled at examining those assumptions and stripping them away to correctly follow the computer's logic, and that is a skill that actively opposes many people's instincts.

In short, to succeed well in computer science, a student needs to master a counterintuitive skill, and the bar for mastery is close to being pass/fail.


---

### Answer by username_46 on 2020-11-19. Score: 6

In addition to the many good answers on here, as a past student, TA and instructor in CS — most programming assignments and projects often take large amount of time, even if slimmed down to just fundamentals. There is a definite learning curve to build the skills, and personal mental model surrounding syntax, compilation, building, layout, debugging and deciphering build errors, and that’s before the more interesting data structures and algorithms kick in.

At my uni, there were the “Big 3” 4th year courses that were advised a) not to take more than one a term, b) to take a lighter course load if possible. Despite this, all nighters were a given, and some labs even had couches to crash on. The graphics course was hands down one of these, given the involved and highly detailed work required to get things working. And it is the same effort and work ethic that is essential to eg. the games industry which still motivates many people to register in CS.

Some people realize this time commitment and determine they either don’t have, or don’t want to spend their time this way.


---

### Answer by username_47 on 2020-11-18. Score: 5

Computer science demands a set of qualities, some of which are somewhat antithetical. One is the attention to detail. Another is the creative ability to build strong abstractions that are both powerful and useful. This involves some pretty heavy lifting in the big picture thinking department. However, it is hard to get off the ground in programming if you are unable to manage the syntactical exigencies of the language you are programming in. It is also hard to get off the ground if you cannot walk through a complex chain of logic.

In short, it requires some very serious effort and a very special mix of skills to become a good programmer.


---

### Answer by username_49 on 2020-11-20. Score: 3

Computer Science, as taught, is a combination of Mathematics and Computer Programming. Mathematics is the part that is the theory of computing, and programming is the art of applying it.

I'll dub the Mathematics party "theoretical", and the programming part "applied".

Now, both parts are hard. But are hard for somewhat different reasons.

## Applied Computer Science

Programming is hard for a few reasons. Every programming problem is judged first not by your instructor, but by the world's most harsh marker; the compiler/interpreter. Every program you write ends up being instructions for some idiot-savant computer to follow.

It is like trying to write an essay in English, but if your letters aren't formed right, you have any spelling mistakes, or there is any grammar errors, the teacher isn't able to actually read your essay. Instead, they are forced to examine each word in isolation, then after verifying them themselves they can look at each sentence in isolation, etc.

This creates a sharp discontinuity in your initial ability to get things done. The syntax of the languages you are using is, almost unavoidably, harsh on relative beginners.

Once you pass that tier, you end up with yet another situation where there are discontinuous errors that are harsh on relative beginners.

Programming is the art of managing insane amounts of complexity while telling a complete idiot how to solve a problem, exactly.

The ability for computers to do things exactly as described, extremely quickly, means programs are some of the most complex things humanity has ever designed on purpose. As someone learning programming, you end up building increasingly complex things. Each stage of this effort has to not only be good, but perfect, as errors in a lower tier of complexity will compound and make the next one impossible to do.

When you write a statement, your variables and operators can't have errors, or the statement won't work.

When you write a function, your statements can't have errors, or the function won't work.

When you write an algorithm, your functions can't have errors, or the algorithm won't work.

When you connect algorithms into a simple program, the algorithms can't have errors, or the program won't work.

You have to reach near-100% reliability on each tier, and learn how to deal with the less-than-100% reliability, before you can get any kind of reliability on the next.

To handle this, programmers have come up with increasingly abstract patterns. Each of these patterns is [b]hard[/b] to master, as they encapsulate extremely complex problems with seemingly arbitrary rules.

A short list of these patterns that programming students find hard to master might include:

* Variables
* Assignment vs Equality
* Control flow and looping
* Recursion
* Sub procedures/functions
* Pointers and indirection
* Code generation and macros
* Resource management and lifetime
* Threading
* Encapsulation
* Purity
* Mutability
* Asynchronicity

(in no particular order, and not comprehensive).

People learning programming often run into one of these, and just can't get it. And unless you get it, you can't get past that barrier, and often fail out. (One of the advantages of Java and other managed languages to teach programming is that you can neglect much of pointers and resource management and teach other stuff at beginner levels; the downside is you graduate people who don't have to learn that stuff.)

These are all levels of abstraction programmers have developed to manage increasingly complex programs. Strategies that work at lower levels of complexity fail at higher ones, so students who are using "ill advised" strategies can easily pass a course then fall apart in the next one.

## Theoretical Computer Science

This branch is all about understanding the idea of computation, as opposed to the art. You do need it in order to do certain kinds of applied computer science problems, so even in "professional" courses it is taught. And as academics are teaching it, often it is included anyhow, as the theoretical computer science often is needed to expand the entire field of knowledge of computer science.

This is a branch of mathematics, and like most kinds of mathematics requires iterative mastery. In order to do multiplication effectively, you have to not only be able to do addition, but you have to master it. That very simple step is mirrored along the entire tower of mathematical knowledge.

In many other fields, you can muddle along with the previous foundation layer having issues, and maybe patch it up later. But when you try to do that in mathematics things just fall apart.

Mathematics in much of the world is initially taught by people who hate and are bad at mathematics -- elementary school teachers. So we end up with a lot of people with a poor foundation in ciphering showing up in secondary education, then muddling though classes without every achieving mastery, then deciding to go into a lucrative field (programming). And without mastery of the previous tiers of mathematics, the theoretical computer science they teach is extremely difficult.

The student, whose goal was "get a highly paid programming job", finds this abstract computer science both hard and difficult to connect to their goal. Their problems with the material are foundational; they don't have the background required. The educators problem is that teaching that background requires fixing their 10 years of primary and secondary mathematics the student came in with.

Cutting theoretical computer science for applied computer science courses is plausible, but then the students aren't able to predict very well how to make programs do new tasks without taking forever to do them (programming efficiency, algorithmic complexity), or deal with logic problems surrounding multi-threaded programming, or a myriad of other important skills in the applied field.

## Real World

Programming is currently a lucrative, expanding field. This has a number of impacts.

1. Students are drawn to it not out of intrinsic interest or inclination, but because they want to make money at it.
2. Experts are harder to convince to be teachers, as not-teaching is lucrative, and teaching is difficult.
3. The number of students grows over time, so the previous generation of students (who supply the teachers) is smaller. This makes the problem of finding teachers harder.
4. The field itself is young. With other fields, we know millions of ways not to teach it; with computer science, we haven't had time to make as many mistakes and refine our education.

On top of that, the profession is a relatively solitary one. So it draws introverts; convincing introverts to have a career teaching students is an extra problem, reducing the pool of potential teachers further.

> **Comments:**
> **username_21**: Actually, computer science is much more than what you suggest. This presents a very narrow view.  

---

### Answer by username_50 on 2020-11-28. Score: 2

My head of department posed a question at a staff meeting, "how can we reward those students that work really hard?". My colleagues suggested cinema tokens, shop vouchers, prizes, ..., you get the picture.

When it was my turn I said "extra homework". There was a silence, then the head of department asked me if I "was serious". To which I replied yes, because the students that work hard like the subject and have intrinsic motivation, so they want to learn more, and so, the best reward we can offer is extra homework.

I was really thinking about Bem's theory of self perception. [Self perception theory](https://en.wikipedia.org/wiki/Self-perception_theory). Our political representatives and managers want to see success in STEM subjects generally, so many false promises, bribes and other forms of encouragement are applied to 'encourage' learners into STEM. I believe that particularly in CS our learners are being driven by the promise of *extrinsic* rewards.

Whether it is the promise of a large salary, the association of CS with 'fun' technologies or the social kudos associated with the movie images of hackery, none of the drivers are really about the subject. On arrival, instead of slick, fun and cool our learners find it takes 200 lines of C coding to put a dot on a screen, three years of pure maths courses to understand why neural networks don't work really and after reading a pile of books 2m high, countless RFCs and a half the UNIX manual pages they are still unable to understand what's wrong with their sendmail.conf or build a stable kernel, or use *vim*.

And why would they bother? Afterall, they are here for the salary, the fun, the kudos. They want to drive sports cars whilst playing CODwars and wearing hoodies. They don't want [this](https://ftp.gnu.org/old-gnu/Manuals/m4-1.4/html_chapter/m4_5.html). And they aren't interested in [that](http://www.optimization-online.org/DB_FILE/2009/03/2266.pdf) either. Our basic problem is that they are the wrong students with the wrong motivations.

Out teaching strategies don't help either. Nobody is going to get taught CS. A few might learn if they're motivated though. If the teacher hasn't read Vygotsky and the class isn't based on some constructivist learning principles you can forget it. It was hard enough to learn CS forty years ago when it was [this big](https://previews.123rf.com/images/rtdesignstudio/rtdesignstudio0912/rtdesignstudio091200311/6133572-showing-small-thing-gesture.jpg). Now its like [...](https://www.macmillandictionary.com/thesaurus-category/british/complicated-and-difficult-to-understand).

The problem isn't that computer science is hard, its too easy. At least until you get to University when the truth finally kicks in (I am somewhat reminded of WW1 heroes off to 'give the old hun a kicking, hoorah' who then find themselves waiting to go over the top at Passchendaele). Out students are totally unprepared for the actual reality. CS *is* maths, plus compiler design, the vim editor, gray codes, the use of tensor algebra to model shapes (Bookstein), the use of analytical topology to prove results about Perceptrons (Minsky and Pappert), the Godel incompleteness theorem, using gdb effectively, engineering philosophy, automated theorem proving, why this `b = (b * 0x0202020202ULL & 0x010884422010ULL) % 1023` reverses a byte in three machine operations and with solving the integer knapsack using intelligent backtracking we get the tip of the iceberg.

Great! There's loads of fun to be had in CS, infinities of it. But it isn't easy. We should return to teaching our young learners assembly language, get them editing real source code, throw all the maths from the trapezium rule to matrix inversions to axioms for semi-groups with unity *at school*. Its hard and maddening - work in groups, overclock the CPUs and watch them melt, rebuild kernels. Lets make it hard but lets have our students wanting to do actual CS. Failing that we will have no choice but to make it illegal, then we'll be seeing talent everywhere.

> **Comments:**
> **username_3**: The successful students get to keep working with computers. They actually get *paid* to do it.  

---

### Answer by username_20 on 2020-11-20. Score: 2

I have been a professor of computer science and engineering (CSE) in the USA for a number of years in ABET accredited CAC and EAC undergraduate programs (graduate programs do not have ABET accreditation in CSE as I recall). Reading these comments, I have a few things to mention.

The first is the economic motivation -- accumulation of wealth or even gainful employment. Most of such accumulation is based upon technology, not basic science or engineering. Many of the students I have met do not understand the difference between Information Technology (IT) and CSE.

Why is CSE much more difficult than IT? CSE is a highly abstract intellectual field that nonetheless has very concrete instantiations. CSE uses, develops, and requires "higher" mathematics. Does an IT person who is "information security certified" (typically with a vendor-based credential) understand encryption in terms of the actual mathematics (for example, I use both the declassified Shannon monograph as well the details of AES as explained in the original Rijndael exposition), or quantitative threat estimation, Nash game theory and what goes beyond Nash, etc.?

Admittedly, this is beyond what is covered in an ACM CS-1 course, but the issue is "why" do students find CSE "hard" (that is, a discipline in which many cannot demonstrate understanding proficiency).

IT is by comparison "easy" -- CSE requires mathematics, some of it developed by CSE persons, not "mathematicians", and the use of other fields to understand CSE whereas most IT-trained (and vendor "certified") persons know specifics of installing and "maintaining" a particular technology from a particular vendor (more or less the equivalent of "how-tos"). As an example: why does a real computer create heat? Because it produces information and thus reduces entropy, that requires work that in turn produces waste heat (increasing the entropy external to the created information) -- and requires an understanding of at least classical thermodynamics, or preferably an understanding of statistical mechanics and how entropy arises.

Coding is not too difficult, but algorithm design and then establishing that the algorithm is provably correct is not as easy. As neurosynaptic or quantum processors become more readily deployed, the issues will only increase. An IT person working on a quantum processor will memorize rules, but will most likely not have an understanding of quantum mechanics (and the underlying mathematics).

Some may interpret these statements as "elitist"; the issues are reality, not elitism. With intensive tutoring and dedication on the part of both the student and the tutors, many students who currently do not "survive" to a CSE ABET-accredited or equivalent diploma, can graduate. I have seen it and done it (with help from my TAs and myself) -- but those who dispense resources (funds, personnel, facilities) do not provide those resources, and students who could "swim" instead "sink".


---

### Answer by username_17 on 2020-11-19. Score: 1

I think there is a element where people are picking up on this 'everyone in the future must be able to code' attitude that has become fashionable in the last ten years or so. This is of course as ridiculous as saying everyone must be an engine mechanic or concert pianist. Everyone should be computer-literate, able to be safe online, spot malware and so on. The young men and women with a natural ability for coding should be spotted early and put into educational streams that encourage and support them and probably into decent apprenticeships\internships afterward.

Also these days so much of the coding world revolves around web applications and one look at that insanely over-complicated mess would put anyone off.


---

### Answer by username_18 on 2020-11-21. Score: 1

Maybe computer science is hard, because it gets lost in translation. Consider the following:

* The processor that you are writing code for is a bunch of logic blocks
* the language that you are using is a set of logic blocks as well.

Maybe the correct way to write software manuals is to simply show the logic block behind each keyword, and restrict human language to aftermarket tutorials, and how to manuals.

> **Comments:**
> **username_3**: I am not quite grasping, but I think you are saying something like: two similar-seeming conceptualizations are actually about very different things, and this is never made explicit. If it was, the reaction of students might reasonably be: "just teach me the one thing that works instead of two things that I have to learn how to connect together." This is why I often say, teach how the computer actually works instead of teaching a language-focused approach, like with Lisp or other machine-independent methods. Teach about the machine, then how the language is a tool to work with the machine.  

---

### Answer by username_19 on 2020-11-21. Score: 0

I would say the answer is shifting from "the strangeness of the platform" to "the raw number of operations that have to be perfect."

In the past, when computers were weaker, what made CSci so hard is that the tools did not fit the problems as well as we might like. There's something very unintuitive about how you had to work with them. And there's some real beauty in seeing how people grappled with this with cunning intuitions. The greats like Alan Turing and Grace Hopper truly revolutionized things with cunning shifts in intuition.

Nowdays, what I think makes CSci so hard is that the primary thing we do is operations that have to get repeated many many many many times. As I type this, in the USA, we are dealing with the 2020 national elections. There's great frustration in the handling of 330,000,000 slips of paper (give or take, depending on voter turnout) and getting them into the right places and making sure they're all done right. Its hard. And it has to be done 330 million times. We can afford to make a few mistakes here and there, we just try to keep them small so that they don't change the result of the election.

A while back, I did a computer science task which involved 4,000,000,000,000 operations, all of which had to be done absolutely perfectly in order for the answer to be valid. Four *trillion* operations.

For me, it was a Tuesady. There was nothing weird about these requirements. That was just sort of the usual daily expectations. I didn't even warm up a grid, which would have added a few zeros to that. That kind of perfection is just part of the job.

The tools you use to immaculately manage 4 trillion operations while you sit back and sip your coffee are, obviously, rather exacting. And its rare that we find places to use them outside of CSci, so there's not much room to develop intuition. I don't care how fast radix sort is, if you have to sort a bunch of numbers, you'll typically do it the intuitive way rather than the theoretically optimal way. And, having done it both ways, the theoretically optimal way is often slower (until you get to very large numbers of records).


---

### Answer by username_20 on 2020-11-24. Score: 0

The [answer of username_22](https://cseducators.stackexchange.com/a/6613/1293) states:
Compare those topics to <https://en.wikipedia.org/wiki/List_of_unsolved_problems_in_computer_science>, and try to figure out how those topics even get you started on the path to figuring out how you might even frame those questions, let alone solve them.

Computer science is hard because it’s a branch of symbolic logic and logic is hard. End excerpt.

Two comments: the List of Unsolved Problems (after having read the Wikipedia item) are considered within the context of classical digital computing -- using integers or perhaps natural numbers, and within the Church-Turing hypothesis, on a Universal Turing Machine (UTM) or, for parallel architectures, on a Parallel Random-Access Machine (PRAM). There are models different from either of these (with unsolved problems and conjectures); two of the most promising are quantum computers (and information transfer) and a rather more empirical approach, neurosynaptic computing (that has other names for similar concept). Quantum computing has a formal theory and is just starting to develop working hardware that instantiates quantum architectures. Neurosynaptic computing is a much more empirical approach to producing something akin to actual "artificial intelligence".

For example, one model uses an empirical connectome (at a specific scale of detail, not necessarily at each neuron and other brain components), observed from a non-human primate. This connectome is then modeled with solid-state electronic components (e.g., VLSI circuits that actually are fabricated). If the original biological brain has "intelligence", then the neurosynaptic electronic solid-state instantiation (model) is envisioned to have similar intelligence. The understanding of "how" the machine works, that is, a provably correct classical or quantum algorithm does not necessarily apply, but the empirical observations are intended to emulate what the biological brain would have done, including learning and adaptation to new "stimuli".

My point is this: in addition to the stated classical unsolved problems, completely different approaches to computation are being proposed and actually developed into physical machines (with the understanding that biological systems are, in this sense, physical machines -- no supernatural invocations involved). The issues that make computer science "hard" are now harder. The other point is that computer science uses logic (the first-order classical predicate calculus or perhaps higher orders), but in many ways goes beyond such logic. It requires mathematics (including "arithmetic") to establish algorithms; however, once one accepts that, one is beyond logic that provably is consistent and complete, and faces instead the problem of Gödel's incompleteness theorems.

> **Comments:**
> **username_21**: "because it’s a branch of symbolic logic". That is only a part of CS. There is much more.  

---

### Answer by username_22 on 2020-11-20. Score: -1

I don’t see anyone mentioning the fact that programming ≠ computer science. These are two entirely different disciplines, and it seems to me that there isn’t enough emphasis on this fact.

Take a look at Stanford’s CS 101 <https://online.stanford.edu/courses/soe-ycscs101-sp-computer-science-101> and the list of topics covered. Not a single one has anything to do with computer science. Compare those topics to <https://en.wikipedia.org/wiki/List_of_unsolved_problems_in_computer_science>, and try to figure out how those topics even get you started on the path to figuring out how you might even frame those questions, let along solve them.

Computer science is hard because it’s a branch of symbolic logic and logic is hard.

> **Comments:**
> **username_21**: "because it’s a branch of symbolic logic". This is the "CS is misspelled math" fallacy. There is much more to CS than that.  
> **username_22**: @username_21: yes, there is.  But CS isn’t about what an Ethernet cable does.  
> **username_21**: Hmmm. Given that I taught CS for about 40 years, I understand that and, moreover, what it does include.  

---

### Answer by username_18 on 2020-11-30. Score: -1

This discussion may soon be moot.

Consider the following article from the New York Time Tech section:

"Meet GPT-3. It Has Learned to Code (and Blog and Argue)"

<https://www.nytimes.com/2020/11/24/science/artificial-intelligence-ai-gpt3.html>

That article links to this one: Where an English interpreter writes code on the fly...

<https://twitter.com/sharifshameem/status/1283322990625607681>

Just FYI.

> **Comments:**
> **username_23**: Can it write FizzBuzz? Can it write FizzBuzz in a special version that prints "manziel" for every number divisible by 13? While this code generation tool is impressive, I have serious doubts that it can be applied to actually relevant problems. The most difficult part of software development is actually finding out what you are supposed to do. Finding a fast and efficient algorithm or data structure to solve you problem is - while certainly challenging - the simpler part of it  

---

