Слушайте проблемы, а не решения. Многие клиенты любят рассказывать вам, как решить их проблемы. Не слушайте их. Вы программист, и ваша работа - находить решения проблем. Вместо этого послушайте, какие проблемы возникают у клиентов, и найдите лучший способ их решить. Как уже говорили другие, клиенты сами не знают, чего они хотят; иногда нужно сначала показать им это.
Задавайте вопросы. Когда вы закончите задавать вопросы, задавайте еще. Клиенты редко сообщают подробности, поскольку они не задумываются об этом. Единственный способ получить нужную вам информацию - это выбить ее из них.
Оформляйте все в письменном виде. В зависимости от ситуации с клиентом, это может быть очень важно впоследствии, когда он начнет жаловаться, что то, что вы предоставили, "не то, что он просил". И если ничего другого нет, то составление подробных спецификаций поможет вам убедиться, что у вас есть вся необходимая информация, и поможет устранить двусмысленности между вами и клиентом.
Общение - ключевой момент. Не просто поговорите с клиентом, получите информацию, набросайте код и не разговаривайте с ним, пока все не будет готово. Всегда поддерживайте связь с клиентом. Задавайте вопросы на протяжении всего процесса. Показывайте им прогресс, которого вы достигли, и получайте обратную связь. В конечном итоге это облегчит жизнь всем.