Tuesday, March 6, 2012

Software Engineering is not Computer Science.

I have been tweeting about this a lot since the last few months. However, through sources such as recruitment portals, I have noticed that many people still do not understand the difference between computer science and software engineering. First, to clarify the difference between engineering and science:

A scientist invented the wheel. An engineer put four of them together and invented the car.

Scientists will focus on specific aspects to gain a deeper understanding of the subject and in the process discover new things or invent a new primary artifact. Engineers, however, will use this knowledge and artifacts to build complex systems which can be put to use directly. Both domains are equally important but we must understand that while one is deep, the other is wide. Sciences are verticals while engineering is an all-encompassing horizontal.

Similarly, when we think of computer software, we must understand the difference. Computer Science gives rise to the verticals while software engineering is how we integrate these different technologies to build the software product. 

Here goes my controversial statement for this entry: “To a good engineer, technology is disposable.” This means that, for building a car, you may use one type of wheel for one but easily feel that another type of wheels are better for another car. This factor is very important in software engineering. But first, what is software engineering?

According to the 2004 Guide to the Software Engineering Body:

Software engineering (SE) is the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software, and the study of these approaches; that is, the application of engineering to software.

Too technical, eh? Well, basically a software engineer will choose the best practices and the best tools needed to build useful software. Tools may include: Process standards, design standards, software architecture standards, programming languages and testing standards. Yes, I said programming languages. A lot of importance has been placed till now on the individual knowledge of programming languages. However, to a real software engineer, languages are mere disposable tools. This is where one of the most important aspects of software engineering comes up: learnability. 

I emphasize on the fact that technologies get outdated because of innovations by computer scientists. However, a software engineer must adapt to these technologies and use them as tools to build software. One does not code/hack/develop software; one builds it. 

I hope I have brought out the basic differences here. Soon I will update with topics such as how Software Engineering relates to other fields such as Business Management and Psychology.

Feel free to criticize/comment. However, please maintain decorum with the words used.