• In some ways the comparison to bridge building is a good one and in others it's a bad one. If the company that was contracted to do the concrete work mixes things improperly, the bridge is going to start falling apart way sooner than it should. Even bridge building can have missing or misunderstood requirements, such as poor capacity planning, or even not understanding the environment that the bridge is built in. (take a look at http://www.wsdot.wa.gov/tnbhistory/connections/connections3.htm)

    On the other hand, building software is often done at a much lower level than building something physical and tangible. Working with assembly language would be like working with individual molecules. Working in something like .Net is better, but still somewhat lower level than bridge building. This is done for flexibility as others have stated, but the ambiguity of having several different ways to do the same thing, poor guidance from Microsoft, and building blocks that don't work in the expected ways leads to poor results.

    When trying to explain to my wife what I do at my job, I told her "one third is trying to find out what people "really" want to do, one third is getting the technology to do what it's supposed to do, and the other third is watching it to make sure it keeps doing what it's supposed to do"