LIÇÃO 14 - Engenharia de Software:
conceitos e premissas
conceitos e premissas
Nesta lição, compreenderemos a importância da área da Engenharia de Software para que os produtos de software sejam desenvolvidos de forma rápida e correta. Nós nos aprofundaremos, ainda, em algumas questões da Engenharia de Software para percebermos as implicações mais amplas do trabalho de um profissional na área da Informática. Que tal? Então, compreendamos um pouco mais sobre essa área.
Os softwares têm sido, cada vez mais, importantes e presentes no nosso dia a dia, e, por isso, os profissionais envolvidos no processo de desenvolvimento de software devem ser cada vez mais qualificados.
Imagine a importância desse conhecimento para o desenvolvimento de produtos de grande complexidade, como, por exemplo, a gestão de um hospital, que envolve consultas, hospitalização, cirurgia, entre outras atividades; ou um site de compras on-line com diversos fornecedores, como, por exemplo, Amazon ou Mercado Livre. Você já se imaginou trabalhando na construção de um produto de software como esses?
Lembra da lição anterior, em que conversamos sobre o desenvolvimento de um aplicativo para a gestão das notas do colégio? Agora, imagine desenvolver um software que faça toda a gestão escolar. Falamos sobre realizar a matrícula dos alunos, fazer a organização de turmas, gerir os dados do professor e de seus alunos, lançar notas, entre tantas outras atividades. Você consegue perceber que o processo de desenvolvimento desse software será complexo?
Imagine, então, um sistema que possa colocar em risco a vida humana, como, por exemplo, um sistema de apoio à vida em uma UTI. É necessário ter um conhecimento aprofundado para garantir o perfeito funcionamento desses produtos de software. Por isso, aprenderemos um pouco mais como esse processo deve ser feito para que você possa entregar um software com qualidade.
“O software está morto!”. Em 2011, o engenheiro de software e autor de vários livros na área, Roger Pressman, ficou tão surpreso quanto você ao ouvir essa frase de um executivo de uma grande empresa que estava lucrando muito com seus produtos (PRESSMAN, 2011). Como era possível o responsável por uma empresa que estava lucrando tanto com um produto dizer que essa mercadoria “estava morta”, ou seja, que não seria mais rentável? Esse executivo explicou a Roger que, até então, o software era encomendado, e o cliente se tornava tanto proprietário desse software quanto responsável pelo seu gerenciamento. Porém, a tendência do mercado era de que o software passasse a ser distribuído via internet.
Talvez, você não se recorde, mas pergunte aos seus pais como era feita a atualização dos softwares do seu computador, como o Microsoft Office, por exemplo. Era necessário, a cada atualização do software, comprar a nova versão em CD ou DVD e instalá-la novamente no computador. Ou seja, a empresa produzia, mas cabia ao cliente o gerenciamento da atualização da versão e a instalação. Com a distribuição pela internet, essa gestão passou a ser da empresa produtora, que se tornou responsável por manter a versão mais atual no servidor. Assim, sempre que houver uma modificação ou correção, o software deve ser atualizado para todos os usuários.
E qual é a consequência disso? Se houver uma falha no software, todos terão essa falha. Já imaginou todos os computadores do mundo parando ao mesmo tempo por conta de uma falha no Microsoft Office? Por isso, a importância do uso correto e eficiente dos métodos e das ferramentas da Engenharia de Software.
Então, o que o executivo quis dizer com a frase “o software está morto” lá em 2011? Ele fazia referência ao software que era construído nos moldes antigos, em que o cliente tinha obrigação de fazer a gestão. A tendência atual é o software ser responsabilidade da empresa que o constrói, por meio de sua manutenção e gestão; outra mudança é que, agora, eles ficam disponíveis em servidores web ou plataformas de app.
A área da Engenharia de Software nos capacita para o desenvolvimento de produtos de software complexos dentro do prazo e com qualidade, dois aspectos importantes para o sucesso de um projeto.
O interessante é que a estruturação dessa área foi proposta na conferência da OTAN (Organização do Tratado do Atlântico Norte) no ano de 1969. Nessa conferência, foram discutidos os problemas no desenvolvimento de software, pois, nessa época, havia grande atraso na entrega do produto de software, muitas funcionalidades necessárias para os usuários não eram entregues, o custo era maior do que o esperado e, pior, o produto de software não era confiável. Você consegue imaginar a grande insatisfação dos clientes?
Então, essa área surgiu, portanto, para contornar a crise do software, procurando aprimorar o processo de desenvolvimento de software para que este tenha mais qualidade, seja mais sistemático e controlado por meio de seus processos, métodos e ferramentas, conforme apresentado na Figura 1.
A camada qualidade pretende promover uma cultura de aperfeiçoamento contínuo da camada seguinte, os "processos". Essa cultura é que leva ao desenvolvimento de abordagens melhores para a Engenharia de Software. Essa camada é a parte fundamental que sustenta a Engenharia de Software!
A camada processos é responsável por manter a camada de métodos e ferramentas coesa, possibilitando o desenvolvimento de software de forma racional e dentro do prazo. Essa camada define uma metodologia que deve ser estabelecida para que se possa ter uma entrega efetiva do produto de software. Essa camada é, portanto, a base para realizar o gerenciamento de projetos, produzir diferentes produtos a partir de modelos, documentos, entre outros. Por fim, estabelecer marcos, garantir a qualidade e gerir as mudanças do produto de software.
A camada métodos e ferramentas é responsável por fornecer informações técnicas para desenvolver o software. O que seriam os métodos? De forma simplista, podemos dizer que são padrões para realizar a comunicação com o cliente, a análise de requisitos, a modelagem do projeto, a construção do software, os testes e o suporte. Ou seja, apresentam detalhes do que deve ser feito durante o processo de desenvolvimento de software. Os métodos podem envolver um amplo conjunto de tarefas. As ferramentas possibilitam a automatização e permitem que os métodos sejam realizados de forma mais eficiente.
Parece muito complexo? Então, traremos um exemplo do nosso dia a dia: cozinhar! Para cada alimento, nós temos formas distintas de fazê-lo, e tudo depende dos recursos que nós temos. Por exemplo, uma pizza pode ser feita no forno a lenha, forno a gás ou elétrico ou, até mesmo, na frigideira. Devemos ter muita atenção na forma de fazer a massa, ou seja, seguir uma receita e ter todos os ingredientes. A pizza será saborosa se seguirmos a receita, os ingredientes forem bem escolhidos e a temperatura do forno for adequada, não é verdade?
Qual é a relação disso com processos, métodos e ferramentas? Observe que os diferentes tipos de fornos são as ferramentas das quais dispomos. Podem ser mais simples — a frigideira — até mais sofisticadas — forno a lenha —, mas todas tem o objetivo de atingir o mesmo resultado final, que é ter uma pizza cozida — o produto de software. O método corresponde à receita escolhida para fazer a pizza, em que devemos ter atenção aos ingredientes — ou seja, recursos tecnológicos. E o processo, o que é? Cada processo é composto por seus métodos e ferramentas. Ou seja, temos pizzas diferentes, pois temos processos diferentes para fazê-las — uma pizza para um forno a lenha é feita de forma diferente de uma pizza de frigideira, não é verdade?
Agora que você já entendeu a base para a produção de um software, em que observamos a qualidade, o processo, o método e as ferramentas, convido-lhe a compreender quais são os princípios da Engenharia de Software que garantem a qualidade do produto!
Formalidade: procurar construir softwares confiáveis, com baixo custo e bom desempenho, de acordo com um processo de desenvolvimento de software bem definido que siga os métodos de maneira efetiva. Isso garante que possamos construir o produto de software da melhor forma possível, não acha?
Abstração: permite que, durante a identificação da "dor do cliente" e de suas necessidades, sejam considerados apenas os aspectos mais relevantes, ignorando os detalhes. Isso é importante para que, no início, possamos ter uma visão ampla do problema antes de nos preocuparmos com detalhes desse problema.
Decomposição: pretende dividir um problema complexo em um conjunto de problemas menores, permitindo que a construção da solução seja menos complexa. Ou seja, ao invés de ter um grande problema, temos um conjunto de pequenos problemas!
Generalização: procura reutilizar soluções de problemas similares. Ou seja, se já construímos um sistema de compras on-line para uma empresa de roupas, podemos aproveitar essa solução para construir um sistema de compras on-line para uma empresa de sapatos. O que muda é o produto, a solução é muito parecida. Você concorda comigo?
Flexibilização: o software deve ser construído de forma que sua alteração seja fácil. Ainda mais no mundo em que vivemos, em que as regras e adaptações são constantes.
Nesse momento, acredito que você já tenha mais clareza sobre algumas características da produção de um software, não é mesmo?
E, como futuro(a) profissional da área, que fará parte de equipes que desenvolvem softwares, você consegue pensar em algumas demandas ou necessidades que esse mercado tem? Selecionei para você alguns pontos de atenção nos quais você deve começar a pensar e levar em consideração no seu processo de desenvolvimento profissional.
Existem diversas necessidades de diferentes usuários, é preciso fazer um grande esforço para compreender a "dor do cliente" — ou seja, o problema principal — antes de iniciar o processo de desenvolvimento de software.
Aumento na complexidade dos requisitos dos diferentes indivíduos, empresas e órgãos do governo em que a implementação da solução é feita por equipes de desenvolvimento em ambiente computacional com diferentes recursos. É muito importante ter um projeto de software bem elaborado para que as atividades sejam bem definidas!
Cada vez mais, o software tem sido utilizado para a tomada de decisões estratégicas e táticas. Portanto, esse software deve apresentar uma qualidade elevada.
Devido à demanda por adaptações e aperfeiçoamento, que tem sido crescente, logo deve ser passível de fácil manutenção.
Para finalizar, chamo a sua atenção para o fato de que os serviços e as infraestruturas nacionais — tais como energia, comunicações e transporte — dependem de sistemas computacionais complexos e bastante confiáveis. O software tem nos permitido usar a World Wide Web — um sistema de informação que modificou a história da humanidade — e, cada vez mais, a exploração espacial.
Muitos são os atuais desafios, tais como: mudança climática e tempo extremo, diminuição de recursos naturais, população mundial que não para de crescer e que precisa ser alimentada e abrigada, terrorismo internacional e necessidade de ajudar pessoas mais idosas a terem uma vida mais satisfatória e com mais qualidade. Precisamos, portanto, de novas tecnologias para nos ajudar a resolver esses problemas, e o software certamente terá um papel fundamental nessas tecnologias (SOMMERVILLE, 2011).
Além do aprimoramento dos transistores, qualquer outra ação realizada para aprimorar os sistemas de computação da segunda geração tinha como consequência uma alteração na linguagem. Como se, para cada tipo de cálculo a ser feito pelo computador, uma nova linguagem de programação fosse necessária. A linguagem de máquina se transformou em linguagem de reunião, às vezes conhecida como linguagem simbólica.
Vamos então colocar em prática o que você aprendeu nesta lição? O ideal é começar a refletir sobre como os processos, métodos e ferramentas da engenharia de software podem contribuir para garantir a qualidade do produto de software.
Para tal, peço que você procure reconhecer na comunidade que vive - casa, colégio, bairro - quais são as soluções de problemas que podem ser automatizadas. Por exemplo, eu tenho um gato e um cão que ficam boa parte do dia sozinhos em casa; adoraria ter um sistema computacional que eu pudesse monitorar o que eles fazem enquanto estou trabalhando.
No colégio onde meu filho estuda eu sempre senti falta de um sistema de informação que permitisse uma comunicação rápida para saber quais são as tarefas, datas de prova e atividades extracurriculares que o colégio está promovendo.
No meu bairro? Adoraria ter um sistema ao qual pudéssemos avisar a prefeitura quando acontecem problemas ou até mandar um pedido por causa de situações de perigo. Muitas das vezes tentamos ligar e não conseguimos.
E você, quais são os problemas e soluções que você reconhece no seu dia a dia?
Clique aqui, teste seus conhecimentos sobre esta lição e confirme sua participação nesta disciplina!
PRESSMAN, R. S. Engenharia de Software: uma abordagem profissional. 7. ed. Porto Alegre: AMGH, 2011.
SOMMERVILLE, I. Engenharia de Software. 9. ed. São Paulo: Pearson Prentice Hall, 2011.