Do I Need a CS Degree?
I can’t count how often I was asked this question over the years. The short answer is “no.” You do not need a CS degree to have a prosperous career in tech. It is important, however, to have some solid CS fundamentals.
A CS degree from a reputable university will teach you what you need, and a lot more. So much more than it is simply not necessary unless you plan on working on very algorithmically complex systems. You can study the practical aspects of CS you need to know without majoring in it.
Fact #1: Passion for Coding Is More Important Than a CS Degree.
Many CS graduates do not know how to code. I have interviewed hundreds of candidates with CS degrees who didn’t know fundamental things. I have some many crazy stories. Some of my favorite answers I had to hear:
Me: “How many bits in a byte?”
Candidate: “Usually 32, but I think it is 64 in modern computers.”
I kid you not…
Me: “How do you find the minimum value in a sorted array of integers?”
Candidate: “Well, I don’t remember exactly. I know I have a book at home with a very interesting algorithm to do this. If I had to solve this problem, I’d look in that book. I can’t remember the title, but it is blue.”
Modulo is not just math theory.
Me: “What does the modulo operator do, and how do you use it?”
Candidate: “I can’t remember all the math from the college days.”
If you claim to know it, don’t rest until you understand it.
Me: “You said you have a lot of experience with RESTFUL services. Can you tell me what a RESTFUL service is?”
Candidate: “A service with a RESTFUL API.”
Me: “Ok, so what is a RESTFUL API?”
Candidate: “I don’t remember, but I know how to call one if I have the documentation.”
I have also interviewed and worked with many amazing developers who don’t have a CS degree. I never noticed an obvious and direct correlation between college major and practical ability to write code. The two things appear to be almost unrelated.
I have found, however, a direct correlation between passion for coding and coding proficiency. I believe that the right CS graduate can reach a higher level of technical ability compared to a similarly smart person who doesn’t have a CS degree, but I believe that passion is the real differentiator in most cases.
Sadly you can graduate from many CS programs without being a good developer. On the other hand, you cannot be a good developer without passion for coding. Period.
Fact #2: There Is a Big Difference Between a Computer Scientist and a Software Engineer.
I remember one of my Computer Science teachers in college. He was the stereotypical crazy scientist. He was so skinny that he could probably be blown away by a light summer breeze. His head reminded me of a lightbulb, and he never wore matching socks.
Despite the stereotypical appearance, he could confidently write very sophisticated algorithms on a blackboard, without ever consulting any note. If you saw him teaching, you’d think he was a master developer.
One day I went to talk to him in his office, and I was shocked to see him attempting to type on a keyboard. He stared at the keyboard the entire time, slowly searching for the keys, and using only his index fingers to press them. Even though he knew CS theory from A to Z, he had absolutely no experience using computers. His assistants did most of the computer work at his office.
In the software industry, you need many software engineers, not many pure computer scientists. If a software developer is also a computer scientist that’s great, but it is not necessary.
Fact #3: What Is Often Required Is “CS Degree or Equivalent Experience.”
Many job postings ask for a CS degree or equivalent experience. There are many ways to interpret that statement, but in practice, it means: Apply if you have a CS degree or a few years of solid coding experience that requires CS fundamentals. You can accumulate a few years of experience with passion and determination starting as a junior developer.
It is important to note that a “CS degree or equivalent experience” does not mean that you can get away with not understanding CS fundamentals. You still have to master those. It just doesn’t have to be done as part of a formal degree.
Fact #4: You Must Have These CS Fundamentals.
Even if you don’t have a CS degree, you do need to understand some fundamental concepts as they recur in different forms in real situations. Here is a list of things you should know or study:
- Base-N concepts (N = 2, 10, 16)
- Binary operations
- Boolean logic
- Algorithmic complexity & big-O notation
- Data structures (arrays, linked lists, B-trees, red-black trees, queues, stacks, hash tables, heaps, sets, graphs)
- Sorting algorithms, and when to use them. (You’ll rarely implement those in their basic incarnation, but understanding them is very important)
- Basic understanding of NP-completeness
- Basic multithreaded algorithms
- Memory management & garbage collection (just because you code in a language that takes care of memory management for you, it doesn’t mean you can get away with not understanding it)
- Pointers (you need to at least understand the concept, even if you don’t code in C or C ), and the difference between passing parameters by value or reference.
- OOP concepts (interfaces, inheritance, constructors, destructors, classes, objects, abstractions, encapsulation, polyphormism, etc…)
- OO design and patterns
- Optional: Some basic understanding of dynamic programming, greedy algorithms and amortized analysis, string matching and approximation algorithms
As mentioned in the past, I recommend starting by mastering these concepts using Java and Python.
Fact #5: Coding Practice Is More Important Than a CS Degree.
Solving coding problems is a skill that you can build with relentless practice, as long as it is deliberate practice. Googling for snippets of code to do what you need to do is a way to get something working, but is not good practice. In fact, is no practice at all.
You need to muscle your way through the implementation of solutions, struggle in the process, and you need to invest the time necessary to break through the barriers of problem-solving. It takes sweat and determination, but you cannot become a good developer without resolving a lot of problems and without writing a lot of code.
Challenge yourself, and push your limits!
Every superstar developer I know has spent years and years of relentless problems solving to become good at it. The more you practice, the better you get, and the easier it gets. Again, a formal CS education helps, but it is not necessary.
If you want to have a career in tech, but graduated in something other than CS, don’t sweat it. Invest the time to learn the fundamentals, and write code every day until your head hurts. Going back to school is not required.