<?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>Forem: PETER ABAH</title>
    <description>The latest articles on Forem by PETER ABAH (@cybamonnc).</description>
    <link>https://forem.com/cybamonnc</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%2F3772814%2Fd5cfe86a-dd70-47bb-be95-a50e07b18efa.jpg</url>
      <title>Forem: PETER ABAH</title>
      <link>https://forem.com/cybamonnc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/cybamonnc"/>
    <language>en</language>
    <item>
      <title>⏱️ When “One Month” Means One Month: Lessons I Learned About Engineering Timelines, Pressure, and Professional Growth</title>
      <dc:creator>PETER ABAH</dc:creator>
      <pubDate>Thu, 26 Feb 2026 19:18:36 +0000</pubDate>
      <link>https://forem.com/cybamonnc/when-one-month-means-one-month-lessons-i-learned-about-engineering-timelines-pressure-and-5doj</link>
      <guid>https://forem.com/cybamonnc/when-one-month-means-one-month-lessons-i-learned-about-engineering-timelines-pressure-and-5doj</guid>
      <description>&lt;p&gt;Recently, I had an experience that fundamentally changed how I think about engineering timelines, communication, and professional responsibility.&lt;/p&gt;

&lt;p&gt;I was tasked with building a web application using Angular and .NET to mimic the process flow of an existing payment collection system.&lt;/p&gt;

&lt;p&gt;The expectations were clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧩 Develop the application&lt;/li&gt;
&lt;li&gt;🚀 Deploy to UAT&lt;/li&gt;
&lt;li&gt;🎤 Conduct stakeholder demo&lt;/li&gt;
&lt;li&gt;🌍 Go live&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All within &lt;strong&gt;one month&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;As an engineer with experience in Angular, .NET, IIS deployments, authentication flows, and CI/CD pipelines, I was confident. Challenged—but confident.&lt;/p&gt;

&lt;p&gt;But software engineering always has a way of teaching deeper lessons.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔐 The Unexpected Blocker
&lt;/h2&gt;

&lt;p&gt;After shipping the initial build to the staging environment, I began integrating authentication using MSAL.&lt;/p&gt;

&lt;p&gt;That’s when I encountered a blocker:&lt;/p&gt;

&lt;p&gt;⚠️ MSAL requires HTTPS in staging environments for security compliance.&lt;/p&gt;

&lt;p&gt;The staging environment was not properly configured for HTTPS. This wasn’t a code issue—it was an infrastructure dependency affecting multiple applications.&lt;/p&gt;

&lt;p&gt;During stand-up, I communicated the blocker and explained the dependency.&lt;/p&gt;

&lt;p&gt;The response I received was simple and direct:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“We shouldn’t be making excuses. This should be done within a month.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That moment became a turning point for me—not emotionally, but professionally.&lt;/p&gt;

&lt;p&gt;It forced me to reflect deeply on what it means to be an effective engineer beyond just writing code.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Reality Check: Software Development Is More Than Coding
&lt;/h2&gt;

&lt;p&gt;Building production-ready software involves far more than implementing features.&lt;/p&gt;

&lt;p&gt;It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📋 Understanding and validating requirements&lt;/li&gt;
&lt;li&gt;🏗️ Designing reliable architecture&lt;/li&gt;
&lt;li&gt;🔐 Implementing secure authentication&lt;/li&gt;
&lt;li&gt;🔄 Integrating frontend and backend systems&lt;/li&gt;
&lt;li&gt;🧪 Testing, debugging, and validation&lt;/li&gt;
&lt;li&gt;🚀 Deploying across environments&lt;/li&gt;
&lt;li&gt;👥 Supporting UAT and production readiness&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each layer introduces dependencies.&lt;/p&gt;

&lt;p&gt;Some are code-related. Others are environmental, infrastructural, or organizational.&lt;/p&gt;

&lt;p&gt;Experience helps you navigate complexity—but it doesn’t eliminate complexity.&lt;/p&gt;




&lt;h2&gt;
  
  
  🗣️ The Most Valuable Skill I Strengthened: Communication
&lt;/h2&gt;

&lt;p&gt;This experience taught me that communication is not a soft skill in engineering—it’s a technical survival skill.&lt;/p&gt;

&lt;p&gt;I learned to frame updates differently.&lt;/p&gt;

&lt;p&gt;Instead of saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I’m blocked by MSAL requiring HTTPS.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I learned to say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Core functionality is complete. Remaining work depends on staging environment HTTPS configuration required for secure authentication. Once resolved, integration can be completed within 2–3 days.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Same reality. Different framing.&lt;/p&gt;

&lt;p&gt;One sounds like a delay.&lt;/p&gt;

&lt;p&gt;The other communicates progress, ownership, and clarity.&lt;/p&gt;

&lt;p&gt;This small shift makes a massive difference in how engineering work is perceived.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚖️ The Engineering Triangle: Scope, Timeline, Quality
&lt;/h2&gt;

&lt;p&gt;This experience reinforced a principle every engineer should understand:&lt;/p&gt;

&lt;p&gt;You can optimize for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📦 Scope&lt;/li&gt;
&lt;li&gt;⏱️ Timeline&lt;/li&gt;
&lt;li&gt;✅ Quality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But not all three at the same time.&lt;/p&gt;

&lt;p&gt;If timeline is fixed → scope must be reduced&lt;br&gt;
If scope is fixed → timeline must increase&lt;br&gt;
If both are fixed → quality suffers&lt;/p&gt;

&lt;p&gt;This isn’t opinion. It’s physics.&lt;/p&gt;

&lt;p&gt;Professional engineers don’t just build systems—they protect system reliability.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 What Separates Mid-Level Engineers from Senior Engineers
&lt;/h2&gt;

&lt;p&gt;I realized that engineering growth isn’t just about writing better code.&lt;/p&gt;

&lt;p&gt;It’s about learning to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎯 Communicate progress in business terms&lt;/li&gt;
&lt;li&gt;⚠️ Identify and communicate risks early&lt;/li&gt;
&lt;li&gt;🧠 Think in systems, not just tasks&lt;/li&gt;
&lt;li&gt;🤝 Align technical reality with business expectations&lt;/li&gt;
&lt;li&gt;🧘 Remain calm and professional under pressure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Senior engineers don’t just solve technical problems.&lt;/p&gt;

&lt;p&gt;They reduce uncertainty.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 The Shift in My Mindset
&lt;/h2&gt;

&lt;p&gt;This experience didn’t make me defensive.&lt;/p&gt;

&lt;p&gt;It made me more intentional.&lt;/p&gt;

&lt;p&gt;I now focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Communicating dependencies clearly&lt;/li&gt;
&lt;li&gt;Framing blockers as risks with timelines&lt;/li&gt;
&lt;li&gt;Structuring updates around progress and next steps&lt;/li&gt;
&lt;li&gt;Thinking beyond implementation to delivery and stability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Engineering is not just about getting software to work.&lt;/p&gt;

&lt;p&gt;It’s about getting software to work reliably, securely, and sustainably.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Every engineer will eventually face:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aggressive timelines ⏱️&lt;/li&gt;
&lt;li&gt;Infrastructure blockers 🔧&lt;/li&gt;
&lt;li&gt;High stakeholder expectations 📈&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These moments test more than your coding ability.&lt;/p&gt;

&lt;p&gt;They test your professionalism, communication, and leadership.&lt;/p&gt;

&lt;p&gt;The biggest lesson I learned is this:&lt;/p&gt;

&lt;p&gt;👉 Great engineers don’t just write code.&lt;/p&gt;

&lt;p&gt;They create clarity.&lt;/p&gt;

&lt;p&gt;And clarity is what allows great software—and great teams—to succeed.&lt;/p&gt;




&lt;p&gt;If you’ve had similar experiences, I’d love to hear what lessons they taught you.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>systemdesign</category>
      <category>engineeringleadership</category>
      <category>techcareers</category>
    </item>
    <item>
      <title>🚨 When “It Works” Isn’t Good Enough: Diagnosing Token Bottlenecks in Distributed Systems</title>
      <dc:creator>PETER ABAH</dc:creator>
      <pubDate>Sat, 14 Feb 2026 15:23:04 +0000</pubDate>
      <link>https://forem.com/cybamonnc/when-it-works-isnt-good-enough-diagnosing-token-bottlenecks-in-distributed-systems-2lga</link>
      <guid>https://forem.com/cybamonnc/when-it-works-isnt-good-enough-diagnosing-token-bottlenecks-in-distributed-systems-2lga</guid>
      <description>&lt;p&gt;One of the most interesting engineering challenges I’ve worked through recently had nothing to do with syntax, frameworks, or libraries.&lt;br&gt;
It was about asking the right questions.&lt;br&gt;
The situation&lt;br&gt;
We had multiple internal services calling a third-party API secured by OAuth access tokens.&lt;br&gt;
 The access token was stored in a database and shared across services.&lt;br&gt;
The flow looked reasonable at first glance:&lt;br&gt;
Services read the token from the DB&lt;/p&gt;

&lt;p&gt;Call the third-party resource&lt;/p&gt;

&lt;p&gt;If a 401 Unauthorized occurs → refresh token → update DB&lt;/p&gt;

&lt;p&gt;But something didn’t feel right.&lt;/p&gt;

&lt;p&gt;The red flags 🚩&lt;br&gt;
When you zoom out and think systemically, a few problems jump out:&lt;br&gt;
Hot-spot database access&lt;br&gt;
 Every outbound request depended on a DB read.&lt;/p&gt;

&lt;p&gt;Race conditions under load&lt;br&gt;
 Multiple services could refresh the token at the same time.&lt;/p&gt;

&lt;p&gt;Thundering herd problem&lt;br&gt;
 One expired token → many simultaneous refresh calls.&lt;/p&gt;

&lt;p&gt;Tight coupling&lt;br&gt;
 Business services were now coupled to auth lifecycle concerns.&lt;/p&gt;

&lt;p&gt;Hidden latency amplification&lt;br&gt;
 DB → auth endpoint → DB, multiplied across services.&lt;/p&gt;

&lt;p&gt;This kind of design often survives early testing… and fails spectacularly at scale.&lt;/p&gt;

&lt;p&gt;The proposed fix (and why it still wasn’t enough)&lt;br&gt;
An idea came up to:&lt;br&gt;
Run a database job that checks token expiry&lt;/p&gt;

&lt;p&gt;Maintain an IsExpired flag&lt;/p&gt;

&lt;p&gt;Let a dedicated service refresh the token&lt;/p&gt;

&lt;p&gt;Ask other services to “wait and retry” when a 401 occurs&lt;/p&gt;

&lt;p&gt;This was a good instinct — it tried to centralize responsibility.&lt;br&gt;
But it still had issues:&lt;br&gt;
Token expiry ≠ token invalidation&lt;/p&gt;

&lt;p&gt;Polling introduces lag and inconsistency&lt;/p&gt;

&lt;p&gt;Artificial delays degrade user experience&lt;/p&gt;

&lt;p&gt;The database was still being used as a coordination mechanism&lt;/p&gt;

&lt;p&gt;Better… but not robust.&lt;/p&gt;

&lt;p&gt;The mental model shift 🧠&lt;br&gt;
Here’s the key realization:&lt;br&gt;
Access tokens are not business data.&lt;br&gt;
 They’re volatile secrets — like TLS certificates or signing keys.&lt;br&gt;
Once you adopt that mindset, the architecture becomes clearer.&lt;/p&gt;

&lt;p&gt;The industry-proven pattern&lt;br&gt;
Instead of every service “knowing” about tokens:&lt;br&gt;
👉 Introduce a Token Broker / Auth Gateway&lt;br&gt;
One service owns the token lifecycle&lt;/p&gt;

&lt;p&gt;Other services simply ask for a valid token&lt;/p&gt;

&lt;p&gt;Refresh is protected by in-memory locking&lt;/p&gt;

&lt;p&gt;The database becomes a fallback, not a hot path&lt;/p&gt;

&lt;p&gt;No Redis required (important in locked-down corporate Windows environments)&lt;/p&gt;

&lt;p&gt;This eliminates:&lt;br&gt;
Refresh stampedes&lt;/p&gt;

&lt;p&gt;DB contention&lt;/p&gt;

&lt;p&gt;Race conditions&lt;/p&gt;

&lt;p&gt;Authentication logic leakage into business services&lt;/p&gt;

&lt;p&gt;And it dramatically improves reliability, performance, and clarity of ownership.&lt;/p&gt;

&lt;p&gt;Why this matters (especially for senior roles)&lt;br&gt;
This wasn’t about writing clever code.&lt;br&gt;
It was about:&lt;br&gt;
Identifying hidden bottlenecks&lt;/p&gt;

&lt;p&gt;Challenging designs that “work” but don’t scale&lt;/p&gt;

&lt;p&gt;Applying battle-tested system patterns&lt;/p&gt;

&lt;p&gt;Understanding how distributed systems fail in real life&lt;/p&gt;

&lt;p&gt;Designing within real-world constraints (security policies, OS limitations, infra restrictions)&lt;/p&gt;

&lt;p&gt;That’s the difference between:&lt;br&gt;
“I can implement features”&lt;br&gt;
 and&lt;br&gt;
 “I can design systems organizations can trust under load.”&lt;/p&gt;

&lt;p&gt;Final thought&lt;br&gt;
Great systems aren’t built by adding more logic.&lt;br&gt;
 They’re built by removing unnecessary responsibility from the wrong places.&lt;br&gt;
If you’re designing mission-critical systems:&lt;br&gt;
Always ask who truly owns this concern?&lt;/p&gt;

&lt;p&gt;Watch for shared mutable state&lt;/p&gt;

&lt;p&gt;Be suspicious of “just add a DB flag” solutions&lt;/p&gt;

&lt;p&gt;Optimize for clarity, ownership, and failure modes&lt;/p&gt;

&lt;p&gt;That’s where real engineering impact lives.&lt;/p&gt;

&lt;p&gt;💬 I’d love to connect with engineers, architects, and leaders who enjoy deep system design conversations.&lt;/p&gt;

&lt;h1&gt;
  
  
  SystemDesign #SoftwareArchitecture #DistributedSystems
&lt;/h1&gt;

&lt;p&gt;#BackendEngineering #Scalability #PerformanceEngineering&lt;br&gt;
 #SeniorDeveloper #TechLeadership #EngineeringMindset&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>microservices</category>
      <category>performance</category>
      <category>systemdesign</category>
    </item>
  </channel>
</rss>
