Sim, com certeza.
A analogia que eu gosto de usar para explicar a programação é a de um Tailor. Ao fazer um terno, um bom Tailor sempre deixará uma pequena quantidade de tecido em locais estratégicos dentro do vestuário para permitir que a peça seja levada para dentro ou para fora, sem alterar sua forma ou estrutura geral.
Bom Alfaiate não deixe resmas de tecido em cada costura apenas caso você cresça um terceiro braço, ou fique grávida. Demasiado material nos lugares errados contribuirá para uma má adaptação e vestuário mal utilizado, o tecido extra simplesmente fica no caminho do uso normal. Para o tecido pouco eo vestuário é propenso a lágrimas e não será capaz de ser alterado para lidar com pequenas alterações no corpo do seu portador, efetuando o modo como a peça fica.
Talvez um dia, nosso bom alfaiate será encarregado de fazer um vestido tão apertado que ele tem que costurar a usá-lo. E talvez o nosso Bom Alfaiate seja convidado a fazer roupas de maternidade, onde o estilo e o ajuste são os segundos do conforto e da capacidade de expansão. Mas antes de empreender qualquer desses trabalhos especiais, um bom Alfaiate seria sábio o suficiente para conscientizar todos os compromissos que estão sendo feitos para alcançar esses objetivos.
Às vezes, esses compromissos são o caminho correto a seguir e as pessoas estão dispostas a aceitar suas consequências. Mas, na maioria dos casos, a abordagem de deixar um pouco mais importante será superior a qualquer benefício percebido.
Então, relacionando isso de volta à abstração. É absolutamente possível ter muitas camadas de abstração, assim como é possível ter muito pouco. A verdadeira arte do programador, como os nossos alfaiates amigos, é deixar um pouco o que conta mais.
Voltando ao assunto.
O problema com o código geralmente não é abstração, mas dependências. Como você apontou, é o código que conecta objetos discretos que é um problema, porque há uma dependência implícita entre eles. Em algum ponto, a comunicação entre coisas só precisa ser concreta, mas julgar onde esse ponto geralmente requer alguma adivinhação.
Dito isso, "Micro" é geralmente uma indicação de que você supergranulou o layout do objeto e provavelmente está usando Type como sinônimo para o que deve ser Data . Ter menos coisas também significa menos dependências necessárias para se comunicar entre elas.
Sou um grande fã de mensagens assíncronas entre sistemas por esse motivo. Você acaba com dois sistemas dependentes da mensagem , ao invés de um ao outro. Dando-lhe menos acoplamento entre sistemas de comunicação. Nesse ponto, se você precisar ter uma dependência entre os sistemas, precisará considerar se possui os bits dependentes no (s) local (is) certo (s). E é frequentemente o caso que você não faz.
Finalmente, o código complicado será complicado. Não há muitas maneiras de contornar isso. Mas o código que tem menos dependências é muito mais fácil de entender do que aquele que depende de vários estados externos.