From 85157137999da4c93a82dcd2187127e53c84dc7b Mon Sep 17 00:00:00 2001 From: samtrion Date: Fri, 22 Nov 2024 15:53:23 +0000 Subject: [PATCH] fix: updated publichDate dailydevops/website@5ecb809a490626c06875753ed0bf035661ed01ac --- authors/martin/2/index.html | 2 +- authors/martin/feed.rss | 13 ++++++++++++- authors/martin/index.html | 2 +- feed.rss | 4 ++-- index.html | 2 +- posts/buildinginsidevisualstudio/index.html | 2 +- posts/illuminate-technical-debt/index.html | 2 +- posts/index.html | 2 +- .../index.html | 2 +- .../index.html | 2 +- .../index.html | 2 +- .../index.html | 19 ++++++++++++++----- sitemap.xml | 2 +- 13 files changed, 38 insertions(+), 18 deletions(-) diff --git a/authors/martin/2/index.html b/authors/martin/2/index.html index 7c73d40..c0c415d 100644 --- a/authors/martin/2/index.html +++ b/authors/martin/2/index.html @@ -2,7 +2,7 @@

Martin Stühmer

Hello there, I’m Martin, software architect and developer from the Cologne/Bonn area. Right from the start of my professional career, I decided in favor of .NET and Microsoft technologies and tools and have always incorporated them into my work. With more than 15 years of experience in the field of software architecture and development with .NET, my focus is particularly on increasing the quality and performance of development teams, the interaction of the software solution with the target environment and the actual application down to the last byte.

In my position as Director Consulting Services @ CGI , I act as enterprise architect and developer for cloud native and .NET solutions. I am also a trainer for cloud and software architecture. In addition to my professional life, I am involved in the open source communities and currently provide them with various NuGet packages with different focuses and functionalities.

A strong willingness to learn and develop is also part of my everyday life. This was taken to a new level for me in 2021 after I successfully completed my IHK trainer and my Microsoft certified trainer this year. In addition, I was able to qualify as a trainer for CGI’s Risk and Cost Driven Architecture -program in 2022.

Published blogs

Illuminate Technical Debt

Illuminate Technical Debt

Whatever our role, be it developer, IT professional or architect, we try to avoid technical debt. If this is not possible from the outset, or if we decide to accept this technical debt for a limited period of time, we usually lack the tools to do so. This is where this article may help.

When Can I Finally Renew My Microsoft Certification

When Can I Finally Renew My Microsoft Certification

When can I finally renew my Microsoft certification? - I’m certainly not alone with this or similar questions and the associated uncertainty. Okay, a certain impatience certainly resonates as well. After all, I would also like to schedule it into my daily routine. But how?

How to Prepare for Microsoft Certification

How to Prepare for Microsoft Certification

How do I best prepare for a Microsoft certification? - this or a similar question is asked by everyone who wants to deal with the topics Microsoft, Azure, Microsoft 365, Power Platform or Dynamics 365. In this article, I would like to go into the possibilities that Microsoft offers us for preparation.

Martin Stühmer

Hello there, I’m Martin, software architect and developer from the Cologne/Bonn area. Right from the start of my professional career, I decided in favor of .NET and Microsoft technologies and tools and have always incorporated them into my work. With more than 15 years of experience in the field of software architecture and development with .NET, my focus is particularly on increasing the quality and performance of development teams, the interaction of the software solution with the target environment and the actual application down to the last byte.

In my position as Director Consulting Services @ CGI , I act as enterprise architect and developer for cloud native and .NET solutions. I am also a trainer for cloud and software architecture. In addition to my professional life, I am involved in the open source communities and currently provide them with various NuGet packages with different focuses and functionalities.

A strong willingness to learn and develop is also part of my everyday life. This was taken to a new level for me in 2021 after I successfully completed my IHK trainer and my Microsoft certified trainer this year. In addition, I was able to qualify as a trainer for CGI’s Risk and Cost Driven Architecture -program in 2022.

Published blogs

Master dependency management with automation: story behind `dependamerge`

Master dependency management with automation: story behind `dependamerge`

In software development, dependencies are inevitable - any project worth its salt relies on various libraries, frameworks, or packages. However, as I found in my own work, managing these dependencies can be an onerous task. Constant updates, new vulnerabilities, and endless manual approvals were draining my time and focus. What if, I thought, these processes could be automated? This thought led to the creation of dependamerge, a GitHub Action designed to free developers from the drudgery of manual dependency maintenance and let us get back to what we do best: building great software.

Gradually Introducing Nullability in Legacy Code: A Practical Guide for .NET and C#

Gradually Introducing Nullability in Legacy Code: A Practical Guide for .NET and C#

As developers, we’re often tasked with maintaining and modernizing legacy codebases that were written long before some of the best practices of today—such as nullability annotations—were available. While modern C# now supports nullable reference types, enabling us to avoid the dreaded NullReferenceException, introducing this feature to existing, large codebases can be a challenge.

In this article, I’ll share my step-by-step approach for introducing nullability into a legacy .NET and C# project. You’ll learn how to apply nullability in a controlled, incremental manner using project-level settings, scoped annotations, and file/method-level directives, all while maintaining the integrity of your legacy codebase. After all, modernizing your code doesn’t have to be an all-or-nothing endeavor—gradual change is key to a successful transition. Let’s get started!

Mastering .NET Project Properties: The `BuildingInsideVisualStudio` Flag

Mastering .NET Project Properties: The `BuildingInsideVisualStudio` Flag

In the ever-evolving world of .NET development, managing project configurations effectively is crucial for maintaining a clean and efficient build process. One of the less frequently discussed but highly useful properties is BuildingInsideVisualStudio. This property, when correctly utilized, can streamline your build process and ensure that your project is configured properly depending on the build environment. In this article, we’ll explore the BuildingInsideVisualStudio property with concrete examples and discuss best practices for using it effectively.

Manage Nuget Packages Centrally

Manage Nuget Packages Centrally

For over 12 years, NuGet package management has been part of the .NET ecosystem with direct integrations to various IDEs, CLIs and build systems. But a feature took 12 years before it appeared and certainly needs some more maintenance until it is mature!

A Tale of Forgotten Pennies and Lost Dollars

A Tale of Forgotten Pennies and Lost Dollars

In software development, there’s a silent debt that accrues interest over time, often hidden beneath layers of code and decisions made in haste or ignorance. This debt is aptly termed technical debt. Much like the german proverb, “Wer den Pfennig nicht ehrt, ist den Taler nicht wert”, (or the english equivalent, “A penny saved is a penny earned”) technical debt reminds us that small oversights or compromises in the present can snowball into significant challenges down the road. This article critically examines the parallels between financial principles and technical debt, emphasizing the importance of addressing both direct and indirect debt while understanding its distinction from external risks such as hacking or abuse.

Master dependency management with automation: story behind `dependamerge`

Master dependency management with automation: story behind dependamerge

In software development, dependencies are inevitable - any project worth its salt relies on various libraries, frameworks, or packages. However, as I found in my own work, managing these dependencies can be an onerous task. Constant updates, new vulnerabilities, and endless manual approvals were draining my time and focus. What if, I thought, these processes could be automated? This thought led to the creation of dependamerge, a GitHub Action designed to free developers from the drudgery of manual dependency maintenance and let us get back to what we do best: building great software.

Gradually Introducing Nullability in Legacy Code: A Practical Guide for .NET and C#

Gradually Introducing Nullability in Legacy Code: A Practical Guide for .NET and C#

As developers, we’re often tasked with maintaining and modernizing legacy codebases that were written long before some of the best practices of today—such as nullability annotations—were available. While modern C# now supports nullable reference types, enabling us to avoid the dreaded NullReferenceException, introducing this feature to existing, large codebases can be a challenge.

In this article, I’ll share my step-by-step approach for introducing nullability into a legacy .NET and C# project. You’ll learn how to apply nullability in a controlled, incremental manner using project-level settings, scoped annotations, and file/method-level directives, all while maintaining the integrity of your legacy codebase. After all, modernizing your code doesn’t have to be an all-or-nothing endeavor—gradual change is key to a successful transition. Let’s get started!

Mastering .NET Project Properties: The `BuildingInsideVisualStudio` Flag

Mastering .NET Project Properties: The BuildingInsideVisualStudio Flag

In the ever-evolving world of .NET development, managing project configurations effectively is crucial for maintaining a clean and efficient build process. One of the less frequently discussed but highly useful properties is BuildingInsideVisualStudio. This property, when correctly utilized, can streamline your build process and ensure that your project is configured properly depending on the build environment. In this article, we’ll explore the BuildingInsideVisualStudio property with concrete examples and discuss best practices for using it effectively.

A Tale of Forgotten Pennies and Lost Dollars

A Tale of Forgotten Pennies and Lost Dollars

In software development, there’s a silent debt that accrues interest over time, often hidden beneath layers of code and decisions made in haste or ignorance. This debt is aptly termed technical debt. Much like the german proverb, “Wer den Pfennig nicht ehrt, ist den Taler nicht wert”, (or the english equivalent, “A penny saved is a penny earned”) technical debt reminds us that small oversights or compromises in the present can snowball into significant challenges down the road. This article critically examines the parallels between financial principles and technical debt, emphasizing the importance of addressing both direct and indirect debt while understanding its distinction from external risks such as hacking or abuse.

Master dependency management with automation: story behind `dependamerge`

Master dependency management with automation: story behind dependamerge

In software development, dependencies are inevitable - any project worth its salt relies on various libraries, frameworks, or packages. However, as I found in my own work, managing these dependencies can be an onerous task. Constant updates, new vulnerabilities, and endless manual approvals were draining my time and focus. What if, I thought, these processes could be automated? This thought led to the creation of dependamerge, a GitHub Action designed to free developers from the drudgery of manual dependency maintenance and let us get back to what we do best: building great software.

Gradually Introducing Nullability in Legacy Code: A Practical Guide for .NET and C#

Gradually Introducing Nullability in Legacy Code: A Practical Guide for .NET and C#

As developers, we’re often tasked with maintaining and modernizing legacy codebases that were written long before some of the best practices of today—such as nullability annotations—were available. While modern C# now supports nullable reference types, enabling us to avoid the dreaded NullReferenceException, introducing this feature to existing, large codebases can be a challenge.

In this article, I’ll share my step-by-step approach for introducing nullability into a legacy .NET and C# project. You’ll learn how to apply nullability in a controlled, incremental manner using project-level settings, scoped annotations, and file/method-level directives, all while maintaining the integrity of your legacy codebase. After all, modernizing your code doesn’t have to be an all-or-nothing endeavor—gradual change is key to a successful transition. Let’s get started!

Mastering .NET Project Properties: The `BuildingInsideVisualStudio` Flag

Mastering .NET Project Properties: The BuildingInsideVisualStudio Flag

In the ever-evolving world of .NET development, managing project configurations effectively is crucial for maintaining a clean and efficient build process. One of the less frequently discussed but highly useful properties is BuildingInsideVisualStudio. This property, when correctly utilized, can streamline your build process and ensure that your project is configured properly depending on the build environment. In this article, we’ll explore the BuildingInsideVisualStudio property with concrete examples and discuss best practices for using it effectively.

VG Wort +How MSBuild builds projects - Visual Studio builds vs. MSBuild.exe builds
VG Wort VG Wort +What colous is your backlog? - SlidesVG Wort

Article overview

A Tale of Forgotten Pennies and Lost Dollars

A Tale of Forgotten Pennies and Lost Dollars

In software development, there’s a silent debt that accrues interest over time, often hidden beneath layers of code and decisions made in haste or ignorance. This debt is aptly termed technical debt. Much like the german proverb, “Wer den Pfennig nicht ehrt, ist den Taler nicht wert”, (or the english equivalent, “A penny saved is a penny earned”) technical debt reminds us that small oversights or compromises in the present can snowball into significant challenges down the road. This article critically examines the parallels between financial principles and technical debt, emphasizing the importance of addressing both direct and indirect debt while understanding its distinction from external risks such as hacking or abuse.

Master dependency management with automation: story behind `dependamerge`

Master dependency management with automation: story behind dependamerge

In software development, dependencies are inevitable - any project worth its salt relies on various libraries, frameworks, or packages. However, as I found in my own work, managing these dependencies can be an onerous task. Constant updates, new vulnerabilities, and endless manual approvals were draining my time and focus. What if, I thought, these processes could be automated? This thought led to the creation of dependamerge, a GitHub Action designed to free developers from the drudgery of manual dependency maintenance and let us get back to what we do best: building great software.

Gradually Introducing Nullability in Legacy Code: A Practical Guide for .NET and C#

Gradually Introducing Nullability in Legacy Code: A Practical Guide for .NET and C#

As developers, we’re often tasked with maintaining and modernizing legacy codebases that were written long before some of the best practices of today—such as nullability annotations—were available. While modern C# now supports nullable reference types, enabling us to avoid the dreaded NullReferenceException, introducing this feature to existing, large codebases can be a challenge.

In this article, I’ll share my step-by-step approach for introducing nullability into a legacy .NET and C# project. You’ll learn how to apply nullability in a controlled, incremental manner using project-level settings, scoped annotations, and file/method-level directives, all while maintaining the integrity of your legacy codebase. After all, modernizing your code doesn’t have to be an all-or-nothing endeavor—gradual change is key to a successful transition. Let’s get started!

Mastering .NET Project Properties: The `BuildingInsideVisualStudio` Flag

Mastering .NET Project Properties: The BuildingInsideVisualStudio Flag

In the ever-evolving world of .NET development, managing project configurations effectively is crucial for maintaining a clean and efficient build process. One of the less frequently discussed but highly useful properties is BuildingInsideVisualStudio. This property, when correctly utilized, can streamline your build process and ensure that your project is configured properly depending on the build environment. In this article, we’ll explore the BuildingInsideVisualStudio property with concrete examples and discuss best practices for using it effectively.

Article overview

A Tale of Forgotten Pennies and Lost Dollars

A Tale of Forgotten Pennies and Lost Dollars

In software development, there’s a silent debt that accrues interest over time, often hidden beneath layers of code and decisions made in haste or ignorance. This debt is aptly termed technical debt. Much like the german proverb, “Wer den Pfennig nicht ehrt, ist den Taler nicht wert”, (or the english equivalent, “A penny saved is a penny earned”) technical debt reminds us that small oversights or compromises in the present can snowball into significant challenges down the road. This article critically examines the parallels between financial principles and technical debt, emphasizing the importance of addressing both direct and indirect debt while understanding its distinction from external risks such as hacking or abuse.

Master dependency management with automation: story behind `dependamerge`

Master dependency management with automation: story behind dependamerge

In software development, dependencies are inevitable - any project worth its salt relies on various libraries, frameworks, or packages. However, as I found in my own work, managing these dependencies can be an onerous task. Constant updates, new vulnerabilities, and endless manual approvals were draining my time and focus. What if, I thought, these processes could be automated? This thought led to the creation of dependamerge, a GitHub Action designed to free developers from the drudgery of manual dependency maintenance and let us get back to what we do best: building great software.

Gradually Introducing Nullability in Legacy Code: A Practical Guide for .NET and C#

Gradually Introducing Nullability in Legacy Code: A Practical Guide for .NET and C#

As developers, we’re often tasked with maintaining and modernizing legacy codebases that were written long before some of the best practices of today—such as nullability annotations—were available. While modern C# now supports nullable reference types, enabling us to avoid the dreaded NullReferenceException, introducing this feature to existing, large codebases can be a challenge.

In this article, I’ll share my step-by-step approach for introducing nullability into a legacy .NET and C# project. You’ll learn how to apply nullability in a controlled, incremental manner using project-level settings, scoped annotations, and file/method-level directives, all while maintaining the integrity of your legacy codebase. After all, modernizing your code doesn’t have to be an all-or-nothing endeavor—gradual change is key to a successful transition. Let’s get started!

Mastering .NET Project Properties: The `BuildingInsideVisualStudio` Flag

Mastering .NET Project Properties: The BuildingInsideVisualStudio Flag

In the ever-evolving world of .NET development, managing project configurations effectively is crucial for maintaining a clean and efficient build process. One of the less frequently discussed but highly useful properties is BuildingInsideVisualStudio. This property, when correctly utilized, can streamline your build process and ensure that your project is configured properly depending on the build environment. In this article, we’ll explore the BuildingInsideVisualStudio property with concrete examples and discuss best practices for using it effectively.

VG Wort +

Tags

VG Wort VG Wort +github.com/dependabotVG Wort VG Wort +aka.ms/TrainCertPosterVG Wort
A Tale of Forgotten Pennies and Lost Dollars

A Tale of Forgotten Pennies and Lost Dollars

In software development, there’s a silent debt that accrues interest over time, often hidden beneath layers of code and decisions made in haste or ignorance. This debt is aptly termed technical debt. Much like the german proverb, “Wer den Pfennig nicht ehrt, ist den Taler nicht wert”, (or the english equivalent, “A penny saved is a penny earned”) technical debt reminds us that small oversights or compromises in the present can snowball into significant challenges down the road. This article critically examines the parallels between financial principles and technical debt, emphasizing the importance of addressing both direct and indirect debt while understanding its distinction from external risks such as hacking or abuse.

Understanding Technical Debt: An Analogy to Finance

At its core, technical debt is a metaphor borrowed from finance. When developers take shortcuts—perhaps by writing suboptimal code or delaying refactoring—they incur a “debt” that must eventually be “repaid” through additional effort, time, and resources. Like monetary debt, technical debt accumulates interest in the form of maintenance overhead, slower development cycles, and reduced system stability.

In financial terms, there are two types of debt:

  • Good Debt: Investments like mortgages or education loans, where borrowing yields long-term benefits.
  • Bad Debt: High-interest loans or credit card balances, where borrowing becomes a perpetual burden.

Similarly, technical debt can be intentional or unintentional:

  • Intentional Technical Debt: Decisions made knowingly to meet deadlines or prioritize feature delivery. This is akin to taking a calculated loan with the intention to repay soon.
  • Unintentional Technical Debt: Debt accrued due to lack of knowledge, poor design, or inadequate code reviews. This resembles bad debt—unplanned and harmful over time.

Intentional vs. Unintentional Technical Debt

Not all technical debt is created equal. To fully grasp its impact, it’s critical to differentiate between intentional and unintentional technical debt.

Intentional Technical Debt

This is the visible and measurable debt—the code shortcuts, hardcoded values, or outdated libraries. Developers know it exists and can point to it with precision. Examples include:

  • Skipping unit tests to deliver a feature faster.
  • Writing non-optimized SQL queries.
  • Using deprecated APIs for quicker implementation.

Direct technical debt is like borrowing a small sum with a clear repayment plan. The problem arises when repayment is delayed, leading to compounding interest.

Indirect Technical Debt

This is the hidden debt that manifests indirectly over time, often as a consequence of direct debt or systemic issues. Examples include:

  • Poorly documented code leading to knowledge silos.
  • Outdated infrastructure that becomes harder to replace.
  • Accumulated complexity that slows innovation.

Indirect debt is insidious—it’s harder to quantify and often only becomes apparent when the system begins to falter.

The Compound Interest Effect in Technical Debt

A defining feature of both financial and technical debt is compound interest. In software, this translates to the exponential growth of effort required to address issues as they remain unresolved.

Financial Analogy: The Power of Compound Interest

In finance, compound interest is a double-edged sword. For savings, it’s a wealth generator. For debt, it’s a destroyer. A $1,000 credit card balance at 20% annual interest, left unpaid, grows to over $6,000 in just 10 years.

Technical Debt’s Compound Interest

In technical systems, unresolved debt compounds in the following ways:

  1. Increased Maintenance Costs: Every new feature or bug fix becomes harder to implement in a convoluted codebase.
  2. Team Productivity Decline: Developers spend more time deciphering old code instead of writing new features.
  3. Higher Failure Risk: Overloaded systems are more prone to bugs and outages.

For instance, ignoring outdated dependencies today might seem trivial, but in a year, these dependencies could cause compatibility issues that require a complete system overhaul.

The Financial Mindset: Paying Off Debt Wisely

To manage technical debt effectively, developers and stakeholders need to adopt a financial mindset, considering concepts like amortization, principal repayment, and risk assessment.

Amortization: Gradual Repayment

Amortization is the process of gradually paying off a debt over time. In technical debt terms, this means allocating time in each sprint or release to tackle existing debt. For example:

  • Principal: Refactor key modules incrementally.
  • Interest: Address bugs and performance issues caused by the debt.

Cost-Benefit Analysis

Every debt repayment decision should involve a cost-benefit analysis. Ask questions like:

  • What’s the effort required to fix this debt?
  • What’s the risk of leaving it unresolved?
  • Will repaying it now unlock future opportunities?

Debt Consolidation: Strategic Prioritization

In finance, consolidating loans simplifies repayment. Similarly, technical debt can be “consolidated” by identifying the most critical areas to address first. Focus on high-impact debt—areas where small fixes can yield significant improvements.

External Risks Are Not Technical Debt

It’s essential to distinguish technical debt from external risks such as hacking, misuse, or other security vulnerabilities. While they may share some consequences, the root causes and solutions differ.

Differences in Scope

AspectTechnical DebtExternal Risks
OriginInternal decisions or shortcutsExternal threats or bad actors
ControlFully within the development team’s controlPartially or entirely external
MitigationRefactoring, tests, documentationSecurity protocols, firewalls, monitoring

Overlap: When Risks Become Debt

Occasionally, external risks can create technical debt. For example, failing to patch a known vulnerability due to resource constraints incurs a debt that compounds if the system is exploited.

A Self-Reflective Look: Where We Fall Short

As developers, we often rationalize technical debt. We promise to revisit a quick fix later or assume that future teams will handle the mess we leave behind. These assumptions are rarely true. In reality:

  1. Short-Term Thinking Prevails: Deadlines often take precedence over quality, leading to rushed decisions.
  2. Debt Is Underestimated: Teams often misjudge the time and effort required to repay debt.
  3. Stakeholders Lack Awareness: Non-technical stakeholders may not understand the implications of debt, leading to underinvestment in addressing it.

This self-critique is not to assign blame but to encourage accountability. We must recognize our role in creating and perpetuating debt, as well as our power to mitigate it.

Honoring the Penny: Practical Steps Forward

To honor the “penny” of technical debt and avoid losing the “dollar” of system stability, consider the following practices:

  1. Track Debt Transparently: Use tools to log and prioritize technical debt alongside feature development.
  2. Implement Governance: Establish policies for code quality, testing, and documentation to minimize unintentional debt.
  3. Educate Stakeholders: Communicate the cost of debt in terms stakeholders understand—time, money, and risk.
  4. Celebrate Refactoring: Make debt repayment a visible and celebrated part of your team’s work.
  5. Automate Debt Detection: Use static analysis tools to identify debt early in the development process.
  6. Encourage Ownership: Empower developers and operations to take responsibility for the debt they create and resolve it proactively.

Conclusion

The proverb “Wer den Pfennig nicht ehrt, ist den Taler nicht wert” teaches us the value of small, consistent actions. In software development, this wisdom is crucial for managing technical debt. By respecting the pennies—addressing small issues promptly and intentionally—we can avoid the compound interest that turns minor debts into major crises.

As stewards of our systems, let us commit to honoring the pennies of our craft, ensuring that our codebases remain worthy of the dollars they aim to generate.

Comments