A comment on Hacker News is arguing that our self-assessment quiz for computer scientists is in fact a self-assessment for computer engineers since computer science is about computation complexity and not programming. At the same time, a popular article at the Elegant Code blog is arguing that software development and traditional engineering are fundamentally different. Now I am confused because apparently programming is neither a science and nor an engineering. Then what is it? It has to be an art.
Let me start with a comment on the John Sonmez’s post on “Why Software Development Will Never be Engineering.” I think John over estimates engineering. Engineering is not as structured as he assumes it to be. Engineers’ analytic models often fail due to reality and a big chunk of engineering consists of developing solutions in the absence of analytic models. What John describes as engineering is closer to science, and I do agree with him that programming isn’t a science.
Scientists, e.g., physicists, study the nature and this universe while trying to explain why systems behave the way they do. They create theories but they do not create solutions that solve people’s problem. In contrast, programming is about creating new systems, which is closer to engineering. However, engineers inherit some rules from physics which implies that given the same constraints and requirements, two engineers are more likely to end up with a similar solution. Programming is different from both science or engineering: programming has more degrees of freedom and there are no set mathematical rules. I call programming an art for three reasons:
1. The word art literally means skill. Programming is a skill that some of us know and apply. In general, the programmer starts on a blank canvas and uses his/her skill to paint the picture. It is also noteworthy that similar to artists, programmers also improve with experience.
2. To program is human. By definition, science is the study of existing systems while art is something that is created by man. Computers are man built systems and programs are creations of the artists, aka. programmers.
3. There exists style and taste in programming. Different programmers program differently. There is aesthetics involved and there exists tips and tricks that vary from person to person.This man-to-man variation exists because it is an art and involves creativity.
Thus, I argue (and the famous computer “artist” Donald Knuth agrees) that programming is an art, not a science. There can exist a science of an art which tries to understand what the artist has done (computer science in this case) but I don’t think that programming can be dissected down to a science.