[REPORT] From Vision to Code: A Guide to Aligning Business Strategy with Software Development Goals is published!
GET IT here

8 Technical Debt Metrics: How to Measure Technical Debt?

readtime
Last updated on
January 22, 2024

A QUICK SUMMARY – FOR THE BUSY ONES

TABLE OF CONTENTS

8 Technical Debt Metrics: How to Measure Technical Debt?

Measuring tech debt

Utilizing metrics allows teams to track the impact of technical debt on software quality, productivity, and maintenance costs over time, enabling them to make informed decisions about resource allocation and debt management strategies.

Tracking technical debt with metrics

Keeping track of technical debt is essential for maintaining the health and sustainability of a software project. How to do that effectively?

Here are some effective strategies and practices to track and manage technical debt:

Documentation and record keeping

  • Document Technical Debt: Whenever technical debt is incurred, document it. This includes the reasons for the debt, the expected impact, and any plans for resolution.
  • Maintain a Technical Debt Register: Create a centralized document or tool where all instances of technical debt are recorded and tracked. This should include details like the nature of the debt, associated code or modules, and any deadlines for resolution.

Code reviews and analysis:

  • Regular Code Reviews: Implement a process where code is regularly reviewed by peers. This helps in identifying potential technical debt early.
  • Static Code Analysis Tools: Use tools that automatically analyze code for potential issues, such as code smells, complexity, duplication, and other indicators of technical debt.

Integration with Issue Tracking Systems:

  • Link Debt to Issues: When technical debt results in bugs or issues, link these in your issue tracking system. This provides a clear connection between the debt and its consequences.
  • Prioritize Debt Issues: Make sure that technical debt issues are prioritized alongside other work items in your backlog.

Testing and Coverage Metrics:

  • Monitor Test Coverage: Regularly review test coverage metrics to ensure that your codebase is adequately tested. Low test coverage can be an indicator of technical debt.
  • Automated Testing: Implement automated testing to continuously monitor the health of your codebase and catch issues early.

Regular Refactoring Sessions:

  • Dedicated Refactoring Time: Allocate regular time slots for refactoring and addressing technical debt. This ensures that debt is actively being paid down.
  • Refactor as You Go: Encourage developers to refactor and improve code as part of their regular development process, not just during dedicated sessions.

Metrics and Dashboards:

  • Use Metrics: Track key metrics such as code churn, complexity, and bug rates to get a quantitative view of your technical debt.
  • Dashboards: Create dashboards that visualize technical debt metrics. This helps in quickly assessing the health of the project and identifying areas that need attention.

1. Defect ratio

The Defect Ratio is a measure of the number of defects in a software system relative to the size of the software.

Relevance to technical debt

  • Higher Defect Ratio: Indicates a larger number of defects relative to the size of the software. This can be a sign of poor code quality, which often results from accumulated technical debt.
  • Monitoring Over Time: If the defect ratio increases over time, it could indicate that technical debt is rising, leading to more defects per unit of software size.
  • Quality vs. Debt: While a high defect ratio directly points to quality issues, it indirectly suggests technical debt. For instance, rushed features, lack of testing, or poor design decisions can lead to both more defects and more debt.
  • Actionable Insights: Knowing the defect ratio can help teams prioritize refactoring, improve testing strategies, or revise development practices to reduce both defects and technical debt.
  • Indicator of Software Quality: A high defect ratio suggests lower quality, which could be a result of accumulated technical debt due to issues like rushed development or poor design.
  • Maintenance and Refactoring Needs: An increasing defect ratio over time can indicate that the software is becoming more difficult to maintain, suggesting the need for refactoring and addressing technical debt.
  • Project Health Assessment: It provides a quick snapshot of the current state of the project, helping to assess whether technical debt is impacting the software negatively.

Limitations

  • Not All-Encompassing: The defect ratio alone doesn't capture all aspects of technical debt, such as architectural issues or code complexity.
  • Quality of Defect Reporting: The metric's accuracy depends on the thoroughness and consistency of defect reporting practices.
  • Dependent on Accurate Measurement: The effectiveness of this metric depends on how accurately the size of the software and the number of defects are measured.
  • Doesn't Capture All Aspects of Technical Debt: The defect ratio focuses on defects and doesn't directly measure other aspects of technical debt like code complexity or architecture issues.
  • Variability in Defect Severity: Not all defects have the same impact or require the same effort to fix, which this ratio doesn't account for.

When to use

  • Regularly throughout the development process, especially after major releases or when changes to the codebase are made.

How to measure

Count the total number of defects (reported bugs or issues) and divide it by a measure of software size (like lines of code, function points, or modules).

Defect Ratio = Size of the Software/Number of Defects​

  • Number of Defects is the total number of defects found in the software.
  • Size of the Software could be measured in different units, such as lines of code, function points, or number of modules/components.

How it helps

  • Helps in tracking the quality of the software over time, indicating whether technical debt is causing an increase in defects.
  • Can guide decisions about where to focus development efforts, particularly in identifying areas of the codebase that may be contributing disproportionately to the defect count.
  • Assists in prioritizing technical debt reduction strategies, especially when correlated with other metrics like code complexity or code churn.

2. Code Churn

Code churn refers to the percentage of a developer's own code that is recently edited (added, modified, deleted) after being written.

Code churn can be indicative of indecision, lack of clarity, or misunderstanding – all of which contribute to technical debt. High code churn, especially late in a development cycle, can be a red flag that code may be less reliable or harder to maintain.

Relevance to Technical Debt:

  • High churn may indicate unstable or problematic areas in the codebase.
  • Helps identify features or modules that are frequently changed and might be accumulating debt.

Limitations:

  • High churn isn’t always negative; it can reflect healthy iterative development.
  • Doesn’t directly measure code quality.

When to Use: Use this metric during the development phase and after releases to identify unstable code.

How to Measure: Calculate the percentage of lines of code that have been changed, added, or deleted during a specific time frame.

How it Helps: Identifying areas of frequent changes helps to pinpoint unstable code and prevent potential future issues related to constant modifications.

Analyzing code churn alongside bug count can provide insights into whether the churn is constructive (refactoring, improving code) or destructive (introducing more defects).

It helps in prioritizing areas for refactoring and understanding the impact of changes.

3. Technical Debt Ratio (TDR)

TDR is a measure of the cost to fix the technical debt relative to the size of the codebase.

TDR provides a quick snapshot of the quality of code being produced and helps to quantify technical debt in economic terms, making it easier to communicate the impact and necessity of addressing technical debt to management.

Relevance to Technical Debt:

  • Provides a monetary perspective on the impact of technical debt.
  • Helps in prioritizing debt reduction based on cost.
  • A higher ratio suggests a significant portion of development effort goes into addressing technical debt.
  • Can be used to justify investment in reducing technical debt.

Limitations:

  • Estimating the cost to fix issues can be subjective.
  • Doesn’t capture non-code aspects of technical debt (like architectural issues).
  • Might not reflect the impact of non-quantifiable aspects of debt.

When to Use: Use TDR to assess and communicate the overall health of the codebase to both technical and non-technical stakeholders.

How to Measure: TDR = (Cost to fix debt / Development cost) * 100%.

How it Helps: It provides a high-level overview of the code quality and helps prioritize refactoring efforts by identifying critical areas of debt.

Regularly monitoring TDR allows teams to observe trends and understand whether their code quality and technical debt are improving or deteriorating over time.

It assists in decision-making regarding resource allocation for fixing issues versus new development.

Technical Debt Ratio measurement - case study

Let's analyze how to measure technical debt ratio on the example of a fintech app.

In a fintech app, where reliability, security, and compliance are paramount, measuring and managing technical debt is crucial for maintaining trust and operational integrity. The technical debt ratio provides a quantifiable measure to guide maintenance efforts and resource allocation, ensuring that the app remains robust, secure, and efficient.

Step 1: Identifying components of the fintech app

  • Components: Payment processing module, investment portfolio manager, personal finance dashboard, user authentication, and regulatory compliance reporting.
  • Scope: Decide which parts of the application are to be evaluated for technical debt.

Step 2: Code analysis

  • Tools: Use static code analysis tools suitable for the programming languages and frameworks used in the fintech app (e.g., ESLint for JavaScript, SonarQube for a range of languages).
  • Example Findings: In the investment portfolio manager, there might be complex code segments with poor error handling and outdated libraries that need updating.

Step 3. Calculating remediation cost

  • Method: Estimate the time required to address the code issues identified. Consider the complexity of the fintech environment, which might require specialized skills.
  • Hourly Rate: Assume an average cost per developer hour specific to fintech development expertise (e.g., $80/hour).
  • Calculation: If it takes 15 hours to refactor the complex code and update libraries in the investment portfolio manager, the cost is 15 hours * $80/hour = $1,200.

Step 4. Calculating development cost

  • Method: Estimate the total cost of developing the app or its specific modules, including design, coding, testing, deployment, and any other expenses.
  • Example: The development cost of the investment portfolio manager might be $30,000.

Step 5: Calculating Technical Debt Ratio

  • Formula: Technical Debt Ratio = (Remediation Cost / Development Cost) * 100
  • Calculation: For the investment portfolio manager, the ratio is ($1,200 / $30,000) * 100 = 4%.

Step 6. Interpretation and action

  • Interpretation: A 4% technical debt ratio indicates a moderate level of debt. It's important to address it promptly in a fintech app due to the critical nature of financial data and transactions.
  • Action: Prioritize fixing critical issues, especially those related to security, data integrity, and regulatory compliance.

4. Code Duplication

This metric indicates the percentage of duplicated code across the codebase.

Code duplication often leads to maintenance challenges. If a bug is found in a piece of duplicated code, it needs to be fixed in all instances. This increases the likelihood of missed defects and future issues.

Relevance to Technical Debt:

  • High duplication indicates poor code quality and higher maintenance costs.
  • Points to potential areas for code reuse and refactoring.

Limitations:

  • Some duplication might be necessary or intentional.
  • Doesn’t measure other quality aspects like code complexity.

When to Use: Use it continuously to ensure that the codebase remains DRY (Don't Repeat Yourself).

How to Measure: Analyze the codebase using static code analysis tools to identify and quantify duplicated blocks of code.

How it Helps: Reducing code duplication enhances maintainability and reduces the likelihood of introducing inconsistencies during updates.

Tracking code duplication over time and across projects can highlight systemic issues in development practices that may need to be addressed.

5. Cyclomatic Complexity

It measures the number of linearly independent paths through a program’s source code, indicating code complexity.

High cyclomatic complexity indicates that the code may be harder to test thoroughly and more prone to defects. It can also be harder to read and understand, increasing the likelihood of introducing errors during future changes.

Relevance to Technical Debt:

  • Higher complexity often indicates harder-to-maintain code, contributing to technical debt.
  • Can identify areas that need refactoring.
  • Helps in estimating the effort required for testing and maintenance.

Limitations:

  • Doesn’t measure code readability or maintainability directly.
  • Can be misleading for certain code structures.
  • Some level of duplication might be unavoidable or even preferable in certain cases.
  • Doesn't indicate other aspects of code quality.

When to Use:

Use this metric to identify complex code that may be harder to maintain and more prone to defects.

How to Measure:

Use static analysis tools to calculate the number of independent paths through the code.

How it Helps:

Managing complexity ensures that the code remains maintainable and reduces the risk of introducing errors during changes.

Analyzing cyclomatic complexity at a method, class, and module level can help identify specific areas that may benefit most from refactoring.

The metric guides developers to simplify complex code, reducing future maintenance burden.

6. Technical Debt Quadrant

The quadrant categorizes technical debt into four types: Reckless vs. Prudent and Deliberate vs. Inadvertent.

Understanding the nature and origin of technical debt helps teams to develop strategies for addressing it and potentially preventing similar debt in the future. It also aids in making informed decisions about when to incur deliberate debt.

Relevance to Technical Debt:

  • Helps understand the nature of technical debt and the reasoning behind it.
  • Assists in deciding how to address different types of technical debt.

Limitations:

  • More of a conceptual tool; doesn't provide quantitative measures.
  • Requires subjective judgment to categorize debt.

When to Use: Use this metric during project retrospectives and planning to understand and communicate the nature of the technical debt.

How to Measure: Categorize existing technical debt items into the four quadrants based on retrospectives and team discussions.

How it Helps: It helps in understanding the origin of debt and informs strategies for prevention and repayment.

Regularly revisiting and re-evaluating the technical debt quadrant helps to ensure that deliberate and prudent debt does not inadvertently become reckless or inadvertent over time.

Measuring technical debt quadrant - example

Reckless and Deliberate (Quadrant I)

  1. Example: The development team decides to bypass encryption for data in transit to speed up the deployment of a new online payment feature.
  2. Measurement: Evaluate the number and severity of potential security breaches due to unencrypted data. This can involve a risk assessment to quantify the potential financial losses and damage to customer trust. Security testing tools can be used to detect unencrypted data transmission.

Reckless and Inadvertent (Quadrant II)

  1. Example: Inexperienced developers implement a loan application feature without proper understanding of SQL, leading to inefficient database queries.
  2. Measurement: Perform a code review focused on database interactions. Use database profiling tools to identify slow-running queries and measure their impact on overall system performance. Assess the additional server resources required to handle these inefficient queries and the impact on user experience, like slow response times for loan status updates.

Prudent and Deliberate (Quadrant III)

  1. Example: Choosing an older framework for the user authentication system because the team is more familiar with it, even though it might lack some newer security features.
  2. Measurement: Compare the current framework with newer alternatives in terms of features and security enhancements. Estimate the time and cost for training the team on a new framework and the effort needed to migrate the authentication system in the future. Balance this against the immediate productivity gains from using a familiar framework.

Prudent and Inadvertent (Quadrant IV)

  1. Example: Designing the customer transaction history page without considering the high volume of data that would accumulate over years, leading to slow page loads.
  2. Measurement: Monitor the page load times and database query performance as the data volume grows. Use analytics tools to track user engagement and abandonment rates on the transaction history page. Estimate the effort and cost required to refactor the page for efficient data handling and faster load times.

For each quadrant, the key is to balance the immediate needs of the project with long-term sustainability and efficiency. This involves regular code reviews, performance monitoring, security audits, and user feedback analysis. By quantifying the impact of technical debt in these specific areas, the team can make informed decisions about prioritizing and addressing these issues in the context of the online banking system.

7. Open Bug Count and Age

This metric tracks the number of open bugs and how long they have been open.

A growing number of open bugs or bugs that have been open for a long time can indicate that technical debt is being neglected. This can lead to a deteriorating codebase and user experience.

Relevance to Technical Debt:

  • High numbers or long-standing bugs can indicate underlying quality issues contributing to technical debt.
  • Useful for prioritizing bug fixes.
  • Helps prioritize bug fixes and identify areas needing improvement.

Limitations:

  • The severity and impact of bugs vary; not all bugs contribute equally to technical debt.
  • Bug counts alone don't give a complete picture of the software's health.

When to Use: Use this metric continuously to monitor the overall quality and health of the application.

How to Measure: Use issue tracking tools to count the number of open bugs and calculate their age.

How it Helps: Ensuring bugs are addressed in a timely manner prevents the accumulation of defect-related technical debt.

Analyzing bug count and age alongside code churn and TDR can provide a more comprehensive view of the codebase's health and the impact of technical debt.

8. Test Coverage

Test coverage indicates the percentage of your codebase tested by automated tests.

While high test coverage is not a guarantee of code quality, inadequate test coverage can mean that the codebase is not well-protected against regressions, making it riskier to address technical debt through refactoring.

Relevance to Technical Debt:

  • High test coverage can reduce the likelihood of bugs and technical debt.
  • Indicates the robustness of testing practices.
  • Low test coverage can lead to undiscovered bugs and increase technical debt.
  • High coverage helps ensure code changes don't introduce new issues.

Limitations:

  • High coverage doesn't guarantee high-quality tests or code.
  • Can lead to a false sense of security if tests are not well-designed.

When to Use: Use this metric continuously to ensure that the codebase is adequately tested.

How to Measure: Use testing tools and frameworks to calculate the percentage of code executed during testing.

How it Helps: Maintaining adequate test coverage ensures that the codebase is robust and allows for safer refactoring and feature development.

Observing test coverage alongside bug discovery rates can help teams understand whether their tests are effective and where additional testing may be beneficial.

9. Time to Market (TTM)

TTM is the time taken to develop and deploy a feature or product from conception to the customer.

If TTM is increasing, it may indicate that technical debt is slowing down feature development. This can impact the organization’s ability to compete and respond to market demands.

Interpretation and Relevance to Technical Debt:

  • Longer time to market can indicate inefficiencies and potential technical debt.
  • Striving for shorter time to market can sometimes lead to accruing more technical debt.

Limitations:

  • Time to market is influenced by many factors, not just technical debt.
  • Short time to market isn't always positive, especially if it leads to lower quality.

When to Use: Use this metric to assess the impact of technical debt on feature development speed.

How to Measure: Measure the duration from when a feature is planned to when it is available to users.

How it Helps: Monitoring TTM helps to understand how technical debt is impacting the team’s ability to deliver features promptly.

Analyzing TTM alongside other metrics like code churn and open bug count can provide insights into whether increasing TTM is due to technical debt or other factors.

10. Lead time

Measures the time from the conception of a new feature or product until its completion.

Interpretation and Relevance to Technical Debt:

  • Longer lead times can be a symptom of high technical debt, as existing issues slow down new development.
  • Helps in identifying bottlenecks in the development process.

Limitations:

  • Influenced by many factors beyond technical debt, such as team size and resource allocation.
  • Not all delays are due to technical debt.

When to Use: For process improvement and identifying areas where technical debt is hindering progress.

How to Measure: Tracking the time from initial idea or request to the final delivery of the product or feature.

How it Helps: Pinpoints areas where reducing technical debt could speed up development.

11. Debt index

A composite metric that combines various indicators of technical debt into a single index.

Interpretation and Relevance to Technical Debt:

  • Provides a holistic view of technical debt in the project.
  • Can be used to track changes in technical debt over time.

Limitations:

  • The construction of the index can be subjective, depending on which metrics are included.
  • May oversimplify complex aspects of technical debt.

When to Use: For overall assessment and tracking of technical debt trends.

How to Measure: Combining various technical debt metrics (like code complexity, bug count, etc.) into a single index.

How it Helps: Offers a high-level overview of technical debt, useful for management and stakeholder communication.

12. Changed Failure Rate

Measures the percentage of changes (e.g., deployments or code commits) that fail and require immediate remediation (like a hotfix or rollback).

Interpretation and Relevance to Technical Debt:

  • A high change failure rate can indicate poor code quality or inadequate testing, contributing to technical debt.
  • Helps identify the stability and reliability of the development and deployment processes.

Limitations:

  • Some failures are normal and not indicative of technical debt.
  • Doesn't capture the underlying causes of the failures.

When to Use: To assess the reliability of the development and deployment pipeline.

How to Measure: Tracking the success and failure rates of deployments and code changes.

How it Helps: Indicates areas where improvements in code quality and testing can reduce technical debt.

13. Number of Failed CI/CD Events

Counts the number of times continuous integration (CI) or continuous deployment (CD) processes fail.

Interpretation and Relevance to Technical Debt:

  • Frequent CI/CD failures can indicate underlying issues in code quality, testing, or the build process, contributing to technical debt.
  • Helps in identifying the reliability and efficiency of automated processes.

Limitations:

  • Some failures might be due to external factors unrelated to technical debt.
  • Doesn't provide insights into the nature of the issues causing the failures.

When to Use: For monitoring and improving the effectiveness of CI/CD pipelines.

How to Measure: Tracking the frequency and causes of failures in CI/CD processes.

14. New Bugs vs Closed Bugs

This metric tracks the number of new bugs reported versus the number of bugs that have been resolved or closed over a specific period.

Interpretation and Relevance to Technical Debt

  1. Balance of Bug Creation and Resolution: A high number of new bugs compared to closed ones could indicate growing technical debt, as it suggests issues are being introduced faster than they are being resolved.
  2. Software Stability: A sudden spike in new bugs might indicate problems introduced in recent updates, reflecting the impact of rushed development or insufficient testing, both of which can contribute to technical debt.
  1. Project Health Monitoring: Regularly comparing new and closed bugs can help in assessing the health and progress of a project. A project with decreasing technical debt should ideally show a trend of decreasing new bugs or an increasing rate of bug closure.
  2. Prioritization and Resource Allocation: This metric can help in prioritizing bug fixing and allocating resources effectively, which is crucial for managing and reducing technical debt.

Limitations

  1. Not All Bugs are Equal: This metric doesn't account for the severity or complexity of the bugs. Therefore, the raw numbers might be misleading without the context of bug impact.
  2. Quality of Bug Reporting: The reliability of this metric depends on the consistency and quality of bug reporting practices. Inconsistent reporting can skew the data.
  3. Does Not Reflect Underlying Causes: While this metric can signal potential problems, it doesn't directly point to the causes of technical debt.

When to Use

  • Use this metric regularly as part of the software development lifecycle to monitor the rate of bug occurrence and resolution, which can be an indirect indicator of the quality of the code and the potential accumulation of technical debt.

How to Measure

  • Track the number of new bugs reported and the number of bugs closed in your issue tracking or project management software over regular intervals (e.g., weekly, monthly).

How It Helps

  • Helps in understanding the dynamics of bug occurrence and resolution in a project.
  • Can signal when technical debt might be increasing, requiring attention to areas of the codebase that are generating new bugs.
  • Assists in resource planning for bug fixing and technical debt reduction efforts.

How to compose a set of technical debt metrics

Let's take a look at a few examples showing which factors to pay attention to while composing a set of tech debt metrics for a particular case:

Early-Stage Startup Building an MVP (Minimum Viable Product)

  1. Metrics to Focus On: Code Churn, Test Coverage, Time to Market (TTM).
  2. Reasoning: Startups need to move fast and deliver products quickly. High code churn might indicate rapid iteration, which is common in startups. Test coverage is important to maintain quality without extensive manual testing. TTM is crucial for understanding how quickly the product is evolving.

Established Fintech Company With Complex Software

  1. Metrics to Focus On: Technical Debt Ratio, Cyclomatic Complexity, Open Bug Count and Age.
  2. Reasoning: For a complex and established codebase, it’s important to monitor the Technical Debt Ratio to understand financial implications. Cyclomatic Complexity helps in managing code maintainability and testability, which is vital in fintech for security and reliability. Tracking Open Bug Count and Age is crucial to ensure the software remains reliable and trustworthy.

<span class="colorbox1" fs-test-element="box1"><p>Need some help with measuring and repaying your technical debt? Check out this ranking of top fintech software development companies, who are experienced in dealing with technical debt and legacy system modernization challenges.</p></span>

Healthcare Software Requiring High Compliance

  1. Metrics to Focus On: Code Duplication, Test Coverage, Technical Debt Quadrant.
  2. Reasoning: Healthcare software demands high accuracy and reliability. Code duplication needs to be low to reduce errors and inconsistencies. High test coverage is critical to ensure all functionalities are tested and compliant with healthcare regulations. Understanding the Technical Debt Quadrant helps in making informed decisions about tackling technical debt while remaining compliant.

E-Commerce Platform

  1. Metrics: Code Churn, Technical Debt Ratio, Open Bug Count and Age.
  2. Rationale: E-commerce platforms require fast, iterative development (hence, Code Churn), need to manage financial implications of technical debt (Technical Debt Ratio), and ensure high uptime and reliability (Open Bug Count and Age).

Gaming Development Company

  1. Metrics: Cyclomatic Complexity, Test Coverage, Time to Market.
  2. Rationale: Game development involves complex logic and graphics (Cyclomatic Complexity), requires thorough testing for a smooth user experience (Test Coverage), and needs to meet market deadlines (Time to Market).

Educational Tech (EdTech) Software

  1. Metrics: Code Duplication, Technical Debt Quadrant, Test Coverage.
  2. Rationale: EdTech software often scales rapidly, requiring maintainable code with minimal duplication (Code Duplication), a strategic approach to technical debt (Technical Debt Quadrant), and ensuring functionality with thorough testing (Test Coverage).

Enterprise Resource Planning (ERP) Software

  1. Metrics: Technical Debt Ratio, Code Duplication, Technical Debt Quadrant.
  2. Rationale: ERP systems are large and complex, where financial implications of technical debt are significant (Technical Debt Ratio). Reducing code duplication enhances efficiency and maintainability (Code Duplication). Understanding the nature of technical debt through the Technical Debt Quadrant helps in managing it effectively without impacting the diverse functionalities of ERP software.

Start measuring tech debt

Each of these metrics provides a different lens through which to view technical debt, and together they offer a comprehensive overview of the health of the codebase and the impact of technical debt on the team and the product. It's crucial to analyze these metrics holistically and in the context of one another to develop effective strategies for managing technical debt.

Frequently Asked Questions

No items found.

Our promise

Every year, Brainhub helps 750,000+ founders, leaders and software engineers make smart tech decisions. We earn that trust by openly sharing our insights based on practical software engineering experience.

Authors

Olga Gierszal
github
IT Outsourcing Market Analyst & Software Engineering Editor

Software development enthusiast with 7 years of professional experience in the tech industry. Experienced in outsourcing market analysis, with a special focus on nearshoring. In the meantime, our expert in explaining tech, business, and digital topics in an accessible way. Writer and translator after hours.

Olga Gierszal
github
IT Outsourcing Market Analyst & Software Engineering Editor

Software development enthusiast with 7 years of professional experience in the tech industry. Experienced in outsourcing market analysis, with a special focus on nearshoring. In the meantime, our expert in explaining tech, business, and digital topics in an accessible way. Writer and translator after hours.

Read next

No items found...

previous article in this collection

It's the first one.

next article in this collection

It's the last one.