Better abstractions save work without eliminating the need to understand what is underneath
TCP hides much of an unreliable network behind an ordered stream, but it cannot make a broken connection disappear. Joel Spolsky uses that example to argue that substantial software abstractions inevitably expose some of the systems beneath them.
Equivalent SQL queries can have very different performance. A remote file stops behaving like a local file when the network fails. A code-generation tool can spare someone routine work while leaving them unable to diagnose a failure in the generated machinery.
His distinction is between saving time doing a task and saving time learning what the task depends on. Higher-level tools enable far more ambitious software, yet proficient developers may still need knowledge from several lower layers when those tools stop cooperating.
This is the original 2002 argument, including examples from its era. It is a claim about the limits of abstraction, not a demand that every programmer build every dependency from scratch.