Baixe o app para aproveitar ainda mais
Prévia do material em texto
Engenharia de Software Wagner Sanchez W agner Sanchez Engenharia de Softw are Fundação Biblioteca Nacional ISBN 978-65-5821-067-2 9 786558 210672 Código Logístico I000358 Engenharia de Software Wagner Sanchez IESDE BRASIL 2021 © 2021 – IESDE BRASIL S/A. É proibida a reprodução, mesmo parcial, por qualquer processo, sem autorização por escrito do autor e do detentor dos direitos autorais. Projeto de capa: IESDE BRASIL S/A. Imagem da capa: garagestock/shutterstock Todos os direitos reservados. IESDE BRASIL S/A. Al. Dr. Carlos de Carvalho, 1.482. CEP: 80730-200 Batel – Curitiba – PR 0800 708 88 88 – www.iesde.com.br CIP-BRASIL. CATALOGAÇÃO NA PUBLICAÇÃO SINDICATO NACIONAL DOS EDITORES DE LIVROS, RJ S195e Sanchez, Wagner Engenharia de software / Wagner Sanchez. - 1. ed. - Curitiba [PR] : Iesde, 2021. 106 p. : il. Inclui bibliografia ISBN 978-65-5821-067-2 1. Engenharia de software. 2. Software - Desenvolvimento. 3. Progra- mação orientada a objetos (Computação). 4. UML (Computação). I. Título. 21-74615 CDD: 005.1 CDU: 004.41 Wagner Sanchez Doutor e mestre em Engenharia Biomédica pela Universidade Mogi das Cruzes (UMC), especialista em Inteligência Artificial pela Pontifícia Universidade Católica de Campinas (PUC-Campinas), psicopedagogo pela Pontifícia Universidade Católica de São Paulo (PUC- SP), pós-graduado em Engenharia de Software pela Universidade São Judas Tadeu (USJT) e bacharel em Análise de Sistemas pela Universidade Paulista (UNIP). Possui formação em Leadership & Innovation pelo Massachusetts Institute of Technology (MIT) e, também, no Entrepreneurship Program, na Babson College. Tem mais de 25 anos de experiência em docência e consultoria nas áreas de tecnologia, inovação e educação. É autor da primeira coleção digital cognitiva voltada à educação maker e ao desenvolvimento do pensamento computacional para alunos do Ensino Fundamental, além de mais de oito livros publicados nas áreas de inovação, gestão, tecnologia e educação. Atua como pró-reitor acadêmico, professor, escritor e pesquisador. Agora é possível acessar os vídeos do livro por meio de QR codes (códigos de barras) presentes no início de cada seção de capítulo. Acesse os vídeos automaticamente, direcionando a câmera fotográ�ca de seu smartphone ou tablet para o QR code. Em alguns dispositivos é necessário ter instalado um leitor de QR code, que pode ser adquirido gratuitamente em lojas de aplicativos. Vídeos em QR code! SUMÁRIO 1 A importância da engenharia de software 9 1.1 O que é um software? 10 1.2 A evolução do hardware e software 12 1.3 A engenharia de software 22 1.4 A importância do design de software 25 2 Ciclo de vida do software 30 2.1 Ciclo de vida do software 31 2.2 Levantamento de requisitos 33 2.3 Análise e projeto 37 2.4 Implementação e testes 39 2.5 Implantação e manutenção 44 3 Orientação a objetos 51 3.1 Orientação a objetos 53 3.2 Classes e objetos 53 3.3 Abstração 56 3.4 Encapsulamento 57 3.5 Polimorfismo 60 3.6 Herança 61 4 UML – Unified Modeling Language 66 4.1 UML 66 4.2 Os diagramas da UML 68 4.3 Diagrama de atividades 68 4.4 Diagrama de classe 70 4.5 Diagrama de objetos 73 4.6 Diagrama de sequência 75 5 Diagrama de caso de uso 81 5.1 Diagrama de caso de uso 82 5.2 Cenário 83 5.3 Ator 84 5.4 Relacionamentos 85 5.5 Caso prático 87 Resolução das atividades 101 Agora é possível acessar os vídeos do livro por meio de QR codes (códigos de barras) presentes no início de cada seção de capítulo. Acesse os vídeos automaticamente, direcionando a câmera fotográ�ca de seu smartphone ou tablet para o QR code. Em alguns dispositivos é necessário ter instalado um leitor de QR code, que pode ser adquirido gratuitamente em lojas de aplicativos. Vídeos em QR code! Com as transformações digitais que estão ocorrendo nas organizações, a necessidade por desenvolvimento de software segue um crescente sem precedentes e sem sinais de desaceleração. As evoluções exponenciais das tecnologias estão destravando outras tecnologias e, por consequência, oportunidades de soluções computacionais corporativas nunca pensadas, sempre buscando alavancar diferenciais competitivos. A engenharia de software dá suporte para que profissionais de TI, usuários e gestores possam empregar seus esforços de maneira eficiente na construção de soluções, com mais assertividade e, ao mesmo tempo, com menos recursos. Esta obra entregará todos os recursos para os envolvidos no desenvolvimento de softwares, durante todas as fases de construção das soluções, combinando métodos, melhores ferramentas e técnicas, para que a garantia da qualidade seja alcançada com excelência. APRESENTAÇÃOVídeo A importância da engenharia de software 9 1 A importância da engenharia de software Com o estudo deste capítulo, você será capaz de: • compreender a definição de software; • entender as características de sistemas computacionais; • conhecer a evolução do hardware e do software ao longo dos anos e sua relação com o momento atual; • compreender a origem da engenharia de software; • reconhecer a importância do design de softwares. Objetivos de aprendizagem A engenharia de software começa quando há uma demanda por de- terminado resultado ou solução para problemas corporativos. De algum lugar da equipe de TI, normalmente do CIO, vem uma solicitação feita ao desenvolvedor para criar algum tipo de software. Mas como os desenvolvedores sabem o que colocar em seu software? Eles dividem em necessidades específicas após conduzir entrevistas, cole- tar informações, examinar o portfólio de aplicativos existente e conversar com líderes de TI. Em seguida, constroem um roteiro de como elaborar o software. Essa é uma das partes mais essenciais, pois muito do “trabalho” é concluído durante esse estágio, o que também significa que quaisquer problemas normalmente ocorreram aqui. O verdadeiro ponto de partida é quando os desenvolvedores come- çam a escrever código para o software. Em muitos casos, essa é a etapa mais longa do processo, pois o código precisa ser congruente com os sistemas atuais e a linguagem usada. Infelizmente, esses problemas nor- malmente não são percebidos até muito mais tarde no projeto, logo, o retrabalho precisa ser concluído. 10 Engenharia de Software Para evitar retrabalhos e desperdícios existem os conceitos de en- genharia de software, que busca entregar um produto de acordo com as necessidades do usuário, sendo altamente confiável, eficiente e efi- caz na sua proposta. Embora a engenharia de software possa levar a produtos que não cumprem isso, eles quase sempre voltam ao estágio de produção (SOMMERVILLE, 2011). Neste capítulo exploraremos como essa engenharia pode otimizar a produção de softwares, trazendo um maior valor agregado com um me- nor custo de desenvolvimento. 1.1 O que é um software? Vídeo Software é uma sequência de instruções escrita por um programador em linguagem de programação, informando a um computador como se comportar ou executar uma tarefa específica (ENGHOLM, 2010). O software geralmente vem na forma de programas comerciais, como Microsoft Word, Excel, PowerPoint e Adobe Photoshop, jogos, sis- temas operacionais de computador, celulares ou até mesmo malware, como vírus e ransomware. Qualquer programa ou código executado em um computador é um exemplo de software, e qualquer coisa que façamos com um computa- dor requer um software. Este é criado por programadores de computa- dor, comumente chamados de desenvolvedores de softwares. Os três principais tipos de software são: de sistema operacional, de aplicação e de desenvolvimento. O sistema operacional controla o funcionamento interno do computador e os periféricos, como mo- nitores, impressoras e equipamentos de armazenamento de dados (PFLEEGER, 2007). Sem um sistema operacional como o Windows ou o MacOS, um computador é apenasum conjunto de componentes de hardware inca- pazes de executar qualquer função. A importância da engenharia de software 11 O sistema operacional permite que o computador execute funções básicas, fornecendo uma interface para que os usuários interajam com ele e uma plataforma na qual os aplicativos sejam executados. O sistema “abstrai” muitas tarefas comuns para aplicativos a fim de minimizar a re- dundância. Por exemplo, oferece impressão como um serviço para aplica- tivos, de modo que cada programa não precisa ter sua própria maneira de enviar arquivos para a impressora. Nesse grupo temos o firmware, um tipo de software semipermanen- te, apresentado por muitos dispositivos e componentes, que informa ao dispositivo como se comportar e interagir com outros dispositivos. Frequentemente, pode ser atualizado, mas persiste quando não há ali- mentação aplicada ao dispositivo. Os drivers de dispositivo também pertencem ao grupo dos softwares de sistemas operacionais. São pequenos programas que permitem a comunicação entre o sistema operacional e os componentes do com- putador. Cada componente precisa de um driver para que o sistema saiba como usar o dispositivo. Praticamente todos os componentes de um computador, incluindo placa de vídeo, chip de som, teclado e mou- se, têm seus próprios drivers. Para finalizar, vale ressaltar os utilitários, programas que geralmen- te vêm com o sistema operacional ou integram-se totalmente a ele – como software antivírus, de limpeza de disco rígido e ferramentas de compactação de arquivo – para executar tarefas específicas. Já o software de aplicação indica ao computador quais tarefes devem ser executadas para atender às demandas do usuário para determinada necessidade. Nesse grupo estão processadores de texto, planilhas, gerenciamento de banco de dados, inventário e programas de contas a pagar, folha de pagamento, controle de estoque e muitas outras aplicações corporativas e pessoais. Os jogos e o software de multimídia são aplicativos populares (a câ- mera do telefone é um aplicativo, assim como o Adobe Photoshop, usa- do para editar gráficos e fotos). Os navegadores da web também estão entre os aplicativos de software mais comuns. Por fim, o terceiro grupo são os softwares de programação. Não deve ser surpresa que um software seja criado com outro software. Os codificadores contam com várias ferramentas diferentes para criar programas (HIRAMA, 2011). 12 Engenharia de Software A seguir estão alguns exemplos de programas usados por codifica- dores durante o desenvolvimento de software. Compiladores: programas que convertem o código escrito por humanos em forma de código de máquina de nível inferior que pode ser interpretado diretamen- te pelo hardware do computador. A existência de compiladores torna prático criar um software extre- mamente sofisticado. bs d/ sh ut te rs to ck Linkers: programas que pegam a saída de um compi- lador, geralmente muitos arquivos individuais, e com- binam em um único arquivo executável, que pode ser executado por um usuário sem a necessidade de um ambiente de programação. bs d/ sh ut te rs to ck Depuradores: programas de computador usados para testar e “depurar” (localizar e remover erros) o código do computador.bsd /s hu tte rs to ck A seguir exploraremos a evolução dos hardwares e softwares ao longo dos anos para compreender a importância da engenharia de software e as transformações que impactam atualmente as nossas vi- das e a das empresas. 1.2 A evolução do hardware e software Vídeo Um engenheiro de softwares deve estar apto a trabalhar com todos os segmentos envolvendo a tecnologia da informação (TI), ou seja, ser capaz de atuar em todos os vértices da pirâmide que define um sistema de informação: pessoas, hardware e software. Isso significa que esse profissional precisa entender de hardwares, ser capaz de especificá-los e implementá-los e fazer a sua manutenção. Tam- bém deve desenvolver e instalar softwares e fazer a manutenção deles. Começaremos nosso caminho rumo ao entendimento das máquinas, dos softwares e do comportamento humano que têm moldado e defini- do o presente e que, certamente, continuarão a fazê-lo no futuro. A importância da engenharia de software 13 O computador surgiu essencialmente como uma ferramenta de trabalho. Era utilizado por bancos, instituições financeiras, governos, exércitos e cientistas para a execução, em tempo hábil, de cálculos en- volvendo uma grande quantidade de valores ou operações. Porém, na década de 1970, como veremos mais adiante, essas máquinas passa- ram a ser adquiridas por pessoas não ligadas a essas áreas para, além do trabalho, serem usadas para diversão, aprendizagem, comunicação e muitas outras coisas (VELLOSO, 2014). Há algum tempo, os computadores são muito mais do que máqui- nas presentes em algum cômodo específico das casas ou dos escritó- rios; eles nos acompanham na forma de um celular, monitoram nossa vida na forma de uma geladeira inteligente, nos levam para lugares na forma de um carro autônomo, nos divertem na forma de um console de videogame, entre muitas outras coisas. Um bom engenheiro de software pode, entre outras atribuições, ser destacado para a função de programador de computadores ou gerenciador do parque de computadores de uma empresa. Assim, como podemos observar, para um profissional de TI, o computador, mais do que uma ferramenta de trabalho, confunde-se com a própria razão de sua existência. Em função disso, começaremos com um histórico da evolução dos computadores. Perceberemos que determinados elementos presentes nas primeiras máquinas ainda fazem parte das mais atuais e, provavel- mente, estarão presentes nas do futuro. Embora às vezes tenhamos uma impressão contrária a isso, na atualidade, quase todas as pessoas, desde a infância, são capazes de executar operações aritméticas básicas, mas nem sempre foi assim. Houve uma época na história que pouquíssimas pessoas tinham essa formação, a ponto de ela confundir-se com uma habilidade. As pessoas que dominavam aritmética eram aproveitadas pelo comércio, pelos bancos e pelas empresas. Com o aumento exponencial das atividades que exigiam forma- ção matemática e o crescimento em escala inferior das pessoas que a tinham, inventores debruçaram-se na solução desse problema, isto é, desenvolver uma máquina capaz de permitir que pessoas sem for- mação ou conhecimento executassem operações matemáticas. Assim, 14 Engenharia de Software surgiram as máquinas mecânicas de calcular, as quais podemos dizer que foram as primeiras máquinas computacionais (VELLOSO, 2014). A primeira máquina de calcular foi desenvolvida por Blaise Pascal (1623-1662) – aquele mesmo do triângulo. Ele foi físico, mate- mático e filósofo e sua máquina fazia apenas somas e subtrações. Ba bi ch A le xa nd er /S hu tte rs to ck A Pascaline, como foi apelidada, consistia em seis engrenagens, cada uma com a gravação dos algarismos de 0 a 9, sendo possí- vel somar até três parcelas por vez considerando que o total não ultrapassasse 999.999. Por exemplo, uma multiplicação de 30 por 10 era feita somando 10 vezes o número 30 (VELLOSO, 2014). Pascal recebeu do rei da França uma patente para que pudesse ven- der a sua máquina no comércio. Ela teve uma vida útil de aproximada- mente 200 anos (sem muitas “atualizações”); hoje um computador é considerado “atual” por apenas seis meses! Com uma Pascaline, qualquer pessoa poderia executar uma soma, uma subtração ou mesmo uma multiplicação entre dois valores. Essa máquina, como não poderia deixar de ser, mostrou-se muito útil, e ou- tros inventores dedicaram-se ao aprimoramento de seu projeto. Depois surgiram as máquinas registradoras, mais sofisticadas que aquela de Pascal, pois possuíam memória para contabilizar a entrada de dinheiro no caixa, um grande avanço para o momento. Já imaginou como elas eram úteis em um comércio? Entre outras coisas, elas evitavam ou, pelo menos,minimizavam os erros no cálculo de trocos. Também contavam com uma alavan- ca que devia ser girada para se chegar ao resultado. Na prática, o acionamento dessa alavanca era o equivalente ao relógio (clock) dos computadores atuais (PRESSMAN; MAXIM, 2016). https://www.shutterstock.com/pt/g/suricoma A importância da engenharia de software 15 As máquinas registradoras tornaram as operações matemáticas mui- to mais seguras, porém ainda tinham vários pontos fracos, como a en- trada de valores que, além de lenta, estava sujeita a erros de digitação. Imagine, por exemplo, o caixa de um banco, ao longo do dia, ano- tando os valores envolvidos nas transações em uma caderneta e, no final do dia, ao fechar o caixa, encaminhando-os para o setor de fecha- mento geral das operações da agência. Nesse setor, novas contas são executadas e, mais uma vez, a entrada de valores, além de representar um risco, exige muito trabalho manual. Com o fechamento da agência, novas anotações são produzidas e, ao final de uma semana, por exem- plo, um malote com os fechamentos da agência é encaminhado, via carroça, para a sede do banco, na qual, novamente, é processado, com todos os riscos já conhecidos. Percebendo problemas como esse, inventores criaram os cartões perfurados, que podiam ser gerados pela própria máquina, ao final de uma operação, ou pelo caixa e que traziam informações dos valores envolvidos e das operações matemáticas realizadas. O caixa não preci- sava mais anotar em uma caderneta as operações realizadas, embora, por algum tempo, mesmo com o cartão, isso tenha continuado. Ao final do dia, os cartões eram colocados em outra máquina, que processava todas as operações da agência naquele dia, o que gerava novos cartões com balancetes diários da agência. Ao final de uma se- mana, um malote com esses balancetes, na forma de cartões, era enca- minhado, via carroça, para a sede do banco e lá era colocado em outras máquinas para ser processado. Os riscos foram minimizados, pois apenas o caixa entrava com os valores e, depois dele, estes eram propagados diretamente nos cartões. Devemos observar que, até esse momento da história, as má- quinas eram destinadas apenas à realização de contas. Embora fundamentais, em quase todas as situações as contas eram apenas elementos isolados que, com muitos outros elementos, orientavam a tomada de decisão. Imagine o gerenciamento de uma carteira de investimentos em que, a todo instante, contas são efetuadas para permitir a escolha da alocação dos recursos. Porém, SE determinada condição OU de- terminado fator tornar-se relevante E determinada escolha for feita, 16 Engenharia de Software todas as contas devem ser refeitas para definir a parcela dos recur- sos a serem alocados. Nessa situação, a análise das condições OU, E e SE depende ape- nas de pessoas, e mais uma vez as máquinas podem nos ajudar! Foi para resolver situações como essa que as máquinas registradoras evoluíram e tornaram-se programáveis, ou seja, computadores. Foi com o desenvolvimento da máquina analítica do matemáti- co inglês Charles Babbage (1792-1871), a máquina de Babbage, que os conceitos do computador moderno começaram a ser definidos (VELLOSO, 2014). Ch ar le s Ba bb ag e/ W ik im ed ia C om m on s O equipamento, que somente foi construído para efeitos de- monstrativos, possuía todas as funcionalidades do computador mo- derno, como: • inserção de dados com o uso dos cartões perfurados; • unidade de memória para que os números pudessem ser arma- zenados e reutilizados quando necessário; • desenvolvimento sequencial de instruções ao hardware, proce- dimento que atualmente conhecemos como sistema operacional. Máquina analítica de Charles Babbage. A importância da engenharia de software 17 Tudo isso foi descrito originalmente em 1837, mais de um século antes que qualquer outro equipamento do gênero tivesse sido cons- truído com sucesso. Finalmente chegou a eletricidade! Primeiro, ela foi introduzida nos computadores completamente mecânicos, aqueles com base em engre- nagens, na forma de motores que automatizaram a alavanca de relógio. O Z1 foi desenvolvido em 1938, na Alemanha, e foi o primeiro com- putador binário com base em componentes mecânicos acionados por um motor elétrico para gerar o sinal de clock, operando com números em ponto flutuante e um bit de sinal. O programa era lido de uma fita perfurada, os dados eram introduzi- dos por meio de um teclado numérico e os resultados eram apresentados por lâmpadas elétricas que ficavam acesas ou apagadas, representando 0 e 1. Esse feito notável foi desenvolvido por Konrad Zuse (1910-1995). Em 1939, o Z2 substituiu a unidade aritmética mecânica do Z1 por relês eletromecânicos. O Z3, feito em 1941, possuía uma me- mória que utilizava cerca de 1.400 relês (podendo armazenar até 64 números), sendo 1.200 relês utilizados nas unidades de controle e aritmética. Somente em 1950 o Z4 foi concluído e a memória me- cânica voltou a ser utilizada, por ser mais compacta que a memória eletromecânica (VELLOSO, 2014). Em 1936, o matemático inglês Alan Turing (1912-1954) – sim, o Turing do filme O jogo da imitação – desenvolveu uma teoria conhecida como máquina universal ou máquina de Turing, que, de maneira abstrata, mo- delava qualquer computador digital (PRESSMAN; MAXIM, 2016). Essa teoria serviu como premissa para o desenvolvimento posterior da máquina capaz de quebrar os dados criptografados pela máquina alemã Enigma durante a Segunda Guerra Mundial. Mais à frente, em 1943, foi desenvolvido pela Universidade da Pensilvânia o conhecido Eniac (electronic numerical integrator and computer), que tinha capacidade de 5.000 somas por segundo, um marco para a sua época, pois utilizava aritmética decimal. Contava com uma memória de 20 acumuladores com até 10 dígitos, cada um utilizando 10 bits para o seu armazenamento. 18 Engenharia de Software Eniac Avanços científicos na área dos semicondutores e todos aqueles problemas dos computadores valvulados levaram ao surgimento dos computadores transistorizados, os quais utilizavam transis- tores no lugar das válvulas. Isso marcou a segunda geração dos computadores. Como não deveria deixar de ser, os transistores também eram utilizados como válvulas, cujo entendimento, em nível superficial, era mais fácil do que daqueles construídos com válvulas. Um transistor possui apenas e exatamente três pinos: a base, o coletor e o emissor. Quando a base não é acionada por um sinal, ou seja, aplicamos o nível lógico 0 (0 V), não há passagem de corrente do coletor para o emissor e a chave coletor-emissor está aberta. Quando a base é estimulada por um sinal de nível lógico 1 (5 V), temos a passagem de corrente e a chave está fechada. A importância da engenharia de software 19 Os computadores dessa geração eram muito menores que os valvulados, não exigiam preaquecimento, consumiam menos ener- gia, esquentavam menos, duravam mais e eram mais rápidos e mais confiáveis. Foi na terceira geração de computadores que os circuitos in- tegrados, feitos de silício, começaram a ser utilizados. Os circui- tos integrados ficaram conhecidos como chips e eram construídos integrando-se muitos transistores e outros componentes. Essa técnica ficou conhecida como LSI (large scale integration ou inte- gração em larga escala). Isso possibilitou a construção de computadores menores, pois um único chip podia substituir várias placas; mais baratos, pois além do argumento anterior, os chips eram feitos em escala; e mais rápidos, pois dentro de um chip os componentes ficavam mais pró- ximos e protegidos e os sinais elétricos propagam-se mais rapida- mente entre dois componentes e ficavam mais estáveis. A primeira geração de circuitos integrados apenas mostrou o caminho. Como os chips eram novidade, as máquinas, mesmo as mais simples, ainda eram bastante caras, e os desenvolvedores não entendiam para que serviria um computador de uso pessoal e como essamáquina deveria parecer para ser desejada em larga es- cala pelas pessoas. Além disso, não existiam empresas de software destinadas à sua produção para uso pessoal, como editores de tex- to, jogos, agendas etc. Contudo, a quarta geração mudou isso. Melhorias nas técnicas de integração afetaram não somente os processadores, mas todos os componentes presentes em um com- putador, principalmente memórias. Desse modo, nessa época, as memórias dinâmicas também deram um salto em sua capacidade: 64 kbits em 1981, 256 kbits em 1984, 1 mbit em 1984 e 4 mbits e 16 mbits em 1987 (VELLOSO, 2014). Um exemplo dessa geração foi o Apple I, que teve uma vida mui- to curta, tendo sido apresentado em 1976 e substituído em 1977 pelo Apple II. Uma visão mais lúdica e profunda dessa geração de computadores e o surgimento da Microsoft e da Apple – empresas ícones do segmento de computadores pessoais – podem ser vistos pela ótica do filme Piratas do Vale do Silício. Vale a pena conferir. Direção: Martyn Burke. EUA: TNT, 1999. Filme 20 Engenharia de Software Placa do circuito integrado do Apple I Ac hi m B aq ué /W ik im ed ia C om m on s O computador apresentado pela Apple tinha como grande dife- rencial a presença de um monitor, o que fez toda a diferença, pois o usuário podia editar textos, programas de gerenciamento de es- toques e clientes, entre outras funções. Essa máquina, sim, tinha utilidade para muitas pessoas. Rama & Musée Bolo/Wikimedia Commons Percebendo o rápido crescimento da Apple com o Apple II, a IBM – na época a maior empresa do setor de computadores – resolveu en- trar no segmento de computadores de uso pessoal e criou o padrão IBM PC, apresentado em 1981. Apple II https://commons.wikimedia.org/wiki/User:Rama A importância da engenharia de software 21 IBM 5150 Bo ffy b /W ik im ed ia C om m on s Para competir com a Apple, a IBM adotou a estratégia de permitir que outros fabricantes usassem seu padrão, fazendo com que rapida- mente esses computadores se tornassem padrão de mercado. Além disso, o desenvolvimento de software e hardware para essas máquinas era livre de qualquer restrição, o que barateou e diversificou a oferta. Porém, a IBM ainda usava no sistema operacional uma interfa- ce com base em linha de comando e tinha poucos recursos de áu- dio, um monitor de fósforo e um processador inferior. Mesmo assim, a empresa ganhou o mercado! Devido ao seu preço muito menor (o do Macintosh era exorbitante) e à sua maior penetração, o padrão IBM PC-AT consagrou-se mundialmente. Enquanto isso, a Apple amargou prejuízos com o Macintosh, tornando-o restrito às pessoas e às empresas que se disponibilizassem a pagar pelo seu alto preço – quanto às pessoas, pelos motivos que já conhecemos, e quanto às empresas, pelos seus fantásticos atributos quando o assunto é imagem, é aqui que a Apple ganha a fama de ter os computadores preferidos de estúdios de publicidade. Novamente, como aconteceu na quarta geração dos computado- res, a quinta geração foi marcada por um aprimoramento nas técnicas de integração, fazendo com que os processadores se tornassem mais complexos, rápidos e baratos, porém o dispositivo chaveador conti- nuou o mesmo, o transistor. Como percebemos, o computador pode ser entendido como algo sem um inventor definido. Ele é um constante aprimoramento de ideias ante- riores proporcionado pelo avanço científico e pelas técnicas de fabricação, porém que mantém, desde sua origem, a presença de uma ideia funda- 22 Engenharia de Software mental, aquela que faz uso de chaves eletrônicas organizadas logicamen- te, de modo a permitir a solução de problemas lógicos e aritméticos. 1.3 A engenharia de software Vídeo Diante da crescente demanda por desenvolvimento de software e, por conseguinte, do surgimento de novos softwares e hardwares, as indústrias de softwares precisam engajar-se nessa onda de competi- tividade, melhorando de maneira eficaz sua produtividade para poder enfrentar adequadamente essa realidade em constante evolução. Uma particularidade inerente aos sistemas de software é a dificul- dade de seu desenvolvimento, que evolui à medida que surgem novas tecnologias e cresce o tamanho do sistema. Durante as fases de desenvolvimento do software, ao combinar os métodos, as melhores ferramentas para automatizar isso, as técni- cas para a garantia da qualidade do software e os procedimentos de controle e gestão, é possível aplicar as boas práticas sugeridas pela engenharia de software. A engenharia representa uma metodologia unida ao esforço para empreender resultados, os quais são provenientes de trabalhos foca- dos em diversas áreas, nas quais há um amplo conhecimento a fim de propor soluções às necessidades (SOMMERVILLE, 2011). No desenvolvimento de software, em geral, encontramos os seguin- tes tipos de problema: • Os recursos destinados aos projetos tornam-se insuficientes. • Os custos de serviços, produtos e mão de obra são altos. • As soluções propostas não agradam às partes interessadas. • Os custos dos softwares são maiores que o custo do hardware. • O custo de manter um software às vezes é maior do que o desen- volvimento de um novo. Consequentemente, de acordo com Hirama (2011), a engenharia de software foca a missão de executar os desafios de: • reduzir o custo; • seguir o cronograma de acordo com as expectativas; • incrementar a qualidade nos softwares; A importância da engenharia de software 23 • documentar de modo que qualquer parte interessada possa en- tender (todos os detalhes devem ser escritos); • adaptar as alterações sugeridas e/ou necessárias no tempo e no custo adequados; • atender às necessidades do cliente; • dar suporte ao desenvolvimento de softwares de acordo com as mudanças tecnológicas. A concepção e criação de um software é uma empreitada de extre- ma complexidade, sendo essencial o conhecimento de todas as etapas que compõem essa missão. No desenvolvimento de um software é im- portante que o roteiro da engenharia de software seja seguido elimi- nando o desperdício de tempo e o custo e maximizando os resultados benéficos com qualidade. Conforme Pressman e Maxim (2016), todo software deve ser desen- volvido com base em um modelo de procedimentos predeterminado, de- nominado de ciclo de vida de desenvolvimento de software. Este possui um conjunto de etapas que abrange métodos, procedimentos e ferramentas para que o produto final atenda às especificações do usuário. Os problemas acontecem no desenvolvimento de softwares quan- do os procedimentos ultrapassam prazos e custos, impactando negati- vamente a qualidade percebida pelo cliente. A demanda por uma engenharia de software originou-se do objeti- vo de atender às necessidades dos usuários em um ambiente corpora- tivo altamente volátil e competitivo. Um software pode ser considerado de qualidade quando atinge ou supera as expectativas dos usuários, resolvendo os problemas cor- porativos e alavancando os negócios. Um software de qualidade deve atender às seguintes áreas (TSUI; KARAM, 2013): • Operacional: refere-se à funcionalidade em operações, como usabilidade, eficiência, correção de problemas, funcionalidade, proteção, confiabilidade e segurança. • Transição: significa a portabilidade entre as plataformas que o aplicativo precisa apresentar, ou seja, reutilização e adaptação são de extrema importância para um aplicativo de qualidade. • Manutenção: estabelece uma qualidade percebida no que se refere ao seu funcionamento em um ambiente de constantes 24 Engenharia de Software mudanças. Trata da modularidade, facilidade de manutenção, flexibilidade, adaptação e escalabilidade. O ciclo de vida de desenvolvimento é uma série de etapas na enge- nharia de software para a elaboração do aplicativo proposto. Trata-se de uma sequência de procedimentos dentro do âmbito da engenharia de software, que possui as seguintes etapas (PRESSMAN; MAXIM, 2016): 1 Coleta de requisitos2 Análise de sistema 3 Codificação 4 Teste 5 Implantação A engenharia de software tem seu início na primeira fase quando se observa uma solicitação do usuário para a solução de determina- do problema. O requerimento é submetido a uma organização prestadora de ser- viços e o próximo passo é feito pelos desenvolvedores, que fazem a diferenciação entre requisitos do usuário, do sistema e funcionais. O requisito é coletado por meio de entrevistas com um usuário, referência a um banco de dados, estudo do sistema existente etc. Após a coleta, a equipe analisa se o software pode ser feito para atender a todos os requisitos. A importância da engenharia de software 25 O desenvolvedor, então, decide um roteiro de seu plano, que in- clui o estabelecimento das limitações e abrangências do software. De acordo com o requisito e a análise, é feito um projeto de software. A implementação do design de software começa com a escrita do código do programa em uma linguagem de programação adequada. 1.4 A importância do design de software Vídeo O design de software é o processo de transformar os requisitos do usuário de alguma forma adequada, o que ajuda o programador na codificação e implementação do software. Durante a fase de design do software, o documento de design é pro- duzido com base nos requisitos do cliente, portanto o objetivo dessa fase é transformar o documento de levantamento de requisitos no do- cumento de design. Os seguintes artefatos são projetados, desenvolvidos e documenta- dos durante a fase de design (SOMMERVILLE, 2011): • Módulos diferentes necessários. • Controle das relações entre módulos. • Interface entre diferentes módulos. • Estrutura de dados entre diferentes módulos. • Algoritmos necessários para implementação entre módulos individuais. Alguns objetivos são perseguidos no processo de elaboração de um bom design de software, tais como: • Correção: ser correto, ou seja, implementar corretamente todas as funcionalidades do sistema. • Eficiência: abordar os problemas de otimização de recursos, tempo e custo. • Compreensibilidade: ser facilmente compreensível, modular e com todos os módulos dispostos em camadas. • Completude: ter todos os componentes, como estruturas de dados, módulos, interfaces externas etc. • Capacidade de manutenção: ser facilmente passível de altera- ção sempre que uma solicitação for feita pelo cliente. 26 Engenharia de Software O conceito de design de software significa simplesmente a ideia ou o princípio por trás do design. Ele descreve como deve ser planejada a resolução de problemas relacionados ao projeto do software, ou seja, a lógica ou o raciocínio que norteará o seu desenvolvimento. O design de software permite que o engenheiro crie o modelo do sistema, ou o software ou o produto a ser desenvolvido ou construído. O conceito de design de software fornece uma estrutura ou modelo de suporte essencial para o desenvolvimento do software certo. Para Engholm (2010), os seguintes pontos devem ser considerados no design: • Abstração: ocultar dados irrelevantes, ou seja, simplesmente ocultar os detalhes para reduzir a complexidade e aumentar a eficiência ou a qualidade. Diferentes níveis de abstração são ne- cessários e devem ser aplicados em cada etapa do processo de design para que qualquer erro presente possa ser removido, de modo a aumentar a eficiência da solução de software e refiná-la. A solução deve ser descrita de maneira ampla, cobrindo uma gama de coisas diferentes em um nível superior de abstração, e uma descrição mais detalhada de solução de software deve ser fornecida no nível inferior de abstração. • Modularidade: subdividir o sistema. Significa simplesmente divi- dir o sistema ou o projeto em partes menores para reduzir a sua complexidade. Da mesma forma, significa subdividir um sistema em partes menores para que elas possam ser criadas indepen- dentemente e, em seguida, usadas em sistemas diferentes para executar funções distintas. A modularidade no design tornou-se uma tendência, sendo im- portante. Se o sistema contiver um menor número de compo- nentes, significa que é complexo, exigindo muito esforço (custo). Porém, se formos capazes de dividi-lo em componentes, então, o custo será pequeno. • Arquitetura: trata-se de uma técnica para projetar a estrutura nor- teadora de algo. A arquitetura no projeto de software é um concei- to que envolve vários elementos e os dados da estrutura. Esses componentes interagem entre si e usam os dados na arquitetura. A importância da engenharia de software 27 • Refinamento: remove as impurezas, ou seja, refina algo para re- mover quaisquer impurezas presentes e aumentar a qualidade. O conceito de refinamento de projeto de software é, na verdade, um processo de desenvolver ou apresentar o software ou o siste- ma de modo detalhado. O refinamento é muito necessário para descobrir qualquer erro, se houver, e reduzi-lo. • Padrão: reaproveitamento de códigos. É uma forma ou um dese- nho repetido várias vezes para formar um padrão. Este refere-se à repetição de uma solução para um problema recorrente e co- mum dentro de certo contexto. • Ocultar informações: dados desnecessários não precisam aparecer, isto é, significa ocultar as informações para que não possam ser acessadas por uma parte indesejada. No projeto de software, a ocultação de informações é obtida projetando-se os módulos de modo que as informações coletadas ou contidas neles sejam ocultadas e não possam ser acessadas por quais- quer outros módulos. • Refatorar: é reconstruir algo de tal forma que não afete o com- portamento ou quaisquer outras características. Significa re- construir o design para reduzir a complexidade sem afetar o comportamento ou as funções. O design de software possui três diferentes níveis que devem ser observados nos projetos de desenvolvimento. São eles: 1. Projeto arquitetônico: a arquitetura de um sistema pode ser vista como a estrutura geral do sistema e a maneira como esta fornece integridade conceitual. O projeto arquitetônico identifica o software como um sistema com muitos componentes interagindo entre si. Nesse nível, os designers têm a ideia do domínio da solução proposta. 2. Projeto preliminar ou de alto nível: aqui o problema é decomposto em um conjunto de módulos e a relação de controle entre os vários módulos e as interfaces entre os vários módulos são identificadas. O resultado desse estágio é chamado de arquitetura do programa. As técnicas de representação de design usadas nesse estágio são gráficas de estruturas de softwares que veremos mais à frente. Com oito edições e mais de 30 anos no topo dos livros mais vendidos e recomen- dados da engenharia de software, a obra Engenharia de software: uma aborda- gem profissional precisa estar na cabeceira de todos os desenvolvedores, engenheiros, programa- dores e profissionais de tecnologia. O livro traz um leque ri- quíssimo de procedimen- to, roteiros, cuidados e atalhos da engenharia de software. Também aborda aspectos essenciais, como o trabalho com os usuá- rios para determinar suas necessidades de software; o roteiro para desenho de diagramas e modelos que ajudem os desenvol- vedores a criar o código apropriado para o sistema ou aplicativo; indicações de como documentar o sistema ou aplicativo em detalhes para ajudar os responsáveis pela manu- tenção futura; os proce- dimentos para manter o sistema ou aplicativo com atualizações e correções conforme necessário etc. Enfim, por muitos é considerado a bíblia da engenharia de softwares. PRESSMAN, R. S. 8. ed. Porto Alegre: AMGH, 2016. Livro 28 Engenharia de Software 3. Projeto detalhado: uma vez que o projeto de alto nível esteja completo, o projeto detalhado é realizado. Aqui, cada módulo é examinado cuidadosamente para projetar a estrutura de dados e algoritmos. O resultado do estágio é documentado na forma de um documento de especificação do módulo.CONCLUSÃO Neste capítulo entendemos a definição de software e sistemas compu- tacionais e vimos a evolução do hardware e software ao longo dos anos, bem como os principais tipos de software. Compreendemos a origem da engenharia de software e a importân- cia do design de softwares atualmente no ecossistema do desenvolvi- mento de aplicações. Este capítulo foi uma ótima introdução aos engenheiros de softwares que desejam ser competentes em suas funções, solucionando proble- mas e combinando habilidades de pensamento abstrato com uma men- talidade prática. A partir daqui, estaremos aptos a nos aprofundar em todos os proce- dimentos da engenharia de software, que busca garantir padronização, aumentar qualidade e diminuir prejuízos nos projetos de softwares. ATIVIDADES Atividade 1 Você assumiu a missão de um museu altamente relevante nos Estados Unidos de criar uma experiência histórica aos visitantes: elaborar uma linha do tempo com os principais avanços tecnoló- gicos ao longo da história. Para tanto, utilize os marcos trazidos neste capítulo, bem como outras pesquisas, para criar o que conhecemos como timeline da tecnologia. Use a criatividade para surpreender a todos com gráficos, imagens e até animação gráfica. Atividade 2 Escolha um aplicativo que você utiliza no seu dia a dia e de- senvolva um documento com os itens do design de software tratados neste capítulo. Fale como a abstração, a modularidade, a arquitetura, o refinamento, o padrão, a ocultação de informa- ções e a refatoração podem ser encontrados no aplicativo. A importância da engenharia de software 29 REFERÊNCIAS ENGHOLM JR., H. Engenharia de software na prática. São Paulo: Novatec, 2010. HIRAMA, K. Engenharia de software: qualidade e produtividade com tecnologia. Rio de Janeiro: Elsevier, 2011. PFLEEGER, S. L. Engenharia de software: teoria e prática. São Paulo: Pearson Prentice Hall, 2007. PRESSMAN, R. S.; MAXIM, B. R. Engenharia de software: uma abordagem profissional. 8. ed. Porto Alegre: AMGH, 2016. SOMMERVILLE, I. Engenharia de software. 9. ed. São Paulo: Pearson Education, 2011. TSUI, F.; KARAM, O. Fundamentos de engenharia de software. São Paulo: LTC, 2013. VELLOSO, F. de. C. Informática: conceitos básicos. 9. ed. Rio de Janeiro: Elsevier, 2014. 30 Engenharia de Software 2 Ciclo de vida do software Com o estudo deste capítulo, você será capaz de: • entender, analisar e implementar o ciclo de vida completo de um software; • compreender análise, projeto, implementação, testes, implan- tação e manutenção de sistemas; • reconhecer a importância do levantamento de requisitos efi- ciente para o sucesso da engenharia de software. Objetivos de aprendizagem Neste capítulo exploraremos o conhecido ciclo de vida de desen- volvimento de sistemas que define as principais etapas do desenvolvi- mento de software dentro da engenharia de software. Existem muitas abordagens diferentes para essa atividade, e a maioria das equipes de desenvolvimento possuem uma metodologia iterativa, na qual os estágios são combinados e revisitados ao longo do projeto. O termo a que chamamos de ciclo de vida é usado para ilustrar que, eventualmente, mudanças na tecnologia ou nos requisitos de ne- gócios tornarão um sistema obsoleto e o ciclo começará novamente – daí a importância de trazermos os conceitos ágeis para o nosso estudo. O ciclo de vida de desenvolvimento de software é um processo de- finido de desenvolvimento de softwares que, quando seguido, ajuda a criá-los de maneira rápida e eficiente. Podemos comparar isso à receita que você segue para assar seu bolo favorito. Se o primeiro passo for combinar farinha com cacau em pó, você terá que seguir o processo para garantir um bolo bem assado. No entanto, se você misturar os ingredientes mencionados de uma vez, talvez não valha a pena saborear o bolo. O mesmo se aplica para as etapas do ciclo de vida de desenvolvimen- to de software: há um processo passo a passo definido para a criação Ciclo de vida do software 31 de software de qualidade. Se você perder alguma das etapas ou segui- -las sem precisão, os esforços desse processo serão desperdiçados. 2.1 Ciclo de vida do software Vídeo O ciclo de vida do software (ou, em inglês, Software Development Life Cycle) é um processo sistemático de desenvolvimento de software que assegura a qualidade e as manutenções do software construído. O ciclo de vida na construção de softwares tem o objetivo de im- plementar alta qualidade ao produto final, preferencialmente sur- preendendo as expectativas do cliente. O desenvolvimento do sistema deve ser entregue no prazo e no custo orçados, sendo basicamente um plano detalhado que explora como planejar, construir e manter um software específico (PRESSMAN, 2016). Cada fase do ciclo de vida do software tem seu próprio processo e resultados que deliberam a próxima etapa de modo cíclico com retroa- limentação, mas sempre em parceria com os usuários para as devidas validações. Apresentamos, a seguir, os motivos que impulsionam a implantação eficiente do ciclo de vida do desenvolvimento de softwares eficientes nas organizações que buscam diferenciais competitivos (PFLEEGER, 2007). • Fornecer subsídios para o planejamento, a codificação e a esti- mativa de custo e tempo do projeto. • Entregar uma modelagem estruturada para as atividades que irão compor o desenvolvimento dos softwares. • Ser um dispositivo que propicia o acompanhamento e o monito- ramento do projeto. • Dar ênfase à visibilidade de todo o planejamento estrutural do pro- jeto para todos os envolvidos no processo de desenvolvimento. • Aumentar e melhorar a velocidade de desenvolvimento dos softwares. • Aprimorar as relações com o cliente. • Contribuir para a diminuição dos riscos relacionados ao projeto. • Eliminar sobrecargas no gerenciamento prático do projeto de software. 32 Engenharia de Software O ciclo de vida também reduz o custo de desenvolvimento de software e, ao mesmo tempo, melhora a qualidade e reduz o tempo de produção, atingindo essas metas que aparentemente divergem, mas que na verdade são essenciais no desenvolvimento de softwares (PFLEEGER, 2007). O ciclo segue um plano que remove as armadilhas típicas de proje- tos de desenvolvimento de software. Esse plano começa avaliando os sistemas existentes, em busca de deficiências. Posteriormente, parte para a definição dos requisitos do novo sistema e, em seguida, ruma-se à criação do software por meio dos estágios de análise, planejamento, design, desenvolvimento, teste e implantação. Ao prever erros com alto custo, como deixar de pedir feedback ao usuário final ou cliente, o ciclo de desenvolvimento eficaz pode eliminar retrabalho redundante e correções posteriores. É importante, ainda, saber que há um grande foco na fase de tes- te – com uma metodologia repetitiva, é possível garantir a qualidade do código a cada ciclo. Muitas organizações tendem a investir poucos esforços em testes, o que é um erro, pois um foco mais eficiente em testes pode economizar muito retrabalho, tempo e dinheiro. O ciclo de vida tradicional e mais utilizado nas organizações é apre- sentado na figura a seguir (IAN, 2011). Sistema proposto Figura 1 Ciclo de vida de software Implementação e testes Análise e projeto Levantamento de requisitos Implantação e manutenção Fonte: Elaborada pelo autor com base em Ian, 2011. Ciclo de vida do software 33 Em seguida, vamos explorar cada uma das etapas: levantamento de requisitos; análise e projeto; implementação e testes; implantação e manutenção. 2.2 Levantamento de requisitos Vídeo O levantamento de requisito é estágio inicial e essencial para um bem-sucedido processo de desenvolvimento de software. Esse proces- so deve ser liderado por profissionais experientes e conhecedores do negócio. É a fase que dará uma visão mais clara e ampla sobre o escopo de todo o projeto e sobre as questões, oportunidades e diretrizes pre- vistas que o desencadearam. Aetapa de coleta de requisitos necessita de uma equipe capacitada em obter condições, dados, informações o mais detalhadas e confiá- veis possível, contribuindo para no cumprimento do cronograma esta- belecido (IAN, 2011). Esta etapa se refere especificamente à prática de definir requisitos de software, mas na verdade todo projeto tem requisitos, desde uma nova plataforma de suporte ao cliente até uma cozinha remodelada. Em sua essência, trata-se do processo de compreensão para que o de- senvolvedor saiba o que ele deve estar construindo e por que o está fazendo. O processo geralmente envolve um conjunto de atividades, incluin- do (SOMMERVILLE, 2011): • Levantamento de requisitos: obter os requisitos de negócios das partes interessadas e que são relevantes para compreender as necessidades do usuário. • Documentação de requisitos: codificação dessas informações em formato legível aos usuários para que eles possam confirmar o entendimento das necessidades. • Entendimento dos requisitos: etapa para que todos tenham certeza do entendimento dos requisitos que formarão o software. É sempre fundamental lembrar que tudo depende do usuário! Ele é o personagem mais importante nesse processo. Descubra como os usuários desempenham suas tarefas e como desejam realizá-las de- pois do software. 34 Engenharia de Software 1. O que os usuários precisam fazer? 2. Quais problemas precisam ser sanados? 3. Como os usuários querem resolver os problemas? 4. Quais tipos de recursos os usuários terão disponíveis? 5. Com que eficiência podemos fazer isso acontecer? 6. Que tipo de flexibilidade pode ser necessária? Essas são algumas perguntas que precisam ser respondidas nessa etapa. A coleta de requisitos bem-sucedida é uma arte em entrevistar pes- soas e conseguir informações. A seguir apresentamos algumas dicas que podem ajudar. Estabeleça metas e objetivos do projeto desde o início Isso pode parecer redundante: é claro que sabemos por que esta- mos fazendo este projeto...Não é? Mesmo tendo-se a impressão de saber tudo, anotar e pedir aos stakeholders que assinem é o mais indicado. Sem metas e objetivos claramente definidos, faltará uma estrutura para orientar as futuras tomadas de decisões. Documentar todas as atividades de obtenção de requisitos Quando está no meio de entrevistas com as partes interessadas e na análise de documentação, muitas vezes o desenvolvedor pode sen- tir que tem um grande domínio sobre as coisas. Mas, então, uma se- mana se passa e alguns detalhes começam a ficar um pouco confusos, e o desenvolvedor percebe que não tem uma compreensão completa sobre os requisitos do seu negócio. Parece óbvio, mas certificar-se de estar fazendo anotações detalha- das durante as entrevistas com as partes interessadas é um passo po- deroso para uma coleta de requisitos bem-sucedida. Seja transparente com a documentação de requisitos Claro que você entende os requisitos e seus stakeholders também. Porém, todas as demais partes envolvidas entendem sua compreensão sobre os requisitos? Após cada reunião, analise suas anotações, refine-as e, em segui- da, compartilhe-as com a equipe do projeto, incluindo todas as partes interessadas. Ciclo de vida do software 35 Essa transparência não apenas ajuda a garantir que todos estejam na mesma página, mas também promove um senso de aceitação do projeto em todo o seu planejamento, começando com os requisitos do negócio. Fale com as partes interessadas e usuários certos Um projeto geralmente pode ter partes interessadas “ocultas”. Faça perguntas de sondagem em suas reuniões iniciais para tentar desco- brir quem são os usuários reais. Frequentemente, essas pessoas não serão os principais tomadores de decisão, mas sua adesão é essencial para um projeto bem-sucedido. Usuários insatisfeitos que são forçados a usar um sistema que foi pro- jetado sem as suas contribuições são um ingrediente-chave para um projeto fracassado. Não faça suposições sobre os requisitos Não presuma que compreendeu tudo, mesmo que tudo pareça óbvio. Um requisito aparentemente simples como “queremos um blog” pode mascarar todos os tipos de suposições, requisitos etc. 1. Quais são os campos de uma postagem de blog? 2. Como os autores são gerenciados? 3. E quanto à marcação? 4. Quais são as categorias? 5. Como as postagens são exibidas? 6. Eles estão agregados em um arquivo? 7. Existe um feed? 8. Quem são os autores e qual é seu nível de proficiência técnica? O ponto-chave está realmente nos detalhes que o desenvolvedor pode conseguir se fizer as perguntas certas e não acelerar o processo de coleta de dados. Confirmar, confirmar, confirmar Isso significa “ser transparente”? No entanto, não é totalmente a mesma coisa. É ótimo apenas compartilhar suas anotações com uma parte inte- ressada, mas muito mais valioso é fazer uma revisão rápida junto a ela e obter sua aprovação oficial. 36 Engenharia de Software O silêncio das pessoas não é um indicador de sucesso. Obtenha a con- firmação formal das partes interessadas para só depois seguir em frente. Pratique a escuta ativa Conseguir que alguém se sinta ouvido é uma das melhores coisas que o desenvolvedor pode fazer pelo usuário. Entretanto, isso vai além de apenas ouvir o que eles dizem: o desenvolvedor também precisa ouvir o que os usuários não dizem e como eles dizem as coisas, bem como tentar ler sua linguagem corporal e outros indicativos de que ain- da existem informações para serem passadas por parte dos usuários. Isso é chamado de escuta ativa e trata-se de um componente-chave para o sucesso levantamento de requisitos. Não presuma que está sem- pre entendendo a história, preste atenção às pequenas pistas que revelam pontos problemáticos, desejos, objetivos não declarados e suposições. Foco nos requisitos de negócios, não nas ferramentas Tenha cuidado ao reunir requisitos nos quais está realmente se con- centrando e ao ouvir as necessidades dos stakeholders em vez de se pren- der à ferramenta que está usando. Qualquer metodologia ou software pode ser utilizado desde que não atrapalhe a coleta de requisitos. Lembre-se: você pode não ter entendido tudo Mesmo o melhor coletor de requisitos vai perder coisas, e sabe por quê? Porque o desenvolvedor e seus stakeholders são seres humanos, e seres humanos cometem erros. Mais tarde, o desenvolvedor vai pen- sar em coisas que se esqueceu de perguntar. O stakeholder pensará em coisas que se esqueceu de mencionar (SOMMERVILLE, 2011). As coisas podem mudar, as prioridades podem mudar. A boa notí- cia é que o planejamento com antecedência poderá proporcionar uma construção de software interativa e eficiente durante o ciclo de vida do projeto; com isso, o gerenciamento contínuo de requisitos será garantido. Esse tempo é essencial porque os requisitos (orientados e criados por humanos) simplesmente não são estáticos. Dar a si mesmo tempo para gerenciar ativamente os requisitos ao longo de todo o projeto pode ajudá-lo a interromper o aumento do escopo antes de iniciá-lo e garan- tir que sua equipe esteja sempre se concentrando no conjunto certo de prioridades que correspondem aos requisitos reais (IAN, 2011). Ciclo de vida do software 37 Obviamente, há muito mais que pode ser dito sobre a arte e a ciência da coleta de requisitos, mas espero que esta lista tenha fornecido algumas ferramentas úteis para gerenciar esse processo com sucesso. Agora que já se sabe como definir o que está construindo vamos seguir para a próxima etapa do ciclo de vida do processo de desenvolvimento de software. 2.3 Análise e projeto Vídeo O estágio de análise e projeto é uma etapa do desenvolvimento em que precisamos identificar quais são os principais aspectos do proble- ma que se pretende resolver com o software. Existem quatro pontos que precisamos identificar quando analisa- mos um problema. São eles (HIRAMA, 2011): 1. Finalidade do software: muitas vezes se consegue isso com um texto que detalha o motivopelo qual o software está sendo desenvolvido. 2. Entregas: lista do que deve ser entregue ao longo do projeto. Esses elementos serão entregues ao cliente ou usuário final. 3. Limites: limites definidos aos quais o software atenderá, suas fronteiras entre o que deve ou não ser atendido. 4. Requisitos funcionais: especifica as entradas, os processos e as saídas. Esses quatro aspectos podem ser detalhados quando definimos entradas, processamentos e saídas esperadas. Para ficar mais claro, vamos a um exemplo bastante simples. Exemplo 1 Objetivo: o software deve ser criado para permitir que um usuário insira dez números. Cada número deve ser validado para garantir que não seja inferior a 0 e nem superior a 100. O programa deve manter um total contínuo dos números inseridos e produzir o total final. Entregas: o escopo deste exemplo seria o projeto entregue, incluin- do os aspectos: design, programa concluído, plano de teste, resultados de teste e relatório de avaliação. Um curto limite de tempo também seria definido no projeto, provavelmente menos de 30 minutos. 38 Engenharia de Software Requisitos funcionais: • entradas: dez números; • processos: “validar dez números” e “calcular total”; • saídas: total digitado até o momento; • limites: cada número deve ser validado para garantir que não seja inferior a 0 e nem superior a 100. Portanto, os limites seriam 0 e 100. Exemplo 2 Objetivo: os proprietários de um parque temático pediram que fos- se desenvolvido um programa para registrar o número médio de visi- tantes em uma semana. Para tanto, o usuário digitará o número total de visitantes para cada dia da semana. O programa deve, então, gerar o número médio de visitantes durante a semana. Entregas: o escopo deste exemplo seria o projeto entregue, incluin- do os aspectos: design, programa concluído, plano de teste, resultados de teste e relatório de avaliação. O limite de tempo desse programa seria relativamente curto, possivelmente algo entre 1 e 2 horas. Requisitos funcionais: • entradas: total diário de pessoas; • processos: calcular média diária; • saídas: média de pessoas; • limites: pode ser difícil encontrar alguns limites neste exemplo. Nele, estamos usando dias da semana, portanto não usaríamos mais do que sete dias da semana. Outro limite seria que o total de visitantes deve ser maior que zero, pois não pode haver visi- tantes negativos. Na fase de análise e projeto também é necessário, geralmente, delinear claramente quaisquer recursos que serão necessários, por exemplo: • hardware necessário para executar o software; • compatibilidade de software; • necessidade de uma conexão com a internet durante o uso; • competência de TI e do grupo de usuários para a implementação da solução. Ciclo de vida do software 39 A fase de análise e projeto de software é o momento em que os ar- quitetos e desenvolvedores elaboram especificações técnicas avança- das de que precisam para criar o software de acordo com os requisitos. As partes interessadas discutirão fatores como níveis de risco, com- posição da equipe, tecnologias aplicáveis, tempo, orçamento, limita- ções do projeto, método e projeto arquitetônico. Com base nas definições, desenvolve-se um documento chamado Documento de Especificação de Projeto que irá balizar o projeto arqui- tetônico, os componentes, a comunicação, a representação de telas e os fluxos de usuário do produto. Essa etapa fornece um modelo para desenvolvedores e testadores e reduz as chances de falhas e atrasos no produto final (ENGHOLM, 2010). Agora vamos à próxima fase! 2.4 Implementação e testes Vídeo A implementação ou codificação do software é o momento em que os desenvolvedores, de posse dos requisitos e da documentação da fase de análise e projeto, debruçam-se sobre a programação. Uma linguagem é escolhida e o processo se inicia, levando em consi- deração um padrão de programação dentro da equipe. Os padrões de codificação são uma série de procedimentos que podem ser definidos para uma linguagem de programação específica, determinando um es- tilo de programação, os métodos e os procedimentos diferentes. Esses procedimentos podem ser realizados para vários aspectos do programa escrito nessa linguagem e podem ser considerados atributos essenciais do desenvolvimento de software. Um padrão de codificação garante que todos os desenvolvedores que trabalham no projeto sigam certas diretrizes especificadas. O có- digo pode ser facilmente compreendido e a consistência adequada é mantida (TSUI; KARAM, 2013). A consistência tem um impacto positivo na qualidade do programa e deve-se mantê-la durante a codificação. Além disso, é importante cui- dar para que as diretrizes sejam seguidas de maneira homogênea nos diferentes níveis do sistema e não se contradigam. 40 Engenharia de Software A codificação deve seguir algumas premissas para que apresente uma fácil leitura por parte das equipes técnica e não técnica, tais como: • Tentar definir diferentes seções do código segmentando blocos de código em um parágrafo. Para tanto, é aconselhável usar indentação para indicar o início e o fim das estruturas de con- trole, juntamente a uma especificação clara do local entre elas no qual o código está. • Atribuir consistência na convenção de nomenclatura das variá- veis em todo o código. Além disso, devem ser descritos os dados que estão no código. • Nomear as funções de acordo com o que executam. • O código deve ser entendível mesmo depois de se retornar a ele após algum intervalo de tempo, sem que o programador tenha que olhar para cada linha do código-fonte. • Seguir um método específico para comentar o trabalho. • As funções da linguagem que são complexas ou a estrutura que é difícil de ser compreendida devem ser evitadas. Com simples atitudes dos programadores, é possível evitar que os desenvolvedores de software gastem uma parte maior do seu tempo resolvendo os problemas que poderiam ter sido evitados. Implementar padrões de codificação ajuda a equipe a detectar os problemas anteci- padamente ou até mesmo evitá-los completamente, o que aumenta a eficiência em todo o processo de software. Após uma codificação eficiente e padronizada, parte-se para os testes. A implementação dos testes em software é o processo de desenvolver e priorizar procedimentos de teste, criando dados e, opcionalmente, prepa- rando e escrevendo scripts de teste automatizados (TSUI; KARAM, 2013). É de grande importância escolher os testes certos e executá-los na ordem certa. A importância disso cresce exponencialmente nas estra- tégias baseadas em risco quando criamos prioridades com base na probabilidade de risco e problemas. O procedimento teste é considerado uma atividade básica destinada a detectar e resolver problemas técnicos no código-fonte do software e avaliar a usabilidade geral do produto – desempenho, segurança e compa- tibilidade. Não apenas é a parte principal da garantia de qualidade como também é parte integrante do processo de desenvolvimento de software. Ciclo de vida do software 41 Um ponto importante no processo de teste é que a empresa esta- beleça uma política de testes. Trata-se de um documento que contenha os princípios dos testes adotados pela empresa e os principais objeti- vos de teste dela. Também explica como serão realizados e como uma empresa mede a eficácia e o sucesso dos testes (PRESSMAN, 2016). A seguir listamos os itens essenciais de uma política de testes de softwares eficaz: • Definição do que o teste significa para a empresa. • Objetivos dos testes para a organização. • Padrões e critérios gerais para teste de software em projetos. • Lista de ferramentas para apoiar o processo de teste. • Métodos e métricas para avaliar a eficiência dos testes. • Maneiras de como melhorar os processos de teste. Apoiando a política de testes se faz necessário um plano de gestão de qualidade, documento que define um nível aceitável de qualidade do produtoe descreve como o projeto alcançará esse nível. Não se trata de um documento obrigatório, mas ele ajudará a agen- dar todas as tarefas necessárias para garantir que o projeto atenda às necessidades e expectativas do cliente. O principal objetivo desse plano é apoiar os gerentes de projeto e ajudar a organizar o processo, definindo funções, responsabilidades e padrões de qualidade a serem alcançados. Consequentemente, deve incluir os requisitos de qualidade do software e descrever como eles devem ser avaliados (PRESSMAN, 2016). A seguir temos alguns tópicos essenciais para o desenvolvimento do plano: • Objetivos de qualidade perseguida. • Principais entregas do projeto e processos a serem revisados para um nível de qualidade satisfatório. • Padrões de qualidade adotados. • Atividades de controle e garantia de qualidade. • Funções e responsabilidades de qualidade. • Ferramentas de qualidade. • Plano para relatar problemas de controle e garantia de qualidade. 42 Engenharia de Software Depois do plano de qualidade, o gestor deve se debruçar sobre o desenvolvimento da estratégia de teste, documento de nível de pro- duto mais específico que deriva dos requisitos de sistema, levantados junto aos usuários. A estratégia de teste deve ser desenvolvida para definir as abor- dagens de teste de software usadas para atingir os objetivos de teste. Uma estratégia de teste é orientada pelos requisitos de negócios do projeto, razão pela qual ela se confunde com as responsabilidades de um gerente de projeto. Os principais componentes de uma estratégia de teste são: • escopo do teste; • objetivos de teste; • limitações de orçamento; • comunicação e relatório de status; • padrões industriais; • teste de medição e métricas; • relatórios e rastreamento de defeitos; • gerenciamento de configurações; • prazos; • cronograma de execução de teste; • identificação de risco. Em um projeto pequeno, a estratégia de teste faz parte de um plano de teste. Porém, para um projeto maior, o gestor de projetos precisa criar uma estratégia de teste como um documento estático separado e a partir do qual cada plano de teste pode ser desenvolvido. Um bom documento de estratégia de teste responde às seguintes perguntas: • Qual é o produto? • Qual(is) parte(s) deve(m) ser testada(s)? • Como eles devem ser testados? • Quando o teste deve começar? • Quais são os critérios de início/fim? Por fim, é recomendado o desenvolvimento do plano de teste, docu- mento que descreve o que testar, quando testar, como testar e quem Ciclo de vida do software 43 fará os testes. Ele também descreve o escopo e as atividades do teste. O plano de teste inclui os objetivos dos testes a serem executados e ajuda a controlar os riscos. É uma boa prática ter um plano de teste escrito por uma pessoa experiente, como um líder ou gerente de qualidade. Um bom plano de teste deve incluir a programação de todas as ativi- dades necessárias para controlar o tempo de teste de sua equipe. Deve também definir as funções de cada membro da equipe para que todos saibam o que é necessário. Não existe uma maneira universal de se criar um plano de teste por- que ele depende dos processos, dos padrões e das ferramentas de ge- renciamento de teste implementados na empresa. Mas aqui seguem as principais informações que um plano de testes de softwares deve conter. • Introdução. • Itens de teste (o produto e suas versões). • Problemas de risco de software. • Recursos a serem testados. • Recursos a não serem testados. • Abordagem (estratégia). • Critérios de aprovação ou reprovação do item. • Critérios de suspensão. • Produtos (documento de plano de teste, casos de teste, ferra- mentas, registros de erros, relatórios de problemas etc.). • Ambiente de teste (hardware, software, ferramentas). • Cronograma. • Necessidades de pessoal e treinamento. • Responsabilidades. • Riscos. • Aprovações. Todos esses itens são necessários para que se possa estabelecer um plano de testes que seja objetivo, evitar repetições e desperdícios e, principalmente, aprovar o software de acordo com as necessidades dos usuários e sem anomalias operacionais Por último, é importante que o plano de testes seja compartilhado com todas as partes interessadas, pois ele fornecerá informações so- bre os processos de teste e, consequentemente, de qualidade. 2.5 Implantação e manutenção Vídeo Após meses ou anos de trabalho, você finalmente desenvolveu o software ou parte dele pode ser implementado. Que alívio! Infelizmente, no entanto, normalmente não temos a “casa livre”, ou seja, existem softwares antigos rodando, usuários acostumados com o padrão antigo – enfim, uma série de desafios a serem superados. A implementação de qualquer tipo de nova tecnologia no local de trabalho, incluindo esse novo software, pode ser uma mudança que ocorre com muito estresse. As pessoas geralmente resistem a qualquer mudança que afete seu status quo, ou seja, o estado atual das coisas. E pedir para que as pes- soas aprendam uma nova ferramenta certamente parecerá uma inter- rupção indesejável. O importante é passar a confiança de que a implementação trará benefícios para a empresa, para todos individualmente, bem como de que ninguém será desligado, se for possível afirmar isso. Todos os impactados precisam estar de “braços abertos” para o novo software! Apresentamos cinco dicas essenciais para essa missão (SOMMERVILLE, 2011): 1. Encontre seus campeões Se você puder aproveitar o entusiasmo dos colaboradores empol- gados com o novo para dar impulso em torno desse novo software, essa empolgação pode ajudar a convencer o restante dos funcionários a utilizá-lo. Encontre pessoas que se sintam naturalmente à vontade com os conceitos do novo software e incentive-as a defendê- -lo. Você pode considerar as pessoas da equipe pi- loto que ajudaram a avaliar a ferramenta ou as pessoas que usarão o software com maior frequência. Ver o entusiasmo desses campeões ajudará a con- verter as pessoas mais céticas ou hesitantes. Pu re So lu tio n/ Sh ut te rs to ck 4444 Engenharia de softwareEngenharia de software 2. Crie um entendimento compartilhado Se os funcionários não encontrarem um motivo convincente para usar o novo software, é possível que a empresa receba taxas de adoção baixas. Portanto, ajude os colaboradores campeões a entender exata- mente o que é a ferramenta, o que ela faz e por que foi desenvolvida. Envolva as pessoas desde o início do processo de implementação e in- centive as perguntas apresentando transparência nas respostas. 3. Realizar eventos de treinamento Os eventos de treinamento podem ser uma forma eficaz de treinar os funcionários em um novo software. Use esses eventos para estimu- lar o diálogo e responder a perguntas, reforçar os benefícios da ferra- menta e demonstrar sua aplicação prática diária no fluxo de trabalho da equipe. É importante encontrar maneiras criativas de incorporar o novo software à rotina off-line ou à rotina com o software antigo com a maior frequência possível. 4. Mova conteúdos importantes para o novo software Uma maneira de aumentar a adoção é tornar as informações im- portantes de que os funcionários precisam acessíveis apenas por meio da nova ferramenta. Na verdade, definir um prazo rígido de migração para o novo software pode ser a única maneira de fazer com que os retardatários se convertam. Mas tome cuidado! Essa é uma etapa ousada que corre o risco de frustrar os funcionários, especialmente se implementada muito cedo. Para ajudar nesse processo, comunique e enfatize as razões para a adoção do novo software de maneira eficaz, ressaltando como a nova ferramenta beneficiará a todos. Pu re So lu tio n/ Sh ut te rs to ck Ciclo de vida do softwareCiclo de vida do software 4545 46 Engenharia de Software 5. Considere a opção do uso de recompensas Recompensas podem ser uma forma eficaz de incentivar um deter- minadocomportamento, mas isso depende da cultura e da filosofia da organização. É importante notar que as “cenouras” e os “por- retes” tendem a falhar quando aplicamos essas metodolo- gias em pessoas pensadoras e criativas, podendo até ser prejudiciais. A verdadeira motivação é impulsionada por um senso de propósito e busca de domínio, razão pela qual transmitir o valor do software é tão importante. Dito isso, pequenas recompensas voltadas a incentivar a participação podem ser bastante eficazes quando relacionadas a tarefas menos criativas, como controle de tempo. Finalmente chegamos à última etapa do ciclo de desenvolvi- mento de software: a manutenção. Para essa etapa, é essencial que o gestor desenvolva um plano de manutenção. Um plano de manutenção é um documento que define o trabalho realizado para manter ativos operacionais. O conteúdo do documento ajuda a facilitar o uso contínuo de um ativo com desempenho ideal. Sua instalação pode evitar avarias significativas ou renovações impre- vistas se você seguir as diretrizes fornecidas aqui. A ideia por trás do planejamento de manutenção é garantir que se possa manter as condições de funcionamento adequadas dos equipa- mentos. Embora um plano comum faça esse trabalho, qualquer ins- talação requer um programa eficaz para que se aproveitem todos os benefícios da política de manutenção. O principal objetivo da manutenção de software é modificar e atua- lizar o seu aplicativo após a entrega para corrigir falhas e melhorar o desempenho dele. As principais necessidades de manutenção em softwares são exigi- das para: • corrigir as falhas; • melhorar o design; • implementar melhorias; • incluir interface com outros sistemas. Pu re So lu tio n/ Sh ut te rs to ck Ciclo de vida do software 47 Dentro dessas necessidades, vale ressaltar os tipos de manutenção que precisam ser contemplados no plano de manutenção (HIRAMA, 2011): Manutenção corretiva A manutenção corretiva de um software pode ser essencial para corrigir alguns erros observados enquanto o sistema está em uso ou para aprimorar o desempenho do sistema. Para exemplificar, suponha que você acabou de lançar o software na noite passada, mas recebe a informação de que os usuários não conseguem fazer o login com suas credenciais do Facebook. Você con- tata seu desenvolvedor e descobre que o código de autenticação que se comunica com o Facebook tem um pequeno defeito e precisa ser atualizado para restaurar a funcionalidade de login. A manutenção corretiva, também conhecida como manutenção rea- tiva, emprega esforços na correção de problemas encontrados após a entrega do software. Manutenção adaptativa Abrange alterações, atualizações e incrementos em função das ne- cessidades dos usuários que estão em locais em que o produto seja executado em novas plataformas, sistemas operacionais e hardwares. Para exemplificar esse tipo de manutenção, vamos supor que os usuários têm feito login com sucesso no sistema há vários dias e as coisas estão indo muito bem, mas você descobre que o problema está de volta e os usuários não podem mais acessar suas contas. Após várias horas de investigação por seu desenvolvedor, você des- cobre que o Facebook mudou a maneira como você autentica com sua API, portanto seu site precisa ser atualizado para oferecer suporte ao novo método. Seu desenvolvedor passa mais algumas horas atualizando o site para suportar o novo método de autenticação do Facebook e tudo vol- ta ao normal. Esse problema requer manutenção adaptativa, que é a modificação de um produto de software realizada após sua entrega para manter um produto de software utilizável em um ambiente alterado ou em mutação. 48 Engenharia de Software Manutenção para aumento de qualidade Um software necessita de manutenção de qualidade para entregar aos usuários novas experiências, para que ele possa levar encantamen- to e uma aproximação ainda maior com seu público-alvo. Seguindo exemplo anterior, o Facebook encerrou suas alterações e parou de comprometer o seu site, mas você começa a receber alguns comentários de seus usuários depois de mais alguns dias. Acontece que, em vez de o usuário ser enviado para o perfil após o login, faz mais sentido ver o painel de atividades recentes. Um pedi- do razoável; você trabalha com seu desenvolvedor e, após uma rápida atualização do sistema, os usuários agora são recebidos com as últimas ações do produto para que possam estar sempre atualizados. A manutenção do software em busca de qualidade, que normal- mente resulta do feedback do usuário, é de extrema importância, pois busca atender especificamente às solicitações de quem o utiliza. O objetivo é garantir que seus usuários fiquem satisfeitos com a experiência e continuem usando seu produto como resultado do valor agregado com que a manutenção perfectiva contribui. Novos recursos e aprimoramentos para recursos existentes não são considerados manutenção perfeita. Se o painel de atividades recentes não existisse, ele seria um novo recurso em vez de uma manutenção perfeita. Manutenção preventiva A manutenção preventiva atua para evitar futuros problemas e insa- tisfações dos usuários. Seu grande objetivo é antecipar o acontecimen- to de anomalias futuras que trarão prejuízos ao software. Continuando com o nosso exemplo, temos que, com as mudanças em seu sistema (estamos falando muito hipoteticamente aqui), você atrai um grande interesse de sua base de usuários e precisa se prepa- rar para um evento de alto tráfego nos próximos dias. Você não tem certeza se o seu servidor pode suportar esse tipo de carga, mas sabe que, se o site cair com tanta atenção, você terá muitos usuários irritados que podem abandonar o seu produto. Assim, você incumbe seu desenvolvedor de proteção contra esse desastre, e ele passa um tempo considerável atualizando o ambiente de hospedagem para que este seja mais escalonável. Ciclo de vida do software 49 Quando muito tráfego atinge um servidor, suas atualizações garan- tem que novos servidores fiquem on-line automaticamente para lidar com o tráfego extra. Não fazia sentido configurar essa infraestrutura de escalonamento automático durante o desenvolvimento, mas, agora que você precisa dela, é fundamental para o sucesso do seu produto. Esse esforço é classificado como manutenção preventiva ou modifi- cação de um produto de software após a entrega para detectar e corrigir possíveis falhas no produto de software antes que elas entrem em vigor. Quanto mais complexo for o software, provavelmente mais manu- tenção será necessário para garantir o uso contínuo. As perguntas ób- vias são “por quê” e “quanto”. Isso varia e é um pouco complicado, pois cada produto de software é diferente. É possível minimizar os custos de manutenção por meio de planeja- mento e execução inteligentes, mas também pode-se acabar pagando mais para manter o produto do que para desenvolvê-lo se o gestor não tomar cuidado. Existem muitos fatores de custo de manutenção de software: ela não se trata apenas de consertar bugs; envolve qualquer esforço para manter as coisas funcionando da maneira que seus usuários esperam que funcione – e, na maioria das vezes, isso significa outra coisa do que simplesmente corrigir defeitos em seu código. Com esta etapa, concluímos o ciclo de desenvolvimento de softwa- re, processo altamente importante dentro da engenharia de softwa- re que busca trazer práticas, ferramentas e metodologias eficazes na construção, entrega e manutenção dos softwares. O livro Não me faça pensar, de Steve Krug, explica que os humanos que usam software ou sites tendem a aceitar a primeira solução que lhes é apresentada. Esse ponto essencial deve ser aproveitado por enge- nheiros de softwares que querem se diferenciar no mercado. O livro se concentra na simplicidade, na objeti- vidade e no bom senso, sendo considerado por muitos essencial para qualquer engenheiro de software. A obra ajuda os desenvolvedores a
Compartilhar