Friday, August 22, 2008

Do I Need a Degree in Computer Science?

Some people ask whether they should get a degree in Computer Science, or perhaps a comparable degree like Computer Engineering or Information Technology. Or would a Math degree be sufficient? How about one in Physics? Or Civil Engineering? Or for that matter, English Literature?

I have seen plenty of successful engineers with degrees in non-computer related fields. That shows that CS-type degrees are not strictly necessary to do well in this field. Software Engineering is not a tightly regulated field like accounting, law, medicine, or even architecture. Software Engineers do not need a license, nor do they need to pass any exams to work in the field. There are certifications they can get, but the value of many certifications is questionable. Hence it’s fair to ask whether people with degrees other than CS can be just as qualified as CS graduates. There is no simple answer.

On one level, some companies, especially large ones with formal training programs, like to take in the smartest people regardless of their college majors and train them on their approach to software development. For the type of relatively standardized work these companies do, this may be a perfectly valid approach.

At other companies however, formal training is a luxury and new employees are expected to come up to speed quickly. And in these environments the lack of a formal computer science education can be a distinct disadvantage.

Why is this the case? After all, aren’t there lots of teenage kids hacking away and even starting their own Internet companies, all without a CS degree? So why can’t a smart, college educated Political Science major do just as well in software development?

Well, my answer is that people who have focused their studies in non-CS fields are not likely to have the grounding in basic computer science concepts that are necessary to be successful right away in a software engineering environment. Sure, they can pick up these skills and knowledge on the job, but typically that happens in dribs and drabs, and they never get the solid grounding they should have had in the first place. I’m talking about skills and knowledge like the following:
  • Data structures: linked lists, queues and stacks, B-trees, graphs, etc.
  • Algorithms: Sorting, Searching, Recursion, Design Patterns, Big-O notation
  • Object oriented design (Encapsulation/Abstraction, Reusability/Inheritance , Polymorphism)
  • Databases (Table design, Normalization, Indexing, SQL Queries)
  • Discrete Mathematics (Switching theory, Binary logic, Numeric algorithms)
These are not necessarily esoteric, ivory tower concepts; many of them are things that may be used in the context of a developer’s daily tasks. You’d be surprised how many people I interview who have 10+ years of programming experience but do not understand these basic concepts. And not surprisingly, many of them do not have a formal CS education.

No comments: