Reuso de código é algo muito difícil de ser obtido mas que temos hoje graças aos mecanismos de gestão de dependência tais como Maven, NPM, NuGet, RubyGems, etc.
E usamos estas bibliotecas sem pensar muito nas suas consequências: então ontem, durante o almoço, iniciamos uma discussão a respeito destas questões.
- O custo de termos dependências em nossos projetos - especialmente as dependências indiretas, que muitas vezes não são levadas em consideração.
- A possibilidade de haver conflitos entre diferentes versões de dependências em nossos projetos.
- Questões envolvendo segurança: você pode “acidentalmente” baixar um pacote batizado e cair em uma série de golpes.
- O fato de poder estar inserindo bugs em seu projeto proveniente destas dependências.
E realmente, se formos parar pra pensar, notamos um comportamento bastante curioso em praticamente toda equipe de desenvolvimento. Enquanto pensamos um milhão de vezes antes de contratar um programador (checamos seu currículo, aplicamos testes, o entrevistamos, etc), não o fazemos para as bibliotecas que incluímos normalmente em nossos projetos.
Fato é que você não tem certeza a respeito da qualidade do código que está nas suas dependências: nós esperamos que ele esteja ok, mas é raro você realizar uma análise profunda nestas dependências.
Acessando o site da ACM Queue vi que a matéria de capa da última edição é justamente este assunto: “Surviving Software Dependencies”, de Russ Cox. Infelizmente não tenho uma assinatura ativa da revista, mas no blog do autor encontrei um texto que com certeza é bastante parecido com este e que vocês podem ler gratuitamente neste link: https://research.swtch.com/deps
É uma leitura fascinante, por que além de mostrar os riscos da inclusão de dependências em nossos projetos, também descreve diversas estratégias que nós podemos tomar em nossos sistemas para minimizar estes riscos.
Excelente leitura. Gostaria de saber a opinião de vocês a respeito.