Why You Should Hire Computer Science Majors
stephen-brennan.com
stephen-brennan.com
Software engineering is predominantly problem solving and the important traits are analytical and logical thinking. 4 years of education doesn't govern these. Some people have natural pre-disposition to these skills and filtering out people based on majors will reduce your pool significantly.
I've seen a lot many good engineers coming from the Philosophy, Physics and Mathematics majors. And I think this could be true for other majors too.
In short, smart people will easily catch up with what is taught in 4 years and hence given an average employment period of ~30yrs it's ridiculous to decide employment based on a major.
I remember one thing I always told my students. I always told them that my classes would not turn them into great programmers any more than swimming classes couldn't turn them into fish. If they had it, they'd be good ones. If they hadn't, I promised them they'd be able to, at least, fend for themselves.
I also directed questions to the class and threw sweets to those who answered. It was fun to watch adults jumping competing for candies.
Hardware Ex Machina.
Perhaps I'm biased, but I suspect a smart person from a CS degree background will probably think about performance more than a smart person who never learned about "irrelevant" things (to quote the author this post is addressing) like Operating Systems.
Someone without a CS degree can learn about how to write code which is memory and CPU-efficient and scales well. But if it's never a problem they have to come across, they may never even think about it. CS students are forced to think about things like that in their degree.
I even had one case where a degreed dev looked at perfectly fine code and said "Oh there's a faster way to do this..." then proceeded to implement a solution that was literally 500x slower, but checked it in anyway, not bothering with any before/after performance benchmarks, just assumed his stuff was magically faster. The culprit: His solution was very greedy with network traffic (but was arguably more computationally efficient). Didn't matter tho, it was slow as dog.
Undergraduate Computer science will teach you how to measure how much arbitrary work it takes to complete something but AFIAK it does not seen to teach you a very good job of how to actually look at a specific problem and optimize the work, memory, or external latency-intensive resources... that must be learned by critical analysis of actual code.
I agree fully, and won't ever deny that many students simply either never do this or never do it effectively.
There are courses which teach this however (such as OS), and many of them are required for a degree. I feel that the likelihood that someone with a CS degree has had these good practices ingrained in them is higher than someone with no background in CS. In other words, it's a safer bet.
Choosing to hire or not hire based on whether or not someone did or did not major in computer science is just a pre-judgement about an individual's ability as a computer programmer. It makes alot more sense to treat people as individuals rather than pre-judging against some broad criteria that classifies individuals into types.
It's often non programmers who make broad pre-judgements like this because they don't understand software development well enough to work out what strengths and weaknesses an individual programmer actually has.
Another word for pre-judgement is prejudice.
Not all prejudice is illegal. Saying that "all people who fit into category X or category Y are not suitable for employment with this company" is entirely legal but foolish prejudice, presuming of course those categories are not defined as illegally discriminatory in the country that you live in.
You can only spend a finite amount of effort on hiring, and you have to phone-screen some people before you phone-screen others, so you've gotta create expectations of people based on imprecise information like their major, GPA, former employers, etc.
For example I can't see any way in which working at a particular company defines whether or not someone is a good programmer. Can you quantify in detail why working at company X means someone cannot be a good programmer? A detailed explanation?
Can you explain to me precisely how you can measure someone's capability as a computer programmer via their GPA? And I mean in a really quantified way, not just hand waving.
Even what someone majored in.... can you say exactly in detailed terms how this defines whether or not someone is a good computer programmer?
Pre-judgements like this are just voodoo recruiting.
It's how to recruit when you really have no idea how to work out if someone is a good computer programmer or not.
You didn't respond to the blog post. You responded to a version of it that has been rounded off in this manner. Likewise, you haven't made a response to my comment: I never claimed these criteria were effective ways to work out if an individual is a good computer programmer. You've rounded the idea that some people are more likely worth interviewing to a different meaning, and responded to that.
Likewise, using the word "prejudice" under one definition to pick up the negative connotations of one of its other definitions seems like the same kind of thing -- a similar obliteration of nuance.
> For example I can't see any way in which working at a particular company defines whether or not someone is a good programmer.
Some companies have stricter hiring standards than others. Thus the probability that a candidate is worth hiring is higher, because they already passed that company's tests. Plus, they'll have experience working on whatever the company's working on -- you can expect somebody to be a better foo developer if they've done foo before.
> Can you explain to me precisely how you can measure someone's capability as a computer programmer via their GPA?
I never claimed you precisely measure that, did I?
But obviously, somebody with a 3.5 GPA is much more likely to be a good programmer than somebody with a 2.0 GPA. If you have a 2.0 GPA, you're most likely stupid, and even with four years of mitigating circumstances there's a huge set of people that could not get such a low number even if they had a policy of not caring about their grades at all except to show up for exams.
> Even what someone majored in.... can you say exactly in detailed terms how this defines whether or not someone is a good computer programmer?
For example at my alma mater the CS major was filled with gamedev-wannabes, and programming-inclined EE students were far better on average.
Also, all your new questions in your post's edit are still putting everything in terms of If X then 100%-Y. Why?
For instance, I might not want to hire bullies or bigots. Or maybe I don't want to hire someone whose beliefs directly contradict the goals of the company. (Like a doctor who doesn't believe in treating patients. Or an AI researcher who believes in souls.)
Recruiting software engineers is about finding the passionate engineers who are proven problem solvers regardless of programming language or given tools. Those people might be computer science majors, and they might be non-majors (or non-students) who have a passion and skill for problem solving.
I've worked with and learned from great engineers who did not formally study engineering and those who have devoted their life to it. It's ultimately about having the drive to pursue (software) engineering. Those people tend to self identify by enriching their education with their own side projects.
Ultimately, Computer Science education is (and should be) exactly what it says. The science of computing. It doesn't require a computer, and it isn't software engineering. By studying great algorithms, data structures, design techniques, etc, you are well on your way to skill set of a successful software engineer, not because you know about splay trees or automata, but because you have practiced advanced problem solving, which is at the core of any engineering.
What about competent? Professional? Experienced?
Nobody looks for a "passionate lawyer", that would even be a red flag, indicating that he can't evaluate a legal situation objectively.
Nobody looks for a "passionate basketball player". As long as he shoots those three pointers, who cares whether his secret passion is really boardgaming.
Anyone would think it was the students paying for the education. An education that allowed them to maximum their income over a career than spans a decades. Instead the students should be paying to get the skills needed to help start-ups make their founders rich.
For example, what about the fundamental of building a website, or building an app?
I'm not arguing that "colleges should teach students rails or X technology that will be outdated in 2 year".
I'm saying that colleges do not teach you a lot fundamental computer science concepts, such as "How do I design a scaleable rest API/website". Or "how do I use a MVC framework (regardless of which MVC framework it is)", or "What design decisions do I need to make when building a mobile app".
These are all very important concepts, that I use in my day to day job, and they have NOTHING to do with "learning hip technology X". These are problem solving fundamentals that colleges don't teach!
I'd hate to see a class like "MVC Frameworks" replace Databases or Operating Systems. I've never had anyone struggle to pick up MVC design in less than a few weeks, but writing an effective non-trivial database query? Definitely. Especially if it involves designing indexes to support it. A class like databases that covers the internals of how a database does it's job goes a long way in this regard. Classes like Distributed Systems and Parallel Programming give you the fundamentals on how to build a scalable system, be it a website or a large scale physics simulation. Frankly, the main piece I think they fall down on, testing, isn't even on your list, and some universities are working on that.
I'm certainly not saying that a CS degree is the only path to being a developer. Heck, one of our devs is an Economics major hired as an analyst who just too sufficient interest in what we do to join the team. It seems like so many of the "fundamentals" being brought up here are "how to solve computing problems that are essentially the same as mine" instead of "how to solve computing problems".
Maybe I'm just spoiled by the local university, but I've never had even an intern unable to make a meaningful contribution to our iOS app in the first couple weeks, having never seen Objective-C or iOS development before, so I don't think their lack of exposure is hurting them.
Programming != CS, and that's fine. We need CS to push the boundaries of what we know and can do, and we need programming for the day-to-day work. The trick is knowing what the overlap is for the position you need filled.
Can't agree more.
When I took my first job after graduating with a CS degree, I often complained that my degree hadn't taught me really anything useful about how to program with real teams, building real things to real timescales.
Some years later my opinion changed. Of course my CS degree didn't teach me these things, but nor should it have. It was partly a foundation in the principles behind programming, partly an education in how to think about problem solving on a fundamental, quite abstract level.
The things I gained from it provided a great base from which to learn how to write software in industry, and whether I realise it consciously or not, everything I have learned and continue to learn is augmented with the knowledge of the fundamentals behind it, which is really, really valuable.
My opinion, and I'm more than willing to be challenged on this by anyone with counter-examples, is that learning to write software in industry, with teams, huge-scale systems, bosses, and deadlines, can only be done on the job. It's not something that can be simulated in a university, and indeed one actually never stops learning even once in industry.
Things that are helpful on the job can only really be learned the hard way, by doing the job, failing, and seeing that a better way exists for next time, in a similar situation. There's never such a thing as 'the right way', only 'the right way for this situation' - and there are too many permutations and edge cases on what that could mean to be taught in a structured way in a degree. Therefore I don't think universities should be in the business of even trying to accomplish this. They should be in the business of producing graduates who are able to learn professional programming with a broad and deep knowledge of the fundamentals as a base, which is a very valuable thing.
I think what the GP is describing is more like an apprenticeship than a degree, and who knows, maybe that (combined with at least some study of the most directly-related fundamentals) could be one future path for learning programming as a young school-leaver, in lieu of going to university. Perhaps a four-year apprentice would be quicker out of the blocks in their first 'real job' than a 4-year CS degree grad, and perhaps that's a much better, more economically viable way to train new programmers for standard, forms over data style web development or application development work.
My point is teaching to the job is a completely separate thing from learning the mathematical and logical underpinnings of CS from nearly first-principles, and should be approached as such. Let a CS degree be a CS degree, don't try to morph it into a programming apprenticeship.
To your point that a "CS degree doesn't actually teach you... [about] building a website, or building an app", I can only say that any number of classes that were part of my 1987 degree (Rochester Institute of Technology) are directly applicable: -- fundamentals of computer graphics -- data management (btrees, isam files...) -- networking and client/server programming -- analysis of algorithms (performance and optimization) -- discrete math (boolean logic, binary math, octal/decimal number systems)
My degree gave me the tools to understand computing concepts and that has served me quite well even though most of the tools, languages, and hardware that I use today didn't even exist when I was in college.
--Web dev changes a lot, but some things like Java were used 10 years ago and are still used today.
"The courses focus on things he considers irrelevant (like operating system design) without providing experience with working on real development teams."
--Really? I'm going to be taking 2 capstone software engineering courses that focus on building real world applications in teams.
"There are few courses on practical skills like mobile app development."
--Took a class on iOS development already, taking another class for android development this fall. I have literally no clue what this guy is talking about. Maybe its your idea of what computer science students are learning that isn't changing. And why would it, when you don't hire any..............
Some awkward points from the original WSJ article:
University computer science departments are in miserable shape: 10 years behind in a field that changes every 10 minutes.
When did the WSJ author have time to sample the 4-year curriculum from every CS department?
The author complains about "no iOS development" in universities. There's always a balance to strike between being a trade school and a knowledge institution. It's not the place for a university to pre-train your employees exactly to your specifications. You probably don't need the pumping lemma to develop Angry Angry Badgers XXV, but you still need exposure to how and why everything can even work the way it does.
The rebuttal post makes a great point about how, if iOS development is so important, universities should have been teaching Flash development extensively up until about five years ago. That would have worked out well for everybody.
Computer science departments prepare their students for academic or research careers and spurn jobs that actually pay money.
Unsubstantiated fuff. Computer Science departments are the only departments expected to churn out semi-productive workers by their second semester of study. Not many pre-med majors are getting hired as junior doctor interns their 6th month into study.
They teach students how to design an operating system, but not how to work with a real, live development team.
Operating system design courses focus heavily on practical data structures and the reality of programming physical hardware. But, counter argument, it's all invalid in the cloud!
As for "real, live development team," that's one of the benefits of going to a school. You get to work in different project groups over the course of a few years to figure out how things work, how other people work in a group, and how you yourself respond to group dynamics.
Mr. Gelernter is the CEO of the tech startup Dittach.
Based on his rant, I'm assuming Dittach is just a thin glue layer on top of a dozen open source libraries with no actual development involved?
A computer science degree tends to be about 2 full semesters worth of college credits, or one year of education. Calling a 4-year degree a "computer science degree" is the first misnomer. It is still a liberal arts degree with a major in computer science. Of course one shouldn't expect a fresh grad to have all of the needed skills for commercial software development if they stuck only to their coursework. Internships help, but the intern is at the mercy of the company when it comes to what they get out of it.
Even self-taught people can't learn everything in a single year, and have to specialize if they want to find employment, limiting their job opportunities and appeal to employers. Specialization can also increase their expiration date if they picked the wrong stack, but can increase their appeal if they know the right technology at the right time.
People also don't differentiate between self-taught programmers who already have a liberal arts degree, and those who do not. What percentage of coding bootcamp graduates have no college education, and what results do they see?
If companies want people who have all the skills and experience your company demands, then pay more for senior developers instead of expecting people fresh out of college to fit that role.
That's the same way I view developer candidates with respect to those with and without a CS background. The weakest candidates don't hack on their own time.
Yes, it is entirely possible to learn the fundamentals of problem solving in an alternate field. But if not, computer science degree is a damn good way to get there. Long term love of coding is no substitute for it.
There are a lot of great ideas in Computer Science that are very hard to learn all on our own in a short amount of time. One cannot just hire a long-term user of telescopes as an Astronomer.
Besides, even if the position disregards the importance of problem solving skills, CS teaches a lot of underlying stuff that almost none of the self taught programmers I know have yet learned. That might not be important, but is incredibly valuable when shit hits the fan. Maybe there should be simpler resources to learn computer systems on our own. Knowledge of what's going on is not very common.
There seems to be two approaches to knowledge acquisition: school method vs. self-taught method.
School method: learn everything you can, then learn to ignore what doesn't matter since you probably know a lot of things now.
Self-taught method: know nothing, only learn exactly what you need. (e.g. try to do something. learn what you don't know. make one thing work. now you have a very narrow knowledge. repeat process until your goal is obtained.)
The self-taught method still produces capable people, but sometimes their capabilities and experiences are more narrow than others who have been through purpose-designed curricula.
The self-taught method is also a favorite of YC. Who needs business school when you can learn it as you go and pay people to understand parts you don't comprehend? You probably won't hire a YC self-taught-CEO to run Bank of America or JPMorgan, but they can competently bounce around startups for the next 20 years with no problems.
But what is missed from the argument is that any good CS program includes a lot of self-teaching. You're expected to write an OS, large torrent softwares, networking protocols, parallel systems that run on supercomputers, distributed databases like Hadoop, web apps like Twitter. And that is just the top of my head. And most of these extended projects don't have any top end requirements. They only have minimum requirements which is pretty high. And people usually try to one up everyone else.
Not to miss that self-taught method almost completely neglects theory method, a lot of the times. Ask a self-taught programmer if his algorithm could be made better, then wait a couple years till he learns huge amount of discrete math, complexities, and proving optimality before his answer can be trusted without everyone else looking.
Again, not everyone values these skills. And that's OK. The article was written in reponse to a guy who said he won't hire CS graduates.
Having a few friends from the school of "who needs college?! I taught myself everything I need to know about coding and I'm on the cutting edge of the field and I have a great job!", I sometimes see a lack of understanding of general principles. Sure, people who really love computing often dive deep enough to learn this stuff themselves, but there are a lot of people who love development that just don't even know what they don't know about it. Most development jobs don't require this knowledge, but you'll sure miss it if you're in a position that does.
That's a bit simplistic. There are some people, myself included, who at that time knew they were interested in CS but had not yet come across the right project, language or instructor to help them discover their passion. I was a late bloomer as a developer. I did not keep at it just because I knew I could land a job.
Of course! The purpose of college is to produce tradesmen who come pre-trained to... uh... work at startups that help people "find attachments easily". That's what education is about.
What farce.
There is a sharp difference between "Computer Science" and "Computer Engineering" though colleges often conflate the two. The article's author sounds like the latter, and with his personal background in programming, I would expect him to do fine in the position we were trying to fill. But many other graduates with CS on their diploma will have written just enough Java to pass their one programming course and have no interest in learning any more.
You don't need to know everything about the field, but you do need the ability to learn the practice. "Computer Science" on a resume (without some sign of personal projects) is too often a flag that the person lacks that ability.
Whenever I've seen "Computer Engineering", it's in reference to the engineering domain of building computers, chips, etc. Software Engineering is the "practical" version of Computer Science you are probably referring to.
They don't realize how deep computing and computer science truly are. Data Structures and Algorithms, Computer Architecture, Operating Systems, Machine Learning, Computer Graphics, Databases, Compilers and Languages, etc. etc. all require a deep knowledge of CS.
Pretty much anything you use or build on was developed because of years and years of CS study or PhDs. When you use something like Google Maps, Chrome, iOS, Linux, AWS, Facebook (yes even Facebook), etc. it is because of the work of CS grads and professors over a long period.
Do you want to have deep knowledge of various systems and truly solve problems or just want to hack out another webapp or mobile app? Maybe that defines the difference between a CS major and "just-another-dev"
However, if you find someone good at coding and they got there because they were self taught, then it is probably a better indication that they love coding because otherwise they would have not taught themselves the skill and got good at it.
So I think it is definitely easier for our mind to stereotype people and just look for the higher probability of success method. But you then cut out a huge portion of potential candidates.
So spend a little extra mental energy to judge the individual based on more than just a binary criteria. I'm sure your hiring process will greatly benefit from it.
That implies to me that the self-taught+formally-trained people are in high demand and paid accordingly. Thus, Gelernter gets to choose among the people who are only self-taught or only formally-trained, and his sweeping viewpoints are based on his experiences with a subset of the workforce.
Not to say this isn't an important topic. But my CS degree involved some areas that I would argue that are at least as important for the kind of work these companies do, like process algebras for distributed systems or static program analysis.
That being said, it did take me a while to appreciate that this was what my education gave me and obviously, no approach works for everyone.
That's been enough for me to surpass many of my peers of assorted educational background etc.
Way to illustrate the point.
The author is one.
(The above tongue-in-cheek should NOT be read as a defense of coding "bootcamps", as I think they're leading to a glut of barely-competent programmers flooding the market, but should be read as a criticism of degree entitlement. I know my algos, can calculate time and space complexity easily and correctly, have designed several mission-critical systems that have withstood the test of time, all without the college degree. At the very least a bootcamp'd developer will have some hands-on exposure to the tools being used in the industry today.
A degree does not a competent engineer make.)
I can only speak for myself, but I think that I've made a decent little career out of being more valuable across a wide array of functional roles than somebody who has a freshly minted flavor-of-the-month certificate. But I've made a point of being able to do more than that in ways that employers want--I'm rarely, if ever, the best at any particular thing, but I'm good at lot of different things, and that's both valuable and hard to substitute with inferior (from an economic perspective) services. Which is to say, there's a markup for my services, but my marginal value stays fairly high even after a given problem is solved. And my CS degree helps out with that a great deal, but the degree itself is meaningless--it's what I can do for a client or an employer that matters.
Your programming abilities are extremely likely to be shit. Unless you've been programming since you were 12, the programming you've done for your CS degree has not prepared you to write code in the industry and, in fact, has probably given you a ton of bad habits that will need to be broken when you get your first job. Just an example, but I find that fresh college grads don't commit/push their work nearly as often as they need to. I find that school encourages a mentality of spending all the time you have making it as good as you can make it when it's far more valuable in the industry to share your work with coworkers as early in the process as possible. I have to watch our new-grad hires like a hawk or they'll hold their story until code freeze and commit at the last minute and make QA's job harder.
The good news is that you've been taught a framework for thinking about how computer programs perform as the size of data gets huge. The bad news is that jobs where you're writing the kind of code that deals with huge data are few and far between. Sure, we've got more data than ever these days, but we're using libraries and products that have already handled much of the CS work.
To echo another poster, between a CS grad, a bootcamp grad and someone with a year of professional experience, I'll take the professional experience every time.
The bootcamp grad has gaping holes in his skill set...I interviewed 8 of these at a hiring event and while each of them could talk intelligently about the 4 technologies they'd been taught, not one of them had even heard the term "load balancer" or could even guess what it might be used for.
The CS grad has useful knowledge, but I can teach the small portion of a CS curriculum that's applicable to the jobs I hire for. Big-O notation is a pretty simple concept and it takes two seconds to look it up for the data structures we use. And has been said elsewhere, in the real world, n is usually pretty small and the constants matter. And yes, I realize the irony of saying that because of Google, a product that required a ton of CS knowledge to create, a formal CS background is less important.
Only the one with experience isn't starting from near-zero. And that's alright...I'm firmly in the camp that believes that college shouldn't be a trade school. It has value in and of itself and shouldn't be expected to teach the skills that are needed on the job. But that also means that it doesn't give you that leg up that you seem to be expecting it to. Your degree will get you in the door, but mostly because our industry is starved for talent right now, but you'll only be valuable once you've gotten real-world experience.