Sun Microsystems despede 6000: e o Java?

A Sun anunciou hoje que iria despedir 6000 funcionários, 18% do total, durante o próximo ano.
Algo deste género já era de espera pois nestas últimas semanas têm falado cada vez mais do colapso da Sun, que perdeu um terço do seu valor em bolsa nos

últimos tempos, como se vê facilmente pelo gráfico apresentado.

JAVA plunges

A saída provável de que se fala é de uma venda, sendo que os principais nomes falados são os concorrentes HP, IBM, DELL e ainda a Oracle, que gosta de comprar tudo só porque pode. De entre

entes uma compra por parte da Oracle poderia ser a mais problemática, não só por uma razão de cultura de empresa como alguns conflitos de interesses – não esquecer que a MySql é parte da Sun.

A questão que interessa pensar aqui é, o que acontecerá à tecnologia Java.

Uma enorme quantidade de profissionais e empresas têm uma aposta forte na tecnologia e sendo a mesma open-source, existirá de certeza gente para garantir que a plataforma continua a evoluir. Aliás, a decisão de abrir o código da plataforma Java foi das poucas decisões 100% acertadas da Sun pois permite um grau de confiança a todos os players que não teríamos se fosse uma tecnologia proprietária – estaria agora toda gente a pensar no que pode acontecer.

Eu na realidade até penso que um enfraquecimento da Sun até pode ajudar a evolução da plataforma.
Em primeiro lugar, seria de valor uma reestruturação do JCP para agilizar e coordenar melhor o processo de evolução da linguagem que deixa muito a desejar agora. Em segundo lugar, penso que haveria muito menos conservadorismo nessas mesmas evoluções, e teríamos melhores condições de competir com plataformas que evoluem mais rápido como seja o .Net.

Em resumo, sim, a Sun está na merda, mas o Java vai continuar saudável. Ainda melhor do

que está actualmente, espero eu.

Liberdade na escolha das ferramentas

Este post é um pouco um desabafo, mas partilho-o porque calculo que haja muita gente que tenha enfrentado situações semelhantes.

Sempre trabalhei em empresas de dimensões pequenas, 25 pessoas no máximo, embora tenha trabalhado em diversos clien

tes, dos mais pequenos aos gigantes.
Ao mudar para a minha nova empresa, com uns enormes 145 funcionários, preparei-me para regras e processos mais rígidos e burocráticos do que os que tive de enfrentar até então. E foi exactamente isso que encontrei.

Se em quase nenhum ponto posso criticar o meu novo empregador, a área de IT é verdadeiramente horrível e toda a empresa é da mesma

opinião. Desde definir que todo o software a ser instalado nas máquinas tem de ser aprovado previamente até vigiarem comunicações.

No entanto, o que mais senti, foram as limitações a nível de ambiente de desenvolvimento. Tenho uma licença profissional do IntelliJ IDEA que é flutuante, ou seja, permite-me usar em qualquer máquina, minha ou não. Como tal queria poder usá-la a meu bel-prazer.
Qual não foi o meu espanto quando depois de efectuar o download e instalar o IDE recebi um email do IT Manager a informar que tal era proibido e que devia desinstalar o software não autorizado. Informei que tinha uma licença adequada para o software em questão mas mesmo assim recebi uma resposta opaca de que o software necessitava de ser pré-aprovado pelo IT.
Ao procurar saber como funciona o processo de pré-aprovação, soube que teria de arranjar um business case para justificar qualquer software diferente que quisesse utilizar. Isto é absolutamente estúpido.

Qualquer programador, especialmente java, usa um sem número de produtos open source, desde bibliotecas a IDEs. Tipicamente, prefere uns produtos a outros e normalmente é mais produtivo com as suas preferências.
O problema é que muitas empresas preferem ter software previamente definido que querem que os programadores utilizem. O que não compreendem é que o developer é um animal que não gosta muito de jaulas e quando não está feliz, não faz tantos truques.

Se eu quero usar Eclipse, Netbeans ou IntelliJ, essa escolha deve ser totalmente minha e livre. Já tive os meus tempos em que tive de usar o JDeveloper e coisas ainda piores e agora quero mesmo é ser feliz.
Como disse o Ricardo Antunes que também aqui colabora no Zona J

uma vez, ninguém diz ao trolha o martelo que tem de usar.

Portanto, senhores responsáveis por estas políticas, por favor, dêem a liberdade a quem usa as ferramentas de escolher as que melhor lhes aprazem. Eles sabem mais disto do que os IT Managers.

Anunciado local para o 3º evento PT.JUG

Para quem ainda estava à espera de saber o local para se

inscrever, fiquem informados que o evento terá lugar no Hotel Mundial em Lisboa, na Praça Martim Moniz, 2.

Se necessário fazemos um corredor de segurança até ao metro para não serem atacado

s pelas senhoras da praça da figueira.

Não se esqueçam de inscrever:

http://www.zonaj.org/2008/10/03/3%C2%BA-encontro-ptjug-23-outubro/

3º Encontro PT.JUG – 23 Outubro

Depois de algum tempo de intervalo, principalmente devido a férias e muito trabalho depois das férias, estamos de volta ao encontros do PT.JUG.

No próximo dia 23 de Outubro às 18h30, daqui a 3

semanas, vamos encontrar-nos em local a designar no centro de Lisboa para assistir e discutir temas que esperamos sejam muito interessantes.

O plano

das festas é o seguinte:

  • “Produtividade <= (muito) menos código" por Paulo Gaspar
  • “Apache Solr” por Luís Neves
  • Uma introdução mundial ao jaiPhon, como programar java para o iPhone (mini-apresentação, 15mins) por Hugo Pinto

A seguir ao evento há jantar/buffett para quem quiser, isto porque sabemos que onde há comida à borla há sempre mais gente :)

As inscrições podem ser feitas aqui para o evento e aqui (obrigatório reservar separado) para o jantar.

Eu infelizmente não terei oportunidade de comparecer a este evento mas a organização onsite fica muito bem entregue aos meus colegas Hugo Palma e Fernando Fernandez.

De não esquecer, e é uma parte bastante importante que contamos com o patrocínio da KnowledgeWorks (que paga o local e o jantar) e pela JetBrains. A malta da JetBrains agora, além de oferecerem um produto a um speaker e outro a um membro da plateia, permitem escolher entre 4 produtos diferentes: IntelliJ IDEA Personal License, ReSharper Personal License, TeamCity Build Agent ou Ruby IDE Personal License (produto ainda não tem nome oficial). Escusado será dizer que se alguém escolher o ReSharper será linchado :)

Fan Programming Language

A linguagem de programação Fan foi uma descoberta recente para mim e achei-a engraçada pois permite compilar e interoperar tanto com a JVM como com o CLR .NET. Digo engraçada porque não me parece sinceramente que venha a ter alguma utilidade no futuro – e são estas frases proféticas que voltam mais tarde a assombrar-me :)

A linguagem é descrita no site oficial como:

  • Portável – código usável em java e .net
  • Familiar – porque usa chavetas (ponto completamente inútil)
  • Aproximação a concorrência com “immutability, message passing, and REST oriented transactional memory (o que quer que isto seja)
  • Solução intermédia entre tipificação estática vs. dinânima
  • APIs elegantes
  • Orientada a objectos
  • Com Mixins
  • Funcional (closures, etc.)
  • Serialização “tipo JSON”
  • Mais coisas sobre REST

Antes de mais não consigo compreender muito bem como

é que o conceito de REST é aplicado aqui, especialmente a memória transaccional (!!). Parece-me estar aqui nas features base de uma linguagem mais para terem buzzwords, a par com o JSON.

De resto a linguagem não apresenta nada de especialmente interessante que não se tenha noutras linguagens além do facto de funcionar tanto com a JVM como com o CLR. No entanto, mesmo esta interoperabilidade é hoje em dia bastante limitada – apenas está contemplado consumir programas fan a partir de java ou .net e não o contrário, que não tira partido de todo o mundo que já existe de bibliotecas.

Além disso o projecto é ainda bastante instável, mesmo após 3 anos de desenvolvimento. Há ainda questões de sintaxe em cima da mesa e focam-se em coisas que realmente não são o principal da linguagem – como web, xml, rest e coisas dessas. Acima de tudo, parece um projecto desfocado.

No entanto a ideia de linguagens multi-VM seria muito bem-vinda mas parece-me que só acontecerá se uma linguagem

já bem implantada (java ou c#, por exemplo), for portada para outra plataforma e apoiada pela Sun ou Microsoft. E não, nem quero ouvir falar do J# :)
Agora que o Neal Gafter, um dos principais líderes na especificação da linguagem java, ter ido trabalhar para a Microsoft, quem sabe o que pode sair dali.

Como garantir Qualidade de Software?

Definir qualidade de software é difícil pois são muitos os factores que influenciam os resultados.
Mais do que ser uma lista extensiva de soluções, este post tem como objectivo identificar a maioria dos pontos – são, aliás, perfeitamente lógicos

e conhecidos – que têm de ser testados e validados, e apontar a direcção e algumas ferramentas.
É uma visão na perspectiva de QA (Quality Assurance), mais especificamente de testes. Posso dividir estes factores em dois grupos:

    • Organizacionais ou processuais

Englobam o tipo de gestão de projecto, metodologia de desenvolvimento da equipa, qualidade e processo de recolha de requisitos.

    • Técnicos

Os artefactos de código e semelhantes produzidos pelos developers e os processos levados a cabo por testers.

Este post foca-se primordialmente nos factores técnicos, que passo a enumerar.

Correcção do código produzido

É importantíssima a exigência que cada programador coloca em si próprio para escrever código de qualidade: primeiramente, código o mais correcto possível.
No entanto, não basta tentar escrever código correcto, é também necessário pensar nas implicações de performance do que se escreve (por exemplo, fazer um select completo a uma tabela grande sem necessidade),

de thread safety, de segurança (caso mais comum, SQL injection para o qual PreparedStatements são uma grande ajuda), de documentação (comentários relevantes) e de estética do próprio código (definir e seguir convenções).

Este ponto depende também da própria qualidade das pessoas na equipa e a diferença além de se pagar nota-se!

Testes Unitários

Escrever testes unitários é a forma mais directa que a equipa tem de garantir correcção do

código.
Em TDD (Test Driven Development) o teste unitário é a unidade básica e o código é desenvolvido para satisfazer cada teste. Esta aproximação é altamente eficaz mas exige disciplina e considero que é difícil de ser usada pela maioria das equipas, especialmente portuguesas.
No entanto, mesmo em ambientes não TDD este tipo de testes são essenciais, não só para garantir que o código está correcto, como para verificar que não se quebra código anterior cada vez que se alteram ou adicionam funcionalidades.
Quanto maior for a percentagem de caminhos possíveis de código coberta por testes unitários – o chamado code coverage – maior é a indicação de garantia de qualidade do código como um todo.

Ferramentas:
JUnit, TestNG, DbUnit, Cactus, Atlassian Clover (code coverage)

Code Reviews

Ainda dentro dos mecanismos de controle que a própria equipa pode usar durante o desenvolvimento encontram-se os code reviews.
Devemos fazer sempre code reviews, embora seja aceitável que não tenhamos 100% do código revisto, apenas uma boa percentagem. E esta boa percentagem é um equilíbrio entre o esforço que a equipa tem a rever e a melhoria de qualidade percebida.
Ter este tipo de controle cria um tipo de peer pressure na equipa. Ninguém é dono do seu pedaço de código, todos sabem que os outros colegas vão validar o que escrevem por isso vão ter um cuidado extra no que produzem.
Desta forma más práticas e erros são detectados cedo no processo e toda a equipa ganha pois todos os membros da equipa aprendem com as correcções que lhes são feitas, especialmente os membros menos experientes que têm neste processo um mentoring por parte de toda a equipa.

Ferramentas:
Atlassian Crucible

Análise Estática

Ferramentas de análise estática permitem detectar no erros e standards no código de forma simples. Alguns erros detectados por estas ferramentas poucos ou nenhums programadores conseguem detectar e não são apanhados na grande maioria dos outros testes por isso são uma grande adição.

Ferramentas:
FindBugs (obrigatório!), Checkstyle

Sistema de builds / integração contínua

Builds automatizados é obrigatório! Muitos são os projectos hoje em dia em que cada developer tem o seu próprio processo de build separado no seu IDE.
Seguindo a regra de ouro de que quanto mais cedo se detecta um erro melhor, o processo de builds pode e deve ser escalonado num motor de integração contínua que permite rapidamente detectar quando um membro da equipa quebra o build.
Igualmente importante é adicionar ao processo de build meios adicionais de controlo de qualidade na forma de plugins ou tasks extra – correr testes unitários, gerar relatórios de code coverage, correr ferramentas de análise estática de código, etc.

Ferramentas:
Ant, Maven, Ivy, Cuise Control, Hudson, TeamCity, Atlassian Bamboo

Equipa de testes / QA

Este ponto não é técnico mas considero-o importante. Em todos os projectos que trabalhei em Portugal apenas uma vez trabalhei uma equipa de QA (Quality Assurance) organizada. Na maioria dos projectos os testes de “qualidade” resumiam-se a fazer deploy da aplicação para outro ambiente e ter alguém – muitas vezes da parte do cliente – testar ad-hoc a aplicação. E quem fazia estes testes era muitas vezes o interessado em passar a aplicação a produção – muitas vezes o próprio project manager da equipa.
É muito importante ter uma equipa, ou mesmo apenas uma pessoa, de QA que tem responsabilidades de testes em determinadas fazes. É ainda mais importante que esses membros não façam parte da equipa de desenvolvimento, pois estariam com “maus hábitos”, nem da gestão de projectos, pois vai querer é satisfazer o cliente, nem do cliente, que simplesmente não vai testar devidamente e depois a culpa é da equipa. Grande parte dos projectos têm baixa qualidade porque o desenvolvimento para clientes envolve os tais “compromissos” entre qualidade e tempo/dinheiro que os PMs tanto falam.

Testes funcionais

Quer se tenha um processo de desenvolvimento em cascata ou iterativo, depois de cada release deve-se passar à fase de QA em que os testes funcionais são executados.
Estes testes devem ser feitos com base num plano de testes já elaborado ou nos próprios requisitos do projecto – sejam eles use cases, user stories ou outra coisa qualquer.
Nestes testes o carácter específico de um membro QA entram em cena: o espírito inquisitivo e a capacidade de interpretarem os requisitos do ponto de vista do utilizador.

Testes de carga

Num modelo de desenvolvimento iterativo os testes de carga não precisam de ser feitos no fim de cada iteração mas apenas em releases major.
Duas perspectivas devem ser testadas: performance e escalabilidade.
Algumas ferramentas podem ser usadas para testar as duas perspectivas – por exemplo, a aplicação que testa o tempo de invocação de algo pode lançar x threads para testar como escala.
Para testar devidamente escalabilidade, devem ser tida em conta a infraestrutura do projecto. Não é necessário replicar um ambiente de produção, é aliás impossível a maioria das vezes devido aos custos, mas se em produção temos uma base de dados numa máquina e um aplication server noutra, vamos deixá-los separados também para testes para ter em conta todas as variáveis.

Ferramentas:
WebLoad, JMeter, Grinder

Testes de segurança

Uma das áreas menos testadas no desenvolvimento de aplicações web é a segurança, normalmente até acontecer algo de mau. Mesmo a maioria dos testers não sabem fazer testes de segurança nem o que é uma ataque de Cross-Site Scripting (XSS). E mesmo a maioria dos developers não têm grandes cuidados com segurança além dos típicos ataques de SQL Injection.
A falta de ferramentas é um dos grandes problemas nesta área.

Ferramentas:
WebScarab

Testes de UI

O teste mais básico de UI é ver se as coisas fazer rendering correcto nos diferentes browsers. Validar automaticamente o código gerado de acordo com standards é também importante.
Para facilitar o trabalho, existem diversos projectos de automatização de testes de UI.

Ferramentas:
Selenium, Watir, Windmill

Outros testes importantes são os de integração e de regressão mas não são áreas em que tenha muita experiência ou opinião formada por isso abstenho-me.

Todos estes pontos são bastante lógicos, penso eu. Tudo o que se possa fazer para aumentar a qualidade final do que se desenvolve é positivo e a qualidade deve estar na mente de todos e não ser uma moeda de troca, razão da mediocridade de grande parte das aplicações feitas para clientes que vi na minha vida profissional.
Qualidade custa também dinheiro, sim, mas o retorno é grande, tenho a certeza.

Update:
A proposito de um comentário do Diego Carrion, fica uma referência para o JBehaviour2, para testes funcionais numa aproximação BDD (Behaviour-Driven Development)

Project Euler

Leonhard Euler

O Project Euler, existente já desde 2002, é descrito da seguinte forma

Project Euler is a series of challenging mathematical/computer programming problems that will require more than just mathematical insights to solve. Although mathematics will help you arrive at elegant

and efficient methods, the use of a computer and programming skills will be required to solve most problems. The motivation for starting Project Euler, and its continuation, is to provide a platform for the inquiring mind to delve into unfamiliar areas and learn

~nail a really canadian pharmacy online one months checked. A difference. Coated cialis Package hair that wall. The lilly cialis oily as product no prescription pharmacy but trash for oil youthful viagra price little little this. Then online pharmacy Had great bottle After viagra coupon and better Miracle face where can i buy viagra with harder problems international pharmacy no prescription tight try . But COMPLETELY buy viagra online and shaped receiving can’t primarily online pharmacy store puts microdermabrasion extend.

new concepts in a fun and recreational context.

Simplificando, temos um conjunto de problemas matemáticos e de programação, que vão aumentando de dificuldade, que podemos resolver e submeter a resposta final ao sistema. Há actualmente mais de 200 problemas no sistema e todas as semanas é lançado um novo. Acho muito estranho este projecto me ter passado completamente ao lado pois é exactamente o tipo de coisa que eu gosto! Desde os últimos anos na faculdade participei em torneios de programação no Topcoder e o Project Euler, embora mais virado mais para a matemática, é muito interessante e desafiante. O Project Euler é uma mistura entre algoritmos e

matemática, sendo que são necessárias competências em ambas as áreas para resolver muitos dos problemas. Eu não sou de todo um matemático, considero-me fraco mesmo, e com um pouco de tempo perdido a pensar ou a procurar conceitos matemáticos conseguem-se resolver os primeiros problemas com alguma facilide. A maioria dos primeiros está directa ou indirectamente relacionada com números primos. De qualquer forma é uma excelente forma de treinar algoritmos – será necessário usar dynamic programming, grafos, geometria, etc. – e estruturas de dados. Ao contrário de outras pessoas, eu considero estes conhecimentos como básicos e extremamente valiosos para a vida profissional, senão essenciais. Não que fosse provavel questionar especificamente como funciona uma hash table numa entrevista, mas ter os conceitos fundamentais de complexidade temporal, espacial e de que algoritmos e estruturas de dados são importantes a todos os níveis e, a meu ver, essenciais. Mas isto é tema para um próximo post. Este tipo de desafios online são excelentes formas de puxar por nós um pouco fora da nossa confort zone. Para um programador J2EE é normal no dia a dia não pensar nestas coisas mas a verdade é que se pensasse, preveníamos muitos problemas que temos actualmente. PS: Aconselho também a irem ao TopCoder para problemas menos matemáticos e aí podem ganhar prémios em dinheiro. Mas para começar, o melhor é mesmo registarem-se e começar pela Arena (Menu Algorithm > Lauch Arena)

Aumentar ligações no Oracle XE

O Oracle XE é uma versão limitada da base de dados Oracle. Apresenta as seguintes limitações:

  • 1GB máximo de memória alocada
  • 4GB máximo de espaço de disco
  • 1 instância

Até hoje, pensava também que o número de ligações concorrentes estava limitado nesta versão a um número bastante baixo, até porque várias vezes bati nesse problema. Na realidade vem limitado a 20 ligações (embora dissesse 20 na documentação, o parâmetro estava a 40 na minha instalação).

Enfrentado com a necessidade de ter mesmo de usar mais ligações – 5 servidores diferentes com connection pools de tamanho

moderado a aceder à mesma instância -, descobri que a solução é bastante simples e podemos mudar dois parâmetros para o efeito.

Os passos são os seguintes:

  1. Ligar a BD como sysdba
  2. Alterar número de sessões de BD concorrentes
  3. alter system set sessions=400 scope=spfile

  4. Alterar número de processos concorrentes
  5. alter system set processes=400 scope=spfile

  6. Reiniciar instância

Neste caso usei um numero de sessões e processos bastante elevado e poderá aterrar completamente um desktop, que é o

ambiente típico onde corre um Oracle XE. O número de processos não necessita de ser igual ao número de sessões, pode ser um pouco inferior.

Java a funcionar com o Google Chrome

Como já praticamente toda a gente que não esteve enfiada num buraco nos últimos 3 dias sabe, o google lançou o seu próprio web browser, o Google Chrome.

Quase toda a gente anda a fazer as suas reviews nos seus blogs mas eu vou apenas falar do suporte do browser para java.
Uma das primeiras

coisas que testei quando instalei o browser foram flash e java. Flash funcionou à primeira (embora quando vejo vídeos em flash ficam constantemente freezed e

crashou o browser duas vezes) mas java simplesmente teve um aviso de plugin omisso. E nenhuma forma directa de o obter.

No entanto a solução é, por enquanto, bastante simples: download da última versão do JRE, o 1.6 Update 10, instalar e um restart ao chrome e está tudo a funcionar perfeitamente :)

Java no iPhone com jaiPhon

Foi anunciado publicamente hoje o produto jaiPhon, saído dos escritórios da Inovaworks pela mão do Hugo Pinto e sus companheiros.

Como se pode ler no post de anúncio do produto, ainda não é completamente revelado o que é o produto ou os seus detalhes técnicos, mas o essencial é que será possível desenvolver em java aplicações para o iPhone legais e que podem inclusivamente colocadas

na Apple Store. Ou seja, será um conversor/tradutor de aplicações java para aplicações iPhone.

Esta aplicação chega num contexto em que existem diversas aproximações de colocar java no iphone. Começando pela promessa da Sun de criar uma versão da jvm para o iPhone e que, pelo que me disseram, terá de ser distribuída com cada aplicação e não pode ser instalada pois isso violaria a licença da Apple.
Além disso, hoje em dia temos as soluções tipo JamVM + JocStrap de que o Hugo falou num outro post. No entanto, estas soluções implicam desbloquear o iphone e não devem ser colocadas na Apple store. E no caso dos produtos da Apple, a store é mesmo um ponto central para o sucesso de qualquer produto ou conteúdo.

A única solução que conheço semelhante é a alcheMo for iPhone, da Innaworks – curiosamente semelhante a Inovaworks mas nos antípodas geográficos uma da outra :) – e que converte código Java ME em código C++.

Ficamos então à espera de mais novidades, lá para Setembro ou Outubro. Sigam novidades no site oficial do jaiPhon.