- Architecture Nugget
- Posts
- Let’s Talk Money: What Engineers Are Actually Making
Let’s Talk Money: What Engineers Are Actually Making
Engineers salary transparency, Troubleshooting Hetzner, and Making Sense of JavaScript’s Event Loop
5 Awesome Docker Tools To Make Your Life Easier — A brief intro to Lazy Docker, Sliplane, Dive, Orbstack and Watchtower
Lazy: A terminal UI for both docker and docker-compose
sliplane: A hosting platform that makes deploying Docker containers super simple
Dive: A tool for exploring each layer in a docker image
Orbstack: fast, light, and easy way to run Docker containers and Linux
Watchtower: A process for automating Docker container base image updates.
How to Simplify Your Git Commands with Git Aliases — If you enjoy having some custom commands for your git workflow, aliases are for you.
Let’s Talk Money: What Engineers Are Actually Making
I’m on the fence about salary transparency. I have seen some questionable researches suggest it can backfire, making people feel worse or even hurting their earnings by 2%. Others say it helps employees negotiate better deals. So, who knows?
That said, I really respect the engineers who openly share their salaries. Having real numbers—not just vague industry averages—makes it easier to understand how the market actually looks and what to expect. So, here are some publicly shared salary updates from engineers. Hopefully, this gives a better sense of how compensation stacks up.
Blog | Country | Company | Position | Share | Salary |
---|---|---|---|---|---|
UK (Remote) | Self-Employeed | Director and Consultant, Cloud native and Kubernetes | N/A | 220,000-250,000 (£) | |
UK (Remote) | Elastic | Senior Software Engineer | $90,000 | £101,400 | |
UK | Monzo | Senior Software Engineer I | 5552 shares | £104,820 | |
UK | Bumble | Senior Backend Engineer | N/A | £110,000 | |
Canada (Remote) | Shopify | Senior Software Engineer | N/A | 240,900 CAD |

Deep Dive
Ubicloud provides cloud services on bare metal providers such as Hetzner or AWS Bare Metal. Recently, they faced an issue with the new Hetzner server generation—AX162—which had a 16 times higher crash rate than the AX161.
In this post, Burak explains their approach to debugging the issue, which is well worth a read, particularly if you manage a bare metal system.
AFR (Annualized Failure Rate) is a common way to measure hardware reliability. It estimates how likely a device or component is to fail within a year and is measured as follows:

Model | Failures | Days in Service | AFR (%) |
---|---|---|---|
AX161 | 11 | 3,784 | 1.06 |
AX162 | 34 | 737 | 16.84 |
In summary, here is the problem solving approach they took:
Monitor system load – Were the new servers overloaded?
Check temperatures (via
sensors
) – Overheating problem?Inspect hardware (
lshw
,dmidecode
) – Manufacturing defect?Measure power consumption (
powerstat
) – Were they getting enough power?
The outcome? The actual power consumption was significantly lower than the advertised maximum — Hetzner might be capping power usage.
Power, rather than space, often limits data center expansion. To increase the number of machines under power constraints, data center operators usually cap power use per machine.
Find out why 1M+ professionals read Superhuman AI daily.
AI won't take over the world. People who know how to use AI will.
Here's how to stay ahead with AI:
Sign up for Superhuman AI. The AI newsletter read by 1M+ pros.
Master AI tools, tutorials, and news in just 3 minutes a day.
Become 10X more productive using AI.
JavaScript can only do one thing at a time since it’s single-threaded. But it still handles multiple tasks smoothly thanks to the event loop.
Here’s how it works: When JavaScript needs to run something that takes time—like a network request—it hands it off to the browser. Once that task is done, the browser puts the result in a queue, waiting for JavaScript to pick it up.
There are two queues: one for microtasks and one for regular tasks. Microtasks always run first. These mostly come from promises and async/await
. Regular tasks, like setTimeout callbacks, wait their turn. After every task, JavaScript checks for any leftover microtasks before moving on.
That’s why promises seem to resolve before timeouts, even if the timeout has already hit zero!
How did you like this edition?Or just hit reply and share your thoughts with me! Nothing beats making new friends :) |
Reply