“Diversão” com fuso (confuso) horário

De novo estou eu tentando descobrir qual player de música do computador altera meus arquivos sem permissão. A vez anterior eu contei aqui.

Não consegui descobrir ainda, porque o problema não ocorreu de novo enquanto eu monitorava (estou desconfiado de uma vez que usei o Amarok um tempo atrás, mas também pode ser um dos que eu uso atualmente, como Rhythmbox, iTunes, Winamp, ou o Windows Media Player).

Mas mesmo sem descobrir, aconteceu algo curioso: perdi o código fonte do programa em C++, e por isso reescrevi o programa monitorador de mudança de data de arquivos em Python (também passei a monitorar o tamanho dos arquivos). Depois acabei encontrando o executável compilado do programa em C++, e deixei os dois monitorando os arquivos de uma pasta, só para testar mesmo.

E justamente hoje acabou o horário de verão, e o computador trocou o horário automaticamente (provavelmente trocando o (con)fuso de UTC-02:00 de volta para UTC-03:00)! Nisso um dos programas ficou maluco, apitando e dando alerta como se tivesse havido mudança na data em todos os arquivos da pasta! Enquanto isso, o novo programa nem notou nada… Acho que o novo está com uma implementação melhor, né? Como não tenho mais o fonte antigo não sei exatamente por que o fim do horário de verão confundiu ele, mas é mais um indicativo de como manipulação de datas é difícil…

Anúncios

Java não é tão ruim assim…

Java é uma linguagem grande, famosa, e muito usada. Mas não é, digamos, “charmosa”. Não só eu, mas muita gente reclama que ela é inflexível, sem-graça, e demora a adotar recursos que as concorrentes têm faz tempo (em termos de recursos da linguagem, o C# da Microsoft evoluiu muito mais rápido).

Dependendo do gosto do programador, uma linguagem charmosa seria Python (eu gosto, é quase um pseudocódigo executável), alguma variante de Lisp (os fãs são dedicados, mas eu nunca consegui me adaptar), Ruby (superficialmente lembra Python, é muito flexível, mas sintaticamente é mais complexa), Lua (minimalista e elegante, quase um pseudocódigo executável, como Python), ou até C (reina tranqüilo no seu nicho de infraestrutura, bom para quem gosta do “baixo nível”), C++ (ótimo poder de abstração sem perder as capacidades do C).

Mas aí eu parei para pensar mais friamente: exceto por alguma inveja aqui e ali do C#, Java tem suas qualidades.

Comparando com C e C++:

A tipagem estática e sintaxe simples permite navegação e refatoração fáceis com ferramentas de desenvolvimento. Compare com C++, onde ferramentas de “autocompletar” facilmente falh(av)am porque não entendem as milhares de macros e templates a serem processados nos headers.

O ambiente gerenciado permite reflexão, serialização e stack-traces bem úteis. Já em C e C++, bah… Nessas linguagens, se tiver um core dump para descobrir por que o programa morreu, o programador já acha excelente! Java tem strings Unicode também; em C/C++ tem que correr atrás de alguma lib pra isso.

Em Java até precisa escrever o nome da classe 2 vezes ao instanciá-la, mas diferente de C, C++, e Objective-C, não é necessário ter 2 cópias da assinatura de cada função (nome e parâmetros) uma no cabeçalho e outra na implementação (e a instanciação em Obj-C é pior, pelo que li: Classe* obj = [[Classe alloc] init];). Depois de um tempo longe do C e C++, tinha até esquecido essa incomodação da replicação entre .h e .c.

Em Java dá para deixar outras pessoas mexerem no seu código sem (muito) medo de estragarem seu cuidadoso gerenciamento de memória e ponteiros, depurado com muito suor (entretanto, talvez esqueçam de fechar a conexão com o banco…).

Comparando com as linguagens dinâmicas (Python, Ruby, etc.):

Java é pesado e consome uma enorme quantidade de memória, mas apesar disso, tem o potencial de ser mais rápido que qualquer linguagem dinâmica.

Java é estável, a linguagem não muda radicalmente a cada ano (nem a cada dois anos, talvez mude algo depois de três anos). Dá para começar e terminar seu projeto tranqüilo sem chegar no fim com aquela sensação de estar usando uma versão obsoleta da linguagem.

A questão de reflexão e bibliotecas deixa de ser uma vantagem do Java (como era em relação ao C++), mas em compensação, em Java é muito mais fácil criar interfaces razoáveis e autodocumentadas (por causa das declarações de tipos) entre módulos diferentes da aplicação. Em Python, é um vale tudo: se algum espertinho ou distraído resolver adicionar um atributo de objeto chamado tmp35 no if mais escondido do arquivo A e acessá-lo num tratador de exceção que quase nunca é executado no arquivo B, a linguagem vai aceitar; o atributo vai existir ou não dependendo do if, e o tratador de exceção pode ter um comportamento diferente dependendo disso.

Você queria ter uma boa mensagem de erro mas o próprio tratador de exceção pode jogar uma exceção por causa de uma variável não encontrada, enquanto que em Java um problema desses não passaria do estágio de compilação. Em Java, muito mais problemas são detectados logo na compilação, ou pelo próprio editor que já compila o programa em segundo plano. Geralmente dizem que basta usar testes unitários com as linguagens dinâmicas, mas não sei… Precisaria de muito mais testes (escrever os testes é complicado!), e não daria para esquecer de testar os casos mais excepcionais, já que vários tipos de erro de digitação só são detectados quando o programa executa tal linha. Ao fazer uma grande refatoração numa linguagem com tipos mais estritos, pelo menos temos uma garantia que não deixamos nenhum pedaço do código horrivelmente inconsistente, né?

Comparando com outras linguagens:

Apesar de verbosa, a linguagem Java vem do C++, com práticos atalhos como i++; i += 2; a = b = c = 0; declaração de variáveis em qualquer local da função; operador ternário ?:; e ganhou um for-each bem antes do C++. Imaginem se Java viesse do Pascal, com variáveis declaradas só no começo das funções, i := i + 1; e os horríveis begin e end, que embora teoricamente sejam necessários “apenas para instruções compostas”, acabam sendo necessários quase sempre, porque a linguagem não permite fazer muita coisa por linha (nada de v[i++] = w[j++] = x[k++]).

Primeiros passos num idioma

Não gosto muito de começar a aprender línguas com as saudações. Acho muito mais interessante aprender coisas que ajudem a montar frases, entender coisas. Prefiro elementos que possam ser recombinados de maneiras diferentes. Já as saudações são pura decoreba: você aprende aquilo ali, e usa sempre igual, não tem como usar de outro jeito. Também não é muito interessante começar justo por verbos irregulares (como ser/estar/ir), justamente porque os conceitos não poderão ser generalizados futuramente. Se bem que verbos são bem mais reaproveitáveis do que os cumprimentos.

Começar a aprender pelas saudações é como uma criança ganhar uma roupa em vez de um brinquedo de presente: até pode ser útil, mas não tem graça nenhuma, nem desenvolve o raciocínio. ;-)

(aliás, nem estou estudando língua nenhuma atualmente, caso o título tenha dado a entender)