2017 / 616 pages
Designing Data-Intensive Applications
Martin Kleppmann
Why it's here
Replication, partitioning and consistency, explained from first principles. The trade-offs behind read replicas and an outbox.
I build the .NET backends that insurance and payments in Nepal run on, and keep them running in production. Right now that's a 50-project insurance platform and the portals its customers buy and claim through.
Or write to sthaejan00@gmail.com
Download the portfolio as a book(PDF)A simplified model of the platform: three replicas per service with autoscaling, Postgres read replicas, Redis, and RabbitMQ with an outbox and a saga. Tap a pod to kill it, or replay a transaction.
Projects
Eleven things I've built or run, from the insurance platform I look after at work to my own products.
Chapter 01 of 11A 50-project insurance platform
Deep dive4Swipe to turn the page
Six problems from the projects above, written the way I'd brief a new engineer. Open one to see what broke, what I changed and what it bought us.
new HttpClient() created on every call and left in TIME_WAIT. Replaced 397 call sites in 123 files with IHttpClientFactory named and typed clients, and gave every client the correlation-ID handler.Experience
BSc Computer Science and Information Technology
Vedas College, 2017 – 2022
Jan 2025 – presentnow
Himalayan Everest Insurance, Kathmandu, hybrid
Jul 2022 – Nov 2024
EKbana Solutions, Lalitpur, on-site
Jan 2022 – Jun 2022
NBIT, Lalitpur
Anatomy of an incident
A real production incident on the insurance platform, replayed as the trace I followed. Step through it: what users saw, how I found the cause, and what the fix changed.
POST/api/underwriting/policies
trace 7f3a…c91e
2,140ms
Step 1/5
What users saw
Under load, issuing a policy started failing with 500 errors, and every retry made it worse.
Timings are illustrative; the chain of failures is the real one.
Journey
One feature, issuing a policy, written the way engineers write it from their first year to the architect's chair. Pick a stage.
Everything lives in the controller: SQL, business rules, email, all of it. It works on my machine and nobody knows why.
[HttpPost("save")]
public IActionResult Save(PolicyDto dto)
{
var conn = new SqlConnection("Server=prod;User=sa;Password=123");
conn.Open();
var sql = "INSERT INTO Policy VALUES ('" + dto.Name + "', " + dto.Premium + ")";
new SqlCommand(sql, conn).ExecuteNonQuery();
if (dto.Premium > 100000)
new SmtpClient("mail").Send("boss@co", "Big policy!", dto.Name, "");
return Ok("saved"); // works on my machine
}Writing
14 articles on .NET, infrastructure and running a team. Most started as an incident.
Places
Every place I've lived, worked or travelled to. Mostly the Kathmandu valley so far, so the map has plenty of room.
Drag to spin the globe
2 places in 1 country so far
Bookshelf
Books that shaped how I build and run systems. Pull one off the shelf.
2017 / 616 pages
Martin Kleppmann
Why it's here
Replication, partitioning and consistency, explained from first principles. The trade-offs behind read replicas and an outbox.
Contact
Open to senior and lead roles in backend architecture and .NET modernisation, in Kathmandu or remote.
PDF, A4, every project and article in one file
Local time in Kathmandu: KTM, UTC+5:45
➜ ~ whoami
Ejan Shrestha, Senior Software Engineer, Kathmandu, Nepal
➜ ~ contact --email
➜ ~