I think in general it is very difficult to have two groups of separate people, one who understands the problems, and another who understands how to write code.
IN theory you let the users write down a list of specifications, but it rarely works into problems. You always run into trade-offs and conflicts involving functionality vs complexity for example, only somebody who understands both the software and the problem situation can resolve this well.
I agree with you that the best solution is to have the users learn how to code, or possibly let the coders learn how to run the business. Unfortunately I think it is rare to find the right combination of talent. And certainly users without coding talent are not going to declare themselves incompetent to manage in business with increasing software content. And coders are all too comfortable letting somebody else specify what to code and not taking ownership for a product that actually adds value.