1. A method of developing a software application in which a plurality of devices communicate with external systems and services, the method comprising: providing a common code base; describing data and messages used by the application using a declarative data description language; defining a library of system components including a device abstraction layer for interactions between devices and the application and a host abstraction layer for interactions between a host and the application; providing a graphical (GUI) tool to model the workflow of the application, the workflow including screens and services described declaratively by a declarative data description language; and assembling the application using the graphical tool, declarative rules and customizations of system components selected from the library.