Software development -- Engineering or Art

About two weeks ago I did another session of my two day class on designing .NET Class Libraries for internal folks mostly building WinFX and similar frameworks. You can find notes from past sessions here, here, here, here, here, and here. The two things that I get the most personally value out of teaching the class are hearing the questions from those taking the class and listening to some of the super smart and experienced folks that come in and “guest lecture” on particular topics. Two of my favorite folks “guest lectures” came up this time: Rico Mariani, CLR perf architect and Jeff Richter, noted author and industry pundit. They each know a TON about the CLR and have each been working in the software development industry for ages. So you know when they disagree it will be a good meaty issue.

Rico spoke early in the class about, you guest it, performance. If you have been reading his blog you have a flavor for what he said. My takeaway from his presentation was that if you do not have some kind of ballpark idea how fast your solution needs to be for customers then you are NOT doing engineering.. you are playing craps, gambling with success or failure. If you are willing to have a feature at any price then you are not engineering, you are dreaming. He made a great analogy from the construction industry. The folks building a bridge know how much load the bridge needs to handle and how much it needs to cost. They know when to use steal vs aluminum, they know all about the properties of their materials (the tensile strength, the melting point, etc). They know when to use bolts or screws. They know where to find the best deals on steal. His point is, I think, do we know that much about the material we use to build our apps – in most cases that is the framework.. Do you know when to use a stuct of a reference type, when to use ArrayList vs. Array? Etc. Engineers would know that kind of stuff.

Jeff batted cleanup for me. He took an hour of Q&A at the end of the two days. I find it very useful to have place to punt hard questions to do. Jeff did a great job bringing his customer experience to bear in many of the answers AND he and I even agreed 90+ percent of time ;-). (It was very entertaining for the audience where we didn’t.) In the response to some question about API design Jeff made the point that API design has a large element of art to it. That is, try as hard as we might, we cannot distill what good design IS in all cases. There are still tons of areas where subjective elements such as good taste come in to play. Where we cannot articulate the concrete reasons why one design is better than another, but we “just know” that it is. Jeff even made the point that software development is more of an art than a science.

Many in the class immediately caught the apparent disconnect between engineering and art. And I did as well… The problem I have is that I agree with both of these guys. Both views of the world resonate with me and I can clearly see how they are both right. I have spent sometime recently thinking about this in more depth, and I think I know how to rationalize their views, but I’d like to get your take… Is software development a discipline of engineering or a discipline of arts?