A relatively large number of people in the software industry do not have college degrees compared to other industries. In my experience, many of the best programmers/software engineers are those who learned outside of college. However, many employers stress a CS degree or equivalent and some require it.
In your experience, what do software engineers with a college degree have that is generally missing from their degree-less colleagues with equivalent experience, and how much does that set them apart in terms of job performance?
[EDIT] I know that college exposes you to a wider range of things than a single job might and that a degree might help you get a job. What I am looking for is what things engineers with degrees tend to have that is useful on the job that others don't. In other words, as a professional software engineer that is in charge of hiring, why should I care if someone has a related degree? What are they likely to bring to the table that someone without a degree is less likely to?
Note: While searching the site I found a number of related questions including this one [1] but none of them provided the information I am looking for.
When trying to fill a position for a software engineer, what you are looking for is a "hacker". Someone who is smart and gets things done. A super coding ninja. There are people with CS degrees that are not hackers, and there are hackers that do not have CS degrees.
What makes a hacker?
I would say that there are 2 things:
The ability to quickly move between different "levels of abstraction". All software is constructed in layers. Take a simple "hello world" application in C#. This involves:
Writing software requires being able to have a working understanding of all of these layers, and how they fit together. It also requires being able to correctly determine what layer is appropriate for analyzing the solution to a problem. A good "hacker" can do this with ease. Poor programmers will have trouble.
The ability to deal with ambiguity
In the real world, software projects are fraught with ambiguity. In academic settings, problems tend to be extremely constrained and well defined. Someone who is not able to deal with ambiguity can thrive in an academic enviornment where everything is spelled out exactly. That same person would not do will in an industrial setting. A good programmer, on the other hand will be able to resolve ambiguity, ask the right clarifying questions, and work to create a solution.
So, once you understand that you want to hire a "hacker", the next question is, what type of hacker do you want to hire?
Given a choice between a hacker with a CS degree and a hacker without a CS degree, I would pick a hacker with a CS degree.
The reason is simple: knowledge. A hacker with a CS degree knows more about hacking then a hacker without one. By virtue of getting a CS degree they have knowledge of more programing scenarios, and ways to solve them, then a hacker without a CS degree would. The hacker with a CS degree gets the benefit of learning from the last 60 years of collective programing experience. There are many algorithms, best practices, programing languages, design idioms, etc, that are covered in a CS program. For a hacker without a degree (or who wasn't taught the stuff covered in a degree) to get that same knowledge he would need to re-invent all that stuff from scratch in the course of his work experience. That would be difficult.
As part of getting a CS degree, a "hacker" should walk away with a working understanding of the full range of how a computer works. They should know:
Having that knowledge makes a good hacker with a CS degree extremely productive. They not only have the raw talent necessary to get this done, but also a wide arrange of knowledge about the best way to do things.
If I were to assign relative weights to various "categories" of candidates for Software Engineering positions they would be:
100 - A hacker with a CS degree
70 - A hacker without a CS degree
1 - A monkey with a keyboard
0.5 - A non hacker with a CS degree
In short, a CS degree can mean a lot, given the right sort of programmer. However, given the wrong sort of programmer, it isn't worth much at all.
EDIT:
Some people have expressed concern (see the comment to the post) that "hackers" are not software engineers.
I should be a little more clear about what I mean by a hacker. I use the term the same way Paul Graham uses it. It means an "intrinsically skilled programmer".
Software Engineering is mostly about patterns of behavior and process that improve the chances of a software project being successful. The question being addressed here is, who makes the best software engineers?
No matter what process improvements you make, there is no silver bullet in software. There is no magic process that guarantees success. You can improve the chances of success, but you can't guarantee it. At the end of the day, you need to pick the right people to be your software engineers in order to successfully engineer something. "Hackers" make for the best software engineers.
The principles of good software engineering can be taught. The qualities that make a good hacker can't. At the end of the day, software engineers need to program. So, when deciding "who do I want to hire to be a software engineer?" the answer should be "A hacker with a CS background".
Edit 2:
I wanted to make 2 more points.
The first is that I wanted to mention that I don't mean this as a slight to academics that do research. Computer Science research is important. I just meant that what makes for a good Software Engineer is often different than what makes for a good researcher.
The second, is that I wanted to draw a parallel to Mechanical Engineering. Saying that a hacker makes for the best Software Engineer is similar to saying that a "gear head" makes for the best Mechanical Engineers. I think few Mechanical Engineers would disagree with that.
I was a non-CS major in college, but for me, a B.A. or B.S. of any kind indicates that someone has had exposure to the tools required to research and analyze problems, and to synthesize new knowledge, and, perhaps more importantly, to be able to articulate the details of their solutions. If they focused on something more math or engineering related, it also suggests the ability to cope with problems that require particular rigor.
A CS degree at a reputable college indicates that someone has exposure to a suitably wide range of algorithms and data structures to know what the limitations of a particular design decision are, at least in big picture terms. Certainly someone who fell into software development can develop that knowledge, and certainly completion of the degree doesn't prove competence, but it's a start.
I was a geek in elementary school all the way up to high school, and could reasonably adequately hack out code, but until maybe 5 or 10 years ago my eyes would glaze over anytime things requiring a certain degree of understanding of CS or math principles beyond what I learned through hacking came up. Thankfully, I had enough of an understanding of the research process to know where to start digging when an unfamiliar problem space comes up (Hint: the answer isn't always Google).
If I were a CS major, though, many of those categories of problems probably wouldn't have caused me to so much as blink, and I could probably be working on much more complicated problems already. I'm just starting to make sense of graph problems 12 years into my career, but the applicability is very, very broad, and I know they at least come up during a 4-year CS program, even if not necessarily deeply examined.
A degree is useless without intellectual curiosity, but a good foundation for someone who is naturally inclined to keep learning. A hacker may only explore problems they've personally faced, and may be completely unaware that, say, there's a complete theoretical foundation that deals with a problem space they suddenly encounter, and not know where to look. CS graduates should have at least some idea of potential places to look, and other college graduates should at least be able to make sense of research if sent in the right direction.
What my CS degree added to my professional experience/competency was a good bird's eye view of the field as a whole. I learned about everything from the lowest-level silicon (in circuit/logic courses) to the operating system and high-level algorithms.
Most days I don't directly use what I learned, but when I'm facing a thorny performance problem or am trying to architect a large system, it helps to know about how virtual memory systems work, or how the operating system manages threads. Note that these are all things I could have learned elsewhere, but my degree made sure I got at least a dab of each of them.
Overall I would say that a good CS degree will make you a more rounded programmer and give you a lot more perspective on certain problems, which you might not otherwise get from day-to-day experience. To relate this back to your question about a hiring manager, I would (as a manager) like to know that an applicant had at least a working knowledge of all those things, in addition to knowing how to implement a linked list in java. Programming requires a lot more than just knowing how to write code: you have to know how your code will fit into the system as a whole.
A large pool of single women. There's no other time in your life when you will be around so many women who are single. Once you start working, it gets really tough to meet women (which is why all the match.com sites exist). Grad school often has many married students, so college is your best bet to sharpen up the dating/social skills.
This should be reason alone to go to college.
It's like poker. You can play poker really good from instincts, but when you know the math behind it you can make better decisions.
College makes you dig deep into things that you NEED to understand, but don't know it yet.
You can be a great programmer, but until you learn that "stuff" that you wont learn yourself, something will be missing (well, most of the people wont.. who got up in the morning and said "I'm going to take the next 2 weeks and build a compiler!")
In school, I got exposure to a large number of concepts and tools, that would likely have never known about otherwise.
Such as Finite State Machines, Linear Algebra, Genetic Algorithms, Computer Graphics, OSI/TCPIP layers, basics of Operating System implementation, CISC vs RISC processors, Assembly Language, lisp, Yacc and Lex.
I don't use them most of the time, but it gives me a toolkit when facing a new challenges.
A college degree gives you the opportunity to learn (and fail) in an environment with fewer and different pressures than the workplace. Furthermore, in contrast to learning at home, one is compelled to continue learning, guided in what to learn, and provided with support from experts.
For example, in the workplace or at home you are unlikely to ever walk through all the stages of a parser and compiler from first principles, with the guidance and answers of an expert at hand, despite the fantastic importance of parsing techniques and compilation in most developers' day to day work.
In the workplace you have deadlines, external limitations, and existing codebases: you would never choose to write your own lexer (to take a particular example), so when:
you are missing the required experience, and have to learn under very different pressures.
The particularly important part about all this is that someone who earned their degree can go to the workplace and experience all of the different pressures, learning both sets of skills... but it's much rarer for someone who has spent years in the workplace to go back to school full-time to learn in that environment.
Put another way, the workplace teaches you to get something working, while a university teaches you the principles of making it work, or how to make it work right. It's possible to learn the latter in the workplace, but it's harder.
My personal perspective is that my time at a university taught me a tremendous number of underlying principles that I use every day in my work without thinking, and some that I consciously use. Some of my coworkers without those experiences have noticeably different approaches, and they often start on a course which — with greater insight into the character of the problem (algorithmic complexity being one such area) — would be obviously foolish.
All that said, I wouldn't refuse to hire a programmer without a university education... but I do think they would have a harder time meeting my requirements than if they had one.
One thing that I didn't see explicitly mentioned here: A college graduate will generally have had additional exposure to required course material that is not directly programming related, but is still useful in the performance of some of a programmer's job functions.
A specific example that comes to mind for me is an English writing course that I was required to take in college (while pursuing my degree as a CS major); the course significantly improved my writing skills relative to the level they were at prior to taking the course. I've benefited from that experience on the job when doing the writing work that comes with a programming job, such as writing documentation (where "writing documentation" also includes high-quality in-code comments), communicating via email with others on my team and with business stakeholders, and so forth.
I can think of a few things that I got in university:
1) Formalized communication - Rarely up until university was I required to write out thoughts in Math or Computer Science classes. In university, it isn't that uncommon to have to write out a fair bit of detail when doing Mathematical proofs or other tasks where the key is how one justifies a correct answer rather than simply figuring out that the answer is 42.
2) Working well with others/humility - Up until university, I had found many educational subjects rather simple and easy. I had over a 90% average among my Grade 13 courses. In taking a few advanced Math classes I suddenly became someone near the bottom of the list instead and needed to get help from others usually. For example, in my first week at university we are given an assignment about taking the ring of Integers with a square root of 3 added to it that just didn't make sense initially.
3) Understanding of software development/structure - Granted one can manually go through all the basic structures like Stacks and Queues along with their implementation using arrays or linked lists, but how well does this cover what a university curriculum would? Similarly, I was exposed to Waterfall methodology with its various points along with compiler information in to add more to the structure side of things.
4) Access to a network / Prestige of having THAT degree - I went to the University of Waterloo which is known for being a recruiting ground for Microsoft and other big tech names to some extent. Sometimes a place will have other Waterloo alumni and that is how I got to meet some of the people that gave me my first out of university job.
5) Problem solving side skills - While I didn't have a course in problem solving technically, there were many courses where having a systematic way of tackling a problem is useful, e.g. given a particular statement either prove it to be true or false.
Of course one of the best things about university for me was that I was free of the jerks and bullies that I had to deal with in younger grades. Here for any given class, the people wanted to be there and weren't forced to do so. There was a sports league where just showing up and wanting to play was enough to be included in playing and even though I was a poor player, it was still fun and good to have that exercise and socializing.
The degree gives a wide and shallow view of things, the real world gives deep and narrow.
Also there is a whole host of things that a come with a degree that are valuable, but most of those have nothing to do with CS or even a CS degree.
The same goes for most other types of degrees as well.
A college degree will give you something to put on your CV (resume) that will help get it past the HR department into the hands of someone technical.
Have a listen to episode three [1] of the SO podcasts. Jeff and Joel discuss the value of computer science degrees.
[1] http://blog.stackoverflow.com/2008/04/podcast-3/In my experience [only!] - it has done next to nothing. However, as @ David [1] said, is will get you a step beyond the HR drones.
I've worked with folks with 0 college - even highschool dropouts, that rocked.
IM[notso]HO - college may or may not be a worthwhile endeavor: certainly the piece of paper is nice, but for CS ... experience is what counts.
[1] http://stackoverflow.com/questions/294562/what-does-a-college-degree-provide-that-experience-doesnt#294569Personally I think I would not have had the same theoretical foundation without my college degree. I'm quite a pragmatic person and if I don't see an immediate use of something I usually don't consider it worth my time. While studying I had to learn much of the theory in CS that I wouldn't otherwise considered, but I can honestly say that it has made me a better software engineer.
Learning Haskell, for instance, seemed to me at the time a bit useless ('I already know C++!') but it has broaden my mind in CS related matters the same way learning Chinese has broaden my mind not only in natural language related matters but also in my view of the world. When you're confronted with something that is so very different from the way your mind currently work, it has only two choices:
I'm not saying you cannot learn this outside of college, but for me it was crucial to be forced in the same way learning snowboarding made me a better skier since I was forced to learn doing it properly.
Getting a CS degree shows that someone took extensive action to specifically become trained in CS. This generally means they have an interest and commitment to the field. This to a lesser extent is also the value of certifications. Specific knowledge of content to these is a bonus.
Remember its cheaper for a company to not hire a good engineer compared to expense of having to get rid of a bad one. Also remember that interviews cost money (people time).
Candidate 1 has a CS degree and a couple years experience, and a couple relevant certifications. Candidate 2 has no degree and a few years work experience.
Candidate 1 has demonstrated they want to be in CS, and are committed to gaining knowledge in relevant technologies. Candidate 2 has demonstrated that they have been able to avoid being fired for a number of years.
Which would you interview?
Those of us in CS for a while intrinsically know that those without formal education may be just as competent as those without. However discovering those without formal education that have commitment and capability is higher risk to the hiring manager.
This is only an averages thing (i.e. there are a huge number of exceptions in both directions), but in general programmers with college degrees are better at written and spoken communication. This is mainly because colleges and universities tend to require students to practice these things, whereas the work world (especially programming) does not.
This is a tough one. I was lucky enough to get a good education in science, engineering, and math. I was also lucky enough to get a degree in C.S. and A.I., and learn from a lot of really really bright people, with ideas that could be picked up nowhere else. I was also lucky enough to never take a programming course. (Well, actually, the only programming course I ever took, 7094 assembly language, I hated and nearly flunked.) All programming skills I learned "on the job" and from co-workers. Then I taught C.S. at the college level, and I learned even more - namely how to get the most functionality from the smallest possible amount of code, and how to communicate it. So if I'm any good at this business, it's because of the non-programming education, and being able to learn from some of the best, and having great projects to work on.
Certainly you can be very good in this profession with a minimum of education. I had a few students who were such extremely bright and powerful programmers, that they would hardly ever come to class. It bored them. This was sad, because there were some really useful ideas that they never learned. We used to lament that they were "too smart to learn".
Now the level of learning I have is something that doesn't necessarily help. If I give a design decision based on what I normally think of, such as automata theory or information theory, I have to keep it hidden, because my colleagues may just think I'm showing off. There is a tendency to think the things one does not know are not particularly worth knowing. So education is a two-edged sword.
So I guess I would say, programming is a skill that, if you are clever and energetic, you can pick up quite well, but a broad education in some hard science and math (including computer science) will make you a much better programmer.
As others have said, the best you can get is a natural coder (a hacker in the old sense) who also has a degree in CS and experience doing real-world programming (which may happen in a university; not everyone who works in them is an academic). This analogy is why:
Imagine there's a tall hedge around a house and a bunch of programmers wish to get in. Those who aren't doers will just sit around and achieve nothing useful (and, if they've got a fancy education, they'll spend their time berating everyone else in earshot in a very irritating manner). It's only the practitioners who achieve anything real.
The guy without the education or experience will work on climbing over the hedge; a huge waste of effort, but eventually they'll succeed through sheer effort. The guy with the experience but no education will choose an appropriate tool and hack (hah!) their way through the hedge; plenty of collateral damage, but a more efficient solution. The guy with the education too (and a practitioner with education will accumulate experience rapidly) will walk round the corner to the gate in the hedge that they know should be somewhere about, and get in rapidly and with minimal effort.
OK, it's a very silly analogy, but it illustrates that what a proper education gives a coder is different perspectives on a problem. They'll know what databases do. They'll know what regexps are. They'll not be over-fazed by bugs in compiler correctness. They'll know when to use functional programming, or logic programming, or networking, or concurrency, or any number of other techniques. Marry that to same sorts of skills that a good practical coder has and you've got the ingredients for someone who really can rapidly deliver effective code. They'll also be the people best able to create the application architecture, design the code module interfaces, and communicate what was done with others.
Without education, the ordinarily skilled coder will just write code that implements the first solution they think of. That's fine enough for simple and low-level work where there tends not to be too many deep choices to make, but the lack shows up in high-level work where deep howlers are made (e.g., utterly inappropriate security choices that commit an organization to doing the coding equivalent of pounding sand down a rat hole for a decade; I've seen that happen, where a dumb choice was made by people without a CS background).
A CS education in the hands of the right type of person is a massive accelerant to their overall skill.
A college degree nowadays has become the gateway to a successful career. Careers related to IT/computers are so challenging and competitive that you cannot think of getting your foot in the door without a college degree. Thus, gaining experience without education these days is out of question. Computer degree programs [1] make you well-versed with the fundamentals and trains you for the latest technological trends. A college degree not only makes you employable, but it also makes you proficient in the field of computers.
[1] http://www.cc-sd.edu/computer-degree-programs.htmlA degree gives you knowledge (but isn't the only way to get it). Experience gives you wisdom to know how to apply that knowledge.
You cannot be a great programmer without experience, but you can be a great programmer without a degree.
(and 4-5 years isn't "experience", it's practice. Real experience takes 10 years or more)
Another thing a degree gets you is proof you can stick with something for a significant amount of time.
Employers stress a degree because they want something in writing as accountability for hiring someone, they need to weed out the masses, and they need to keep up with the Joneses.
That said, a quality college education provides a framework for learning a subject from the beginning to an advanced level, in a pre-determined order that requires discipline to understand and practice one concept before proceeding to the next. In short, it facilitates the learning process greatly.
I know that when I try to learn a subject on my own, I tend to skip around. And if I could pour my resulting knowledge onto a plate, it would look like a big ol' slice of swiss cheese -- covering a lot, but with a lot of holes. A degree fills those holes.
I did not go to University, but would consider only a minority of other business application programmers my supperiors ... university and non-university. (arrogance not intended)
I know I can solve any problem recieved, and although I couldn't exactly write a database engine with my current skillset; I'm sure I could do it, given the time.
However, I'm sure I would be an even better programmer if I had spent years in university concentrating on programming full time, surrounded with other smart people.
All things being equal, I would reason that university has to be better.
Also I just heard a podcast with Joel talking about this exact thing. I think it's eposode #29 [1]
[1] http://blog.stackoverflow.com/2008/11/podcast-29/College taught me how to learn and what I'm capable of. There is no substitute for experience but college gives you the "real world" experience mom and dad can't give you.
Actually it gave me two things - ability to learn, understand new things and analytical thinking.
At my previous job, I found a number of people who thought they wasted 4 years in college. On my team of four developers, I was the only one with a CS degree. Having gotten started with computers late, a college education helped me get a theoretical foundation that I may not be able to achieve on my own, since I had started so late. I've found great developers who didn't go to school and really bad developers with a great GPA. There are plenty of people I went to school with that I would never hire.
A degree is good, but it shouldn't be a measuring stick. Interviewing for the technical requirements of the job is what will determine whether a candidate is fit for the job. I would say that the two most important things are: the ability to understand difficult software engineering patterns and the desire to keep up with constantly evolving technology.
I want to add a couple of points that I've gleened from my experience in software engineering, both throughout school and university and out in the real world. In my own experience of and from speaking to software engineers - most of them didn't have decent schooling in computers and learned just the barest basics until they went into college or university.
I didn't learn anything during my degree studies that I couldn't have easily learned on my own time given a decent reading list and access to the vast resource of the internet. So I have to say that I was (and still am) remarkably disappointed with my education in computer science and software engineering.
Obviously books are a non-interactive medium so even with a decent reading list, the explanations come in the form that you're given. Therefore, tutors are extremely valuable - of course, "tutors" can take many forms - just having people around that already understand the content that you can ask questions and bounce ideas of are a godsend.
University has the greatest potential as a medium of education - but too often, the course material is lacking, the tutors uninspiring and there is a distinct lack of passion impressed upon the students.
A decent reading list can be found with an evening of research on the internet - most universities will provide you with one in a single phone call. The books can be easily obtained from Amazon or from Chapters/Borders/Waterstones, and with decent proramming resources like StackOverflow popping up all over the internet it's easy to get alternative explanations to any material you don't understand.
So would I rather have someone with a CS degree? Yeah, maybe - I agree in principle, someone with a CS degree had the dedication to get them through - and that kind of dedication is commendable.
But I'd just as soon have someone that's got:
Formal education give you a foundation which makes you think rationally and logically. In industry, you can get by doing just copy-paste and buzzwords sometimes.
I've worked in at least a dozen industries both on and off the books. I've worked with educated and experienced people.
A college education means the person has loans to pay back, they've volunteered to "go with the flow", and they're likely to simply "fit in" to the way a business wants to run things. They're generally going to be the type of "employee" a company is looking for.
Someone with experience on the other hand generally lacks education-related loans to pay off, has opted to "go against the grain", and always thinks they know how management "really works". These people are a much, much higher risk to an employer because they're generally in a position where they can "cut and run", often times taking trade secrets with them and setting up competition.
Technically, a college educated person really doesn't bring anything more to the table. Realistically, a college educated person is also less likely to take things away from the table.
I'd say that experience gives you real world problems that you will need to handle. As a self taught programmer, I learned that experience gives you a lot more like confidence to do any task within the programming job.
A degree doesn't actually show you what you will expect since College just shows you only a shallow part of it.
A four year degree course or 4 year experience in in Industry, which one is more valuable. I will say 4 year experience in Industry. Then why are some people with fancy degrees are earning more? It is because of of our mindset. It is true that 99.99% of bright young people go to a college and waste 4 years.