I have often thought that for programmers, the best first language is assembler / machine language, not because that itself will ever be much used again, but because it teaches the most fundamental constraints on computers, like instructions have variable timing and space requirements, and there are tradeoffs between the two.
I know way too many higher level programmers, including just plain C, who think counting lines of code is a good indication of the speed and size of code. They utterly ignore sub calls and complex multi-level data structures.
Then you get to the object oriented crowd who additionally cannot see any disadvantage to anything object oriented. They cannot articulate any tradeoffs between speed of development vs speed of execution.
I realize good design has little to do with counting cycles and bytes, but there are simply too many programmers who have no comprehension of anything below lines of code. Good design has a practical side too. It's more than just throwing cycles and memory at a problem.