Normal practice is to use case studies, construct work- and data-flows, etc. But this does not necessarily create a shared vocabulary between the user/sponsor and the analyst-designer: one or the other, both normally, will have to acquire terms and views of the "internals" of the others area of expertise, and this usually leads to misunderstandings and meetings-to-clarify (enter RAD-techniques like Evolutionary Prototyping), etc.
The user/sponsor is focused on his/her needs/environment, and does not want to, nor should be forced to acquire, from their perspective, unrelated 'programming terminology'. The responsibility to learn a new environment lies with the analyst/designer(/programmer).
How do you overcome the learning curve? What works for you when you are faced with a user who wants a software solution?