It is common in the software domain to hear terms such as computer scientist, developer, programmer, software engineer, computer engineer and many more. From my experience, I have noticed there are two terms that people often confuse: Computer Science (CS) and Software Engineering (SE). I frequently hear people using them interchangeably; however, it is incorrect. I did my bachelor's in Computer Science, and my master's in Software Engineering and I can say from first-hand experience that they are not the same thing. Don't get me wrong, both CS and SE belong to the computing domain, and both are important for the development of software systems. In fact, people from each field typically compete for the same job positions. Nevertheless, the focus of CS is different from SE's focus.
While I was studying my master's in SE, I frequently heard other classmates complaining about the courses and being disappointed with the curriculum because they were expecting more programming. However, in most cases, their disappointment and frustration was the result of choosing the wrong degree, which in turn was the result of not fully comprehending what the purpose of SE is and how it differs from other areas of computing such as CS.
The frequent confusion between these two important areas of computing is my motivation for writing today's article. If people are capable of comprehending the difference, they will make a more informed decision when deciding what branch to focus on. Moreover, if people understand the difference, they will appreciate the role that each of those areas plays in the development of software systems.
In case you are not familiar, an algorithm is a set of rules a computer follows to solve a given problem. With that said, Computer Science is the field of computing that focuses on the study, implementation, and analysis of algorithms. A Computer Scientist is interested in studying the theoretical aspects of algorithms, their efficiency, and how to implement them in computer hardware. Additionally, Computer Science also focuses on data structures and how algorithms manage and process data.
From websites like Facebook to critical infrastructure like power plants, software systems play an essential role in our society. To create maintainable and robust software systems, it is vital to understand its life cycle and apply solid engineering principles to the software development process. With that said, Software Engineering is the branch of computing that focuses on applying structured engineering principles to the development of software. The goal of a Software Engineer is to ensure the software under development is a high-quality, maintainable, and robust system. Moreover, a software engineer needs to ensure the system is developed within the agreed budget and time. A Software Engineer focuses on aspects such as software architecture, software internal quality, requirements engineering, and project management.
Since both CS and SE are branches of the computing domain, it is expected that specific courses will overlap in each field. Some examples of overlapping courses include Databases Design, data structures, and Algorithm design. On the other hand, some courses are typically mandatory in one field but not in another. Example of classes that are mandatory in a CS degree includes Operating Systems, Object Oriented Design, Discrete Mathematics, Computer Networks, and Computer Architecture (not to be confused with Software Architecture). On the other hand, courses that are mandatory in the SE degree includes Software quality, Requirements engineering, Software architecture, model-driven engineering, project management, and software testing.
Most universities are flexible and allow students to take elective courses from other fields. So, it is common for students from the CS department to take classes from the SE department and vice versa.
I always say that people do not need to study Computer Science or Software Engineering to create an app or a website. Anyone can easily learn a programming language syntax and start writing code. It is no secret that the internet is full of resources for anyone to get started. Nevertheless, creating a mature and robust software system is more than learning some arbitrary programming language.
I believe it is essential for people who create software systems to have an understanding of both fields. For example, on the one hand, the CS knowledge that allows you to think critically and abstractly when creating algorithms, analyzing their efficiency, and choosing appropriate data structures for the different scenarios. On the other hand, the SE knowledge allows you to think beyond code and understand that all programming decisions have an effect on the internal quality and architecture of the system. Moreover, assuming you are building a market-driven product, it is essential to take into account constraints such as time and money and how each programming decisions affect those resources.
We have to be realistic, not all developers are interested in managing software projects or dealing with customer and their requirements. Nevertheless, I believe that a developer who is capable of understanding beyond the code and comprehends how his/her programming decision affect the quality and architecture of the software is more valuable than one who is only interested in writing code and making it work.
CS and SE are both branches of software development. It is critical that people in each field know the basics of computing, algorithms, architecture, and quality. Although CS and SE are used interchangeably, their focus is different. I believe it is essential to have knowledge in both areas in other to have a good understanding of software systems. So, which one is better? None. They are different fields of computing that complement each other and are both essential for the development of software systems.