<?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: adegiamb</title>
    <description>The latest articles on DEV Community by adegiamb (@adegiamb).</description>
    <link>https://dev.to/adegiamb</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%2F220341%2F2efb6c9e-01a2-405e-ac58-dea4518aad15.jpeg</url>
      <title>DEV Community: adegiamb</title>
      <link>https://dev.to/adegiamb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adegiamb"/>
    <language>en</language>
    <item>
      <title>The "Internal Consultant" Framework: Engineering Your Career Sprint by Sprint</title>
      <dc:creator>adegiamb</dc:creator>
      <pubDate>Wed, 25 Feb 2026 12:38:20 +0000</pubDate>
      <link>https://dev.to/adegiamb/the-internal-consultant-framework-engineering-your-career-sprint-by-sprint-5a16</link>
      <guid>https://dev.to/adegiamb/the-internal-consultant-framework-engineering-your-career-sprint-by-sprint-5a16</guid>
      <description>&lt;h2&gt;
  
  
  The Sprint as a Contract: Earning Your Next "Gig"
&lt;/h2&gt;

&lt;p&gt;In a traditional job, you assume you’ll be there on Monday.  In consulting, you’re only as good as your current engagement.  Treat every two-week sprint as a &lt;strong&gt;fixed-term contract&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Statement of Work (SOW):&lt;/strong&gt; Your Sprint Backlog isn't just a list of chores; it’s a legal agreement of deliverables. If you miss a deadline without communication, you’ve "breached" the contract.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The "Rehire" Test:&lt;/strong&gt; At the end of every sprint, ask yourself: If I had to pitch for the next two weeks of work based solely on my performance in the last two, would this "client" (my manager/PO) hire me?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability is the Product:&lt;/strong&gt; Consultants get rehired because they remove uncertainty. Be the person whose "In Progress" column never hides a surprise.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Retro: Your Quarterly Business Review**
&lt;/h2&gt;

&lt;p&gt;Most people use Retrospectives to vent or stay silent. Use them as a &lt;strong&gt;Strategic Feedback Loop&lt;/strong&gt; to improve relationships:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Positive Feedback (The Value Add):&lt;/strong&gt; Don’t just say "Good job, team." Frame it as a successful process. "Our new CI/CD pipeline reduced our deployment 'cost' by 20%." Proves you understand the impact of the items you are working on.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Improvement Feedback (The Gap Analysis):&lt;/strong&gt; Frame friction as a business risk.  Instead of "I hate these long meetings," try: "The current meeting structure is a bottleneck that reduces our engineering throughput."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consultant’s Edge:&lt;/strong&gt; Use the Retro to show you aren't just doing the work—you are optimizing the machine that produces the work.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Self-Review: Mirror, Mirror
&lt;/h2&gt;

&lt;p&gt;Honesty is the consultant’s greatest tool.  If you were a CEO paying $200/hour for your own services, would you be satisfied?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Consultant’s Audit:&lt;/strong&gt; &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Did I provide a solution, or just a list of problems?&lt;/li&gt;
&lt;li&gt;Was my communication proactive, or did the client have to hunt me down?&lt;/li&gt;
&lt;li&gt;Did I leave the codebase (the client's asset) better than I found it?
If you wouldn't hire "you," it’s time to pivot your strategy.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Beyond the Code: The Relationship Equity
&lt;/h2&gt;

&lt;p&gt;The biggest mistake "order-takers" make is thinking the code is the only deliverable. &lt;strong&gt;The code is the commodity; the relationship is the bridge to the next project.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stakeholder Empathy:&lt;/strong&gt; Understand what keeps your Product Owner up at night. Are they worried about a demo? A bug? A board meeting? Solving their stress is what gets you remembered.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The "Liking" Factor:&lt;/strong&gt; People hire consultants they like and trust. Taking five minutes to understand a teammate’s workflow or offering to help a junior dev isn't "distraction"—it’s C*&lt;em&gt;lient Success Management&lt;/em&gt;*.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visibility:&lt;/strong&gt; If you do great work but no one sees it, did it happen? Ensure your "client" understands the complexity you navigated and the value you delivered.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary Table: Employee vs. Consultant
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Feature&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;The "Employee" Mindset&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;The "Consultant" Mindset&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The Sprint&lt;/td&gt;
&lt;td&gt;A cycle to get through.&lt;/td&gt;
&lt;td&gt;A contract to be fulfilled.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Communication&lt;/td&gt;
&lt;td&gt;Responds when asked.&lt;/td&gt;
&lt;td&gt;Proactively manages expectations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feedback&lt;/td&gt;
&lt;td&gt;Complains about blockers.&lt;/td&gt;
&lt;td&gt;Proposes systemic optimizations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Goals&lt;/td&gt;
&lt;td&gt;Close the ticket.&lt;/td&gt;
&lt;td&gt;Deliver value and build trust.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>softskills</category>
      <category>career</category>
      <category>mentorship</category>
    </item>
    <item>
      <title>Legacy Without the Ego</title>
      <dc:creator>adegiamb</dc:creator>
      <pubDate>Mon, 02 Feb 2026 01:23:44 +0000</pubDate>
      <link>https://dev.to/adegiamb/legacy-without-the-ego-18g5</link>
      <guid>https://dev.to/adegiamb/legacy-without-the-ego-18g5</guid>
      <description>&lt;p&gt;Reviewing legacy code is often treated like a chore, but it’s actually a sign of success.  If a codebase lives long enough to become "legacy," it means the product survived.  As we navigate the layers of old logic to implement new features, our most excellent tool isn't a debugger—it’s empathy.&lt;/p&gt;

&lt;h2&gt;
  
  
  1.  Evolution is Mandatory
&lt;/h2&gt;

&lt;p&gt;Applications are living organisms.  Feature requests, scaling needs, and market shifts mean that code which was perfect two years ago might be a bottleneck today.  Reviewing legacy code isn’t an "extra" task; it is a fundamental part of the development lifecycle.  When we revisit old features, we aren't just looking at "old stuff"—we are observing how the application has grown and where it needs to go next.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. You Don’t Have the Full Picture
&lt;/h2&gt;

&lt;p&gt;It is easy to be a critic with the benefit of hindsight.  When you encounter a "hacky" solution, remember that you are looking at the result, not the process.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Invisible Constraints:&lt;/strong&gt; That "weird" logic might have been a hotfix for a critical production bug at 3:00 AM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Moving Target:&lt;/strong&gt; The requirements might have changed many times during development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Human Element:&lt;/strong&gt; The team member might have been a newbie and learning on the fly, or a senior dev juggling five different projects under a tight deadline.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. The Prime Directive: Assume Excellence
&lt;/h2&gt;

&lt;p&gt;Regardless of what you discover in the files, operate under the belief that the person who wrote that code did the best job they could.  They worked with the information they had, the skills they possessed at the time, and the specific tools available to them.&lt;/p&gt;

&lt;p&gt;When you assume the previous developer(s) did their best, your mindset shifts from blame to curiosity.  Instead of asking, "Why did they do this so poorly?" you start asking, "What problem were they trying to solve that necessitated this approach?"&lt;/p&gt;

&lt;h2&gt;
  
  
  4.  Git Blame is for Context, Not Conflict
&lt;/h2&gt;

&lt;p&gt;The git blame command has an unfortunate name, but it shouldn't be used to find a target.  Instead, use it as a bridge to tribal knowledge.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;Identify Resources:&lt;/strong&gt; Check if the author still works at the company. If they do, reach out with curiosity: "Hey, I'm working on the checkout logic you touched last year—do you remember if there was a specific reason we handled it this way?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Find the "Why":&lt;/strong&gt; Use the commit history to find the original Pull Request. Often, the discussion in that PR contains the specific business logic that explains the implementation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respect the Timeline:&lt;/strong&gt; Seeing that a piece of code hasn't been touched in years tells you it’s stable, even if it’s not "pretty."&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Move Forward with an Open Mind
&lt;/h2&gt;

&lt;p&gt;The goal of a code review is improvement, not a trial. Once you understand the "why" behind the legacy logic, focus your energy on the "how" of the future.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Understand first, refactor second:&lt;/strong&gt; Never delete what you don't fully understand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leave it better than you found it:&lt;/strong&gt;  You don't have to rewrite the whole module, function. You can make small, incremental cleanups to make it easier for the next developer to improve the code.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document the context:&lt;/strong&gt; When you update the code, leave a comment explaining why the change was made so the next person doesn't have to guess.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>codereview</category>
      <category>cleancode</category>
      <category>softskills</category>
    </item>
    <item>
      <title>The Power of the Duo: Why Strategic Partnerships are the Secret to Resilient Teams</title>
      <dc:creator>adegiamb</dc:creator>
      <pubDate>Mon, 12 Jan 2026 12:19:38 +0000</pubDate>
      <link>https://dev.to/adegiamb/the-power-of-the-duo-why-strategic-partnerships-are-the-secret-to-resilient-teams-4b7n</link>
      <guid>https://dev.to/adegiamb/the-power-of-the-duo-why-strategic-partnerships-are-the-secret-to-resilient-teams-4b7n</guid>
      <description>&lt;p&gt;In the modern workplace, we most often focus on reducing the bus factor, but &lt;strong&gt;one-on-one partnerships/partner-in-crime&lt;/strong&gt; can inspire leaders to see their role in nurturing resilient, high-performing teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  1.  The Tactical Advantage: Speed and Support
&lt;/h2&gt;

&lt;p&gt;High-functioning partners develop a "short-hand." You don't need a 20-minute preamble; you can get straight to the "meat" of the problem because your partner already has the context.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Ultimate Sounding Board:&lt;/strong&gt; Test radical ideas in a safe space before presenting them to the broader group.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Safety Net in Every Meeting:&lt;/strong&gt; When a meeting gets heated, or you hit a technical wall, your partner steps in to provide context. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2.  Real-World Resilience: When Life Happens
&lt;/h2&gt;

&lt;p&gt;The real test of a partnership isn't when things are going well—it's when things get difficult.  These two personal experiences illustrate how having a partner in crime can support you and affect your team/pod.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case Study A: The Peer Proxy (Tech Lead + Tech Lead)
&lt;/h3&gt;

&lt;p&gt;When I had to take sudden leave to help my mother with a health issue, I didn't even have to ask my partner—another Tech Lead—to help.  He stepped in immediately.  Because the team already viewed him as my "partner in crime," they trusted him implicitly.  I could focus entirely on my family, knowing the team was on track, and my responsibilities were in the hands of capable people as capable as I was.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case Study B: The Two-Year Anchor (Developer + PM)
&lt;/h3&gt;

&lt;p&gt;A long-term family crisis tested this partnership.  My father was ill for two years, and during that time, my PM was my rock.  Our partnership survived a year-long gap while she was on maternity leave; once she returned, the partnership hadn't aged a day.&lt;br&gt;
Two moments stand out that defined this partnership:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Meeting Shield:&lt;/strong&gt; During a particularly diffcult time, I had a brief breakdown in a meeting.  Without missing a beat, she took over the discussion and moved the agenda forward, giving me the space to collect myself and rejoin when I was ready.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Advocate:&lt;/strong&gt; She helped me raise my situation to my manager and the POD to ensure I got the full support and flexibility I needed to balance work and family.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  3.  Developers are Partners, Not "Minions"
&lt;/h2&gt;

&lt;p&gt;The most successful pods I’ve seen are built on shared ownership, which fosters a sense of value and commitment among developers and leaders alike.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 1: The "Minion" Model (Command and Control)
&lt;/h3&gt;

&lt;p&gt;I once sat in a meeting where a Product Manager said, &lt;strong&gt;&lt;em&gt;"Remember, developers, you work for me, so make sure everything comes through me."&lt;/em&gt;&lt;/strong&gt; The moment that was said, the air left the room.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Friction skyrocketed&lt;/td&gt;
&lt;td&gt;It became an "us vs. them" dynamic.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Dictatorship Feel&lt;/td&gt;
&lt;td&gt;Meetings became heated and defensive.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Blame Game&lt;/td&gt;
&lt;td&gt;hen things went wrong, &lt;strong&gt;&lt;em&gt;finger-pointing occurred immediately.&lt;/em&gt;&lt;/strong&gt;  Because there was no shared ownership, everyone looked for someone else to blame to protect themselves.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chaos by Proxy&lt;/td&gt;
&lt;td&gt;Last-minute requests became the norm, often arriving without any detail or "why."&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Example 2: The "Partner" Model (Co-Creation)
&lt;/h3&gt;

&lt;p&gt;Twice in my career, I’ve seen the opposite.  When the product team treats developers as equals from day one, they adopt a powerful mantra: "We rise and fall as one."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Safe Discussions&lt;/td&gt;
&lt;td&gt;Conversations are easy and focused on the issue, not titles.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full Ownership&lt;/td&gt;
&lt;td&gt;The team feels like they are part of the solution, not just the code.  When things go wrong, they fix it together instead of looking for someone to blame.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proactive Support&lt;/td&gt;
&lt;td&gt;Team members jump in to create tickets or action items for each other.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The "Fun" Factor&lt;/td&gt;
&lt;td&gt;The team is actually having fun because they aren't just working—they are winning together.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Comparing the Two Worlds
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Feature&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;The "Minion" Model&lt;/th&gt;
&lt;th&gt;The "Partner" Model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;The Mindset&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"You work for me."&lt;/td&gt;
&lt;td&gt;"We rise and fall as one."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;When things fail&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Finger-pointing and blame.&lt;/td&gt;
&lt;td&gt;Shared fixing and learning.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Communication&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Top-down and filtered.&lt;/td&gt;
&lt;td&gt;Equal, safe, and open.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Personal Crisis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Seen as a "blocker."&lt;/td&gt;
&lt;td&gt;Met with advocacy and "taking the mic."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Longevity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Trust is fragile; high turnover.&lt;/td&gt;
&lt;td&gt;Survives leaves and long-term challenges.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  4.  A Note to Leadership: Embrace the Duo
&lt;/h2&gt;

&lt;p&gt;There is sometimes a management instinct to rotate people frequently to "prevent silos." However, breaking up a high-performing partnership is often a strategic mistake.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Trust is Faster than Process&lt;/td&gt;
&lt;td&gt;Partners move quicker.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Institutional Knowledge&lt;/td&gt;
&lt;td&gt;Partners act as two keepers of the flame, reducing the risk of knowledge loss.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retention&lt;/td&gt;
&lt;td&gt;People don't leave jobs; they leave people.  When employees feel supported by a partner during life's hardest moments, their loyalty to the organization triples.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  5.  Your Challenge: Who is your "Partner in Crime"?
&lt;/h2&gt;

&lt;p&gt;Partnerships don't just happen; they are built through trust and shared wins.  To foster this, consider observing which team members naturally collaborate and support each other, helping you identify existing or potential strategic alliances within your pod.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Who is my sounding board?&lt;/li&gt;
&lt;li&gt;Who has my back in a meeting if I need to step away?&lt;/li&gt;
&lt;li&gt;Am I treating my cross-functional peers as equals or minions?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The Bottom Line:&lt;/strong&gt; Don’t fear the duo.  When two people find a rhythm that survives two years of life's challenges, the entire organization becomes more resilient, more efficient, and more human.&lt;/p&gt;

</description>
      <category>culture</category>
      <category>softskills</category>
      <category>productivity</category>
      <category>management</category>
    </item>
    <item>
      <title>You’re Not Alone — You Have an Army</title>
      <dc:creator>adegiamb</dc:creator>
      <pubDate>Thu, 16 Oct 2025 00:59:43 +0000</pubDate>
      <link>https://dev.to/adegiamb/youre-not-alone-you-have-an-army-328e</link>
      <guid>https://dev.to/adegiamb/youre-not-alone-you-have-an-army-328e</guid>
      <description>&lt;p&gt;Stop carrying the world on your shoulders. You don’t have to.&lt;/p&gt;

&lt;p&gt;Too many people believe everything rests on their shoulders.  They carry the weight of deadlines, deliverables, and expectations as if asking for help is a sign of weakness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;That mindset is wrong — and unsustainable.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you feel pressure, &lt;strong&gt;look up&lt;/strong&gt;.  Your leads and managers understand the same stress, often multiplied.  They’re not there to judge; they’re there to support and help you navigate it.  Talk to them.  Share what’s heavy, causing the stress.&lt;br&gt;
Great organizations move forward because people use their &lt;strong&gt;levers&lt;/strong&gt; — teammates, leaders, and tools that lighten the load.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try First, Then Ask
&lt;/h2&gt;

&lt;p&gt;Before reaching out for help, spend focused time working through the problem.  Write down:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What the issue is&lt;/li&gt;
&lt;li&gt;What you’ve already tried&lt;/li&gt;
&lt;li&gt;What’s blocking you&lt;/li&gt;
&lt;li&gt;What do you think might help&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This prep sharpens your understanding and helps others support you more effectively.  It shows initiative and makes collaboration smoother.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do a Rubber Ducky  Session
&lt;/h2&gt;

&lt;p&gt;Sometimes, you don’t need an immediate answer — you need clarity.&lt;br&gt;
The “rubber ducky” method is simple: explain your problem out loud as if you’re teaching it to someone (or something).  It could be an actual rubber duck (mine is a Yoshi stuffed toy my nephew got me), your notes app, or a teammate willing to listen.&lt;/p&gt;

&lt;p&gt;Walking through the issue forces you to slow down, organize your thoughts, and often reveals the solution to you.&lt;/p&gt;

&lt;p&gt;Better yet, talk it out with a colleague.  Saying things out loud — and having someone reflect or ask a few simple questions — often uncovers what’s missing.  It’s not about someone solving it for you, but helping you see it differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bring in the Army
&lt;/h2&gt;

&lt;p&gt;When challenges get big, remember — no one wins a battle alone.  An &lt;strong&gt;army&lt;/strong&gt; succeeds because everyone knows their role and works together toward a shared goal.&lt;br&gt;
Your &lt;strong&gt;team army&lt;/strong&gt; works the same way:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Your immediate team&lt;/strong&gt; is the front line.  They move fast, share knowledge, and adapt together when things shift.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SMEs (Subject Matter Experts)&lt;/strong&gt; are your specialists — the engineers, analysts, or experts who step in when precision matters most.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leadership&lt;/strong&gt; acts like your command unit — setting strategy, clearing roadblocks, and securing the resources needed to win.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-functional partners&lt;/strong&gt; are the support divisions that strengthen your position — offering fresh perspectives, connecting systems, and helping align the bigger picture.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;An army wins by coordinating — by communicating clearly, sharing intel, and trusting each other’s strengths.  The same is true for your team.&lt;/p&gt;

&lt;p&gt;You don’t need to handle every problem alone — you need to know which unit to call in, and when.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;You’re not alone.  You have teammates, leaders, tools, and experts — an entire army ready to move with you.&lt;/p&gt;

&lt;p&gt;Use them.  That’s how real progress happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Remember
&lt;/h2&gt;

&lt;p&gt;When the pressure builds, don’t isolate — activate your army.  Together, we move faster, stronger, and smarter.&lt;/p&gt;

</description>
      <category>teamwork</category>
      <category>stress</category>
    </item>
    <item>
      <title>Dropping database column and Microservices</title>
      <dc:creator>adegiamb</dc:creator>
      <pubDate>Tue, 22 Jul 2025 02:48:43 +0000</pubDate>
      <link>https://dev.to/adegiamb/dropping-database-column-and-microservices-1opk</link>
      <guid>https://dev.to/adegiamb/dropping-database-column-and-microservices-1opk</guid>
      <description>&lt;p&gt;Most of the time, you don't think a lot about making database changes, but when dropping a column, some serious effects on your application can happen if not handled carefully.&lt;/p&gt;

&lt;p&gt;As you see in the diagram below, when you deploy a new version of your service with a drop column migration, you have a race condition of the existing micro service (v1) may try to access the column that was removed, causing:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Existing deploy micro service to crash.&lt;/li&gt;
&lt;li&gt;Random errors to appear in logging.&lt;/li&gt;
&lt;li&gt;Alerts to be raised if you have monitoring in place.&lt;/li&gt;
&lt;/ol&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%2Fjrnxdda8rlix28ww2p3i.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%2Fjrnxdda8rlix28ww2p3i.png" alt="Showing Best practice vs combine deployment" width="800" height="1357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Use a Multi-step Deployment Strategy
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Deploy New API Version v2
&lt;/h3&gt;

&lt;p&gt;A version of your service that doesn't access the database column you want to drop&lt;/p&gt;

&lt;h3&gt;
  
  
  Step2: Keep Old Column but Stop Using It
&lt;/h3&gt;

&lt;p&gt;Leave the column in the database. This will ensure that the existing version (V1) does not encounter an issue if it continues to attempt to access the database column.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Wait Period for confirmation of no side effects
&lt;/h3&gt;

&lt;p&gt;Leave the column you want to remove in production for a short time to verify that everything is working fine.  Usually, a week or two is more than enough.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Drop Column via separate Migration
&lt;/h3&gt;

&lt;p&gt;Create a new deployment that should only contain a migration script that drops the unused column.&lt;/p&gt;

&lt;h3&gt;
  
  
  Optional 1: Ensure All Services Use v2 or greater of the API
&lt;/h3&gt;

&lt;p&gt;Before deploying to production, confirm that all running versions contain your previous changes to remove access to the field you want to drop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Optional 2: Run DB Backup + Validate Logs
&lt;/h3&gt;

&lt;p&gt;Depending on your environment's setup, you should create a database backup before dropping the column. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;note:&lt;/strong&gt; In most cases, if you leave the column in production for a week, dropping should be fine.  But as the saying goes, it's better to be safe than sorry.&lt;/p&gt;

&lt;h3&gt;
  
  
  Safe Deployment: No Crashes, Clean DB
&lt;/h3&gt;

&lt;p&gt;Now that you know that all running services don't access the column, you can safely deploy the migration to drop the column without worrying about causing an outage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mermaid code
&lt;/h3&gt;

&lt;p&gt;Below is the mermaid code to generate the diagram above&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph TD

%% Problem Path
A[Deploy New API Version + Drop Column in Same Release] --&amp;gt; B[Race Condition: Some Services Still Use Old Column]
B --&amp;gt; C[App Crashes / Data Access Errors]

%% Solution Path
A -. Best Practice .-&amp;gt; Best1[Step 1: Deploy New API Version v2]
Best1 --&amp;gt; Best2[Step 2: Keep Old Column but Stop Using It]
Best2 --&amp;gt; Best3[Step 3: Wait Period for confirm no side effects]
Best3 --&amp;gt; Best4[Step 4: Drop Column via sperate Migration]

%% Optional Checks
Best4 --&amp;gt; BestOptional1[Ensure All Services Use v2 API]
BestOptional1 --&amp;gt; BestOptional2[Run DB Backup + Validate Logs]

%% Final State
BestOptional2 --&amp;gt; Z[✅ Safe Deployment: No Crashes, Clean DB]

style A fill:#fb9902,stroke:#c00,stroke-width:2px
style C fill:#f66,stroke
style Z fill:#099,stroke
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>microservices</category>
      <category>database</category>
      <category>outage</category>
    </item>
    <item>
      <title>You Are Important</title>
      <dc:creator>adegiamb</dc:creator>
      <pubDate>Mon, 31 Mar 2025 01:55:02 +0000</pubDate>
      <link>https://dev.to/adegiamb/you-are-important-4lkm</link>
      <guid>https://dev.to/adegiamb/you-are-important-4lkm</guid>
      <description>&lt;p&gt;We sometimes forget that we are as important as or more important than the projects we work on. &lt;/p&gt;

&lt;p&gt;Doing overtime or prioritizing work for a short period is okay, but when it becomes the norm, it becomes a problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Signs of Overworking
&lt;/h2&gt;

&lt;p&gt;When I am mentoring other team members, here are some signs I tell them to look out for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You are working through your lunches.&lt;/li&gt;
&lt;li&gt;Every night, you work a bit late.&lt;/li&gt;
&lt;li&gt;Your sleep routine changes.&lt;/li&gt;
&lt;li&gt;You cancel or do not attend events in your personal life.&lt;/li&gt;
&lt;li&gt;You stop doing your hobbies.&lt;/li&gt;
&lt;li&gt;At work, your fuse is getting short with team members.&lt;/li&gt;
&lt;li&gt;You are saying to yourself, "If I don't do this, I will block  other team members, or the project will be late."&lt;/li&gt;
&lt;li&gt;Your stress and anxiety are higher than usual.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you start noticing the impact of overworking, you must raise this to your lead or manager and see how to bring things back to normal.&lt;/p&gt;

&lt;p&gt;You need to figure out what options exist:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Can other team members support you?&lt;/li&gt;
&lt;li&gt;Confirm your tasks' priorities and ensure you are working on the correct ones.&lt;/li&gt;
&lt;li&gt;Can the deadline change, or what is included?&lt;/li&gt;
&lt;li&gt;If overworking is a pattern, raise it in a retro and keep the task accountable.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Gauges
&lt;/h3&gt;

&lt;p&gt;You need to find some gauges you can watch to see if you are making work more vital than yourself.  &lt;/p&gt;

&lt;p&gt;You should check them often. I usually do mine at the end of each week, and if they seem to be trending toward overwork, I check them more often until they are back to normal.&lt;/p&gt;

&lt;p&gt;Gauges are unique for each person, but here are some of mine:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Work interferes with me spending time with my niece and nephew.  This is a hard stop for me to do a reset. &lt;/li&gt;
&lt;li&gt;I make work an excuse for not going on a hike.&lt;/li&gt;
&lt;li&gt;I can not do my woodworking.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Prioritization yourself
&lt;/h2&gt;

&lt;p&gt;This section will most likely not resonate with some leaders and management.  But you must always put your mental and physical health before what you are working on.  &lt;/p&gt;

&lt;p&gt;If not, it will impact your work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understand your role and IDP
&lt;/h3&gt;

&lt;p&gt;Over the years, I was put into poorly defined roles and was not aligned with my direct manager, which caused tension between us.&lt;/p&gt;

&lt;p&gt;You need to work on defining and aligning the role as soon as possible to ensure that your work aligns with it since this impacts your day-to-day IDP and promotions differently.&lt;/p&gt;

&lt;p&gt;Once you have the role clearly aligned, work on your IDP (independent Development Plan) and make sure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Understand how items are measured. &lt;/li&gt;
&lt;li&gt;Where you are currently in each section in your IDP.&lt;/li&gt;
&lt;li&gt;What is needed to get to the next level?&lt;/li&gt;
&lt;li&gt;What are the timelines to get a promotion, and are you aligned?&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  One-on-Ones
&lt;/h3&gt;

&lt;p&gt;One-on-one meetings are for you and the lead/manager to focus on items related to you, not project updates. That is what standups are for. &lt;/p&gt;

&lt;p&gt;If project updates are asked in your one-on-ones, ask to do it at the end if time remains or book another meeting. &lt;/p&gt;

&lt;p&gt;When I was a lead, I made sure I outlined that we should discuss:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What went well, and what needs to be improved?&lt;/li&gt;
&lt;li&gt;Any crucial topics you want to raise.&lt;/li&gt;
&lt;li&gt;Any feedback to give or given from others.&lt;/li&gt;
&lt;li&gt;Review your IDP (this may not happen all one-on-one but should try to be every other).&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Raising Concerns
&lt;/h3&gt;

&lt;p&gt;If you face issues or concerns and can not resolve them, raise them for support. Do not set on them and let them grow; there is a high chance someone else is facing the same concern.&lt;/p&gt;

&lt;p&gt;If you have to provide some details that another team member provided, ask permission to speak on their behalf since they may not be comfortable sharing, and you don't want to lose their trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Good Days vs Bad Days
&lt;/h2&gt;

&lt;p&gt;No job or role is perfect, and you will always have some bad days.  However, when your bad days start outweighing your good ones, it can be a sign that you must begin reviewing and prioritizing yourself.&lt;/p&gt;

&lt;p&gt;Some techniques I use to help me understand how I feel about the role:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Outline what I enjoy doing.&lt;/li&gt;
&lt;li&gt;Outline what items I am not enjoying.&lt;/li&gt;
&lt;li&gt;What is not rubbing me the right way in general (company, projects, interaction)&lt;/li&gt;
&lt;li&gt;Do I see a path of items not enjoying being fixed?&lt;/li&gt;
&lt;li&gt;Reach out to someone I trust and get their input.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Self Care
&lt;/h2&gt;

&lt;p&gt;Here are some items I do for self-care to make sure I am prioritizing myself:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I booked a meeting at lunchtime that auto-declined.  Everyone needs to have lunch and a mental break.  If the meeting is that important, I will let the organizer DM me the context and see if I can give up my lunch.&lt;/li&gt;
&lt;li&gt;If I do overtime through the week here and there.  I will end my week earlier. &lt;/li&gt;
&lt;li&gt;I disable notifications after work hours. However, if there are trusted team members, I will add them to the expectation list (e.g., Slack VIP). &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Support is missing
&lt;/h2&gt;

&lt;p&gt;When you work for a company for an extended period of time, things can get a bit clouded due to friendships and feeling comfortable.&lt;/p&gt;

&lt;p&gt;However, if most of the items on the list are happening, it can be a sign that the current environment is not for you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When you wake up and dread going to work.&lt;/li&gt;
&lt;li&gt;Going to work because of just friendships.&lt;/li&gt;
&lt;li&gt;You are not learning anymore.&lt;/li&gt;
&lt;li&gt;Your role and IDP are not set, and the path to get a pay raise or promotion keeps changing.&lt;/li&gt;
&lt;li&gt;You are promised clarity on items, but they never happen, or the timeline changes often.&lt;/li&gt;
&lt;li&gt;You raise concerns multiple times, and nothing is happening to improve them.&lt;/li&gt;
&lt;li&gt;Working at 125% is the norm.&lt;/li&gt;
&lt;li&gt;Your physical and mental health are getting impacted.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Remember, you are more important than the project, and prioritize your mental and physical health. &lt;/p&gt;

&lt;p&gt;A quote I often use is, "Is someone going to die if this is not done today?"  99% of the time, the answer is "no."  &lt;/p&gt;

&lt;p&gt;Meaning that the work can wait until tomorrow. :)  &lt;/p&gt;

&lt;p&gt;Happy deving.&lt;/p&gt;

</description>
      <category>overworking</category>
      <category>prioritization</category>
      <category>mentalhealth</category>
      <category>mentorship</category>
    </item>
    <item>
      <title>Importance of Communication</title>
      <dc:creator>adegiamb</dc:creator>
      <pubDate>Thu, 13 Mar 2025 02:23:04 +0000</pubDate>
      <link>https://dev.to/adegiamb/importance-of-communication-285b</link>
      <guid>https://dev.to/adegiamb/importance-of-communication-285b</guid>
      <description>&lt;p&gt;In general, people think communication relates to when writing or having a discussion; however, it is more than that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Priorities and deadlines.&lt;/li&gt;
&lt;li&gt;Meetings &lt;/li&gt;
&lt;li&gt;Requirements
&lt;/li&gt;
&lt;li&gt;Disagreements between team members&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Priorities and Deadlines
&lt;/h2&gt;

&lt;p&gt;When a team or even an individual has a clear understanding of priorities and deadlines, it lets them:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Work on the most essential items for the Business.&lt;br&gt;
They can move to the next item without input when completed or blocked.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The team will know what is next on the action list when leadership is unavailable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ignore and escalate work that is not part of the priority or deadline.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Unclear Priorities
&lt;/h3&gt;

&lt;p&gt;When priorities are unclear or change often, this can cause stress for teams or individuals. There is a high chance that deadlines will be missed and extended.&lt;/p&gt;

&lt;p&gt;If every request is considered highest, important, or business-critical, it will dilute the importance of having priorities. Team members will start ignoring priorities and working on items they enjoy more.  &lt;/p&gt;

&lt;p&gt;Having a definition of priorities across the organization will make sure everyone is aligned.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P1 (Critical):&lt;/strong&gt; These are your “drop everything” tasks. They are urgent and vital, often involving crisis management or critical deadlines.  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Customers having difficulty accessing the system(s).&lt;/li&gt;
&lt;li&gt;E-commerce site and can not check items.&lt;/li&gt;
&lt;li&gt;To on-board a new client, we need to support XYZ.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;P2 (High):&lt;/strong&gt; Important tasks that are not immediately urgent. These often contribute significantly to long-term goals.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A new line of Business.&lt;/li&gt;
&lt;li&gt;Improving the overall system to support future growth.&lt;/li&gt;
&lt;li&gt;3rd party integration.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;P3 (Medium):&lt;/strong&gt; Tasks that are urgent but less important. They require attention but do not contribute as much to overall objectives.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Improvement of user experience (internal and external).
&lt;/li&gt;
&lt;li&gt;New feature(s) that bring some value.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;P4 (Low):&lt;/strong&gt; Neither urgent nor highly important. These tasks should be done but can be scheduled for later.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Improving logging or metadata for troubleshooting&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;P5 (Lowest):&lt;/strong&gt; Tasks with minimal impact that can be eliminated if necessary.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Minor UI improvements (colour, spacing, spelling errors)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Missing the deadline
&lt;/h3&gt;

&lt;p&gt;Most people get nervous that they will not make a deadline and try to do anything, not raise it until the due date. It is usually due to the fear of getting into trouble, feeling inadequate to do the task, or thinking people will judge.&lt;/p&gt;

&lt;p&gt;However, waiting until the due date causes many issues:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Putting your Lead, PO, and manager in a bad spot with the Business. &lt;/li&gt;
&lt;li&gt;It also reduces the options they can offer.
This causes other team members or teams to miss their deadlines.&lt;/li&gt;
&lt;li&gt;We lost the chance for team members to support you&lt;/li&gt;
&lt;li&gt;A loss of trust can occur between team members.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;However, if they raise the risk sooner:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The team lead, PO, and manager have more options to use.&lt;/li&gt;
&lt;li&gt;Team members can help jump on and support each other.&lt;/li&gt;
&lt;li&gt;Other priorities can be adjusted. &lt;/li&gt;
&lt;li&gt;Credibility begins to build.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do not just raise, "I am not going to make the deadline." Provide context into why:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What is the current status of the tasks?&lt;/li&gt;
&lt;li&gt;What is causing the doubt that the deadline is not achievable?&lt;/li&gt;
&lt;li&gt;What support is needed?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Moving Deadlines
&lt;/h2&gt;

&lt;p&gt;We all know the deadlines can move, but if all initial deadlines are unrealistic or move multiple times, teams will start not trusting them and assume they will change. Leadership can be in a bad spot when the deadline can not be moved (i.e., Father/mother's Day).&lt;/p&gt;

&lt;p&gt;Here are some examples of sources that can cause deadlines to move.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Business does not clearly understand what it wants/needs.&lt;/li&gt;
&lt;li&gt;The Discovery phase is short or is happening at the same time the implementation is happening.&lt;/li&gt;
&lt;li&gt;Making decisions takes too long or too many chiefs in the kitchen.&lt;/li&gt;
&lt;li&gt;Business and management not listening to SME estimates. The estimates should still be challenged and understood.&lt;/li&gt;
&lt;li&gt;Ownership is not clear.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Meetings
&lt;/h2&gt;

&lt;p&gt;As we know, meetings can be helpful or a waste of time depending on their size and organization. (I will not go into this here but in a future posting)&lt;/p&gt;

&lt;p&gt;However, how people communicate in the meeting will affect the effectiveness of the meeting. &lt;/p&gt;

&lt;p&gt;The way people act and communicate can make a big difference.&lt;/p&gt;

&lt;p&gt;Seen meetings that went sideways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Individuals were rude and disrespectful.&lt;/li&gt;
&lt;li&gt;Screaming and shooting.&lt;/li&gt;
&lt;li&gt;Naming calling.&lt;/li&gt;
&lt;li&gt;Taking over the meeting and making people feel dumb.&lt;/li&gt;
&lt;li&gt;Meetings are not safe space&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example, I was in a meeting when 2 or 3 individuals presented possible solutions to a business problem. However, one of the team members attending the meeting disagreed with the solution:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;This is not how we present it here. You should have presented it like this. &lt;/li&gt;
&lt;li&gt;Why is it like this? It does not make a scene. The team member didn't read the supporting documentation like others, and the presenter had to do it during the meeting.&lt;/li&gt;
&lt;li&gt;Said, "I do not care about the deadlines. We should do it like this".&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The outcome of the meeting was not a pretty one:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It was a waste of time for everyone on the call since, most of the time, 1 team member derailed the meeting.&lt;/li&gt;
&lt;li&gt;Moving forward with a solution did not happen.&lt;/li&gt;
&lt;li&gt;Team members became uncomfortable attending meetings with that team member. They felt they would be attacked and felt unsafe raising thoughts and ideas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;However, when attending positive meetings:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Everyone feels safe and can speak freely.&lt;/li&gt;
&lt;li&gt;Working on a common goal. &lt;/li&gt;
&lt;li&gt;Open discussions can happen.&lt;/li&gt;
&lt;li&gt;Everyone is equal; roles and tiles don't matter.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example, our CTO raised a production issue and needed people to join a war room. A handful of team members jumped on the call. He outlined our issue and then said, "What does everything think the issue is, and how can I support you?". What happened next:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;One team member managed the meeting.&lt;/li&gt;
&lt;li&gt;SMEs discuss the possible issues and remove unknowns.&lt;/li&gt;
&lt;li&gt;Determine a temporary solution to allow us time to implement a proper solution.&lt;/li&gt;
&lt;li&gt;We gave tasks even to our CTO.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The meeting's outcome was that the solution was resolved, and trust was built between team members (side-by-side and upper management).&lt;/p&gt;

&lt;p&gt;Future meetings with the same team members were more manageable because we knew they would be in a space where everyone was at the same level and focused on one goal.&lt;/p&gt;

&lt;p&gt;It is an effort to create a safe space culture, but it takes one bad meeting to break the trust. It is everyone's responsibility to protect it; if people see team member(s) breaking that culture, fix it instantly or you take the risk of losing it and have to rebuild it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements (Discovery Phase)
&lt;/h2&gt;

&lt;p&gt;In a competitive world, every company wants to be the first to market, which is understandable. However, if the discovery phase is rushed, skipped, or even happening during the implementation,  a pattern will occur:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frustration:&lt;/strong&gt; Different departments will be frustrated with each other. Usually, the Product team suffers the most because they get caught in a cycle where some details are shared with engineering, new questions are raised, and the cycle is repeated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lost of trust:&lt;/strong&gt; Team members will start getting the impression that others are incapable of their role.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation of incorrect solution:&lt;/strong&gt; Since the requirements are changing, it can be challenging to implement a solution that will scale with future changes, as past decisions limit options.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deadlines missed:&lt;/strong&gt;  Since the entire project is not understood, constant changes and new requirements/features are added, making it hard to define clear milestones.&lt;/p&gt;

&lt;p&gt;Everyone wants to start on the new idea that the Business wants, but do not jump the gun. Invest in understanding the idea's short-, medium-, and long-term vision will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create clear milestones.&lt;/li&gt;
&lt;li&gt;Help organize the discovery sessions.&lt;/li&gt;
&lt;li&gt;Informed decisions on solutions.&lt;/li&gt;
&lt;li&gt;Reduce the frustration between different business units.&lt;/li&gt;
&lt;li&gt;Reduce the back and forth and rework between milestones.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A former VP made us think: Imagine this is the last $25,000 we have to spend. Do we have everything that is needed to be successful? &lt;/p&gt;

&lt;h2&gt;
  
  
  Disagreements/misunderstandings between team members
&lt;/h2&gt;

&lt;p&gt;From time to time, disagreements and misunderstandings will occur between team members. If this happens, the team member who thinks a misunderstanding occurred should offer an olive branch and resolve the misunderstanding.&lt;/p&gt;

&lt;p&gt;I will use an example that occurred to me. I was working on a new part of the system, proposed a solution, and recommended including certain team members to review it.&lt;/p&gt;

&lt;p&gt;One of my team members left a message: "How many times do we need to repeat this? It breaks stuff for us. Stop trying to use this."  &lt;/p&gt;

&lt;p&gt;It was surprising and confusing to see that comment. So I had a meeting with that developer the next day, and before going into the topic, I asked for clarity on his feedback, but there was a total misunderstanding.&lt;/p&gt;

&lt;p&gt;My co-worker took a moment to review the comment, and he realized how I misunderstood it and why I was uncomfortable in the current meeting.&lt;/p&gt;

&lt;p&gt;The comment was directed to another person on the document who knew this was impossible but didn't inform me.  &lt;/p&gt;

&lt;p&gt;He was frustrated because a different department kept trying to sneak it in, and I got caught in the crossfire.&lt;/p&gt;

&lt;p&gt;He apologized and took ownership of the misunderstanding. We both aligned that everyone was cleared up.&lt;/p&gt;

&lt;p&gt;After this, we set up a 1:1 every three weeks to see how we can improve communication between the two different streams we work on. &lt;/p&gt;

&lt;p&gt;We have a good partnership. We lean on each other if we have questions and know we can help each other.&lt;/p&gt;

&lt;p&gt;However, sometimes, this is possible, and if there are disagreements, you may need to be a third party to help clear the water. That is okay, too, but you make sure that both sides are heard. A meeting does occur with everyone to make sure everyone is on the same page.&lt;/p&gt;

&lt;p&gt;Also, it is possible that some people do not get along, but interactions need to be civil and professional.  &lt;/p&gt;

</description>
      <category>communication</category>
    </item>
    <item>
      <title>Code Coverage - Aim for 100% but not 100%</title>
      <dc:creator>adegiamb</dc:creator>
      <pubDate>Mon, 24 Feb 2025 02:27:05 +0000</pubDate>
      <link>https://dev.to/adegiamb/code-coverage-aim-for-100-but-not-100-i0f</link>
      <guid>https://dev.to/adegiamb/code-coverage-aim-for-100-but-not-100-i0f</guid>
      <description>&lt;p&gt;Testing your code is an essential part of software development. But many developers fall into the trap of thinking, "I need to cover 100% of my code."  &lt;/p&gt;

&lt;p&gt;This can lead to a couple of issues:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Developers write tests to hit the 100% target, create poor tests, and do not focus on testing business logic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Spending extra time, reducing the velocity of sprints, and delaying projects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Not taking the time to ensure tests are easy to follow and maintain. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Developers should aim to achieve 100% code coverage of the application's business logic. The business/client cares about this and usually considers it the most critical part of the software.&lt;/p&gt;

&lt;p&gt;When you cover all your business logic, it helps improve:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Understanding the side effects of future changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can refactor your code more efficiently and confidently; everything still works afterwards.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reduce whack a mole between changes and deployments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Business requirements were met.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  First-class citizen
&lt;/h2&gt;

&lt;p&gt;In many organizations, testing is treated as a second—or third-class citizen when high estimates or deadlines are approaching.&lt;/p&gt;

&lt;p&gt;Some common phrasing we hear:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phrase&lt;/th&gt;
&lt;th&gt;Reality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;We will return to adding unit testing after the launch.&lt;/td&gt;
&lt;td&gt;There is a slight chance this will happen since the next priority takes over. &lt;br&gt; Only a short period of time between projects.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;They are not necessary, so we will do everything manually.&lt;/td&gt;
&lt;td&gt;The number of manual tests is growing, and deployments are beginning to slow down. Not all tests are run between each release, causing a chance for issues to be introduced.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It's a small change; don't worry about it.&lt;/td&gt;
&lt;td&gt;Many minor changes were added, and now you have a Jenga problem. One future change causes things to come crashing down.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;It's with good attention to try to get the feature or release out quickly, but that can cause team members to focus on the short term and not think about the long term.&lt;/p&gt;

&lt;p&gt;We have to help educate our partners and give them analogies to see the importance:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Analogies&lt;/th&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Risk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;You are doing a reno, and the plumber installs the sink and dishwasher.&lt;/td&gt;
&lt;td&gt;Would you let the plumber leave without testing if any leaks exist?&lt;/td&gt;
&lt;td&gt;The pipe leaks and causes water damage in your house.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You are shopping for a used car/motorcycle.&lt;/td&gt;
&lt;td&gt;Would you give the seller thousands of dollars without a test drive?&lt;/td&gt;
&lt;td&gt;Vehicle engines have issues or need tons of work before becoming street-legal.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The cable company comes in to hook up your internet/TV.&lt;/td&gt;
&lt;td&gt;Wouldn't you want to test if you can connect and browse the web before they leave?&lt;/td&gt;
&lt;td&gt;The internet doesn't work when trying to join a meeting.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When picking an analogy, make it simple and a topic for the audience.  &lt;/p&gt;

&lt;p&gt;Over the years, I have been asked if I can split my estimate between development and testing; I usually won't do that since it is set up for the abovementioned issues. I remind them that testing is a step that needs to be done before the change can be reviewed and deployed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unit tests
&lt;/h2&gt;

&lt;p&gt;When testing, developers spend a lot of time creating unit tests to ensure the business requirements are met.  &lt;/p&gt;

&lt;p&gt;In many cases, this will not cover all the code paths. You should take the time to test both happy and sad paths. &lt;/p&gt;

&lt;h3&gt;
  
  
  Ignore any option
&lt;/h3&gt;

&lt;p&gt;You often use a mocking library to mock your repository and third party and call other services. Usually, the mocking framework allows you to use &lt;code&gt;any&lt;/code&gt; for a parameter to make testing a bit easier. Try to avoid using it since it introduces a blind spot in your tests and gives you a false impression of testing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bugs
&lt;/h3&gt;

&lt;p&gt;When a bug is logged, try to use &lt;a href="https://en.wikipedia.org/wiki/Test-driven_development" rel="noopener noreferrer"&gt;Test Driven Development&lt;/a&gt; and first confirm you can duplicate the issue. This way, you can prove you fixed and resolved the problem, and from now on, you know that the bug should never come back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration Tests
&lt;/h2&gt;

&lt;p&gt;Over the years, while reviewing technical assignments, I have seen developers write integration tests using an in-memory database instead of the actual one.   &lt;/p&gt;

&lt;p&gt;Yes, 95% of the time, this will be faster to run, but you are trading off speed vs accuracy.   If you are not using the same database as your production environments, you will be missing the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Is your migration script written correctly?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Could you tell me how your queries will perform?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you need to use SQL vendor-specific features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ORM can generate different queries, causing unexpected behaviours in production&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To increase your confidence, use the same database and possible version your code will use in your environment. Everything will work the same.&lt;/p&gt;

&lt;p&gt;Usually, when we do unit tests, we mock the repository layer and test it during integration tests. If the repository layer has business logic, you should test the business logic (branches) to ensure everything works correctly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Not only happy Path
&lt;/h3&gt;

&lt;p&gt;In most cases, pods focus on the happy path only for integration tests, and this shouldn't be the case.  Add the needed tests if a layer can only be tested through integration tests and contains business logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Speeding up tests
&lt;/h3&gt;

&lt;p&gt;As we all know, integration tests can be slow sometimes. Running them all during a build can slow down deployments and frustrate developers. &lt;/p&gt;

&lt;p&gt;At some previous companies, I saw that they could tag critical path integration tests and run them on every build.  Then, they had a scheduled task that ran against the main branch twice daily, ran all their tests, generated reports, and tagged the service owners with any issue they found.&lt;/p&gt;

&lt;p&gt;It wasn't perfect, as some issues occasionally occurred before the scheduled task ran.&lt;/p&gt;

&lt;h2&gt;
  
  
  Input and Golden files
&lt;/h2&gt;

&lt;p&gt;I was introduced to Golden Files when I started working with golang and becoming my go-to way of testing.&lt;/p&gt;

&lt;p&gt;A good article is &lt;a href="https://ieftimov.com/posts/testing-in-go-golden-files/" rel="noopener noreferrer"&gt;Testing in Go Golden Files&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the past (I guess a lot of us), we would assert the properties of an entity to see if everything was okay. Over time, things can drift:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;New properties are added and are not part of the assertion.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If we are not validating everything, side effects from changes are not always seen.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With input and golden files, you get a clear picture:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;You get a version history since changes are committed to your version control system.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can do a DIFF comparison on the files and see the change(s).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;However, there are some drawbacks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Date/time fields add minor issues; in most cases, you must scrub them to a fixed value.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sometimes, changes can cause a lot of golden files to be updated at once, making PR look larger than they are. Most tools allow you to filter on file types, making it easier to see the actual changes.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Code Coverage Metric
&lt;/h2&gt;

&lt;p&gt;Code coverage metrics are not the best way to understand whether you cover every u-case or the quality, but they give you a good idea of what has been tested.&lt;/p&gt;

&lt;p&gt;What is more critical is taking the time during code reviews to check and understand the tests' actions and ensure that all branches are validated. &lt;/p&gt;

&lt;h2&gt;
  
  
  General tips:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Aim to get as close to 100% for business logic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make testing 1st class citizens.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don't focus on the 100% but on the quality of your test(s)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure your golden files are pretty printed to make DIFF easier.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Name your tests to be straightforward to search for.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If testing is challenging, it hints at a code smell, and you should rethink your implementation.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>testing</category>
      <category>unittest</category>
      <category>codecoverage</category>
    </item>
    <item>
      <title>A Merge Strategy using reset --soft</title>
      <dc:creator>adegiamb</dc:creator>
      <pubDate>Wed, 12 Feb 2025 13:58:04 +0000</pubDate>
      <link>https://dev.to/adegiamb/a-merge-strategy-using-reset-soft-2jb4</link>
      <guid>https://dev.to/adegiamb/a-merge-strategy-using-reset-soft-2jb4</guid>
      <description>&lt;p&gt;While working on a feature or code change, we may need to commit debugging statements or PR comments to the branch where the changes are made. &lt;/p&gt;

&lt;p&gt;However, once all the changes are completed and approved, we want to clean up the commit history to help keep the destination branch neat and with helpful commit messages.&lt;/p&gt;

&lt;p&gt;While working with a coworker, they cleaned up their comments before merging them into the final branch using the git reset—-soft strategy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;First, make sure the &lt;code&gt;&amp;lt;destintion branch&amp;gt;&lt;/code&gt; is up to date git pull origin &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Confirm the source branch is checkout out (&lt;code&gt;git checkout &amp;lt;branch name&amp;gt;&lt;/code&gt;). If the branch was checked out locally, ensure all changes are synced by git call.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Next we are going reset the ref pointer to &lt;code&gt;&amp;lt;destintion branch&amp;gt;&lt;/code&gt; by running &lt;code&gt;git reset --soft &amp;lt;destintion branch&amp;gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Running git status will show what has changed. &lt;br&gt;
&lt;strong&gt;Note:&lt;/strong&gt; This is optional.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Depending on what makes a scene, we can now commit our changes in the logical group(s) or one commit. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Please review the git commit command to see the different options.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Once all the changes are committed, we will not push them back to the origin branch &lt;code&gt;git push origin &amp;lt;branch name&amp;gt; --force-with-lease&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is all that is needed, and now we have a clean and neat commit(s).&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;working branch -&amp;gt; feat/adg-01-sample&lt;br&gt;
destination branch -&amp;gt; master&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git pull origin master
git checkout feat/adg-01-sample
git reset --soft master
git commit -am "ADG-O2 Sample reset"
git push origin feat/adg-01-sample --force-with-lease
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;reset --soft master&lt;/code&gt; -&amp;gt; A soft reset in Git allows you to undo changes to your commit history while keeping the working directory intact&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-force-with-lease&lt;/code&gt; -&amp;gt; is a safer option that will not overwrite any work on the remote branch if a team member adds more commits. It ensures you do not overwrite someone else's work by force-pushing.&lt;/p&gt;

</description>
      <category>git</category>
    </item>
    <item>
      <title>Non-hostile PR Reviews</title>
      <dc:creator>adegiamb</dc:creator>
      <pubDate>Tue, 28 Jan 2025 12:33:13 +0000</pubDate>
      <link>https://dev.to/adegiamb/non-hostile-pr-reviews-3ai</link>
      <guid>https://dev.to/adegiamb/non-hostile-pr-reviews-3ai</guid>
      <description>&lt;h2&gt;
  
  
  What Is a Pull Request?
&lt;/h2&gt;

&lt;p&gt;A Pull Request (PR) is a crucial step in software development. It ensures the code base is thoroughly reviewed and approved, confirming that it aligns with business requirements and coding practices.&lt;/p&gt;

&lt;p&gt;Importance of PR&lt;br&gt;
A mostly overlooked thing is that PR encourages collaboration and open communication between developers. This helps the developers and code base in many ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Help level up developers by learning from experienced developers.&lt;/li&gt;
&lt;li&gt;Business knowledge is spread across more team members, reducing the bus factor.&lt;/li&gt;
&lt;li&gt;Company coding standards can be introduced or re-forced.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But often, PR can become a part of frustration/hostility for developers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Developers can feel they are getting attacked.&lt;/li&gt;
&lt;li&gt;Personal opinions can cause clashes.&lt;/li&gt;
&lt;li&gt;Comments can be misinterpreted.
&lt;/li&gt;
&lt;li&gt;pressure from timelines.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Hostile PR and Impacts
&lt;/h2&gt;

&lt;p&gt;When PRs are conducted in a supportive manner, they can significantly enhance future work and collaboration, making developers feel valued and part of a cohesive team.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Developers will start thinking about what they must do to reduce frustration in PR reviews, not what is best to resolve the problem. &lt;/li&gt;
&lt;li&gt;Reduce cooperation among developers.&lt;/li&gt;
&lt;li&gt;Slow down growth and improvement of developers and codebase.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A significant problem is that a hostile PR can lead a developer to leave the company. The constant exposure to a hostile environment, mainly when PRs occur multiple times a week, can be a significant deterrent.&lt;/p&gt;

&lt;p&gt;Hostile PR can also start impacting other parts of development interactions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Developers will not want to work with or be part of a project that they know other team members are known to be hostile in previews.&lt;/li&gt;
&lt;li&gt;Developers will not raise an idea/improvement since they think they are treated the same way in PRs.&lt;/li&gt;
&lt;li&gt;Will not raise questions or concerns in meetings.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to Improve a PR
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Comment standard
&lt;/h3&gt;

&lt;p&gt;Many companies focus on coding and branch standards but don't take the time to develop PR / comment standards. These standards are crucial to coding standards since they can protect the health of your engineering department and reduce misinterpretation. Also, make it easier when you are a new team member.&lt;/p&gt;

&lt;p&gt;I use &lt;a href="https://www.conventionalcommits.org/en/v1.0.0/" rel="noopener noreferrer"&gt;https://www.conventionalcommits.org/en/v1.0.0/&lt;/a&gt; or slight variation since it's straightforward and quick to learn.&lt;/p&gt;

&lt;p&gt;I see other developers use emojis to help describe the comments.&lt;/p&gt;

&lt;p&gt;It doesn't matter what approach you use. Just align to a standard. &lt;/p&gt;

&lt;h3&gt;
  
  
  Short and sweet
&lt;/h3&gt;

&lt;p&gt;Keep your comments direct and to the point to reduce the chance of misinterpretation. &lt;/p&gt;

&lt;p&gt;If you notice that you are writing long comments or many comments on PR, having a rubber ducky session with the developer and reviewing the PR together is worth it. It has many benefits:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Help build stronger bonds between team members.&lt;/li&gt;
&lt;li&gt;You can better understand why the developer did something a certain way.&lt;/li&gt;
&lt;li&gt;It can be faster since it will reduce the back and forth on PR.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Coding standards
&lt;/h3&gt;

&lt;p&gt;Having coding standards documented is essential for PR comments.&lt;br&gt;&lt;br&gt;
You can link to the standard that is not being followed.&lt;br&gt;
Help reduce introducing personal preferences or opinions.&lt;br&gt;
Coding standards need to be documented for all developers to reference. If not, how can they be a standard? How will a new developer know a standard vs. someone's preference?&lt;/p&gt;

&lt;p&gt;The coding standard document should outline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Why does this standard exist&lt;/li&gt;
&lt;li&gt;What is trying to solve&lt;/li&gt;
&lt;li&gt;Example of the standard&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Also, having coding standards helps remove some hostile comments from appearing:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;"I said this 1000 times ..."&lt;/li&gt;
&lt;li&gt;"This is not how we do it here."&lt;/li&gt;
&lt;li&gt;"Why are you doing this?"&lt;/li&gt;
&lt;li&gt;"I don't get why you are doing it like this. We do it like.."&lt;/li&gt;
&lt;li&gt;"As I stated before, I prefer .."&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Remember that each developer is at a different level, and PR is one way to help someone grow and improve. Use that opportunity to help them out. &lt;/p&gt;

</description>
      <category>programming</category>
      <category>codereview</category>
    </item>
    <item>
      <title>Logs - your secret weapon</title>
      <dc:creator>adegiamb</dc:creator>
      <pubDate>Fri, 24 Jan 2025 00:59:06 +0000</pubDate>
      <link>https://dev.to/adegiamb/logs-your-secret-weapon-5h5i</link>
      <guid>https://dev.to/adegiamb/logs-your-secret-weapon-5h5i</guid>
      <description>&lt;p&gt;Most developers don't take the time to consider the log messages' importance when adding them. However, logs are not just a formality; they are your secret weapon, helping you understand the flow of operations and simplify troubleshooting. Neglecting to provide detailed and context-rich log messages can significantly hinder the troubleshooting process, leading to longer resolution times and potentially impacting the user experience.&lt;/p&gt;

&lt;p&gt;Most of the time, the developer will add generic log messages such as:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Created account successfully. &lt;/li&gt;
&lt;li&gt;An error has occurred. &lt;/li&gt;
&lt;li&gt;Updated preferences.&lt;/li&gt;
&lt;li&gt;Invalid Type.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The above message gives you a rough idea of what has happened, but it does not provide context for what account was created, what error occurred, or who/what preferences were updated.&lt;/p&gt;

&lt;p&gt;However, with some little changes, you can improve the message by providing some context:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Account &lt;a href="mailto:test@example.com"&gt;test@example.com&lt;/a&gt; was created.&lt;/li&gt;
&lt;li&gt;Error creating an account for &lt;a href="mailto:test2@example.com"&gt;test2@example.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Preferences updated for &lt;a href="mailto:test@example.com"&gt;test@example.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The product type is invalid. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With those changes, at a glance, you have some context of what happened.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An account was created using the email address &lt;a href="mailto:test@example.com"&gt;test@example.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;When trying to create an account, &lt;a href="mailto:test2@example.com"&gt;test2@example.com&lt;/a&gt; failed&lt;/li&gt;
&lt;li&gt;The preference for &lt;a href="mailto:test@example.com"&gt;test@example.com&lt;/a&gt; &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Log Levels
&lt;/h2&gt;

&lt;p&gt;Most logging frameworks have different log levels; you can control which level is visible in your environments. &lt;/p&gt;

&lt;h3&gt;
  
  
  Debug
&lt;/h3&gt;

&lt;p&gt;Detailed information about your application's internal workings can be helpful for debugging. For example, essential logic is applied when processing a request. &lt;/p&gt;

&lt;p&gt;You should treat debug log messages as unsafe for production environments and only have them for non-production environments. &lt;/p&gt;

&lt;h3&gt;
  
  
  Information
&lt;/h3&gt;

&lt;p&gt;A critical step in the application has started or been completed. This is useful for tracking its progress. &lt;/p&gt;

&lt;h3&gt;
  
  
  Warning
&lt;/h3&gt;

&lt;p&gt;Something unexpected happened, but the application can still be continued.  &lt;/p&gt;

&lt;p&gt;For example, if you check a user's preferred language and it has not been set, you default it to English.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Error
&lt;/h3&gt;

&lt;p&gt;A single operation (like processing an HTTP request) has failed.    &lt;/p&gt;

&lt;h3&gt;
  
  
  Fatal
&lt;/h3&gt;

&lt;p&gt;A very serious error has happened, causing the whole application or system to crash.    &lt;/p&gt;

&lt;h2&gt;
  
  
  Formatting your message
&lt;/h2&gt;

&lt;p&gt;A typical pattern I follow when creating log messages is the wrap dynamic values between square brackets for a couple of reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It is easy to identify what value(s) are dynamic&lt;/li&gt;
&lt;li&gt;You know the start and end of the value. Helpful with string values.&lt;/li&gt;
&lt;li&gt;You can parse messages more quickly since you can ignore anything between the brackets.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Examples
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Account [&lt;a href="mailto:test@example.com"&gt;test@example.com&lt;/a&gt;] was created.&lt;/li&gt;
&lt;li&gt;Error creating an account for [&lt;a href="mailto:test2@example.com"&gt;test2@example.com&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Preferences updated for [&lt;a href="mailto:test@example.com"&gt;test@example.com&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Error creating an account for [] &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  High-volume systems
&lt;/h2&gt;

&lt;p&gt;While having details is a valuable tool, logging every event could overwhelm your storage and processing systems and log messages.  You can sample a subset of logs (for example, 1 in X requests); this will still allow you to troubleshoot most issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Secret detailed logs
&lt;/h2&gt;

&lt;p&gt;To help debug production environments, you could implement a feature that allows more detail log and remove sampling when debugging an issue:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;custom header&lt;/li&gt;
&lt;li&gt;query string parameter&lt;/li&gt;
&lt;li&gt;dynamically-generated tokens for the param value&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you use microservices and want the feature to work across different services, you need a way to transport the feature across different requests so you get the full picture.&lt;/p&gt;

&lt;p&gt;This can/should be protected from bad actors from abusing the feature. This can be done by whitelisting specific IP ranges like your company's VPN.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Structured Logs
&lt;/h2&gt;

&lt;p&gt;To enhance your logging, you should use structured logs.   Stackify has a good article on structured logs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://stackify.com/what-is-structured-logging-and-why-developers-need-it/" rel="noopener noreferrer"&gt;Stackify article&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depending on your logging framework, you can add fields that provide more context about the message and where you are processing your request.&lt;/p&gt;

&lt;p&gt;When adding additional fields, keep a couple of things in mind:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Think about PII and other sensitive data that should not appear in logs.&lt;/li&gt;
&lt;li&gt;Include a request/trace ID to help you see the whole picture.&lt;/li&gt;
&lt;li&gt;Build up the additional field while you process the request. This way, you don't know to jump between different logs to see the details you need&lt;/li&gt;
&lt;li&gt;If you are processing a batch, include a batch ID.
Include your service version; this can help identify if an issue was introduced in a specific version.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can import structure logs to tools like New Relic, Data Dog, sentry ... to make searching, filtering and alerting easier &lt;/p&gt;

&lt;h2&gt;
  
  
  Pointers to  improve log messages
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;When developing/testing your code, if you wished you had some data when troubleshooting, include it in your log message&lt;/li&gt;
&lt;li&gt;If troubleshooting a missing log message would make future changes easier, add it to make future debugging sessions easier.&lt;/li&gt;
&lt;li&gt;Think about what metadata, such as:

&lt;ul&gt;
&lt;li&gt;Record ID&lt;/li&gt;
&lt;li&gt;Request ID&lt;/li&gt;
&lt;li&gt;Data of the entity (Person name, product details)&lt;/li&gt;
&lt;li&gt;The source of the request (which application)&lt;/li&gt;
&lt;li&gt;Make your message self-documenting&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;What log level to use? It can help with filtering.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>logging</category>
    </item>
  </channel>
</rss>
