(Spelling of page name fixed. -- Would "Pluggable" have been better?)
Create a specification language, perhaps in XML. Expose the parse tree and allow backend code generators to generate target code. CASE tools take over code generation when they are the least capable entity for generating code because they have no idea what is the target infrastructure.
For example, a FSM description can be generic, but the code generated can be customized by target environment. Many high level ideas like timers, message flows, threads, hierarchical relationshipts, etc can be embedded in the FSM specification, but no commercial tool can possibly know what environment the code will run in so the code is worthless. In my FSM generator I have installable code generators for C, C++, and for different OSs and different middleware layers. In my dreams I think developers would work at the specification layer with a few select others working at the code generation layer, much like we do with compilers today. Very few developers generate assembly. Systems are similar enough that a higher level "assembly" language is possible.
See also IntentionalProgramming