Skip to content

Optimizing and analyzing business with Azets Cozone

Azets Cozone brand needs no introduction for Nordic business world. We address tasks such as payroll, accounting, document management and time reporting along with other business processes, through our software solutions.

twoday-blog-onko-low-code-kehittaminen-varjo-itta-featured-1

Overcoming challenges

The codebase was suited for it's original goals, but business growth demanded a next-level enterprise tech solution. It didn't help that the entire system was built on a dynamic typed programming language. The test coverage was insufficient, and every next complex feature required thorough manual testing. Additionally, the software release processes lacked automation. Every new release necessitated an extensive list of preparation steps, along with planning months in advance, leading to downtime and bug-fixing sessions during post-release days.

Furthermore, the user base was rapidly expanding, and the large clients demanded additional, user-specific features. As a result our development velocity was slowing down due to significant technical debt. It became evident that changes were necessary.

Modernization process

To address the goals, we launched new strategies to secure smooth business continuity and fast pace of new features.

We carefully analyzed the entire codebase and elaborated a detailed plan to (incrementally) reorganize entire solution reflecting both the business domain and the organization. The new modular architecture reduced complexity and hence improved maintainability, while addressing other qualities such as code reuse between different services/applications. 

The CI/CD track delivered automation pipelines, and seriously focused on unit and integration test coverage. Naturally we incorporated static analysis tools, code quality gateways, feature toggles and other robust top-of-the-class devops tools.  

The release process was fully automated and simplified, with multiple daily deployments. 

Next steps

Now we were in a good position from a development perspective, and secured high code quality for any newly written code. The refactoring  process ran in parallel, improving the legacy codebase bit by bit, constantly improving metrics and reducing risks. Legacy codebase modernization velocity was good. Now we could start addressing quality attributes of infrastructure reliability, availability, and scalability - a rapid business growth meant increasingly high loads.  

The infrastructure modernization project end goal was to migrate to AWS cloud infrastructure, containerize all our applications, and build deployment to Kubernetes with automatic scaling solution. We chose lift-and-shift migration path with minimal refactoring of our infrastructure services. That allowed us to relocate to cloud quite fast. We relied on our integration tests, smoke tests and performance tests to double check that the applications will perform on the cloud environment as expected to make the migration as smooth as possible.  

Consequently, the migration process was seamless, and as a result, we were able to scale much better. The scalable infrastructure adapted to the application load, ensuring efficient performance and improved user experience. 

 

 

Why wait for tomorrow? Let's have a conversation today

If you would like to hear more how we could help you, please fill in the form and we will contact you soon.

 

Subsidy payment system based on Business Central

We’re pleased to announce that we have just signed a contract with the Danish Agriculture Agency for the development of their new subsidy payment system in collaboration with twoday A/S. The project is also known as TUS 3.

Christian Pedersen assumes the position of CEO at twoday 

Today marks Christian Pedersen's first day as the CEO of twoday. Christian Pedersen joins from Tietoevry, where he led Tietoevry Create, the company's global digital engineering, data, and design operation with 10,000 employees. He will now lead twoday across Norway, Sweden, Denmark, Finland, and Li...

Designing OAuth client with Swift Actors

How to ensure thread-safety for an app-wide OAuth client? Have you heard about Actor reentrancy? How to work around it? Let's delve deeper into the world of Swift concurrency.