As a software developer, you're really in an unusual position. On the one hand, you have to know computers, computer languages, developing tools, protocols, etc. On the other hand, you have to know your client's job, or in most cases, learn the client's job.
The computer stuff is simple. Yes, I said simple. Computers are logical, dare I say predictable. With them, the surprises are of your own making. You live and die by your competence or lack thereof.
Client's are the exact opposite, and sometimes clients are trying to solve a problem that they themselves have little experience in. Learning their needs can be challenging even with the most prepared client.
Today, I had a response from a client on the project that has cost me so much time the past few weeks. About 8 hours of that time was spent on a specific interface, a shipping tracking interface. The client modeled a single shipment per order requirement for us, but the whole of the project calls for a lot of large quantity, business to business orders. As a result, a more complex shipping model is required, and that's what I delivered.
The client's response to seeing the implementation? "Should I ignore the shipping section for now?" Wow...guess that 8 hours trying to save the client from a change order 6-9 months down the line was well spent on my part.