· · 9 min read

What Building a Database Engine Taught Me About Trusting Software

Every app I'd built before this treated the database as a black box. Then I tried building one. Here's what changed about how I think about the software I use every day.

SK
Safiya Khan
Computer Science (AI) Student · CAPM®

Every application I had built before this treated the database as a black box. You call INSERT, you call SELECT, and something on the other side of a connection string makes it work. I never thought hard about what "makes it work" actually involved — until I decided to build a relational database engine from scratch and found out exactly how much is happening underneath a single line of SQL.

The goal was to implement the core of what a real relational database does: CREATE TABLE, INSERT, SELECT, UPDATE, and DELETE, backed by persistent file-based storage, with a modular query parser and execution layer sitting on top. Not a toy that pretends to be a database in memory and forgets everything on exit — something that actually writes to disk and reads itself back correctly.

The Part Nobody Warns You About

The query language is the easy part. Writing a parser that turns a CREATE TABLE statement into a schema definition, or a SELECT into a set of conditions to evaluate, is a satisfying, well-scoped problem with a clear right answer. The part that actually humbled me was persistence — making sure that what the database believes about its own state on disk is always, provably, consistent with what a program reading that file back would reconstruct.

It sounds simple until you have to answer questions like: what happens if the program crashes mid-write? What happens if two operations try to touch the same record region? A database that only works when nothing ever goes wrong is not a database — it is a demo. Building even a minimal, correct answer to "how do I not corrupt my own file" changed how I read every piece of infrastructure code I touch now.

"I had used databases for two years before I understood, structurally, why a crash mid-write is the scariest sentence in systems programming."

The Moment B-Trees Made Sense

I knew, abstractly, that indexes made lookups faster before I started. I did not understand it until I implemented B-Tree indexing myself and watched a full table scan — checking every single record to find a match — get replaced by a structure that could rule out most of the table in a handful of comparisons. That is not a marginal improvement. It is the difference between a query that scales and one that quietly stops being usable the moment your table crosses a few hundred thousand rows.

What surprised me most was how much of database performance work is really a trade-off problem in disguise. Indexes make reads faster and writes slower, because every insert now has to keep the tree balanced, not just append a row. There is no version of an index that is free. Every "fast lookup" I had ever taken for granted in a production system was actually someone, at some point, deciding that trade-off was worth making — and I had never once had to think about it before building the structure myself.

Three things I no longer take for granted:

01 — Persistence correctness is a harder problem than query correctness, and gets far less attention

02 — Every index is a deliberate read/write trade-off, not a free performance upgrade

03 — "It works on my machine" means nothing until you have tested it against a mid-write crash

What Changed About How I Trust Software

I do not think everyone who uses a database needs to build one. But I think something shifts permanently once you have implemented, from nothing, the layer of software that every other layer above it silently assumes is correct. I read infrastructure documentation differently now. I am more careful about what I assume "just works" in a dependency, because I have personally felt how many small, unglamorous decisions sit underneath a single reliable read.

That is, I think, the real value of building systems software as a student — not the résumé line, though it does not hurt, but the recalibrated sense of respect for the software you did not write yourself. Trusting a database, a filesystem, a network stack, stops being passive. You start to understand exactly what you are trusting, and why that trust has to be earned rather than assumed.

Systems Programming Databases B-Trees Software Engineering Python Student Perspective
© 2026 Safiya Khan · safiyakhan.netlify.app ← Back to Blog