Visual tools for designing message or process flows are part of many ESB products. BPM products supporting BPEL or BPMN also heavily rely on visual tools. Flowchart-like visual notation used by these tools represents a specialized language that includes all elements of structural programming ("if-then-else", "while" and so on).

Unfortunately, these languages have very limited support for reuse. Not all such languages support sub-processes (i.e., subroutines). There is no inheritance or extension, in other words, I can't take an existing process flow or message flow and change some of its logic without duplicating the logic of an existing flow. Lack of these facilities makes it difficult to implement complex and reusable process and message flows.

From my experience any real-life process flow is going to be pretty complex. Three-step loan approval process widely used as an example in many different BPEL products does not exist in reality. Real-life business processes include many different activities and involve many different roles. They also have to take into account various exceptions, not just a "happy path" scenario. For example, if a loan application is rejected because of a credit history, a lender can try to offer a loan under different terms.

Also note that there is a difference between using visual tools for modeling and for coding. A model does not have to include each and every detail, its main goal is to convey key ideas; details can be taken care of during implementation. Not so if we want to visually create executable code; in this case all details have to be accounted for.

I am also not convinced that structural programming approach that BPEL and other "flow" languages support is best suited for visual tools. Structural programming constructs replace explicit "flow" represented by "go to". In a visual flow-oriented language, however, "go to" (i.e., explicitly connecting nodes) might be a better alternative.

I also doubt that visual approach works well for code with high cyclomatic complexity (and without subroutines high complexity is almost guaranteed), especially with high degree of nesting. Text-based representation of nested code blocks using indentation could be very compact. This is not the case when each branch has to be presented by its own "flow" of connected nodes.

So I think that text-based representation using a high-level specialized language could be a much better alternative for expressing process and message flows in SOA. This language could be a domain specific language (DSL) or a general purpose dynamically typed language with built-in XML and Web services support and other constructs required for supporting process flow. Syntax of this language should be simple enough and at the same time it needs to have good support for reuse (this may or may not require full OO support).

Visual representation of a program written in such language could still be supported; however I see it as a "report" that could be used to facilitate discussion with business users. Developers should not be required to use visual environment for programming; I don't think it makes anybody more productive relative to text-based approach (unless a flow is really simple). And I'm not talking about XML-based serialization of a visual flow, such as in BPEL where XML is so unwieldy that it is almost impossible to hand-edit it. We need a true powerful "service orchestration" language that will make developers (and business users along with them) more productive.