Modern applications no longer run on ‘a computer’ but are intrinsically distributed: they run on multiple machines at the same time (e.g., Google Docs partially runs on your laptop and in the cloud). It is a fact of life that these constituent machines are very heterogeneous in terms of processing power, mobility, sensing capabilities, connectivity, etc:
‘Machines’ can be sensors, actuators, laptops, smartphones or even clusters of machines themselves. Writing ‘an application’ on top of such configurations is enormously complex. Moreover, in a world of online payment, cryptocurrencies and sensitive (e.g. health-related) data, more and more applications need to be ‘non-negotiably reliable’: they should never crash, leak data, exhibit unsafe behaviour, etc. Constructing reliable heterogeneous applications using existing programming languages and development tools is nearly impossible. The heterogeneity of the nodes requires a combination of programming ‘paradigms’ (e.g., reactive vs. imperative), communication paradigms (e.g., push vs. pull), coordination paradigms (e.g., message vs. replication-based), consistency techniques (e.g., strong vs eventual), etc. Each of these ––often, radically–– different ways of coding engenders its own sort of bugs and maintenance issues. Combining their use within existing software development platforms is a nightmare and guaranteeing the reliability of such combinations (dynamically or statically) is impossible today. Instead of tackling the heterogeneity in an existing mainstream language (e.g., JavaScript), this research programme faces the problem head on by investigating new foundations for reliable multi-paradigm network-centric programming.