Yesterday I was talking with a friend - also a software engineer - and we got to talking about the weird things users ask for and the even weirder things they do on their own.
For example: I have a user who decided that the best response to any error while creating an order in the system was to delete the entire order and start over from scratch. He would do this even if the error was something like "NZ is not a valid state. Please enter a US state abbreviation."
Another example: He noticed from some logs that the system was rebuilding its inventory very often. This was a process that was intended to happen once a day, and it was happening six or seven times a day. After spending most of a day diagnosing the "bug", he discovered that it was being triggered by a user manually, and the user was doing it early and often.
In both cases, the users were doing things they thought were logical. My user had heard "cancel the order and start over" from support frequently enough that he just stopped calling and started canceling. My friend's user thought he understood how the system worked and was making sure it was right, even though the system worked a different way. They were both completely logical actions on the user's part. They were not very nuanced, but they made sense, once we talked to the user and understood what was going on.
But to get there, you have to know your user. You have to know what they're trying to accomplish. You have to know what they think your software does - even if it doesn't actually work that way. You have to learn what parts of your software are kind of scary and mysterious. Knowing all that will help you understand what they're doing, and how you can help them do accomplish their purpose better.
So riddle me this: when's the last time you talked to your user?