A perspectiva que você tem pode ser distorcida pela experiência pessoal. Essa é uma inclinação escorregadia de fatos individualmente corretos, mas a inferência resultante não é, mesmo que pareça correta à primeira vista.
- As estruturas têm um escopo maior do que os pequenos projetos.
- As práticas inadequadas são significativamente mais difíceis de lidar em bases de código maiores.
- Construir uma estrutura (em média) requer um desenvolvedor mais qualificado do que construir um projeto pequeno.
- Os desenvolvedores melhores seguem mais as boas práticas (SOLID).
- Como resultado, as estruturas têm uma maior necessidade de boas práticas e tendem a ser construídas por desenvolvedores com uma experiência mais próxima com as boas práticas.
Isso significa que, quando você interage com estruturas e bibliotecas menores, o código de boas práticas com o qual você interage será mais comumente encontrado nas estruturas maiores.
Essa falácia é muito comum, por exemplo, todos os médicos pelos quais fui tratado eram arrogantes. Portanto, concluo que todos os médicos são arrogantes. Essas falácias sempre sofrem uma inferência geral baseada em experiências pessoais.
No seu caso, é possível que você tenha experimentado predominantemente boas práticas em estruturas maiores e não em bibliotecas menores. Sua observação pessoal não está errada, mas é uma evidência anedótica e não é universalmente aplicável.
2 modos de programação - criando mais ou menos exatamente o que é solicitado via requisitos e KISS (programação típica), ou criando lógica, serviços muito genéricos e reutilizáveis, etc., que fornecem a flexibilidade que outros desenvolvedores podem precisar (programação de estrutura)
Você está confirmando isso aqui. Pense no que é uma estrutura. Não é uma aplicação. É um "modelo" generalizado que outras pessoas podem usar para criar todos os tipos de aplicativos. Logicamente, isso significa que uma estrutura é construída em uma lógica muito mais abstrata para ser útil a todos.
Os construtores de estruturas são incapazes de usar atalhos, porque eles nem sabem quais são os requisitos dos aplicativos subseqüentes. Construir uma estrutura inerentemente os incentiva a tornar seu código utilizável para outras pessoas.
Os construtores de aplicativos, no entanto, têm a capacidade de comprometer a eficiência lógica porque estão focados na entrega de um produto. Seu principal objetivo não é o funcionamento do código, mas a experiência do usuário.
Para uma estrutura, o usuário final é outro desenvolvedor, que estará interagindo com seu código. A qualidade do seu código é importante para o usuário final.
Para um aplicativo, o usuário final é um não desenvolvedor, que não estará interagindo com seu código. A qualidade do seu código não tem importância para eles.
É exatamente por isso que os arquitetos de uma equipe de desenvolvimento costumam atuar como impositores de boas práticas. Eles estão a um passo da entrega do produto, o que significa que tendem a olhar o código objetivamente, em vez de se concentrar na entrega do próprio aplicativo.
Se você adicionar esses pontos de entrada da abstração, está realmente cumprindo os requisitos do usuário ou está criando uma estrutura em cima da estrutura existente e da pilha de tecnologias para facilitar futuras adições? Nesse caso, você está atendendo aos interesses do cliente ou do desenvolvedor?
Esse é um ponto interessante, e é (na minha experiência) a principal razão pela qual as pessoas ainda tentam justificar evitar boas práticas.
Para resumir os pontos abaixo: Ignorar as boas práticas só pode ser justificada se seus requisitos (como atualmente conhecidos) forem imutáveis e nunca haverá nenhuma alteração / adição à base de código. Alerta de spoiler: Isso raramente é o caso.
Por exemplo, quando escrevo um aplicativo de console de 5 minutos para processar um arquivo específico, não uso boas práticas. Como só vou usar o aplicativo hoje, e ele não precisa ser atualizado no futuro (seria mais fácil escrever um aplicativo diferente caso eu precise de um novamente).
Digamos que você possa criar um aplicativo de má qualidade em 4 semanas e em 6 semanas. À primeira vista, construir de má qualidade parece melhor. O cliente obtém seu aplicativo mais rapidamente e a empresa precisa gastar menos tempo com os salários dos desenvolvedores. Vitória / vitória, certo?
No entanto, esta é uma decisão tomada sem pensar no futuro. Devido à qualidade da base de código, fazer uma grande alteração na versão mal feita levará 2 semanas, enquanto as mesmas alterações na versão adequada levar 1 semana. Pode haver muitas dessas mudanças no futuro.
Além disso, há uma tendência de que as mudanças requeiram inesperadamente mais trabalho do que você pensava inicialmente em bases de código construídas de maneira péssima, provavelmente aumentando o tempo de desenvolvimento para três semanas em vez de duas.
E também há a tendência de perder tempo caçando bugs. Esse é geralmente o caso em projetos nos quais a criação de log foi ignorada devido a restrições de tempo ou a pura relutância em implementá-lo, porque você trabalha distraidamente com a suposição de que o produto final funcionará conforme o esperado.
Nem precisa ser uma grande atualização. No meu atual empregador, vi vários projetos que foram construídos de forma rápida e suja e, quando o menor erro / alteração precisava ser feito devido a uma falta de comunicação nos requisitos, que levou a uma reação em cadeia da necessidade de refatorar módulo após módulo . Alguns desses projetos acabaram em colapso (e deixaram para trás uma bagunça insustentável) antes mesmo de lançar sua primeira versão.
As decisões de atalho (programação rápida e suja) são benéficas apenas se você puder garantir conclusivamente que os requisitos estão exatamente corretos e nunca precisarão ser alterados. Na minha experiência, nunca encontrei um projeto em que isso fosse verdade.
Investir o tempo extra em boas práticas é investir no futuro. Bugs e alterações futuras serão muito mais fáceis quando a base de código existente for baseada em boas práticas. Já estará pagando dividendos após apenas duas ou três alterações.