I've never heard that good advice put so succinctly before. Has this advice been around for ages and I just missed it, or is it a newly relevant concern?
BTW, what would two levels be to, say, a React developer, out of curiosity? Would it be the browser engines? Knowing how JIT compilers work, etc.? Or would it instead be a deeper understanding of the language spec, so that you know more internal functioning? Not that there has to be a clear-cut answer.
When I started learning AppleSoft Basic back in the 80s, I knew how to optimize my BASIC programs because I knew how the interpreter worked and so knew assembly.
When I started learning C#, I knew both C, Win APIs and how the CLR worked.
But for a web developer who communicates with backend servers, I think it’s important to understand HTTP.
Language-wise, I'd say babel "javascript" is the highest level of abstraction. One level below is understanding what things like JSX and class properties transpile to. One level below is understanding JIT strategies (e.g. when hidden classes deopt), memory usage of various patterns, etc. One level below is understanding specific semantics of high level APIs (e.g. exact accuracy of a high res timer implementation), or regexp memory footprint by looking at browser source code.
Why wouldn’t a developer’s job be to learn how to optimize a database query but would be to learn how to optimize a program?
No one has thought to run a query plan
(N + 1)*10000000000000000
Yet I've never once been asked about this in an interview despite using it maybe once a week for years.
O(n) on the other hand...
I run into this problem whenever I'm interviewing for devs on my team. As a java shop, we usually get people who come in and claim to be proficient in Spring, but when I start asking them questions about the underlying technologies they blank.
My favorite weed-out question when I'm worried someone is too tied to a framework (especially when its one that isn't actively in use on a project) is to ask them to give me some examples of the limitations of it. To me, being able to recognize the things your favorite framework is not able to solve effectively is the best indicator that you aren't using it as a crutch.
Now on the other end AWS CloudFormation for infrastructure as code, I could go on for days about its limitations.
1) It's a web framework. So, not suitable for command line tools, desktop GUIs or persistent message queue workers. But you can do all of that in other kinds of C# .NET app.
2) However, .NET is a Garbage Collected language and should not your first choice for e.g. a real-time device driver or OS kernel.
But people do try to do some of those things that I listed, using ASP.NET.
The issue is “framework developers”. I am not opposed to learning and using frameworks but you should always know at least one level below the framework you are using.
If you are a web developer who uses Angular/React and Bootstrap everyday you should know JavaScript, CSS, and HTML well.
If you use an ORM, you should know enough about how databases work to have a mental model of what the database is doing.