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 (paulo@qualiti.com.br, 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.