<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Pavlo Maksymov</title>
    <description>The latest articles on DEV Community by Pavlo Maksymov (@pmaksymov).</description>
    <link>https://dev.to/pmaksymov</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1325543%2Ff90112c8-03ba-4b05-abce-c4defc176dda.jpg</url>
      <title>DEV Community: Pavlo Maksymov</title>
      <link>https://dev.to/pmaksymov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pmaksymov"/>
    <language>en</language>
    <item>
      <title>Pull Request Notification Automation</title>
      <dc:creator>Pavlo Maksymov</dc:creator>
      <pubDate>Fri, 14 Mar 2025 14:41:39 +0000</pubDate>
      <link>https://dev.to/pmaksymov/pull-request-notification-automation-12og</link>
      <guid>https://dev.to/pmaksymov/pull-request-notification-automation-12og</guid>
      <description>&lt;h3&gt;
  
  
  TL;DR
&lt;/h3&gt;

&lt;p&gt;Recently I've released a new version of my &lt;a href="https://github.com/mptooling/pr-bot" rel="noopener noreferrer"&gt;GitHub Pull Request Notification Bot&lt;/a&gt; and enabled it for the internal tech team in the company. The project manages Slack messages based on the GitHub Pull Request events. Over the last two weeks, it has worked perfectly for our team and saved some time for us.&lt;/p&gt;

&lt;p&gt;In this article, I will share the details about the project and how it works.&lt;/p&gt;

&lt;p&gt;Like it? Let's dive into the details.&lt;/p&gt;




&lt;h3&gt;
  
  
  Motivation
&lt;/h3&gt;

&lt;p&gt;Automate or do things manually? The answer is always &lt;strong&gt;"Automate!"&lt;/strong&gt;, even if it is a small task.&lt;/p&gt;

&lt;p&gt;In my team, we emphasize agile development and frequent releases. Code reviews are a key part of our workflow, and we actively use Slack for communication. As a result, it has become a daily routine for the author of a pull request (PR) to manually notify the team in a Slack channel and keep the message updated so others can easily see whether the PR needs review or has already been merged or closed.&lt;/p&gt;

&lt;p&gt;So, I spent some time over the weekend building a simple application to automate it.&lt;/p&gt;

&lt;p&gt;You might wonder why we don’t just use GitHub’s Slack integration. The reason is straightforward: it generates excessive noise by sending separate messages for every event. There’s no way to update messages, format them properly, or tag users, making it less effective for our needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Basic concept and functionality
&lt;/h3&gt;

&lt;p&gt;In general, the application is a simple web server that listens to the GitHub webhooks posts messages to Slack, and creates as little noise as possible. At the same time, it must be flexible and configurable so every team can set up the application according to their needs.&lt;/p&gt;

&lt;h4&gt;
  
  
  Functionality:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Post a message&lt;/strong&gt; to the Slack channel when a new PR is created.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update message&lt;/strong&gt; in the Slack channel when PR is merged or closed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delete message&lt;/strong&gt; in the Slack channel when PR is moved from Ready for Review to Draft.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post message&lt;/strong&gt; to the Slack channel when PR is moved from Draft to Ready for Review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tag users or groups&lt;/strong&gt; in the Slack message.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple Slack channels&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple GitHub repositories&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;(Optional) &lt;strong&gt;Reactions&lt;/strong&gt; to the messages in the Slack channel when the PR is merged or closed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Application Details
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn2f3w1fsycge9vzwgwpf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn2f3w1fsycge9vzwgwpf.png" alt="General Schema" width="441" height="241"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see on the schema above, the application requires having an SQLite database. You might ask &lt;strong&gt;"Why do you need a database?"&lt;/strong&gt;. The answer is &lt;strong&gt;"To keep Slack message ID for future updates"&lt;/strong&gt;. Another reason to have a database is to store the configuration for each repository and Slack channel.&lt;/p&gt;

&lt;h4&gt;
  
  
  Configuration
&lt;/h4&gt;

&lt;p&gt;Take a look at the configuration item&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+------------------+---------------+--------------------------------------+
| Repository       | Slack Channel | Mentions                             |
+------------------+---------------+--------------------------------------+
| owner/repository | C12312312111  | &amp;lt;@U08ENEE1ZPW&amp;gt;, &amp;lt;!subteam^S12312312&amp;gt; |
+------------------+---------------+--------------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see you can set up &lt;strong&gt;channel&lt;/strong&gt; and &lt;strong&gt;mentions&lt;/strong&gt; for &lt;strong&gt;each repository&lt;/strong&gt;. This is quite useful when you have multiple teams, channels, and repositories.&lt;/p&gt;

&lt;p&gt;To manage the configuration three cli commands were created:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;gsm:write&lt;/code&gt; - to create or update the configuration to the database. The first argument (&lt;code&gt;owner/repository&lt;/code&gt;) is used as an identifier. Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    php bin/console gsm:write owner/repository SLACK_CHANNEL_ID &lt;span class="s1"&gt;'&amp;lt;@USERID&amp;gt;,&amp;lt;!subteam^GROUPID&amp;gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;gsm:list&lt;/code&gt; - to list the configuration from the database. Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    php bin/console gsm:list
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;gsm:remove&lt;/code&gt; - to remove the configuration from the database. Example:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    php bin/console gsm:remove owner/repository
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: the &lt;code&gt;gsm&lt;/code&gt; abbreviation in the command stands for GitHub Slack Mapping. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In addition, via environment variables, you can enable/disable reactions and set the emojis for the reactions. Please, visit the &lt;a href="https://mptooling.github.io/pr-bot/installation_production_env.html#setup-env-variables" rel="noopener noreferrer"&gt;configuration documentation&lt;/a&gt; for more details.&lt;/p&gt;

&lt;h4&gt;
  
  
  GitHub Webhook
&lt;/h4&gt;

&lt;p&gt;To receive the GitHub events you need to set up the webhook in the GitHub repository settings. I described the GitHub Webhook registration process in the &lt;a href="https://mptooling.github.io/pr-bot/register_github_webhook.html" rel="noopener noreferrer"&gt;GitHub webhook registration article&lt;/a&gt;. Please note, that there is no need to send all the events, "Pull request" events are enough. The application will filter out all unnecessary events.&lt;/p&gt;

&lt;h4&gt;
  
  
  Slack Integration
&lt;/h4&gt;

&lt;p&gt;To post messages to the Slack channel you need to create a Slack bot and get the token. The token should be set as an environment variable. You can find the detailed instructions &lt;a href="https://mptooling.github.io/pr-bot/slack_bot_configuration.html" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use cases
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Use case 1: A new PR is created.
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;The application posts a message to the Slack channel.&lt;/li&gt;
&lt;li&gt;The application stores the message ID in the database and relates it to the repository and PR.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Use case 2: A new draft PR is created.
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;No action is taken.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Use case 3: PR is moved from "Draft" to "Ready for Review" state.
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;The application posts a message to the Slack channel.&lt;/li&gt;
&lt;li&gt;The application stores the message ID in the database and relates it to the repository and PR.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Use case 4: PR is moved from "Ready for Review" to "Draft" state.
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;The application deletes the message in the Slack channel.&lt;/li&gt;
&lt;li&gt;The application removes the message ID from the database.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Use case 5: PR is merged.
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;The application updates the message in the Slack channel with the "[Merged]" message prefix.&lt;/li&gt;
&lt;li&gt;(optional) The application adds a reaction to the message.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Use case 6: PR is closed.
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;The application updates the message in the Slack channel with the "[Closed]" message prefix.&lt;/li&gt;
&lt;li&gt;(optional) The application adds a reaction to the message.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  How is it used in our team?
&lt;/h3&gt;

&lt;p&gt;In my team, we have one team which consists of frontend and backend developers. Frontend developers work on the React application using a separate repository and backend developers work on the API application using another repository. For the sake of limiting the number of channels, we decided to use one channel for both repositories and tag the team members who maintain the repository.&lt;/p&gt;

&lt;p&gt;After the bot application was set up I created configuration items in the database using the &lt;code&gt;gsm:write&lt;/code&gt; command. Also, I registered a webhook in both repositories and invited the bot to the channel.&lt;/p&gt;

&lt;p&gt;As a result when the frontend app repository has opened PR the message tags &lt;code&gt;@fronend&lt;/code&gt; developers and if a PR is created in api app repository the &lt;code&gt;@backend&lt;/code&gt; developers are tagged.&lt;/p&gt;

&lt;p&gt;And this is the result overview of what we have now:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk8i08ofsovqdne5yigz2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk8i08ofsovqdne5yigz2.png" alt="Final result" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;The application is super simple. It automated everyday routines and made team communication more effective.&lt;/p&gt;

&lt;p&gt;If you found this project useful, please give it a star on &lt;a href="https://github.com/mptooling/pr-bot" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; and share it with your friends.&lt;/p&gt;

&lt;p&gt;Please note that it's still under development, and I'm open to any suggestions or contributions.&lt;/p&gt;

&lt;p&gt;Check out more articles on my &lt;a href="https://pmaksymov.com/posts/" rel="noopener noreferrer"&gt;blog&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Shades of Technical Debt</title>
      <dc:creator>Pavlo Maksymov</dc:creator>
      <pubDate>Mon, 10 Feb 2025 10:59:01 +0000</pubDate>
      <link>https://dev.to/pmaksymov/shades-of-technical-debt-3pjj</link>
      <guid>https://dev.to/pmaksymov/shades-of-technical-debt-3pjj</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fme0zmeduyg6da8f3tmn7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fme0zmeduyg6da8f3tmn7.png" alt="Image description" width="800" height="870"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TLDR;
&lt;/h2&gt;

&lt;p&gt;Do you recognize yourself in the picture above? Or perhaps it's something new to you? Either way, this post is for you, regardless of your role in IT. Throughout my career, I've encountered Technical Debt numerous times, studied various approaches to managing it, and took part in the implementation of different solutions. Now, I'm eager to share these insights with you.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Technical Debt?
&lt;/h3&gt;

&lt;p&gt;Technical Debt is a metaphor introduced by &lt;em&gt;Ward Cunningham&lt;/em&gt; that compares the cost of development to the cost of borrowing money.&lt;br&gt;
Continuing with the metaphor, we can split Technical Debt into two parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Debt&lt;/strong&gt;: The original money you borrowed. This includes all the important work you put off, such as refactoring existing code, updating dependencies, and updating documentation, in favor of delivering features faster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The interest&lt;/strong&gt;: The interest you pay on a loan that grows over time. This is the extra work you have to do now because of the Debt. It's harder to connect systems, data gets messy, and you need workarounds.  This slows down delivery and costs more money.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Okay, so we understand the idea of Technical Debt. Let's summarize it using more Technical terms:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Technical Debt represents the future costs and complexity that result when we intentionally or unintentionally choose quick solutions over better-designed approaches to software development.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Shades of Technical Debt.
&lt;/h3&gt;

&lt;p&gt;Reading the definition, you may ask what I mean by &lt;em&gt;"intentional or unintentional"&lt;/em&gt;? &lt;br&gt;
Well, sometimes we are &lt;strong&gt;not aware&lt;/strong&gt; of possible Debt due to a lack of experience or knowledge. These two terms are mostly about awareness of debt.&lt;br&gt;
Diving deeper into the &lt;em&gt;shades&lt;/em&gt; of Technical Debt I want to refer to &lt;a href="https://martinfowler.com/bliki/TechnicalDebtQuadrant.html" rel="noopener noreferrer"&gt;Martin Fowler's Technical Debt Quadrant&lt;/a&gt;,&lt;br&gt;
we can see that it is divided into four sections: &lt;em&gt;Deliberate (Intentional)&lt;/em&gt;, &lt;em&gt;Inadvertent (Unintentional)&lt;/em&gt;, &lt;em&gt;Reckless&lt;/em&gt;, and &lt;em&gt;Prudent&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F57x2joj5f1dd53dokob2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F57x2joj5f1dd53dokob2.png" alt="Image description" width="512" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's break it down:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reckless/Deliberate&lt;/strong&gt; Debt happens when the team underestimates the consequences of the fast solution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reckless/Inadvertent&lt;/strong&gt; Debt happens when the team is &lt;em&gt;not aware&lt;/em&gt; of the Debt because of a lack of knowledge or experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prudent/Deliberate&lt;/strong&gt; Debt is when the team is &lt;em&gt;aware&lt;/em&gt; of the Debt, and care about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prudent/Inadvertent&lt;/strong&gt; Debt is when the team is &lt;em&gt;not aware&lt;/em&gt; of the Debt.&lt;/p&gt;

&lt;p&gt;You might say, isn't &lt;em&gt;Prudent/Inadvertent&lt;/em&gt; Debt is the same as &lt;em&gt;Reckless/Inadvertent&lt;/em&gt; Debt? Well, not exactly.&lt;br&gt;
The difference is that as soon as the &lt;em&gt;Prudent&lt;/em&gt; team discovers unintentional Technical Debt, they take action to fix it, &lt;br&gt;
whereas the &lt;em&gt;Reckless&lt;/em&gt; team does not.&lt;/p&gt;

&lt;p&gt;Continuing to learn about the &lt;em&gt;shades&lt;/em&gt; of Technical Debt, let's discuss the &lt;strong&gt;areas&lt;/strong&gt; in which Technical Debt can occur.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code Debt&lt;/strong&gt;: Represents poor coding practices, a lack of standardization, and outdated techniques. It hinders maintenance and scalability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System Design Debt&lt;/strong&gt;: Results from bad or outdated architecture or design, including overly complex designs, misuse of patterns, and lack of modularity. This Debt hinders scalability and adds new features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation Debt&lt;/strong&gt;: Involves insufficient or outdated documentation, making it difficult for team members to understand the system and decision rationale, impacting maintenance and development efficiency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing Debt&lt;/strong&gt;: This occurs when there is insufficient testing, including unit tests, integration tests, and overall test coverage. This increases the risk of defects and bugs in production, leading to system failures and customer dissatisfaction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure Debt&lt;/strong&gt;: Outdated servers, poor deployment practices, or lack of disaster recovery plans, leading to performance issues and downtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technical Skills Debt&lt;/strong&gt;: Results from lacking necessary skills or knowledge, leading to suboptimal solutions. Mitigate by investing in training and development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency Debt&lt;/strong&gt;: Using outdated or unsupported libraries, frameworks, or tools, leading to security risks and integration issues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process Debt&lt;/strong&gt;: Inefficient or outdated development processes, poor communication, lack of agile practices, and insufficient collaboration tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills Debt&lt;/strong&gt;: Results from lacking necessary skills or knowledge, leading to suboptimal solutions. Provide training and development opportunities to shift your team from &lt;em&gt;Reckless/Inadvertent&lt;/em&gt; to &lt;em&gt;Prudent/Deliberate&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another important &lt;em&gt;shade&lt;/em&gt; of Technical Debt is the size of it. It can be small, medium, or large.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Small&lt;/strong&gt;: easy to fix, usually takes up to few hours, rarely one day. The Boy Scout rule works well here: leave the code cleaner than you found it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium&lt;/strong&gt;: can be fixed by one sprint or during feature development that involves a part of the application or system that has tech Debt. This one requires more careful development cycle planning because the team needs to allocate time to update dependencies and improve code structures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Large&lt;/strong&gt;: To tackle this one, the team needs to plan way ahead because the solution may involve a complete system redesign or overhaul. A quarterly planning meeting is a good place to discuss such issues. Show the roadmap affected(slowed down) features, show how much time it takes to fix it, and how much time it will save in the future.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why is it important to manage Technical Debt?
&lt;/h3&gt;

&lt;p&gt;According to the &lt;a href="https://www.mckinsey.com/~/media/McKinsey/Business%20Functions/McKinsey%20Digital/Our%20Insights/Tech%20Debt%20Reclaiming%20tech%20equity/Tech-Debt-Reclaiming-tech-equity.pdf?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;McKinsey research&lt;/a&gt;, actively managing Technical Debt can free up engineers to spend up to &lt;strong&gt;50%&lt;/strong&gt; more&lt;br&gt;
time on work that supports business goals. For instance, the CIO of a leading cloud provider noted that by reinventing &lt;br&gt;
their Debt management, they reduced the time engineers spent addressing Technical Debt from 75% to 25%, significantly &lt;br&gt;
enhancing their operational capabilities.&lt;/p&gt;

&lt;p&gt;Stripe also researched this topic. Their report, &lt;a href="https://stripe.com/files/reports/the-developer-coefficient.pdf" rel="noopener noreferrer"&gt;The Developer Coefficient: Software engineering efficiency and its $3 trillion impact on global GDP&lt;/a&gt;, found that annual global GDP (Gross Domestic Product) losses from developer inefficiency amount to ~$300 billion. Impressive, isn't it?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa477dfelc50vgogim6zs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa477dfelc50vgogim6zs.png" alt="Image description" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another important aspect is that Technical Debt is not spread evenly. Like a poorly maintained building, some parts of a system may be in excellent condition while others are falling apart. For example, core business logic might be well-structured and maintained, while supplementary features accumulate significant Debt. This uneven distribution makes it crucial to identify and prioritize areas where Technical Debt poses the greatest risk to system stability, maintainability, or business growth.&lt;/p&gt;

&lt;p&gt;And the last thing that I'd like to mention is that Technical Debt accumulates interest over time. The longer you wait to address it, the more it will cost you in the future. It's like a snowball rolling down a hill, getting bigger and harder to stop.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to deal with Technical Debt.
&lt;/h3&gt;

&lt;p&gt;Here are some steps to help you manage Technical Debt:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Acknowledge and Identify Technical Debt.&lt;/strong&gt; &lt;br&gt;
This must be done at the business level, otherwise it will be hard to get resources to fix it. It is the responsibility of the team to communicate it to the business, clarify the impact, and propose solutions. Make sure you are using business terms when talking to the business. In this case metaphor of Technical Debt will serve you well here. Don't forget to add new terms to the company glossary so you speak the same language. If you don't have one, it is time to create one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Measure and Prioritize.&lt;/strong&gt; &lt;br&gt;
Use metrics to quantify Technical Debt, such as code complexity, bug rates, performance bottlenecks, or business risk. Prioritize tasks based on their impact on system stability, performance, or business goals. If you require more specific tools try &lt;a href="https://www.codescene.com/" rel="noopener noreferrer"&gt;CodeScene&lt;/a&gt; or look for similar approaches.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Make Technical Debt Part of Engineering Work.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;General recommendations: Allocate time in every development cycle to address Technical Debt. Include Tech Debt tasks in the backlog and prioritize them alongside new features. Apply the Boys Scout rule: leave the code cleaner than you found it. Also, worth mentioning that regular code review and pair programming often prevent Technical Debt.&lt;/li&gt;
&lt;li&gt;Personal recommendations: There is no silver bullet here. You must adapt technical debt resolution to your development process. Many organizations run dedicated technical debt sprints, while others prefer setting aside one or two days every few weeks. Another approach is to include technical debt work in feature estimates. Alternatively, teams might track debt through special epic tickets or labels in their project management system. A few companies even use specialized tools for debt management. Find what works best for your team - there's no one-size-fits-all solution.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automate and Improve Processes.&lt;/strong&gt; Use tools for code quality analysis such as static analysis and linters, automated testing, and CI to have fast feedback and catch issues early.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create a Sustainable Culture.&lt;/strong&gt; Encourage a culture of continuous improvement, knowledge sharing, and collaboration. Invest in training and development to keep skills up to date and increase awareness of Technical Debt shifting the team from Reckless to Prudent.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Track Progress and Iterate.&lt;/strong&gt; Regularly review and update Technical Debt metrics by organizing regular meetings to revisit previous progress and plan future improvements.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Conclusion.
&lt;/h3&gt;

&lt;p&gt;In conclusion, Technical Debt is a common challenge in software development that can slow down delivery, increase costs, and limit innovation. If a team manages their Technical Debt, they can improve system stability, maintainability, and overall productivity. It's essential to be aware of Technical Debt, measure and handle it, make it part of engineering work, and track progress over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  References.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Technical_Debt" rel="noopener noreferrer"&gt;Wikipedia: Technical Debt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://shiftasia.com/column/understanding-Technical-Debt-definition-and-examples/" rel="noopener noreferrer"&gt;Understanding Technical Debt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mckinsey.com/capabilities/mckinsey-digital/our-insights/breaking-Technical-Debts-vicious-cycle-to-modernize-your-business" rel="noopener noreferrer"&gt;Breaking Technical Debt's vicious cycle to modernize your business&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mckinsey.com/capabilities/mckinsey-digital/our-insights/tech-Debt-reclaiming-tech-equity" rel="noopener noreferrer"&gt;Tech Debt: Reclaiming tech equity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stripe.com/files/reports/the-developer-coefficient.pdf" rel="noopener noreferrer"&gt;The Developer Coefficient&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apenwarr.ca/log/?m=202306" rel="noopener noreferrer"&gt;Tech debt metaphor maximalism&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/QnizCRe-sV8" rel="noopener noreferrer"&gt;How to Deal with Tech Debt: Lessons learned from the best engineering teams - Alexandre Omeyer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/w9YhmMPLQ4U" rel="noopener noreferrer"&gt;Prioritizing Technical Debt as If Time &amp;amp; Money Matters • Adam Tornhill • GOTO 2022&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enjoying this content? Visit &lt;a href="https://pmaksymov.com/posts/" rel="noopener noreferrer"&gt;My Blog&lt;/a&gt; to explore more insights and ideas!&lt;/p&gt;

</description>
      <category>technicaldebt</category>
      <category>softwareengineering</category>
      <category>codequality</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Learning a New Language with Advent of Code</title>
      <dc:creator>Pavlo Maksymov</dc:creator>
      <pubDate>Mon, 02 Dec 2024 13:48:45 +0000</pubDate>
      <link>https://dev.to/pmaksymov/learning-a-new-language-with-advent-of-code-3ljk</link>
      <guid>https://dev.to/pmaksymov/learning-a-new-language-with-advent-of-code-3ljk</guid>
      <description>&lt;p&gt;Are you looking for a fun and challenging way to sharpen your coding skills or learn something new? This article is about leveraging Advent of Code, a popular annual programming event, to begin the journey of learning a new programming language.&lt;/p&gt;




&lt;p&gt;Learning is crucial for everyone in the IT world. Development is no exception to this rule. Every line of code we write and every error we debug helps us improve, yet there’s always more to learn—and that’s what makes this process so rewarding.&lt;/p&gt;

&lt;p&gt;Last year I mastered Golang, this year, I decided to learn Java. There’s something exciting about diving into something new, and discovering what a language has to offer. But where to start? In my opinion, the best way is to start with the Advent of Code.&lt;/p&gt;

&lt;p&gt;If you’ve never heard of Advent of Code, let me introduce you to one of the most engaging ways to level up your coding skills. Advent of Code is a series of daily programming puzzles that run from December 1st to December 25th. Each day unlocks a new challenge, and trust me, they’re as fun as they are amazing. These puzzles are designed for everyone — from beginners learning their first loops to seasoned engineers looking to flex their problem-solving muscles. Learn more about it &lt;a href="https://adventofcode.com/2024/about" rel="noopener noreferrer"&gt;here.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm writing this article on the 2nd of December, just completed the first challenge of Advent of Code 2024. If you are interested it is high time to start your journey. To start your challenge visit the &lt;a href="https://adventofcode.com/2024/day/1" rel="noopener noreferrer"&gt;Day 1&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;The beauty of Advent of Code is that it meets you where you are. Want to learn a new language? Great! Want to focus on optimization, and algorithm design, or just have some festive fun with code? It’s perfect for that too.&lt;/p&gt;

&lt;p&gt;Some personal tips for those who are just starting their journey with Advent of Code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don't use AI to solve puzzles. Cheating leads to nothing.&lt;/li&gt;
&lt;li&gt;Do not google the solution. It is better to spend a couple of hours solving the puzzle than to copy the solution. And again, cheating leads to nothing.&lt;/li&gt;
&lt;li&gt;Reserve a couple of hours each day to solve the puzzle.&lt;/li&gt;
&lt;li&gt;Google basic things about the syntax or read the official documentation if you are stuck.&lt;/li&gt;
&lt;li&gt;It is ok if you can't solve the puzzle. The main goal is to learn something new. You can always come back to the puzzle later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, here’s my plan: 25 days, 25 puzzles, and 25 chances to improve my Java skills. Let’s see how much I grow by the time Christmas arrives. If you’re participating too, I’ll see you on the leaderboards. Let’s make this December a month of learning, one puzzle at a time!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🌟 Let’s code 💻, let’s learn 📚, and let’s grow 🌱. 🚀&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Enjoying this content? Visit &lt;a href="https://pmaksymov.com/posts/" rel="noopener noreferrer"&gt;My Blog&lt;/a&gt; to explore more insights and ideas!&lt;/p&gt;

&lt;h3&gt;
  
  
  References:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://adventofcode.com/2024" rel="noopener noreferrer"&gt;Advent of Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pavelmaksimov25/advent-of-code-2024" rel="noopener noreferrer"&gt;My 2024 Advent of Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>adventofcode</category>
      <category>learning</category>
      <category>development</category>
    </item>
  </channel>
</rss>
