Frequently, it seems that every environment (Dev, QAT, Staging, Production, etc.) has its own personality. You may be working to test a feature on QAT and hear “oh, that never works on QAT. We will have to check that on staging” or “Production is the only environment with a load balancer, so that’s why we never spotted the bug before.” When humans are responsible for keeping environments in sync, things fall between the cracks and environments tend to drift apart. It is also a lot of manual work to constantly apply changes to each environment. Maintaining environments with different infrastructure causes several issues, including only being able to find bugs in a certain environment and make development hard as you are never testing being unable to test against production-like infrastructure.