Чтобы разработчики принимали правильные решения, влияющие на качество, им, во-первых, в принципе должно быть дано право принятия решений. А во-вторых, им нужно давать самый широкий контекст для принятия таких решений. То есть они должны не получать набор уже пережёванных архитекторами, аналитиками и менеджерами «тасков» в трекере, а активно участвовать в проектировании, начиная с самых ранних стадий.
Искусственно созданными «коммуникациями» эту проблему не решить: не бывает ответственности без полномочий. К программисту можно относиться либо как к разработчику, на равных участвующему в создании продукта, либо как к кодеру, задача которого – перевести на язык программирования то, что «умные люди» уже придумали до него. И бессмысленно возлагать на кодера какую-то ответственность за качество продукта.
Матричная структура и аутсорс, к сожалению, подталкивают программиста к роли кодера, а не разработчика. В этих моделях принято утилизировать время программиста, лишая его при этом, во-первых, ощущения причастности к созданию продукта, а во-вторых, возможности глубоко погружаться в контекст.
Лично я уверен, что в «матрице» или на аутсорсе невозможно создавать выдающиеся продукты. Цельные продукты создаются цельными командами.