From Scratch

11 Dec 2025 - sam

This page is a work in progress. Check back later for more!

Preface: Everything in this post is my own subjective opinion (that's what a blog is, right?). The goal is to convey my perspective, not to convince anyone else to adopt it!

Abstraction is a powerful concept. When I press the gas pedal in my car, the car moves forward. I don't have a passion for cars, and I'm not an engineer at Mercedes, so that mental model is sufficient for me.

I do have a passion for computer engineering, a massive field which embraces abstraction. I want to know how my computer starts up, how it loads and runs programs, how it renders graphics and sends them to a monitor, etc. Broadly speaking, I could take one of two approaches to learning more about these things: top-down and bottom-up.

Say I wanted to learn how to make a website. The top-down approach might be to buy some website package from a vendor online; they'll let me select from some templates, fill out some basic content, and choose a name for the website. Then, the vendor probably gives me some tools to dig a little deeper on customization, maybe with some custom scripting or dynamic content. I can safely chip away and learn more at a comfortable pace without worrying about anything exploding in my face.

In general, I prefer the bottom-up approach. Almost always, this approach:

At the same time, the bottom-up approach:

(Aside: did I really build my own website if I used nginx instead of writing my own HTTP server software, in my own programming language, on hardware that I designed and built, using raw materials that I gathered and assembled? I think it's fair to say that "from scratch" really implies "from scratch, within reason".)

Let's say I went with the top-down approach for this website, and bought it from a full-service vendor. Then, all of the changes I make to the website have to go through that vendor, using the vendor's tools. I'd be learning how to make a website in this specific vendor's ecosystem. This isn't necessarily a bad thing... they've probably put a lot of time and effort into make their tools intuitive, easy to learn, and portable to other website platforms. But it is an additional layer between me and the actual technology powering the website, a layer of "abstraction" in some sense.

The bottom-up approach provides a strong foundational knowledge that makes it easy to learn more, develops experience and intuition for how the system really works, and avoids the pitfalls of working with unnecessary or poorly-implemented abstraction. In exchange, the bottom-up approach sacrifices the conveniences and immediate productivity gains of working at a higher level of abstraction. It's an investment for the future: short term pain for long term gain.

Aaron Griffin, former head of the Arch Linux project, once said (presumably; I can't find the original source!) "If you try to hide the complexity of the system, you'll end up with a more complex system". The sentiment is provocative, and perhaps an over-generalization, but incredibly important for the design of any system. Abstraction is powerful, but its usefulness needs to justify the implicit complexity of using abstraction at all.

AI

Generative AI is incredibly powerful, rapidly getting more powerful, and far smarter than I'll ever be. However, I don't use AI in my *personal* projects for largely the same reasons that I tend to prefer the bottom-up approach to working on projects. Yes, AI would dramatically increase my productivity and make my projects "better"; but to really understand what the AI produces, I would still have to invest time and energy into studying the AI's output. I might reach the same final level of understanding, but I won't have earned the same experience, or had to troubleshoot failures. Besides, my goal with personal projects isn't necessarily to create the best possible final product -- I leave that for the professional world. Rather, my goals are to learn, explore, practice, have fun, and set myself up for bigger, more complex projects.

I'm certainly not "anti-AI". I'm aware of its current limitations, and I would like to see more consideration into the ethics of using AI (particularly around AI art, environmental impact, attribution issues, and privacy concerns); but I also recognize its incredible value as a tool to increase productivity, stay organized, teach, and so much more. For now, though, I don't use it. I stay up-to-date on AI news, I'm familiar and comfortable with the AI tools and workflows in software engineering, and I have no reservations about adopting AI for professional work, or even for personal projects where I believe it would be outright stupid to not use it.