I only know about cloud application "in theory"; I've read some material related to cloud computing but never had access to cloud computing from the point of view of their developer (not of the sysadmin!).
What is specific in developing (not deploying) cloud software in compiled languages (precisely those accepted by recent or near future GCC, so C, C++, Go, Fortran, D, ....) ??
The What is a Cloud-native application question is helpful but not much.
I have read Above the Clouds: A Berkeley View of Cloud Computing, which does not really answer my question (and reinforce my opinion that cloud computing is more a way of deploying applications that of designing and developing new ones). The C++ and Cloud Computing white-paper advocates Casablanca, the Microsoft C++ REST SDK. There is also a AWS SDK for C++.
FWIW, the context of this question is working on a research grant proposal to H2020 call ICT-16-2018 Software Technologies, with mostly static source code analysis in mind. I'm interested mostly (but not only) in HPC and big data apps running on the cloud.
My first impression is that cloud computing is separated in two directions:
medium-scale cloud computing, that is running a program (or a small set of programs) on a known (and rather small and reliable) set of cloud instances, typically a few dozen or a hundred of (perhaps virtual) machines or containers. Then, from the developer's point of view, it is "just" coding a networked application (using decades old techniques like TCP sockets, perhaps with recent libraries like 0mq, etc...). The developer assumes that all instances he wants to are running reliably his code. Hence such development is similar to the development of code written in the 1990s running on a local network of dozen Unix workstations. I would probably give (as program arguments or configuration files) to such an app the network coordinates (IP addresses, TCP ports, ...) of fellow application processes running in the same cloud. So it is like old cluster computing.
large-scale cloud computing, e.g. running something in an entire datacenter or on many thousands of "machines". Then, the architect of the distributed software should take into account that several nodes can fail, and design his application with that property in mind and this require specific architecture, design, and code
the "medium-scale" vs "large-scale" terminology above is probably wrong or too broad. If you know more relevant or precise terminology, please tell.
My feeling is that developing a medium-scale cloud application can be mostly done on a Linux PC (of course full tests should be done on a cloud, but unit tests don't have to); for example an application running on Docker is just an ordinary (batch) Linux app started by specific scripts in Dockerfile, and Docker is mostly something to manage and deploy the application.
I do know however that large scale cloud applications (like the indexing engine of Google) are designed for large scale deployment and takes into account failure of individual instances (but I don't know that well, and would like to read more about that).
I am not sure about cloud applications running on OpenStack, which I don't understand much. It looks like a set of tools to deploy and run cloud applications. So It seems that one can run on OpenStack a cloud app (e.g. its ELF binary), but that it is useful (but not necessary) to add some web or REST services to it which helps to maintain and instrument that app. It looks that it is useful (but not mandatory) e.g. to code some Python or perhaps to design my C++ cloud application for OpenStack as being embedded in Python (so it won't have any C++ main
function, but a small set of C++ functions called from Python scripts?).
I don't understand yet how C++ (or Go) cloud applications for Kubernetes or Hadoop should be designed.
How should C++ or Go applications for OpenStack, Kubernetes or Hadoop be designed and coded? Are they required to follow or provide some specific API, or link some mandatory library, beyond usual practices on Linux? Does the C++ or Go cloud application developer has to care if his C++ or Go cloud app is deployed on Docker, OpenStack, Kubernetes, Hadoop? What does that change in his code?
In other words, if I would be starting a big software project -typically in HPC or bigdata domains- from scratch (with a small team of C++ or Go developers working for several years), what should I be aware of?
A too broad variant of my question might be: how to design and code cloud application in C++ or Go? or what is the essence of cloud computing development in C+++? Is it "just" a matter of e.g. using & providing micro web services (in programming terms, that would just mean using some HTTP server library like libonion and client library like libcurl, by itself not a big deal, or some REST API like pistache), or message libraries like 0mq, or is there something else to have in mind?
Or what is the definition (or decisive characteristics) of cloud applications from the point of view of a C++ or Go developer? How is it different to the developer from cluster applications of the 1990s?
PS. I am the designer, architect and author of GCC MELT, in a lab who develops Frama-C. We are trying to understand what future software engineering tools (notably static source code analyzers) would be needed by cloud software developers.