<?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: Akum Blaise Acha</title>
    <description>The latest articles on Forem by Akum Blaise Acha (@akum_acha_2519d3ec8cd1514).</description>
    <link>https://forem.com/akum_acha_2519d3ec8cd1514</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%2F2877053%2F8209f4b6-69ed-4603-bb52-180323a2aa32.jpeg</url>
      <title>Forem: Akum Blaise Acha</title>
      <link>https://forem.com/akum_acha_2519d3ec8cd1514</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/akum_acha_2519d3ec8cd1514"/>
    <language>en</language>
    <item>
      <title>Database Sharding: When to Do It, How to Do It, and When You've Gone Too Far</title>
      <dc:creator>Akum Blaise Acha</dc:creator>
      <pubDate>Sun, 05 Apr 2026 10:07:03 +0000</pubDate>
      <link>https://forem.com/akum_acha_2519d3ec8cd1514/database-sharding-when-to-do-it-how-to-do-it-and-when-youve-gone-too-far-4kjg</link>
      <guid>https://forem.com/akum_acha_2519d3ec8cd1514/database-sharding-when-to-do-it-how-to-do-it-and-when-youve-gone-too-far-4kjg</guid>
      <description>&lt;p&gt;Picture this.&lt;/p&gt;

&lt;p&gt;It is 11pm on a Tuesday. You are not on call. You are in bed.&lt;br&gt;
Your phone lights up.&lt;/p&gt;

&lt;p&gt;It is your CTO.&lt;/p&gt;

&lt;p&gt;"The app is crawling. Users are complaining. The dashboard shows query times above 8 seconds. What is going on?"&lt;/p&gt;

&lt;p&gt;You jump on your laptop. You pull up the database metrics. CPU is at 94%. Disk I/O is maxed out. There are 3,000 active connections fighting over the same tables.&lt;/p&gt;

&lt;p&gt;You look at the data. Your users table has 180 million rows. Your orders table has 600 million. Every query — no matter how well indexed — is slow because the database is simply carrying too much weight.&lt;/p&gt;

&lt;p&gt;You have hit the wall that every growing system eventually hits.&lt;/p&gt;

&lt;p&gt;And the word your CTO says next is the one you have been quietly dreading for months:&lt;/p&gt;

&lt;p&gt;"I think we need to shard."&lt;/p&gt;

&lt;p&gt;This is not a hypothetical. This is a pattern I have seen play out in real teams, real products, real 11pm phone calls. And sharding is the answer — but only if you understand what it actually means, when it actually helps, and where it will quietly make your life harder if you are not careful.&lt;/p&gt;

&lt;p&gt;That is what we are covering today.&lt;/p&gt;

&lt;p&gt;What Sharding Actually Is&lt;/p&gt;

&lt;p&gt;Most engineers have heard the word. Fewer can explain it clearly.&lt;br&gt;
Sharding is the practice of splitting a large database into smaller, independent pieces called shards. Each shard holds a subset of the total data and lives on its own database instance. Together, they hold everything. Individually, each one carries only a fraction of the load.&lt;/p&gt;

&lt;p&gt;Think of it like this.&lt;/p&gt;

&lt;p&gt;You run a busy post office. Every letter in the country comes through one building. Eventually the building cannot cope — too many letters, too many staff, too many queues. So you split it. Letters A through F go to one building. G through M go to another. N through Z go to a third. Each building now handles a manageable chunk of the total volume.&lt;/p&gt;

&lt;p&gt;That is sharding.&lt;/p&gt;

&lt;p&gt;The database equivalent is taking your 600 million row orders table and splitting it so that orders for users 1 to 5 million live on shard one, orders for users 5 to 10 million live on shard two, and so on. Each shard is a full, independent database. No shard knows about the others.&lt;/p&gt;

&lt;p&gt;The Scenario That Made Sharding Necessary&lt;/p&gt;

&lt;p&gt;Let me give you a concrete production scenario to anchor everything that follows.&lt;/p&gt;

&lt;p&gt;Imagine you are the lead DevOps engineer at a fintech company. You process payments for businesses across West Africa. You started two years ago with a single PostgreSQL instance on a powerful server — 32 cores, 128GB RAM, fast NVMe storage.&lt;/p&gt;

&lt;p&gt;For the first year, it was fine. Queries were fast. The team was happy. You had good indexes, a read replica for reporting, and connection pooling through PgBouncer.&lt;/p&gt;

&lt;p&gt;Then growth hit.&lt;/p&gt;

&lt;p&gt;Transaction volume tripled in six months. You now have 400 million transaction records. Your payments table is 800GB. Your daily active users crossed 2 million. The read replica helped with reporting but your write load — new transactions, status updates, reconciliation jobs — all still hit the primary.&lt;br&gt;
Here is what you started seeing:&lt;/p&gt;

&lt;p&gt;Your P99 query latency went from 40ms to 1.2 seconds. Your autovacuum jobs started falling behind, causing table bloat. Long-running analytical queries locked rows that payment processing needed. Your on-call team was getting paged three nights a week.&lt;/p&gt;

&lt;p&gt;You tried everything first. You tuned work_mem. You added partial indexes. You partitioned the payments table by month. You moved analytical workloads to a separate replica. Things improved slightly.&lt;/p&gt;

&lt;p&gt;But the write bottleneck remained. One primary database. One write path. No way around it.&lt;/p&gt;

&lt;p&gt;That is when sharding became the right conversation to have.&lt;/p&gt;

&lt;p&gt;Step One: Choose Your Sharding Key&lt;/p&gt;

&lt;p&gt;This is the most important decision in the entire process. Get it wrong and you will rebuild everything six months later.&lt;/p&gt;

&lt;p&gt;A sharding key is the field you use to decide which shard a piece of data lives on. In our fintech scenario, the natural candidate is business_id — the ID of the business making payments.&lt;br&gt;
Here is why this works well:&lt;/p&gt;

&lt;p&gt;Most queries in a payment system are scoped to a single business. "Show me all transactions for business 1042 this month." That query goes to one shard and one shard only. No cross-shard joins. No scatter-gather across every instance.&lt;/p&gt;

&lt;p&gt;Here is what a bad sharding key looks like in the same system:&lt;br&gt;
Sharding by transaction_date. Now a query for a single business's transactions touches every shard because one business has transactions spread across all date ranges. Every read becomes a fan-out across all shards. You have added hardware but made queries slower.&lt;/p&gt;

&lt;p&gt;The rule for choosing a sharding key:&lt;/p&gt;

&lt;p&gt;Pick the field that appears in the WHERE clause of your most frequent, most critical queries. That field becomes your key.&lt;/p&gt;

&lt;p&gt;In most B2B products it is tenant_id or business_id. In consumer products it is often user_id. In time-series systems it is sometimes a combination of entity ID and time bucket.&lt;/p&gt;

&lt;p&gt;Step Two: Choose Your Sharding Strategy&lt;/p&gt;

&lt;p&gt;Once you have your key, you need to decide how to map a key value to a shard. There are three main approaches:&lt;/p&gt;

&lt;p&gt;Range-Based Sharding&lt;/p&gt;

&lt;p&gt;You divide the keyspace into ranges. Business IDs 1 to 100,000 go to shard one. 100,001 to 200,000 go to shard two. And so on.&lt;/p&gt;

&lt;p&gt;This is simple to understand and easy to implement. But it creates a problem called hotspots. If your newest, most active businesses all have high IDs, shard three is doing all the work while shard one sits quiet. Your load is uneven.&lt;/p&gt;

&lt;p&gt;In our fintech scenario, range sharding on business_id would have been a mistake. New business signups were growing fast, which means the highest ID shard would have carried a disproportionate share of new transactions.&lt;/p&gt;

&lt;p&gt;Hash-Based Sharding&lt;/p&gt;

&lt;p&gt;You run the sharding key through a hash function and use the result to pick a shard. shard = hash(business_id) % number_of_shards.&lt;br&gt;
This distributes data evenly. No hotspots. Every shard gets a roughly equal share.&lt;/p&gt;

&lt;p&gt;The tradeoff: range queries become expensive. "Give me all businesses with IDs between 50,000 and 60,000" now potentially touches every shard because hashing destroys the natural ordering of IDs.&lt;/p&gt;

&lt;p&gt;For our fintech system, hash-based sharding on business_id was the right call. We query by business ID directly, not by ranges of business IDs. Even distribution mattered more than range query support.&lt;/p&gt;

&lt;p&gt;Directory-Based Sharding&lt;/p&gt;

&lt;p&gt;You maintain a lookup table — a directory — that maps each key to a shard. Business 1042 is on shard three. Business 8891 is on shard one. The directory decides.&lt;/p&gt;

&lt;p&gt;This gives you the most flexibility. You can move a business from one shard to another by updating the directory. You can handle uneven data sizes by putting your largest businesses on dedicated shards.&lt;/p&gt;

&lt;p&gt;The cost: the directory itself becomes a critical dependency. If it goes down, nothing can route queries anywhere. You need to cache it aggressively and protect it carefully.&lt;/p&gt;

&lt;p&gt;For very large businesses that generate 10x the transaction volume of an average customer, we used a hybrid approach — hash sharding for the majority, with directory overrides that placed our top 20 enterprise clients on dedicated shard instances.&lt;/p&gt;

&lt;p&gt;Step Three: Build Your Routing Layer&lt;br&gt;
Once you know your sharding key and strategy, you need something that sits between your application and your databases and routes each query to the right shard.&lt;br&gt;
In our fintech system, we built a lightweight routing service in Python. Every database call went through it. The logic was simple:&lt;/p&gt;

&lt;p&gt;`pythondef get_shard(business_id: int, num_shards: int = 8) -&amp;gt; str:&lt;br&gt;
    shard_index = hash(business_id) % num_shards&lt;br&gt;
    return f"shard_{shard_index}"&lt;/p&gt;

&lt;p&gt;def get_db_connection(business_id: int):&lt;br&gt;
    shard = get_shard(business_id)&lt;br&gt;
    return connection_pool[shard].get_connection()`&lt;/p&gt;

&lt;p&gt;The application code stayed clean. Engineers called get_db_connection(business_id) and got back a connection to the right shard. They did not need to know which physical database they were talking to.&lt;/p&gt;

&lt;p&gt;For teams using Vitess — which is what YouTube built and later open-sourced — the routing layer is handled for you. Vitess sits in front of your MySQL instances, understands your sharding key, and routes queries transparently. If you are on PostgreSQL, Citus is worth looking at. It turns Postgres into a distributed database with sharding built in.&lt;/p&gt;

&lt;p&gt;Step Four: Handle the Hard Problems&lt;/p&gt;

&lt;p&gt;This is where most sharding articles stop. This is where the real work begins.&lt;/p&gt;

&lt;p&gt;Cross-Shard Queries&lt;/p&gt;

&lt;p&gt;Some queries need data from multiple shards. In our system, the finance team needed a report of total transaction volume across all businesses for a given day. That data lives across all eight shards.&lt;/p&gt;

&lt;p&gt;We solved this by maintaining a separate reporting database — a denormalized aggregate store — that received summarized data from each shard via a message queue. The finance team queried the aggregate store, not the shards directly. Analytical queries never touched the transactional database.&lt;/p&gt;

&lt;p&gt;This is a common pattern: shards handle writes and single-entity reads, a separate store handles cross-shard analytics.&lt;/p&gt;

&lt;p&gt;Distributed Transactions&lt;/p&gt;

&lt;p&gt;In a single database, a transaction is simple. Either all your changes commit or none of them do.&lt;/p&gt;

&lt;p&gt;In a sharded system, a transaction that touches two shards becomes a distributed transaction. This is genuinely hard. Two-phase commit exists but it is slow and fragile. Most teams avoid it.&lt;/p&gt;

&lt;p&gt;Our approach: we designed the system so that a single business's data never needed to span shards. A payment is created, updated, and settled on the same shard — the one that belongs to that business. We accepted that cross-business operations would be eventually consistent rather than immediately consistent.&lt;/p&gt;

&lt;p&gt;For the cases where we truly needed cross-shard consistency — like a reconciliation job that settled balances — we used an outbox pattern. &lt;br&gt;
Each shard wrote events to an outbox table. A separate worker read those events and applied them downstream. Eventual consistency, but with guaranteed delivery.&lt;/p&gt;

&lt;p&gt;Rebalancing&lt;/p&gt;

&lt;p&gt;You start with eight shards. Business grows. Eight shards become a bottleneck. You need sixteen.&lt;br&gt;
This is called resharding and it is painful if you have not planned for it.&lt;/p&gt;

&lt;p&gt;With hash-based sharding, adding a new shard changes the hash mapping. hash(business_id) % 8 and hash(business_id) % 16 produce different results for the same business. Data that was on shard three might now belong on shard eleven. You have to move it.&lt;/p&gt;

&lt;p&gt;We planned for this from day one by using consistent hashing instead of simple modulo hashing. Consistent hashing minimizes how much data moves when you add or remove shards. When we went from eight to twelve shards, only about 25% of data needed to move instead of potentially all of it.&lt;/p&gt;

&lt;p&gt;The migration itself ran as a background job — copying data shard by shard, verifying checksums, then flipping the routing config. Zero downtime. But it took three weeks of careful execution.&lt;/p&gt;

&lt;p&gt;When Sharding Is the Wrong Answer&lt;/p&gt;

&lt;p&gt;Here is the part most engineers skip when they are excited about a new architecture.&lt;/p&gt;

&lt;p&gt;Sharding is not always the answer. And reaching for it too early is one of the more expensive mistakes a team can make.&lt;/p&gt;

&lt;p&gt;Before you shard, you should have already done all of these:&lt;br&gt;
Proper indexing. A missing index on a 200 million row table can make a query run in 8 seconds that should run in 40 milliseconds. Add the index first.&lt;/p&gt;

&lt;p&gt;Connection pooling. PgBouncer or pgpool in front of PostgreSQL handles thousands of application connections without overloading the database.&lt;br&gt;
Read replicas. Move your read traffic — reporting, analytics, search — off the primary. A single primary with two or three replicas handles a surprisingly large amount of load.&lt;/p&gt;

&lt;p&gt;Table partitioning. PostgreSQL native partitioning by date or ID range gives the query planner a much smaller surface to scan. This is not sharding — it still runs on one instance — but it solves many of the same query performance problems with a fraction of the complexity.&lt;/p&gt;

&lt;p&gt;Vertical scaling. Sometimes the right answer is simply a bigger machine. Moving from 32 cores to 64 cores and from 128GB to 256GB RAM is cheaper and faster than a sharding migration.&lt;br&gt;
Sharding makes sense when:&lt;/p&gt;

&lt;p&gt;You have exhausted vertical scaling options&lt;/p&gt;

&lt;p&gt;Your write throughput has outgrown what a single primary can handle&lt;br&gt;
Your dataset is so large that even with partitioning, query planning and vacuuming are struggling&lt;br&gt;
You have clear, consistent query patterns that map well to a sharding key&lt;/p&gt;

&lt;p&gt;Sharding makes your system harder to operate, harder to query, harder to reason about, and harder to debug. You are trading simplicity for scale. Make sure you actually need the scale before you pay that price.&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>distributedsystems</category>
      <category>devops</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>THE CAREER-READY ENGINEER MOVEMENT BEGINS</title>
      <dc:creator>Akum Blaise Acha</dc:creator>
      <pubDate>Sun, 05 Oct 2025 15:57:52 +0000</pubDate>
      <link>https://forem.com/akum_acha_2519d3ec8cd1514/the-career-ready-engineer-movement-begins-3ala</link>
      <guid>https://forem.com/akum_acha_2519d3ec8cd1514/the-career-ready-engineer-movement-begins-3ala</guid>
      <description>&lt;p&gt;A few years ago, I met a young developer who had learned Python, JavaScript, AND React.&lt;/p&gt;

&lt;p&gt;Yet every time someone asked, “What can you build?” — he froze.&lt;br&gt;
Not because he lacked knowledge.&lt;/p&gt;

&lt;p&gt;But because he lacked proof.&lt;br&gt;
That’s when I realized something:&lt;/p&gt;

&lt;p&gt;Most developers in Cameroon (and Africa as a whole) don’t have a skills problem — they have a project problem.&lt;/p&gt;

&lt;p&gt;They’ve watched tutorials, collected certificates, even finished courses…&lt;br&gt;
But when it's time to show what they’ve actually built, everything disappears into thin air.&lt;/p&gt;

&lt;p&gt;Not because they’re lazy — but because nobody ever showed them what real engineering projects look like.&lt;/p&gt;

&lt;p&gt;Projects that solve actual African problems.&lt;/p&gt;

&lt;p&gt;Not Todo lists.&lt;br&gt;
Not calculator clones.&lt;br&gt;
Not static dashboards with fake data.&lt;/p&gt;

&lt;p&gt;I’m talking about:&lt;/p&gt;

&lt;p&gt;✅ A system that helps shop owners auto-restock inventory&lt;br&gt;
✅ A Njangi savings tracker&lt;br&gt;
✅ A customer feedback &amp;amp; sentiment tool for SMEs&lt;br&gt;
✅ A delivery ETA estimator for riders navigating Douala traffic&lt;/p&gt;

&lt;p&gt;These are the kinds of builds that change how you see yourself.&lt;/p&gt;

&lt;p&gt;Not as “someone learning to code,”&lt;br&gt;
but as “an engineer who solves problems.”&lt;/p&gt;

&lt;p&gt;I’ve turned that realization into a structured journey.&lt;/p&gt;

&lt;p&gt;It’s called The Career-Ready Engineer Challenge — a 90-day framework to help you build 15 real engineering systems, one at a time — with guidance, clarity and accountability.&lt;/p&gt;

&lt;p&gt;If this message hit you, then maybe this challenge is yours.&lt;/p&gt;

&lt;p&gt;👉 Learn more or join here: &lt;a href="https://excelintech.com/b/4rwHN" rel="noopener noreferrer"&gt;https://excelintech.com/b/4rwHN&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The One Skill Every Engineer Needs That Isn’t Taught in Bootcamps</title>
      <dc:creator>Akum Blaise Acha</dc:creator>
      <pubDate>Sun, 17 Aug 2025 14:33:22 +0000</pubDate>
      <link>https://forem.com/akum_acha_2519d3ec8cd1514/the-one-skill-every-engineer-needs-that-isnt-taught-in-bootcamps-3cb5</link>
      <guid>https://forem.com/akum_acha_2519d3ec8cd1514/the-one-skill-every-engineer-needs-that-isnt-taught-in-bootcamps-3cb5</guid>
      <description>&lt;p&gt;When I was starting out, I thought being “good” meant writing the cleanest code.&lt;/p&gt;

&lt;p&gt;I spent hours perfecting syntax, naming variables, and refactoring functions — convinced that’s what would get me promoted.&lt;/p&gt;

&lt;p&gt;Then one day, in a code review, my senior looked at me and said:&lt;/p&gt;

&lt;p&gt;“The code looks fine. But walk me through why you did it this way.”&lt;/p&gt;

&lt;p&gt;I froze.&lt;/p&gt;

&lt;p&gt;I could talk about what I did. But not why. And in that silence, I realized something:&lt;br&gt;
The real skill isn’t just building. It’s explaining your thinking.&lt;/p&gt;

&lt;p&gt;Bootcamps Teach Code. Real Life Teaches Communication.&lt;/p&gt;

&lt;p&gt;In bootcamps, you ship projects that “work.”&lt;br&gt;
In jobs, you ship projects that must be understood, maintained, and defended.&lt;/p&gt;

&lt;p&gt;That’s where communication makes the difference.&lt;/p&gt;

&lt;p&gt;Can you explain to a product manager why you chose approach A instead of B?&lt;/p&gt;

&lt;p&gt;Can you describe to a teammate how your code flows — without them opening the editor?&lt;/p&gt;

&lt;p&gt;Can you justify your design decisions in simple, non-technical language?&lt;/p&gt;

&lt;p&gt;If the answer is no, you’ll always feel “junior,” no matter how many languages you know.&lt;/p&gt;

&lt;p&gt;The Interview Wake-Up Call&lt;/p&gt;

&lt;p&gt;In one DevOps interview, I was asked a simple question:&lt;/p&gt;

&lt;p&gt;“Explain how your last CI/CD pipeline worked.”&lt;/p&gt;

&lt;p&gt;I thought showing them YAML would be enough. It wasn’t. They wanted me to tell a story.&lt;/p&gt;

&lt;p&gt;What problem the pipeline solved&lt;/p&gt;

&lt;p&gt;The steps it took&lt;/p&gt;

&lt;p&gt;Why I chose that tool&lt;/p&gt;

&lt;p&gt;How it reduced errors or saved time&lt;/p&gt;

&lt;p&gt;That’s when I understood: the best engineers don’t just build solutions — they translate them into stories everyone else can understand.&lt;/p&gt;

&lt;p&gt;Why This Matters&lt;/p&gt;

&lt;p&gt;Influence: Senior engineers get promoted because they can explain decisions to stakeholders, not just peers.&lt;/p&gt;

&lt;p&gt;Collaboration: Teams move faster when ideas are clear and decisions aren’t hidden in one person’s head.&lt;/p&gt;

&lt;p&gt;Trust: Interviewers and managers trust you more when you can break down complex work simply.&lt;/p&gt;

&lt;p&gt;How to Build This Skill&lt;/p&gt;

&lt;p&gt;You don’t need a communication class. You need practice.&lt;/p&gt;

&lt;p&gt;This week, try this:&lt;/p&gt;

&lt;p&gt;Take one piece of work you’ve done (a project, script, or pipeline).&lt;/p&gt;

&lt;p&gt;Write a short “explainer” for it.&lt;/p&gt;

&lt;p&gt;Problem it solved&lt;/p&gt;

&lt;p&gt;Tools you used&lt;/p&gt;

&lt;p&gt;Why you chose them&lt;/p&gt;

&lt;p&gt;One lesson you learned&lt;/p&gt;

&lt;p&gt;Share it with a friend, colleague, or even on LinkedIn.&lt;/p&gt;

&lt;p&gt;You’ll be shocked how much clearer your own thinking becomes once you write it down.&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;/p&gt;

&lt;p&gt;Code gets you hired.&lt;br&gt;
Communication gets you promoted.&lt;/p&gt;

&lt;p&gt;Master both — and you stop being “just another developer.”&lt;/p&gt;

</description>
      <category>programming</category>
      <category>softwareengineering</category>
      <category>careerdevelopment</category>
      <category>careergrowth</category>
    </item>
    <item>
      <title>The #1 Skill That Separates Average Engineers from Top Engineers</title>
      <dc:creator>Akum Blaise Acha</dc:creator>
      <pubDate>Sun, 20 Jul 2025 19:57:02 +0000</pubDate>
      <link>https://forem.com/akum_acha_2519d3ec8cd1514/the-1-skill-that-separates-average-engineers-from-top-engineers-4o4b</link>
      <guid>https://forem.com/akum_acha_2519d3ec8cd1514/the-1-skill-that-separates-average-engineers-from-top-engineers-4o4b</guid>
      <description>&lt;p&gt;Most software engineers obsess over tools, languages, and frameworks.&lt;/p&gt;

&lt;p&gt;But the ones who grow the fastest?&lt;br&gt;
They master one thing that changes everything:&lt;/p&gt;

&lt;p&gt;Thinking in systems.&lt;/p&gt;

&lt;p&gt;→ Anyone can write code that works.&lt;br&gt;
→ Top engineers write code that fits.&lt;br&gt;
Fits into the business.&lt;br&gt;
Fits into the architecture.&lt;br&gt;
Fits into the team.&lt;/p&gt;

&lt;p&gt;They ask:&lt;br&gt;
• How does this change affect upstream and downstream services?&lt;br&gt;
• How will this scale with more users or data?&lt;br&gt;
• Where can failure occur, and how will we handle it?&lt;/p&gt;

&lt;p&gt;It’s no longer about being the "smartest coder".&lt;br&gt;
It’s about being the most strategic.&lt;/p&gt;

&lt;p&gt;If you want to move from “good engineer” to “impactful engineer”, stop thinking in features.&lt;br&gt;
Start thinking in systems.&lt;/p&gt;

</description>
      <category>career</category>
      <category>productivity</category>
      <category>softwareengineering</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Understanding Two-Factor Authentication: What Every Software Engineer Should Know</title>
      <dc:creator>Akum Blaise Acha</dc:creator>
      <pubDate>Sun, 27 Apr 2025 10:48:18 +0000</pubDate>
      <link>https://forem.com/akum_acha_2519d3ec8cd1514/understanding-two-factor-authentication-what-every-software-engineer-should-know-3me8</link>
      <guid>https://forem.com/akum_acha_2519d3ec8cd1514/understanding-two-factor-authentication-what-every-software-engineer-should-know-3me8</guid>
      <description>&lt;p&gt;We've all used 2FA. But as a software engineer, do you know how it works under the hood?&lt;/p&gt;

&lt;p&gt;Like we all know, two-factor authentication is a security method that requires two forms of identity before giving someone access to an account.&lt;/p&gt;

&lt;p&gt;The first factor is what you know. That’s your password.&lt;/p&gt;

&lt;p&gt;The second factor is either what you have or what you are. What you have can be your phone or a security key. What you are can be your fingerprint or your face.&lt;/p&gt;

&lt;p&gt;Here’s the flow:&lt;/p&gt;

&lt;p&gt;You enter your email or username and password, if the details are correct, the second layer kicks in. That could be an OTP sent to your phone, a code from an authenticator app, or a biometric check.&lt;/p&gt;

&lt;p&gt;Once you complete the second step, access is granted. If not, you’re blocked.&lt;/p&gt;

&lt;p&gt;As a dev, this is how you can implement 2FA:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Start by storing a shared secret between your app and the user’s authenticator app. You can use libraries. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When the user logs in successfully, generate a time-based one-time password using the shared secret and the current time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Send a prompt to the user to enter the 2FA code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once they enter the code, verify it by comparing it with the one your server generates in real-time using the same secret and time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If it matches, proceed. If not, reject access.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Avoid using SMS-based 2FA. It’s weak and vulnerable to SIM swap attacks. Go with TOTP or physical keys.&lt;/p&gt;

&lt;p&gt;Knowing how 2FA works helps you build more secure products. &lt;/p&gt;

&lt;p&gt;And if you're shipping anything that handles sensitive data, you shouldn't treat 2FA like an optional feature.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How I Would Learn Software Engineering If I Had to Start All Over Again in 2025</title>
      <dc:creator>Akum Blaise Acha</dc:creator>
      <pubDate>Sun, 27 Apr 2025 09:08:12 +0000</pubDate>
      <link>https://forem.com/akum_acha_2519d3ec8cd1514/how-i-would-learn-software-engineering-if-i-had-to-start-all-over-again-in-2025-hef</link>
      <guid>https://forem.com/akum_acha_2519d3ec8cd1514/how-i-would-learn-software-engineering-if-i-had-to-start-all-over-again-in-2025-hef</guid>
      <description>&lt;p&gt;Most people think learning software engineering is all about cramming programming languages and rushing through tutorials.&lt;br&gt;
I used to think the same when I started.&lt;/p&gt;

&lt;p&gt;But after several years working professionally, mentoring over 10+ engineers, and publishing 40+ articles on building real tech careers, I see things very differently now.&lt;/p&gt;

&lt;p&gt;If I had to start all over again in 2025 — from absolute zero — here’s exactly how I would approach learning software engineering.&lt;/p&gt;

&lt;p&gt;And no, it wouldn't begin with "Learn HTML and CSS."&lt;/p&gt;

&lt;p&gt;It would begin with something deeper: understanding how everything actually works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Understand How the Internet Works (Before Writing Code)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before touching any programming language, I would take time to really understand:&lt;/p&gt;

&lt;p&gt;What happens when you open a website&lt;/p&gt;

&lt;p&gt;How data moves between your browser, servers, and databases&lt;/p&gt;

&lt;p&gt;What APIs are, and why they're important&lt;/p&gt;

&lt;p&gt;Basics of client-server architecture&lt;/p&gt;

&lt;p&gt;Knowing these concepts would give me a mental map to place all the coding skills I’ll eventually learn.&lt;/p&gt;

&lt;p&gt;It’s like building a house — you don't start by painting walls. You start by understanding the foundation.&lt;/p&gt;

&lt;p&gt;(And honestly, this kind of understanding would have saved me months of confusion early on.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Choose ONE Language and Stick With It&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In 2025, it’s very tempting to jump between languages: JavaScript, Python, Rust, Go, PHP, TypeScript...&lt;/p&gt;

&lt;p&gt;If I was starting again, I would pick one versatile language (like Python or JavaScript) and stick with it for at least 6–12 months.&lt;/p&gt;

&lt;p&gt;Why?&lt;br&gt;
Because mastery beats curiosity at the early stages.&lt;/p&gt;

&lt;p&gt;Languages are just tools. The real value is in mastering problem-solving using that tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Build Real Projects Early (Not Endless Tutorials)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This was a huge mistake I made early on: staying stuck in tutorial loops.&lt;/p&gt;

&lt;p&gt;If I started again, I would build my own small projects as early as possible — even if they’re messy.&lt;/p&gt;

&lt;p&gt;Simple ideas like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A to-do list app&lt;/li&gt;
&lt;li&gt;A blog API&lt;/li&gt;
&lt;li&gt;A simple portfolio website&lt;/li&gt;
&lt;li&gt;A weather app using a public API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every project teaches lessons you can't learn from tutorials: debugging, designing, asking better questions, reading documentation.&lt;/p&gt;

&lt;p&gt;Projects build confidence.&lt;br&gt;
Tutorials build dependency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Learn Basic System Design Early&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I used to think "system design" was something only senior engineers worried about.&lt;br&gt;
Big mistake.&lt;/p&gt;

&lt;p&gt;Even at the beginner level, understanding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How databases connect to apps&lt;/li&gt;
&lt;li&gt;How APIs are structured&lt;/li&gt;
&lt;li&gt;How scaling affects apps&lt;/li&gt;
&lt;li&gt;How load balancers or caching work
...can help you make smarter choices while coding.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t need to become a system architect overnight.&lt;br&gt;
But you should start seeing your projects like small systems, not isolated pieces of code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Join a Learning Community&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Learning software engineering alone is one of the hardest ways to do it.&lt;/p&gt;

&lt;p&gt;If I was starting over, I would join a community of learners and engineers immediately.&lt;/p&gt;

&lt;p&gt;Not just for help — but for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accountability&lt;/li&gt;
&lt;li&gt;Motivation when stuck&lt;/li&gt;
&lt;li&gt;Exposure to how others think&lt;/li&gt;
&lt;li&gt;Opportunities for real-world collaborations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(That’s part of why I created &lt;a href="https://mentoraura.com" rel="noopener noreferrer"&gt;MentorAura&lt;/a&gt; — to make this easier for others.)&lt;/p&gt;

&lt;p&gt;In tech, community isn’t a "nice to have."&lt;br&gt;
It’s a career accelerator.&lt;/p&gt;

&lt;p&gt;Software engineering isn’t about collecting languages.&lt;br&gt;
It’s about solving real-world problems — making something useful, scalable, secure, and reliable.&lt;/p&gt;

&lt;p&gt;If you’re just starting out (or even restarting), remember:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build understanding before building code&lt;/li&gt;
&lt;li&gt;Master one thing before chasing everything&lt;/li&gt;
&lt;li&gt;Projects over tutorials&lt;/li&gt;
&lt;li&gt;Systems over scripts&lt;/li&gt;
&lt;li&gt;Community over isolation
Every expert you admire today was once a beginner — they just didn't quit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stay consistent. Stay curious. Stay building. &lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
