The Importance of Engineering in Undergraduate Computer Science Programs

September 17, 2009

Recently I’ve been thinking heavily about the Computer Science program at Tech due to a number of changes that are quickly making their way into the curriculum. One of the more interesting decisions for changing the program that the Computer Science Department at Virginia Tech made was moving the Department into the College of Engineering. While the full potential of this move has not yet been realized, it was a move that has tremendous advantages for not only the department and its students, but also the industry and academia on a whole.

The advantages gained from such a move primarily surround the principles of Software Engineering. Software Engineering is a term that unjustly gets little to no credit among academics in the field. A large number consider it to be an abomination of sorts with no real meaning or value. They take it to be just one of those buzz words that is thrown about these days as “Web 2.0” and the like have been in the past. The fact of the matter is Software Engineering is a term that is far too often overlooked, particularly in academia, which is a trend that needs to stop if we would like to see growth in the field of Computer Science on a whole.

The industry has changed substantially since the early 1960s. We are no longer in an era where the field of Computer Science is completely dissociated from the rest of the world. Every business and organization out there sees the tremendous amount of value in having technology available to make jobs more efficient by increasing productivity through the elimination of complex or tedious tasks from the agendas of workers. It has thus become more important that the gurus of the Computer Science field fall into professions that require they understand business and customer needs. The backbone of our economy lies on the efficiency and productivity of our businesses, and by transitive property, at the fingertips of those gurus.

All this being said, it is a wonder that members of academia refuse to accept software engineering as a part (let alone a major component) of the Computer Science discipline. In fact, there are a number of papers and articles that have written off Software Engineering as a “pseudo science”.  In his article titled “What Is Software Engineering”[1], William Curran, an Associate Professor of Computer Science at Southeastern Louisiana University, states, “A software engineer is no more an engineer than a novelist is a word engineer.” This statement is wildly false. An explanation of this claim requires an answer to the fundamental question that Curran asks in the title of his article; what is software engineering?

Providing an answer to the question on what Software Engineering actually is requires a firm definition of what engineering is in its broadest terms. Engineering is a multifaceted discipline in which science and mathematics are applied to practical problems. This definition states in a fairly explicit manner that engineering is applied science. As software is a product of Computer Science, Software Engineering is unquestionably the application of Computer Science to practical problems. It is important to define Software Engineering deliberately in terms of Computer Science in order to establish Software Engineering as subset of Computer Science. Establishing this hierarchy prevents the “tainting” of the field that some believe occurs when using the term Software Engineering.

This structure leaves us two branches of Computer Science. One branch is for those who focus on theory and dive into research developing the foundation that is Computer Science, while the other branch focuses on the more practical side of the field. A more complete understanding of this requires a more in depth look into what a Software Engineer actually does. A Software Engineer is one who develops software to make something more efficient or to solve a particular problem that could not feasibly be solved by a human in a reasonable amount of time. It would be a false assumption to say that the Software Engineer just jumps straight into developing this software. That is what “code-monkeys” are for.  The engineering part of the Software Engineer’s job is to define and solve a problem. This is done through standard engineering methods, which include defining the problem, designing a potential solution to the problem (without actually implementing), considering the implications, and redesigning the solution until the best possible solution is reached.

A Software Engineer does all of these things the same way any other engineer would: by reaching back to the science. There of course factors beyond the pure science that the Software Engineer has to consider such as risk management, and human interaction, but this is no different from a Chemist designing a vaccine to cure a particular disease. At the end of the day all of these products are meant to benefit people, and if there is more loss than gain, then the engineer has failed in solving the problem they sought to tackle. Software Engineering is therefore not a pseudo science, but a practical science. Every technique that a Software Engineer employs to actually develop the software and solve the problem at hand reaches back to the science. It does not cheapen the work of those in the field of Computer Science or the field itself, but in fact enhances both. Knowledge without application is useless. This is not to cheapen the value of the Science by any means. Software Engineering depends on the Science, but the Science also requires some form of application to be beneficial.

The flaw in most Computer Science programs is that they produce two types of students: Students that can code until their fingers come off or students that appreciate the value of the theory and research and decide to continue developing the field. There is absolutely nothing wrong with these two products, but the fault is these programs lack the creation of a third type of student. That is to say they do not create Software Engineers. The value in a Software Engineer is that they can efficiently solve problems and implement them. You can give a developer any specification for a product and they can churn out code and produce a product that works, but it is the Software Engineers that you can hand a problem and leave it to them to develop a specification for a product and implement a solution that not only works, but works in the most efficient manner.

A significant number of undergraduates who receive their Bachelor’s Degree in Computer Science will head straight towards the industry. At current, the industry is flooded with developers who write brilliant code, but lack the ability to solve the problems that industry hands to them. The System Architects and other positions of the like are reserved for those who have gone on to higher education and received their Masters or Doctorate Degrees in Computer Science because they are the ones who know how to solve problems. Computer Science programs at Universities need to shy away from this trend. Every single Computer Science graduate, whether they are in an undergraduate program or a graduate program should leave with the ability to not only develop software, but also solve problems. This is achieved by teaching engineering methods in CS Programs.

Some would argue that this would flood the market with a number of Engineers who disagree on ideas or cheapen the value of a graduate degree. What it actually does is provides greater opportunity for advancement in the field of Computer Science. The more challenges that are solved, the harder the challenges become. Having great minds in the industry allows for the potential of these challenges being solved. Additionally, facilitating an engineering mindset throughout a Computer Science curriculum will also increase the number of students who remain on the side of academia due to their commitment to tackling the most challenging problems that the field faces at any given time.

Simple changes can be made to Computer Science programs to focus more on the practical application of the knowledge gained through analysis and research. Furthermore, an engineering approach to research and analysis enhances the value of the knowledge obtained. If members of academia remove the mindset that applying engineering methodology to Computer Science devalues the Science, the programs will begin to produce better engineers to face not only the problems of today, but the problems of tomorrow as well. The Computer Science Department at Virginia Tech has made a great first step in this direction, but there needs to be more of a movement by the entire academic community for the benefits to truly be realized.