I have come across many a developers who were seen to have blank face when talked about the fundamentals on how to design and develop cloud ready applications. Taking a step back, most of them are still unaware of what is meaning of cloud computing and, do they require to acquire one or more specific skill sets to design and develop cloud ready applications? In short, a cloud-ready applications can be developed using any programming language. All that is required is to keep in mind few design and development fundamentals in this relation. By the way, as per the technology trends for 2014 published by several analysts, it is high time that developers should get hang of cloud computing fundamentals as they would be required to consider the cloud while design and developing applications.
Let me try and articulate some of the cloud computing fundamentals and design and development fundamentals to keep handy while working for cloud applications, or while planning to deliver cloud-ready applications.
Cloud computing can be talked in terms of following three topics:
- Key characteristics
- Classification (types of clouds and related details)
- Service models (SaaS, PaaS, IaaS)
For newbies developers/testers, what may be of interest is to learn the key characteristics of cloud, and different kind of service models from concept perspective vis-a-vis design & development tips & techniques. Let us see what developers/testers could learn to take appropriate care in their day-to-day development & testing.
What Developers Could Learn?
In terms of understanding following key characteristics of cloud (private, public etc), following could be kept in mind while designing and developing applications and their modules/components:
- Rapid Elasticity:The sub-systems should be designed, developed and deployed in a way that the underlying resources used by the systems can be increased (provisioned/added) or decreased (de provisioned/removed) based on the required usage of these systems. This requires the design to accommodate high modularity. This essentially means that one should follow/focus on design principles such as separation of concerns and SOLID (especially, single responsibility principle) to design, develop and deploy highly modular systems. In addition to that, every sub-system could have well defined APIs in order to interact with other sub systems. One of the deployment models could be to deploy these sub-systems with well defined APIs into separate boxes (VMs) with well-defined resources (in-memory, CPU etc) and, have them interact using APIs.
- Resource pooling: The system and its sub systems should be able to support the resource pooling such that they should be provisioned/de-provisioned with additional resources as and when required. When talking about the support for resource pooling, the key thing to keep in mind is primary two cloud services models such as Software-as-a-service (SAAS) and Platform-as-a-service (PAAS). In SAAS model, the same application may be serving to different organizations needs. This is also termed as multi-tenancy. While working with SAAS model, it is important to put a nice multi-tenant design in place such that a pre-determined set of resources could be provisioned/de-provisioned to make the most economical usage of the cloud resources. Each set of users (belonging to different organizations) can be assigned their own set of resources and provisioned accordingly independently of others. However, this is not possible until the application is designed and developed based on well-thought out multi-tenant design principles. Thus, developers/architects may need to keep this in mind while putting design for the applications. Another important aspect of the resource pooling is the notion of designing and developing high-performance systems. This is because the resources would be unnecessarily wasted if the applications is poor with performance.
- Broad-network access: One of the other important characteristics of the cloud application is its ability to be accessed using different channels such as web (desktop), mobile devices, APIs etc. To make this happen, the system and its sub-systems has to be API-enabled such that the applications could be easily provided with different front-ends such as that for web, mobile devices or simple partner APIs.
- Ability to be measured: One of the key characteristics of the cloud applications is its ability to be measured in terms of resource usage. This could be best achieved by designing and developing a modular systems and sub-systems such that each of them could be assigned with a pre-determined set of resources that could be provisioned accordingly based on the demand of the service which is determined based on the measurement of the usage of the resources.
To summarize, following are top 6 key considerations for designing and developing cloud or cloud-ready applications:
- Software Quality Characteristics
- Performance (query optimization etc): This is for effective usage of resources & resource pool
- Security as same applications is used by different organizations in case of SAAS model.
- Availability as different sub-systems can be provisioned appropriately for high availability.
- Design Principles
- Design principles such as separation of concerns, SOLID (single responsibility etc) principles etc. This is for modular design.
- Multi-tenancy for SAAS based applications
- API-enabled applications