After moving hundreds of products to the cloud, there's one theme our teams see over and over again: products with code bloat because a large chunk of their codebase is unnecessary.
Code bloat is code that delivers non-differentiating functionality - custom work that does not provide a product differentiator. Replacing it with an external provider, such as an open-source library, a SaaS product, or a cloud platform's native capabilities, will provide a more optimal experience.
There's a tremendous amount of efficiency to be gained from aggressively slicing away code bloat. The slim down leaves behind a lean system focused on delivering the features that differentiate your product, without the distraction of commodity functionality. In my experience, there's always more to trim than first assumed.
There are an array of motivations for migrating a system to a cloud platform, but the fundamental purpose is to offload non-differentiating parts of your system. Instead of fretting over the necessary and uninteresting stuff, you can outsource entire workloads and shift focus to your system's core business value.
Most people on the consumer and user end don't care whether or not you run a system in a data center or on the cloud through a third-party provider. Of course, cloud migration is more than just using "someone else's servers." It's a platform that provides numerous opportunities to offload and optimize. If managing physical machines does not provide your business with a competitive advantage, it's favorable to use virtual machine instances instead. It's as simple as that.
The next challenge is managing your databases. Does managing your own databases provide you with a competitive advantage? In many cases it does not. So you can use a managed database service like Amazon's Relational Database Service (RDS) instead. You can apply this same thinking further and further up the stack, replacing custom solutions with SaaS products for capabilities like identity management, content management, payment processing, and much more.
Offloading these commodity aspects of your systems delivers vast benefits - this creates a leaner, more agile product. With less code, you can focus more of your energy on what remains: the differentiating, value-producing aspects, without the distractions of the necessary-but-boring operational noise.
When helping clients migrate or optimize in the cloud, we like to approach this offloading process as a journey with four phases:
I have seen organizations stop at the first or second phase of this journey - far short of realizing the full potential of modern cloud platforms to offload the commodity aspects of their systems.
Moving your services into cloud-managed servers and switching to managed databases is just the tip of the iceberg. It will reduce some operational complexity, but won't make your codebase any more comfortable to maintain or extend.
Once you begin leveraging your cloud provider's higher-level platform capabilities, you can start slicing out commodity business logic, deleting code, and reducing complexity. For example, replacing a system's hand-rolled access control with an external solution allows us to rip out an entire complex sub-system from a codebase. This simplifies every area of the code that worries about access control. Similarly, replacing a custom search solution with a hosted Elasticsearch service can lead to a smaller, leaner codebase, enriched search functionality, simplified operational support, and higher performance and scale.
It's important to realize that if you only go as far as virtualizing your servers and replacing your database with an RDS instance, then you have left a lot of the benefits of your cloud platform lying on the table.
I have found that taking a product to the end of the offloading process journey can reduce millions of code lines, replaced by externally-managed cloud capabilities. This trimming down process transforms a codebase, boiling away the un-differentiating, required-but-boring functionality, and leaving behind only what is essential - a lean codebase containing what's needed to deliver the unique value of your system.
No more, no less.