> A walled garden prevents you from doing a lot of things, not just over architecting. It inhibits the top tier engineers as much as the bottom tier ones.
Up to a point, depending on the limitation.
After all, writing raw assembly removes almost all limitations and yet people still argue for introducing limitations in higher level languages.
Static typing is a limitation, and yet more people argue for it than against it.
Structured control is a limitation, and yet people prefer that to raw `goto`s.
Lack raw memory access is a limitation, and yet people argue against raw memory access in favour of alternatives (such as byte arrays).
Top-tier engineers don't feel constrained by static typing, structured program controls, raw memory access or any one of the multitudes of limitations that popular languages define as their "walled garden".
There's no clear line marking the boundary between a constraint that is helpful and one that is not. It's more of a gradual spectrum with assembly on one side and Lisp on the other, and all other languages somewhere in between.
I'm largely in agreement that a language that prevents the programmer doing stupid things also prevents them doing clever things, but I feel that certain particular limitations improve the maintainability and readability of code.
Those languages that have a kitchen-sink approach to features are notoriously for being difficult to maintain. Most large C++ projects, for example, literally have a defined subset of C++ that they will approve in PRs, and they are still considered difficult to maintain.
IMHO (really emphasising the "humble" in that acronym), and as someone who's playing around designing a language (again!), a good language these days should be defined by what it doesn't let you do, not what it lets you do.
Lets you pick one of three different ways to declare a function? Bad Language! No cookie for you
A function declaration always looks the same no matter where it appears? Good! That's a limitation I actually want!