From time to time I get asked: “What is the difference between computer science and software engineering?” Usually, I awkwardly stumble through an explanation along the lines of: “Computer Scientists discover, research, and test new theories where Software Engineers apply these theories to their work.”
What follows is the result of me deciding to sit down and organize my thoughts around this question.
Computer Science emphasizes how computers operate from a theoretical perspective. Fundamental topics in computer science include; theory of computing, analysis of algorithms, compiler writing, and computer architecture.
Software Engineering emphasizes a hands-on perspective for building software systems. Fundamental topics in software engineering include; software requirements, software architecture, project management, and quality assurance and testing.
What ties these two very closely related areas together in an academic setting is the practice of programming. Typically, students who are focusing in either area will spend a good portion of their studies learning to program and solve programming problems. Additionally, both may have courses on programming related topics like operating systems and database systems.
Once they complete their studies, those who have focused on computer science will most likely lean towards positions that allow them to explore the theoretical underpinnings of the science through research. Those who focus on software engineering typically lean towards a position where they can manage, design, build and test software systems.
It is important to point out that the study of one of these closely related areas does not preclude one from practicing another. It is very common that software engineers today have degrees in computer science.
Ultimately, the difference between the two comes down to focus. Computer science focuses on a domain-specific problem and developing some solution based on the appropriate computational theories. In software engineering, the focus is on creating functionally complete software and related activities like designing, developing, testing, documenting, etc1.