Engineering with Utsav

View Original

Computer Science vs Software Engineering

Every single Q&A I've done, I always get this question:

Hey Utsav, I'm joining university soon, should I pick Computer Science or Software Engineering?

Honestly, I never made this video because I thought the answer was obvious, but as I dug into it, I found out that there is a lot of misleading information out there that is confusing people for no reason. So let's clear all the confusion out once and for all!

If you prefer the video format, I’ve got a video on this exact topic on YouTube… feel free to watch that instead. Otherwise, continue reading.

Our trusted friend, Wikipedia, says that Computer science is the study of algorithmic processes, computational machines and computation itself. As a discipline, computer science spans a range of topics from theoretical studies of algorithms, computation and information to the practical issues of implementing computational systems in hardware and software.

Whereas, Software engineering is the systematic application of engineering approaches to the development of software.

Okay, that makes sense. If I had to rephrase that and add my 2 cents to it, I'd say,

Computer Science helps you understand how computers work, and in Software Engineering, you put that knowledge of Computers into practical use in order to build software systems.

Great, we have a definition! Now let's look at them as college degrees. How does a Computer Science degree differ from a Software Engineering degree?

Ideally, both, Computer Science and Software Engineering will cover the foundational computer science and mathematics knowledge. These are programming logic in one or more programming languages, data structures, algorithms and basic probability, statistics and discrete math.

And since Computer Science is the theoretical study of computers or computations, a Computer Science degree will build on that foundational knowledge with advanced topics on the same areas. For example, advanced algorithms and analysis, concurrent programming, operating systems, linear algebra, advanced calculus, finite state machines, and also other advanced mathematics courses.

A computer science degree is a great option for you if you love learning things at a very deep, academic level. It is also a good choice if you plan on getting advanced degrees like Masters or PhD in specialized areas like operating systems, distributed systems, data science, machine learning, so on and so forth.

A Software Engineering degree will also cover the same foundational topics. But since Software Engineering is the application side of things, a Software Engineering degree will take the foundational knowledge and teach you how to build software systems that are used in the real world. For example, Software Development Lifecycle, Software Design (that includes things like design patterns, principles and paradigms), Software Testing, Scalability, Distributed Systems and Web Technologies.

A software engineering degree is a great option for you if you want to get a high-level overview of the engineering practices used in the real world. And also, if you want to get into the industry right away.

But notice that I said IDEALLY when I started talking about these two degrees. Because this is the "by the book" definition of what these degrees should be. But, as with anything in the real world, it's not that cut and dry, because there isn't a universal standard that regulates what these degrees should be, and as a result, these degrees can vary quite a lot from university to university.

To that end, here are a few things to watch out for:

  1. You need the fundamentals. Programming logic in at least one language, data structures and algorithms. If a CS or a SE degree does not have that, run the other way. Those aren't going to be good for your career as a software engineer or developer.

  2. If you plan to do advanced degrees in specialized topics, you want to go with a CS degree, which has courses that cover a lot of theoretical knowledge and mathematical concepts related to the area you want to specialize in. This sets you up for success when you pursue advanced degrees. But at the same time, if you don't want to pursue advanced degrees, you probably don't want too much theory.

  3. Not all Software Engineering degrees are created the same. Some lean more heavily towards electrical engineering and physics. If that is what you want, that is cool. But if you want to stick to software engineering, watch out for too many classes in those areas.

  4. And then there are those degrees which linger around within the Computer Science or the Engineering Department, but are neither. They have their own merits, but they may not give you enough knowledge to kickstart your career as a software engineer. These are degrees like Information Technology, Information Systems, Data Science, etc. They are fine as specializations, but I wouldn't recommend them as full degrees, at least not at an undergraduate level.

Ok, now that you know a few things to watch out for, let me give you some advice on how to go about picking your degree in general. See, the thing is that you need a bit of both - theory and practical knowledge. Here is an example: Say you are building a cloud-powered spelling checker, like Grammarly or something like that. A computer scientist would likely think about what is the best way to find that a word is even misspelled. And from there, what is the most optimal way to find the best match for a suggestion. Could this be modelled as a graph problem where we find the Levenshtein distance between two words to find the closest suggestion? This is very theoretical and mathematical, but it could help find suggestions fast. But autocomplete is just part of a larger system, like Grammarly, or Microsoft Word. How would other parts connect with this system? Would the autocomplete be exposed as an API? Would it be cloud-based? What are the latencies, throughput? Should the dictionary remain in-memory? How should we design the overall system? What if we want to swap out this version of autocomplete with a completely new one? Would that affect any other modules? How can we make the system extensible, but decoupled? You get the idea.

Remember our initial definition? Computer Science helps you understand how computers work, and in Software Engineering, you put that knowledge of Computers into practical use in order to build software systems. Hopefully, this real world example changes your perspective from obsessing about this degree vs that degree and instead thinking about how you can get the best out of your 4 years in college with a good mix of theory and practice? And for that, here is my advice.

  • Do your due diligence. Look at the curriculum to make sure at least the fundamental courses are covered. After that, see what choices you have for advanced courses. Does the degree give you choices to pivot on, or is it too structured and strict? Is it too theoretical or too practical? Ideally, you want a good balance between theory and practice.

  • Think of a degree as a flexible canvas. You should have the option to choose from a wide variety of electives to shape your degree however you want based on your own interest or the job market. Good programs give you this choice. The only thing that should be forced upon you are the fundamentals.

  • Work closely with your advisor and let them know what your goals are to create a course plan that fits your needs.

  • Reach out to recent graduates who have jobs. Ask them about what classes they took, and what helped them in their jobs.

Well, hopefully that gives you some idea on how to go about picking a degree, but more importantly, how to think about your degree, not as computer science vs software engineering, but as a 4-year stretch of learning what you want to get the most out of. Learning is the most important part of this debate. If you have sort that part out, arguably, you won't even need a degree at all! People without degrees have gone on to build great software. I think I will start venturing into philosophy if I continue any further. So, I will stop here.