I work at a software company where we've been developing a pretty sizable ERP (Enterprise Resource Planning) system. The office is an open layout, we all have our work stations, but there is no private office, so we can pretty much hear everyone's conversations.

Today, one of my coworkers got on the phone for a support call for our software. He had the customer on speakerphone. The customer was explaining something that he was trying to do, that we had not yet implemented in our software, and the conversation went as follows:

Developer:
That's something that is on our feature request list, it's a pretty sizable feature, it'll take some time to complete.
Customer:
So, can you have that done by 4pm today?

First thing to be aware of, the customer said with all seriousness, and when our developer was referring to the sizable feature, we had estimated a modest 40 hours of development time for that feature. There was definitely some humor in that in our end, wondering "How could he have even thought that?"

This particular conversation illustrates the disjointed relationship of "real world problems and solutions" and the process it takes to turn that into software. As humans, we have certain innate abilities that allow us to problem solve. As a developer, we need to make sure the software handles as many of those steps as possible.

One example would be to look at a set of data and be able to analyze what is good and what is bad. Now start asking yourself, "How am I determining whether this is good or bad data?". Next try to generalize that so that the same set of rules applies to every piece of data in that category. It's not always that easy.

Without going into a bunch of theory and programming language pseudo-code, I hope this gives you a level of patience next time you talk to customer support for the software that you're using.