Building a program vs. a house
To bridge the gap between our computer scientists and our non-scientist clients, let's compare programming a software application to building a house.
The two are similar in various ways. Estimates are made, plans are drawn up, and activity commences. Some things will progress more or less smoothly than anticipated. Sometimes a vendor will make a change that impacts the project (such as a Microsoft update or an increase in the cost of lumber).
Yet programming is different from building in various ways. For example, web applications can be pulled up in different browsers, which can cause different effects. Imagine a house that can appear in a swamp that can also appear a dessert. The house needs to be built to handle both environments and sometimes there are changes that are not foreseen--especially when the creators of the environment/browser make changes, such as IE7 and IE8.
Further, if you add an extension to a house, the functionality of the main part of the house is not affected. However, adding an extension to an application can affect the main functionality of the application. As a software development firm, we do what we can to handle any changes, and appreciate the support of our clients in verifying that there were no unexpected changes.
It is the builder's responsibility to find out what the client wants and provide the product. It is the client's responsibility to communicate what's wanted and verify completion. Let's imagine a scenario in which a client had a house built, moved in, and then realized that another bathroom is needed. The client may go back to the builder and ask for another bathroom, yet the client must realize that the house is complete and this is a new project--in other words, it will generate a new estimate and bill. (It is not reasonable to expect that the builder will continue to make improvements to the house for years afterward without compensation.) Adding a bathroom might be a small change, if the plumbing and space is readily available; yet this might be a large change if it requires a significant extension of the plumbing as well as the roof line.
Similarly, at the completion of a programming project, the application is functional and verified by the client. Thereafter, any changes come with a new estimate and bill. Making a change can be large or small depending on how the application has been architected. Since these changes are not visual, it can be difficult to understand the impact on the application, but the concept is similar to the roof line of a house.