Publicado na primeira edição da Java Magazine.
Java com Qualidade
Como Java dá suporte a software de
qualidade?
por Paulo Borba
Entre os vários motivos para a ampla
adoção de Java, o mais decisivo é o
suporte
oferecido
ao
desenvolvimento de software de
qualidade. Analisamos aqui as
características de Java que ajudam a
fornecer este suporte.
Apesar de ter apenas 6 anos, Java já é extremamente popular e domina grande parte do
mercado de aplicações corporativas. De acordo com a última pesquisa do instituto Gartner sobre
o uso de Java no Brasil, 62% dos entrevistados em uma conferência sobre Economia da
Tecnologia da Informação afirmaram que já utilizam Java para desenvolvimento de aplicações
corporativas. Vinte e dois por cento dos entrevistados afirmaram que não usam Java ainda, mas
pretendem usar. Só 16% dos entrevistados disseram que não usam e não planejam usar Java.
Quando focando no desenvolvimento de novas aplicações, principalmente para a web, os
porcentuais de adoção de Java são ainda mais impressionantes. De fato, atualmente, a escolha
de uma linguagem para o desenvolvimento de uma nova aplicação corporativa é basicamente
restrita a Java e C#, a nova linguagem definida pela Microsoft e que é bastante inspirada em
Java.
Vários aspectos ajudam a explicar a rápida e ampla adoção de Java pela indústria de software.
O marketing agressivo da Sun (veja a caixa “Características de Java”), desde o lançamento da
linguagem, e a rivalidade com a Microsoft chamaram bastante atenção da indústria de software.
A semelhança com a sintaxe e alguns conceitos de C e C++, que dominavam parte significativa
do mercado, despertou a simpatia e facilitou a transição de vários programadores destas
linguagens para Java. A promessa de uma web mais interativa com a execução de
appletsprogramas Java com interfaces gráficas e funcionalidades bem mais ricas do que se
consegue com HTML e Javascriptnos clientes web parecia ser essencial para explorar
serviços inovadores e novas oportunidades de negócio em comércio eletrônico, por exemplo.
Outro forte atrativo para a adoção de Java foi o projeto inovador de linguagem, integrando de
forma consistente vários avanços na área de linguagens de programação e provendo uma
biblioteca de classe (APIs) extensa e padronizada. A implementação da linguagem por vários
fabricantes também assegurava a garantia de investimento e independência de fabricante, o que
é interessante principalmente para grandes corporações. Na mesma linha, a promessa não
realizada de padronização de Java pela ISO também ajudou a aumentar a adoção de Java.
Características de Java
“Java é uma linguagem simples, orientada a objetos, distribuída, interpretada, robusta, segura,
independente de plataforma, portável, de alta performance, concorrente e dinâmica”
Fonte: White Paper da Sun sobre Java
Cada um destes aspectos contribuiu para a popularização de Java, mas o mais decisivo parece
ter sido o suporte que a linguagem oferece ao desenvolvimento de software de alta qualidade.
Isso é confirmado pela pesquisa do instituto Gartner sobre o uso de Java no Brasil. Em
particular, o suporte que Java oferece a fatores de qualidade de software como portabilidade,
segurança e escalabilidade influenciaram e influenciam várias decisões pela utilização de Java
como a tecnologia de programação para novos projetos.
Outros fatores de qualidade favorecidos por Java, como confiabilidade e facilidade para
manutenção e reuso de código, são essenciais em um mercado cada vez mais global e
competitivo. De fato, o suporte de Java a software de qualidade foi decisivo exatamente porque
qualidade é essencial para a competitividade e sobrevivência tanto das empresas que produzem
software quanto das que consomem.
Para entender como Java dá suporte a fatores de qualidade de software, vamos analisar alguns
destes fatores relacionando-os com as várias características da linguagem. Como diferentes
fatores podem ser importantes para diferentes negócios e empresas, para tornar nossa discussão
mais concreta utilizamos como exemplo aplicações e requisitos de qualidade do varejo,
especificamente automação de lojas de supermercado.
Confiabilidade
Um dos fatores de qualidade mais importantes para o varejo é a confiabilidade: o correto
funcionamento dos sistemas tanto em situações normais (fator correção) como anormais (fator
robustez). De fato, como as lojas não podem parar de vender, a confiabilidade e alta
disponibilidade dos sistemas são cruciais para o varejo.
Várias características de Java dão suporte a este fator de qualidade. Em particular, o
mecanismo de exceções de Java impõe uma forte disciplina para tratamento de erros ou
exceções, garantindo que exceções geradas por uma operação qualquer são tratadas em alguma
outra parte do código do sistema. Quando isto não ocorre, é gerado um erro de compilação
indicando quais exceções não foram tratadas. Isto é importante para garantir que situações de
erro durante a execução de um programa sejam adequadamente notificadas aos usuários da
aplicação, ao invés de serem repassadas para o sistema operacional que teria então que terminar
abruptamente a execução da aplicação.
Diferentemente de C, C++ e Delphi, Java não permite a manipulação explícita de ponteiros
para áreas de memória, evitando erros que são facilmente cometidos por programadores que
trabalham com este recurso. A ausência de ponteiros também permite que Java ofereça serviços
de coleta de lixo (garbage collection), facilitando a vida dos programadores que não precisam
se preocupar com a remoção de objetos da memória; este trabalho é feito pelo coletor de lixo
que periodicamente identifica os objetos que não estão mais sendo usados e remove-os da
memória. Nas mãos de um programador, a identificação destes objetos é normalmente uma
grande fonte de erros, comprometendo a confiabilidade dos sistemas.
Outros recursos de Java facilitam o desenvolvimento de software confiável identificando
durante a compilação erros que, se não identificados, ocorreriam durante a execução do sistema.
Isso só é possível porque Java adota uma forte disciplina de tipos, garantindo que operações
definidas para trabalhar com elementos de um tipo (classe, interface ou tipo primitivo) só sejam
invocadas com elementos destes tipos ou de subtipos correspondentes.
Portabilidade e Independência de Plataforma
Para empresas que desenvolvem software para vários clientes, a portabilidade e independência
de plataforma são normalmente fatores de qualidade essenciais. Para grandes redes de
supermercados, a independência de plataforma é ainda mais crítica pois a grande base de
hardware e software instalada não pode ser trocada sem maiores custos e traumas. Assim
empresas que têm clientes com plataformas diferentes têm que desenvolver software
independente de plataforma sob pena de multiplicar custos desnecessariamente. Além disso, a
portabilidade é complementar para eliminar os custos com pequenas adaptações e recompilação
quando migrando o software de uma plataforma para outra.
Como o projeto inicial de Java vislumbrava a execução de applets em clientes web instalados
em várias plataformas de hardware e software, Java já nasceu com todo o suporte tanto a
portabilidade quanto a independência de plataforma. Este suporte é fornecido através da
compilação de código fonte Java para bytecodes da JVM, a máquina virtual Java, que interpreta
estas instruções e conseqüentemente executa o programa. Como a JVM é relativamente simples,
ela pode ser facilmente portada para diferentes plataformas, garantindo indiretamente a
portabilidade e independência de plataforma de Java.
Na prática, a alvejada meta de “Java 100% portável” tem sido mais tese do que realidade.
Problemas com a visualização e comportamento uniformes de componentes gráficos fizeram
com que surgisse a Swing, uma nova biblioteca de componentes gráficos, resolvendo a falta de
portabilidade da biblioteca antiga, a AWT. Outros detalhes do projeto da linguagem também têm
um impacto negativo sobre portabilidade, mas é muito mais fácil portar sistemas desenvolvidos
em Java do que em qualquer outra linguagem comercial.
Facilidade de Reuso e Manutenção
Fundamental para qualquer negócio, preços competitivos são críticos no varejo, onde as
empresas não estão dispostas a fazer grandes investimentos em software. Assim o produtor de
software tem que reduzir seus custos de produção e manutenção. Ao contrário do que é
praticado por muitos, o caminho para redução de custos não é gastar menos durante o
desenvolvimento, utilizando mão-de-obra inexperiente ou não qualificada, não executando
(adequadamente) atividades cruciais como levantamento de requisitos e testes, etc.
Este tipo de economia imediata, por alguns meses, fatalmente traz sérios prejuízos a médio e
longo prazo, durante o resto da vida do sistema, quando é necessário realizar manutenções ou
customizações para um novo cliente. Pior, às vezes traz também prejuízos a curto prazo, quando
o descuido ou omissão na realização de atividades cruciais do processo de desenvolvimento
compromete a usabilidade do sistema ou até mesmo prazos e custos estimados, levando a
cancelamentos de projetos ou insatisfações por parte de clientes e funcionários.
Na prática, a redução dos custos de produção e manutenção não é resultado de economias
arbitrárias e inconseqüentes, mas sim da capacidade de distribuição dos custos entre vários
clientes que usam produtos pertencentes a uma mesma família, com pequenas variações de um
para outro. Esta é a idéia de linhas de produtos de software e de desenvolvimento baseado em
componentes. Para utilizar estas práticas e possibilitar a distribuição de custos, é necessário,
entre outros aspectos, dispor de uma linguagem que dê suporte a fatores de qualidade como
facilidade de reuso e manutenção, incluindo adaptabilidade.
“Software Barato”
Na prática, a redução dos custos de produção e manutenção é resultado da
capacidade de distribuição dos custos entre vários clientes, através de reuso e
adaptabilidade.
Java, por implementar fielmente vários conceitos de orientação a objetos, como classes,
herança e polimorfismo de subtipo, naturalmente oferece um bom suporte para reuso e
manutenção. O conceito de classes abstratas de Java possibilita a construção de frameworks,
importantes para linhas de produtos de software pois permitem o reuso de código comum e a
identificação clara de onde colocar o código que varia entre os produtos de uma família. Já o
conceito de interfaces é chave para a criação e utilização de componentes de software, como os
definidos pelos padrões Java Beans e EJB (Enterprise Java Beans).
Além de possibilitar a redução de preços, o suporte que Java oferece a reuso e manutenção
torna o fornecedor de software mais competitivo em outros aspectos. Por exemplo, como os
clientes sempre têm novos requisitos para ontem, a facilidade de manutenção faz com que o
fornecedor implemente estes requisitos com rapidez, atendendo às expectativas dos clientes.
Isso quando o requisito ainda não foi implementado para outro cliente e pode ser prontamente
reusado. O mesmo nível de eficácia o fornecedor pode mostrar com relação à flexibilidade para
realizar a customização de um produto de acordo com a necessidade dos seus clientes, o que é
alcançado com frameworks e linhas de produtos.
Eficiência
Eficiência, um fator de qualidade às vezes esquecido por alguns, é também importante para as
aplicações do varejo. Afinal, o consumidor não pode esperar muito tempo na fila do caixa. E a
rede de supermercados certamente vai querer investir pouco em recursos computacionais como
CPU, memória, e infra-estrutura de rede.
No entanto, como em tudo na vida, há conflitos entre os fatores de qualidade de software e
não se pode ter tudo ao mesmo tempo. Compromissos têm que ser feitos. De fato, os recursos de
Java que dão suporte a portabilidade prejudicam eficiência. Como, para facilitar a portabilidade,
Java é normalmente compilada para bytecodes, ao invés de código de máquina, é necessário
interpretar os bytecodes durante a execução, com impacto negativo em performance.
O mesmo conflito ocorre entre confiabilidade e eficiência. A coleta de lixo, por exemplo, é
um serviço adicional implementado pelo ambiente de execução de Java, por isso é de se esperar
que se note um impacto negativo em performance quando comparando Java com outras
linguagens que não implementam este serviço. Esse é o preço que tem que ser pago para dispor
das vantagens do suporte de um coletor de lixo automático. Mesmo com os avanços das
tecnologias de compilação, espera-se apenas que o impacto seja reduzido, não eliminado.
Estes impactos negativos em eficiência são importantes mas não têm comprometido a
performance de aplicações Java para uma grande quantidade de domínios. Em particular, a
performance de aplicações Java no varejo e em comércio eletrônico é perfeitamente adequada,
comprovada pela experiência prática de utilização de alguns sistemas desenvolvidos em Java.
As limitações de performance têm sido significativas apenas em domínios que exigem altíssima
performance, como jogos com recursos gráficos e aplicações que envolvem grande
processamento numérico.
Conclusões
Um dos grandes atrativos para a utilização de Java nas corporações tem sido o suporte que
esta linguagem oferece ao desenvolvimento de software de qualidade, aspecto cada dia mais
importante para garantir a competitividade das empresas. Em particular Java oferece excelente
suporte a fatores de qualidade como confiabilidade, portabilidade e independência de
plataforma. Mais importante, Java oferece suporte a facilidade de reuso e manutenção, fatores
fundamentais para aumentar a produtividade e possibilitar a distribuição de custos de
desenvolvimento entre os clientes de uma mesma família, ou linha de produtos, de software.
Estes benefícios podem ser atingidos com o uso adequado de Java juntamente com o apoio de
ferramentas de desenvolvimento, frameworks e arquiteturas e processos de software bem
definidos.
Paulo Borba ([email protected], www.cin.ufpe.br/~phmb)
é doutor em computação pela Universidade de Oxford,
consultor de orientação a objetos e Java da Qualiti Software
Processes, e professor do Centro de Informática da
Universidade Federal de Pernambuco, onde ensina Java e
desenvolve pesquisas relacionadas desde março de 1996.
Publicado na primeira edição da Java
Magazine.
Download

Java com qualidade