<?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: Kushagra </title>
    <description>The latest articles on Forem by Kushagra  (@urkushagra).</description>
    <link>https://forem.com/urkushagra</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%2F3715696%2F1f12dd24-c7de-41fe-98e7-e4dd815e3c2e.jpeg</url>
      <title>Forem: Kushagra </title>
      <link>https://forem.com/urkushagra</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/urkushagra"/>
    <language>en</language>
    <item>
      <title>Do we really need a full virtual machine… just to use Linux?</title>
      <dc:creator>Kushagra </dc:creator>
      <pubDate>Mon, 13 Apr 2026 18:28:39 +0000</pubDate>
      <link>https://forem.com/urkushagra/do-we-really-need-a-full-virtual-machine-just-to-use-linux-2kfl</link>
      <guid>https://forem.com/urkushagra/do-we-really-need-a-full-virtual-machine-just-to-use-linux-2kfl</guid>
      <description>&lt;p&gt;For a long time, I followed the usual setup for my development environment:&lt;br&gt;
Install a VM → set up a Linux distro → allocate resources → wait for it to boot → start working.&lt;br&gt;
It worked.&lt;br&gt;
But it always felt like I was adding friction before even writing my first line of code.&lt;br&gt;
Over the past few years of building personal projects, I’ve started paying more attention to how I work not just what I build.&lt;br&gt;
That’s when I explored WSL (Windows Subsystem for Linux).&lt;br&gt;
And honestly, I moved away from virtual machines.&lt;br&gt;
Not because they’re wrong but because they didn’t fit the kind of workflow I was trying to build.&lt;br&gt;
With WSL, everything feels more integrated:&lt;br&gt;
• Linux commands running alongside Windows tools&lt;br&gt;
• Same files accessible across both environments without duplication&lt;br&gt;
• Seamless VS Code integration that actually feels native&lt;br&gt;
• Near-instant startup, no waiting for environments to boot&lt;br&gt;
• Much lower resource usage compared to running a full OS&lt;br&gt;
But the biggest shift wasn’t technical.&lt;br&gt;
I stopped switching between environments… and started working in one continuous flow.&lt;br&gt;
For someone building backend projects, experimenting with cloud tools, and refining workflows, this small change made a real difference.&lt;br&gt;
One thing I’m learning along the way:&lt;br&gt;
Better development isn’t just about better tools.&lt;br&gt;
It’s about removing unnecessary complexity.&lt;br&gt;
Still building. Still refining. Still learning.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>microsoft</category>
      <category>productivity</category>
      <category>tooling</category>
    </item>
    <item>
      <title>🚨 Why Most Student Backend Projects Fail in Production</title>
      <dc:creator>Kushagra </dc:creator>
      <pubDate>Sat, 14 Feb 2026 16:55:28 +0000</pubDate>
      <link>https://forem.com/urkushagra/why-most-student-backend-projects-fail-in-production-15ne</link>
      <guid>https://forem.com/urkushagra/why-most-student-backend-projects-fail-in-production-15ne</guid>
      <description>&lt;h1&gt;
  
  
  🚨 Why Most Student Backend Projects Fail in Production
&lt;/h1&gt;

&lt;p&gt;I used to think my backend projects were solid.&lt;/p&gt;

&lt;p&gt;The APIs worked.&lt;br&gt;&lt;br&gt;
The frontend connected.&lt;br&gt;&lt;br&gt;
The database stored data.&lt;br&gt;&lt;br&gt;
Everything ran perfectly on my laptop.&lt;/p&gt;

&lt;p&gt;Then I deployed one of them.&lt;/p&gt;

&lt;p&gt;And everything broke.&lt;/p&gt;

&lt;p&gt;That was the moment I realized something important:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A project that works locally is not the same as a project that survives in production.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This article isn’t a tutorial.&lt;/p&gt;

&lt;p&gt;It’s a reality check.&lt;/p&gt;




&lt;h2&gt;
  
  
  💥 The Illusion of “It Works on My Machine”
&lt;/h2&gt;

&lt;p&gt;As students, we focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Completing features
&lt;/li&gt;
&lt;li&gt;Submitting assignments
&lt;/li&gt;
&lt;li&gt;Making APIs respond
&lt;/li&gt;
&lt;li&gt;Passing test cases
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We rarely think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security
&lt;/li&gt;
&lt;li&gt;Scalability
&lt;/li&gt;
&lt;li&gt;Observability
&lt;/li&gt;
&lt;li&gt;Abuse protection
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because locally, nothing attacks your server.&lt;/p&gt;

&lt;p&gt;Production is different.&lt;/p&gt;

&lt;p&gt;Production is hostile.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔐 1. Hardcoded Secrets — My First Big Mistake
&lt;/h2&gt;

&lt;p&gt;In one of my early projects, my database password looked like this:&lt;/p&gt;

&lt;p&gt;properties&lt;br&gt;
spring.datasource.password=admin123&lt;/p&gt;

&lt;p&gt;It worked.&lt;/p&gt;

&lt;p&gt;Until I pushed the code to GitHub.&lt;/p&gt;

&lt;p&gt;That’s when I realized:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anyone could see it.
&lt;/li&gt;
&lt;li&gt;If deployed publicly, attackers could use it.
&lt;/li&gt;
&lt;li&gt;Secrets in code are permanent once committed.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hardcoded secrets are not just bad practice — they are a liability.&lt;/p&gt;

&lt;p&gt;In production, secrets belong in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Environment variables
&lt;/li&gt;
&lt;li&gt;Secret managers
&lt;/li&gt;
&lt;li&gt;Encrypted vaults
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not inside your repository.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌍 2. No Environment Variables
&lt;/h2&gt;

&lt;p&gt;Initially, my app was configured like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local database URL
&lt;/li&gt;
&lt;li&gt;Localhost ports
&lt;/li&gt;
&lt;li&gt;Fixed API keys
&lt;/li&gt;
&lt;li&gt;Static configuration
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When I deployed to the cloud:&lt;/p&gt;

&lt;p&gt;Everything failed.&lt;/p&gt;

&lt;p&gt;Because production environments are dynamic.&lt;/p&gt;

&lt;p&gt;Ports change.&lt;br&gt;&lt;br&gt;
IP addresses change.&lt;br&gt;&lt;br&gt;
Credentials change.  &lt;/p&gt;

&lt;p&gt;That’s when I understood:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Environment-based configuration is not optional — it’s foundational.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📜 3. No Logging = Blind Server
&lt;/h2&gt;

&lt;p&gt;The first time my deployed app crashed, I had no idea why.&lt;/p&gt;

&lt;p&gt;Because I had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No structured logs
&lt;/li&gt;
&lt;li&gt;No error logs
&lt;/li&gt;
&lt;li&gt;No request tracing
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Locally, you see stack traces instantly.&lt;/p&gt;

&lt;p&gt;In production?&lt;br&gt;&lt;br&gt;
You see silence.&lt;/p&gt;

&lt;p&gt;Logging is not debugging convenience.&lt;br&gt;&lt;br&gt;
It’s operational visibility.&lt;/p&gt;

&lt;p&gt;Without logs, your backend is blind.&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 4. No Monitoring = No Awareness
&lt;/h2&gt;

&lt;p&gt;Even worse than no logging?&lt;/p&gt;

&lt;p&gt;No monitoring.&lt;/p&gt;

&lt;p&gt;I didn’t know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU usage
&lt;/li&gt;
&lt;li&gt;Memory consumption
&lt;/li&gt;
&lt;li&gt;Response times
&lt;/li&gt;
&lt;li&gt;Error rates
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your server slows down or crashes — and you don’t know — that’s not engineering.&lt;/p&gt;

&lt;p&gt;That’s guessing.&lt;/p&gt;

&lt;p&gt;Production systems require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Metrics
&lt;/li&gt;
&lt;li&gt;Alerts
&lt;/li&gt;
&lt;li&gt;Health checks
&lt;/li&gt;
&lt;li&gt;Status endpoints
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because uptime matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚫 5. No Rate Limiting = Open Invitation to Abuse
&lt;/h2&gt;

&lt;p&gt;My APIs had no request limits.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;p&gt;Anyone could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spam requests
&lt;/li&gt;
&lt;li&gt;Overload the server
&lt;/li&gt;
&lt;li&gt;Launch brute-force attempts
&lt;/li&gt;
&lt;li&gt;Cause denial of service
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Locally? No issue.&lt;/p&gt;

&lt;p&gt;Publicly? Dangerous.&lt;/p&gt;

&lt;p&gt;Rate limiting protects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server resources
&lt;/li&gt;
&lt;li&gt;User accounts
&lt;/li&gt;
&lt;li&gt;API integrity
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without it, your backend is defenseless.&lt;/p&gt;




&lt;h2&gt;
  
  
  🐳 6. No Docker = Deployment Chaos
&lt;/h2&gt;

&lt;p&gt;At first, I deployed by manually installing dependencies.&lt;/p&gt;

&lt;p&gt;That led to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Version mismatches
&lt;/li&gt;
&lt;li&gt;Missing libraries
&lt;/li&gt;
&lt;li&gt;Different runtime environments
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It worked locally.&lt;br&gt;&lt;br&gt;
It failed remotely.&lt;/p&gt;

&lt;p&gt;Docker solved this by making the environment predictable.&lt;/p&gt;

&lt;p&gt;If your app depends on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Specific Java version
&lt;/li&gt;
&lt;li&gt;Specific OS libraries
&lt;/li&gt;
&lt;li&gt;Specific runtime settings
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then containerization is not luxury — it’s stability.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔒 7. No HTTPS = Insecure by Default
&lt;/h2&gt;

&lt;p&gt;One of my early deployments ran on plain HTTP.&lt;/p&gt;

&lt;p&gt;Which means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Credentials traveled unencrypted
&lt;/li&gt;
&lt;li&gt;Tokens could be intercepted
&lt;/li&gt;
&lt;li&gt;Data was exposed to packet sniffing
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Encryption is not optional in production.&lt;/p&gt;

&lt;p&gt;HTTPS is not a feature.&lt;br&gt;&lt;br&gt;
It’s a baseline requirement.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ 8. No Input Validation = Security Nightmare
&lt;/h2&gt;

&lt;p&gt;In early versions of my APIs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I trusted user input.
&lt;/li&gt;
&lt;li&gt;I didn’t validate payloads.
&lt;/li&gt;
&lt;li&gt;I didn’t sanitize fields.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That opens doors to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQL injection
&lt;/li&gt;
&lt;li&gt;Malformed data
&lt;/li&gt;
&lt;li&gt;Application crashes
&lt;/li&gt;
&lt;li&gt;Unexpected behavior
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Production systems assume:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;All input is malicious until validated.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧠 The Realization
&lt;/h2&gt;

&lt;p&gt;I thought backend development meant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing controllers
&lt;/li&gt;
&lt;li&gt;Connecting databases
&lt;/li&gt;
&lt;li&gt;Returning JSON responses
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now I understand backend development also means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Thinking about abuse
&lt;/li&gt;
&lt;li&gt;Designing for failure
&lt;/li&gt;
&lt;li&gt;Securing configurations
&lt;/li&gt;
&lt;li&gt;Planning for scale
&lt;/li&gt;
&lt;li&gt;Observing system health
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feature development is only half the job.&lt;/p&gt;

&lt;p&gt;Production thinking is the other half.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 What Changed After That
&lt;/h2&gt;

&lt;p&gt;Now when I build backend projects, I ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where are my secrets stored?
&lt;/li&gt;
&lt;li&gt;What happens if traffic spikes?
&lt;/li&gt;
&lt;li&gt;What if someone tries brute-force?
&lt;/li&gt;
&lt;li&gt;How will I debug this at 2 AM?
&lt;/li&gt;
&lt;li&gt;Can this scale beyond my laptop?
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That shift changed how I approach engineering.&lt;/p&gt;




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

&lt;p&gt;Most student backend projects fail in production not because they lack features.&lt;/p&gt;

&lt;p&gt;They fail because they lack production thinking.&lt;/p&gt;

&lt;p&gt;There’s a huge difference between:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“It works.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“It survives.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you're building backend systems, start thinking beyond localhost.&lt;/p&gt;

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

</description>
      <category>backenddevelopment</category>
      <category>springboot</category>
      <category>siliconvalley</category>
      <category>docker</category>
    </item>
  </channel>
</rss>
