Baixe o app para aproveitar ainda mais
Prévia do material em texto
ENGENHARIA DE SOFTWARE Roque Maitino Neto E-book 1 Neste E-Book: INTRODUÇÃO ����������������������������������������������������������� 3 ENGENHARIA DE SOFTWARE ����������������������������� 5 Crise do Software e Produto de Software �������������������������������6 Conceito de Engenharia de Software ���������������������������������������7 Processos, fases e atividades ��������������������������������������������������9 Modelo em Cascata ����������������������������������������������������������������12 CONSIDERAÇÕES FINAIS �����������������������������������34 REFERÊNCIAS BIBLIOGRÁFICAS & CONSULTADAS �������������������������������������������������������36 2 INTRODUÇÃO Para o bom entendimento da importância do que será abordado nesta disciplina de Engenharia de Software, convidamos você a uma reflexão: imagine um mundo em que não existem modelos de procedimentos, nem padrões a serem seguidos e não há sequer uma indicação de boas práticas para a construção de um artefato qualquer� Imagine também que esse “artefato qualquer” possui características únicas de construção e que há poucas pessoas no mundo capazes de criá-lo� Para dizer o mínimo, estaríamos diante de um cenário desafiador, você não acha? Pois essa era exatamente a realidade que caracteri- zava os primórdios do desenvolvimento de software e que justificou a criação de metodologias e mode- los que, uma vez organizados e estruturados, deram início à área do conhecimento que hoje chamamos Engenharia de Software e que, direta ou indiretamen- te, mudou os rumos da Computação. A importân- cia e a abrangência desta disciplina vêm crescendo continuamente, mas não poderíamos abordar seus aspectos mais avançados sem antes conhecermos seus elementos fundamentais� Por isso, nesta seção estudaremos os conceitos básicos da Engenharia de Software, os principais métodos de desenvolvimento de sistemas e as boas práticas que vêm norteando profissionais há vários anos. Ao final desta etapa, você será capaz de en- tender as iniciativas mais importantes para a padro- 3 nização da construção deste produto tão importante em nosso cotidiano e que vem mudando a feição do mundo muito rapidamente: o software. Bom estudo e sigamos adiante! 4 ENGENHARIA DE SOFTWARE Uma das providências mais eficientes a serem to- madas quando desejamos compreender um assunto em nossa primeira experiência com ele é a de des- vendar os termos que o identificam. A expressão “Engenharia de Software” é composta por dois ter- mos que merecem ser entendidos separadamen- te, mas que farão todo sentido quando colocados juntos� Conhecemos Engenharia como a ciência que, por meio da aplicação de recursos tecnológi- cos, é capaz de criar coisas das quais precisamos� Brockman (2013) afirma que o objetivo principal da Engenharia é aplicar a tecnologia, em combinação com fenômenos naturais, para obter as coisas que desejamos ou de que necessitamos� A definição do termo “Software” é encontrada em di- versos formatos na literatura, mas nossa opção será por uma definição simples, dada por um expoente na área. De acordo com Sommerville (2018), um softwa- re é um programa de computador e a documentação associada a ele� Com programas de computador é provável que você já tenha bastante familiaridade, mas uma das novidades a serem introduzidas por esta disciplina está relacionada à documentação relacionada ao software, incluindo a especificação de requisitos, o projeto e os casos de teste, entre outros documentos� 5 Se a Engenharia é um ramo da atividade humana bastante antigo e em desenvolvimento, a criação de software conta com apenas algumas décadas de idade. No entanto, fica claro que a iniciativa de juntar elementos da Engenharia para a criação de software tenha sido uma boa ideia em tempos em que não havia disciplina metodológica para a criação de produtos de software nem a garantia de que os projetos de desenvolvimento seriam bem-sucedidos� Essas considerações, aliás, nos levam a mais duas definições importantes no contexto. Crise do Software e Produto de Software A primeira definição está relacionada à mencionada “disciplina metodológica” ou, mais especificamente, à falta dela. Na década de 1960 – época que remete aos primeiros momentos do desenvolvimento de software –, alguns observadores criaram a expressão Crise do Software, a fim de explicitar o momento delicado que a atividade atravessava� Imaginamos uma crise como um momento em que a incerteza impera ou em que há a verificação de declínio de um determinado estado de coisas� A Crise do Software, portanto, foi o período em que a atividade de criação de sistemas de computador mostrou-se incapaz de atender à crescente demanda por produção de software. Na falta de padrões e mo- delos eficientes de desenvolvimento, as organizações acabavam entregando produtos cujo funcionamento não atendia às expectativas e que eram construídos 6 por meio de processos falhos, quando eram adota- dos. Como elemento final para esse cenário caótico, a imprecisão nas estimativas de prazo e de custo minava a confiança das equipes e, sobretudo, dos seus clientes� Outro conceito que vale menção é o de Produto de Software. A palavra produto, usada na maioria dos contextos, nos remete a algo comercialmente viável e desenvolvido por meios profissionais. Embora exis- ta a possibilidade de se criar software como hobby ou para gerenciar dados pessoais, a utilização da Engenharia de Software é especialmente recomenda- da para construção de produtos de software voltados a fins comerciais. Conforme destaca Sommerville (2018), a Engenharia de Software se destina a apoiar o desenvolvimento de software profissional, ao in- vés das iniciativas individuais� Em havendo sucesso nessa empreitada, o resultado será, portanto, um produto de software� Conceito de Engenharia de Software Se a Crise do Software revelou um cenário consi- deravelmente adverso para o desenvolvimento de produtos de software de qualidade, ela também ins- pirou iniciativas que tiveram como objetivo a rever- são desse quadro e a consequente viabilização da atividade de criação de sistemas. A mais importante dessas iniciativas foi a padronização de processos 7 e a criação de metodologias, ponto de partida para o nascimento da Engenharia de Software� Foram termos com processo, métodos e qualida- de que fundamentaram os conceitos de Engenharia de Software criados pelos mais importantes auto- res da área. De acordo com Pressman e Maxim, a Engenharia de Software abrange um processo, um conjunto de métodos (práticas) e um leque de ferramentas que possibilitam aos profissionais desenvolverem softwares de altíssima qualidade� (PRESSMAN; MAXIM, 2016, p. 14) De forma bastante simples e atento ao caráter pro- cessual da Engenharia de Software, Sommerville (2018) a define como uma disciplina da Engenharia que se preocupa com os aspectos da produção de software, desde sua concepção inicial até sua ope- ração e manutenção. O autor destaca ainda que as atividades fundamentais da Engenharia de Software incluem especificação, desenvolvimento, validação e evolução do software. Não por acaso, essas atividades fundamentais estão refletidas e detalhadas nas metodologias criadas para produção de software e embasam, sobretudo, o método tradicional de desenvolvimento, do qual trataremos na sequência. Antes, porém, convém definirmos alguns termos que darão sentido à exis- tência das metodologias e justificarão os esforços empreendidos em sua estruturação. 8 Processos, fases e atividades Em sua essência, o desenvolvimento de um software deve ser enfrentado como um processo e não um apanhado de iniciativas isoladas� Um processo bem estruturado tende a prover previsibilidade no resulta- do e racionalidade na aplicação dos recursos dispo- níveis, fatos que aumentam a segurança no desen- volvimento. No contexto da Engenharia de Software, um processo corresponde a passos ordenados que buscama entrega de um software como resultado, e que levam em consideração os recursos disponíveis, bem como as entradas e saídas esperadas� FIQUE ATENTO O processo de software é a maneira pela qual produzimos software� Ele abrange a metodologia – com seu modelo de ciclo de vida – e técnicas subjacentes, além das ferramentas utilizadas e, acima de tudo, os indivíduos que estão criando o software (SCHACH, 2009) Outro termo bastante comum nesse contexto é pro- jeto, que deve ser distinguido de processo. O PMBOK, conhecido como a principal publicação mundial em gerenciamento de projetos, conceitua projeto como um esforço temporário empreendido para criar um produto, serviço ou resultado único (PMI, 2017, p. 4). Um processo, por sua vez, refere-se à definição de como um projeto deve ser conduzido. Na visão de 9 Wazlawick (2013), conduzir o desenvolvimento de um software como um processo reduz o tempo de adaptação da equipe aos procedimentos e contribui para a criação de produtos mais padronizados. Para que se atinja um melhor domínio intelectual de um processo, ele foi dividido em fases� Uma fase agrupa atividades que guardam afinidades entre si e que possuem objetivos comuns a serem atingi- dos. Nesse contexto, as atividades têm a finalidade de criar artefatos e caracterizam-se por possuírem entradas, saídas, recursos e atores bem definidos. Podemos considerar que um artefato seja um do- cumento, a descrição de um fluxo ou um diagrama, entre outros elementos� Em relação a um processo de software, há ainda que se destacar um aspecto importante e que o caracteriza: o fluxo dos processos. De acordo com Pressman e Maxim (2016), esse fluxo descreve como são organizadas as ações e tarefas que ocorrem no âmbito de cada atividade, em relação à sequência e ao tempo. Os processos podem seguir um fluxo paralelo, evolucionário, interativo e linear, ainda de acordo com os mencionados autores� Por ora, nos- so interesse recai sobre o fluxo de processo linear, representado na figura 1. 10 Planejamento Comunicação Modelagem Construção Entrega Figura 1: Fluxo de processo linear. Fonte: Pressman e Maxim (2016, p. 33) Como a própria ilustração e o nome sugerem, um fluxo de processo linear executa, em sequência, cada uma das cinco atividades tomadas como exemplo. Bem, se um processo se divide em fases e cada fase é cumpri- da por meio da execução de tarefas sistematicamen- te agrupadas, então estamos perto de uma solução capaz de transformar a construção de um software em uma atividade planejada, previsível e segura, não é mesmo? Infelizmente as experiências passadas não nos autorizam a responder com um “sim” a essa questão, embora a utilização de uma metodologia seja absolutamente indispensável nesse contexto. A presunção de que o cumprimento de etapas dis- postas linearmente e executadas por gente com es- pecialização nas respectivas tarefas resultaria – em qualquer caso e sob quaisquer circunstâncias – em um produto de software de qualidade esteve entre as crenças mais comuns dos engenheiros de softwa- re do século 20. Dessa lógica nasceu o Modelo em Cascata, principal método da sistemática tradicional de desenvolvimento de software e que será abordado na sequência� 11 Modelo em Cascata Foi com base em uma linha de produção que o mo- delo em cascata de desenvolvimento foi criado� Embora saibamos hoje que o meio utilizado para se criar um bem de consumo tradicional (um carro, por exemplo) não seja completamente adequado para a produção de um software, esse modelo predominou durante anos e ainda é base para procedimentos que as organizações de software utilizam. Rezende (2005) nos ensina que o ciclo de vida de um software inclui as seguintes fases: concepção, construção, implantação, implementações, maturidade, declínio, manutenção e descontinuidade. Essa divisão de fa- ses baseia-se no Modelo em Cascata, que divide o processo de software conforme ilustrado na figura 2. Comunicação Planejamento Modelagem Construção Entrega Figura 2: Representação das fases do Modelo em Cascata. Fonte: adaptado de Pressman e Maxim (2016, p. 42) A primeira fase, identificada como Comunicação, aborda o início do projeto e o levantamento de requi- sitos. Depois, durante o Planejamento, são feitas as 12 estimativas do projeto, o cronograma e o acompa- nhamento desses artefatos. A Modelagem é a fase que inclui a elaboração da análise e do projeto do software. A fase de Construção, por sua vez, prevê a codificação do produto e a aplicação dos testes e, por fim, a Entrega inclui os procedimentos de entrega do produto, as atividades de suporte e os registros de feedback do cliente. Antes de prosseguirmos, vale o registro de que os no- mes das fases do Modelo em Cascata vêm sofrendo alterações e que, portanto, podem ser encontrados de forma diversa da aqui representada� É comum, em obras mais antigas, que as fases sejam identificadas como Requisitos, Projeto, Implementação, Teste e Manutenção. Nesse sentido, a definição dada para o Modelo em Cascata por Pressman e Maxim (2016) é a de que se trata de um procedimento que sugere uma abordagem sequencial para o desenvolvimento de software, começando com a especificação de re- quisitos do cliente, avançando pelas fases de planeja- mento, modelagem, construção e disponibilização, e culminando no suporte contínuo ao produto concluído� A abordagem ao Modelo em Cascata estaria seria- mente comprometida se não fosse oferecida expli- cação para cada fase, por resumida que seja. Na sequência, trataremos das fases do modelo, consi- derando as nomenclaturas tradicionais� Requisitos: não por acaso, a abordagem dos requi- sitos de um produto de software encontra-se na fase inaugural do modelo. Aqui são realizadas as 13 atividades de elicitação (ou descoberta), análise, especificação e validação dos requisitos, entendidos genericamente como as condições necessárias para que o software cumpra seus objetivos� Em caráter mais específico, um requisito de software pode ser traduzido como suas características, suas funciona- lidades, suas restrições e as demais condições para que ele se transforme em um produto perfeitamente adequado ao seu propósito� O entendimento de que os requisitos levantados no início do processo permanecerão inalterados durante todo o ciclo de construção do software conduziu mui- tos projetos ao fracasso� Os requisitos certamente mudarão com o tempo, seja em sua natureza, grau de importância ou prioridade de desenvolvimento, e o Engenheiro de Software deve estar preparado para essa realidade� Outro aspecto a ser considerado nessa fase está relacionado à qualidade de execução das tarefas de requisitos. A criação de um projeto de software – eta- pa posterior a esta – ficará seriamente comprometida se a abordagem dos requisitos for feita de maneira inadequada� Imagine que o cliente solicite à equipe de requisitos uma certa funcionalidade em seu sis- tema e que, mediante a compreensão falha dessa funcionalidade, a equipe informe aos projetistas algo diferente daquilo desejado pelo cliente� Infelizmente essa situação é bastante comum e vem colocando projetos em risco há anos� 14 Via de regra, o artefato produzido na fase de requi- sitos é um documento chamado Especificação de Requisitos de Software ou Software Requirements Specification (SRS). Idealmente, esse documento deve conter a descrição das funcionalidades e das restrições, além das necessidades de armazena- mento, requisitos mínimos de hardware e tudo o que caracterizar o produto. Um modelo viável de SRS pode conter os seguintes tópicos, segundo Pressman e Maxim (2016, p. 136): 1. Introdução 1�1� Finalidade 1�2� Convenções do documento 1.3. Público-alvo e sugestões de leitura 1.4. Escopo do projeto 1.5. Referências 2. Descrição geral 2�1� Perspectiva do produto 2�2� Características do produto 2.3. Classes e características do usuário 2.4. Ambiente operacional 2.5. Restriçõesde projeto e de implementação 2.6. Documentação para usuários 2.7. Hipóteses e dependências 3. Características do sistema 4. Requisitos de interfaces externas 4.1. Interfaces de usuário 4.2. Interfaces de hardware 15 4.3. Interfaces de software 4.4. Interfaces de comunicação 5. Outros requisitos não funcionais 5.1. Requisitos de desempenho 5.2. Requisitos de segurança (privacidade) 5.3. Requisitos de segurança (integridade) 5.4. Atributos de qualidade de software 6. Outros requisitos Fica claro que, quanto mais completo e detalhado for esse documento, menos dúvidas restarão para as fases seguintes do projeto. Antes de iniciarmos a descrição da próxima etapa, vale o registro de que, quando identifica uma etapa do Modelo em Cascata, o termo “Projeto” assume o significado de desenho, esboço ou esquema� Projeto: depois de eliciados (ou esclarecidos), clas- sificados, documentados e validados os requisitos, o ciclo de produção se encaminha para o desenho do produto� É comum o entendimento de que os re- quisitos refletem o que o sistema deverá executar, enquanto o projeto deverá refletir como as funções serão executadas. Um dos objetivos a serem alcan- çados na etapa de projeto é a obtenção de uma ver- são refinada dos requisitos, em uma representação mais apta a ser codificada. O caminho para essa versão refinada dos requisitos passa também pela decomposição do produto em módulos, entendidos 16 como blocos de código que representam funções do software� É por meio do projeto que os Engenheiros de Software têm a possibilidade de modelar o sistema a ser cons- truído e, em consequência, realizar avaliações prévias sobre sua qualidade, antes mesmo de ser codificado. A etapa de projeto é tão rica que é possível que se gere várias representações do software� Conforme nos ensina Pressman e Maxim (2016), a arquitetura do sistema deve ser representada como peça ini- cial do projeto. Depois, são modeladas as interfaces do sistema, cuja função é a de conectá-lo aos seus usuários e a outros sistemas� Por último, os compo- nentes de software usados para construir o sistema são projetados. Já Schach (2009) defende que a fase de Projeto clássica é composta por três atividades: projeto de arquitetura, projeto detalhado e testes do projeto� É durante o projeto de arquitetura que uma composição modular do produto é criada, representada por uma lista de módulos e uma descrição das conexões entre eles. Antes de prosseguirmos com um exemplo, vale registrar que a arquitetura de um software se refere à sua organização geral e aos modos pelos quais ele disponibiliza integridade conceitual para o sistema (PRESSMAN; MAXIM, 2016). A figura 3 ilustra um exemplo de parte da arquitetura de um sistema, com módulos dispostos hierarquicamente� Já o projeto detalhado, também conhecido como projeto modular ou projeto físico, é o tipo de repre- 17 sentação em que o módulo é detalhado por meio de algoritmos e da escolha das respectivas estru- turas de dados� Em outras palavras, cada módulo representado por um retângulo na figura 3 terá sua função descrita por meio de algoritmos, incluindo as variáveis e demais estruturas de dados que viabili- zam sua existência. Tanto no projeto de arquitetura como no projeto detalhado, as interconexões entre os módulos não são contempladas. ERP Estoque e Custos Movimentações Fiscais Movimentações Internas Saldo Inicial Saldo Atual Cadastros de Produtos Grupos de Produtos Cadastros de Fornecedores Saldos MovimentaçõesCadastros Figura 3: Representação hierárquica de parte da arquitetura de um sistema� Fonte: Elaborado pelo autor A terceira atividade, identificada como testes do pro- jeto, efetiva-se com a aplicação de validações nas várias versões de um projeto, não necessariamente 18 em sua versão final. Tais validações têm a função de evitar que erros nesta fase se propaguem para fases seguintes, comprometendo todo o desenvolvimento� Antes de terminarmos a abordagem de projeto de software, vale desenvolvermos o que representa abs- tração nesse contexto. Quando considerarmos o projeto como uma solução modular para o problema (ou seja, baseada em módulos do sistema), temos a possibilidade de descrever os módulos em vários níveis de abstração. Um módulo identificado como “Função de Desenho” certamente está em um nível de abstração bastante alto e essa sua identificação não é capaz, por exemplo, de transmitir detalhes pro- cedimentais para aquele que deverá ter a missão de codificar o sistema. Se considerarmos a necessidade de baixar o nível de abstração, algum detalhamento deveria ser forneci- do, por exemplo, “a função de desenho do software gráfico deverá possibilitar ao usuário a construção de linhas retas e de curvas e os desenhos produzidos deverão ser gravados em uma pasta própria para desenhos”. Embora esse nível de abstração forneça elementos descritivos mais consistentes, ele ainda carece de uma representação mais próxima daquela regularmente entendida pelo responsável pela imple- mentação, que é o próximo passo do processo. Por isso, a funcionalidade pode ser ainda mais detalhada e formatada de maneira mais apropriada: 19 inicio funcionalidade_desenho interacao_com_usuario, criacao_de_desenhos, exibicao_de_graficos, gerenciamento_arquivos_desenho, fim funcionalidade_desenho. A depender da política adotada por cada organização, a criação de níveis de abstração mais baixos pode ser necessária para composição do projeto, de modo que a função de cada módulo fique com alto nível de detalhamento e, em consequência disso, o trabalho do desenvolvedor seja facilitado� Implementação: posicionada como etapa imediata- mente seguinte à de projeto, a implementação tem como objetivo transformar os artefatos obtidos na etapa de projeto em código executável, por meio da utilização de uma linguagem de programação. Implementação, então, é o processo de converter o projeto detalhado em código (SCHACH, 2009). Considerada a complexidade dessa atividade, a co- dificação é usualmente feita por equipes, com atu- ações simultâneas em partes distintas do sistema� Como estratégia de implementação, uma equipe pode particionar as tarefas, de modo que cada de- senvolvedor assuma um módulo do sistema� Nos primórdios do desenvolvimento de software para fins comerciais, escolher uma linguagem de progra- mação para a codificação do sistema não era a mais difíceis das tarefas. Afinal, a variedade de linguagens 20 era reduzida e a escolha recairia inevitavelmente sobre aquela que apresentasse facilidades para desenvol- vimentos específicos. Assim, um sistema com incli- nação científica usaria uma certa linguagem; um pro- grama de controle empresarial usaria outra linguagem e assim por diante� Um erro nessa escolha poderia comprometer seriamente o projeto� Em nossos dias, no entanto, o cenário é bem dife- rente� Com os recursos atuais, as escolhas das lin- guagens passam por outros critérios, considerando que, tecnicamente, a maioria irá suprir amplamente as necessidades dos desenvolvedores� Salvo pela existência de detalhes muito específicos relaciona- dos a plataformas, tanto o Java quanto as linguagens oferecidas pelo .NET, por exemplo, estarão aptas a dar vida à grande maioria dos projetos� Podemos considerar, então, que critérios mais sub- jetivos possam ser aplicados na escolha de uma plataforma de desenvolvimento (incluída aqui a lin- guagem de programação). Um desses critérios é a familiaridade da equipe com os recursos de desen- volvimento disponíveis no mercado� Imaginemos o seguinte cenário: ao propor o sistema, o cliente não fez qualquer restrição à linguagem de programa- ção que deveria ser utilizada, deixando essa escolha sob responsabilidade dos desenvolvedores. Em não havendo restrição técnica, é certo que as equipes escolherão a plataforma de desenvolvimento com a qual tenham mais afinidade. 21 A familiaridade com a linguagem de programaçãopor parte dos desenvolvedores pode ser, inclusive, vinculada ao seu grau de popularidade entre desen- volvedores pelo mundo. Eastwood (2020) oferece as dez linguagens mais populares, mais a principal característica de cada uma delas� O quadro 1 sinte- tiza os dados das cinco primeiras, com o objetivo de ajudá-lo a formar base para suas escolhas� Posição Linguagem de Programação Principal característica 1 Phyton Python é considerada uma linguagem de programação fácil de aprender, devido à sua sintaxe simples. Ela conta com vasta biblioteca de padrões e facilidade de integração com outras linguagens de programação populares, como C e C ++ 2 JavaScript JavaScript é a linguagem de programa- ção mais popular para construir sites interativos. Quando combinado com o Node�js, os programadores podem usar JavaScript para produzir conteúdo da web no servidor antes que uma página seja enviada ao navegador, que pode ser usado para criar jogos e aplicativos de comunicação que são executados direta- mente no navegador� 3 Java Java é a linguagem de programação mais comumente associada ao desenvolvi- mento de aplicativos cliente-servidor, usados por grandes empresas em todo o mundo� O Java foi projetado para ser uma linguagem de programação fracamente acoplada, o que significa que um aplica- tivo escrito em Java pode ser executado em qualquer plataforma que suporte Java� Como resultado, o Java é descri- to como a linguagem de programação “escreva uma vez, execute em qualquer lugar”� 22 4 C## A Microsoft desenvolveu o C# (lê-se C Sharp) como uma variante mais rápida e segura da linguagem C� Ele é totalmente integrado com a plataforma de software .NET da Microsoft, que oferece supor- te ao desenvolvimento de aplicativos para Windows, plug-ins de navegador e dispositivos móveis� O C# oferece bases de código compartilhadas, uma grande biblioteca de código e boa variedade de tipos de dados� 5 C Junto com Python e Java, a linguagem C constitui uma boa base para aprender a programar� Como uma das primeiras linguagens de programação já desenvol- vidas, o C serviu como base para escrever linguagens mais modernas, como Python, Ruby e PHP. Também é uma linguagem fácil de depurar, testar e manter� Tabela 1: As cinco linguagens de programação mais popu- lares� Fonte: adaptado de Eastwood (2020) Outro elemento importante da etapa de implementa- ção está relacionado às boas práticas que devem ser aplicadas durante seu curso, independentemente da linguagem utilizada. De acordo com Schach (2009), a primeira recomendação trata do uso de nomes de variáveis significativos e padronizados. O desenvol- vedor deve considerar que seus pares um dia deverão aplicar manutenção no módulo ou trecho que ele desenvolveu e que identificadores coerentes com suas funcionalidades facilitarão o trabalho alheio. A segunda recomendação, ainda na visão de Schach (2009), diz respeito à documentação do sistema. O entendimento sobre as funções e a quantidade de documentação necessária no código vem mudando 23 nos últimos anos, mas a importância desse recur- so ainda permanece inalterada, pois se aplica aqui também a lógica da necessidade de manutenção no código. Com a intenção de padronizar a documenta- ção voltada ao código, a Sun Microsystems criou o Javadoc, um gerador de documentação de classes e demais elementos do Java� SAIBA MAIS Um vídeo bastante interessante sobre a utili- dade do Javadoc, chamado O que é JavaDoc e para que serve, do professor Jean Vargas, pode ser acessado em https://www.youtube.com/ watch?v=QCOiKGyd0p8� A última recomendação está relacionada à disposi- ção de escrita do código e foi colocada pelo autor em um contexto chamado layout do código para maior legibilidade. Segundo ele, a endentação talvez seja a técnica mais importante para melhorar a legibili- dade do código. Apenas para registro, o sinônimo do termo “endentar” é encaixar. Outro recurso bem útil na facilitação da leitura do código é a utilização de linhas em branco, usadas principalmente para subdividir blocos de código� Passamos agora para a abordagem da próxima etapa, que compreende as atividades de teste do software� Testes: Em sua definição mais difundida, testar signi- fica executar um programa com o objetivo de revelar 24 a presença de defeitos ou para aumentar a confiança nesse programa, caso o objetivo principal não possa ser cumprido� Idealmente, a etapa de teste deveria ser aplicada de forma diluída por todas as outras, a fim de validar os artefatos produzidos pelo ciclo de vida até aqui� No entanto, nossa abordagem estará restrita ao teste aplicado no código de um progra- ma já pronto ou, nos casos que destacaremos, em unidades desse programa� Por serem constituídos por várias fases, os testes são desenvolvidos em uma sequência de ações e tal sequência é executada com o objetivo de encontrar problemas no software, o que aumenta a percepção de qualidade geral do software, garantindo que o usuário final tenha um produto que atenda às suas necessidades (PINHEIRO, 2015). O objetivo de um teste, portanto, é o de encontrar inconsistências no produto ou em uma parte dele. Antes de tratarmos especificamente do processo de teste, será neces- sário abordarmos alguns elementos dos testes, co- meçando por alguns dos seus tipos� Teste de unidade: o primeiro tipo a ser desenvolvi- do é o teste de unidade� Para entendê-lo, devemos imaginar o programa como um conjunto de partes, que formam o produto completo quando integradas� Assim, o teste de unidade é aquele aplicado em uma classe, funcionalidade ou módulo, com a finalidade de encontrar e eliminar defeitos naquele contexto. De acordo com Pressman e Maxim (2016), o teste de unidade concentra a verificação na menor unidade do projeto de software� 25 Para a realização dos testes de unidade, o testador implementa um trecho de código que substituirá as entradas necessárias para o funcionamento da uni- dade em teste� Este trecho de código é conhecido como stub e, segundo Pinheiro (2015), ele simula resultados que são retornados por um determinado componente do qual o software depende� Teste de integração: trata-se de um tipo de teste executado para garantir que vários componentes do sistema funcionam corretamente juntos. Eles são executados quando as unidades já tiverem passado pelos testes de forma isolada e precisam ser integra- das para gerar uma nova versão do software. Caso os componentes (módulos ou classes, por exemplo) que estão sendo testados ainda precisem de comunicação com outros componentes ou clas- ses que ainda não foram implementadas, novamente os stubs serão necessários. O problema com um stub é que se investe tempo para desenvolver uma função que não será efetivamente entregue. Além disso, nem sempre é possível saber se a simulação produzida pelo stub será suficientemente adequada para os testes (WAZLAWICK, 2013). Teste de sistema: mesmo depois de testada cada unidade isoladamente, e a comunicação entre as unidades, é necessário ainda testar o funcionamento do sistema de modo global, adotando o ponto de vista de quem usará o sistema� O objetivo do teste de sistema é o de apurar se o programa é capaz de 26 executar processos completos, como se estivesse em uso pleno� Teste de usuário: aplicado o teste de sistema, o produto final deve ser aceito pelo usuário. Como o nome sugere, esse teste é executado pelo usuário e não pela equipe de testadores ou desenvolvedores. Em relação ao planejamento e à execução, o teste de usuário se equipara ao teste de sistema, com a diferença de que ele será executado pelo usuário. Se considerarmos que o teste de sistema ainda é parte da verificação do produto, o teste de aceitação serve para sua validação. Na visão de Pressman e Maxim (2016), esses tipos de testes fazem parte da estratégia de testes ado- tada pela equipe� De forma interessante, os autores relacionam os testes com etapas do ciclo de vida dosoftware, conforme ilustrado na figura 4. 27 Teste de sistema Teste de validação Teste d e integração Teste de unidade Código Requisitos Engenharia de sistemas Projeto Figura 4: Estratégia de teste� Fonte: Pressman e Maxim (2016, p. 470) O teste de unidade começa no centro da espiral e relaciona-se com as unidades construídas no código- -fonte. Em seu caminho rumo ao exterior da espiral, o processo segue para o teste de integração, que se concentra no projeto e na arquitetura do software� Em seguida, vem o teste de validação, que baseia seus processos nos requisitos do sistema. Por fim, chega-se ao teste de sistema, no qual o software e todos os seus elementos são testados globalmente. Outro elemento importante no domínio dos tes- tes e que vale nossa atenção é o caso de teste� Conceitualmente, um caso de teste é o par formado por uma entrada no programa e a correspondente saída esperada, planejada de acordo com os requi- sitos do sistema� Um dado de entrada corresponde a uma condição necessária para uma execução do 28 programa. A saída esperada é o resultado de uma execução do programa ou unidade determinada. Como exemplo de casos de teste, vamos assumir que um programa que realiza a validação de datas inseri- das pelo usuário esteja sendo testado� Poderíamos ter (01/01/2023; “data válida”) como um par viável para caso de teste e, ao receber a data 01/01/2023 como entrada, o programa de validação de data de- veria retornar “data válida”. A utilização de um bom conjunto de casos de teste será fundamental para o sucesso da atividade e, nesse sentido, o testador não poderia imaginar um conjunto que contivesse apenas datas válidas como entradas� Com base na disponibilidade do código-fonte ao tes- tador, na disponibilidade de ferramentas de teste e na natureza do sistema a ser testado, será possível à equipe adotar determinada técnica de teste� Embora existam em maior número, trataremos aqui das duas principais técnicas: a funcional e a estrutural. Teste Funcional: tida como a mais simples e mais fácil de ser aplicada, essa técnica baseia-se nas especificações do software para derivar os requi- sitos de teste� O teste é realizado diretamente nas funções do programa, o que lhe rendeu o nome de teste funcional. Não é seu objetivo verificar como ocorrem internamente os processamentos, mas se o algoritmo inserido produz os resultados esperados (BARTIÉ, 2002). Por se basear nas funcionalidades, essa técnica não obriga o conhecimento de detalhes 29 da implementação do programa nem o código-fonte é necessário para que ela se efetive� Embora seja de aplicação simples (conforme já mencionado), essa técnica apresenta uma desvan- tagem, representada pela incerteza de que todas as partes essenciais do programa foram executadas ao se executar suas funções, mesmo com um bom conjunto de casos de teste. Uma representação da técnica funcional é dada pela figura 5. Nela é pos- sível observar que os casos de teste são inseridos no teste e os resultados são apurados, sem que a estrutura interna do programa seja conhecida� Desse fato nasceu o outro nome desta técnica, conhecida também como “caixa preta”. ResultadosCasosde teste Figura 5: Visão de teste de caixa preta. Fonte: Bartié (2002, p. 105) Teste Estrutural: os testes estruturais (ou de caixa bran- ca) baseiam-se na arquitetura interna do programa. Com o código-fonte, o testador submete o programa a uma ferramenta automatizada de teste, que permite a observação dos trechos do programa executados pelos casos de teste. Apesar de ser mais eficiente em encontrar defeitos na maioria dos casos, sua aplicação é mais complexa e requer mais recursos. 30 Feitas essas considerações, fechamos a abordagem da etapa de testes com a menção às suas etapas. Embora possa variar entre metodologias, o processo de teste é usualmente dividido em quatro etapas: 1. Planejamento: nessa etapa, algumas decisões devem ser tomadas como meio de fundamentar o restante do processo de teste. Deve ser definido, por exemplo, quem executa os testes, qual o período disponível para isso, com quais recursos os testes serão feitos e quais as técnicas a serem utilizadas. Em relação aos responsáveis pela execução dos tes- tes, vale um registro: embora os desenvolvedores do programa sejam as pessoas que, na teoria, melhor o conhecem, eles terão interesse em provar que o produto que desenvolveram é livre de erros, o que pode comprometer o procedimento� 2. Projeto de casos de teste: nessa etapa devem ser definidos os casos de teste que serão utilizados nos testes� Nunca é demais repetir que, quanto melhor os casos de teste, mais chances o procedimento terá de revelar defeitos no código� 3. Execução do teste: nessa etapa, aplica-se o teste definido na fase de planejamento, com os casos de teste definidos na etapa anterior a esta. 4. Análise dos resultados: nessa etapa final verifica- -se se os testes retornaram resultados satisfatórios ou se precisam ser refeitos, com outros casos de teste ou outra técnica� 31 Manutenção: Depois de trilhar todo o caminho que começou no planejamento e terminou com a sua entrega, esperamos que nosso produto de software esteja apto a ser utilizado sem contratempos pelo cliente. Afinal, sabemos que ele foi construído com base em uma metodologia bem estruturada e que acabou de passar por testes e correções feitas an- tes da entrega. Além disso, os desenvolvedores que trabalharam nesse projeto são tidos como tecnica- mente muito bons e seus programas são sempre de alta qualidade� Considerando esse cenário, nem seria o caso de nos preocuparmos com a etapa de manutenção, não é mesmo? A resposta, em todas as circunstâncias, será não. Embora os requisitos do usuário estejam expressos no programa através de suas funcionalidades, é natu- ral que esse programa sofra alterações e passe por evolução, já que os requisitos podem ser modificados depois da entrega. Além disso, quando colocado em operação diária, é comum que o programa manifeste erros não detectados pela equipe de teste, o que de- verá implicar em retrabalho para os desenvolvedores� A manutenção é, portanto, parte importante do ciclo de vida do software e deve receber a mesma atenção e contar com os mesmos recursos oferecidos nas outras fases� A manutenção de software é definida como o tra- balho aplicado em modificações em um produto de software após sua entrega ao cliente, com o propó- sito de corrigir inconsistências, aprimorar seu de- sempenho e/ou adaptar o produto a um ambiente 32 diferente daquele para qual ele foi concebido. Não podemos, portanto, relacionar manutenção apenas a correções no programa� Ela representa, inclusive, a oportunidade de fazer o produto evoluir, sem que suas principais características sejam afetadas� Uma boa manutenção terá impacto positivo na utilidade do produto e, em consequência, na satisfação do cliente. Não por acaso, “manutenção de software” vem dan- do lugar a “evolução de software”, expressão mais adequada se considerarmos que as atividades de modificação de um produto operacional não visam a mantê-lo em seu estágio atual, mas fazê-lo evoluir de forma a adaptar-se a novos requisitos ou ainda corrigir defeitos (WAZLAWICK, 2013). Apesar da sua importância no contexto, a evolução do software sempre demandará esforços e investimento finan- ceiro e de mão de obra, e essa realidade deverá ser levada ao cliente antes de a evolução ser efetivada. 33 CONSIDERAÇÕES FINAIS Esse foi o conteúdo que queríamos compartilhar e, por meio dele, esperamos ter transmitido a você a importância da familiaridade com os elementos básicos da Engenharia de Software. Abrimos este capítulo tratando do fenômeno conhecido como Crise do Software justamente para estabelecermos o que não desejamos mais em nossos processos de de- senvolvimento e para entendermos quais problemas a aplicação desta disciplina deve endereçar. Depois de conceituarmos Engenhariade Software, buscamos entender como ela se utiliza do conceito de processos para estruturar suas metodologias e, dessa forma, oferecer aos profissionais do desen- volvimento um meio seguro e – em certa medida – previsível para construir seus produtos. Na se- quência, tratamos de todo o ciclo de vida clássico (ou Modelo em Cascata), detalhando suas etapas e contextualizando-as como passos necessários para a obtenção de um produto de qualidade. Apesar de seus conceitos e práticas estarem passando por atualizações, sabemos que o Modelo em Cascata serve como fundamento processual para a maioria das metodologias mais modernas� Mas, será que a Engenharia de Software se faz ape- nas com os elementos que estudamos aqui? Será que apenas as metodologias tradicionais são capazes de atender nossa demanda por desenvolvimentos ágeis e de elevada qualidade? Ao contrário do que essas 34 questões podem nos fazer supor, a Engenharia de Software tem muito mais a oferecer à comunidade de desenvolvedores e a pessoas ligadas à Computação, e sua constante evolução tem contribuído para que sua relevância cresça sempre� 35 Referências Bibliográficas & Consultadas BARTIÉ, A. Garantia da qualidade de software: as melhores práticas de engenharia de software apli- cadas à sua empresa. Rio de Janeiro: Elsevier, 2002. BROCKMAN, J. B. Introdução à engenharia: modelagem e solução de problemas. Rio de Janeiro: LTC, 2013. COHN, M. Desenvolvimento de software com scrum: aplicando métodos ágeis com sucesso. Porto Alegre: Bookman, 2011. [Minha Biblioteca] EASTWOOD, B. The 10 most popular programming languages to learn in 2020. Disponível em: https:// www.northeastern.edu/graduate/blog/most-popular- -programming-languages. Acesso em: 21 out. 2020. PAULA FILHO, W. P. Engenharia de software: funda- mentos, métodos e padrões. 3. ed. Rio de Janeiro: LTC, 2009. [Minha Biblioteca] PFLEEGER, S. L. Engenharia de software: teoria e prá- tica. 2. ed. São Paulo: Prentice Hall, 2004. [Biblioteca Virtual] PINHEIRO, Á. F. Fundamentos de engenharia de software: qualidade com testes e gerência. 1. ed. Volume VI. Recife: Publicação independente, 2015. PMI� Guia PMBOK: um guia de conhecimento em gerenciamento de projetos. 6. ed. Pensilvânia: Project Management Institute, 2017. PRESSMAN, R.; MAXIM, B. Engenharia de software: uma abordagem profissional. 8. ed. Porto Alegre: AMGH, 2016. [Minha Biblioteca] REZENDE, D. A. Engenharia de software e sistemas de informação. 3. ed. Rio de Janeiro: Brasport, 2005. SBROCCO, J. H. T. C.; MACEDO, P. C. Metodologias ágeis: engenharia de software sob medida. São Paulo: Érica, 2012. [Minha Biblioteca] SCHACH, S. R. Engenharia de Software: os paradig- mas clássico e orientados a objetos� 7� ed� Porto Alegre: AMGH, 2009. SOMMERVILLE, I. Engenharia de software. 10. ed. São Paulo: Pearson Education do Brasil, 2018. [Biblioteca Virtual] VAZQUEZ, C. E.; SIMÕES, G. S. Engenharia de requi- sitos: software orientado ao negócio. Rio de Janeiro: Brasport, 2016. [Biblioteca Virtual] WAZLAWICK, R. S. Engenharia de software: conceitos e práticas. Rio de Janeiro: Elsevier, 2013. Introdução Engenharia de Software Crise do Software e Produto de Software Conceito de Engenharia de Software Processos, fases e atividades Modelo em Cascata Considerações finais Referências Bibliográficas & Consultadas
Compartilhar