I've had many conflicts with product managers, especially when I was leading my first programming projects. Most of these were my fault due to my inexperience and love of confrontation. But many conflicts were also caused by the product managers I collaborated with who were similarly inexperienced. I believe preventing these conflicts is something everyone needs to learn regardless of their role.
The lesson is this: Discussion between product and engineering is not a debate, it's a dialectic. That's a classical concept defined by Wikipedia this way:
The dialectical method is discourse between two or more people holding different points of view about a subject, who wish to establish the truth of the matter guided by reasoned arguments.
In classical philosophy, dialectic is a form of reasoning based upon dialogue of arguments and counter-arguments, advocating propositions (theses) and counter-propositions (antitheses). The outcome of such a dialectic might be the refutation of a relevant proposition, or of a synthesis, or a combination of the opposing assertions, or a qualitative improvement of the dialogue.
Contrast that to debate:
In its original meaning, the term dialectics is not synonymous with the term debate. While in theory debaters are not necessarily emotionally invested in their point of view, in practice debaters frequently display an emotional commitment that may cloud rational judgement. Debates are won through a combination of persuading the opponent; proving one's argument correct; or proving the opponent's argument incorrect.
Dialectics are logical, not persuasive through rhetoric. In a dialectic there is no loser. In a dialectic you can play devil's advocate without seeming overly negative. It's weird compared to everyday communication, but it works well for the goal of making users happy.
So remember: Next time you find yourself in a debate, choose to have a dialectic instead. It's not easy, but it's always worth it.