<?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: Paramanantham Harrison</title>
    <description>The latest articles on DEV Community by Paramanantham Harrison (@learnwithparam).</description>
    <link>https://dev.to/learnwithparam</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%2F88511%2F8d37a0d4-33f0-41b6-b2ee-60256bbd2904.jpeg</url>
      <title>DEV Community: Paramanantham Harrison</title>
      <link>https://dev.to/learnwithparam</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/learnwithparam"/>
    <language>en</language>
    <item>
      <title>Hands-On Workshop: Build Your Own AI Agent from Scratch (Free!)</title>
      <dc:creator>Paramanantham Harrison</dc:creator>
      <pubDate>Wed, 22 Oct 2025 16:49:11 +0000</pubDate>
      <link>https://dev.to/learnwithparam/hands-on-workshop-build-your-own-ai-agent-from-scratch-free-ahj</link>
      <guid>https://dev.to/learnwithparam/hands-on-workshop-build-your-own-ai-agent-from-scratch-free-ahj</guid>
      <description>&lt;p&gt;AI agents are the next big thing in 2025 — capable of reasoning, tool use, and automating complex tasks. Most devs talk about them, few actually build them. Here’s your chance to create one yourself.&lt;/p&gt;

&lt;p&gt;In this free 90-min workshop, you’ll:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Design and deploy a real AI agent&lt;/li&gt;
&lt;li&gt;Integrate tools and workflows&lt;/li&gt;
&lt;li&gt;Implement memory, reasoning, and decision logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bonus&lt;/strong&gt;: add voice input/output for an interactive experience&lt;/p&gt;

&lt;p&gt;By the end, you’ll have a portfolio-ready agent and the know-how to scale it further.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎯 Who it’s for&lt;/strong&gt;: Software engineers, AI enthusiasts, and anyone ready to go beyond demos and tutorials.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RSVP now&lt;/strong&gt;: &lt;a href="https://luma.com/t160xyvv" rel="noopener noreferrer"&gt;https://luma.com/t160xyvv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Extra&lt;/strong&gt;: Join our bootcamp to master multi-agent systems, tool orchestration, and production-ready AI agents.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>Day 7: BackendChallenges.com – The Frontend Security Checklist Devs Ignore</title>
      <dc:creator>Paramanantham Harrison</dc:creator>
      <pubDate>Tue, 25 Mar 2025 08:58:45 +0000</pubDate>
      <link>https://dev.to/learnwithparam/day-7-backendchallengescom-the-frontend-security-checklist-devs-ignore-56fp</link>
      <guid>https://dev.to/learnwithparam/day-7-backendchallengescom-the-frontend-security-checklist-devs-ignore-56fp</guid>
      <description>&lt;h3&gt;
  
  
  Why Frontend Security Matters?
&lt;/h3&gt;

&lt;p&gt;You might think backend is where security lives.&lt;br&gt;&lt;br&gt;
But truth is—&lt;strong&gt;most backend breaches start in the frontend&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔐 Challenge #1: Fix Leaky Token Storage
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem:
&lt;/h3&gt;

&lt;p&gt;Your React app stores access tokens in &lt;code&gt;localStorage&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fix:
&lt;/h3&gt;

&lt;p&gt;✅ Use &lt;code&gt;HttpOnly&lt;/code&gt; secure cookies&lt;br&gt;&lt;br&gt;
❌ Never expose tokens to JS or extensions&lt;br&gt;&lt;br&gt;
💡 Bonus: Rotate tokens securely&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Challenge #2: Input Validation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem:
&lt;/h3&gt;

&lt;p&gt;User input from forms is sent directly to APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fix:
&lt;/h3&gt;

&lt;p&gt;✅ Validate input on frontend AND backend&lt;br&gt;&lt;br&gt;
✅ Escape special characters&lt;br&gt;&lt;br&gt;
✅ Use a schema validator like &lt;code&gt;zod&lt;/code&gt; or &lt;code&gt;yup&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🌍 Challenge #3: Lock Down CORS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem:
&lt;/h3&gt;

&lt;p&gt;Your frontend is served from any origin.&lt;br&gt;&lt;br&gt;
Your API allows &lt;code&gt;Access-Control-Allow-Origin: *&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Fix:
&lt;/h3&gt;

&lt;p&gt;✅ Only allow specific trusted origins&lt;br&gt;&lt;br&gt;
✅ Block credentials from being shared&lt;/p&gt;




&lt;p&gt;🛡️ Start fixing frontend risks before they hit your backend:&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://www.backendchallenges.com/course/frontend-security-checklist/learn" rel="noopener noreferrer"&gt;Frontend Security Checklist&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>security</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to Fix Broken Auth in Your App (JWT &amp; OAuth2)</title>
      <dc:creator>Paramanantham Harrison</dc:creator>
      <pubDate>Sat, 22 Mar 2025 18:38:34 +0000</pubDate>
      <link>https://dev.to/learnwithparam/how-to-fix-broken-auth-in-your-app-jwt-oauth2-53d9</link>
      <guid>https://dev.to/learnwithparam/how-to-fix-broken-auth-in-your-app-jwt-oauth2-53d9</guid>
      <description>&lt;p&gt;&lt;iframe src="https://open.spotify.com/embed/show/0VsmcSD3K7oUjyeD9ABScV" width="100%" height="232px"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Most apps fail at the first layer: authentication. In this episode, we walk through common JWT &amp;amp; OAuth2 mistakes developers make—and how to fix them.&lt;/p&gt;

&lt;p&gt;You’ll learn:&lt;/p&gt;

&lt;p&gt;How JWTs get leaked&lt;br&gt;
What a secure OAuth2 flow looks like&lt;br&gt;
How to prevent brute-force login attacks&lt;br&gt;
💡 Want to try these hands-on?&lt;/p&gt;

&lt;p&gt;Do the short course here → &lt;a href="https://www.backendchallenges.com/course/fix-broken-authentication-using-jwt-and-oauth2/learn" rel="noopener noreferrer"&gt;https://www.backendchallenges.com/course/fix-broken-authentication-using-jwt-and-oauth2/learn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>podcast</category>
      <category>systems</category>
      <category>architecture</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Day 6: BackendChallenges.com - Fix Broken Authentication with JWT &amp; OAuth2 🔐</title>
      <dc:creator>Paramanantham Harrison</dc:creator>
      <pubDate>Sat, 22 Mar 2025 18:23:29 +0000</pubDate>
      <link>https://dev.to/learnwithparam/day-6-backendchallengescom-fix-broken-authentication-with-jwt-oauth2-1cbo</link>
      <guid>https://dev.to/learnwithparam/day-6-backendchallengescom-fix-broken-authentication-with-jwt-oauth2-1cbo</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Why Authentication Fails?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Most developers secure their login system &lt;em&gt;after&lt;/em&gt; it's been compromised.&lt;/p&gt;

&lt;p&gt;But let’s be real:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Storing JWTs in &lt;code&gt;localStorage&lt;/code&gt; is risky
&lt;/li&gt;
&lt;li&gt;Misconfigured OAuth2 flows are a hacker’s paradise
&lt;/li&gt;
&lt;li&gt;No brute-force protection? You’re asking for trouble&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛡️ &lt;strong&gt;Challenge #1: Lock Down JWTs&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Problem&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Users receive JWTs after login. But they’re stored insecurely, never expire, and can be replayed if stolen.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Fix&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;1️⃣ Store JWTs in secure cookies (HttpOnly)&lt;br&gt;&lt;br&gt;
2️⃣ Use short-lived tokens + refresh tokens&lt;br&gt;&lt;br&gt;
3️⃣ Rotate tokens when users log out or sessions expire&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Bonus Challenge:&lt;/strong&gt; Add token blacklisting after password reset.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔐 &lt;strong&gt;Challenge #2: Harden Your OAuth2 Flow&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Problem&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Your OAuth2 flow is missing PKCE, using implicit grants, and has overly broad scopes.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Fix&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;1️⃣ Use Authorization Code + PKCE&lt;br&gt;&lt;br&gt;
2️⃣ Define narrow scopes&lt;br&gt;&lt;br&gt;
3️⃣ Securely store tokens, and rotate them regularly&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Bonus Challenge:&lt;/strong&gt; Add rate limits to your OAuth login flow.&lt;/p&gt;




&lt;h2&gt;
  
  
  💣 &lt;strong&gt;Challenge #3: Stop Brute Force Attacks&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Problem&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Anyone can try 1000s of login attempts without resistance.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Fix&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;1️⃣ Add rate limits to &lt;code&gt;/login&lt;/code&gt; and &lt;code&gt;/reset-password&lt;/code&gt;&lt;br&gt;&lt;br&gt;
2️⃣ Lock accounts temporarily after X failed attempts&lt;br&gt;&lt;br&gt;
3️⃣ Track login attempts per IP &amp;amp; user&lt;/p&gt;




&lt;h3&gt;
  
  
  Final Thought:
&lt;/h3&gt;

&lt;p&gt;Authentication is your app’s front door.&lt;br&gt;&lt;br&gt;
Don’t leave it wide open.&lt;/p&gt;

&lt;p&gt;👉 Start solving these challenges now:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;a href="https://www.backendchallenges.com/course/fix-broken-authentication-using-jwt-and-oauth2/learn" rel="noopener noreferrer"&gt;Fix Broken Auth – Backend Challenges&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>backenddevelopment</category>
    </item>
    <item>
      <title>Day 5: BackendChallenges.com - Building Rate Limiting for Scalable APIs 🚀</title>
      <dc:creator>Paramanantham Harrison</dc:creator>
      <pubDate>Wed, 19 Mar 2025 19:42:21 +0000</pubDate>
      <link>https://dev.to/learnwithparam/day-5-backendchallengescom-building-rate-limiting-for-scalable-apis-2dj3</link>
      <guid>https://dev.to/learnwithparam/day-5-backendchallengescom-building-rate-limiting-for-scalable-apis-2dj3</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Why Rate Limiting Matters?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;APIs power the web, but without &lt;strong&gt;rate limiting&lt;/strong&gt;, a single user (or bot) can &lt;strong&gt;overload your system&lt;/strong&gt;. Think about &lt;strong&gt;how login attempts, API calls, and DDOS attacks&lt;/strong&gt; could take down your app.  &lt;/p&gt;

&lt;p&gt;Let’s see if you can &lt;strong&gt;design a rate-limiting system&lt;/strong&gt; like the pros!  &lt;/p&gt;




&lt;h2&gt;
  
  
  🛡️ &lt;strong&gt;Challenge #1: Implement Basic Rate Limiting&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Problem&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Your API is getting &lt;strong&gt;too many requests from a single user&lt;/strong&gt;. You need to &lt;strong&gt;limit how often&lt;/strong&gt; they can hit an endpoint.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Solution&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;Use a token bucket or fixed window algorithm&lt;/strong&gt; to track requests.&lt;br&gt;&lt;br&gt;
2️⃣ &lt;strong&gt;Allow users X requests per minute&lt;/strong&gt; (e.g., 100 requests/min).&lt;br&gt;&lt;br&gt;
3️⃣ &lt;strong&gt;Return 429 Too Many Requests&lt;/strong&gt; when the limit is hit.  &lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Bonus Challenge:&lt;/strong&gt; Implement &lt;strong&gt;different rate limits&lt;/strong&gt; for free and premium users.  &lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 &lt;strong&gt;Challenge #2: Scaling Rate Limiting with Redis&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Problem&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Your rate-limiting logic &lt;strong&gt;fails at scale&lt;/strong&gt;—you need to &lt;strong&gt;distribute it across multiple servers&lt;/strong&gt;.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Solution&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;1️⃣ Store request counts in &lt;strong&gt;Redis&lt;/strong&gt; (fast &amp;amp; scalable).&lt;br&gt;&lt;br&gt;
2️⃣ &lt;strong&gt;Sync rate limits across all API servers&lt;/strong&gt; in real-time.&lt;br&gt;&lt;br&gt;
3️⃣ Implement &lt;strong&gt;IP-based &amp;amp; user-based rate limits&lt;/strong&gt; for more security.  &lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Bonus Challenge:&lt;/strong&gt; Implement &lt;strong&gt;Geo-based rate limiting&lt;/strong&gt; (e.g., limit per region).  &lt;/p&gt;




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

&lt;p&gt;Rate limiting isn’t just about stopping spam—it’s about:&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Preventing abuse &amp;amp; DDOS attacks&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Scaling APIs without crashes&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Fair usage between free &amp;amp; premium users&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;🚀 Want more challenges like this? Start learning here 👉 &lt;strong&gt;&lt;a href="https://backendchallenges.com/?utm_source=blog&amp;amp;utm_medium=organic&amp;amp;utm_campaign=rate_limiting_challenges" rel="noopener noreferrer"&gt;Backend Challenges&lt;/a&gt;&lt;/strong&gt;  &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Scaling APIs without breaking them using Rate Limiting</title>
      <dc:creator>Paramanantham Harrison</dc:creator>
      <pubDate>Wed, 19 Mar 2025 19:35:01 +0000</pubDate>
      <link>https://dev.to/learnwithparam/episode-2-api-rate-limiting-5bib</link>
      <guid>https://dev.to/learnwithparam/episode-2-api-rate-limiting-5bib</guid>
      <description>&lt;p&gt;&lt;iframe src="https://open.spotify.com/embed/episode/1nBs0bQsAKgtNHjNEeo7e8" width="100%" height="232px"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;APIs handle millions of requests daily, but without rate limiting, they crash, slow down, and get abused.&lt;/p&gt;

&lt;p&gt;In today’s episode, we discuss how to build scalable rate limiting systems, from basic throttling to Redis-powered distributed solutions.&lt;/p&gt;

&lt;p&gt;APIs don’t break because of traffic. They break because they aren’t designed to handle traffic well. That’s where rate limiting comes in. Think about it—if every user could send unlimited requests, the whole system would crash. But how do you set the right limits without blocking real users? We’ll break it down in today’s episode, from simple request caps to Redis-based distributed rate limiting. Let’s dive in!&lt;/p&gt;

&lt;p&gt;🚀 Want to become a backend expert? Start now 👉 &lt;a href="https://backendChallenges.com" rel="noopener noreferrer"&gt;https://backendChallenges.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>podcast</category>
      <category>webdev</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
    <item>
      <title>Day 4: BackendChallenges.com - Dynamic Pricing Challenge</title>
      <dc:creator>Paramanantham Harrison</dc:creator>
      <pubDate>Tue, 18 Mar 2025 08:21:06 +0000</pubDate>
      <link>https://dev.to/learnwithparam/day-4-backendchallengescom-dynamic-pricing-challenge-10p7</link>
      <guid>https://dev.to/learnwithparam/day-4-backendchallengescom-dynamic-pricing-challenge-10p7</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Why Dynamic Pricing Matters?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;From &lt;strong&gt;Uber surge pricing&lt;/strong&gt; to &lt;strong&gt;airline ticket prices&lt;/strong&gt;, dynamic pricing is everywhere. The challenge? &lt;strong&gt;Building a system that adjusts prices in real-time based on demand, location, and external factors.&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Let’s see if you can design a &lt;strong&gt;real-time pricing engine&lt;/strong&gt; like Uber!  &lt;/p&gt;




&lt;h2&gt;
  
  
  🏎️ &lt;strong&gt;Challenge #1: Implement Surge Pricing Based on Demand&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Problem&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Your ride-sharing app needs to &lt;strong&gt;increase ride prices&lt;/strong&gt; when demand is high and &lt;strong&gt;decrease them&lt;/strong&gt; when demand drops.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Solution&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;Track active ride requests&lt;/strong&gt; in different locations.&lt;br&gt;&lt;br&gt;
2️⃣ &lt;strong&gt;Set surge rules&lt;/strong&gt; (e.g., if demand is 2x the available drivers, increase price by 1.5x).&lt;br&gt;&lt;br&gt;
3️⃣ &lt;strong&gt;Calculate real-time fares&lt;/strong&gt; based on demand levels.  &lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Bonus Challenge:&lt;/strong&gt; Implement a &lt;strong&gt;cool-down period&lt;/strong&gt; so prices don’t fluctuate too fast.  &lt;/p&gt;




&lt;h2&gt;
  
  
  💰 &lt;strong&gt;Challenge #2: Predict Prices Using Traffic &amp;amp; Weather Data&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Problem&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Pricing should adjust based on &lt;strong&gt;real-world conditions&lt;/strong&gt;—bad weather or heavy traffic should increase fares.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Solution&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;Fetch traffic &amp;amp; weather data&lt;/strong&gt; from an external API.&lt;br&gt;&lt;br&gt;
2️⃣ &lt;strong&gt;Assign weight factors&lt;/strong&gt; (e.g., +20% fare in heavy rain, +15% during peak traffic).&lt;br&gt;&lt;br&gt;
3️⃣ &lt;strong&gt;Integrate this into your pricing algorithm&lt;/strong&gt; to adjust fares dynamically.  &lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Bonus Challenge:&lt;/strong&gt; Use &lt;strong&gt;historical ride data&lt;/strong&gt; to predict &lt;strong&gt;optimal fare adjustments&lt;/strong&gt; for different cities.  &lt;/p&gt;




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

&lt;p&gt;Dynamic pricing isn’t just about raising prices—it’s about:&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Balancing demand &amp;amp; supply&lt;/strong&gt; dynamically&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Using real-time data&lt;/strong&gt; to make smart pricing decisions&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Ensuring fairness&lt;/strong&gt; for riders &amp;amp; profitability for drivers  &lt;/p&gt;

&lt;p&gt;🚀 Want more challenges like this? Start learning here 👉 &lt;strong&gt;&lt;a href="https://backendchallenges.com/?utm_source=blog&amp;amp;utm_medium=organic&amp;amp;utm_campaign=dynamic_pricing_challenges" rel="noopener noreferrer"&gt;Backend Challenges&lt;/a&gt;&lt;/strong&gt; &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>career</category>
    </item>
    <item>
      <title>Day 3: BackendChallenges.com - Why Multi-Tenancy Matters?</title>
      <dc:creator>Paramanantham Harrison</dc:creator>
      <pubDate>Sun, 16 Mar 2025 15:28:33 +0000</pubDate>
      <link>https://dev.to/learnwithparam/day-3-backendchallengescom-why-multi-tenancy-matters-fe6</link>
      <guid>https://dev.to/learnwithparam/day-3-backendchallengescom-why-multi-tenancy-matters-fe6</guid>
      <description>&lt;p&gt;From SaaS platforms to cloud services, multi-tenancy is the backbone of scalable applications. Instead of running separate instances for each customer, a well-designed multi-tenant system ensures &lt;strong&gt;efficiency, security, and maintainability&lt;/strong&gt;—but it comes with its own challenges.  &lt;/p&gt;

&lt;p&gt;Here’s a real-world challenge to test your multi-tenancy skills.  &lt;/p&gt;




&lt;h2&gt;
  
  
  🏢 &lt;strong&gt;Challenge: Design a Multi-Tenant Database for a SaaS Platform&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Problem&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You’re building a SaaS application where multiple businesses (tenants) need their own user accounts and data, but they should never access each other’s information.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Solution&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Choose a &lt;strong&gt;multi-tenancy approach&lt;/strong&gt;:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shared Database, Shared Schema (Single Table with a &lt;code&gt;tenant_id&lt;/code&gt; column)
&lt;/li&gt;
&lt;li&gt;Shared Database, Isolated Schemas (One schema per tenant)
&lt;/li&gt;
&lt;li&gt;Separate Databases per Tenant (Complete isolation but complex management)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tasks:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Design the &lt;strong&gt;user authentication model&lt;/strong&gt; ensuring a user can only access their tenant's data.
&lt;/li&gt;
&lt;li&gt;Implement &lt;strong&gt;role-based access control (RBAC)&lt;/strong&gt; per tenant.
&lt;/li&gt;
&lt;li&gt;Optimize &lt;strong&gt;query performance&lt;/strong&gt; to ensure scalability as more tenants join.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 &lt;strong&gt;Bonus Challenge:&lt;/strong&gt; Implement soft deletions instead of hard deletions to prevent accidental data loss.  &lt;/p&gt;




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

&lt;p&gt;Multi-tenancy isn’t just about storing data—it’s about designing a system that scales securely, efficiently, and cost-effectively.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scaling strategy matters:&lt;/strong&gt; Choose the right database model.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security is key:&lt;/strong&gt; Ensure tenants can’t access each other’s data.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance counts:&lt;/strong&gt; Indexing &amp;amp; partitioning can help with query speed.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚀 Want more challenges like this along with detailed solutions? Start learning here 👉 &lt;strong&gt;&lt;a href="https://backendchallenges.com/?utm_source=blog&amp;amp;utm_medium=organic&amp;amp;utm_campaign=multi_tenancy_challenges" rel="noopener noreferrer"&gt;Backend Challenges&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>systemdesign</category>
      <category>architecture</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Day 2: BackendChallenges.com - Why REST API Design Matters</title>
      <dc:creator>Paramanantham Harrison</dc:creator>
      <pubDate>Thu, 13 Mar 2025 10:21:18 +0000</pubDate>
      <link>https://dev.to/learnwithparam/day-2-backendchallengescom-why-rest-api-design-matters-2377</link>
      <guid>https://dev.to/learnwithparam/day-2-backendchallengescom-why-rest-api-design-matters-2377</guid>
      <description>&lt;p&gt;APIs are the backbone of modern applications, allowing different systems to communicate seamlessly. But designing efficient, scalable, and secure REST APIs requires more than just setting up routes. Here are two hands-on challenges to improve your API skills.  &lt;/p&gt;




&lt;h2&gt;
  
  
  🌍 Challenge #1: Design an API for User Authentication
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;Your application needs user authentication, but storing plain passwords is a huge security risk. Design an authentication API that securely handles user login and registration.  &lt;/p&gt;

&lt;h3&gt;
  
  
  The Solution
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create an endpoint for &lt;strong&gt;user registration&lt;/strong&gt; that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stores hashed passwords using bcrypt or Argon2.&lt;/li&gt;
&lt;li&gt;Returns a success message upon registration.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a &lt;strong&gt;login endpoint&lt;/strong&gt; that:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validates credentials.
&lt;/li&gt;
&lt;li&gt;Issues a &lt;strong&gt;JWT token&lt;/strong&gt; upon successful login.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;💡 &lt;strong&gt;Bonus Challenge:&lt;/strong&gt; Implement token expiration and refresh tokens for improved security.  &lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Challenge #2: Design a CRUD API for a Product Catalog
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;E-commerce platforms need APIs to manage products dynamically. Build a REST API that supports CRUD operations for a product catalog.  &lt;/p&gt;

&lt;h3&gt;
  
  
  The Solution
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create an endpoint&lt;/strong&gt; to add new products (&lt;code&gt;POST /products&lt;/code&gt;)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fetch a product&lt;/strong&gt; by ID (&lt;code&gt;GET /products/{id}&lt;/code&gt;)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update product details&lt;/strong&gt; (&lt;code&gt;PUT /products/{id}&lt;/code&gt;)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delete a product&lt;/strong&gt; (&lt;code&gt;DELETE /products/{id}&lt;/code&gt;)
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;💡 &lt;strong&gt;Bonus Challenge:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add pagination and filtering for large datasets.
&lt;/li&gt;
&lt;li&gt;Implement rate limiting to prevent abuse.
&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;REST API development is not just about exposing endpoints—it’s about designing scalable, secure, and maintainable APIs.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Secure user data&lt;/strong&gt; with authentication best practices.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make APIs efficient&lt;/strong&gt; by optimizing CRUD operations.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improve performance&lt;/strong&gt; with pagination, caching, and rate limiting.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚀 Want to test yourself with more API challenges? Start learning here 👉 &lt;strong&gt;&lt;a href="https://backendchallenges.com/?utm_source=blog&amp;amp;utm_medium=organic&amp;amp;utm_campaign=rest_api_challenges" rel="noopener noreferrer"&gt;Backend Challenges&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>architecture</category>
      <category>database</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Day 1: BackendChallenges.com - Why SQL matters more than you think</title>
      <dc:creator>Paramanantham Harrison</dc:creator>
      <pubDate>Tue, 11 Mar 2025 20:20:58 +0000</pubDate>
      <link>https://dev.to/learnwithparam/backendchallenges-the-case-of-missing-orders-5ddd</link>
      <guid>https://dev.to/learnwithparam/backendchallenges-the-case-of-missing-orders-5ddd</guid>
      <description>&lt;p&gt;SQL isn’t just about writing queries—it’s about solving real-world problems efficiently. Whether it's finding missing data, preventing bad entries, or making queries smarter, knowing how to handle these challenges can set you apart as a backend engineer.  &lt;/p&gt;

&lt;p&gt;Here are three fun challenges to sharpen your SQL skills.  &lt;/p&gt;




&lt;h2&gt;
  
  
  🛒 Challenge #1: The case of missing orders
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The problem
&lt;/h3&gt;

&lt;p&gt;You run an e-commerce site, and your team wants to find users who signed up but never placed an order.  &lt;/p&gt;

&lt;h3&gt;
  
  
  The solution
&lt;/h3&gt;

&lt;p&gt;Use a LEFT JOIN to find customers who don’t have matching orders.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;
&lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why this matters
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Helps the marketing team target inactive users
&lt;/li&gt;
&lt;li&gt;Shows how JOINs can find missing data
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 &lt;strong&gt;Bonus challenge:&lt;/strong&gt; Modify the query to find customers with at least 3 orders instead.  &lt;/p&gt;




&lt;h2&gt;
  
  
  💰 Challenge #2: The impostor employees
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The problem
&lt;/h3&gt;

&lt;p&gt;Your HR database has a big issue—some employees have negative salaries! Find and fix these invalid entries.  &lt;/p&gt;

&lt;h3&gt;
  
  
  The solution
&lt;/h3&gt;

&lt;p&gt;A simple WHERE condition will catch them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;salary&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;salary&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why this matters
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ensures data consistency
&lt;/li&gt;
&lt;li&gt;Helps detect fraud or data entry mistakes
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 &lt;strong&gt;Bonus challenge:&lt;/strong&gt; Prevent this from happening again with a database constraint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="k"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="n"&gt;check_salary&lt;/span&gt; &lt;span class="k"&gt;CHECK&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;salary&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎵 Challenge #3: The playlist shuffle hack
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The problem
&lt;/h3&gt;

&lt;p&gt;You’re building a music app, and users want a random shuffle feature. But newly added songs should have a higher chance of appearing.  &lt;/p&gt;

&lt;h3&gt;
  
  
  The solution
&lt;/h3&gt;

&lt;p&gt;A weighted randomization query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;songs&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;RANDOM&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;CURRENT_DATE&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why this matters
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Makes song shuffling smarter
&lt;/li&gt;
&lt;li&gt;Introduces probability-based ranking
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 &lt;strong&gt;Bonus challenge:&lt;/strong&gt; Ensure no song appears twice in the same session.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;SQL is more than just queries—it’s about problem-solving.&lt;br&gt;&lt;br&gt;
By practicing real-world challenges, you’ll build skills that go beyond syntax.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Missing data?&lt;/strong&gt; Use JOINs smartly
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data validation?&lt;/strong&gt; Enforce constraints
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart sorting?&lt;/strong&gt; Use weighted ranking
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚀 Want to learn from real-world challenges? Check out &lt;strong&gt;&lt;a href="https://backendchallenges.com/?utm_source=blog&amp;amp;utm_medium=organic&amp;amp;utm_campaign=sql_challenges_post" rel="noopener noreferrer"&gt;Backend Challenges&lt;/a&gt;&lt;/strong&gt; and start building today!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>architecture</category>
      <category>database</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>AI for software Engineers: Advanced RAG cheat sheet</title>
      <dc:creator>Paramanantham Harrison</dc:creator>
      <pubDate>Fri, 07 Jun 2024 11:35:06 +0000</pubDate>
      <link>https://dev.to/learnwithparam/ai-for-software-engineers-advanced-rag-cheat-sheet-2kac</link>
      <guid>https://dev.to/learnwithparam/ai-for-software-engineers-advanced-rag-cheat-sheet-2kac</guid>
      <description>&lt;p&gt;I am starting a series to share what I learn. Today, I learned some advanced RAG architecture, here it is&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3e9xku09smsxy1fonyo3.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%2F3e9xku09smsxy1fonyo3.png" alt=" " width="800" height="1073"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source of the cheatsheet: &lt;a href="https://medium.com/llamaindex-blog/a-cheat-sheet-and-some-recipes-for-building-advanced-rag-803a9d94c41b" rel="noopener noreferrer"&gt;https://medium.com/llamaindex-blog/a-cheat-sheet-and-some-recipes-for-building-advanced-rag-803a9d94c41b&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>architecture</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Released a visual guide to functional programming in JS</title>
      <dc:creator>Paramanantham Harrison</dc:creator>
      <pubDate>Tue, 06 Feb 2024 20:30:02 +0000</pubDate>
      <link>https://dev.to/learnwithparam/released-a-visual-guide-to-functional-programming-in-js-2j3b</link>
      <guid>https://dev.to/learnwithparam/released-a-visual-guide-to-functional-programming-in-js-2j3b</guid>
      <description>&lt;p&gt;Are you interested to learn the benefits of functional programming in javaScript without going into tutorial hell, please check out &lt;a href="https://www.learnwithparam.com/resources/ebooks" rel="noopener noreferrer"&gt;my ebook (free)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It is visual and it helps to learn these concepts,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pure Functions&lt;/li&gt;
&lt;li&gt;Immutability&lt;/li&gt;
&lt;li&gt;First-Class and Higher-Order Functions&lt;/li&gt;
&lt;li&gt;Function Composition&lt;/li&gt;
&lt;li&gt;Recursion&lt;/li&gt;
&lt;li&gt;Lazy Evaluation&lt;/li&gt;
&lt;li&gt;Pattern Matching&lt;/li&gt;
&lt;li&gt;Monads&lt;/li&gt;
&lt;li&gt;Currying&lt;/li&gt;
&lt;li&gt;Referential Transparency&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
