Prévia do material em texto
PARADIGMAS DE LINGUAGENS DE PROGRAMAÇÃO E-book 2 Bruno Zolotareff dos Santos Neste E-Book: INTRODUÇÃO ����������������������������������������������4 PROGRAMAÇÃO IMPERATIVA ��������������� 5 TIPOS COMPOSTOS ����������������������������������10 PROGRAMAÇÃO ORIENTADA A OBJETOS �������������������������������������������������������11 PROGRAMAÇÃO FUNCIONAL �������������� 14 PROGRAMAÇÃO IMPERATIVA VS PROGRAMAÇÃO DECLARATIVA ����������16 PROGRAMAÇÃO LÓGICA ������������������������17 PROGRAMAÇÃO ORIENTADA A EVENTOS ������������������������������������������������������18 PROGRAMAÇÃO CONCORRENTE �������20 GERENCIAMENTO DE PROJETOS DE SOFTWARE �������������������������������������������21 PROCESSOS DE PROJETOS ������������������ 25 PROCESSO DE GERÊNCIA DE PROJETOS ���������������������������������������������������26 ÁREAS DE CONHECIMENTO DO PMBOK ���������������������������������������������������������28 2 MÉTODO DE MELHORIA CONTÍNUA PDCA ������������������������������������������������������������29 PROJETO DE SOFTWARE E QUALIDADE ASSEGURADA ������������������ 33 DESENVOLVIMENTO DE SOFTWARE BASEADO EM COMPONENTES ����������������������������������������36 INTERFACES DE COMPONENTES �������38 ABSTRAÇÃO DE COMPONENTES ������ 40 MODELOS GENÉRICO DE PROCESSO DE SOFTWARE BASEADO EM COMPONENTES �������������41 IMPACTO DAS LINGUAGENS DE PROGRAMAÇÃO NA ENGENHARIA DE SOFTWARE ������������������������������������������47 CICLO DE VIDA �������������������������������������������51 FLUXO DE TRABALHO ��������������������������� 53 GESTÃO DE PROJETOS���������������������������56 CONSIDERAÇÕES FINAIS ����������������������59 SÍNTESE �������������������������������������������������������60 3 INTRODUÇÃO Desde o início, a programação tem passado por vá- rias modificações e adaptações de acordo com as necessidades industriais, comerciais e científicas. A evolução das linguagens gerou uma vasta esco- lha de linguagens a serem utilizadas em projetos de software. Entretanto, com o avanço da tecnolo- gia na área de linguagens de programação, muitos problemas de projetos têm aparecido em relação ao software. Os projetos de software começaram a exigir um alto nível de qualidade, assim, padrões de software e me- todologias foram surgindo baseados em melhoria contínua. Nesse sentido, a engenharia de software surgiu dada a preocupação com a qualidade do sof- tware e a padronização dos modelos e processos de desenvolvimento. Com isso, melhoraram-se as técnicas de programação e o entendimento dos pa- radigmas em aplicações de acordo com os objetivos. Neste módulo, estudaremos conceitos de aplica- ções com paradigmas de programação, proje- tos de software e o ciclo de vida no processo de desenvolvimento. 4 PROGRAMAÇÃO IMPERATIVA Em todas as linguagens de programação imperativas, um programa é entendido como uma sequência linear de instruções que o computador processa na sequência de- finida. O microcódigo especifica, no nível do processador, como o computador deve lidar com quais dados. Dessa forma, os comandos são usados para esse propósito, ou seja, para manipular o estado das áreas de memória que contêm dados para processamento ou saída. Esses dados geralmente são armazenados em variáveis para que possam mudar na sequência do programa. A ordem dos comandos determina a sequência de tempo no programa. Para implementar programas responsivos, há instruções de salto que alteram dinamicamente a sequência de instruções ordenada uma vez. De acordo com o paradigma imperativo, uma solução é dada: Quais passos individuais devem ser tomados um após o outro? Como as variáveis devem ser alteradas de modo que o resultado desejado saia no final? Em primeiro plano está a pergunta “como?” Programas imperativos são sequências ramificadas de instruções, as quais contêm atribuições que, quando executadas, alteram valores de variáveis e, portanto, o estado do programa. Os ramos no programa são decididos por condições através de variáveis. As funções parametrizadas são 5 usadas para abstrair os cálculos e chamá-los em di- ferentes pontos do programa. Por exemplo, considere uma função que resume os elementos de uma lista. Está escrito na linguagem C: int ListSum (IntList l) { int sum = 0; while (l != NULL) { sum = sum + l->val; l = l->next; } return sum; } Aqui, uma lista é representada por uma referência a um par de valores: um val inteiro e uma referência à lista restante. As atribuições no corpo do loop while adicionam o número val do elemento list de l à soma da variável e definem l para o próximo elemento. Essas instruções são iteradas desde que eu não aponte para a lista vazia. Em seguida, o valor da soma variável é retornado como resultado da chamada da função. O paradigma imperativo também é baseado na formu- lação clássica de algoritmos que especificam sequên- cias ramificadas de etapas que executam cálculos e atribuições a variáveis. O princípio estrutural abstrato da calculadora de von Neumann também corresponde ao paradigma im- perativo: um processador executa uma sequência 6 ramificada de instruções que alteram os dados na memória. A programação imperativa possui três aspectos ele- mentares: tipos, variáveis e valores. Esses elementos interagem com a composição do paradigma impera- tivo de programação. Visando a entendê-los melhor, vamos analisar o que cada um deles significa: ● Tipos: As regras de classificação das informações são agrupadas conforme seu tipo, e o tratamento das informações se dá de maneira categorizada de acordo com o domínio, senão haveria grandes dificul- dades para tratar as informações fora do escopo. Se não fosse esse tipo de agrupamento, cada informa- ção teria de ser tratada individualmente. Assim, os tipos podem ser três: primitivo, composto e recursivo. ● Variáveis: Os atributos são definidos dentro do escopo para a manipulação das informações, conhe- cidas como variáveis de programação; elas definem um valor temporário alocado na memória do compu- tador. Há diferentes tipos de variáveis dependendo da linguagem escolhida. ● Valores: Os valores das variáveis são atribuídos segundo o tipo declarado no escopo da linguagem de programação, as informações podem ser, por exemplo, nome de objetos, data de aniversário, peso de algo etc. Um conceito na programação de tipos Conforme abordado anteriormente, há tipos na pro- gramação imperativa, que são analisados a seguir: 7 ● Tipo Primitivo: É conhecido como atômico, sem subdivisão, possibilitando que cada linguagem de programação possa tratar os conceitos de seus do- mínios diferentemente, pois há arquitetura e supor- te para aplicações com objetivos diferenciados. A maioria utiliza em seus atributos os tipos declarados como boolean, int ou integer, real, char e enum. Existem linguagens cujos objetivos são voltados à área científica, como Fortran e C; ao passo que ou- tras são criadas para fins comerciais, como o Cobol. Salientamos, porém, que uma linguagem científica não é utilizada apenas em experimentos com fins acadêmicos, a aplicação comercial também utiliza essas linguagens de programação. Saiba mais Saiba mais sobre linguagens como o Fortran têm sido utilizadas na programação em foguetes, ao ler Desenvolvimento de um microfoguete para fotografias aéreas de pequeno formato (LOURE- DA, 2006), disponível em: http://www.bibl.ita.br/ xiiencita/mec_09.pdf. Acesso em: 03 ago. 2019. Esse tipo de linguagem é utilizado principalmente em aplicações matemáticas com tipos numéricos de precisão, como o Fortran. Tais linguagens trabalham basicamente com os tipos: inteiro e ponto flutuante. Não numéricos: Conhecidos principalmente no uso de estado verdadeiro ou falso, 0 e 1 (Boolean). 8 http://www.bibl.ita.br/xiiencita/mec_09.pdf http://www.bibl.ita.br/xiiencita/mec_09.pdf Caracteres com agrupamentos também são supor- tados, por exemplo ‘A’, ’U’, ‘a’...’u’. Além disso, utiliza- -se um sistemade gerenciamento das informações das variáveis. ● Alocação dinâmica: Os dados não precisam ser declarados sequencialmente no espaço da memó- ria, visto que a alocação ou desolação de blocos de memória pode ser feita automaticamente durante a execução. Nesse caso, não é preciso inserir infor- mações de modo ordenado. A C é um exemplo de linguagem que utiliza esse tipo de alocação. ● Enumeração: Este tipo oferece uma forma de agru- pamento de informações, sendo conhecido como constante de enumeração. Segue um exemplo em Java: Class enum dias {Dom, Seg, Terç, Qua, Qui, Sex, Sab;} 9 TIPOS COMPOSTOS É uma composição de diferentes tipos, primitivos ou não. Para entender melhor o procedimento deste tipo, vamos colocar um exemplo em C dessa composição: enum QuantidadeProduto { 1,2,3,4,5,6,7,8,9,10} enum CaixasProduto{caixa1, caixa2, caixa3, cai- xa4, caixa5} struct DadosP{ QuantidadeProduto q; CaixasProduto p } 10 PROGRAMAÇÃO ORIENTADA A OBJETOS A programação orientada a objetos é um paradigma desenvolvido com o princípio de trocar informações entre objetos. Teve início com a linguagem Simula 67, que mais tarde foi aperfeiçoada com o Smalltalk, considerada por muitos uma linguagem puramente orientada a objetos. Com o mesmo conceito, a linguagem C++ possui os elementos da orientação a objetos, mas não é uma linguagem puramente orientada a objetos. Trata-se de uma linguagem híbrida, com a qual é possível utilizar diferentes paradigmas. Entretanto, a programação orientada a objetos ficou mais conhecida com a linguagem Java por muitos motivos, especialmente sua portabilidade, escalabi- lidade e uso em aplicativo móveis e na Web. A programação orientada a objetos tem alguns pila- res: herança, polimorfismo, encapsulamento e abstra- ção. Praticamente, são utilizados classes e métodos com essa programação, a saber: ● Herança: considerada a propriedade mais impor- tante da programação orientada a objeto, a herança funciona como uma hierarquia das classes, ou seja, 11 uma classe herda as propriedades de outra, aumen- tando assim a reutilização de código. ● Polimorfismo: é uma classe que pode ter mais que uma característica, por exemplo, uma classe com o nome anfíbio herda as características de outras classes, como carro e barco. Possui a herança das propriedades. Podcast 1 ● Encapsulamento: os atributos privados ou pro- tegidos são acessados com os getters e setters, protegendo o estado das variáveis, em que o en- capsulamento é feito na construção do objeto ou instância da classe. ● Abstração: utilizada como uma classe genérica, é conhecida como uma superclasse ou classe abs- trata herdada por classes concretas. Utiliza-se para definição de entidades do mundo real. As classes em POO têm atributos, métodos e heran- ça. Recomenda-se que a herança seja feita por uma classe abstrata, como demonstrado na Tabela 1: 12 https://famonline.instructure.com/files/142261/download?download_frd=1 Classe Abstrata Classe Concreta Classe Principal public abstract class Auto { private String marca; private int ano; public void setMar- ca(String marca){ this.marca = marca; } public String get- Marca(){ return marca; } public void setA- no(int ano){ this.ano = ano; }public int getA- no(){ return ano; } public class Carro extens Auto { public void car- ro(){ this. setMarca(“VW”); this. setAno(2019); System.out.printl- n(“O carro é um: “ + this.getMarca() + “\n O ano do carro é: ” + this. getAno(); } } public class Principal{ public static void main(String[] args){ Carro car = new Carro(); car.carro(); } } Tabela 1: Classe abstrata, concreta e principal. Fonte: Elaboração própria. 13 PROGRAMAÇÃO FUNCIONAL Conhecida como um tipo de programação que utiliza funções matemáticas sem mudança de estado ou imutabilidade, a programação funcional é utilizada principalmente para multiprocessamento e aplica- ções matemáticas recursivas. Sua programação re- aliza-se com funções que chamam outras funções, conhecidas também como funções de alta ordem. Na tabela 2, temos alguns dos princípios desse tipo de programação: Programação Imperativa versus Declarativa São dois paradigmas de programação Mutable state São funções que dificilmente modificam seus valores, utili- zam funções matemáticas e recursividade. Funções como first- -class values São classes que podem ser utilizadas para manipular valo- res, possuem uma estrutura de dados apontada a funções. Higher-order functions É uma função que recebe outra função como argumento, tra- duzida como função de ordem maior. Side-effect-Free functions É um tipo de função que retorna os mesmos valores de entrada. 14 Lambdas e Closures São semelhantes a classes internas anônimas que podem ou não retornar valores. Recursividade É uma função que chama a si mesmo repetidamente, até a condição de parada. Lazy vs Eager Evalution O valor do cálculo já é conhe- cido antes de fazer alguma requisição. Gluing functions É um encadeamento de funções. Tabela 2: Princípios da programação funcional. Fonte: Elaboração própria. Apesar de haver várias linguagens de programação funcionais (Ruby, Lisp, Scala etc.), isso não quer dizer que uma única linguagem tenha todos os princípios mencionados anteriormente. A programação fun- cional, mesmo sendo um conceito antigo, é cada vez mais utilizada em empresas com linguagens como Scala, Google Guava e versões mais recente do Java 8. 15 PROGRAMAÇÃO IMPERATIVA VS PROGRAMAÇÃO DECLARATIVA São dois os paradigmas da programação. Na impe- rativa, declaramos os passos para o compilador que desejamos que sejam executados; já na declarativa, colocamos comportamentos e regras (Tabela 3): Programação imperativa Programação declarativa for(int i=0;i<30;++i){ if(i % 2 ==0){ System.out.println(i + “é ainda”); } } UnaryPredicate<Integer> isEven = new UnaryPredicate<Integer>() { public boolean test(Integer number) { return number % 2 == 0; } }; IntegerRange zeroToTen = new IntegerRange(0, 11); for(Integer number : zeroToTen. toCollection()) { if ( isEven.test(number) ) { System.out.println(number + “ is even”); } } Tabela 3: Programação imperativa e Programação declarativa.Fonte: Elaboração própria. A programação funcional é declarativa, pois não há muitas mudanças na criação das funções. Quando se altera algo, isso é feito com aplicação de recur- sividade. Entretanto, não há preocupação de alterar os valores internamente, ou seja, o termo mutable data se refere à estabilidade dos dados internos da função. 16 PROGRAMAÇÃO LÓGICA A programação lógica é um tipo de linguagem volta- do à lógica matemática. A primeira desse tipo foi o Planner, que é uma linguagem orientada a padrões voltados aos objetivos, além de ser bastante utili- zada para o uso da Inteligência Artificial. Desde o Planner, houve uma evolução de lingua- gens, entre as quais estão QA-4, QLISP, Mercury, Visual Prolog, Oz e Fill. Para entender o funcionamento de uma linguagem lógica, analise a Figura 1, na qual se pode observar o funcionamento das regras de acordo com a lógica: Figura 1: Exemplo de uso de programação lógica. Fonte: Adaptada de Álvares (s. d.). 17 PROGRAMAÇÃO ORIENTADA A EVENTOS Há pouco, estudamos que o modelo imperativo deter- mina a ordem de entrada dos dados. Diferentemente, as programações orientadas a eventos não contro- lam a sequência dos eventos de entrada, bem como são direcionadas a reagir a qualquer sequência ra- zoável de eventos. Esse tipo de paradigma utiliza laços de repetição de eventos, que recebem repetidamente a informação no processamento em que é disparada a resposta de acordo com o evento. O que determina a entrada são os eventos que envolve as funções. A seguir, temos alguns exemplos relacionados a eventos em programação: ● Clicar em botão com o mouse. ● Escolher uma opção no menu. ● Escrever em uma caixa de texto. ● Movimento de mouse. Na programação em Java, os tipos de eventosão definidos pelas subclasses da classe java.Awt.Event. Esses eventos são detectados pela classe que im- plementam a interface Listener (ouvinte), e para responder aos eventos sobre os métodos Handlers (manipuladores). 18 Os Handlers são implementados no Java dentro das classes Listeners, como na Figura 2: Figura 2: Exemplo de evento no Java.Fonte: Adaptada de Cáceres (s. d., p. 8). 19 PROGRAMAÇÃO CONCORRENTE A programação concorrente é um tipo de paradigma da programação que realiza a execução concorrente, ou seja, de maneira simultânea. A programação paralela ou multithreading está associada à linha de execução na mesma função. Em Java, o thread é utilizado com o pacote java.lang. Na sequência, estudaremos um código em Java com threads para gerar PDF e barra de progresso. O exemplo é uma representação da compilação de threading, visto que, na implementação, a intenção é gerar um arquivo PDF e uma barra de progresso (Tabela 4): Classe e métodos Implementação public class GeraPDF imple- ments Runnable { public void rodar () { // lógica para gerar o pdf... } } public class BarraDeProgresso implements Runnable { public void rodar () { // mostra barra de pro- gresso e vai atualizando ela... } } public class MeuPrograma { public static void main (String[] args) { GeraPDF gerapdf = new GeraPDF(); Thread threadDoPdf = new Thread(gerapdf); threadDoPdf.start(); BarraDeProgresso barraDeProgresso = new BarraDeProgresso(); Thread threadDaBarra = new Thread(barraDeProgresso); threadDaBarra.start(); } } Tabela 4: Exemplo do uso de threading.Fonte: Adaptada de Caelum (s. d.). 20 GERENCIAMENTO DE PROJETOS DE SOFTWARE Um projeto é um empreendimento com caracterís- ticas próprias que tem princípio e fim; é conduzido por pessoas e visa a atingir as metas estabelecidas dentro dos parâmetros de prazo, custo e qualidade (PMBOK, 2017). Trata-se de um empreendimento temporário, ou seja, um projeto que tem um ponto definido de início e fim, cujo objetivo é criar um pro- duto ou serviço distinto e único no sentido de que o produto do projeto possa se diferenciar de outros. Gerenciar consiste em “executar atividades e tarefas que têm como propósito planejar e controlar ativi- dades de outras pessoas para atingir objetivos que não podem ser alcançados caso as pessoas atuem por conta própria” (KOONTZ; O´DONNEL; WEINRICH, 2002). A gerência é um dos aspectos mais crítico em pro- jetos, pois sua ausência demonstra resultados não favoráveis para nenhuma organização que esteja executando ou planejando um projeto. A aplicação de conhecimentos, habilidades, ferramentas e técnicas em projetos visa a atingir ou até mesmo exceder às necessidades e expectativas dos clientes e demais partes interessadas do projeto (PMBOK, 2017). A gerência de projetos envolve muitas decisões: 21 ● Escopo, tempo, custo e qualidade. ● Diferentes necessidades e expectativas dos clien- tes e partes interessadas. ● Requisitos identificados (necessidades) e não iden- tificados (expectativas). Em geral, os projetos são gerenciados a partir de metodologias já utilizadas pelas empresas; não há um único modo de gerenciar, e sim melhores caminhos a seguir baseados em projetos anteriores. Sendo assim, os projetos de software possuem uma par- ticularidade: o primeiro passo para entender é que, mui- tas vezes, os projetos de software são caros e, às vezes, envolvem riscos às pessoas. É muito grande o risco de projetos de software darem errado, por esse motivo alguns guias e metodologias fo- ram criados com a finalidade de ajudarem esse processo de desenvolvimento de software. Um dos principais guias de gerenciamento de projeto é o Project Management Body of Knowledge (PMBOK), ou Corpo de conhecimento em Gerência de Projetos. Trata-se de um padrão internacional reconhecido pelas instituições IEEE e ANSI. A primeira versão do PMBOK foi publicada pelo Project Management Institute (PMI), ou Instituto de Gerência de Projeto, em 1987. Fundado em 1969, o PMI tinha como objetivo identificar as práticas de gerência em projetos. Apesar de esta disciplina não ser voltada ao Gerenciamento de Projetos, deve-se considerar o 22 desenvolvimento de softwares um projeto como ou- tro qualquer, mas com detalhes de engenharia que utilizam muitas normas, técnicas e metodologias. O PMBOK, para muitos, é o principal guia de projetos, por isso estudaremos mais sobre ele, abordando os sus detalhes e técnicas. Para projetos de software, foram lançadas algumas metodologias, que conhe- ceremos em breve. Para auxiliar esse processo de software, metodologias foram construídas. Nos Estados Unidos da América, foi elaborado o Capability Maturity Model (CMM), e depois modelos mais atualizados, como o People-CMM e o Capability Maturity Model Integration (CMMI). Na Europa, há um modelo semelhante ao CMMI dos Estados Unidos da América. O modelo é reconhecido como uma norma ISO/IEC 12207 e evoluiu para o ISO/ IEC 15504. Além desses métodos e normas, há outros que são utilizados em Projetos de Software. O CMMI foi elaborado principalmente pelas forças arma- das dos Estados Unidos junto com a National Aeronautics and Space Administration (Nasa). Na atualidade, muitos se preocupam com a Qualidade de Software para os pro- jetos. Tal preocupação surge principalmente com o ad- vento da internet, pois a área de Qualidade Assegurada é uma das mais importantes em Projetos de Software. Certamente, você já deve ter ouvido falar da área da qualidade e, no tocante a softwares, não é diferente. Conhecida como Quality Assurance (QA), ou Qualidade 23 Assegurada, é algo de grande importância para projetos internacionais. No Brasil, a Qualidade de Software é utilizada sobretudo em Projetos de Software de grande porte, de âmbito internacional com inúmeras exigências. Provavelmente, você já ouviu falar de testes de Software, uma vez que essa área faz parte da Qualidade Assegurada. Aqui, uma norma que está sendo muito recomendada é a ISO/IEC 27000, referente à segurança da informação. É uma norma que ainda está em construção. Não se preo- cupe, há diversas normas e métodos para você conhecer e aplicar em Projetos de Software. Há um guia especial para ser utilizado em software, o Software Engineering Body of Knowledge (SWEBOK), ou Corpo de conhecimento em engenharia de software. Você conhecerá um pouco sobre tais serviços voltados à tecnologia da informação, conhecida como ITIL e ISO/ IEC 2000. Há uma família de ISOs para se abordar,mas estudaremos as mais utilizadas em Projetos de Software. Você deve ter percebido que a Engenharia de Software está envolvida em todo o projeto que envolva software. Agora, você verá que os projetos de software e mode- los adotados surgiram dos primeiros modelos citados no PMBOK. Por isso, abordaremos como os primeiros modelos foram elaborados. Podcast 2 24 https://famonline.instructure.com/files/142264/download?download_frd=1 PROCESSOS DE PROJETOS Segundo o Project Management Body of Knowledge (PMBOK, 2017), um processo é uma série de ações que geram resultados. Os processos dos projetos são realizados por pessoas e normalmente se enquadram em duas categorias: ● Processos Orientados ao Produto, especificação e criação dos produtos do projeto. ● Processos da Gerência de Projeto, que relatam a descrição, a organização e o trabalho do projeto. 25 PROCESSO DE GERÊNCIA DE PROJETOS O processo de gerência de projetos é semelhante ao Plan, Do, Check, Act (PDCA), ou Planejar, Fazer, Checar e Agir, que segue o mesmo conceito de con- tinuidade e fases baseado no ciclo. Na Tabela 5, ob- servamos o funcionamento do processo de gerência de projetos do PMBOK. SAIBA MAIS Saiba mais sobre o Ciclo PDCA, visitando ht- tps://www.siteware.com.br/metodologias/ como-fazer-pdca-passo-a-passo/. Processos da Gerência de Projetos Processo de InicializaçãoReconhecer que um projeto ou uma fase deve começar e se comprometer com sua execução. Processo de Planejamento Planejar e manter um esquema de trabalho viável para atingir aqueles objetivos de negócio que determinaram a existência do projeto. 26 https://www.siteware.com.br/metodologias/como-fazer-pdca-passo-a-passo/ https://www.siteware.com.br/metodologias/como-fazer-pdca-passo-a-passo/ https://www.siteware.com.br/metodologias/como-fazer-pdca-passo-a-passo/ Processos da Gerência de Projetos Processo de Execução Coordenar pessoas e outros recursos para realizar o que foi planejado. Processo de Controle Assegurar que os objetivos do projeto estão sendo atingidos, através da monitoração e da avaliação do seu progresso, tomando ações corretivas quando necessárias. Processo de Finalização Formalizar a aceitação do projeto ou a fase e fazer o seu encerramento de forma organizada. Tabela 5: Cinco fases do processo de gerência do projeto. Fonte: PMBOK (2017). 27 ÁREAS DE CONHECIMENTO DO PMBOK O manual do instituto PMI é organizado em áreas de co- nhecimento, o PMBOK (2017) descreve cada uma dessas áreas através de processos, pois as áreas de conhecimen- to se referem a um aspecto a ser considerado dentro da gerência de projetos, em geral dividida em uma maneira clara de entender. O PMBOK é dividido em dez áreas de conhecimento e, no final do manual, há um glossário que descreve a função citada nos capítulos abordados (Tabela 6). Áreas de Conhecimento do PMBOK Qualidade Recursos Humanos Escopo Partes Interessadas Aquisições Integração Comunicações Custo Riscos Tempo Tabela 6: As dez áreas do conhecimento. Fonte: Adaptada de PMBOK (2017). 28 MÉTODO DE MELHORIA CONTÍNUA PDCA O método de melhoria contínua conhecido como Plan, Do, Check, Act, ou simplesmente PDCA, é utilizado por muitas corporações em todo o mundo. Assim, o método é muito útil em diversas áreas e tem sido adaptado de acordo com a necessidade da aplicação no desenvol- vimento de algum projeto. O conceito do método de melhorias PDCA foi original- mente desenvolvido na década de 1930 pelo cientista norte-americano Walter A. Shewhart e aperfeiçoado por William Edwards Deming para o ciclo PDCA de controle estatístico do processo, que pode ser repetido continua- mente sobre qualquer processo ou problema. As etapas do ciclo PDCA são interligadas com a finalidade de obter melhores resultados. Dessa forma, o planeja- mento tem controle de outras etapas do processo do ciclo de melhoria contínua (SOUZA; GOMES; SOARES; CONCILIO, 2019). No PMBOK, pode-se verificar o ciclo do PDCA adaptado em cinco fases nos processos em projetos (Figura 3): 29 ETAPAS DO CLICO Processos de Iniciação Processos de Planejamento Processos de Execução Processos de Controle Processos de Encerramento P A D C A Act C Check P Plan D Do Figura 3: Etapas do ciclo de vida de processo. Fonte: PMBOK (2017). No Manual de Qualidade Assegurada de Software, (SCHULMEYER, 2007, p. 70-73), relata-se que um paço importante é a utilização do ciclo PDCA em projetos de software. Weinstein e Vasovski (2004) definem cada etapa do ciclo PDCA baseados no mo- delo de Deming: Módulo Plan (Planejar): ● Plan – Identificação dos problemas: � Identificar os problemas a serem examinados. � Identificar um problema específico para entendê- -lo melhor. � Definir as metas mensuráveis e realizáveis. 30 � Identificar os interessados e desenvolver canais de comunicação. ● Plan – Análise de problemas: � Dividir o sistema global em processos individuais no mapa do processo. � Reunir potenciais pela causa do problema. � Coletar dados e identificar a raiz do problema. � Formular hipóteses. � Confirmar e rever o problema principal identificado. Módulo Do (Executar): ● Do – Desenvolver / Implementar soluções: � Estabelecer critérios de sucesso experimentais. � Delineamento experimental para testar hipóteses. � Obter a aprovação das partes interessadas e o apoio para a solução escolhida. � Implementar experimento / solução em uma base experimental ou piloto. Módulo Check (Verificar): ● Check – Avaliar os resultados: ● Reunir / analisar dados sobre a solução. ● Validar a hipótese. ● Check – Atingir o objetivo pretendido: ● Se SIM, ir para agir. 31 ● Se não, ir para planejar, hipótese revise / declaração do problema. Módulo Act (Atuar): ● Act – Implementar a solução de escala completa (e aproveitar as novas oportunidades): � Identificar as mudanças sistêmicas e necessida- des de formação para a plena aplicação. � Planejar o monitoramento contínuo da solução melhoria contínuo. � Procurar outras oportunidades de melhoria. 32 PROJETO DE SOFTWARE E QUALIDADE ASSEGURADA Ao desenvolver projetos, a segurança faz parte da qualidade do software, o que envolve fazer testes e o ciclo de vida. O PDCA faz parte do processo de maturidade na elaboração de software. A segurança do software em relação à sua qualidade está ligada a cada nível de maturidade descrito em modelos de referência, dentre eles citamos: ● ISO/IEC 15504, Capability Maturity Model – Integration (CMMI) e o modelo brasileiro MPS.BR. A qualidade de software é algo que se aplica no processo em que se definem os requisitos, utilizando métricas de melhoramento contínuo. Ainda, realizar as atividades de segurança da qualidade em cada escopo, que estão relacionadas ao projeto (PRESSMAN; MAXIM, 2016). A qualidade de software contém uma lista de requisi- tos, a saber: funcionalidade, confiabilidade, facilidade de uso, economia e segurança de uso. Em qualida- de extra: flexibilidade, manutenibilidade, adaptável, clareza, documentação e iteração em melhorias (SWEBOK, s. d.). Sendo assim, a qualidade de software pode ser definida segundo os procedimentos das normas citadas anterior- mente: ISO/IEC 9126-1, ISO/IEC 12207, ISO/IEC 15504, ISO/IEC 20000 e ISO/IEC 27000. Entretanto, cada projeto 33 possui seus próprios requisitos e políticas de qualidade e segurança do software. O projeto de software deve, então, ser visto como uma in- tegração de requisitos e procedimentos que contenham as melhores práticas da engenharia de software a fim de garantirem a qualidade de acordo com as necessidades do cliente (PRESSMAN; MAXIM, 2016). A construção de um produto de software é um projeto que demanda diversas áreas do conhecimento a serem aplicadas (PMBOK, 2017). No entanto, os procedimentos descritos na norma ISO/IEC 15504 descrevem os níveis de maturidade de um projeto e como cada processo de software é realizado conforme o ciclo de vida e as áreas de conhecimento de um projeto (BALDASSARRE; PIATTINI; PINO; VISAGGIO, 2009). Já o guia SWEBOK especifica e detalha as melhores prá- ticas da engenharia de software para o processo de de- senvolvimento de software, dividindo em dez áreas do conhecimento (SWEBOK, s. d.): ● Requisitos de Software ● Design de Software ● Construção de Software ● Teste de Software ● Manutenção de Software ● Gerenciamento de Configuração de Software ● Gerenciamento de Engenharia de Software ● Engenharia de Processo de Software 34 ● Ferramentas e Métodos de Software ● Qualidade de Software Assim, a gestão do projeto de software envolve diversos escopos que são desenvolvidos conforme a necessidade do produto. Cada projeto escolhe as metodologias apro- priadas para o desenvolvimento do software seguindo os parâmetros descritos como modelos das normas ISO em busca da segurança da qualidade. 35 DESENVOLVIMENTO DE SOFTWARE BASEADO EM COMPONENTES Na programação de software, são utilizadas técnicas de engenharia para o reaproveitamento de componentes que possuem funcionalidades lógicas definidas para a comunicação com o uso de interfaces. Na programação orientada a objetos, os componentes trocam informa- ções por mensagens de dados. Na Engenhar ia de Software Baseada em Componentes (ESBC), os requisitos são analisadoslevando em conta a arquitetura do software para um esquema de composição baseada em subconjuntos, em vez de serem construídos por técnicas convencio- nais, na qual o design da arquitetura é determinado. Nesse tipo de arquitetura, a abstração é utilizada na composição dos objetos, com o foco na produção de alto desempenho. Para garantir o baixo acoplamento entre as regras de negócio e os componentes, alguns princípios da programação orientada a objetos são adotados nas funcionalidades. A programação de componentes funciona como um provedor de serviços, cuja comunicação é realizada pe- las interfaces. Os componentes podem ser utilizados de muitas maneiras e, para entendermos melhor, um componente pode ter uma simples função matemática que pode ser requisitada. 36 O componente é requisitado de modo independente da linguagem de programação, por isso devemos conside- rá-lo como uma entidade executável. Esse tipo de arqui- tetura é utilizado principalmente em reúso, considerado um elemento-chave em diversos tipos de aplicações. Componentes utilizados no desenvolvimento possuem alguns benefícios, tais quais: ● Produção: economia de tempo no desenvolvimento de software. ● Robustez: qualidade na produção do software, devido a muitos componentes já serem testados, trazendo velocidade e confiança em projetos com escopo definido. ● Padronização: utilização de padrões na equipe de desenvolvimento orientado a regras de negócio dos componentes. 37 INTERFACES DE COMPONENTES Para entendermos melhor os componentes, vamos relembrar o conceito de interface, que é um contrato da classe com o exterior, ou seja, a assinatura da interface colabora com o comportamento da classe, padronizando os códigos implementados. Nos componentes, a interface estabelece os serviços prestados, a implantação física pode ser definida na integração dos componentes. Com esse tipo de serviço, é possível desenvolver um sistema em que os serviços são independentes da localização de seus componentes, cuja comunicação funciona via: ● Interface Provides: é a interface que fornece serviços do componente para outros componentes. ● Interface Requires: é a interface que define quais re- quisitos ficaram disponíveis para as suas funcionalidades. FIQUE ATENTO A programação por componentes é considerada complexa e nem sempre é a melhor solução. Para termos um melhor entendimento, analisare- mos dois exemplos de componentes com Provi- des e Requires na Figura 4. 38 Interface requires Interface provides Define os serviços do ambiente dos componentes usados pela interface Define os serviços fornecidos pelo componente para outros componentes sensorManagement sensorData sensorData removeSensor startSensor stopSensor testSensor initialise report listAll Coletor de dados Componente Interface requires Interface provides E X E M P LO IN T E R FA C E S Figura 4: Exemplo de uso provides e requires. Fonte: Masiero (s. d., p. 6). 39 ABSTRAÇÃO DE COMPONENTES ● Abstração funcional: sua única função é imple- mentada, pois pode ser uma aplicação simples, por exemplo, a conversão de dados de reais para dólar. ● Agrupamentos casuais: têm relações fracas entre os componentes, por exemplos, o uso de funções, conversão de dados, dentre outros. ● Abstrações de dados: utilizadas em classes de linguagens de programação orientadas a objetos, o componente é ilustrado como uma abstração. ● Abstração em clusters: classes abstratas contidas nos componentes que trabalham em conjunto. ● Abstração de sistema: trata-se de um sistema com- pletamente contido. 40 MODELOS GENÉRICO DE PROCESSO DE SOFTWARE BASEADO EM COMPONENTES Não há consenso do que deve fazer parte de um modelo de componentes, porém, algumas caracte- rísticas precisam ser definidas: os tipos de compo- nentes, formas de interação entre os componentes e o que deve ser definidos aos recursos. Na definição dos recursos, que é como os compo- nentes são ligados, os recursos podem ser providos por um framework ou uma ligação dos componentes, sendo que o modelo que disponibiliza quais com- ponentes estarão disponíveis (BACHMANN, 2000). Os modelos apresentam um conjunto de funções que se relacionam com um conjunto de componentes já existentes no sistema. Todo processo na modelagem precisa passar por algumas etapas até os sistemas serem desenvolvidos. Essas etapas são: ● Seleção: os componentes são pesquisados e ana- lisados visando a saber qual é o potencial de uso para o sistema. ● Qualificação: os requisitos selecionados são qua- lificados e testados de acordo com as necessidades de aplicação, como desempenho, confiabilidade e usabilidade (PRESSMAN; MAXIM, 2016). 41 ● Adaptação: a correção de conflitos para que os componentes possam ser utilizados no projeto. ● Composição: responsável pela integração dos com- ponentes no sistema que coordena os componentes e as realizações das tarefas. ● Atualização: nesta fase, os componentes podem ser substituídos ou atualizados por componentes com novas interfaces. Essas etapas podem ser conferidas na Figura 5: Seleção Qualificação Adaptação Composição Atualização Figura 5: Atividades do desenvolvimento com componentes. Fonte: (PRESSMAN; MAXIM, 2016). Observe que não há uma ordem nessas etapas, por- tanto, o que determina é a necessidade de acordo 42 com os requisitos do projeto. Para essa atividade, algumas tarefas são realizadas, conforme consta na Tabela 7. Item Descrição Especificações de requisitos Para esta fase, podem ser utiliza- dos modelos, sendo comparável ao modelo cascata. As funções e regras de negócios são estabelecidas por consulta aos usuários. Análise de componentes As especificações são implementa- das segundo os requisitos estabele- cidos, visto que nem sempre há uma combinação coerente, e as funcionali- dades são parcialmente utilizadas. Modificação de requisitos Os componentes são utilizados e modificados conforme a necessidade; caso não seja possível, outras alterna- tivas são realizadas. Projeto de sistema com reúso Faz-se ou projeta-se uma análise no software desde o início, as regras de negócio são baseadas nos compo- nentes existentes caso seja uma atua- lização do software ou reutilização de bases comuns. Desenvolvimento e integração Nesta fase, os softwares não compra- dos podem ser desenvolvidos, porém, pode ser feito uma integração com softwares conhecidos como comer- cial off-the-shelf (sistemas comerciais de prateleira). Validação O sistema é validado de acordo com os requisitos estabelecidos no projeto. Figura 6: Processos de software baseados em componentes. Fonte: Adaptada de Pressman e Maxim (2016). 43 O Processos de Software Baseado em Componentes identifica os requisitos e remove as incongruências da arquitetura. Para tanto, há dois processos envolvidos: engenharia de domínio e desenvolvimento baseado em componentes (DBC). A engenharia de domínio tem por objetivo a construção, classificação e liberação de um conjunto de componen- tes de software com as aplicabilidades para softwares existentes ou novos projetos. O DBC estabelece a construção e o controle dos estados dos componentes, que possuem cinco estágios: seleção, qualificação, adaptação, composição e atualização do componente (BROWN; SHORT, 1997). Na prática, um componente dificilmente é reutilizável e, mesmo assim, precisa de modificações, ou seja, de mu- danças para se adaptar aos novos projetos e estabelecer conexão com outros componentes (BOSCH, 1999). Para a adaptação de componentes segundo a engenharia de software, as aplicações mais conhecidas são: ● Encapsulamento de caixa-branca: a modificação é feita diretamente no código fonte, onde dificilmente é disponibilizada. Quando há necessidade de modificações de incompatibilidade, é necessário fazer adaptações, po- rém, neste caso, torna-se difícil o acesso ao código fonte. ● Encapsulamento caixa-cinza: a adaptação do códigoé feita com o uso de Interface de programação de apli- cações ou Interface de Programação de Aplicação, que possibilita o acerto de erros e conflitos. 44 ● Encapsulamento caixa-preta: neste caso, o código não fica exposto, e para sua adaptação é preciso utilizar interfaces nas condições de processamento. Como você já deve ter percebido, a programação por componentes apresenta diferenças de incompatibili- dade. Algumas técnicas de encapsulamento e empa- cotamento são utilizadas para adaptar as interfaces a uma nova versão com o requisito atualizado. Muitos componentes possuem falha na interação, há diversos fatores para ocorrerem erros e falta de compatibilidade, e as causas podem estar relaciona- das à plataforma do sistema e linguagem em que o componente foi desenvolvido. Tal fator é conhecido como heterogeneidade dos componentes. Para resolver essa situação de acoplamento de com- ponentes, desenvolveram-se algumas tecnologias de interação por camadas, ou seja, a ligação e a comu- nicação entre diferentes componentes se realizam por uma terceira base, conhecidas como tecnóloga de componentes. Algumas dessas tecnologias são: ● CORBA Component Model (CMM) do Object Management Group (OMG). ● Distributed Component Obejct (DCOM) e COM/ COM+ (Component Object Model) da Microsoft. ● JavaBeans e Entreprise JavaBeans (EJB). 45 SAIBA MAIS saiba mais sobre o Middleware, consultando Tec- nologias de Middleware, de Fernando Martins, que se encontra disponível em: https://www.gsd. inesc-id.pt/~ler/docencia/tm0607/slides/J2EE- -FernandoMartins.pdf. 46 https://www.gsd.inesc-id.pt/~ler/docencia/tm0607/slides/J2EE-FernandoMartins.pdf https://www.gsd.inesc-id.pt/~ler/docencia/tm0607/slides/J2EE-FernandoMartins.pdf https://www.gsd.inesc-id.pt/~ler/docencia/tm0607/slides/J2EE-FernandoMartins.pdf IMPACTO DAS LINGUAGENS DE PROGRAMAÇÃO NA ENGENHARIA DE SOFTWARE Como você já deve ter notado, até este momento as linguagens de programação foram surgindo de acor- do com as necessidades científicas e do mercado de trabalho. Voltando um pouco na história, vamos relembrar as linguagens e seus propósitos. A princípio, as linguagens se desenvolveram nos anos de 1960 e 1970, como a Fortran e Algol surgiram para fins matemáticos e, mais tarde, o Cobol para aplicação de negócios. Nessa época, as linguagens de programação evoluíam de acordo com o desenvol- vimento de hardware. Com o lançamento de sistemas compartilhados, houve uma grande dificuldade nessa fusão de grandes plataformas. Além disso, outros problemas de multiprocessamento e programação concorrente trouxeram grandes dificuldades para as empresas na época. Com diversas dificuldades, o assunto foi discutido abertamente em uma conferência na Alemanha em Garmisch-Partenkirchen, em 1968, onde se cunhou o nome engenharia de software. O termo e o que deve- ria ser levado em consideração não foram discutidos, assim, a indústria não levou muito em consideração e ainda demorou muito tempo para haver mudanças. 47 A evolução foi acontecendo aos poucos; cientistas como E.W. Dijkstra e C.A.R Hoare reconheceram a linguagem de programação como uma disciplina. Algumas de suas publicações, na época, influencia- ram as linguagens de programação, principalmente as estruturadas. Nesse contexto de mudanças e conceitos de lingua- gens de programação, houve um retrocesso no en- tendimento de linguagem de alto nível com o uso da linguagem C, a qual era muito utilizada no sistema operacional Unix. Os conceitos de abstração eram facilmente quebrados na linguagem C, e os termos discutidos na engenharia de software não eram sus- tentados. Porém, para muitos programadores, a lin- guagem C era considerada melhor que o Assembly. A linguagem C trazia muitos defeitos em relação à verificação de dados e sua consistência. As ma- trizes possuíam índices que não eram verificados, frustrando alguns princípios de qualidade referente à engenharia. Alguns anos depois, precisamente em 1985, surgiram a linguagem Ada e C++, em que muitos tentaram resolver os erros referentes à linguagem C, que é a abstração e a inconsistência de verificação de da- dos. Porém, ao invés de melhorar, para muitos piorou ainda mais a situação (DIJKSTRA, 1962). A complexibilidade na programação de computa- dores aumentou, com isso, poderosas estações de trabalhos individuais foram criadas. Alguns conceitos como Programação Orientada a Objetos (POO) foram 48 aceitos e, aos poucos, começaram a virar tendência de mercado. A engenharia de software praticamente surgiu em crises de software, complexibilidade nos projetos e adequações necessárias para fazer um software de qualidade. A palavra engenharia representa: criar, construir, analisar, desenvolver e melhoramento con- tínuo. A engenharia de software possui como base metodologias, modelos, normas e técnicas utiliza- dos no processo de desenvolvimento e projeto de software. Para acompanhar o desenvolvimento dessa disci- plina, observe os encontros e as iniciativas dessa evolução na Figura 6: Figura 7: Linha do tempo de eventos na Engenharia de Software. Fonte: Time Toast. Como observado na Figura 6, a POO teve uma gran- de evolução no desenvolvimento de software, pois houve praticamente um grande domínio no mercado por ser um paradigma de programação que cobre a 49 https://www.timetoast.com/timelines/historia-da-engenharia-de-software maioria das aplicações, porém, não é recomendada para todos os tipos. A POO apresenta problemas como qualquer outro paradigma, a sua ideia de utilização de objetos e pa- dronização dos códigos aplicando a Unified Modeling Language (UML) trouxe muitas vantagens nos pro- jetos. Vamos deixar bem claro que nem todas as linguagens de POO seguem bem os princípios da engenharia de software. Esses fatores foram decisivos para uma ou outra lin- guagem se destacar. A POO não é um princípio novo, e a UML trouxe vantagens aos projetos. Contudo, não é toda linguagem que adota o máximo possível dos padrões da UML. Além disso, a arquitetura de cada linguagem de programação é modificada para o me- lhor funcionamento seguindo regras dos fabricantes. SAIBA MAIS Saiba mais sobre a UML, assistindo a Unified Mo- deling Language, uma breve história, disponível em: http://www.dsc.ufcg.edu.br/~jacques/cursos/ map/html/uml/historia_uml/historia_uml.htm. 50 http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/uml/historia_uml/historia_uml.htm http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/uml/historia_uml/historia_uml.htm CICLO DE VIDA As tarefas envolvidas no desenvolvimento de softwa- res implicam atividades que pertencem aos proces- sos do ciclo de vida do software. O modelo escolhido para o desenvolvimento é o que determina como esse software será projetado. De acordo com a ISO/IEC 12207 (1998), o ciclo de vida é Estrutura contendo processos, atividades e tarefas envolvidas no desenvolvimento, ope- ração e manutenção de um produto de sof- tware, abrangendo a vida do sistema, desde a definição de seus requisitos até o término de seu uso. Não há um ciclo de vida ideal para todas aplicações, alguns projetos são adotados mais do que um tipo de ciclo de vida. O que de fato determina são os requisitos e as regras de negócio da aplicação. Os modelos mais conhecidos da engenharia de software estão descritos na Tabela 8: SAIBA MAIS Conheça a ISO/IEC 12207, acessando https:// www.dcce.ibilce.unesp.br/~ines/cursos/eng_ soft/2006/aula03_ISO_IEC.pdf. 51 https://www.dcce.ibilce.unesp.br/~ines/cursos/eng_soft/2006/aula03_ISO_IEC.pdf https://www.dcce.ibilce.unesp.br/~ines/cursos/eng_soft/2006/aula03_ISO_IEC.pdf https://www.dcce.ibilce.unesp.br/~ines/cursos/eng_soft/2006/aula03_ISO_IEC.pdf Modelos Descrição Cascata Primeiro modelo de gerenciamento de proces- sos de software, modelo sequencial, modelo com ênfase maior na análise de projeto. Não é iterativo, utilizado principalmente em projetos críticos e de alto custo, uma vez que apresentatodo o processo que pode ser iniciado do zero ou o projeto é abortado. Incremental Neste modelo, os escopos são agrupados em módulos, e as prioridades são validadas junto ao cliente. Utilizam como base o modelo cascata. Evolutivo Esse modelo é escolhido quando os requisitos não estão muito claros ou há faltas dele. Existe um desenvolvimento gradual, a partir de mo- delos anteriores, o desenvolvimento é atualizado em novas versões. RAD O modelo Rapid Application Development é incremental, utilizado para prototipagem rápida, o ciclo de vida não é curto e tem a duração entre 60 e 90 dias. Prototipagem Entende-se como desenvolver parte do projeto, como uma tela para ser apresentada e validada para o cliente. Serve principalmente para ter uma ideia de como ficaria essa parte, muitas vezes complexas, por apresentarem resultados mais imediatos em pouco tempo. Espiral Esse modelo é baseado em análise de riscos, onde cada iteração ou volta é analisado: viabili- dade do projeto, definição de requisitos, desen- volvimento e testes. Tabela 7: Modelos de ciclo de vida de software.Fonte: Devmedia. 52 https://www.devmedia.com.br/ciclos-de-vida-do-software/21099 FLUXO DE TRABALHO O workflow (fluxo de trabalho) em projetos de software normalmente é auxiliado por ferramentas Computer- Aided Software Engineering (Case), ou Engenharia de Software Assistida por Computador. Esse tipo de ferramenta faz parte da engenharia de software, não entenda como apenas um fluxo de trabalho simples, pois cada escopo definido representa as regras de negócios e os requsitos do sistema. Na programação orientada a objetos, uma das fer- ramentas mais utilizadas foi o Business Process Execution Language (BPEL), ou Linguagem de Execução de Processos de Negócios. Trata-se de uma ferramenta incrível que teve origem em empresas como Microsoft e IBM. Algumas dessas ferramentas disponibilizam os sistemas de orquestração, que inte- rage com os requisitos internos e externos do projeto de software. O BPEL tem uma definição para o fluxo entre serviços e lógica de acoplamento; para a orquestração, utiliza- -se a Web Service como base, ferramenta que pode ser visual, que é fácil de entender e interagir com o fluxo de trabalho. O BPEL utiliza a linguagem XML, é capaz de trabalhar com códigos e administrar as ta- refas a serem executadas em tempo real em projetos. Algumas dessas ferramentas são Microsoft BizTalk Server e Oracle Process Manager. Para você ter um entendimento melhor do BPEL, ob- serve a Figura 7, onde temos o BPEL na ferramenta 53 Oracle JDeveloper. Analise o workflow e as notações utilizadas no lado esquerdo da ferramenta. Figura 8: Exemplo BPEL no JDeveloper. Fonte: Elaboração própria. O BPEL é uma ferramenta muito interessante e com- plexa, praticamente uma evolução de alguns modelos da UML. Entretanto, é uma ferramenta utilizada mais ao nível de programadores, por ter funções avançadas. Alguns anos depois do BPEL, houve uma evolução da ferramenta para ser utilizada em fluxo de processos de negócio, essa ferramenta é o Business Process Model and Notation (BPMN). O BPMN tornou-se um padrão mundial no uso de fluxo de processos de negócios, uma vez que é considerado mais simples do que o BPEL; trouxe para a área de negócios uma integração de pessoas que não são da área de informática, mas que estão envolvidas em processos de negócio e seu fluxo de execução (LEYMANN, 2010). 54 O BPMN pertence a UML e, desde a versão 2.0, não teve muitas modificações; há ferramentas como o BizAge, SigNavio e plug-ins para serem utilizados no eclipse e outras plataformas de desenvolvimento. Uma das empresas com um vasto material para estu- do é a Camunda, que tem manuais e exemplos práti- cos envolvendo casos de uso para serem utilizadas como aprendizado. Além da própria OMG, que dispo- nibiliza gratuitamente manuais do BPMN (CHINOSI; TROMBETTA, 2012). É algo em que vale a pena investir e se especializar, pois faz parte da engenharia de sof- tware e compõe os projetos de qualidade. As notações são simples e há vários manuais disponíveis na Web. Como você pode perceber na Figura 8, o BPMN é mui- to semelhante ao BPEL: Figura 9: Exemplo de BPMN. Fonte: BGT Brasil. O BPMN é uma metodologia de fluxo de trabalho mui- to utilizada em projetos de software. Algumas ferra- mentas comerciais utilizam o BPMN como forma de monitorar todo o processo de negócio ou parte dele. 55 http://www.bgtbrasil.com/bpmn/ GESTÃO DE PROJETOS A gestão de projetos dependerá muito do propósito, se é uma inovação, se é uma atualização, integração ou outros fatores. A engenharia de software preocu- pa-se com todas as fases dos projetos de softwa- re, desde os processos envolvidos até os serviços prestados. O conhecimento de metodologias, normas e técnicas é muito importante em projetos de software de alto padrão, principalmente a nível governamental e inter- nacional, que deve obedecer às normas e métricas de qualidade assegurada. Países como Estados Unidos da América, Canadá, alguns europeus e outros desenvolvidos possuem ex- periência em projetos de software. No Brasil, não há uma cultura de software como na Índia, que discuta a matemática e a programação de computadores com a mesma efervescência como se debate sobre fute- bol. O Brasil vem utilizando metodologias e padrões internacionais para prestar serviços a empresas com níveis de maturidade muito altos. Infelizmente, esses métodos e normas na maioria das vezes não funcio- nam muito bem por questões culturais. O MPS.BR foi uma tentativa de montar um modelo parecido com o CMMI ou ISO/IEC 15504, porém, não foi largamente adotado pelas empresas e está lon- ge de ser uma realidade na gerência de software. O PMBOK, já citado anteriormente, é um guia do Project 56 Management Institute (PMI), mundialmente famoso e muito bem aceito em qualquer tipo de projeto. No entanto, você deve estar ciente quanto à realida- de do mercado brasileiro. O PMBOK vem servindo mais como um certificado para gerentes colocarem em seus currículos, provando seu conhecimento da teoria e as técnicas do guia, mas que não garante que vão conseguir gerenciar um projeto de software. Lembre-se de que as técnicas e metodologias podem auxiliar, mas você trabalha com pessoas que podem não estar interessadas nessas técnicas ou as utili- zam totalmente fora da realidade e do contexto do projeto em que você trabalha. No Brasil, desenvolvedores experientes que atuam na área de negócios já são considerados engenheiros de software, ainda que não possuam uma grande experiência nas diversas áreas. Você provavelmente participará de projetos de software com pessoas que não são da área da computação e que acham que sabem como funciona o projeto, porque já está definido em um papel. Além disso, você deve se preocupar com as pessoas envolvidas no projeto, pois, com toda certeza, o seu maior problema são os erros humanos. Os fatores humanos representam a maioria dos casos de fra- casso de todos os projetos. Por essa razão, saber escolher a equipe e trocar ou adquirir novos recursos é uma das funções do gerente de projetos. 57 O PMBOK possui as fases do processo que envolve um projeto e as dez áreas do conhecimento para você ter uma ideia do que precisa monitorar em um proje- to. Lembre-se de que, em um projeto de software, os acontecimentos são mais dinâmicos e há oportuni- dade de mudanças quando estas forem necessárias, dependendo de modelos escolhidos. Entretanto, al- gumas metodologias para gerenciamento de equi- pes em projetos de software apresentaram um bom resultado, mesmo aqui no Brasil, como é a adoção do SCRUM, XP e FDD, que são metodologias ágeis. Conhecer o negócio e as experiências faz a diferença na produção de software, pois um membro sênior (por exemplo um consultor) pode levar o projeto a outros níveis de maturidade, ao escolher os melhores caminhos e com menores chances de erro no projeto. 58 CONSIDERAÇÕES FINAISOs projetos de software requerem um conhecimento de normas e técnicas a fim de refinar a qualidade e melhorar as equipes que desenvolvem os softwares. Você deve ter notado que há uma evolução nos mo- delos de ciclo de vida voltados aos softwares, sendo que o gerenciamento de projetos exige muito mais que apenas programar. Além dos paradigmas de linguagem de programação, o impacto com a evolução das tecnologias levou a uma nova disciplina, a engenharia de software. O estudo da engenharia de software é considerado pri- mordial em qualquer projeto de grande importância, pois as técnicas e os métodos utilizados garantem um bom resultado em diversos tipos de projetos. Ademais, pudemos estudar que há ferramentas ca- pazes de ser utilizadas para acompanhar o fluxo de desenvolvimento ou acompanhamento de projetos, como BPEL e BPMN. Portanto, conhecer essas me- todologias é essencial para elas serem aplicadas em projetos que envolvam software. 59 SÍNTESE Fluxo de trabalho: • Fases que envolvem todos os processos de negócios no desenvolvimento. Gestão de projetos: • Área de conhecimento que precisa estar associado à engenharia de software como base nos processos envolvidos em projetos de software. Paradigmas de Linguagem de Programação Programação Imperativa; programação orientada a objetos; programação funcional; programação lógica; programação orientada a eventos; programação concorrente: • Conhecer a aplicação e qual é a ideia e o pensamento que envolvem a aplicação é muito importante para o desenvolvimento de software. Estudar os paradigmas e entender os conceitos melhorarão seu entendimento na programação. Gerenciamento de projetos de software: • Técnicas utilizadas para acompanhamento dos processos de software. A gerência de software deve estar muito envolvida com a qualidade e com os requisitos do projeto. Desenvolvimento de Software baseado em componentes: • Tipo de aplicação complexa e voltada ao reúso de software. Essa técnica requer um conhecimento de engenharia de software por ser complexo. Porém, a depender do tipo de projeto, pode ser eficaz e produtivo. Impacto das linguagens de programação na Engenharia de Software: • A evolução das linguagens de programação possibilitou a necessidade de criar e aplicar técnicas da engenharia para aumentar e padronizar a qualidade de software. Ciclo de vida: • Envolve os modelos de processos de desenvolvimento de software. Referências Bibliográficas & Consultadas ÁLVARES, A. R. Programação Lógica (Prolog): aula 11 (s. d.). Cefet-MG/Decom. Disponível em: ht- tps://homepages.dcc.ufmg.br/~rimsa/documents/ decom009/lessons/Aula11.pdf. Acesso em: 03 ago. 2019. BACHMANN, F. et al. Volume II: Technical Concepts of Component-Based Software Engineering. 2. ed. Technical Report of Software Engineering Institute, Carnegie Mellon University, may 2000. Disponível em: http://www.sei.cmu. edu/pub/documents/00.reports/pdf/00tr008.pdf. Acesso em: 05 ago. 2019. BALDASSARRE, M. T.; PIATTINI, M.; PINO, F. J.; VISAGGIO, G. Comparing ISO/IEC 12207 and CMMI-DEV: Towards a mapping of ISO/IEC 15504- 7. ICSE Workshop on Software Quality, Vancouver, BC, USA, 12 Jun. 2009. Disponível em: https://iee- explore.ieee.org/document/5071558. BOSCH, J. Superimposition: A component adap- tation technique. Information and Software https://homepages.dcc.ufmg.br/~rimsa/documents/decom009/lessons/Aula11.pdf https://homepages.dcc.ufmg.br/~rimsa/documents/decom009/lessons/Aula11.pdf https://homepages.dcc.ufmg.br/~rimsa/documents/decom009/lessons/Aula11.pdf http://www.sei.cmu.edu/pub/documents/00.reports/pdf/00tr008.pdf http://www.sei.cmu.edu/pub/documents/00.reports/pdf/00tr008.pdf https://ieeexplore.ieee.org/xpl/conhome/5061466/proceeding https://ieeexplore.ieee.org/document/5071558 https://ieeexplore.ieee.org/document/5071558 https://www.sciencedirect.com/science/article/pii/S0950584999000075 https://www.sciencedirect.com/science/article/pii/S0950584999000075 Technology, Elsevier, 25 mar. 1999. p. 257-273. Disponível em: http://citeseerx.ist.psu.edu/ viewdoc/download?doi=10.1.1.25.7736&rep=rep1&t ype=pdf. Acesso em: 10 ago. 2019. BROWN, A. W.; SHORT, K. On Components and Objects: The Foundation of Component- Based Development. International Symposiumn Assessment of Software Tools and Technologies. IEEE, Jul. 25 1997. p. 112-121. Disponível em: https://ieeexplore.ieee.org/document/599921/ authors#authors. Acesso em: 05 ago. 2019. CAELUM. Apêndice – programação concorrente e threads. In: Apostila Java e orientação a objetos (s. d.). Disponível em: https://www.caelum.com.br/ apostila-java-orientacao-objetos/apendice-progra- macao-concorrente-e-threads/. Acesso em: 05 ago. 2019. CÁCERES, S. Aplicações de Linguagem de Programação Orientada a Objeto – Eventos (s. d.). Disponível em: https://www.ic.unicamp. br/~ra100621/class/2017.2/ALPOO_files/aulas- Sheila/ALPOO5B-Eventos.pdf . Acesso em: 03 ago. 2019. CHINOSI, M.; TROMBETTA, A. BPMN: An intro- duction to the standard. Computer standards & Interfaces, vol. 34, n. 1, jan. 2012. p. 124-134. Disponível em: https://www.sciencedirect.com/ http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.25.7736&rep=rep1&type=pdf http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.25.7736&rep=rep1&type=pdf http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.25.7736&rep=rep1&type=pdf https://www.caelum.com.br/apostila-java-orientacao-objetos/apendice-programacao-concorrente-e-threads/ https://www.caelum.com.br/apostila-java-orientacao-objetos/apendice-programacao-concorrente-e-threads/ https://www.caelum.com.br/apostila-java-orientacao-objetos/apendice-programacao-concorrente-e-threads/ https://www.ic.unicamp.br/~ra100621/class/2017.2/ALPOO_files/aulasSheila/ALPOO5B-Eventos.pdf https://www.ic.unicamp.br/~ra100621/class/2017.2/ALPOO_files/aulasSheila/ALPOO5B-Eventos.pdf https://www.ic.unicamp.br/~ra100621/class/2017.2/ALPOO_files/aulasSheila/ALPOO5B-Eventos.pdf https://www.sciencedirect.com/science/article/abs/pii/S0920548911000766 science/article/abs/pii/S0920548911000766. Acesso em: 01 ago. 2019. DEITEL, P.; Deitel, H.; Java: Como Programar. 10. ed. São Paulo, Pearson Education do Brasil, 2016 [Biblioteca Virtual]. DIJKSTRA, E. W. Some critical comments on ad- vanced programming. Proc. IFIP Congress, Munich, Aug. 1962. KOONTZ, H.; O’DONNEL, C.; WEINRICH, H. Management of Education. 12. ed. Auckland: McGraw-Hill, 2002. LEYMANN, F. BPEL vs. BPMN 2.0: Should you care? In: International Workshop on Business Process Modeling Notation. Springer, Berlin, Heidelberg, p. 8-13, 2010. LOUREDA, O. B. Desenvolvimento de um microfo- guete para fotografias aéreas de pequeno formato. In: Anais do XII ENCITA 2006, ITA, out.-2006, p. 23- 26. Disponível em: http://www.bibl.ita.br/xiiencita/ mec_09.pdf. Acesso em: 03 ago. 2019. MANZANO, J. A. N. G. Algoritmos: lógica para de- senvolvimento de programação de computadores. 28. ed. São Paulo: Érica, 2016 [Biblioteca Virtual]. MANZANO, J. A. N. G. Java 7: programação de computadores: guia prático de introdução, orien- https://www.sciencedirect.com/science/article/abs/pii/S0920548911000766 http://www.bibl.ita.br/xiiencita/mec_09.pdf http://www.bibl.ita.br/xiiencita/mec_09.pdf tação e desenvolvimento. São Paulo: Érica, 2011 [Biblioteca Virtual]. MASIERO, P. C. Desenvolvimento de Software Baseado em Componentes. (s. d.). Disponível em: https://edisciplinas.usp.br/pluginfile. php/130351/mod_resource/content/1/DSBC_UML_ Components_1-2-3.pdf. Acesso em: 05 ago. 2019. MELO, A. C. V.; SILVA, F. S. C. Princípios de Linguagem de Programação. São Paulo: Edgard Blücher LTDA, 2003 [Biblioteca Virtual]. PACITTI, T. Paradigmas do software aberto. Rio de Janeiro: LTC, 2006 [Minha Biblioteca] PAULA FILHO, W. P. Engenharia de software: fun- damentos, métodos e padrões. 3. ed. São Paulo: Gen/LTC, 2009 [Biblioteca Virtual]. PERKOVIC, L. Introdução à computação usando Python: um foco no desenvolvimento de aplica-ções. Rio de Janeiro: LTC, 2016. PMBOK. PROJECT MANAGEMENT INSTITUTE. Guia de conhecimentos: um Guia do Conjunto em Gerenciamento de Projetos. 6. ed., 2017. PRESSMAN, R. S.; MAXIM, B. R. Engenharia de Software: uma abordagem profissional. 8. ed. Porto Alegre: McGraw-Hill, 2016 [Biblioteca Virtual]. https://edisciplinas.usp.br/pluginfile.php/130351/mod_resource/content/1/DSBC_UML_Components_1-2-3.pdf https://edisciplinas.usp.br/pluginfile.php/130351/mod_resource/content/1/DSBC_UML_Components_1-2-3.pdf https://edisciplinas.usp.br/pluginfile.php/130351/mod_resource/content/1/DSBC_UML_Components_1-2-3.pdf PROKOPEC, A. Learning Concurrent Programming in Scala. 2. ed. Packt Publishing Ltd, 2017. SBROCCO, J. H. T. C.; MACEDO, P. C. Metodologias ágeis: engenharia de software sob medida. São Paulo: Érica, 2012 [Biblioteca Virtual]. SCHACH, S. R. Engenharia de software: os para- digmas clássico e orientado a objetos. 7. ed. Porto Alegre: AMGH, 2010. SCHULMEYER, G. G. (Ed.). Handbook of Software Quality Assurance. 4. ed. Artech House, 2007. SEBESTA, R. W. Conceitos de linguagens de pro- gramação. 11. ed. Porto Alegre: Bookman, 2018. SOMMERVILLE, I. Engenharia de Software. 10. ed. São Paulo: Pearson Education do Brasil, 2018. SOUZA, M. A. F.; GOMES, M. M.; SOARES, M. V.; CONCILIO, R. Algoritmos e lógica de programação. 3. ed. Cengage, 2019 [Biblioteca Virtual]. SWEBOK. SOFTWARE ENGINEERING BODY OF KNOWLEDGE. Guide to the Software Engineering Body of Knowledge, 2004. Disponível em: https:// www.computer.org/education/bodies-of-knowled- ge/software-engineering/v3. Acesso em: 05 ago. 2019. https://www.computer.org/education/bodies-of-knowledge/software-engineering/v3 https://www.computer.org/education/bodies-of-knowledge/software-engineering/v3 https://www.computer.org/education/bodies-of-knowledge/software-engineering/v3 TUCKER, A. B.; NOONAN, R. E. Linguagens de Programação: Princípios e Paradigmas. 2. ed. McGraw-Hill, 2009. WEINSTEIN, J.; VASOVSKI, S. The PDCA Continuous Improvement Cycle. Cambridge: Massachusetts Institute of Technology (MIT) Leaders for Manufacturing Program, 2004. _Hlk15800520 _Hlk15776630 _Hlk15777465 _Hlk15778509 _Hlk15778190 _Hlk15803592 _GoBack _Hlk15780275 _Hlk15780401 _Hlk14755935 _Hlk15782314 _Hlk15798085 _Hlk15337061 Introdução Programação Imperativa Tipos compostos Programação Orientada a Objetos Programação Funcional Programação Imperativa vs Programação Declarativa Programação Lógica Programação Orientada a Eventos Programação Concorrente Gerenciamento de projetos de software Processos de Projetos Processo de Gerência de Projetos Áreas de Conhecimento do PMBOK Método de melhoria contínua PDCA Projeto de Software e Qualidade Assegurada Desenvolvimento de Software baseado em componentes Interfaces de componentes Abstração de Componentes Modelos genérico de processo de software baseado em componentes Impacto das linguagens de programação na Engenharia de Software ciclo de vida Fluxo de trabalho Gestão de projetos Considerações finais Síntese