A bad one will make you aware of every microissue their boss has to worry about, and makes you code in some terrible things in order to please them.
A good one acts as a firewall between their boss and their subordinates. Bad ideas from above are pushed back (as much as they can), lots of independent (and usually fairly random) requirements are combined into something logical, and my resulting problem set is something reasonable to create, test, and maintain.
A boss with programming experience will be able to negotiate a deliverable that's internally consistent enough to make for a good product. They do some of the up-front thinking to reduce the problem down before it's even given to me.
A nontechnical boss just sees a spreadsheet of checkboxes that we have to complete. They're like a simple IO controller: send requests, wait for completion.