• Nenhum resultado encontrado

I MPORTÂNCIA DO APRENDIZADO DE QUALIDADE DE ARQUITETURA DE SOFTWARE

APÊNDICE G DIFERENÇAS ENTRE ISO/IEC 9126-1 E ISO/IEC 25010

9. Apresentação de resultados: baseando-se nas informações coletadas nas

3.3 I MPORTÂNCIA DO APRENDIZADO DE QUALIDADE DE ARQUITETURA DE SOFTWARE

Aplicações de software modernas envolvem adaptabilidade, escalabilidade, interoperabilidade, distribuição e portabilidade. Conforme o tamanho e a complexidade das aplicações crescem, o problema do design ultrapassa o nível de complexidade dos algoritmos e das estruturas de dados da computação, englobando a organização dos diversos componentes que compõem o sistema, seus protocolos de comunicação, a divisão das funcionalidades entre os elementos do sistema, os mecanismos para a implementação dos requisitos não funcionais, entre outros (SHAW; GARLAN, 1996).

A escolha de estilos arquiteturais e a implementação entre diversas alternativas que satisfaçam os requisitos funcionais e não funcionais constituem o nível arquitetural de design (SHAW; GARLAN, 1996).

Os documentos Computer Science Curricula 2013 (ACM/IEEE-CS JOINT TASK FORCE ON COMPUTING CURRICULA, 2013) e Curriculum Guidelines for

Undergraduate Degree Programs in Computer Engineering (ACM/IEEE-CS JOINT

TASK FORCE ON COMPUTING CURRICULA, 2004), ambos propostos pela The

Joint Task Force on Computing Curricula e IEEE Computer Society - Association for Computing Machinery oferecem uma visão muito mais ampla de Engenharia de

Software, baseada em fundamentos teóricos e conceituais de várias disciplinas da Ciência da Computação e Engenharia de Computação.

A proposta dos documentos citados visa formar profissionais de computação que sejam capazes de relacionar a teoria com a prática, e as decisões arquiteturais com impactos na qualidade do sistema.

3.3.1 Currículo de Engenharia de Computação

Segundo o currículo proposto em conjunto por ACM/IEEE-CS Joint Task Force

on Computing Curricula (2004), Engenharia de Computação pode ser definida como a disciplina que incorpora a ciência e tecnologia de projeto, construção, implementação e manutenção de software e hardware de componentes de sistemas computacionais e sistemas controlados por computadores. Esse curso tem sido

tradicionalmente visto como uma combinação de Ciência da Computação e Engenharia Elétrica, porém tem evoluído ao longo das últimas três décadas como um curso à parte, mas ainda intimamente ligado à Ciência da Computação e Engenharia Elétrica. Engenharia de Computação possui bases solidamente fundamentadas nas teorias e princípios da computação, matemática, ciência e engenharia e aplica essas teorias e princípios para resolver problemas relacionados ao projeto de hardware, software, redes e processos.

De acordo com Cugnasca, Melnikoff e Camargo Jr. (2014) apud ACM/IEEE-CS JOINT TASK FORCE ON COMPUTING CURRICULA (2004), o currículo proposto, de um curso de Engenharia de Computação é composto por 18 matérias: algoritmos, arquitetura e organização de computadores, engenharia de sistemas de computadores, circuitos e sinais, sistemas de banco de dados, lógica digital, estruturas discretas, processamento digital de sinais, eletrônica, sistemas embarcados, interação humano-computador, redes de computadores, sistemas de programação, fundamentos de programação, probabilidade e estatística, tópicos sociais e profissionais, engenharia de software e projeto e fabricação de circuitos Very-

large-scale integration (VLSI). As disciplinas do curso contêm os conteúdos definidos

nas matérias, dessa forma, tópicos de uma matéria podem ser ministrados em uma ou mais disciplinas.

O currículo resultante proposto pelo ACM/IEEE-CS Joint Task Force on

Computing Curricula (2004) possui um balanceamento entre teoria e prática. Dessa

forma, os estudantes devem considerar um problema significativo e associá-lo a uma disciplina e, após resolver o problema, os alunos têm a oportunidade de mostrar sua capacidade para fornecer uma solução. Tipicamente, a solução deve envolver a concepção, projeto e implementação de algum projeto ou produto que contenha componentes de hardware e/ou software.

A experiência do projeto, muitas vezes, inclui equipes interdisciplinares, o que reflete as práticas da indústria. Idealmente, a experiência do projeto deve incorporar padrões de engenharia e restrições realistas para representar o que pode ocorrer em um ambiente real (ACM/IEEE-CS JOINT TASK FORCE ON COMPUTING CURRICULA, 2004).

Outro ponto importante é a experiência de laboratório, uma parte essencial do currículo de Engenharia da Computação. Como em qualquer currículo de engenharia, é importante que os alunos de Engenharia de Computação tenham oportunidades para observar, explorar e manipular características e comportamentos de dispositivos reais, sistemas e processos (ACM/IEEE-CS JOINT TASK FORCE ON COMPUTING CURRICULA, 2004).

Ainda segundo o currículo proposto pela ACM/IEEE-CS Joint Task Force on

Computing Curricula (2004), em disciplinas de laboratório, os alunos são motivados a

realizar atividades práticas, da natureza da engenharia, o que fornece uma base para outros elementos importantes da atividade prática. Trabalhos práticos em um ambiente de laboratório ajudam os alunos a desenvolver a confiança em sua capacidade técnica. Atividades de laboratório também deve incluir o uso de ferramentas e técnicas de simulação para projetar sistemas computacionais. A utilização de simuladores para modelar sistemas reais permite aos estudantes o estudo do comportamento de um sistema antes de implementá-lo.

Como complemento às habilidades técnicas, o aluno de Engenharia de Computação também deve aprender conhecimentos não técnicos associados com o processo de negócio (ACM/IEEE-CS JOINT TASK FORCE ON COMPUTING CURRICULA, 2004).

Os tópicos das disciplinas do curso de Engenharia de Computação que abordam conceitos relacionados à arquitetura de software e à qualidade de arquitetura de software foram listados na Tabela 2. Esses itens foram abordados diretamente ou indiretamente pelo roteiro de ensino e aprendizado proposto. Considerando-se o ensino de qualidade de arquitetura de software, os tópicos mais significativos para a elaboração do roteiro em cada disciplina foram sufixados com o símbolo [S], enquanto que os tópicos que podem ser considerados pré-requisitos para a aplicação do roteiro proposto neste trabalho foram sufixados com o símbolo [P].

Os detalhes das disciplinas listadas, contendo os tópicos ministrados em cada uma delas, encontram no Apêndice C.

Tabela 2 - Disciplinas do curso de Engenharia de Computação e respectivos tópicos que abordam conceitos relacionados à arquitetura de software e à qualidade de arquitetura de

software

Disciplina do Curso de

Engenharia de Computação arquitetura de software e à qualidade de arquitetura de software Tópicos das disciplinas que abordam conceitos relacionados à

Fundamentos de Programação

Análise e projeto orientados a objeto [P]

Programação orientada a eventos e programação concorrente [S] Padrões de Projeto [S]

Tratamento de Exceções [P]

Engenharia de Sistemas de Computação

Diferentes modelos de ciclos de vida: pontos fortes de cada um deles [S] Avaliação de diversas alternativas de projeto e como a escolha da estratégia de projeto afeta o sistema resultante [S]

Exemplos de trade-offs em sistemas computacionais [S] Elicitação de requisitos funcionais e não funcionais [S]

Abordagens para extração de requisitos funcionais e não funcionais [S] Quantificação dos requisitos não funcionais [S]

Conceitos de prototipação e simulação [S] Elementos qualidade em projetos de software [S] Importância do uso de padrões e referências [S] Modelos de maturidade, padrões e referências [S]

Diferentes abordagens de projetos de arquitetura de software: pontos fortes e fracos [S]

Testes de sistema e diagnostico de falhas [P] Tipos de manutenção: corretiva e evolutiva [P]

Natureza multidisciplinar associada ao desenvolvimento de sistemas computacionais [S]

Engenharia de Software

Construção de sistemas computacionais que satisfaçam os requisitos do usuário [S]

Ciclo de vida de um sistema de software [P]

Uso de técnicas de projeto de software em estágios iniciais da programação

[S]

Requisitos funcionais e não funcionais [S] Arquitetura de software [S]

Projeto para reutilização de software [S] Prototipação [S]

Técnicas de inspeção [S]

Uso de técnicas para medição para controle de qualidade do sistema em desenvolvimento [S]

Avaliação de ferramentas, métodos e abordagens mais adequadas para determinados cenários de desenvolvimento de software [S]

Verificação e validação [P] Uso de métricas [S] Fonte: Autor

3.3.2 Currículo de Ciência da Computação

De acordo com Shackelford et al. (2006), a Ciência da Computação possui uma vasta abrangência de conceitos, desde fundamentos teóricos de computação e

fundamentos de algoritmos ao desenvolvimento em áreas como robótica, visão computacional, sistemas inteligentes, bioinformática, entre outras.

Pelo currículo do curso de Ciência da Computação proposto no documento

Computer Science Curricula 2013 - Curriculum Guidelines for Undergraduate Degree Programs in Computer Science (ACM/IEEE-CS JOINT TASK FORCE ON

COMPUTING CURRICULA, 2013), um aspecto fundamental do curso é a compreensão da interação entre teoria e prática e os elos de ligação entre eles. Os graduandos devem entender como aplicar o conhecimento adquirido para resolver problemas reais, devendo ser capazes de projetar e melhorar um sistema baseado em uma avaliação quantitativa e qualitativa da sua funcionalidade, usabilidade e desempenho.

Os alunos devem considerar várias soluções para um determinado problema e entender que a seleção entre elas não é uma atividade puramente técnica, envolvendo aspectos de negócios, uma vez que estas soluções terão um impacto real na vida das pessoas. O graduado nesse curso também deve ser capaz de comunicar a sua solução para os demais colegas, incluindo o porquê e como uma solução resolve o problema e quais premissas foram assumidas.

O entendimento das diversas perspectivas de um sistema também faz parte da formação dos graduados de um programa de Ciência da Computação, que devem ser capazes de pensar em vários níveis de detalhe e abstração. Esse entendimento deve transcender os detalhes de implementação dos vários componentes computacionais, para abranger o nível de arquitetura de software e os processos envolvidos na sua construção e análise. Modelagem e simulação de sistemas reais também representam um conhecimento essencial para cientistas da computação para avaliação de comportamento de sistemas e validação de modelos.

Para garantir que os graduados possam aplicar com sucesso o conhecimento que adquiriram nas disciplinas, todos egressos dos programas de Ciência da Computação devem ser envolvidos em pelo menos um projeto substancial. Na maioria dos casos, essa experiência deveria ser um projeto de desenvolvimento de software, que possa desafiar os alunos, envolvendo aspectos de avaliação de diversas alternativas técnicas, cada uma com seus respectivos trade-offs. Dessa forma, os

estudantes têm a oportunidades para desenvolver suas habilidades interpessoais de comunicação como parte de sua experiência do projeto.

Os tópicos das disciplinas do curso de Ciência da Computação que abordam conceitos relacionados à arquitetura de software e à qualidade de arquitetura de software foram listados na Tabela 3. Esses itens foram abordados diretamente ou indiretamente pelo roteiro de ensino e aprendizado proposto. Considerando-se o ensino de qualidade de arquitetura de software, os tópicos mais significativos para a elaboração do roteiro em cada disciplina foram sufixados com o símbolo [S], enquanto que os tópicos que podem ser considerados pré-requisitos para a aplicação do roteiro foram sufixados com o símbolo [P].

Os detalhes das disciplinas listadas, contendo os tópicos ministrados em cada uma delas, encontram no Apêndice C.

Tabela 3 - Disciplinas do curso de Ciência da Computação e respectivos tópicos que abordam conceitos relacionados à arquitetura de software e à qualidade de arquitetura de software

Disciplina do Curso de Ciência da Computação

Tópicos das disciplinas que abordam conceitos relacionados à arquitetura de software e à qualidade de

arquitetura de software

Linguagens de Programação

Análise e projeto orientados a objeto [P]

Programação orientada a eventos e programação concorrente [S]

Tratamento de exceções [P] Fundamentos de Desenvolvimento de

Software

Conceitos de especificação de requisitos de software [S] Programação defensiva [S]

Revisão de código [S]

Fundamentos de testes e geração de testes [P]

Ciência computacional Ferramentas e técnicas de simulação [S]

Engenharia de Software

Introdução a modelos de processos de software (cascata, incremental e ágil) [P]

Conceitos de qualidade de software [S] Modelos de maturidade de software [S] Métricas de processo de software [S]

Ferramentas para testes estáticos e dinâmicos [P] Elicitação de requisitos funcionais e não funcionais [S] Requisitos não funcionais e seu relacionamento com qualidade de software [S]

Aceitabilidade de certezas/incertezas relacionadas a sistemas de software e seu comportamento [S]

Prototipação [S]

Validação de requisitos [S]

Princípios de projeto de sistemas, níveis de abstração (projeto arquitetural e projeto detalhado) [S]

Padrões de Projetos [S]

Projeto de atributos de qualidade: eficiência, desempenho, tolerância a falha, funcionalidade, confiabilidade [S]

Medição e análise da qualidade do projeto [S]

Trade-offs entre diferentes aspectos de qualidade [S]

Mecanismos para construção de sistemas de software com qualidade [S]

Verificação e validação [P] Inspeções [S]

Papéis e responsabilidades em uma equipe de desenvolvimento de software [S]

Resolução de conflitos em times [S] Fonte: Autor

3.4 REQUISITOS PARA O ENSINO DE QUALIDADE DE ARQUITETURA DE SOFTWARE