Complexidade
Complexidade em SW
• Observe o mundo a sua volta e você verá grandes projetos complexos :
Pense em um computador
• Cada parte é relativamente simples, porém atuando em conjunto eles formam uma máquina bastante complexa;
• De fato, um computador não existe, o que existe é a interação independente e coordenada de suas partes
• Tente descrever como um computador funciona sem fazer referência aos seus componentes.
• Tente descrever o que é uma memória, um processador, uma unidade de disco.
• Isso define uma complexidade hierárquica: um sistema complexo composto de partes independentes coordenadas, que por sua vez também apresentam complexidade hierárquica. Pense em uma planta
• 3 grandes estruturas (raiz, tronco e folhas)
• Cada uma composta de sub-estruturas
• Raiz: coifa, crescimento, pilífera, suberosa, ...
• Cada nível de abstração interage com os demais componentes do mesmo nível de maneira conhecida
• Cada nível possui limites claros de colaboração e responsabilidades • Nenhum componente é responsável somente por um passo em um processo maior, assim como não há um coordenador central (comportamento emergente)
E Software?
No artigo clássico “No Silver Bullet – Essence and Accidents of
Software Engineering” Brooks argumenta que a complexidade do software é uma propriedade essencial e não acidental. Essa complexidade deriva de 4 elementos:
• Complexidade do Domínio
• Dificuldade de gestão do processo de desenvolvimento
• Flexibilidade permitida pela programação
• Problema de caracterizar o comportamento de sistemas discretos Complexidade de Domínio
• Os problemas que tentamos resolver em software normalmente envolvem elementos de grande complexidade;
• Sobre eles, adicionamento complexidade não funcional como usabilidade, performance, custo, estabilidade, confiabilidade.
• Junta-se o fato de que usuários e desenvolvedores tem conhecimentos distintos sobre o domínio e sobre desenvolvimento (communication gap)
• Os requisitos do projeto ainda