Understanding Tech: Looking Beyond the Surface
Tags: engineering, abstractions, frontend
Published: 2023-10-21 18:15:54

> Photo by <a href="https://unsplash.com/@sebbill?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Sebastian Bill</a> on <a href="https://unsplash.com/photos/white-and-black-boat-on-sea-dock-during-daytime-FEqy73bRuRQ?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Unsplash</a>
  

Let's talk about abstractions. 

Today, I was browsing [twitter](https://twitter.com/pikuma/status/1715728015601111084) while I found this amazing [article](https://unixsheikh.com/articles/we-have-used-too-many-levels-of-abstractions-and-now-the-future-looks-bleak.html), it talks about how too many layers of abstractions have caused developers to only think in terms of tools instead of understanding the underlying systems of a tech.

This article also advices people to, And I quote: 

1. Never just follow hype or trends.
2. Be curious. Don't just learn tools, try to understand how the underlying technology works.
3. If possible, try at least once to manually do what e.g. a configuration tool does for you.
4. If possible, try to look at the code for the tool. Even a basic understanding of the code can be very valuable.
Stay curious. Keep learning. Experiment. Dive deeper into the technology that interests you. If possible, set up a homelab and use it as a playground for learning and breaking things.

The 2nd and the 4th point is what I want to highlight because previously I've attempted to [write my thoughts on this topic](https://dev.to/anuraghazra/using-a-tool-vs-knowing-how-a-tool-works-internally-84g) but it was a terrible attempt, I wasn't able to convey my thoughts clearly on that article and ended up comparing react vs vue. 

So after almost 3 years I want to take a second jab at this, where I want to write about the importance of "using a tool vs understanding a tool". 

## Don't just learn tools

Let's talk about design, I'm not a very good designer but like [designing](https://anuraghazra.dev/#concepts) in my free time. 
I also love to create [abstract 3D designs](https://twitter.com/search?q=from%3A%40anuraghazru%20artwork&src=typed_query&f=top) in blender. 

But the thing is, sure I do "designing" but do I actually "understand" designing? 
Absolutely not. 

Designing is not just about using a tool like figma, blender or photoshop and pressing few combinations of buttons until you get something which "looks" good. It's a process. 

A good designer can design regardless of the tool that you give them, be it a figma board, photoshop canvas or a piece of paper. 
A good designer embraces and understands the [fundamental principles](https://uxdesign.cc/dieter-rams-and-ten-principles-for-good-design-61cc32bcd6e6) of design and applies them whenever they see fit. 

Now coming back to tech, A good engineer is not someone who knows X framework nor it is someone who knows Y language. A good engineer is someone who has a certain level of understanding of the underlying systems. 

For example, If you are an UI Engineer, 
- Learn about [Immediate Mode vs Retained Mode](https://oandre.gal/concepts/immediate-mode-vs-retained-mode/) UI models
- Learn [how browsers work](https://developer.chrome.com/blog/inside-browser-part1/)
- Learn how your framework [works under the hood](https://pomb.us/build-your-own-react/), even build your own [clone of the framework](https://github.com/anuraghazra/AnuReact).
- Learn how your favourite programming language works under the hood, even build your own [toy](https://github.com/anuraghazra/ToyLang) programming language.

The point is, it's fine if you are starting with a higher level of abstraction and getting things done or shipping things to production, But at some point slow down, hit the brake paddle and try to get a deeper understanding of the tools that you are using.

_A good photographer is not someone who can just operate a camera (the tool), A good photographer is someone who can operate a camera AND understands/applies the fundamental [principles of photography](https://www.jdinstitute.edu.in/principles-of-photography/)._


## Curiosity Helped The Cat

Be curious. 

They say curiosity killed the cat, but if you are reading this you are _probably_ not a cat. 

if you are a curious engineer that means you ask questions, explore new ideas, solve complex problems with simple solutions, and always find ways to get a deeper understanding of things. 

**A curious engineer is a furious engineer.**

If you are a curious engineer: 

- Wonder about this scary regex `#([1-9fA-F]{2,})`! Wonder how regexes work under the hood. Research and try to build your own [regex engine from scratch](https://twitter.com/anuraghazru/status/1681344061180088320). 
- Wonder how to build your own programming language. Research about compilers, Learn about compiler design, Write a simple parser or even build a [toy](https://github.com/anuraghazra/ToyLang) language. 
- Get fascinated by physics engines like Box2D/Toxiclibs and wonder about how these physics engines work under the hood. Research, learn & build your own [rigid body](https://twitter.com/anuraghazru/status/1705244118602137926) [physics](https://twitter.com/anuraghazru/status/1701675400156569972) [engine](https://twitter.com/anuraghazru/status/1704126161595634139). 
- Wonder about how operating systems work, learn how to write a bootloader, you don't need to succeed at every step just have a general idea. 
- Wonder how complex & [scary looking](https://twitter.com/diegohaz/status/1309489079378219009) TypeScript code works. Ask questions, learn about it & [get a deeper intuition](https://twitter.com/anuraghazru/status/1312086646364409856).

In the long run the more curious you are the deeper your overall understanding of tech gets. 

## The End Goal

In conclusion, it's okay to use a higher level of abstraction but dive deeper into the tech and try to understand the fundamentals. Aim to become a "T" shaped engineer, have the breadth but also have the depth.  

In the long run it will be extremely beneficial to you, 
From being able to easily debug React code because you know how React works under the hood to writing efficient Regexes because you know ins and out of how regex engines work or **even preventing your entire company to go down because of an [evil regex](https://youtu.be/DDe-S3uef2w?si=dI-c3m6mEdZdWNbn&t=389).**