Skip lists are used in redis and LSM-trees, delivering O(log n) lookups with less complexity than B-trees. This post explains how they work, why randomness is useful and why you might choose them over B-trees.
Data modeling seems straightforward—until you realize the real world is messy, vague, and full of philosophical dilemmas. In this post, I dive into the challenges of defining "one thing," handling change, and categorizing entities in databases. Spoiler: It’s way harder than it looks.
How effective are LLMs as tutors? There are some crazy anecdotes out there about how they can replace teachers. But this study is one of the first I've seen that actually tries to understand its effect, _and_ what happens after it's taken away.
When building a service that handles many different API integrations, it's helpful to standardize the response. The `Result` monad is useful for expressing the response as either `Success` (everything went well), or `Failure` (something has gone wrong).
A practical guide to Python concurrency using a Fibonacci server to demonstrate the strengths and limitations of threads, processes, and asyncio. Learn when to use each approach through hands-on examples
RAG is not all you need. This post will cover some of the common problems that are encountered in a simple RAG system, and potential solutions for them.
As a fellow grug brained developer, I also agree that complexity is very bad. But what is software complexity? What does it look like? How does it come about?