Why do so few people major in computer science? (2017)
danwang.co
danwang.co
I don't do a lot of programming myself, but I took an intro Algorithms in Python MOOC from a top school a while back. I think it's fair to say that, had I no appreciable programming/using a computer background, the class would probably have been impossibly difficult for me.
PS. We have to study PHP and "AI" next year here. And the final semester is an unpaid project at some local company.
Do the side projects pay and have a future? Otherwise enjoy graduating with connections. You can quit future jobs to start a side project anytime (assuming no responsibilities).
Also CS is just very difficult, especially with all of the theoretical courses. At a certain point, it becomes a test of your resolve as a person vs your ability to program.
And in my opinion that's perfectly fine. On the other side many jobs that are "just" programming really shouldn't require a CS degree. It should be up to the job market to come up with reasonable requirements, not the Universities to churn out graduates with a different skill set to comply with the market.
> At a certain point, it becomes a test of your resolve as a person vs your ability to program.
I feel like this sentence goes somewhat counter to what you said before. If CS isn't primarily about programming, which I agree that it isn't, why should it be a test of my ability to program? I disagree that it's merely a test of your resolve, however. Sure, you need to have resolve to complete a hard degree, but the same applies to many other subjects.
I'd much rather say it's a test of your ability to think abstractly, generalise and recognise patterns.
They taught the theoretical, but expected you to just pick up the practical as needed. If you couldn’t learn Java in a weekend, you would fail the first coursework.
Sounds like its pretty good preparation from my perspective.
It’s funny because you can read about the same exact algorithm in Sedgewick or CLRS anyways, so I don’t know who they’re trying to fool.
People go to university while they should go to school instead since universities are primarily about the progress of science while schools are not, but do primarily cater to the desire to have a job. At the end of the day, the desired output of both institutions suffers.
In Japan, what many people would call basic "CS" is being taught at elementary schools in order to prepare the youth for the future... And in case my argument is still not clear, they don't receive a CS degree for their accomplishments as its nothing but yet another basic prerequisite fulfilled.
As someone who graduated recently and is going through this process right now - I always thought I would be set because I'm a decent problem solver, aced all my algorithms and data structures classes and generally could solve most interview style problems I came across. I've learned that this is not enough. An organic problem solving process might involve trying several promising approaches, or starting with a suboptimal algorithm and realising improvements to it, and then you might figure out an optimal solution. In many of these interviews the time constraints can be absurd, you basically have to have done the questions or variants of them recently to be able to write down the optimal solution in your first iteration.
Today my friend had a first round online screening from Atlassian - 5 questions in 90 minutes, and none of them were trivial warm up level questions. Compound this with the fact that it's often harder to solve problems and think creatively when you're under time pressure in an interview, and you realise that your only option is to do 200+ Leetcode problems and just hope your interview overlaps with those problems.
Most businesses only care about making money. Unless your unique algorithmn costs less to implement and can make money right away, you are out of luck.
Hell, all the stuff you learn at school about algorithms and faster ways of doing work, has been negated by hardware advances that mask poor coding practices.
Go get an information systems degree, learn to code, and make money. The world is going to need coders and IT people for a very long time.
Well, that or getting acquired....
Sometimes it isn’t, and we end up with Electron on the desktop :(
I felt like I went from a forward looking, enlightening major - to become where you end up in the details worrying about semantics. CS is mind expanding; coding is specialist mind numbing boredom.
Also you get a better house if the architect who designed it also builds it.
And eventually the house builder gets enough experience to become a much more useful architect because they know what's actually possible and what is purely academic.
Sure, you can get the knowledge in other ways, and sure, some of the houses built by people who haven't studied architecture are great too.
Some aren't though, and their builders could have benefitted from a bit of theory ahead of time.
It's almost more like the relationship between materials science and hoise building - it can enable you to do a better job.
For those saying you've never been helped by your CS degree, I think you either took a bad degree or you'be been stuck in un-taxing work. You've seriously never bothered thinking about, say, algorithmic complexity? Or other topics that should have been covered?
There are lots of successful working programmers that will never need to deal with "algorithmic complexity" because "programming" encompasses a very wide spectrum of skills. I attempted to explain a rough categorization of 2 groups:
https://news.ycombinator.com/item?id=12079697
So yes, a programmer in group 1 -- let's say a 30-year veteran of COBOL -- can conceivably never have to make a decision about designing an algorithm & data structure to be O(n) vs O(log n) because he works at a higher abstraction level using COBOL. His domain of work doesn't need to deal with low-level things like raw pointers to linked-lists in C/C++ where Big-O complexity is considered when engineering a custom b-tree from scratch.
The programmers in group 1 are not any "worse" than group 2. They just do a different type of programming.
The point is during a degree you are lead to some topics and guided through them.
That would be around the era of the Intel 80486 processor. All of us cared a hell of a lot about both algorithmic and data structure efficiency back then since computers were so feeble compared to today's systems; people who didn't couldn't produce programs that functioned properly.
In the ancient 1990s, A COBOL programmer writing "green screen" terminal apps to hit a database on an IBM 360 mainframe doesn't deploy to 80486 desktop pcs.
Even today, if you type "COBOL programmer" into monster.com to search for jobs, most of the results will be programming work for mainframe environments instead of targeting consumer computers like iOS/Android/Windows/macOS/etc.
I ran into a guy responsible for roof repair for company buildings on a flight. He said, "the greater the architect; the worse the roof leaks."
What I did on hackthebox.eu recently was:
<technobabble>
reverse engineering x64 assembly into C (silly, I should've used Ghidra instead). Then I started exploiting the heap by poisoning the t-cache, with that I could overwrite the GOT (getting an arbitrary read/write). Leak libc's base address bypassing ASLR, then using return to libc to exploit the thing (a ROP technique).
</technobabble>
Most of these things I learned during my CS master and it's apparently overkill for something like OSCP. More importantly, not all skills overlap. Dodging rabbit holes is not something you learn well. Understanding how to reverse engineer a binary has not much merit when it comes to finding a CVE and using metasploit, or some script on Github. Dodging rabbit holes and being fast at finding the right CVE's and using them properly to exploit a target are skills in their own right.
Lots of math and hard science is in the major. It's not an alternative to the humanities and liberal arts and languages. It's done in addition, which just isn't fair at all. Students take two or three semesters of calculus-based physics, three semesters of calculus, two semesters of discrete math, engineering statistics, linear algebra, differential equations, and often even more science.
A person majoring in education could skip all that, even if intending to be a math or science teacher.
How different is this from engineering more broadly, to say nothing about math or physics majors? (I can see CS being a bit more math-heavy than some other engineering disciplines because at many schools, it's been historically associated with the math department but I think the general point stands.)
To understand these numbers, I'd have to understand better how degrees roll up into Computer & information sciences vs. Engineering & engineering technologies. At many schools, "CS" is in the engineering school, often associated with electrical engineering.
This.
I tried going back to school for a CS degree at 26 after 5 years of professional experience in the bay area as a developer. The CS classes are trivially easy, but I simply could not do the math. I paid for tutors. I lived on Khan Academy all day long. I tried three semesters in a row to pass calculus and just couldn't do it. The vast majority of people simply cannot pass the math classes required for an engineering degree.
Questions you do with others, or examples from the book are useful for conceptual clarity, but that clarity can only be guaranteed to be solidified if you successfully do questions without help.
People often think you don't need practice to master math, but don't bat an eye when they see professional football players passing the ball to each as warm up before a big game (after having played the game for 20 years and passed the ball 100k times already). Fundamentals are important. I just started learning drums, and my music teacher has been making me practice the same beat for the past 3 months over and over again till I absolutely master it. Me and every other student is happily doing it.
This is almost like saying, basketball players don't need to do pushups during the basketball match, so basketball training should skip push ups. The reason all engineers and scientists (computer or natural) should do calculus/differential equations/hard math courses is because these courses make students smarter.
They are a form of mental exercise that permanently increase your maximum brain capacity and your ability to do complex logical reasoning. It is possible you could replace these courses with some more job-relevant courses, but those courses would have to be just as brain wrinkling as these courses, if you wanted to maintain the current intellectual level of the industry.
I find most “computer science” people don’t want to actually worry about producing products that people want nor do they want to worry about the actual business domain.
There is a reason that despite all of the “smart people” that Google has, they have consistently failed at every product that isn’t advertising.
Or convince some university to create a "software business" major so they can streamline themselves into a management role at a software company.
Jobs famously killed Apple’s Advanced Technology Group that brought the world things like PowerTalk, OpenDoc, and QuickDraw GX. Microsoft’s Research division hasn’t done much better. I’ve already mentioned that Google has wasted untold millions on products that no one wanted.
But the bigger question is are the degrees actually preparing students for the real world outside of Silicon Valley where companies actually want people who can add business value? Will it prepare people to compete for jobs against cheaper foreign labor where they are more focused on actual “occupational training”?
CS majors come out of the gate making 100K, can change companies whenever they want, are mission-critical assets wherever they go, and work in ivory towers.
For the benefit of society, or the country, or the world, or something like that... the situation is terrible. We're wasting years of human lives on unproductive education. We're excluding capable people from CS careers. We're driving up the cost of software.
If we trimmed out the non-CS stuff, people could do combined BS+MS degrees in the time that we currently spend on BS degrees. The extra CS education would be valuable to the people and to their employers.
And to some degree, isn't the job of science to make life easier for the rest of us? I know some people scoff at people that don't have CS degrees, but it's important to be realistic about science's role in industry: thanks to the combined output of a lot of very talented computer scientists, computer programming is getting easier and more approachable with every passing year. It's not uncommon now for people with very little knowledge of computer science to build all kinds of complex applications. I see that as a victory for computer science, not a setback. And I think the people that want to apply science are just as important to the success of our industry as those who want to develop it.
A person majoring in education earns nowhere close to what STEM grads does even if intending to be a math or science teacher. Knowing those things is what makes you valuable, anyone can learn programming but not everyone will know how things works and you can't program stuff you don't understand.
1. Getting an internship and then a job at a large enterprise company right after graduating.
2. About 5 years in professional software development, I was starting to be included in architecture and system design discussion meetings with key decision makers on large projects. Where my non-cs colleagues with the same skill level could not keep up with the conversation.
During the time in the between, what helped the most was having the discipline to follow through on finishing small projects that would fill the gap in areas of software development that I didn't understand at the time.
I can see why most would be programmers would not want to study CS as it won't immediately help them become better programmers. In the long term, I feel that its worth it to have a grounded education in the industry that you work in. After a recent trip to the Bay Area, it doesn't feel that many new grads are about that dev life. The sentiment is get that 4-year, 1-year cliff and FIRE(https://en.wikipedia.org/wiki/FIRE_movement)
Anyone can learn proper system design by working in the field and being exposed to proper design first hand.
At many schools, on the other hand, if you're following the CS curriculum you're starting off with topics like algorithms and effectively teaching yourself programming and maybe even how to use computers in parallel. This has changed a lot over time. When I got my non-CS engineering degree way back when, the one computer course I took was really a programming (FORTRAN) course that assumed zero prior knowledge.
But mechanical engineering? Chemical engineering? Economics? I'd argue that kids going into those fields may have read a bit and maybe tinkered a little at the periphery. Maybe in the case of ME they were in a robot competition. Etc.
But, in the case of pre-calc physics in HS for example, it barely gives a hint of what being a physics major would be like.
I actually don't know how much exposure to programming there is in HS. I assume essentially no "CS" per se but then, they wouldn't have the math for the most part. But I'd argue there are actually a lot more opportunities to get exposure to computer-related stuff than there is for other fields.
(To the degree, per my other comment, that there is something of an expectation at many schools that incoming students, like music majors, will have done so.)
It also gave me the framework of understanding to be able to reason about what is actually going on, and how. Being fluent in the major abstractions of a computer system allows you to more easily skip around between working in different real world contexts without getting flummoxed at your lack of knowledge on how that particular field does things. You know and can recognize the problems that you can best solve with a computer; so you just go ahead and fill the niche when necessary, and try to avoid the politics if you can/value your sanity/conscience.
People major in it because they can get jobs. And sometimes due to it being well taught and/or fun.
I don’t see how one would know what they needed to interview at a FAANG without taking data structures and algorithms courses.
Having gone through the hiring process at three different companies focused on both desktop and web based software, computer science majors were an extreme minority. Most people had a business degree with a programming component attached like Management & Information Systems.
Maybe it its worth looking into how many would be CS majors choose to do the less math intensive but more industry relevant business school option.