Saturday, June 26, 2010

Software engineering vs. Computer Science

There is a difference between Software engineering and Computer Science.  Just like there is a difference between Mechanical Engineering and Physics.  I believe that the big difference is that in the physical world, people have been building structures for thousands of years.  The difference between the theory of the physical world and the building of things in it is well defined.  Modern computing has been around for what, 60 years?  We have not yet defined the difference between the theory of Computing and the practical application of it.

In computer science, the task is often to find the best, or most efficient way to perform a task.  Often, Computer Scientists are looking for theoretical limits, or trying to resolve a new computing issue in a novel way.  


In software engineering, you are trying to build a system to meet a need using the tools at hand, given the constraints of your system.  Often this means NOT using the best solution.  It means using the best solution given the constraints placed on your use case.  
As a Software Engineer, this means we do not necessarily build things on our own.  Rather, we evaluate alternatives and select the best one.  One example of this might be Web Frameworks.  Another might be ORM selection (or whether to use either of these technologies at all and actually build our own).   This is analogous to a mechanical engineer designing a car - he doesn't also design the tires, alternator, battery, etc.  Rather he looks at the alternative possibilities and selects the best one for the vehicle he is trying to create.  Of course, there are going to be many areas that the mechanical engineer does build.  


It seems like in software engineering, using other peoples tools is frowned upon.  There is some sort of badge of honor to say, 'I built this myself'.  While it is impressive to have that broad range of skill, does that necessarily make you the best Software Engineer?  


It is my belief that as a profession, we Software Engineers need to start thinking of our task as more of an engineering endeavor and less of computer science endeavor.  We need to see ourselves not as Scientists, but as Engineers.