<?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: Anderson Danilo de Souza</title>
    <description>The latest articles on DEV Community by Anderson Danilo de Souza (@andersondanilo).</description>
    <link>https://dev.to/andersondanilo</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2171712%2F95829925-1253-44b1-8b5a-abd1471b561d.png</url>
      <title>DEV Community: Anderson Danilo de Souza</title>
      <link>https://dev.to/andersondanilo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/andersondanilo"/>
    <language>en</language>
    <item>
      <title>Node.js vs Rust on Cloud Run: serving a 100 KB JSON from Redis</title>
      <dc:creator>Anderson Danilo de Souza</dc:creator>
      <pubDate>Wed, 14 Oct 2026 00:03:42 +0000</pubDate>
      <link>https://dev.to/andersondanilo/nodejs-vs-rust-on-cloud-run-serving-a-100-kb-json-from-redis-497m</link>
      <guid>https://dev.to/andersondanilo/nodejs-vs-rust-on-cloud-run-serving-a-100-kb-json-from-redis-497m</guid>
      <description>&lt;p&gt;Hi! In this post I compare Node.js and Rust on Google Cloud Run to see which one is faster.&lt;/p&gt;

&lt;p&gt;You could argue that most of a request's time is spent on I/O, so the language shouldn't matter much. That's a fair point, so I built the most I/O-bound service I could think of. Each API does exactly one thing: connect to Redis, read a string, and return it as JSON. The only I/O is the Redis call, and there is no other business logic.&lt;/p&gt;

&lt;p&gt;The payload is a random JSON document of exactly 100 KB (102,400 bytes). The size was an arbitrary choice: big enough to make serialization and network copies matter, small enough to be realistic.&lt;/p&gt;

&lt;p&gt;Everything is open source, so you can reproduce it: &lt;a href="https://github.com/andersondanilo/cloudrun-benchmark" rel="noopener noreferrer"&gt;andersondanilo/cloudrun-benchmark&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;Both APIs expose a single endpoint, &lt;code&gt;GET /data&lt;/code&gt;, which returns the JSON stored under one Redis key. Everything runs in the same region (São Paulo, &lt;code&gt;southamerica-east1&lt;/code&gt;), and the infrastructure is created with Pulumi.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Node.js service&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud Run, Node.js 22 (Alpine), Fastify 5, ioredis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rust service&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud Run, Rust, Poem 3 (tokio), redis-rs, distroless image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloud Run config (both)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1 vCPU, 512 MiB, exactly 1 instance (min = max = 1), concurrency 20, &lt;code&gt;southamerica-east1&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Redis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;e2-micro&lt;/code&gt; VM, Debian 12, &lt;code&gt;redis-server&lt;/code&gt; with password, &lt;code&gt;maxmemory 512mb&lt;/code&gt;, persistence off, same zone as the services, reached over its internal IP via Direct VPC egress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Load generator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;e2-micro&lt;/code&gt; VM, Debian 12, same zone, &lt;a href="https://github.com/wg/wrk" rel="noopener noreferrer"&gt;wrk&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;wrk parameters&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2 threads, 20 connections (matches the Cloud Run concurrency), 5 s warm-up, then a 30 s measured run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Payload&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Random JSON, exactly 102,400 bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Running a single instance per service keeps the comparison fair: both get the same CPU and memory, and neither can scale out to hide its limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Node.js (Fastify)&lt;/th&gt;
&lt;th&gt;Rust (Poem)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Requests/sec&lt;/td&gt;
&lt;td&gt;237.72&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;467.93&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transfer/sec&lt;/td&gt;
&lt;td&gt;23.26 MB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;45.79 MB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latency (avg)&lt;/td&gt;
&lt;td&gt;83.80 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;42.59 ms&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latency p50&lt;/td&gt;
&lt;td&gt;81.34 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;42.16 ms&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latency p90&lt;/td&gt;
&lt;td&gt;95.26 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;48.79 ms&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latency p99&lt;/td&gt;
&lt;td&gt;112.70 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;58.97 ms&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requests in 30 s&lt;/td&gt;
&lt;td&gt;7,139&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;14,051&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Rust reached &lt;strong&gt;about double the requests per second (1.97x)&lt;/strong&gt; with &lt;strong&gt;about half the latency&lt;/strong&gt; at every percentile. With a fixed number of connections the two numbers are linked: 20 connections at roughly 84 ms per request is about 238 requests per second, and 20 connections at roughly 43 ms is about 468.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;This is one test on one machine setup, so treat the numbers as a comparison between these two stacks, not as a universal verdict on Node.js vs Rust.&lt;/li&gt;
&lt;li&gt;Both VMs are &lt;code&gt;e2-micro&lt;/code&gt;, which is a shared-core machine type. The Redis VM or the load generator may be limiting the results, especially for Rust. I didn't test whether a bigger load generator or Redis VM pushes Rust further.&lt;/li&gt;
&lt;li&gt;Each service ran on a single Cloud Run instance with 1 vCPU. With more instances, both would scale out, and the gap per instance is what would matter for cost.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Even for a service that only reads a string from Redis and returns it, the runtime made a clear difference: Rust served twice the traffic at half the latency on the same Cloud Run configuration. My guess is that handling a 100 KB payload on every request (reading it from Redis and writing it to the socket) costs more CPU than it seems, but I didn't profile it, so that part is a hypothesis.&lt;/p&gt;

&lt;p&gt;If you want to run it yourself, the repo has everything: both APIs, the Pulumi infrastructure, and the benchmark script.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>node</category>
      <category>performance</category>
    </item>
    <item>
      <title>How I'm Getting Better at Estimating Tasks (with Pomodoros)</title>
      <dc:creator>Anderson Danilo de Souza</dc:creator>
      <pubDate>Sat, 10 Oct 2026 22:59:40 +0000</pubDate>
      <link>https://dev.to/andersondanilo/how-im-getting-better-at-estimating-tasks-with-pomodoros-fha</link>
      <guid>https://dev.to/andersondanilo/how-im-getting-better-at-estimating-tasks-with-pomodoros-fha</guid>
      <description>&lt;p&gt;Estimating how long a task will take is one of the hardest skills for a developer. We're usually too optimistic, and the gap between "this will take an hour" and reality only shows up when it's too late.&lt;/p&gt;

&lt;p&gt;Lately I've been trying a simple approach that's been working well for me: &lt;strong&gt;combining the Pomodoro Technique with task management.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The approach
&lt;/h2&gt;

&lt;p&gt;Every day I write my tasks down and estimate how many pomodoros each one will take, before I start.&lt;/p&gt;

&lt;p&gt;That small step changes a lot. To give a believable estimate, I'm forced to break big tasks into smaller ones. My rule of thumb is that &lt;strong&gt;a task should fit in about 4 pomodoros&lt;/strong&gt;, which is roughly 2 hours with the classic 25/5 setup. If it doesn't fit, it's not a task yet, it's a project, and I split it.&lt;/p&gt;

&lt;p&gt;Splitting tasks has a nice side effect: I often discover small subtasks I would have missed, and I can plan them properly instead of being surprised halfway through.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing the loop
&lt;/h2&gt;

&lt;p&gt;Estimating alone isn't enough. You improve by &lt;strong&gt;comparing your estimate with what actually happened.&lt;/strong&gt; When I finish a task, I look at how many pomodoros I planned versus how many I used. Over time, patterns show up: which kinds of tasks I underestimate, and which ones I overthink.&lt;/p&gt;

&lt;p&gt;The results so far have been encouraging. I'm hitting my estimates more often, and sometimes finishing faster than I expected. On top of that, I get the usual Pomodoro benefits: more focus, regular breaks, and less stress.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tool: Pomodoro Time Chamber
&lt;/h2&gt;

&lt;p&gt;I built a small app to support this workflow: &lt;strong&gt;Pomodoro Time Chamber&lt;/strong&gt;. The name comes from Dragon Ball's &lt;em&gt;Hyperbolic Time Chamber&lt;/em&gt;, a room where a year of training passes in a single day outside. I like to think this app helps you get more done in less time, and with more focus.&lt;/p&gt;

&lt;p&gt;It's a terminal app written in Rust. Some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Task list with estimates:&lt;/strong&gt; set the estimated pomodoros per task and track completed ones (e.g. &lt;code&gt;3/2&lt;/code&gt; when you go over)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lua plugins:&lt;/strong&gt; extend it the way you'd extend Neovim, by reacting to events like a pomodoro finishing or the current task changing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Neovim and tmux integration:&lt;/strong&gt; see the timer and current task in your statusline&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Presets:&lt;/strong&gt; keep separate task lists and configs, e.g. work and personal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Check it out on GitHub: &lt;a href="https://github.com/andersondanilo/pomodoro-time-chamber" rel="noopener noreferrer"&gt;https://github.com/andersondanilo/pomodoro-time-chamber&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;You don't need a special tool to start. Estimate before you begin, keep tasks small, and compare the estimate with reality afterwards. If you live in the terminal, though, give Pomodoro Time Chamber a try, and I'd love to hear how it works for you.&lt;/p&gt;

</description>
      <category>developer</category>
      <category>productivity</category>
      <category>softwaredevelopment</category>
    </item>
  </channel>
</rss>
