Arquitetura de Software Visão Geral do Curso - PDF
Arquitetura de Software Visão Geral do Curso
Download "Arquitetura de Software Visão Geral do Curso"
Otávio Antunes de Sá
1 Arquitetura de Software Visão Geral do Curso Marco Túlio Valente DCC - UFMG 1
2 Parte I: Técnicas Avançadas de Modularização 2
3 Linhas de Produtos de Software 3
4 Definição Surgimento do termo: Workshop do SEI, 1996 Ou então: On the Design and Development of Program Families, David Parnas, 1976 SEI: A SPL is a set of software intensive systems sharing a common, managed set of features that satisfy the specific needs of a particular market segment or mission and that are developed from a common set of core assets in a prescribed way. Inspiração: linhas produtos industriais (customização em massa) Exemplo: indústria automobilística Plataforma de carro comum; a partir dessa plataforma são fabricados diversos carros; que possuem diversos itens opcionais 4
5 LPS = Reúso Sistemático 5
6 Feature Model Feature model: should capture the common features and differences of the applications in the domain Communication medium between users and developers. To the users: Shows what the standard features are What other features they can choose When they can choose them To the developer: Indicates what needs to be parameterized 6
7 Feature Model 7
8 SPL Extraction 8
9 Motivation SPL extraction is a time-consuming task Two approaches for extracting SPL: Compositional-based Annotation-based 9
10 Compositional-based Approaches Aspects (AspectJ) Products Existing code Modularized features Fonte: Zhang, Jacobsen, OOPSLA 2004 Physical modularization Slow adoption 10
11 Annotation-based Approaches Example: preprocessors boolean push(object o) { Lock lk = new Lock(); if (lk.lock() == null) { Log.log("lock failed"); return false; } elements[top++]= o; size++; lk.unlock(); if ((size % 10) == 0) snapshot("db"); if ((size % 100) == 0) replicate("db","srv2"); return true; } Widely adopted Problems: annotation hell; code pollution boolean push(object o) { #ifdef MULTITHREADING Lock lk = new Lock(); if (lk.lock() == null) { #ifdef LOGGING Log.log("lock failed"); #endif return false; } #endif elements[top++]= o; size++; #ifdef MULTITHREADING lk.unlock(); #endif #ifdef SNAPSHOT if ((size % 10) == 0) snapshot("db"); #endif #ifdef REPLICATION if ((size % 100) == 0) replicate("db","srv2"); #endif return true; } 11
12 Visual Annotations CIDE: Colored IDE (Eclipse + background colors) boolean push(object o) { Lock lk = new Lock(); if (lk.lock() == null) { Log.log("lock failed"); return false; } elements[top++]= o; size++; lk.unlock(); if ((size % 10) == 0) snapshot("db"); if ((size % 100) == 0) replicate("db","srv2"); return true; } boolean push(object o) { Lock lk = new Lock(); if (lk.lock() == null) { Log.log("lock failed"); return false; } elements[top++]= o; size++; lk.unlock(); if ((size % 10) == 0) snapshot("db"); if ((size % 100) == 0) replicate("db","srv2"); return true; } Less code poluttion than #ifdefs Problem: colors assigned manually (repetitive, error-prone etc) 12
13 Sugestões de Projetos 1. Realizar um survey sobre principais linhas de produtos de software usadas em papers da área Objetivo: criar um repositório de LPS, para facilitar pesquisas na área Tarefas: Instalar/usar/configurar linhas de produtos Descobrir ou prover documentação (incluindo feature model) Elaborar artigo em inglês Disponibilizar página web 2. Modelar variabilidades de um sistema não-trivial: Criar feature model Classificar features (alternativas, opcionais etc) Definir restrições entre features Sugestões de linguagens: TVL, CDL e Kconfig 13
14 Sugestões de Projetos 3. Avaliação da linguagem Clafer para modelagem de SPLs + comparação com outras linguagens (TVL, CDL, Kconfig) Criar (ou reusar) uma LPS de exemplo Modelar em Clafer Avaliar a linguagem Comparar com outras linguagens (TVL, CDL, Kconfig) 4. Extrair features de um sistema não-trivial Exemplo: ArgoUML-SPL (http://argouml-spl.tigris.org/) 14
15 Parte II Recuperação e Conformação Arquitetural 15
16 Recuperação Arquitetural 16
17 Dependency Structure Matrix (DSM) Invented for optimizing product development processes Design Rules: The Power of Modularity, Carliss Y. Baldwin and Kim B. Clark, 2000 Industry has experienced unimaginable levels of innovation and growth because it embraced the concept of modularity, building complex products from smaller subsystems that can be designed independently yet function together as a whole 17
18 Dependency Structure Matrix (DSM) The matrix is a simple adjacency matrix with: Tasks labeling the horizontal and vertical axes Mark in the i th column, j th row: the i th task depends on the j th Figure 1 shows a simple DSM: Column 1: task A depends on task C Column 3: task C depends on tasks A and B 18
19 Architectural Patterns 19
20 Imperfectly Layered System Module util depends on application and model Dependency strengths suggests that this dependency is not as strong as the reverse dependency 20
21 DSM for JUnit Shows that JUnit is a layered system with clean separation of the user interface layers from the underlying core logic. 21
22 DSM for JEdit 22
23 Conformação Arquitetural 23
24 Problema A arquitetura [development view] de um sistema define: Como ele é estruturado em componentes Restrições sobre como tais componentes devem interagir A arquitetura documentada de um sistema se disponível geralmente não reflete a sua implementação real Desvios arquiteturais são comuns Geralmente, não são capturados e resolvidos Levam a fenômenos conhecidos como erosão e desvio arquitetural O processo de erosão arquitetural faz com que os benefícios proporcionados por um projeto arquitetural sejam anulados 24
25 Uma Solução Conformação arquitetural usando análise estática Hipótese: dependências inter-modulares impróprias são uma fonte importante de violações arquiteturais Contribuem para o processo de erosão arquitetural Exemplo Sistema organizado nas camadas M p, M p-1,..., M 0 Linguagens de programação não proveem meios para restringir dependências inter-modulares Modificadores de visibilidade (public, private, etc) não são suficientes 25
26 DCL Uma linguagem de domínio específico para restrição de dependência Permite que arquitetos definam dependências aceitáveis e inaceitáveis de acordo com a arquitetura planejada 26
27 Violações Arquiteturais Como resultado da verificação de uma restrição, os seguintes tipos de violação podem ser detectados: Divergência Quando uma dependência existente no código fonte viola uma restrição de dependência especificada Ausência Quando o código fonte não possui uma dependência que deveria existir de acordo com uma restrição de dependência especificada 27
28 Linguagem DCL Linguagem de domínio específico, declarativa e estaticamente verificável Objetivo: Permitir a definição de restrições estruturais entre módulos Definição de módulos: module View: org.foo.view.* module Model: org.foo.model.** module Remote: java.rmi.unicastremoteobject+ module Frame: "org.foo.[a-za-z0-9/.]*frame" 28
29 Linguagem DCL Resumo da sintaxe DCL para declaração de restrições de dependência para capturar divergências e ausências: 29
30 Exemplo module View: myapp.view.view+ module JavaAwtSwing: java.awt.**, javax.swing.** only View can-depend JavaAwtSwing Sintaxe da linguagem DCL próxima a linguagem utilizada pelos arquitetos Mais informações: Ricardo Terra; Marco Tulio Valente. A Dependency Constraint Language to Manage Object-Oriented Software Architectures. Software: Practice and Experience,
31 Ferramenta dclcheck Verifica se o código fonte respeita restrições de dependência definidas em DCL Implementada como plug-in para a IDE Eclipse Disponível em: 31
32 Sugestões de Projetos 1. Implementação de ferramenta para extração de DSMs (para Java ou outra linguagem) + Exemplo 2. Aplicação da linguagem DCL para detectar violações em um sistema Java não-trivial (idealmente de código aberto) 3. Implementação de DCL para outras linguagens estaticamente tipadas (exemplo: C# ou C++) + Avaliação 4. Implementação de DCL para linguagens dinamicamente tipadas (exemplo: Ruby ou Python; possivelmente como uma internal DSL ) + Avaliação 32
33 Sugestões de Projetos 5. Implementação de DCL para sistemas em Scala (provavelmente, como uma "internal DSL" também) + Avaliação 6. Extensão de DCL para componentes de granularidade mais fina. Exemplos: constituir módulos como "classes anotadas com X", "classes que dependem de Swing", etc. + Avaliação 7. Implementação de uma nova linguagem/solução para conformação arquitetural, possivelmente para um domínio e/ou arquitetura específica (exemplo: sistemas web) (ambicioso!) 8. Em um sistema legado com problemas de erosão arquitetural, analisar e caracterizar as refatorações necessárias para reverter esse processo (a exemplo do paper sobre remodularização do sistema bancário) 33
34 Parte III: MDA & DSL
35 Model-Driven Development 35
36 Model-Driven Development MDD shifts the development focus from code to models. MDD faces the substantial challenge of carrying models through to implementation MDD can help software development teams concentrate their efforts on modeling and generating much of the code needed 36
37 Principal Problema: Overselling 37
38 CFP é mais pé-no-chão O tema central do II WB-DSDM é a utilização de modelos dentro do processo produtivo de software. Entendemos por processo produtivo de software um conjunto de atividades inerentes à construção e à manutenção de um sistema de software. Neste contexto, modelos podem ser utilizados para, por exemplo, expressar requisitos, especificar testes, verificar propriedades dos modelos e gerar parcial ou integralmente código fonte 38
39 Steimann's verdict on MDD Models have their greatest value for people who cannot program. Unfortunately, this is not because models are more expressive than programs (in the sense that they are capable of expressing complex things in a simple manner) but because they oversimplify. To make a useful program (i.e., one that meets its users expectations) from a model, the model must be so complicated that people who cannot program cannot understand it, and people who can program would rather write a program than draw the corresponding model. 39
40 Steimann's verdict on MDD Even though (over) simplification can be useful sometimes, it is certainly not a sufficient basis for creating a satisfactory end product From: 40
41 Linguagens Específicas de Domínio 41
42 Linguagens Específicas de Domínio Linguagens para realizar uma tarefa específica: Procurar por uma string em um arquivo texto (grep, sed, awt) Realizar uma consulta em um banco de dados (SQL) Especificar um analisador léxico (Lex) Especificar um analisador sintático (Yacc) Desenhar um grafo (Graphviz) Especificar dependências de compilação (makefile) Especificar o layout de uma página Web (CSS) Objetivo: simplificar programação de tarefas específicas Linguagens de Próposito Geral vs Linguagens Específicas de Domínio DSL não são um conceito novo! Tendência recente: incentivar o uso de DSLs em vários sistemas 42
43 Domain-Specific Languages Martin Fowler, Addison-Wesley, 2011
44 Exemplo: Gothic Security Empresa que vende sistemas de segurança. Principal sistema: Permite ter um "compartimento secreto" em casas Compartimento é aberto após uma sequência de eventos Exemplo (Miss Grant): compartimento é aberto quando ela: fecha a porta do quarto abre uma gaveta liga uma luz Sistema inclui: sensores (que enviam mensagens) e controlador 44
45 Exemplo: Gothic Security Clientes podem "configurar" seus compartimentos secretos Família de sistemas: Reúsa componentes e comportamentos Mas com diferenças importantes Objetivo: Projetar esse sistema de forma a facilitar sua instalação 45
46 Miss Grant's Controller 46
47 Diagrama de Classes 47
48 Programming Miss Grant s Controller Event doorclosed = new Event("doorClosed", "D1CL"); Event draweropened = new Event("drawerOpened", "D2OP"); Event lighton = new Event("lightOn", "L1ON"); Event dooropened = new Event("doorOpened", "D1OP"); Event panelclosed = new Event("panelClosed", "PNCL"); Command unlockpanelcmd = new Command("unlockPanel", "PNUL"); Command lockpanelcmd = new Command("lockPanel", "PNLK"); Command lockdoorcmd = new Command("lockDoor", "D1LK"); Command unlockdoorcmd = new Command("unlockDoor", "D1UL"); State idle = new State("idle"); State activestate = new State("active"); State waitingforlightstate = new State("waitingForLight"); State waitingfordrawerstate = new State("waitingForDrawer"); State unlockedpanelstate = new State("unlockedPanel"); StateMachine machine = new StateMachine(idle); 48
49 Programming Miss Grant s Controller idle.addtransition(doorclosed, activestate); idle.addaction(unlockdoorcmd); idle.addaction(lockpanelcmd); activestate.addtransition(draweropened, waitingforlightstate); activestate.addtransition(lighton, waitingfordrawerstate); waitingforlightstate.addtransition(lighton, unlockedpanelstate); waitingfordrawerstate.addtransition(draweropened, unlockedpanelstate); unlockedpanelstate.addaction(unlockpanelcmd); unlockedpanelstate.addaction(lockdoorcmd); unlockedpanelstate.addtransition(panelclosed,idle); machine.addresetevents(dooropened); 49
50 Single library + multiple configurations Projeto permite separação entre: Código comum (máquina de estados) Código de configuração 50
51 Alternativa I: Configuração XML <statemachine start = "idle"> <event name="doorclosed" code="d1cl"/> <event name="draweropened" code="d2op"/> <event name="lighton" code="l1on"/> <event name="dooropened" code="d1op"/> <event name="panelclosed" code="pncl"/> <command name="unlockpanel" code="pnul"/> <command name="lockpanel" code="pnlk"/> <command name="lockdoor" code="d1lk"/> <command name="unlockdoor" code="d1ul"/> <state name="idle"> <transition event="doorclosed" target="active"/> <action command="unlockdoor"/> <action command="lockpanel"/> </state> <state name="active"> <transition event="draweropened" target="waitingforlight"/> <transition event="lighton" target="waitingfordrawer"/> 51
52 Alternativa I: Configuração XML Vantagem: Não precisa ser compilado. Novas instalações não requerem distribuição de novo JAR Cada vez, programamos mais em XML e menos em LPs Desvantagem: sintaxe 52
53 Alternativa II: DSL events doorclosed D1CL draweropened D2OP lighton L1ON dooropened D1OP panelclosed PNCL end resetevents dooropened end commands unlockpanel PNUL lockpanel PNLK lockdoor D1LK unlockdoor D1UL end state idle actions {unlockdoor lockpanel} doorclosed => active end state active draweropened => waitingforlight lighton => waitingfordrawer end state waitingforlight lighton => unlockedpanel end state waitingfordrawer draweropened => unlockedpanel end state unlockedpanel actions {unlockpanel lockdoor} panelclosed => idle end 53
54 DSL Externas e Internas Externas: DSL com uma sintaxe própria Internas: DSL que pega carona na sintaxe de uma LP 54
55 Exemplo de DSL Interna 55
56 Exemplo de DSL Interna 56
57 Exemplo de DSL Interna 57
58 Exemplo de DSL Interna 58
59 Modelo Semântico DSLs devem ser usadas para popular um modelo semântico Modelo semântico: representação de entidades do domínio 59
60 Modelo Semântico Modelo pode ser testado, analisado, estudado etc em separado Maior benefício: modelo bem planejado (e não a DSL em si) DSL é uma fachada para um modelo semântico do sistema alvo Processo de desenvolvimento: Primeiro passo: Modelo Segundo passo: DSL Comparação MDA/MDD: Semelhança: modelo é a parte central do projeto Diferença: não objetiva geração de código a partir do modelo 60
61 Language Workbenches Ambientes para facilitar a implementação de DSLs 61
62 Sugestões de Projetos 1. Sugestões anteriores envolvendo reimplementações de DCL 2. Implementação de uma DSL Escolher domínio e modelo semântico Usando XText 62
63 Arquitetura de Software para Aplicações Distribuídas 63
64 Middleware Desenvolver uma aplicação distribuída é mais difícil do que uma aplicação centralizada Problemas: comunicação, heterogeneidade, falhas, concorrência, segurança, escalabilidade etc Middleware: infra-estrutura de software que fica entre o sistema operacional e uma aplicação distribuída Objetivo: tornar mais simples o desenvolvimento de uma aplicação distribuída Ideia: oferecer abstrações de mais alto nível que tornem transparente detalhes de programação em redes Fazer com que programação distribuída seja semelhante a programação centralizada 64
65 Middleware Middleware e linguagens de programação: LP: escondem o hardware (registradores, instruções de máquina, modos de endereçamento, periféricos etc) Middleware: escondem a rede (endereços IP, portas, sockets, formato de mensagens, conexões, falhas etc) História sistemas de middleware: RPC linguagens estruturadas RMI, CORBA,.NET Remoting linguagens OO Web Services Web 65
66 RPC: Idéia Básica Cliente Servidor r= soma(x,y) float soma(x,y) { return x+y; } 66
67 RPC: Arquitetura Interna Cliente Servidor r= soma(x,y) (6) (1) float soma(x,y) { return x+y; } (3) (4) Stub Cliente float soma(x,y) { } (2) (5) Stub Servidor Questão fundamental: Quem gera os stubs? Evidentemente, geração manual não faz sentido 67
68 RPC: Arquitetura Interna Stubs são gerados automaticamente, por um compilador de stubs Entrada deste compilador: assinatura dos procedimentos remotos, em uma linguagem chamada XDR (External Data Representation) Genericamente, conhecida como linguagem para definição de interfaces Saída deste compilador: código fonte dos stubs client_stub.c arquivo XDR rpcgen server_stub.c 68
69 Java RMI Middleware para programação distribuída em Java Implementado como um pacote da linguagem 69
70 Serviços Web Extensão e adaptação do conceito de RMI para a Web Informações estruturadas, com interfaces bem definidas Principais padrões: HTTP, XML, SOAP, WSDL e UDDI Exemplo: serviço Web para obter cotação do dólar dolar= getdolar(); Mensagens SOAP + XML HTTP Servidor Web float getdolar() { } 70
71 SOA e SaaS Curso on-line de Berkley: Software Engineering for Software as a Service Professores: Armando Fox & David Patterson https://www.coursera.org/saas Aulas: 1.6 Software as a Service 1.7 Service Oriented Architecture 1.8, 1.9, 1.12 Cloud Computing, Fallacies and Pitfalls Livro: "Engineering Long-Lasting Software: An Agile Approach Using SaaS and Cloud Computing," Alpha Edition, by Armando Fox and David Patterson. 71
76 Sugestões de Projeto Desenvolvimento de um framework baseado nos princípios de Web Services / SOA / SaaS / Cloud Computing para desenvolvimento ou integração de aplicações em um domínio particular (e de preferência bem novo) Exemplos: smartphones, games, TV Digital, redes sociais etc Comparação entre frameworks (desenvolvimento de uma mesma aplicação em mais de um framework + comparação) 76
77 Exemplos de Papers Uma Arquitetura Orientada a Componentes para o Ginga, SBRC 2011 Middleware Baseado em Componentes e Orientado a Recursos para Redes de Sensores sem Fio, SBRC 2012 Model Driven RichUbi - A Model-Driven Process to Construct Rich Interfaces for Context Sensitive Ubiquitous Applications, SBES 2010 Para mais ideias: pesquisar papers no SBRC, SBES, SBCARS, WCGA 77
Software Architecture Conformance and Recovery
Software Architecture Conformance and Recovery Ricardo Terra terra@dcc.ufmg.br Marco Túlio Valente mtov@dcc.ufmg.br I Congresso Brasileiro de Software: Teoria e Prática, 2010 CBSOFT, 2010 Software Architecture