Zoosh Cloud Native Software Development Logo
Zoosh Cloud Native Software Development Logo

Article

Modernize Your Software with Microservices and Harness the Full Power of Cloud Native.

Gábor Tolnai

As software applications and products grow, and business priorities tend to block keeping up with the changes in technology, it is known that tech debt (in simple terms: not doing things properly to save time, resulting in work to be done in the future) creeps in and accumulates. This debt makes them increasingly difficult to maintain. Breaking up such an application at the proper granularity and with the proper technique can still prove to be economically viable even with a huge debt, especially if it is supported by proven cloud services.

The Tech Debt Spiral

The product becoming more rigid and development slowing down are not the only symptoms of the process of getting into debt.

First, things start to become tightly coupled and changes in a place impacting other places. Later, people will add “clever” solutions to some difficulties caused by this to keep up with development speed, which increases fragility. Introducing such hidden meanings and relationships means the “tribal knowledge” increases, which either slows down development or increases the amount of bugs and makes maintenance more difficult. The tribal knowledge also makes onboarding new people more difficult, so the business relies more and more on current developers. It’s easy to get stuck with the status quo, limiting innovation and not even doing maintenance properly, leading to components and 3rd party elements getting outdated. Eventually, the whole framework or even the coding language may get outdated, and the company will face difficulties motivating current developers or find new ones. The system collapses into a black hole.

Of course individual stories might differ but we have seen this pattern numerous times. As the problem spirals out of control, it becomes more and more difficult to get back on the right track. Dealing with it may be avoidable for some time, but it can’t be deferred forever.

Modernization Techniques

There are, however, techniques that can be applied at various stages of the process to salvage the product. There may be different ways forward - start improving it up bit by bit, swap out some parts with new managed services, separate major pieces but treat them as black boxes first, redesign how internal components communicate with each other, the list goes on. Redesigning and rewriting everything with a big bang is typically a last resort as it is the most expensive (upfront). Most probably the economically viable option will be to set up a modernization program, which can produce result in increments, providing early benefits without an initial huge investment.

In our experience, it has been proven a valid concept for old and new to live side by side during this transition. Besides limiting the cost, the iterative approach de-risks the potential issues of a sudden go-live, and also gives the team time to learn and adapt to the new concepts, languages, frameworks, techniques and services. This is a win-win, because the current team and their product/tribal knowledge is still critical, and this approach will be welcomed as an opportunity rather than as a threat.

The Role of Cloud Native

Regardless of the size of the steps or increments, cloud services can be utilized not to end up in the same situation again. Of course using cloud itself is not enough, as we can run even a monolith in the cloud. But learnings from developing Cloud Native applications (which have been designed to fully embrace cloud services) can be utilized to transition the product into a Cloud Native direction.

Having smaller components separated from each other, having clear responsibilities and looser coupling between them:

  1. Makes it easier to manage the tech debt of the separate individual component
  2. Reduces the impact of something going wrong in one component (blast radius)
  3. Reduces the need for “clever” solutions
  4. With the combination of good software development practices tribal knowledge can be reduced
  5. Makes maintenance, handovers and onboarding easier
  6. Reduces the fear in developers to improve and innovate
  7. Makes it easier for various different technologies, frameworks and even languages to live side by side
  8. Using the right tool for the right purpose and evolve smaller components easier if needed.

Besides having such solutions to the problems outlined earlier, managed services (like a managed database, message queue, monitoring, etc.) can also be used to reduce complexity and the overall size of the product.

Microservice Approach - Not Taking it Literally

There is no one size fits all, the right tool needs to be applied for the job. Stating all big applications should be split up into small “micro” services would be wrong. The amount of functionality (the mass of our system) remains the same, so having a million asteroids flying around instead of a single black hole might make no sense. Instead, the system (either by cautious design or by going through iterations) will end up in components of various sizes. The microservice approach shouldn’t be taken blindly as another extreme, but the concept should be applied the right way.

Eventually, there might even be one or a few central stars (core services/components, like an ERP, a CMS or a main backend service) and a couple of smaller/bigger planets (other services, for example authentication, invoice generation, etc.) in orbit. Some small dedicated satellites (serverless functions dealing with notifications, image thumbnails) may orbit a planet with natural and artificial moons (managed services), and some autonomous asteroids may float around. They may be connected in synchronous and asynchronous inter-planetary radio channels (with service discovery or some kind of middleware, a service bus or message queues).

Containerization is a huge help reaching the destination, but needs to be applied with a smart design to end up having the right solar system, the right granularity of services and the right balance of managed services.

While the analogy with a solar system might not be perfect, it highlights that there are many services and tools in the toolbox when it comes to designing a modern, sustainable IT product or system. We are happy to utilize our Cloud Native experience to help you navigate and evolve your product into it’s next phase of life and grow your teams to learn using and working with modern stacks, development practices and Cloud Native services in the process.