History
There are several differences between “Computer Science” and “Software Engineering”. Please read previous articles in the SEGVN website. To understand why there are different names we need to go back in history. About sixty or seventy years ago, when computer was still a new invention, only few scientists could use them in the laboratory. At that time, hardware was the most important thing and programming was very difficult to learn. Scientists who program the computer did not follow any methodology but just “do something” that make the computer work. Coding and testing were the main activities and the field was named “Computer Science”.
During this time, due to high demand of people to program computer, universities began to open new department to train software developers for a degree called “Computer Science”. Because this was still a relatively new field, most people who taught computer were mathematic professors, the training program was heavily focus on mathematics.
As computer was “commercialized” to be used in industry, more computers were needed, more computer companies were founded and competition were fierce. With advanced electronic technology in manufacturing, computer hardware costs were going down and no longer the most important asset. On the contrary, software became more important to make computer performed more specific functions. At that time, there were very few proper development approaches, a majority of works were still in coding and testing. Most applications were developed at a very high cost and took longer to build. As software size was getting larger and more complex, many applications were difficult to maintain. Because of the large size of million lines of code, defects were impossible to fix which caused significant high failure rate. As more companies were depending on computer for automation, defects in software applications created lost of several million dollars each year. The situation was called “The Software Crisis”.
The ‘Software Crisis’ was a turning point that made people think seriously about the software development processes. The industry demanded certain solutions to be applied to ensure successful, cost-effective software implementation. Many people began to think about new ideas of systematic development of software that can be deliver on time, on schedule, with high quality and reasonable costs. During this time, many approaches were invented and contribute to the modern and advanced thinking of an “Engineering solution” to the software development process. Engineering is a discipline that exist a long time, it focuses on the application of scientific principles such as logical thinking and designing to practical ends such as building bridges, roads, mechanical machines with significant efficiency and effective. By apply “Engineering principles” to the development of software, a new field was created called: ‘Software Engineering’.
Software Engineering advocates a systematic “Life-cycle” approach in all software development. It shows that software can be built following several phases with guidelines, techniques, and tools to ensure the successful completion of the project. There are many Life-cycles for every needs such as ‘Waterfall Model’, ‘Spiral Model’, “Incremental build”, etc. to make it easier to develop and manage the software. These approaches also help managers understand problems which occur during the development and what to do to solve them. The engineering principle also dictates that the quality of the software product is determined by the process that create the product. By focus on the quality of the process, we can have a higher quality product.
As software became more important in every industry. There were significant higher demands for software engineers and some universities began to offer a new degree called “Software Engineering”. Most people who taught this field were engineering professors so the training program was heavily focus on logical thinking, problem solving, and development process. Since then, software engineering degrees have been established at many universities. Most training programs teach both computer science and engineering principles and practices. The first software engineering Master’s degree was established at Seattle University in 1979 then Carnegie Mellon and Stanford have established themselves as having the best training programs.
Since then software engineering degrees have been made available from many more universities across the world. In Asia, it is still a relatively new field because the traditional academic is slow to adopt changes. In late 1990s, S. Korea was the first country that adopted the software engineering training program, following by Japan and India.
Traditionally, most software people called themselves programmers or software developers. However, in the U.S and Europe, the term “programmer” has often been used to refer to people without the degree or proper education, who are trained from vocational schools for few months and cannot do good quality works. In response, many software people called themselves software developers or software engineers to avoid being “called” programmer. In many U.S companies, the titles software developer refers to people who has a computer science degree and software engineer refers to people who has a degree in software engineering.
Focus & aspects
“Why do I need to study Software Engineering instead of Computer Science? Aren't they the same?
Software Engineer and Computer Science are NOT the same. Each field focuses on different aspects of computing technology and lead to different careers in the software industry. In the past, most software are small and simple, so the focusing is on the “Science of algorithm development” or efficient code to run on computers. For example, storing information or automate a mathematic formula or process. That is why most Computer Science programs require many years of mathematics and several programming languages. Today, software are larger and more complex, so the focusing is on the “Engineering of process management” or efficient software development to solve complex issues. For example, one of the principle of software complexity is: “For every ten percent increase in problem complexity, there is an increase of one hundred percent in software solution complexity. The more complex the problem, the solution will be much more complex than previously thought. That is why you need to “Engineer the process” to solve the problem rather than relying on the “science of algorithm” to create efficient code.
Because the focus is on the entire development process, a Software Engineer will follow a set of rules and principles rather than jumps into a solution (write code) quickly. For example one of the most common causes of projects failure is unstable requirements. A Software Engineer who studies “Requirement Engineering” will know how to review, validate, then prioritize these requirements to ensure that they are well defined and stable enough before moving on to the next phase of design. When move from requirements to design, a good Software Engineer who studies “Architect and Design” will know that beside the defined requirements, there are many “derived requirements.” As a matter of fact, there will be more “derived requirements” than the original requirements and that is why the design phase is often take longer to ensure everything is taken into consideration before moving into the implementation phase.
A Software Engineer rarely works in isolation but mostly in team as software development is always a team efforts. The knowledge and skills of each team member are critical to the project success. (Teamwork is always taught in Software Engineering program but not in Computer Science). Because the most important factor in solving complex problem is NOT the tools, NOT the algorithms, NOT the techniques but rather the skills of the developers themselves. A highly skilled developers can be more productive (up to 30 times better) than a mediocre developers.
Computer science program focuses a lot on efficient code (Algorithm) so quality is mostly about software defects. However, Software Engineering program defines quality differently. Quality is a matter of good design than of good coding. If a project requires high quality then it must be considered early in the development life cycle. Quality is a collection of attributes such as performance, usability, portability, reliability, efficiency, testability, understandability, and modifiability. Software Engineering also believe that quality is not the same as satisfying users, meeting requirements, or meeting cost and schedule targets but they are all related. Actually, user satisfaction = quality product + meets requirements + delivered when needed + appropriate cost.
Computer science program focuses on detection and removal of defects. (Most developers spends roughly 40 percent of their time in testing). Programming and Testing are the important factors in the Computer Science program. Software Engineering program focuses more on the quality of the development process because they believe that the quality of the software product depends on the quality of the process that creates the product. By focusing more at each phase, remove defects at each phase then in the end you will have less defects to deal with. Instead of more time on testing, software engineers are focusing more on inspections, reviews at each phase. (In reality, there is no single best approach to software defect removal. A combination of several approaches, such as inspections, reviews, and testing, is necessary).
Although both programs graduates will start in the software industry in similar positions such as programmers, testers, and technical leaders. Over time, most Computer Science graduates will be working more on the technical side focusing on sophisticated algorithms, scientific methods, formal methods etc. Most Software Engineering graduates will be working on the management side focusing on project management, system architect, portfolio management, and process improvement.