I recently came across this video by ThePrimeagen: I feel bad for new programmers. A few points he made in the video resonated with me:
- People entering the field fresh today are drowning in options and frameworks.
- Yet, these frameworks and systems are layered with so much abstractions, people who learn these them miss out on the fundamentals, and essentially become “framework-ers” instead of programmers.
In my opinion, being a frameworker isn't inherently a problem; it can serve as a stepping stone for a job, to pay the bills, etc. It becomes an issue when someone persistently remains a frameworker, when someone fails to keep learning or digging deeper. Without this depth, their knowledge is mostly non-transferable. On the other hand, having a solid foundation allows them to adapt to new frameworks and systems built upon the same fundamentals.
How deep is enough?
The question becomes, how deep does one need to go? Honestly, the answer depends on someone's career stage and goals. For me, it's roughly at the foundational elements shared by these frameworks and tools. Which frameworks and tools, again, depends on where they are in their career and life. Here are a few examples which I have gone deep “just enough” that really bolster my learning and skillset:
- At age 11, I discovered something called Microsoft FrontPage. As far as I knew, this is a program that produces websites. Then I discovered Macromedia Dreamweaver could do similar things. Eventually, I learned that the common thing between them was called “HTML.” At that stage in my life, having HTML as a foundation was enough for me to be productive in different tools. Eventually I got jobs that also required working SharePoint, etc. If there was something I didn't know how to do with these software, I could always fallback to editing HTML manually.
- Fast forward some years later, it was no longer sufficient for my work and my research to just know how to use a database, even though at some previous point, “going deep” just meant understanding SQL that spans across different types of RDBMS. Now I needed to understand root causes of deadlocks, performance bottlenecks, etc. I started looking behind the curtains of MySQL, understanding B+ Tree structures, how indices are stored, why gap locks happen. Lucky for me, Postgres, SQL Server, and nearly every other RDBMS on the market are built upon these same foundational pieces. These are all skills and knowledge that will transfer to many projects and employers for the foreseeable future.
These are just two examples of myself going different levels of depth, at different stages in my life
Where does that leave us?
So what does it mean to the new comers? Is it as bleak as the title of the video? The good news is all these modern things aren't built from scratch. If there are 100 layers of abstractions counting from machine code, most of these frameworks started off somewhere around layer 95, so to speak. So for now, mastering somewhere around layer 95 is probably a good start. For example,
- Frameworks like Svelt, React, Angular, etc. are all built upon the same MVVM, MVC concepts. Getting a good grasp on them will do wonders for when we need to learn the next hotness.
- Rails, Laravel, Spring, ExpressJS, Sinatra, Actix, etc. all build on top of HTTP fundamentals. I would start by understanding the basics HTTP protocol. How do these frameworks invoke your handler when the user visits a page? They all need a raw HTTP handle, a router, some filter/middleware, etc.
- Want to become a better programmer? Learn data structures. These are foundation building blocks of any program, even “simple” ones without any fancy algorithms. Even just understanding the fundamental differences between array, list, array-list, will let you jump between different programming languages.
- Wanna learn new programming languages quickly? Understand memory management models. Heap vs. stack. Learn how languages with or without garbage collector work and who is responsible for cleaning up. Yes, there are programming languages that are quite different, but most of them are similiar enough just with different syntaxes. Once you have some sort of understanding over these fundamentals, trying building things without a battery-included framework. Maybe go from a framework to a micro-framework. Build a simple website with just good ol' GET/POST pages rather than some fancy ajax-filled SPA. You'd be surprised how gratifying it is to build something simple “from scratch.” And once in a while, you'll find a area where you'd watch to dig into layers below 95.
Postlude
Having said all that, I feel the need to wrap up by saying, one doesn't need to be an expert in everything. How else would we have time for life otherwise?
There are absolutely areas where I remained a frameworker. For me, it's mobile app development, more specifically, iOS development. I needed a job when I was a student, cashing in on the “there's an app for that” craze of the 2010s. Now I focus my energy to dig deep else where; mainly in backend systems and distributed systems—as that's where I find a balance between enjoyment and employment. And even within backend systems, there are still areas that I know more indepth, and others I only know at a surface level.
I'll wrap this with my personal moto: be jack of all trades, and master of a few things.