In my experience, there are roughly two approaches to teaching (North American) undergraduates to write proofs:
Students see proofs in lecture and in the textbooks, and proofs are explained when necessary, for example, the first time the instructor shows a proof by induction to a group of freshman, some additional explanation of this proof method might be given. Also, students are given regular problem sets consisting of genuine mathematical questions - of course not research-level questions, but good honest questions nonetheless - and they get feedback on their proofs. This starts from day one. The general theme here is that all the math these students do is proof-based, and all the proofs they do are for the sake of math, in contrast to:
Students spend the majority of their first two years doing computations. Towards the end of this period they take a course whose primary goal is to teach proofs, and so they study proofs for the sake of learning how to do proofs, understanding the math that the proofs are about is a secondary goal. They are taught truth tables, logical connectives, quantifiers, basic set theory (as in unions and complements), proofs by contraposition, contradiction, induction. The remaining two years consist of real math, as in approach 1.
I won't hide the fact that I'm biased to approach 1. For instance, I believe that rather than specifically teaching students about complements and unions, and giving them quizzes on this stuff, it's more effective to expose it to them early and often, and either expect them to pick it up on their own or at least expect them to seek explanation from peers or teachers without anyone telling them it's time to learn about unions and complements. That said, I am genuinely open to hearing techniques along the lines of approach 2 that are effective. So my question is:
What techniques aimed specifically at teaching proof writing have you found in your experience to be effective?
EDIT: In addition to describing a particular technique, please explain in what sense you believe it to be effective, and what experiences of yours actually demonstrate this effectiveness.
Thierry Zell makes a great point, that approach 1 tends to happen when your curriculum separates math students from non-math students, and approach 2 tends to happen math, engineering, and science students are mixed together for the first two years to learn basic computational math. This brings up a strongly related question to my original question:
Can it be effective to have math majors spend some amount of time taking computational, proof-free math courses along with non-math majors? If so, in what sense can it be effective and what experiences of yours demonstrate this effectiveness?
(Question originally asked by Amit Kumar Gupta)