It’s common to talk about these two programs as if they’re one. Most universities may not have a distinction between these fields and the media/casual conversation often use the two terms interchangeably. However, there’s a fundamental difference in training/design and learning outcomes for these two programs that often gets lost.
Software Engineering involves...
- Taking requirements and coming out with an efficient design.
- Concern about the lifecycle of a project
- Learning project management/documentation
- Being comfortable with version control/testing
- Understanding of practical implementation of various data structure
- Being aware and competent in different programming/technology stacks in order to solve problems efficiently
Whereas Computer Science...
- Has a high degree of comfort in math/logic and comfortable with very theoretical tools
- Requires strong fundamental understanding of algorithms/data structure
- Is interested in domain specific application of computational techniques (vision, networks, security, learning, etc.)
In casual conversations, when we refer to the need for people to learn “Computer Science”, we often are referring to software engineering. It may come as a surprise but many people who study “Computer Science” are quite lousy programmers. The more theoretical students may be able to get through a university Computer Science program with only coding in a handful of courses. On the other hand, a software engineer may shrivel up at the thought of talking about NP-completeness. And to be clear that’s ok for both sides – the ultimate end goal of these two different tracks are quite different. A Computer Scientist doesn’t need to know the latest and greatest programming language, while a software engineering doesn’t need to be able to prove NP-completeness to fulfill their jobs.
Most university departments don’t tend to have a distinction so the balance between engineering and science varies dramatically between universities. The most common complaints from university students s tend to be from those whose schools lean more on the science side – complaining about the program being too “theoretical” and having little practice/exposure to more hands-on design and implementation projects. For students who fall on that side of the spectrum, the best solution is to seek out internships/ individual projects that help practice these engineering skills. Senior design projects tend to be a good way of furnishing the engineering skillset. On the other hand, most software bootcamps tend to lean heavily on the engineering side – focusing on producing graduates who can immediately be employable by software companies at the expense of learning some more of the theory. For those, delving into the little theory that’s taught at these bootcamps will be extremely useful to get a more holistic and fundamental understanding of the field.
In terms of job prospects, both fields of study can lead to various software development engineer (SDE) roles – however, those with more of a theoretical background might need to put in the extra effort to bring their technical skills to the level that employers deem necessary. On the other hand, there’s a good chunk of jobs that expect more of a theoretical background (jobs in network security, machine learning, computational biologist, etc.). In these roles, it might be difficult/more hoops to jump through for a pure software engineer to obtain the domain/theoretical knowledge required.
Bootcamps and self-study tend to be a popular alternative to formal university training to get a software job. However, it’s quite a bit more difficult to learn the more foundational, theoretical techniques in that manner. For those who are more interested in the science side of the coin, it is extremely difficult to get all the parts needed for a complete theoretical study without formal university. On the other hand, people who are purely interested in getting a job in software, self-study, and bootcamps may be a viable option. I would caution, however, that bootcamps/self-study often has a focus on learning a specific technology stack – which is extremely useful but may be missing the importance of learning how and when to use various technologies and how to transfer knowledge from one stack to another.
In short, software engineering and computer science are two different ends of the spectrum. People who feel frustrated with one side should try to see if moving towards the other end satisfies them more.