They're inevitably junior-heavy, supervised by 2 or 3 year seniors, who do a reasonable job of keeping things in line but there's only so much you can do. The code ticks all the boxes for testing, etc, but is far from inspired and usually built with the present, not the future, in mind. There are uncomfortable organisational incentives to not over-deliver in quality - wouldn't want changes and maintenance to be too easy, and it's not like the client is tech-savvy or they wouldn't be hiring a "name" shop in the first place.
Most really good programmers who know their value (that I know, anyway) are working for product companies, where quality is visible, valued, and rewarded, or are highly-paid consultants/freelancers.