Every line in the source code has a purpose and as software developers, we spend most of your time searching for those small pieces that are currently relevant. The problem here is not the poor abstraction of the language, but the high information density of code. But regardless of the language, if a project reaches a certain size, it's hard to keep a consistent mental model of the source code's structure. They reduce the overhead a software developer needs to keep in mind by abstracting away more and more limitations of the machine. Programming languages are constantly evolving. Programming languages are not the problem. New Developers will often have to spend days or even weeks browsing legacy code to familiarize themselves with the implementation before actually becoming productive.
Consequently, more and more effort is spent investigating the current implementation while less is spent on writing new features. When a codebase grows, it becomes increasingly complex to track every addition. Working in teams allows us to solve harder problems, but it comes at a cost. Professional software development is often a team effort.
But sometimes, it’s more difficult than we expect. As software engineers, we know that we have the skills and capacity to actualize all of our ideas.