Every bit of code written by a developer represents a hypothesis that "this will have desired behaviour X in the context of the production environment".
Anything that lengthens the time between when that hypothesis was formed, and when that hypothesis is validated or invalidated, decreases productivity in a non-linear way.
This could be anything like:
- There is no proper testing, so developers have to wait months for the system to be released so they can get the bug reports then,
- There is a test suite, but it takes ages to run,
- It takes ages to build/compile the system,
- Developer lacks the skills to extract the maximum amount of feedback from a single "edit/compile/test/whatever" cycle, so it takes many more cycles to validate the original code,
- The underlying system/development environment/build system is flaky and often behaves in unanticipated nondeterministic ways, so the developer has to spend a lot of cycles rebuilding/retesting to get a sort of statistical sense whether the code will "work" more often than not,
- The system involves large database backup files which take ages to copy and restore to a development environment, so it takes ages to work on and validate a production data fix,
- Deployment of the system to a production, staging, or development environment takes ages and/or is a manual brittle process, so it takes ages to validate whether code will in fact work in the context of the actual complete system,
- and so on and so forth.
In my experience issues like these are often the number one source of productivity issues in any team and environment.
This does not negate that individual developer skill is a large factor in performance differences, because skilled developers know how to mitigate or prevent such long feedback loop times.