We've all heard the phrase "software engineering." The question is, does such a thing actually exist? Many programmers say it doesn't. I disagree.
Steve McConnell recently wrote a couple of very interesting blog posts on this very topic. The second was in response to this post. Eric echoes many of the typical "software development isn't engineering, it's a craft/art/form of black magic" arguments. Steve provides what I think is a good rebuttal.
I have a few problems with the typical anti-software engineering arguments. For starters, the "building software isn't like building bridges" line really misses the point. The idea is that building bridges involves repeatable and predictable patterns that allow engineers to accurately estimate project progress, whereas in software, every project is different and hardly anyone ever knows for sure how long things are going to take.
There may be some truth to that, but there's no reason to assume it's due to any inherent difference between civil engineering and software development. Part of it is simply that most programmers don't develop a lot of very similar systems because they don't have to. When you need a new bridge, you have no choice but to build it, but with software, you can just copy and customize.
But really, the reason most software estimates are just wild guesses is not because of the nature of software development, but because most development organizations are miserably primitive and unorganized. To form reasonable estimates, you need historical data. That means you need to track how long each phase of a project takes. Then you can run the numbers for similar projects and come up with a reasonable estimate for a new project. It's not rocket science. It's just that many organizations simply don't bother to do it.
Of course, as Eric mentioned, there is the issue of varying user requirements to consider. The whole reason we have custom software is that users have differing requirements, and so every application is unique in some sense. But if we're going to be honest, that only goes so far. Every custom business application may be different, but there are still a lot of similarities. You have your database layer, your business rules, your user interface, your reporting, and so on. They may never be exactly the same from application to application, but they're usually not fundamentally different. Think steel bridge over a river compared to a concrete bridge over a ravine. They're not exactly the same, but they're still comparable on some level.
Bottom line, software engineering, like "regular" engineering, is about process, not product. Just because you're building something doesn't mean you're doing engineering. A rigorous software development process is the exception in our industry, not the norm. So it's not that software engineering doesn't exist, it's just that the vast majority of the people writing software are not doing it. If you want engineering, head to someplace like Praxis Critical Systems, not your run of the mill .NET contractor.
You can reply to this entry by leaving a comment below. You can send TrackBack pings to this URL. This entry accepts Pingbacks from other blogs.You can follow comments on this entry by subscribing to the RSS feed.