<?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: Sam Farahmand</title>
    <description>The latest articles on DEV Community by Sam Farahmand (@samfrmd).</description>
    <link>https://dev.to/samfrmd</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%2F1134839%2Fbe9ed9cd-27d0-47f0-82a4-59f3eb231845.png</url>
      <title>DEV Community: Sam Farahmand</title>
      <link>https://dev.to/samfrmd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/samfrmd"/>
    <language>en</language>
    <item>
      <title>Docker Is Not Dead (Stop Writing That Headline)</title>
      <dc:creator>Sam Farahmand</dc:creator>
      <pubDate>Wed, 10 Sep 2025 18:21:02 +0000</pubDate>
      <link>https://dev.to/samfrmd/docker-is-not-dead-stop-writing-that-headline-4pp8</link>
      <guid>https://dev.to/samfrmd/docker-is-not-dead-stop-writing-that-headline-4pp8</guid>
      <description>&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%2Fx0kxx5zo8y7vu1p4oenh.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%2Fx0kxx5zo8y7vu1p4oenh.png" alt="Docker is not Dead!" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every few months, someone posts a hot take: "Docker is dead. Time to move on."&lt;br&gt;
Nope. Not dead. Not even close. Docker is alive, drinking coffee, and still running your local stack while you type your LinkedIn rants.&lt;br&gt;
Why the drama? Because Kubernetes removed its &lt;code&gt;dockershim&lt;/code&gt; back in v1.24 and standardized on containerd/CRI-O. That broke… absolutely nothing for your Docker-built images. They're still OCI images, they still run everywhere. The only thing that died was a shim.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the haters say
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Daemon Thing&lt;/strong&gt;. Docker runs a root-level daemon (dockerd). If you hand someone access to docker.sock, you basically gave them root. Rootless mode exists but isn't universal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes dropped &lt;code&gt;dockershim&lt;/code&gt;&lt;/strong&gt;. True - but it just switched runtimes. Your images still run fine.
Licensing &amp;amp; Money. Docker Desktop is free for small teams, paid for bigger ones. Finance noticed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pull Limits&lt;/strong&gt;. In 2025, Docker Hub tightened free pulls. Paid users now get unlimited pulls (fair use). CI pipelines had to authenticate or mirror.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shady Images&lt;/strong&gt;. Public Hub images sometimes contain junk or even malware. If you docker pull randomstuff123, that's on you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alternatives exist&lt;/strong&gt;. Podman, nerdctl, and containerd are legit. Especially if you hate daemons or subscriptions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fair complaints. Still not a funeral.&lt;/p&gt;




&lt;h2&gt;
  
  
  What actually happened
&lt;/h2&gt;

&lt;p&gt;Kubernetes standardized; Docker specialized.&lt;br&gt;
K8s stopped babysitting Docker, and Docker leaned harder into dev workflows.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Builds:&lt;/strong&gt; BuildKit + Buildx are now default. Faster builds, smarter caching, multi-arch without crying.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compose:&lt;/strong&gt; &lt;code&gt;docker compose up&lt;/code&gt; is still the fastest way to stand up a stack locally. Now with Compose Bridge, you can even spit out Kubernetes manifests when you're ready to promote.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content &amp;amp; security:&lt;/strong&gt; Verified Publishers, Official Images, and Docker Scout help you dodge shady pulls. And yes - Docker is retiring Docker Content Trust (DCT) for Official Images, moving toward Sigstore/Notation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardening:&lt;/strong&gt; Docker Engine 28 flipped defaults: unpublished ports are no longer reachable from your LAN. Secure by default, fewer surprises.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New domains:&lt;/strong&gt; Docker's 2025 push into AI/agent apps with GenAI Stack and Compose patterns. Dead platforms don't ship new features every quarter.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Docker still matters in 2025
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local Dev Experience.&lt;/strong&gt; Still the easiest way to go repo -&amp;gt; running app on macOS, Windows, Linux. (Yes, Desktop runs in a VM on macOS/Windows, but performance keeps improving with VirtioFS and Synced Shares.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build Once, Run Anywhere.&lt;/strong&gt; Docker-built OCI images run fine on containerd, CRI-O, Podman. That's the whole point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ecosystem Gravity.&lt;/strong&gt; Testcontainers, dev containers, endless tutorials - most expect a Docker-API–compatible runtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It Just Works.&lt;/strong&gt; Sure, you could handcraft containerd configs. But do you really want to?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Practical advice
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use Docker for &lt;strong&gt;dev and builds&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Run &lt;strong&gt;containerd/CRI-O in Kubernetes.&lt;/strong&gt; Your images won't care.&lt;/li&gt;
&lt;li&gt;Harden the basics: rootless mode, non-root containers, scans, digest pinning, trusted registries.&lt;/li&gt;
&lt;li&gt;If Hub limits hurt: authenticate, mirror, or pay (paid = unlimited pulls).&lt;/li&gt;
&lt;li&gt;Plan ahead: DCT is being retired -&amp;gt; move to Sigstore/Cosign/Notation.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The punchline
&lt;/h2&gt;

&lt;p&gt;Docker isn't dead. It just grew up.&lt;br&gt;
Kubernetes standardized runtimes; Docker doubled down on being the default developer platform: builds, Compose, trusted content, security, even AI workloads.&lt;/p&gt;

&lt;p&gt;You can grumble about daemons or Desktop pricing, but here's the truth: &lt;strong&gt;Docker remains the fastest, friendliest way to get real work done - and the images it produces run everywhere that matters.&lt;/strong&gt;&lt;br&gt;
So next time you see "Docker is Dead", just reply with the obvious:&lt;br&gt;
&lt;strong&gt; "Nah, it's still alive. And it just built my app in 3 seconds flat."&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>kubernetes</category>
      <category>container</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Finally: A 15-Second Fix for Local Referrer &amp; Attribution Testing</title>
      <dc:creator>Sam Farahmand</dc:creator>
      <pubDate>Fri, 05 Sep 2025 15:56:16 +0000</pubDate>
      <link>https://dev.to/samfrmd/finally-a-15-second-fix-for-local-referrer-attribution-testing-b8d</link>
      <guid>https://dev.to/samfrmd/finally-a-15-second-fix-for-local-referrer-attribution-testing-b8d</guid>
      <description>&lt;p&gt;Preview attribution flows before production - works with Adobe, GA4, Target, and Piano.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here's the problem:&lt;/strong&gt; you can't preview referrer-driven locally. Browsers don't send a real &lt;code&gt;Referer&lt;/code&gt; or fill &lt;code&gt;document.referrer&lt;/code&gt; the way they do in production. That leaves Growth, Marketing, Analytics, Experimentation, and QA teams flying blind until things are live-when dashboards suddenly scream "Direct/None" and someone inevitably asks if Adobe is broken. Fun (it's not, this time).&lt;/p&gt;

&lt;p&gt;The fix is surprisingly simple (Which is ironic, because the browser is basically running an obstacle course behind the scenes). All you have to do is act like the referrer for a moment over HTTPS, then jump straight into your app. The browser sets a real referrer - no extensions, no flags, no staring at a waterfall of requests in the network tab while your coffee gets cold.&lt;br&gt;
And it works everywhere: Adobe Analytics/Experience Cloud, Adobe Target, Piano, GA4 - any tool that makes you argue about attribution.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why it fails locally
&lt;/h2&gt;

&lt;p&gt;Browsers are picky. Open a link from your terminal and hit a top-level 302? Some drop &lt;code&gt;document.referrer&lt;/code&gt;. Serve your app without a "real" HTTPS origin? Same result. Local ≠ production, which is why pre-launch checks for campaigns, partners, and paywalls feel like guesswork - or weather forecasting.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We don't need to fight the browser; we can play by its rules for five minutes: look like the referrer, then redirect.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Meet Reflex (the Fix)
&lt;/h2&gt;

&lt;p&gt;To make that easier, I built a tiny helper called Reflex. It's a simple CLI that handles the annoying setup for you so you can test referrer-driven flows locally without wrestling with configs or browser quirks.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Reflex does
&lt;/h2&gt;

&lt;p&gt;Point the referrer host (e.g., news.google.com) at your machine for a moment.&lt;br&gt;
Serve a tiny HTTPS page using a locally trusted certificate.&lt;br&gt;
Redirect into your app so the browser sets a real &lt;code&gt;Referer&lt;/code&gt; and &lt;code&gt;document.referrer&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can do this with a small CLI, &lt;code&gt;reflex&lt;/code&gt;. It updates your hosts file with a tagged entry, spins up HTTPS, and opens your browser in private mode so each run is clean. Push button, receive referrer.&lt;/p&gt;


&lt;h2&gt;
  
  
  15-Second Setup
&lt;/h2&gt;

&lt;p&gt;One-time setup: share the same local CA between root and your user so browsers trust the certs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Assume you already installed mkcert

sudo mkcert -install
mkcert -install

# required in Linux
sudo mkdir -p /etc/mkcert
sudo cp -a "$(mkcert -CAROOT)/." /etc/mkcert/
sudo chmod 755 /etc/mkcert &amp;amp;&amp;amp; sudo chmod 644 /etc/mkcert/*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run a flow using reflex (deep breath, two commands):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo reflex run \
  --referrer https://news.google.com \
  --target   https://your-app.example
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What happens:&lt;/strong&gt; it opens a private window (will do his best), serves a tiny HTTPS "referrer" page, and sends you to your app with a real &lt;code&gt;Referer&lt;/code&gt; - so tags, SDKs, and experiments act like the real world.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cleanup (It does it on exit though):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo reflex cleanup --referrer news.google.com

# OR if you are too lazy (just like me 😅)

sudo reflex cleanup --all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Pick your redirect
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;meta&lt;/code&gt; (default): the reliable workhorse. Short HTML meta refresh - best bet for a stable &lt;code&gt;document.referrer&lt;/code&gt;.&lt;br&gt;
&lt;code&gt;js&lt;/code&gt;: same idea, different flavor. Quick &lt;code&gt;window.location&lt;/code&gt; after a beat.&lt;br&gt;
&lt;code&gt;302&lt;/code&gt;: the spicy one. Great for testing 302 behavior, but some browsers drop &lt;code&gt;document.referrer&lt;/code&gt; on top-level 302s opened externally. Choose with care.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who benefits (and how)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Growth/Marketing:&lt;/strong&gt; confirm attribution before launch so dashboards don't go "Direct/None".&lt;br&gt;
&lt;strong&gt;Analytics/Tagging:&lt;/strong&gt; validate Adobe Analytics/Experience, Piano, GA4 events with correct referrer and UTM context.&lt;br&gt;
&lt;strong&gt;Experimentation:&lt;/strong&gt; verify A/B targeting rules (Adobe Target, Piano) actually trigger.&lt;br&gt;
&lt;strong&gt;QA/E2E:&lt;/strong&gt; write stable tests for referrer-sensitive flows without staging contortions.&lt;br&gt;
&lt;strong&gt;Data/BI:&lt;/strong&gt; reduce "mystery traffic" and post-deploy fire drills.&lt;/p&gt;




&lt;h2&gt;
  
  
  Gotchas (quick fixes)
&lt;/h2&gt;

&lt;p&gt;Need the full referrer URL, not just origin? Add &lt;code&gt;--referrer-policy unsafe-url&lt;/code&gt;.&lt;br&gt;
Corporate VPN/DNS agents can override &lt;code&gt;/etc/hosts&lt;/code&gt;. If it seems ignored, that's the culprit. Thanks, security.&lt;br&gt;
Private/incognito keeps runs clean and reduces "why does this only happen on my machine?" moments.&lt;br&gt;
Requires admin rights (hosts + binding to 443). If 443 is busy, &lt;code&gt;reflex&lt;/code&gt; falls back to 8443.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;This is the missing local preview: see how your site behaves under a specific referrer before you ship. Emulate the referrer, redirect once, and your browser plays by real-world rules. Your analytics tools (Adobe Analytics/Experience, Piano, GA4, etc.) get proper context, experiments behave, and your team gets their evening back (maybe the weekend, too).&lt;/p&gt;

&lt;p&gt;If you want the CLI that does this, it's &lt;code&gt;reflex&lt;/code&gt;. Use it, tweak it, or copy the idea - the key is giving your browser the polite intro it expects.&lt;br&gt;
Source and Binary on Github: &lt;a href="https://github.com/samfrm/reflex" rel="noopener noreferrer"&gt;https://github.com/samfrm/reflex&lt;/a&gt;&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>webdev</category>
      <category>browser</category>
    </item>
    <item>
      <title>Python vs PHP vs Go vs Node.js: Which Backend Should You Pick in 2025?</title>
      <dc:creator>Sam Farahmand</dc:creator>
      <pubDate>Tue, 02 Sep 2025 22:11:10 +0000</pubDate>
      <link>https://dev.to/samfrmd/python-vs-php-vs-go-vs-nodejs-which-backend-should-you-pick-in-2025-j2f</link>
      <guid>https://dev.to/samfrmd/python-vs-php-vs-go-vs-nodejs-which-backend-should-you-pick-in-2025-j2f</guid>
      <description>&lt;h3&gt;
  
  
  After building and shipping with Python, PHP, Go, and Node.js, here’s a field-tested breakdown of when each one actually makes sense in 2025.
&lt;/h3&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why I wrote this post?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
With the rise of #vibecoding, a lot of friends and teammates are spinning up side projects, prototypes, and MVPs.&lt;br&gt;&lt;br&gt;
The recurring question I get is: &lt;em&gt;“Which backend language should I use to move fast without boxing myself in later?”&lt;/em&gt;&lt;br&gt;&lt;br&gt;
AI can give generic answers; this post is my field-notes version after shipping with &lt;strong&gt;Python&lt;/strong&gt;, &lt;strong&gt;PHP&lt;/strong&gt;, &lt;strong&gt;Go&lt;/strong&gt;, and &lt;strong&gt;Node.js&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Backend Languages for Prototyping (2025 Edition)
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Quick Comparison Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criteria&lt;/th&gt;
&lt;th&gt;Python&lt;/th&gt;
&lt;th&gt;PHP&lt;/th&gt;
&lt;th&gt;Go (Golang)&lt;/th&gt;
&lt;th&gt;Node.js (JavaScript)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;Medium (interpreted)&lt;/td&gt;
&lt;td&gt;Medium (improved since PHP 8)&lt;/td&gt;
&lt;td&gt;High (compiled)&lt;/td&gt;
&lt;td&gt;High (generally below Go in throughput)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning curve&lt;/td&gt;
&lt;td&gt;Very easy&lt;/td&gt;
&lt;td&gt;Easy&lt;/td&gt;
&lt;td&gt;Moderate (static typing)&lt;/td&gt;
&lt;td&gt;Moderate (JS quirks, tooling choices)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concurrency model&lt;/td&gt;
&lt;td&gt;Threads/async; GIL caveats&lt;/td&gt;
&lt;td&gt;Request-per-process; async libs exist&lt;/td&gt;
&lt;td&gt;Goroutines + channels&lt;/td&gt;
&lt;td&gt;Event loop (async, non-blocking)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Community maturity&lt;/td&gt;
&lt;td&gt;Large and stable&lt;/td&gt;
&lt;td&gt;Large (CMS/eCommerce heavy)&lt;/td&gt;
&lt;td&gt;Mature, infra-focused&lt;/td&gt;
&lt;td&gt;Large and very active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Popular frameworks&lt;/td&gt;
&lt;td&gt;Django, FastAPI, Flask&lt;/td&gt;
&lt;td&gt;Laravel, Symfony, WordPress&lt;/td&gt;
&lt;td&gt;Gin, Fiber, gRPC&lt;/td&gt;
&lt;td&gt;Express, NestJS, Next.js (API routes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best fit&lt;/td&gt;
&lt;td&gt;APIs, data/ML services, prototypes&lt;/td&gt;
&lt;td&gt;CMS, content sites, SMB e-commerce&lt;/td&gt;
&lt;td&gt;Microservices, infra, APIs&lt;/td&gt;
&lt;td&gt;Real-time apps, full-stack JS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalability&lt;/td&gt;
&lt;td&gt;Moderate (infra dependent)&lt;/td&gt;
&lt;td&gt;Low–Moderate (great for CMS)&lt;/td&gt;
&lt;td&gt;High (great for microservices)&lt;/td&gt;
&lt;td&gt;High (scale via clustering/workers)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment ease&lt;/td&gt;
&lt;td&gt;Solid for containers/serverless&lt;/td&gt;
&lt;td&gt;Easiest on shared hosting&lt;/td&gt;
&lt;td&gt;Excellent (single static binary)&lt;/td&gt;
&lt;td&gt;Solid for serverless &amp;amp; JS-centric stacks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  2025 Ecosystem Trends
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;Trend (2025)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Steady (strong)&lt;/td&gt;
&lt;td&gt;ML/AI + modern API stacks keep it relevant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;Declining (new apps)&lt;/td&gt;
&lt;td&gt;Still dominant for CMS and existing stacks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;Rising (cloud/infra)&lt;/td&gt;
&lt;td&gt;Microservices &amp;amp; infra teams keep adopting it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;Steady (JS default)&lt;/td&gt;
&lt;td&gt;Real-time + full-stack JS; Bun/Deno are interesting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Python: the “get-it-done” toolkit
&lt;/h2&gt;

&lt;p&gt;Python remains the fastest way I know to stand up an API that talks to a model, a database, or a notebook. The ecosystem around FastAPI (type hints + Pydantic) and Django (batteries included) is hard to beat for developer velocity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I reach for it&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean, readable code; fast time-to-first-endpoint&lt;/li&gt;
&lt;li&gt;Libraries everywhere (data/ML, ORMs, auth, queues)&lt;/li&gt;
&lt;li&gt;Great DX for schema validation (Pydantic) and docs (OpenAPI out of the box with FastAPI)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tradeoffs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Throughput is lower than Go (even with uvicorn + gunicorn)&lt;/li&gt;
&lt;li&gt;Concurrency always needs thought (GIL; pick async stacks deliberately)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gotchas I’ve hit&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Environments: use &lt;code&gt;uv&lt;/code&gt;/&lt;code&gt;poetry&lt;/code&gt; or containers early to avoid “works on my machine”&lt;/li&gt;
&lt;li&gt;Async mixed with sync libraries can silently block your event loop&lt;/li&gt;
&lt;li&gt;NumPy/PyTorch dependencies can bloat Docker images—multi-stage builds help&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tiny example (FastAPI)&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello from Python backend!"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h2&gt;
  
  
  PHP: the pragmatic workhorse (especially for CMS)
&lt;/h2&gt;

&lt;p&gt;If your problem looks like “publish content quickly and manage it well,” PHP is still the shortest path to value. Laravel is a genuinely pleasant modern framework; WordPress still powers a huge chunk of the web.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I reach for it&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instant hosting almost anywhere; frictionless deploys&lt;/li&gt;
&lt;li&gt;Laravel’s DX (migrations, queues, mail, auth) is underrated&lt;/li&gt;
&lt;li&gt;WordPress for content sites when time-to-market wins&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tradeoffs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Less mindshare for brand-new, API-first apps&lt;/li&gt;
&lt;li&gt;Legacy code and plugin ecosystems can be messy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gotchas I’ve hit&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mixing bespoke code with heavy WordPress plugins complicates upgrades&lt;/li&gt;
&lt;li&gt;Async/concurrency exists (Swoole/ReactPHP) but is niche—plan for classic request/response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tiny example&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php
echo "Hello from PHP backend!";
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h2&gt;
  
  
  Go: performance, simplicity, and easy ops
&lt;/h2&gt;

&lt;p&gt;Go shines when you need predictable performance and simple operations. Small static binaries, fast startup, and a standard library that covers the basics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I reach for it&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Concurrency is first-class (goroutines, channels)&lt;/li&gt;
&lt;li&gt;One binary, fast startup → ideal for containers, CLIs, microservices&lt;/li&gt;
&lt;li&gt;Straightforward standard library; great for infra/service glue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tradeoffs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More boilerplate than Python/JS; fewer batteries included&lt;/li&gt;
&lt;li&gt;Generics exist but are intentionally conservative&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gotchas I’ve hit&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Error handling is explicit; build helpers, don’t fight it&lt;/li&gt;
&lt;li&gt;JSON + &lt;code&gt;omitempty&lt;/code&gt; + pointers vs values can surprise newcomers&lt;/li&gt;
&lt;li&gt;Migrations: pick one tool early (e.g., &lt;code&gt;golang-migrate&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tiny example&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello from Go backend!")
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h2&gt;
  
  
  Node.js: real-time and one-language everywhere
&lt;/h2&gt;

&lt;p&gt;Node.js is still the default for teams that want to stay in JavaScript end-to-end and ship real-time features quickly. The ecosystem is gigantic and modern frameworks have strong opinions (which can be a blessing).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I reach for it&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time (WebSockets) and streaming are first-class&lt;/li&gt;
&lt;li&gt;One language across frontend/backend reduces cognitive load&lt;/li&gt;
&lt;li&gt;Next.js/NestJS provide structure without too much ceremony&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tradeoffs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Historically messy ESM/CJS module story (better now, still a footgun)&lt;/li&gt;
&lt;li&gt;Raw throughput trails Go in many benchmarks; scale horizontally early&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gotchas I’ve hit&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Package churn: pin versions and use lockfiles religiously&lt;/li&gt;
&lt;li&gt;Long tasks can block the event loop—move them to workers/queues&lt;/li&gt;
&lt;li&gt;Serverless cold starts vary by provider/runtime—measure, don’t assume&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tiny example (Express)&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const express = require('express');
const app = express();

app.get('/', (_req, res) =&amp;gt; res.send('Hello from Node.js backend!'));

app.listen(3000, () =&amp;gt; console.log('Server running on :3000'));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h2&gt;
  
  
  When to use what (pragmatic picks)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;My default choice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Need an API this week, minimal ceremony&lt;/td&gt;
&lt;td&gt;Python (FastAPI)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content-heavy site, editors need to move fast&lt;/td&gt;
&lt;td&gt;PHP (WordPress/Laravel)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance-critical service or many small services&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-time features or full-stack JS team&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heavy ML/data integration&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Existing WordPress ecosystem to extend&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Deployment notes that actually matter
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python&lt;/strong&gt;: Use uvicorn/gunicorn behind a reverse proxy. For serverless, keep dependencies lean; pydantic/NumPy can impact cold start.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PHP&lt;/strong&gt;: Dead-simple on shared hosting; for Laravel, run queues/schedulers as services and cache your config/routes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go&lt;/strong&gt;: Multi-stage Docker builds produce tiny images; health checks + readiness probes make rollouts painless.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt;: Use a process manager (PM2) or containers. Offload CPU-heavy work to worker threads or a queue. Measure event-loop lag.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Picking a backend language is less about hype and more about &lt;strong&gt;fit for your team, your problem, and your runway&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If I’m building an &lt;strong&gt;MVP API or anything ML-adjacent&lt;/strong&gt;, I start with &lt;strong&gt;Python (FastAPI)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If I need &lt;strong&gt;real-time features&lt;/strong&gt; or my team is &lt;strong&gt;JS-native&lt;/strong&gt;, I go &lt;strong&gt;Node.js&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If I’m building &lt;strong&gt;small, fast services&lt;/strong&gt; that I’ll operate for a while, I pick &lt;strong&gt;Go&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If the project is &lt;strong&gt;content-first&lt;/strong&gt; (marketing site, editorial workflows, SMB e-commerce), &lt;strong&gt;PHP&lt;/strong&gt; still ships fastest.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Architecture, testing, and deployment discipline will move the needle more than the language. Choose the stack your team can actually maintain, and optimize for feedback cycles.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;What are you shipping with this year, and why? I’m especially curious about teams moving from Node → Go for specific services, or from Python → Node for real-time features. Let me know in the comments.&lt;/p&gt;

</description>
      <category>backend</category>
      <category>vibecoding</category>
      <category>python</category>
      <category>node</category>
    </item>
  </channel>
</rss>
