Category: Uncategorized

Key Roles to Hire for an App Modernization Dream Team

For many companies today, modernizing their legacy apps is a top priority. They recognize that although those apps are critical to their business operations, they’re also major hindrances to the organization’s ability to keep pace in its marketplace. 

That’s because legacy apps, which are typically structured as monolithic architectures, are very difficult to update to meet the rapidly changing market and technological demands that characterize today’s commercial landscape.

In response to that challenge, companies are mounting projects to modernize their legacy software. But modernizing a suite of legacy apps is not a quick and easy process, and finding workers with the requisite skills and expertise to staff such projects can be difficult. 

In fact, two recent surveys found that a shortfall of skills and expertise was one of the top reasons why application modernization had failed at their organization. What are the skills required for building an effective app modernization team? To answer that question, let’s start by looking at the application modernization process.

What Application Modernization is Really All About

The goal of application modernization is to restructure a monolithic legacy app from an isolated, stand-alone codebase that doesn’t interact easily, if at all, with the modern cloud-centric ecosystem, into a microservices architecture that is cloud-native in its capabilities. How is that restructuring accomplished? A report from Capgemini describes the process this way:

Modernizing means transforming existing software, taking an agile approach to development across people, processes, and technology, and embracing cloud-native development, including microservices and containerization, hybrid cloud- integration, and agile and DevOps methodologies.

The key phrase in this description is “taking an agile approach to development across people, processes, and technology.” A legacy app modernization team should be organized according to the Agile/DevOps methodology that characterizes the modern approach to software development.

Deciding Your App Modernization Objective

Application modernization involves refactoring or rearchitecting the monolith into a set of small, autonomous microservices.

Companies have sometimes attempted to gain the benefits of modernization by simply migrating their legacy apps, with minimal changes, to the cloud. That approach is simply migration not modernization and has proven to be ineffective: as a report from Google explains,

“Although CIOs have successfully migrated some applications to the cloud, according to a McKinsey study, around 80 percent of them report that they have not achieved the agility or business outcomes they sought from application modernization.”

Migrating an app to the cloud can, by itself, provide some benefits, such as DevOps improvements in deployability and security along with shutting down data center resources. The problem is that the migrated monolithic application remains monolithic and continues to suffer from all the deficiencies of that architecture. Migration alone achieves little in terms of achieving cloud benefits such as increased scalability, development velocity, and reduced technical debt.

That’s why full modernization is accomplished by refactoring the app into microservices. The app is thereby transformed into a cloud-native architecture that’s easy to update and that can integrate with and take full advantage of the technologically advanced resources available in the cloud.

Related: Cloud Modernization Approaches: Rehost, Replatform, or Refactor?

App Modernization Team Requirements

The fact that microservices are designed to operate independently of one another has a major impact on how application modernization teams are structured. That’s because of Conway’s Law, which was first articulated by software expert Melvin Conway in 1967:

“Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization’s communication structure.”

The implication of Conway’s Law for app modernization is that an organization that aims at producing small, autonomous, independent microservices ought to be structured as small, autonomous, independent teams. 

If the organization adopts a different structure (like, for example, the large integrated teams normally used with monolithic apps), the product they produce will reflect the way the team is organized, whatever the intent for that product may have been. As software engineer Alex Kondov emphatically warns,

“You can’t fight Conway’s Law… Time and time again, when a company decides that it doesn’t apply to them they learn a hard lesson… If the company’s structure doesn’t change the software will slowly evolve into something that mirrors it.”

Domain-Driven Design (DDD) in App Modernization

Application modernization teams formed in compliance with Conway’s Law will each take full ownership of one or more microservices. But what should be the scope of each of those microservices, and therefore of the team that supports it? Tomas Fernandez of Semaphore provides a useful answer to that question:

“Domain-Driven Development allows us to plan a microservice architecture by decomposing the larger system into self-contained units, understanding the responsibilities of each, and identifying their relationships.”

DDD helps you to identify the functional domains and subdomains in a monolithic codebase and draw boundaries around each function that will be implemented as a microservice. It also allows you to employ key modernization best practices such as the Strangler Fig Pattern to carefully shut off old functions and domains in the monolith as new microservices replace them.

Related: Organizing and Managing Remote Dev Teams for Application Modernization

Key Roles in Modernization

Jason Smith, Chief User Experience Officer at dotCMS observes that,

“Agile Development, which some refer to as ‘DevOps’, means having a number of small teams working on individual, smaller projects so that those projects are able to get a team’s undivided attention. This enables the individual projects to be completed quicker. Microservice architecture fits into this development model perfectly, as each small team can own and focus on one service.”

Because the process of restructuring a monolithic codebase into microservices fits “perfectly” into the Agile model, we’ll look to that model to identify the roles you’ll need to fill for your app modernization dream team.

  1. Corporate leadership – May include an Executive Sponsor who will provide both the budget and overall guidance for the project, as well as other leaders such as the CIO.
  2. Product Owner – Sets requirements for the project from the viewpoint of the customer. This role, which typically is filled in-house, assigns team roles and tasks and takes full responsibility for the success of the project.
  3. Project Manager – Responsible for the day-to-day operation of teams. Provides leadership for team members, defines goals, oversees progress, and ensures that budget and schedule milestones are met.
  4. Modernization Architect – Translates business requirements into technical deliverables. Responsible for defining the microservice architecture the team will implement and for ensuring effective integration of the modernized app into the cloud environment.
  5. Legacy App Expert – Has the skills needed to analyze the app to understand its functionality and the internal and external dependencies that must be accounted for when it is restructured into microservices.
  6. Senior Developers – Individuals who have the normal range of software development skills that allow them to function as, for example, front-end or back-end developers or UI/UX designers.
  7. QA Engineer – Responsible for defining comprehensive test coverage to ensure that each microservice and the restructured app as a whole function as intended.

Each microservice team won’t necessarily have all of these roles—some, such as corporate leaders or developers who analyze legacy apps, may work with several or all of the teams. Also, on small microservice teams, several roles may be filled by one person.

How Do You Find the Talent You Need?

The first question is, to what degree can you tap into your existing staff to fill the roles required for your modernization project? To answer that question, you’ll need to assess what skillsets are available in-house and whether any that are lacking can be supplied through training.

If you do have to go outside to find the skills or expertise you need, be prepared to face some challenges. The U.S. is currently experiencing a shortage of more than a million software developers, and even if you can find them, they’re hard to keep. One recruiter, DaedTech founder Erik Dietrich, declares that,

“The only way to find software developers is to go prying them loose from other firms.”

And there’s an additional challenge when you’re staffing an app modernization project: many developers just don’t want to work on legacy code. According to one survey, 78% of developers say that “Spending too much time on legacy systems” has a “negative impact” on their personal morale.

Automation Can Minimize Your Need to Hire

Legacy monoliths may contain tens of millions of lines of code and thousands of classes. Having developers manually conduct the comprehensive static and dynamic analyses necessary to uncover all of the app’s functions and dependencies can be extremely time-consuming, error-prone, costly, and from the developer’s point of view, boring. And the process of decomposing the codebase into services and reimplementing them as microservices is similarly fraught.

But an AI-enabled, automated modernization platform can perform those chores accurately and comprehensively in a fraction of the time a human would require. With that kind of assistance, not only will you need fewer new hires for your modernization efforts, but you’ll also boost the morale of your existing workers by releasing them to spend more of their time on exciting innovations rather than on decidedly unexciting legacy code.

The vFunction platform employs sophisticated AI capabilities to quickly and comprehensively analyze complex monolithic applications to uncover hidden functionalities and dependencies. Plus, it can automate about 90% of the process of restructuring a monolithic codebase into microservices.

To see first-hand how vFunction can help you build an effective modernization team while minimizing the need to hire new development talent, request a demo.

Eliminating Technical debt: Where to Start?

This article is the first in a four-part series. In part two, we’ll explore the challenges in navigating the cultural change of modernization. Part three will delve into sustaining the resulting transformation. We’ll wrap up in part four, as we discuss evolving toward modern-day technology goals.

At its most basic, technical debt represents some kind of technology mess that someone has to clean up. In many cases, technical debt results from poorly written code, but more often than not, is more a result of evolving requirements that existing technology simply cannot keep up with.

Technical debt can accrue across the technology landscape – and we could even argue, extends beyond technology altogether in other areas of the business, for example, process debt.

Within the technology arena, technical debt breaks down into two basic categories: infrastructure and applications.

Compared to application technical debt, reducing infrastructure technical debt is the more straightforward. Application technical debt, in contrast, is a knottier problem, because there are so many places that technical debt can hide in existing applications.

Simply identifying this debt is challenge enough. Prioritizing its reduction is also difficult. Eliminating the debt once and for all can be a task of Herculean proportions.

Here’s how to start on this journey.

Assessing Your Current State

The first step in an effective assessment of technical debt is to ensure you start with the big picture. Application technical debt may be where the most urgent problems like, but even so, it’s important to place these issues into the proper context.

The first consideration here is the business and its requirements. Where is existing technical debt causing the business or your customers the most pain?

It’s also important to include operational and cost factors in any assessment. In many cases, for example, older applications require older hardware – and thus the plan for infrastructure technical debt and the corresponding application plan are interdependent.

A recent survey by Wakefield Research of enterprise software architects and developers indicated that the most difficult step in application modernization was securing the budget and resources for the project followed by “knowing what to modernize” and “building a business case.” The only way to address these challenges is to accurately calculate the current technical debt in those applications up front with a data-driven plan.

Cost considerations are also important to any consideration of technical debt reduction planning. Some debt reduction projects will inevitably be more expensive than others – but won’t necessarily deliver more value. You’re looking for projects with the most ‘bang for the buck.’

Rationalize Your Applications

Once you’ve assessed the technical debt across your application landscape, it’s time to sort your application portfolio into four main buckets:

Refactoring: Applications in this category are more or less meeting their requirements, but some internal issue with the code is bogging them down. In this situation, refactoring is the best approach – reworking the code in place without necessarily changing the overall functionality of the application.

Deprecating: Sometimes it’s simply not worth the cost and trouble of dealing with particular instances of technical debt. While it may provide value to clean up these situations, your assessment has determined that your time and money are best spent elsewhere.

It’s important, however, to flag such code as something you’ve intentionally decided to leave alone (at least for the time being). Hence the notion of deprecation – an application you can still use, with the understanding that if you have a choice, use an alternative instead.

Replatforming: In some situations, the technical debt has more to do with the platform than the application itself. For example, an application might be running on an older version of .NET or Java EE.

The main goal of replatforming is typically to move an application to the cloud – without changing anything about the application that isn’t necessary to achieve this goal.

While replatforming is occasionally the best approach to dealing with technical debt, many organizations overuse it – putting debt-laden applications in the cloud without resolving that debt.

Rearchitecting: Whenever replatforming falls short (as it often does), then rearchitecting is typically the approach that best resolves application technical debt issues – but also tends to be the most expensive option.

While it’s possible to replatform an application in the cloud without rearchitecting it, such rearchitecture is necessary in order to take advantage of many of the core benefits of the cloud, including scalability, elasticity, and automated provisioning.

When moving to a cloud native platform (typically Kubernetes), rearchitecture is an absolute must.

Rearchitecting to Reduce Technical Risk

While cloud native computing is all the rage today, it’s important to note that taking a cloud native approach may include a variety of architecture and technology options depending upon the business need.

Rearchitecting, therefore, requires a careful consideration of such needs, as well as available resources (human as well as technology), realistic timeframes for modernization, and the overall cost of the initiative.

Rearchitecture also never works within a vacuum. Any rearchitecture project must take into account the existing application and management landscape in order to address issues of security, governance, and whatever integration is necessary to connect the rearchitected applications to other applications and services.

Because rearchitecture initiatives also include replatforming, it’s also essential to plan ahead for any cloud migration requirements as part of the overall effort.

At some point in every rearchitecture effort, of course, it will be necessary to modernize the code as well as the architecture. Fortunately, there are approaches to modernizing code without the onerous responsibility of rewriting it line by line – even in situations where the architecture of the software is changing.

We’ll be covering application modernization in more depth in the rest of this four-part article series. Stay tuned!

The Intellyx Take

In many cases, organizations tackle modernization projects without thinking specifically about resolving technical debt. However, framing such initiatives in terms of such debt is a good way to improve their chances of success.

Today, it’s possible to measure technical debt with a reasonable amount of accuracy using solutions like vFunction Architectural Observability Platform. Such measurements give you a heat map across your application landscape, pointing out those areas that have particularly knotty messes to clean up and can even pinpoint where to start refactoring or rearchitecting in those apps including the top app component contributors to technical debt and the resulting ROI.

Without such a heat map, modernization efforts tend to go off the rails. Therefore, while technical debt is generally a bad thing, it does serve certain purposes – including directing the modernization team to the highest priority projects.

vFunction Enables Rapid Technical Debt Analysis

base report

vFunction has launched Assessment Hub Express to help architects and developers quickly calculate the technical debt of their monolithic Java applications. Assessment Hub Express is a cloud-based version of the recently announced vFunction Assessment Hub and provides a rapid, self-service technical debt assessment solution that is free for up to 3 applications for one year.

Assessment Hub Express provides key diagnostic measurements so architects can measure technical debt based on critical architectural complexity, risk, and dependency scores. Based on the industry leading vFunction Assessment Hub, this lightweight SaaS tool quickly scans your Java app binaries and details the total cost of ownership (TCO) for your app in relation to technical debt, detecting the top classes that contribute to that debt and aging frameworks to address.

How It Works: the Mathematics Behind Assessment Hub Express

In a recent technical blog, Ori Saporta, vFunction co-founder and systems architect, outlined how vFunction is Using Machine Learning to Measure and Manage Technical Debt. This same science drives Assessment Hub Express and aligns with the approach outlined in leading academic and IEEE studies.  The common conclusion from vFunction engineers and the industry is that the most accurate way to measure technical debt is to focus on the dependencies between architectural components in the given application.

Using this approach, vFunction Assessment Hub Express measures the technical debt of monolithic applications based on the dependency graph between its classes. The details are described in the technical blog above, but in essence the algorithms perform multifaceted analysis on the graph to eventually come up with a score that describes the technical debt of the application.

Based on the metrics of the dependency graphs, vFunction can identify architectural issues that represent real technical debt in the original architecture. Moreover, by analyzing dependencies on two levels — class and community — this produces the architectural measurements required to calculate a high-level score that can be used not only to identify technical debt in a single application, but also to compare technical debt between applications. In addition, it can be used to prioritize which apps should be modernized and how. To do that, Assessment Hub measures and displays three key indexes:

  • Complexity Index — the effort required to add new features to the software based on the degrees of entanglement between classes
  • Risk Index — the potential risk that adding new features has on the stability of existing ones based on the length of dependency chains
  • Overall Technical Debt Index — a synthesis of the above complexity and risk scores that represent the overall amount of extra work required when attempting to add new features.
debt breakdown

Finally, applying machine learning to the graph theory-derived metrics across hundreds of monolithic applications, vFunction used these benchmarks to train a machine learning model that correlates the values of the extracted metrics with the indexes and normalizes them to a score of 0 to 100.

The overall debt levels were then converted into currency units, depicting the level of investment required to add new functionality into the system. For example, for each $1 invested in application development and innovation, how much goes specifically to maintaining technical debt? This is intended to help organizations build a business case for handling and removing architectural technical debt from their applications.

report cost of innovation

Rapidly Assess the Technical Debt of Monolith Java Applications

Assessment Hub Express provides a cloud-based rapid, self-service technical debt assessment solution that allows architects and developers to:

  • Measure technical debt based on critical architectural complexity, risk, and dependency scores
  • Automatically evaluate the innovation to technical debt cost ratio and total cost of ownership (TCO) factor improvement by modernization
  • Identify and recommend the top 10 classes contributing to technical debt
  • Share an exportable PDF report to build the business case for modernization
  • Report on aging software frameworks, compile versions, and Jars that classified into aging, modern, or unknown categories

Monoliths to Microservices: 4 Modernization Best Practices

This post was originally featured on TheNewStack, sponsored by vFunction.

When it comes to refactoring monolithic applications into microservices, most engineering teams have no idea where to start. Additionally, a recent survey revealed that 79% of modernization projects fail, at an average cost of $1.5 million and 16 months of work.

In other articles, we discussed the necessity of developing competencies for assessing your application landscape in a data-driven way to help you prioritize your first big steps. Factors like technical debt accumulation, cost of innovation and ownership, complexity and risk are important to understand before blindly embarking on a modernization project.

Event storming exercises, domain-driven design (DDD), the Strangler Fig Pattern and others are all helpful concepts to follow here, but what do you as an architect or developer actually do to refactor a monolithic application into microservices?

There is a large spectrum of best practices for getting the job done, and in this post, we look at some specific actions for intelligently decomposing your monolith into microservices.

These actions include identifying service domains, merging two services into one, renaming services to something more accurate and removing services or classes as candidates for microservice extraction. The best part: Instead of trying to do any of this manually, we’ll be using artificial intelligence (AI) plus automation to achieve our objectives.

Best Practice #1: Automate the Identification of Services and Domains

Surveys have shown that the days of manually analyzing a monolith using sticky notes on whiteboards take too long, cost too much and rarely end in success. Which architect or developer in your team has the time and ability to stop what they’re doing to review millions of lines of code and tens of thousands of classes by hand? Large monolithic applications need an automated, data-driven way to identify potential service boundaries.

The Real-World Approach

Let’s select a readily available, real-world application as the platform in which we’ll explore these best practices. As a tutorial example for Java developers, Oracle offers a medical records (MedRec) application — also known as the Avitek Medical Records application, which is a traditional monolith using WebLogic and Java EE.

Using vFunction, we will initiate a “learning” phase using dynamic analysis, static analysis and machine learning based on the call tree and system flows to identify ideal service domains.

events identified for extraction
Image 1: This services graph displays individual services identified for extraction

In Image 1, we see a services graph in which services are shown as spheres of different sizes and colors, as well as lines (edges) connecting them. Each sphere represents a service that vFunction has automatically identified as related to a specific domain. These services are named and detailed on the right side of the screen.

The size of the sphere represents the number of classes contained within the service. The colors represent the level of class “exclusivity” within each service, referring to the percentage of classes that exist only within that service, as opposed to classes shared across multiple services.

Red represents low exclusivity, blue medium exclusivity and green high exclusivity. Higher class exclusivity indicates better boundaries between services, fewer interdependencies and less code duplication. Taken together, these traits indicate that it will be less complex to refactor highly-exclusive services into microservices.

different relationships between services
Images 2 and 3: Solid and dashed lines represent different relationships between services

The solid lines here represent common resources that are shared across the services (Image 2). Common resources include things like beans, synchronization objects, read-only DB transactions and tables, read-write DB transactions and tables, websockets, files and embedded files. The dashed lines represent method calls between the services (Image 3).

The black sphere in the middle represents classes still in the monolith, which contains classes and resources that are not specific to any particular domain, and thus have not been selected as candidates for extraction.

By using automation and AI to analyze and expose new service boundaries previously contained in the black box of the monolith, you are now able to begin manipulating services inside of a suggested reference architecture that has cleared the way to make better decisions based on data-driven analysis.

Best Practice #2: Consolidate Functionality and Avoid Duplication

When everything was in the monolith, your visibility was somewhat limited. If you’re able to expose the suggested service boundaries, you can begin to make decisions and test design concepts — for example, identifying overlapping functionality in multiple services.

The Real-World Approach

When does it make sense to consolidate disparate services with similar functionality into a single microservice? The most basic example is that, as an architect, you may see an opportunity to combine two services that appear to overlap — and we can identify these services based on the class names and level of class exclusivity.

two similar services ready to merge
Image 4: Two similar services have been identified to be merged

In the services graph (Image 4), we see two similar chat services outlined with a white ring: PatientChatWebSocket and PhysicianChatWebSocket. We can see that the physician chat service (red) has 0% dynamic exclusivity and that the patient chat service (blue) has slightly higher exclusivity at 33%.

Neither of these services is using any shared resources, which indicates that we can merge these into a single service without entangling anything by our actions.

decision to merge services can be rolled back with a click of a button
Image 5: Confirming the decision to merge services can be rolled back immediately with the push of a button

By merging two similar services, you are able to consolidate duplicate functionality as well as increase the exclusivity of classes in the newly merged service (Image 5). As we’re using vFunction Platform in this example, everything needed to logically bind these services is taken care of — classes, entry points and resources are intelligently updated.

merged single service
Image 6: A newly merged single service now represents two previous chat services

Merging services is as simple as dragging and dropping one service onto the other, and after vFunction Platform recalculates the analysis of this action, we see that the sphere is now green, with a dynamic exclusivity of 75% (Image 6). This indicates that the newly-merged service is less interconnected at the class level and gives us the opportunity to extract this service with less complexity.

Best Practice #3: Create Accurate and Meaningful Names for Services

We all know that naming things is hard. When dealing with monolithic services, we can really only use the class names to figure out what is going on. With this information alone, it’s difficult to accurately identify which classes and functionality may belong to a particular domain.

The Real-World Approach

In our example, vFunction has automatically derived service domain names from the class names on the right side of screen in Image 7. As an architect, you need to be able to rename services according to your preferences and requirements.

rename a merged service
Image 7: Rename a merged service to something more accurate

Let’s now go back to the two chat services we merged in the last section. Whereas previously we had a service for both the patient and physician chat, we now have a single service that represents both profiles, so the name PatientChatWebSocket is no longer accurate, and may cause misunderstandings for other developers working on this service in the future. We can decide to select a better name, such as ChatService (Image 7).

rename an automatically identified service
Image 8: Rename an automatically identified service to something more meaningful

In Image 8, we can see another service named JaxRSRecordFacadeBroker (+2). The (+2) part here indicates that we have entry points belonging to multiple classes. You may find this name unnecessarily descriptive, so you can change it simply to RecordBroker.

By renaming services in a more accurate and meaningful way, you can ensure that your engineering team can quickly identify and work with future microservices in a straightforward way.

Best Practice #4: Identify Functionality That Shouldn’t Be a Separate Microservice

What qualities suggest that functionality previously contained in a monolith deserves to be a microservice? Not everything should become a microservice, so when would you want to remove a service as a candidate for separation and extraction?

Well, you may decide that some services don’t actually belong in a separate domain, for example, a filter class that simply filters messages. Because this isn’t exclusive to any particular service, you can decide to move it to a common library or another service in the future.

The Real-World Approach

When removing functionality as a candidate for future extraction as a microservice, you are deciding not to treat this class as an individual entry point for receiving traffic. Let’s look at the AuthenticatingAdministrationController service (Image 9), which is a simple controller class.

removing a non-specific service
Image 9: Removing a very simple, non-specific service

In Image 9, we can see that the selected class has low exclusivity by the red color, and also that it is a very small service, containing only one dynamic class, one static class and no resources. You can decide that this should not be a separate service by itself and remove it by dragging and dropping it onto the black sphere in the middle (Image 10).

relocating this class back to the monolith

By relocating this class back to the monolith, we have decided that this particular functionality does not meet the requirements to become an individual microservice.

In this post, we demonstrated some of the best practices that architects and developers can follow to make refactoring a monolithic application into bounded contexts and accurate domains for future microservice extraction.

By using the vFunction Platform, much of the heavy lifting and manual efforts have been automated using AI and data-driven analysis. This ensures that architects and development teams can spend time focusing on refining a reference architecture based on intelligent suggestions, instead of spending thousands of hours manually analyzing small chunks of code without the appropriate “big picture” context to be successful.

App Modernization Challenges That Keep CIOs Up at Night

Companies today must be highly agile to meet ever-evolving marketplace demands. But the legacy applications many still depend on for much of their business-critical processing are ill-equipped to support that kind of agility. That’s why identifying and overcoming app modernization challenges is critically important.

The Consortium For Information & Software Quality (CISQ) highlights the necessity for app modernization in this way:

After decades of operation, they [legacy apps] may have become less efficient, less secure, unstable, incompatible with newer technologies and systems, and more difficult to support due to loss of knowledge and/or increased complexity or loss of vendor support. In many cases, they represent a single point of failure risk to the business.

CISQ notes that companies now spend 75% of their IT budgets on their legacy systems. That’s money that’s not being spent to provide the innovations that are critical for success in today’s market environment.

For that reason, modernizing legacy systems and applications so that they can fully participate in today’s cloud-centric ecosystem is critically important. Yet according to a 2022 survey of senior IT professionals, 79% of app modernization efforts fail, and those failures represent an enormous waste of time and resources. In this article, we want to examine the particular app modernization challenges that may give CIOs sleepless nights as they contemplate upgrading their legacy applications.

Why Overcoming App Modernization Challenges is Critical

More than half (56%) of the respondents to a survey of corporate CIOs say that their legacy applications are significant obstacles to their efforts toward digital transformation. But because those applications still perform functions that are critical for day-to-day business operations, they can’t simply be eliminated.

Rather, to gain the technological agility that’s necessary for meeting ever-changing marketplace demands, companies must find ways to integrate their legacy apps into today’s cloud-centric ecosystem.

That’s what application modernization is all about. Industry analyst David Weldon puts it this way:

“Application modernization is the process of taking old applications and the platforms they run on and making them “new” again by replacing or updating each with modern features and capabilities that better align with current business needs.”

When done well, application modernization not only provides the flexibility and agility that enables companies to react quickly to changing marketplace conditions, but it also yields better application performance, increased efficiency for developers, and reduced overall costs.

Challenges of Application Modernization

The app modernization challenges most likely to keep CIOs awake at night fall into three major categories: costs, time, and risk. Let’s take a closer look at each.

1. Costs

There’s no question that any significant legacy app modernization effort will require a substantial investment of both money and time. According to one survey, the average application modernization project costs $1.5 million and takes 16 months–and still, 79% of these initiatives fail.

Obtaining the necessary budget commitment is often the biggest obstacle CIOs face in initiating a legacy app modernization project. That’s especially the case when a company’s legacy apps seem to still be functioning as intended and providing value to the organization. That perception may cause senior management to take an attitude of “if it ain’t broke, we can’t afford to fix it.”

Yet, the risks and costs of doing nothing are substantial. Using a standardized metric it calls the Cost of Poor Software Quality, CISQ calculated that in 2020 it cost businesses $520 billion to maintain legacy software.

In addition, as the technological context for which they were designed recedes further and further into the past, legacy apps become more brittle (easily breakable) and may constitute, as CISQ notes, a “single point of failure risk” that could trigger huge unexpected costs if a breakdown should occur.

How can a CIO deal with the inevitable budget limitations that could seriously curtail any effort at legacy app modernization? First, costs must be contained; second, senior management must be shown the positive ROI that legacy app modernization can yield.

Containing Legacy App Modernization Costs

Legacy application modernization, which normally involves refactoring monolithic legacy codebases to convert them to a cloud-native microservices architecture, requires a high level of expertise within the development team. Not only must developers understand the legacy app itself (and its technological framework), but they must also be skilled in navigating the open-source environment of the cloud.

That presents a two-fold problem. First, the developers who were most familiar with the legacy app are usually no longer available, and finding equally knowledgeable replacements is nearly impossible. Second, while developers who are at home with cloud technologies are available, they come at a cost that is often beyond what companies can pay to staff a modernization project.

The answer is to not try to do everything yourself. Instead, you’ll want to work with partners that already have the skills and experience required for efficiently modernizing monolithic codebases.

Related: The CIO Guide to Modernizing Monolithic Applications

Making the ROI Case for Legacy App Modernization

Getting the budget commitments needed for an app modernization effort requires getting buy-in from the executive team. You’ll need to present quantitative information that establishes the ROI that can be expected from such a project. That data can be acquired by use of an AI-enabled automated tool that can help you assess the technical effort required, the associated costs, and the savings that will ultimately be gained.

2. Time

Refactoring legacy apps to give them an essentially cloud-native architecture is a highly complex task. A monolithic codebase is basically a single unit that has function implementations and dependencies woven throughout the code in non-obvious ways.

Manually unraveling millions of lines of code to expose those functions and dependencies requires both a high degree of technical expertise and the investment of many months or even years of developers’ time. A report by McKinsey quotes one IT leader as saying,

“We were surprised by the hidden complexity, dependencies and hard-coding of legacy applications, and slow migration speed.”

But the key word in this scenario is “manually.” The degree of complexity, and the time required to manage it, can be substantially reduced by employing the kind of AI-enabled, automated analysis tool we mentioned before. The use of such a tool can allow developers to accomplish in just weeks what would take many months if done manually.

3. Risk

Perhaps the scariest of the app modernization challenges that may keep a CIO up at night is the potential that after a significant investment of time and money, the project might fail to deliver the expected benefits. Even worse is the risk that faults might be inserted into a business-critical legacy app, causing significant disruptions to company operations.

Those risks are real. As we’ve seen, almost 80% of legacy app modernization efforts end in failure. And there are risk factors inherent in the process of refactoring monolithic codebases into microservices that can rarely be avoided.

For example, there’s often a knowledge gap caused by the fact that the original developers of a legacy app are no longer available, and written documentation is often incomplete or outdated. In its many years of service, legacy code will usually have been modified, adapted, and patched to meet specific needs of the moment, but such changes are rarely adequately documented. As a result, developers engaged in a modernization effort might overlook important functions that are hidden in the code.

Minimizing the Risk Factor

How can such risks be mitigated? The key is good planning and taking a step-by-step approach that allows you to fully test changes before they are incorporated into the application.

Start by assessing your legacy app portfolio to identify and prioritize those apps that need immediate modernization to meet current or future business goals versus those that can be left alone for now or simply migrated to the cloud (via rehosting or replatforming) with minimal changes. This is another area in which having an automated, AI-based analysis tool is critical.

In a microservices architecture, each service embodies a single function that can be implemented and thoroughly tested without impacting the application as a whole. Your modernization plan should be based on adding or replacing functionality one at a time with their microservice implementations. The plan should also include a process for quickly and seamlessly backing a microservice out if problems arise when it’s incorporated into the application.

Related: Succeed with an Application Modernization Roadmap

How vFunction Helps CIOs Overcome App Modernization Challenges

We’ve seen how having an AI-based, automated tool can make a huge difference in minimizing the cost, time, and risk factors of legacy app modernization. And that’s exactly what the vFunction Platform provides.

The vFunction Assessment Hub can automatically analyze legacy apps and generate quantitative measures of code complexity and interdependence. It produces hard numbers that quantify the amount of effort required to modernize each app, providing the information you need to prioritize your modernization efforts and estimate ROI for the project.

The vFunction Modernization Hub automatically transforms complex monolithic applications into microservices. It uncovers hidden process flows and dependencies in applications, thereby minimizing the chance that important functions will be overlooked or incorrectly implemented.By making use of such automated features, vFunction accelerates modernization projects by 10-15x, saving hundreds of thousands of dollars per application. To see first-hand how vFunction can help you overcome app modernization challenges and sleep well at night, schedule a demo today.

Organizing and Managing Remote Dev Teams for Application Modernization

Many companies still depend on legacy applications for some of their most business-critical processing. But those apps typically don’t support the kind of technological agility that’s needed for continuing success in today’s ever-changing marketplace environment. That’s why modernizing legacy apps is an accelerating trend among leading companies.

But app modernization is not easy—it requires highly skilled developers who understand both the legacy app and the modern cloud ecosystem. Assembling such a team on-site can be difficult. It’s often easier to find the needed skills and organize the team for maximum effectiveness if team members can work remotely. According to Forbes, which declares that remote work is the new normal,

“When it comes to the tech workforce, it takes more than simply offering remote opportunities to get employees motivated. Employers must embrace flexibility and build (or reinforce) a strong, supportive remote work culture to ensure teams are engaged and high-performing.”

That’s why understanding how to assemble and manage remote legacy app modernization teams is vitally important.

The Goal of App Modernization: From Monoliths to Microservices

Legacy apps are often a severe drag on a company’s ability to innovate at the pace required in today’s fast-changing marketplace and technological environments. That’s because such apps are typically monolithic, meaning that the codebase is organized as a single unit.

Because various function implementations and dependencies are interwoven throughout the code, an attempt to change any specific behavior could impact the entire application in unexpected ways, potentially causing it to fail.

When legacy apps are used for a company’s most important operational processes, such failures cannot be tolerated. When they occur, development teams may be required to stop work on the innovations that are so necessary to a company’s continued marketplace success and take an all-hands-on-deck approach to fixing the problem as quickly as possible.

In contrast to the typical legacy app, software based on a cloud-native microservices architecture can be updated far more easily and safely from remote locations. Microservices are small units of code that perform a single task. Because they are designed to function independently of one another, changes made to one microservice can’t ripple through the rest of the application. That’s why restructuring a legacy app from a monolith to a microservices architecture gives it a much greater level of adaptability.

The goal of legacy application modernization is to substantially improve an app’s adaptability and maintainability by restructuring its codebase from a monolith to microservices.

Related: Application Modernization and Optimization: What Does It Mean?

How System Architecture Correlates With Organizational Structure

In 1967 Melvyn Conway formulated what’s come to be known as Conway’s Law:

Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization’s communication structure.

Software engineer Alex Kondov highlights the practical implications of Conway’s Law:

Imagine a small company with a handful of engineers all sitting in the same room. They will probably end up with a more tightly coupled solution that relies on their constant communication. [In other words, a monolith].

A large company with teams in different time zones working on separate parts of the product will need to come up with a more distributed solution. That will allow them to work autonomously, build and deploy without interfering with each other… An organization in which teams need to operate in a fully autonomous manner would naturally come to an architecture like microservices.

The organizational structure of your legacy app modernization team will determine the kind of software it ultimately produces. Although you may aim at creating a microservices-based application, if your team is organized in the tightly-coupled manner of Kondov’s first example, it will be more predisposed towards a monolithic application architecture rather than a microservices architecture.

Optimizing Your Team’s Structure to Support Microservices

The principles of Domain-Driven Design (DDD) provide a useful framework for organizing legacy app modernization teams. As Tomas Fernandez explains,

“Domain-Driven Development allows us to plan a microservice architecture by decomposing the larger system into self-contained units, understanding the responsibilities of each, and identifying their relationships.”

According to María Gómez, Head of Technology for ThoughtWorks, examples of domains include broad business areas such as finance, health, or retail. Each domain may contain several sub-domains. The finance domain, for example, might have sub-domains of payments, statements, or credit card applications.

The DDD paradigm allows developers to identify the domains and subdomains that exist in a monolithic codebase, and draw the boundaries that delineate each service that will be implemented as a microservice. Every microservice embodies a single business goal and has a well-defined function and communications interface. This allows each microservice to run independently of any others.

Each team is fully and solely responsible for the microservices that they develop, and functions, to a considerable degree, independently of other teams. Once a team is made aware of the communications interface defined for each microservice, it can work independently and asynchronously without needing to interact with other teams about how their microservices are implemented.

This organizational pattern favors remote development teams. Each team needs a high degree of internal asynchronous communication as they work out the design of the microservice for which they are responsible. But less communication is needed between teams.

For that reason, remote, loosely-coupled development teams are perfect for converting monolithic legacy apps to microservices. But there are some potential pitfalls tech leaders should be aware of.

Related: What is a Monolithic Application? Everything you need to know

Challenges of Remote Teams

With all of the advantages remote development teams provide for the application modernization process, there are some definite challenges that IT leaders will have to overcome to make their use of such teams effective. Let’s take a brief look.

1. Work-Life Balance

Working remotely can affect work-life balance both positively and negatively: while ZDNet reports that 64% of developers say that working remotely has improved their work-life balance, 27% say that it’s difficult for them to unplug from the job.

Leaders must proactively help remote developers in this area. A big part of doing that is ensuring that goals and deadlines are realistic and that workers aren’t encouraged to spend what should be family or personal time on job-related activities.

2. Assessing Productivity and Progress

Because personal contact with workers is more constrained, leaders have less visibility into the productivity or progress of remote teams. Gaining that visibility may require more formal reporting arrangements, such as daily check-ins where workers report progress on their KPIs. Project management tools such as Trello or Asana can also help.

3. Communications

In the office, developers naturally consult and collaborate informally. That’s more difficult when they are working remotely. In fact, in Buffer’s 2022 State Of Remote Work survey, 56% of respondents identify “how I collaborate and communicate” as a top remote work issue, while 52% say they feel less connected to coworkers. Scheduling regular virtual team meetings using tools like Zoom or Google Chat can help.

4. Work Schedules Across Time Zones

It’s 9 am in San Francisco, and your West Coast team members are starting their workday, but team members in Europe are finishing theirs. How can a team collaborate across time zones? One approach is to focus on asynchronous communication methods, such as group chats and emails, that don’t require individuals to be online at the same time.

5. Company Culture

Company culture is absorbed most easily through face-to-face interactions with leaders and peers. The isolation inherent in remote work makes instilling that culture among team members difficult. John Carter, Founder of TCGen, offers this suggestion:

“Make the unconscious cues in the company culture conscious. Refer to them often and reinforce them. Company culture can follow your team members home, but only if it is made explicit and constantly reinforced.”

Why Remote Teams are the Future

Not only is the distributed nature of remote teams ideal for implementing distributed, cloud-based microservices applications, but they represent a trend that may redefine the IT landscape well into the future.

The COVID-19 pandemic accelerated the use of remote software development teams. As companies learned how to onboard, train, and manage a remote workforce, they realized that disregarding geographical limitations in their hiring allowed them to lower costs and increase quality by tapping into a wider developer talent pool. Bjorn Lundberg, Senior Client Partner at 3Pillar Global describes the trend this way:

“Contract workers, freelancers, and outsourced teams have been on the rise for a while now… As remote collaboration becomes a fixture of the modern workplace, American companies increasingly view outsourcing software development as an opportunity to extend their development talent without exhausting their budgets.”

Even full-time employees want to work remotely: according to the 2022 State of Remote Engineering Report, 75% of developers would prefer to work remotely most of the time.

How vFunction Can Empower Your App Modernization Teams

As we’ve seen, the ideal application modernization team should be relatively small. vFunction helps small teams maximize their effectiveness by providing an AI-enabled, automated platform that reduces the legacy app restructuring workload by orders of magnitude.

vFunction can automatically analyze complex monolithic applications, with perhaps millions of lines of code, to reveal hidden functionalities and dependencies. It can then automatically transform those apps into microservices.To see first-hand how vFunction helps remote application modernization teams maximize their effectiveness, request a demo today.

IT Leader Strategies for Effectively Managing Technical Debt

In a report on managing technical debt, Google researchers make a startling admission:

“With a large and rapidly changing codebase, Google software engineers are constantly paying interest on various forms of technical debt.”

What’s true of Google is very likely true of your company as well, especially if you have legacy applications you still depend on for important business functions. If you do, you’re almost certainly carrying a load of technical debt that is hindering your ability to innovate as quickly and as nimbly as you need to in today’s fast-changing marketplace and technological environments.

Technical debt is an issue you cannot afford to ignore. As an article in CIO Magazine explains,

“CIOs say reducing technical debt needs increasing focus. It isn’t wasting money. It’s about replacing brittle, monolithic systems with more secure, fluid, customizable systems. CIOs stress there is ROI in less maintenance labor, fewer incursions, and easier change.”

But what, exactly, is technical debt, and why is managing it so vital for companies today?

Why Managing Technical Debt is Critical

What is technical debt? According to Ori Saporta: “Technical debt, in plain words, is an accumulation over time of lots of little compromises that hamper your coding efforts.”

In other words, technical debt is what happens when developers prioritize speed over quality. The problem is that, just as with financial debt, you must eventually pay off your technical debt, and until you do, you’ll pay interest on the principal.

  • The “interest” on technical debt consists of the ongoing charges you incur in trying to keep flawed, inflexible, and outmoded applications running as the technological context for which they were designed recedes further and further into the past. Software developers spend, on average, about a third of their workweek addressing technical debt. Plus, there’s also the opportunity cost of time that’s not being spent to develop the innovations that can help propel a company ahead in its marketplace.
  • The “principle” on technical debt is what it costs to clean up (or replace) the original messy code and bring the application into the modern world. Companies typically incur $361,000 of technical debt for every 100,000 lines of code.

Managing your technical debt is critical because the price you’ll pay for not doing so, in terms of time, money, focus, and lost market opportunities, will grow at an ever-accelerating pace until you do.

Managing Technical Debt: Getting Started

A report from McKinsey highlights how a company can begin dealing with its technical debt:

“[A] degree of tech debt is an unavoidable cost of doing business, and it needs to be managed appropriately to ensure an organization’s long-term viability. That could include ‘paying down’ debt through carefully targeted, high-impact interventions, such as modernizing systems to align with target architecture.”

The place to start in managing technical debt is with modernizing legacy applications to align with a target architecture, which today is usually the cloud. Legacy applications weren’t designed to work in the cloud context, and it’s very difficult to upgrade them to do so. That’s because such apps often have a monolithic system architecture.

Monolithic code is organized as a single unit with various functionalities and dependencies interwoven throughout the code. The coding shortcuts, ad hoc patches, and documentation inadequacies that are typical sources of technical debt in legacy applications are embedded in the code in ways that are extremely difficult for humans to unravel. Worse, because of hidden dependencies in the code, any changes aimed at upgrading functions or adding features may ripple throughout the codebase in unexpected ways, potentially causing the entire application to fail.

From Monoliths to Microservices

Because a monolithic architecture makes upgrading an application for new features or for integration into the cloud ecosystem so difficult, the first step of legacy app modernization is usually to restructure the code from a monolith to a cloud-native, microservices architecture.

Microservices are small chunks of code that perform a single task. Each can be deployed and updated independently of any others. This allows developers to change a specific function in an application by updating the associated microservice without the risk of unintentionally impacting the codebase as a whole.

The process of restructuring a codebase from a monolith to microservices will expose the hidden dependencies and coding shortcuts that are the source of technical debt.

Related: Migrating Monolithic Applications to Microservices Architecture

Options for Modernizing Legacy Apps

Gartner lists seven options for modernizing legacy applications:

  1. Encapsulate: Connect the app to cloud resources by providing API access to its existing data and functions, but without changing its internal structure and operations.
  2. Rehost (“Lift and Shift”): Migrate the application to the cloud as-is, without significantly modifying its code.
  3. Replatform: Migrate the application’s code to the cloud, incorporating small changes designed to enhance its functionality in the cloud environment, but without modifying its existing architecture or functionality.
  4. Refactor: Restructure the app’s code to a microservices architecture without changing its external behavior.
  5. Rearchitect: Create a new application architecture that enables improved performance and new capabilities.
  6. Rewrite: Rewrite the application from scratch, retaining its original scope and specifications.
  7. Replace: Throw out the original application, and replace it with a new one.

The first three options, encapsulation, rehosting, and replatforming, simply migrate an app to the cloud with minimal changes. They offer some improvements in terms of operating costs, performance, and integration with the cloud. However, they do little to reduce technical debt because there’s no restructuring of the legacy application’s codebase—if it was monolithic before being migrated to the cloud, it remains monolithic once there.

The last option, replacing the original application, can certainly impact technical debt, but because it’s the most extreme in terms of time, cost, and risk, it’s usually considered only as a last resort.

The most viable options, then, for removing technical debt are refactoring, rearchitecting, or rewriting the code.

Assessing Your Monolithic Application Landscape

The ideal solution for managing technical debt would be to immediately identify and convert a subset of your legacy applications to microservices. But because any restructuring project involves significant costs in terms of money, time, and risk, trying to modernize every app in your portfolio is not a practical strategy for most companies.

That’s why your first step on the road to effectively managing technical debt should be surveying your portfolio of monolithic legacy applications to assess each in terms of its complexity, degree of technical debt, and the level of risk associated with upgrading it. With that information in hand, you can then prioritize each app based on the degree to which its value to the business justifies the amount of effort required to modernize it.

  • For apps with high levels of technical debt and great value to the business, consider full modernization through refactoring, rearchitecting, or rewriting.
  • Apps with lower levels of technical debt (meaning that they function acceptably as they are) or that have a lesser business value should be considered for simple migration through encapsulation, rehosting, or replatforming.

Refactoring is Key

Refactoring is fundamental to managing technical debt for at least two reasons:

  1. It exposes the elements of technical debt, such as hidden dependencies and undocumented functionalities, that are inherent in an app’s original monolithic code. These must be well understood before any rearchitecting or rewriting efforts can be safely initiated.
  2. By converting an app to a cloud-native microservices architecture, refactoring positions it for full integration into the cloud ecosystem, making further upgrades and functional extensions relatively easy.

That’s why refactoring is normally the first stage in modernizing a monolithic legacy app. Then, if new capabilities or performance improvements are required that the original code structure does not support, rearchitecting may be in order. Or, if the development team wishes to avoid the complexities of rearchitecting existing code, they may opt to rewrite the application instead.

In any case, refactoring will normally be the initial step because it produces a codebase that developers can easily understand and work with.

Implement “Continuous Modernization”

Technical debt is unavoidable. As the pace of technological change continues to accelerate, even your most recently written or upgraded apps will slide relentlessly over time toward increased technical debt. That means you should plan to deal with your technical debt on a continuous basis–known as continuous modernization. As John Kodumal, CTO and cofounder of LaunchDarkly has said,

“Technical debt is inevitable in software development, but you can combat it by being proactive… This is much healthier than stopping other work and trying to dig out from a mountain of debt.”

You need to constantly monitor and clean up your technical debt as you go, rather than waiting until some application or system reaches a crisis point that requires an immediate all-out effort at modernization. In fact, continuous modernization leads to technical debt removal and should be a fundamental element of your CI/CD pipeline.

Related: Preventing Monoliths: Why Cloud Modernization is a Continuum

vFunction Can Help You Manage Your Technical Debt

As we’ve seen, the first step toward effectively managing your technical debt is to assess your suite of legacy apps to understand just how large the problem is. That has historically been a very complex and time-consuming task when pursued manually. But now the AI-driven vFunction platform can substantially simplify and speed up the process.

The vFunction Architectural Observability Platform will automatically evaluate your applications and generate qualitative measures of code complexity and risk due to interdependencies. It produces a number that represents the amount of technical debt associated with each app, providing you with just the information you need to prioritize your modernization efforts.

And once you’ve determined your modernization priorities, the vFunction Code Copy automates the process of actually transforming complex monolithic applications into microservices, which can result in immense savings of time and money. If you’d like a first-hand view of how vFunction can help your company effectively manage its technical debt, schedule a demo today.

Ten Microsoft Azure Products for Modernizing Applications

The Microsoft Azure Cloud is a popular destination for companies seeking to modernize their legacy applications. Azure provides a variety of fully managed services that make application modernization much easier by shifting much of the infrastructure management workload from developers to the platform itself.

These services include Infrastructure as a Service (IaaS) offerings that allow legacy apps to be directly migrated to the cloud without making major changes to the code. This approach allows developers to take advantage of cloud characteristics, such as increased scalability, performance, stability, and security, without making major investments of time and money.

Azure also offers a suite of fully managed Platform as a Service (PaaS) tools that help developers restructure legacy apps for easy integration into the cloud ecosystem.

To take full advantage of the Azure platform, companies should be aware of the modernization services it provides, and closely examine them to determine how they can best be used. But to put those services into proper perspective, let’s first establish what application modernization is all about.

The Need for Application Modernization

Many companies still use applications developed years or decades ago for some of their most business-critical processing. Often, such applications were built at a time when software development standards were far less sophisticated than they are today, and when apps were not expected to interact with other software. As a result, many legacy apps are limited in two crucial areas:

  • Their architecture is monolithic, meaning that the codebase is essentially a single unit with function implementations and dependencies interwoven throughout. Upgrading such applications is extremely difficult because a single change to any function or feature might ripple through the code in unexpected ways, possibly causing the entire app to fail.
  • Legacy apps are usually self-contained, with little ability to interact with other applications. In today’s open-source, cloud-centered environment, an inability to tap into the functionalities provided by other cloud resources can be a crippling disadvantage.

Legacy application modernization aims at overcoming these deficiencies by converting an app’s codebase from a monolith to microservices.

The Importance of Microservices

For true modernization to occur, a monolithic legacy app codebase must be restructured into a cloud-native, microservices architecture.

Microservices are small chunks of code that operate autonomously and perform a single task. Because they can be deployed and updated independently of one another, microservices allow individual functions to be easily upgraded to meet new requirements without impacting other portions of the application. When a legacy app is restructured into microservices, upgrading it becomes far easier.

Because microservices communicate using APIs based on published, standardized interface definitions, legacy apps that have been converted to microservices can easily be integrated into the cloud ecosystem and tap into the multitude of open-source services it offers.

Related: Migrating Monolithic Applications to Microservices Architecture

App Modernization Strategies

Most companies involved in legacy application modernization make use of three major approaches:

1. Migrate (Rehost, Replatform)

Because it’s usually not possible to fully modernize all of their legacy apps in one fell swoop, companies often rehost or replatform many of those apps to the cloud with minimal changes. This is the easiest means of reaping some of the benefits of the cloud environment, such as improvements in performance and scalability, without making wholesale alterations to the code.

The problem is that although such “lift and shift” efforts tap into some cloud capabilities, the app itself remains essentially unchanged—if it was monolithic in the data center, it’s monolithic in the cloud, with all the disadvantages of that architecture.

2. Replace

Companies typically replace only a small percentage of their legacy apps. It’s usually done when the complexities of upgrading the original code to meet new requirements are too great, and it seems simpler to start from scratch. But because this option is the most extreme in terms of time, cost, and risk, it’s normally chosen only as a last resort.

3. Modernize (Refactor, Rearchitect, or Rewrite)

Forward-looking companies recognize that their most business-critical legacy apps should not simply be migrated to the cloud, but should be fully modernized by restructuring them as cloud-native microservices. This is normally done using one of the following approaches:

  • Refactoring: Restructure the app’s code to microservices without changing its external behavior. Refactoring allows legacy apps to fit comfortably into a cloud-first environment.
  • Rearchitecting: Create a new application architecture that enables improved performance, greater scaling, and enhanced capabilities.
  • Rewriting: Rewrite the application from scratch, retaining its original scope and specifications.

Refactoring is normally the starting point because it transforms monolithic code into a form that’s simpler, cleaner, and easier for developers to understand. That makes it much easier to update refactored apps with new features and integrate them into the cloud ecosystem. Even if a legacy app must ultimately be rearchitected or rewritten to obtain the needed functionality or performance, the first step is usually to refactor it so that developers can more easily work with it.

Related: The CIO Guide to Modernizing Monolithic Applications

Azure App Modernization Offerings

Now that we understand what legacy app modernization is all about, let’s look at the tools Azure offers to facilitate that process.

Azure App Service (AAS)

Azure App Service enables migration of apps directly to the cloud. As a PaaS platform, Azure App Service takes over management of all infrastructure functions, such as the operating system and runtime or middleware components, relieving users of such concerns. AAS provides a set of tools that allow applications written in the most popular programming languages, including .NET, Java, Ruby, Node.js, PHP, and Python, to be adapted into an essentially Azure-native form.

Azure Spring Cloud

Azure Spring Cloud, now renamed to Azure Spring Apps, is a fully managed PaaS offering that facilitates seamless integration of Spring apps with Azure. It is especially important in restructuring monolithic legacy apps as microservices. As the digital publication AiThority notes:

“Spring is the most powerful and widely used Java framework for building custom Cloud-based microservices for web and app… [Azure Spring Cloud] enables any coder to run complex Spring apps at scale, completely removing the pain and risk of managing Spring architecture in virtualized setup.”

Azure Kubernetes Service (AKS)

According to Microsoft, cloud-native apps “are often composed of distributed microservices hosted in containers.” The most widely used container orchestration platform is Kubernetes. However, Kubernetes deployment and management can be quite complex. Azure Kubernetes Service relieves developers of much of the operational workload and is, Microsoft says, the quickest way to develop and deploy cloud-native apps.

Azure Container Apps (ACA)

Azure Container Apps is a fully managed serverless container service that enables users to build, deploy, and run microservices and containerized apps at scale in a serverless environment. ACA automatically manages infrastructure and complex container orchestrations. ACA applications, as well as individual microservices, can dynamically scale up or down, in or out, to meet changing requirements.

Azure SQL Database / Azure Cosmos DB

Azure SQL Database is Azure’s native SQL database, while Azure Cosmos DB is a serverless NoSQL database. Both are fully managed PaaS services that handle all infrastructure-related issues, such as updates, patches, backups, and monitoring.

  • Azure SQL Database is essentially a DBaaS (database as a service) offering. It uses the same underlying DB engine as SQL Server, allowing easy migration from an on-premises SQL Server database to Azure.
  • Azure Cosmos DB provides API access to NoSQL databases such as MongoDB and Apache Cassandra while offering single-digit millisecond performance, instant and automatic scalability, and an SLA-backed 99.999% availability guarantee.

Azure Database Migration Service

Azure Database Migration Service is a fully managed service that enables seamless migration of data from relational database sources to Azure. Supported databases include SQL Server, MySQL, PostgreSQL, and MongoDB.

Azure API Management (APIM)

Azure API Management is a multi-cloud API management platform. C# Corner describes it this way:

“API Management (APIM) is a way to create consistent and modern API gateways for existing back-end services. API Management helps organizations publish APIs to external, partner, and internal developers to unlock the potential of their data and services”

With APIM, your previously isolated legacy apps can be fully integrated into the cloud ecosystem.

Azure DevOps

Azure DevOps is a SaaS (Software as a Service) offering that provides services and tools to support DevOps teams in building cloud-native applications. Microsoft describes it this way:

“Azure DevOps supports a collaborative culture and set of processes that bring together developers, project managers, and contributors to develop software.”

Azure Application Gateway

Azure Application Gateway is a PaaS load balancer that maximizes throughput by automatically distributing web traffic among multiple virtual servers.

Azure Key Vault

Azure Key Vault allows centralized, secure storage of information (such as passwords, API keys, cryptographic keys, and security certificates) for which access must be controlled. Key Vault eliminates the need to include security information (such as key strings) as part of an application’s code.

How vFunction Accelerates Azure App Modernization

Ideally, a company would want to modernize all of its important legacy apps. But because traditional refactoring is so time, labor, and risk intensive, developers often settle for migrating many critical apps to the cloud basically as-is. By doing so they forego most of the benefits of the cloud ecosystem.

Now, however, vFunction has changed that equation. Its AI-driven modernization platform substantially automates the process, significantly increasing speed, lowering risk, and allowing a greater proportion of a company’s legacy app portfolio to be refactored into microservices.

In early 2022, Microsoft explicitly recognized the value vFunction brings to the Azure app modernization table. According to a recent devops.com article:

“Microsoft has teamed up with vFunction to make it easier to convert monolithic Java applications into a set of microservices that can be deployed on the Microsoft Azure cloud… the goal is to eliminate the heavy lifting currently required to shift Java applications into the cloud.”If you’d like to experience first-hand how the Azure/vFunction partnership can help modernize your company’s legacy applications, please schedule a demo today.

Ten AWS Products for Modernizing Your Monolithic Applications

In today’s rapidly changing marketplace environment, companies face an imperative to modernize their business-critical legacy applications. That’s why, as the State of the CIO Study 2022 notes, modernizing legacy systems and applications is currently among the top priorities of corporate CIOs.

In most instances such modernization involves transferring legacy apps to the cloud, which is now the seedbed of technological innovation. Once housed in the cloud, and adapted to conform to the technical norms of that environment, legacy apps can improve their functionality, performance, flexibility, security, and overall usefulness by tapping into a sophisticated software ecosystem that offers a wide variety of preexisting services.

Amazon Web Services (AWS), with a 33% share of the market, is the most widely used cloud service platform. AWS provides users with a wide range of fully managed cloud services that can make modernizing legacy apps far easier than it otherwise would be. These include container management services, Kubernetes services, database and DB migration services, application migration services, API and Security management services, support for serverless functions, and more.

In this article, we want to take a brief look at ten of these key AWS services that companies should research and test to determine how they can best be used in modernizing the organization’s suite of legacy apps. But before looking at the AWS services themselves, we need to understand exactly what modernization aims to achieve.

What Application Modernization is All About: Transforming Monoliths into Microservices

Gartner describes application modernization this way:

“Application modernization services address the migration of legacy to new applications or platforms, including the integration of new functionality to provide the latest functions to the business.”

The major problem with most legacy applications is that the way they are architected makes “the integration of new functionality” extremely difficult. That’s because such apps are typically monolithic, meaning that the codebase is basically a single unit with functions and dependencies interwoven throughout.

Any single functional change could ripple through the code in unexpected ways, which makes adapting the app to add new functions or to integrate with other systems very difficult and risky.

A microservices architecture, on the other hand, is expressly designed to make updating the application easy. Each microservice is a separate piece of code that performs a single task; it is deployed and changed independently of any others. This approach allows individual functions to be quickly and easily updated to meet new requirements without impacting other portions of the application.

The fundamental purpose of legacy application modernization, then, is to restructure the application’s codebase from a monolith to microservices.

Related: Migrating Monolithic Applications to Microservices Architecture

The Importance of Refactoring

How does that restructuring take place? In most instances it begins with refactoring. The Agile Alliance defines refactoring this way:

“Refactoring consists of improving the internal structure of an existing program’s source code, while preserving its external behavior.”

Refactoring allows developers to transform a legacy codebase into a cloud-native microservices architecture while not altering its external functionality or user interface. But because the refactored application can fully interoperate with other resources in the cloud ecosystem, updates that were previously almost impossible now become easy. For that reason, refactoring will normally be a key element of any legacy application modernization process.

The Migration “Lift and Shift” Trap

A report from McKinsey highlights a disturbing reality:

“Thus far, modernization efforts have largely failed to generate the expected benefits. Despite migrating a portion of workloads to the cloud, around 80 percent of CIOs report that they have not attained the level of agility and business benefits that they sought through modernization.”

To a significant degree this failure can be attributed to organizations confusing migration with modernization. Far too often companies have focused on simply getting their legacy applications moved to the cloud, as if that in itself constituted a significant level of modernization. That is most emphatically not the case.

The problem is that just removing an application from a data center and rehosting it in the cloud (often called a “lift and shift”) does nothing to change the fundamental nature of the codebase. If it was a monolith before being migrated, it remains a monolith once it gets to the cloud, and retains all the disadvantages of that architecture.

It’s only when a legacy application is not only migrated to the cloud but is refactored from a monolith to a microservices architecture that true modernization can begin. That’s why the modernization services provided by AWS must be evaluated in light of how they facilitate not just the migration, but more importantly the transformation of legacy applications.

Related: Accelerate AWS Migration for Java Applications

Key Modernization Services from AWS

For each of these important AWS services, we’ll provide a brief description along with a link for further information.

1. Amazon EC2 (Elastic Compute Cloud)

Amazon EC2 provides an unlimited number of virtual servers to run your apps. If, for example, you’ve had a particular application running on a physical server in your data center, you can migrate that application to the cloud by launching an EC2 server instance to run it. Rather than having to purchase and maintain your own server hardware, you pay Amazon by the second for each server instance you invoke.

2. Amazon ECS (Elastic Container Service)

Amazon ECS is a container orchestration service that allows you to run containerized apps in the cloud without having to configure an environment for the code to run in. It can be particularly helpful in running microservices apps by facilitating integration with other AWS services. Although container management is normally complex and error-prone, the distinguishing feature of ECS is its “powerful simplicity” that allows users to easily deploy, manage, and scale containerized workloads in the AWS environment.

3. Amazon EKS (Elastic Kubernetes Service)

Kubernetes is an open-source container-orchestration system with which you can automate your containerized application deployments. Amazon EKS allows you to run Kubernetes on AWS without having to install, operate, or maintain your own Kubernetes infrastructure. Applications running in other Kubernetes environments, whether in an on-premises data center or the cloud, can be directly migrated to EKS with no modifications to the code.

4. Amazon VPC (Virtual Private Cloud)

Amazon VPC allows you to define a virtual network (similar to a traditional network you might run out of your data center) within an isolated section of the AWS cloud. Other AWS resources, such as EC2 instances, can be enabled within the network, and you can optionally connect your VPC network with other networks or the internet. All AWS accounts created after December 4, 2013 come with a default VPC that has a default subnet (range of IP addresses) in each Availability Zone. You can also create your own VPC and define your own subnet IP address ranges.

5. AWS Database Migration Service (DMS)

AWS DMS allows you to migrate your databases quickly and securely to AWS. Both homogeneous (e.g. Oracle to Oracle) and heterogeneous (e.g. Oracle to MySQL) migrations are supported. You can set DMS up for either a one-time migration or for continuing replication in which changes to the source DB are continuously applied in real time to the target DB.

6. Amazon S3 / Aurora / DynamoDB / RDS

AWS provides a range of database and data storage services that can simplify the process of migrating data to the cloud:

Amazon S3 (Simple Storage Service) is a high-speed, highly scalable data storage service designed for online backup and archiving in AWS.

Amazon Aurora is “a fully managed relational database engine that’s compatible with MySQL and PostgreSQL.”

Amazon DynamoDB is “a fully managed, serverless, key-value NoSQL database” that provides low latency and high scalability.

Amazon RDS (Relational Database Service) is a managed SQL database service that supports the deployment, operation, and maintenance of seven relational database engines: Amazon Aurora with MySQL compatibility, PostgreSQL, MySQL, MariaDB, PostgreSQL, Oracle, and SQL Server.

7. Amazon API Gateway

Amazon API Gateway enables developers to securely create, publish, and manage APIs to connect non-AWS software to AWS-native applications and resources. That kind of integration, which can substantially enhance the functionality of legacy applications, is a fundamental element of the application modernization process.

8. AWS IAM (Identity and Access Management)

AWS IAM allows you to securely manage AWS access permissions for both users and workloads. You can use IAM policies to specify who (or what workloads) can access specific services and resources, and under what conditions. IAM is a feature of your AWS account, and there is no charge to use it.

9. AWS Lambda

AWS Lambda is an event-driven compute service that lets you run code as stateless functions without provisioning or managing servers or storage–also known as Function as a Service (FaaS). With those tasks performed automatically, developers can focus on their application code. Lambda supports several popular programming languages, including C#, Python, Java, and Node.js. Lambda runs a function only when triggered by an appropriate event, and can automatically scale to handle anything from a few requests per day to thousands of requests per second.

10. Amazon Migration Hub Refactor Spaces (MHRS)

Amazon describes Migration Hub Refactor Spaces as “the starting point for customers looking to incrementally refactor applications to microservices.” MHRS orchestrates AWS services to create an environment optimized for refactoring, allowing modernization teams to easily set up and manage an infrastructure that supports the testing, staging, deployment, and management of refactored legacy applications.

How vFunction Works with MHRS

vFunction and MHRS work together to refactor monolithic legacy applications into microservices and to safely stage, migrate, and deploy those microservice applications to AWS. Developers use MHRS to set up and manage the environment in which the refactoring process is carried out, while the vFunction Platform uses its AI capabilities to substantially automate both the analysis and refactoring of legacy applications.The result of this collaboration is a significant acceleration of the process of modernizing legacy apps and safely deploying them to the AWS cloud. To experience first-hand how vFunction and AWS can work together to help you modernize your legacy applications, schedule a demo today.

Five Insights for CIOs to Understand Application Modernization

This webinar from ADTMag with guest speakers Moti Rafalin, CEO of vFunction, and KellyAnn Fitzpatrick, Senior Analyst at RedMonk, reveals some critical insights with supporting survey data that can help CIOs and architects better understand, plan, prioritize, and succeed with application modernization projects.   


Insight #1 – Application Modernization Must Be A Dynamic, Not Static, Imperative

application modernization must be dynamic

Kelly’s first insight emphasized that modernizing applications is not a “one-and-done” project. It’s an ever-moving target–if you modernized a 15-year-old application in 2018, then you can expect to need further modernization initiatives to catch up to the expectations, technologies, and platforms of 2022 and beyond. 

The term “Continuous Modernization” is key here–the ability to maintain fast innovation and development cycles, rapidly detect and eliminate technical debt, and avoid poor architectural decisions and coding patterns–refers to a highly valuable set of capabilities that elite software organizations have internalized.

Insight #2 – In the Cloud ≠ Cloud Native

migration vs modernization

Kelly then dug deeper why it’s not enough to simply have workloads running in the cloud. Migrating existing applications to the cloud, often seen as “lift and shift”, is a short-term tactical action that doesn’t solve the major challenges of development velocity, technical debt accumulation, and speed of innovation. Migrating to the cloud solves certain problems, like hosting, baked-in security, and cost controls, but also introduces other problems if the application is still a monolith now running in the cloud.

The adoption of containers, managed services, serverless workloads, and new paradigms of building, integrating, and deploying applications mean something more substantial is needed: actual modernization (refactoring, rewriting, rearchitecting) of logical domains, business logic, APIs and more is where strategic value can be achieved.

Insight #3 – Microservices Have Trade-offs That Are Worth It

microservices have tradeoffs

Next up, Kelly focused on why modernizing a monolith into a microservices architecture isn’t easy–it requires a major mental shift in how development, testing, and deployment is done. The benefits of microservices have been discussed ad nauseum for many years now–like increased velocity, better flexibility, and faster development and deployment.  

However, these benefits come with a new set of challenges that IT organizations didn’t have to worry about as much before: overall application complexity, API management, event-driven communication and distributed data management are just some of these examples. Despite these trade-offs, elite technology organizations have made it a priority to succeed with a microservices architecture (when it makes sense).

Insight #4 – Technology Is Great, But Have You Tried Talented People?

modernization projects obstacles

If the decision to modernize didn’t directly impact the development team around it, things might be simpler, Kelly shared. However, we cannot ignore the human aspect–in fact, 97% of survey respondents expressed that organizational pushback against modernizing is to be expected. Whether it’s the cost, risk, fear of change, or fear of failure, it’s often difficult to get full team support to begin a large-scale modernization project.  

How does the monolithic structure of your business applications and organization influence the hiring and onboarding of new employees? Are they excited to spend their first 6 months on the job trying to understand a 15-year-old monolith with 10 million lines of code? More importantly, what does this mean for retaining valuable staff in the days of the Great Resignation?  

Insight #5 – Java (and .NET) Are Still Vital

redmonk language rankings

Finally, Kelly reminded us all that Java is still vital and evolving, adapting to modern cloud architectures in new and innovative ways. Newer programming languages like Scala, Kotlin, and Go may be viewed as popular  for greenfield projects and indeed have been used at some of the world’s most well-known companies–Twitter, Airbnb, Google, and many others have embraced alternative languages to deal with specific challenges.

Yet, as Redmonk’s Programming Language research continues to show, the newer investments and advancements in Java combined with the fact that the majority of monolithic enterprise systems were written in languages like Java (plus .NET and C# ), make Java very relevant for everyone today. These are vital programming languages to many leaders in the finance, healthcare, automotive, and manufacturing industries. When you’re a financial services provider processing $1 billion of transactions every day, you do not have to simply turn everything off and adopt a new set of technologies. This is where application modernization and the strategic, long-term impact of refactoring and re-architecting pay off.

Next Steps

To learn more, we invite you to learn from the 2022 research report Why App Modernization Projects Fail, and check out vFunction Architectural Observability Platform, a purpose-built tool to analyze, calculate, and identify technical debt in order to prioritize your efforts and make a business case for modernization.