Ideias de sistemas quase não funcionais
(hardcoresoftware.learningbyshipping.com)Ideias de sistema quase não funcionais
-
"Vamos apenas torná-lo plugável"
- A ideia é permitir que, quando uma implementação falhar, os desenvolvedores possam adicionar uma nova implementação com facilidade. Mas, na maioria dos casos, a funcionalidade que a API oferece não funciona com a facilidade esperada. Para que haja uma verdadeira capacidade de plugin, a segunda implementação precisa ser projetada desde o início.
-
"Vamos apenas adicionar uma API"
- Muitas vezes adiciona-se APIs para construir uma plataforma e atrair desenvolvedores. Porém, oferecer APIs exige esforço contínuo em compatibilidade e interoperabilidade, e disponibilizar uma API não significa necessariamente atrair usuários. Construir uma plataforma é um negócio sério, e não é fácil oferecer uma base econômica apenas com APIs.
-
"Vamos fazer uma abstração a mais"
- Há uma máxima de que um problema de ciência da computação pode ser resolvido com mais um nível de indireção. Porém, abstrair cedo demais pode gerar dificuldades de manutenção, segurança e otimização de desempenho. Abstrações adicionadas sem planejamento tornam a manutenção do código mais difícil.
-
"Vamos tornar assíncrono"
- A programação assíncrona já foi um tema de pesquisa antiga em ciência da computação. Frameworks web encapsulam isso bem, mas fora de um framework, ao tentar gerenciar a assíncronia diretamente, aumenta a chance de surgir um bug imprevisível.
-
"Vamos adicionar controle de acesso depois"
- A segurança do sistema deve ser considerada desde o início, mas costuma ser adicionada depois por causa da velocidade de lançamento no mercado. Se o controle de acesso não for considerado desde o começo sob a perspectiva de clientes e adversários, há maior chance de o produto precisar ser redesenhado depois.
-
"Vamos sincronizar os dados"
- A sincronização de dados é um problema extremamente difícil, com muitos desafios que só são resolvidos com experiência. Construir uma solução baseada em sincronização de dados quase nunca é desejável.
-
"Vamos torná-lo multiplataforma"
- Desenvolvimento multiplataforma é semelhante a construir sistemas operacionais, provedores de nuvem ou navegadores. Isso pode funcionar quando a plataforma é nova ou o aplicativo é simples, mas fica cada vez mais difícil com o tempo.
-
"Vamos permitir escapar para o nativo"
- Quando a multiplataforma é limitada, é comum permitir escapar para funcionalidades nativas. No entanto, isso pode conflitar com o estado mantido pelo framework e falha em 9 em cada 10 casos.
-
Conclusão
- Essas abordagens não falham em todos os casos, mas na maioria das vezes há um caminho melhor. É importante resolver os problemas com princípios básicos e evitar padrões de software com alta probabilidade de falha.
2 comentários
No caso de plugins, o mais importante é projetar a interface filtrando ao máximo apenas os comportamentos essenciais.
Se a interface for criada apenas copiando uma estrutura aproximada do código atual, ela acaba virando uma interface desnecessária que fica presa àquela implementação, e é realmente comum que isso aconteça...
Opinião do Hacker News
DSLs e APIs costumam funcionar com sucesso. Um motor de inferência como o TensorFlow também pode ser visto como uma DSL ou como uma API encapsulando uma DSL.
DSLs às vezes funcionam muito bem. Vale consultar o jOOQ.org.
O Elastic Load Balancer é um loop de controle que reage à carga de trabalho. Isso é, de certa forma, um produto.
A falta de recursos é generalizada na maioria das indústrias. Dá para ver em erikbern.com e em “Goal: Process of Ongoing Improvement”.
A detecção de anomalias não é um problema de sistemas distribuídos, mas quem teve problema com isso pode achar que é necessária.
A palavra “quase” é ineficaz neste contexto. É simplesmente pessimismo cínico.
Muita gente tenta encontrar uma função de decisão mais refinada para exceções, mas na prática é simples: funciona quando eu faço, não funciona quando o anterior fez.
“Domain Driven Design” é uma receita de desastre para desenhar aplicação de acordo com a estrutura do negócio.
O loop de controle de resposta à carga é um componente básico e essencial. É usado em muitos sistemas.
Trabalhei em projetos com várias DSLs, cache P2P e paralelismo híbrido, e a maioria deles funcionou bem.
A abordagem de “apenas sincronizar dados” pode dar dor de cabeça.
Consegui executar com sucesso várias dessas ideias com sucesso. Então fica um pouco estranho