A good professional relationship & a couple of emails is all I need for freelance. If you're talking about a long-term high dollar amount thing then sure, I understand.
& the reason I don't use one is simple -- I have an hourly rate. Whatever contract we come up with would look like this: "__ is my hourly rate. You will pay __ times the number of hours I worked." This has long been established since the first 1 or 2 interactions with any client and I think is obvious for any hourly service worker. Within the tech industry this is even standard for a lot of corporate consultants (I happen to be one).
For freelance, I provide work estimates but things change. All the comments I see on this thread are like "write a change order for each change, make sure you keep a record of scope". No thanks, not for me. I just give estimates, tell the client when we're going over-budget. If they seem concerned we can talk about it if they say "Keep going no worries" then I keep going, no worries.
I'm not at all saying that contracts aren't useful, it's just that the tech industry is really fast-paced and often involves remote work. If you're really concerned about stuff getting ugly, ask for a contract, sure. But I would do contract with 50% deposit because who actually wants to deal with going to court. At least you'd have 50% to sit on & think.
To each his own but I'm a programmer not a businessman. I net way more money streamlining my coding process than I do thinking about stuff like this.