Agile Code Refactoring Explained: Why You Need It and How to Do It

Agile teams are under a lot of pressure to continuously release software while meeting tight deadlines. Sometimes, this means taking on “technical debt,” and releasing a half-baked project.

Sharing is caring!

by Matias Emiliano Alvarez Duran

08/16/2022

Technically, it works and all the stakeholders are happy. But code rot is inevitable and as software grows and becomes more complex, it gets increasingly hard to maintain and change. The solution here is refactoring. 

Refactoring in Agile means making the existing code of a program cleaner and more understandable, without changing its functionality. This allows the program to scale, and reduces further maintenance costs. 

In this guide, we’ll share the basics of code refactoring, why it’s important, how we’ve done it for our clients, along with some best practices and common pitfalls. 

Table of contents:

  1. What is refactoring in Agile?

  2. Why is refactoring your code important?

  3. When refactoring should be done in Agile development

  4. Top refactoring techniques for Agile teams 

  5. Is Agile refactoring worth it? 

  6. Frequently asked questions about refactoring in Agile

Ready to build your own custom software with a team that cares about you and your processes? We’re not code monkeys, we care about you.

What is refactoring in Agile? 

Code refactoring is the practice of making the existing source code of a program cleaner and easier to understand without changing its functionality. It’s a process used by development teams to improve code quality and reduce technical debt, which might otherwise lead to expensive reworks later on.

If you think of coding as building a house, you can think of refactoring as upgrading the plumbing system every so often, to avoid the build-up of mineral deposits which can lead to burst pipes and expensive damages.

Why is refactoring your code important? 

As software evolves, it becomes more complex and the number of code dependencies increases. So the more the software grows, the harder and more expensive it’s going to be to 

  1. Fix bugs

  2. Make changes to code

  3. Reduce technical debt

  4. Add new features

Making consistent refactoring part of your sprints gives your team the opportunity to be constantly responding to evolving code.

Often, Agile teams are in a race to deliver software quickly and reduce time to market. This  Agile technical practice is called technical debt. The problem is that it can easily lead to half-baked projects and code smell, like duplicate codes. 

Applying refactoring techniques like extract method and inline method, helps software developers create a more clean and organized code base. This helps increase code

  1. Cohesion. A cohesive code is one in which related elements are close together. This makes it easier and less expensive to address issues or fix bugs in the future.

  2. Readability. A less complex and more understandable code means team members and future developers can more efficiently maintain the code in your absence and address bugs.

  3. Maintainability. Refactoring makes your code easier to maintain and modify, as your business changes and grows. This also lowers maintenance costs. 

Continuously taking small steps towards refactoring, helps your team maintain a greater level of code hygiene, while still delivering high-quality products at a fast pace.

A clean code base makes it easier to reduce technical debt, add new features, and fix bugs.

When refactoring should be done in Agile software development 

Refactoring isn’t right for every project. For example, you shouldn’t refactor when you’re in the middle of making functional changes, since refactoring is a behavior-preserving practice. Or if the app needs to be completely revamped. However, there are some cases when it shouldn’t be missed.

For example, when software engineering teams working on medium to large projects inherit code, they’ll most likely need to start the refactoring process before working on anything else. 

3 Examples of when NaNLABS used Agilecode refactoring

To put this all into context, let’s take a look at 3 examples of when our team at NaNLABS used code refactoring to help our clients scale and develop new functions. 

1. CyberCube: Easing maintainability and developing new features faster

CyberCube is an analytics platform that enables cyber (re)insurance placement, underwriting decisions, and portfolio management optimization. This was a brownfield project, meaning that we had to implement and introduce a new software system when a legacy system was already in place.

"
“We inherited a large front-end codebase that didn’t have a good separation of concerns,” said  Anabella Di Grazia, Front-End Developer at NaNLABS. 

"
“There were some components that were 10k lines of code long and had too many responsibilities at different levels. From adding/removing CSS properties to managing complex business logic.” 

Since our development team wanted to build on that existing code, we knew we had to refactor. However, stopping the development of the platform to refactor the code wasn’t an option, so we had to refactor and build new features simultaneously, every week for two years. 

"
“What we did was identify common responsibilities, extract them as individual components that could be reused across the application and include unit tests for better maintenance,” said Anabella. “We managed to reduce these large files into well-focused and lighter components. Which enabled us to include new features faster and ease maintainability.”

Quote about refactoring at CyberCube by Anabella Di Grazia, Front-End Developer at NaNLABS

2. WootCloud: Upgrading the Full Stack platform and releasing core features

WootCloud is a Device Context-driven security firm traversing the IT/OT space across wired, wireless, and RF spectrum. 

The challenge was to improve and scale WootCloud’s platform, since it needed to constantly analyze large amounts of data to detect, prevent, and remediate security issues. 

WootCloud needed NaNLABS to support their in-house team in creating a new microservice architecture deployed in AWS infrastructure and orchestrated with Kubernetes. To do this, NaNLABS refactored several modules to make sure the platform would function in the new architecture and ecosystem.  

Our Agile pod team helped WootCloud upgrade the Full Stack platform, migrate the front-end to the latest ReactJS versions, and ultimately release the Dynamic Query API that supports all the product visualization capabilities plus additional core features.

3. Automation and Cloud Transformation to enable scalability   

NaNLABS worked with another client that offers photo books, photo cards, prints and gifts. They had a few challenges:

  1. A small engineering team with no bandwidth to do more than patching and bug fixing. 

  2. A huge amount of manual and repetitive work to configure new products and designs.

  3. A legacy e-commerce platform that generated orders with errors wasting development team energy and focus.

  4. A tool for editing photo products that was tough to use for customers and difficult for the development team to maintain and expand.

We brought in a team of seven engineers organized through three different pods to

  1. Enable the Cloud Transformation process by leveraging the Serverless Framework and AWS.

  2. Set up a test monitoring system for the whole infrastructure triggering alerts through Slack.

Our work contributed to reducing product configuration times by 20x, and reducing order errors from peaks of approximately 600 issues a day to no more than an average of five issues a day. 

At this company, configuring two products once involved a designer and a developer working hand in hand for a complete day. NaNLABS enabled one designer to create more than 20 products a day, leaving more time for strategic and added value work.

Top refactoring techniques for Agile teams

The best way to refactor is to do it in small steps and integrate it into day-to-day programming. It’s also important to do it before adding any new features or functionalities because with code changes, there are always new potential bugs. 

There are many different approaches and techniques for refactoring. But some of the most popular ones include:

  1. Red-Green-Refactoris one of the integral patterns of Test-Driven Development in Agile. Beginning with the “Red” stage, developers write a test without writing any implementation code. Once the test naturally fails, they write only the needed code to meet the functionality, test it, and expect it to pass (green.) Finally, they refactor code to make it simpler and easier to maintain. Rinse and repeat. This method makes it easy to seamlessly integrate refactoring into the overall development process.

  2. Extract Method aims to reduce code duplications and increase readability. This approach lets you “extract” a code fragment that can be grouped, move it into a separate function, and replace it with a new call to method.

  3. Simplifying Methods focus on simplifying the existing code and it involves tweaking the interaction between classes. When code is easier to read and understand, it becomes more maintainable and scalable. 

  4. Abstraction tries to remove repetitions and redundancies and is perfect for large-scale projects. In this approach, changes and adjustments happen on a gradual basis, making it easy for the programming to continue.

Four of the most popular approaches to refactoring are Extraction Method, Red-Green-Refactor, Simplifying methods, and Abstraction.

Common pitfalls to watch out for

When using any of these approaches, there are a few common mistakes your team needs to avoid, including:

  1. Not limiting the refactoring scope. Every time you start refactoring something, it can be easy to think “well, while I’m here, I might as well refactor this part as well.” For teams to remain Agile, refactoring needs to be focused and limited in scope.

  2. Refactoring the wrong things. During the refactoring process, your focus should be on addressing code smell, and cleaning the code where things are going to change or grow in the future.Refactoring the areas that are working fine and aren’t set to change would just waste your time.

  3. Delaying the development of new features forever. While making the codebase better, teams also need to focus on providing value to their clients and trying to release software as soon as possible. Constant deployment also safeguards against too many bugs.

Best practices for refactoring

Regardless of your chosen technique, it’s important to break down the refactoring process into manageable, smaller, chunks and follow them with timely tests. This results in a higher quality application that’s easier and less expensive to scale and maintain. 

Some other best practices include: 

  1. Having test coverage in place.

  2. Defining the project scope.

  3. Focusing on specific modules.

Let’s take a closer look at how our Agile pods implement these best practices to best support our clients. 

1. Always have test coverage in place.

"
“When we have a good set of tests around a piece of code, we can make changes and find out very quickly whether the effects were good or bad,” said Anabella. “We need to write tests to detect change. This is called regression testing. We periodically run tests that check for known good behavior to find out whether our software still works the way that it did in the past. With the feedback we get, we are able to make changes more carefully.”

"
“When you have tests around the areas in which you are going to make changes, you can keep most of the behavior fixed and know that you are changing only what you intend to.”

Quote about refactoring at CyberCube by Anabella Di Grazia, Front-End Developer at NaNLABS

2. Defining the project scope

At NaNLABS, we live and breathe Agile. And one of the principles we believe in is Agile continuous improvement. We work in a structured way to identify the areas that need to be optimized, understand the project, and work alongside your team to improve. And this applies to our refactoring process as well. 

"
“When we work with legacy code,” said Anabella, “we can't refactor all the code at once. It would take a lot of time and clients don't usually have it. Moreover, it’s too risky. We need a place to start.”

"
“The first thing we need to do is understand what the code does. Doing sketches is a great way to do so. Once we understand it, it’s easier to detect the effects of changes. We have a set of objects and we can figure out what will change downstream if they stop working.”

3. Focusing on specific modules.

Lastly, to help you stay on top of everything, focus on specific modules. “The key to starting to make changes to large classes or methods is to make a list of all the responsibilities a method has,” said Anabella. “Then we can group them and extract them. When responsibilities are separated, it is easier to understand, change, reuse and test the code.”

Most of the time, using best practices doesn't necessarily prevent software rot. Nevertheless, implementing them is the best way to make changes in the code when it starts to degrade and needs to be updated.

Is Agile refactoring worth it?

In Agile, code refactoring means cleaning up the existing code and making it easier to understand, without changing its external behavior. 

Its purpose is to 

  1. Improve code quality

  2. Reduce technical debt

  3. Make adding new features and fixing bugs easier

Making refactoring part of your sprints helps your team maintain a greater level of code hygiene, which means you can deploy high-quality products faster, and fix bugs and other problems more easily and with less cost.

At NaNLABS, we’re big believers in continuous refactoring and have helped companies like WootCloud, CyberCuber, and Artifact Uprising create more maintainable software that helps them scale.

"
“Even the most disciplined development team, knowing the best principles, using the best patterns, and following the best practices will create clutters from time to time. The rot still accumulates. It’s not enough to try to prevent the rot, you have to be able to reverse it.” —Michael Feathers, in Working Effectively with Legacy Code.

That’s why NaNLABS’ goal is to turn systems that gradually degrade, into systems that gradually improve.

Ready to build your own custom software with a team that cares about you and your processes? We’re not code monkeys, we care about you.

Frequently asked questions about refactoring in Agile

What is the purpose of refactoring?

The purpose of refactoring is to improve the quality of internal structure of existing code without changing the external behavior of the program, like its User Interface (UI). This makes software easier to understand and helps prevent future bugs and code rot.   

What is an example of refactoring?

For an example of refactoring, let’s imagine Sudoku software. This software needs to be able to perform various functions like populating a Sudoku board and offering the correct solution to players. As the program grows in size and popularity, the players start noticing more and more bugs and ask for them to be fixed.

However, since the existing code of the software is too long and complicated, the developers simply won’t be able to fix the bugs without scraping the code and starting from zero. Instead, they’ll need to refactor the code and make it cleaner and simpler so they can avoid similar problems in the future.

What is the difference between refactoring and regular coding?

The difference between refactoring and regular coding is that refactoring aims to improve the quality of existing code and make it clearer and more simple, while normal coding creates brand new features of a softwarethe program as a whole. Think of coding as building a wall, and refactoring as making sure every brick is laid properly.

What is refactoring in Scrum? 

In Scrum, teams refactor code to make it more lightweight, and easier to understand and change, as the Agile methodology is highly dependent on continuous iteration and development. 

More articles to read

Previous blog post

Agile

08/23/2022

Why You Should Definitely Be Adding Code Review to Your Agile Processes

Read the complete article

Next blog post

Client Stories

08/04/2022

From MVP to Enterprise Software Solution: How an Augmented Team Helped Amalgam Land Bigger Clients

Read the complete article