sábado, 30 de junho de 2012

Validação do CNS (Cartão Nacional de Saúde)


Durante a semana que passou tive que implementar um código para validar o número do CNS (Cartão Nacional de Saúde), que passará a ser obrigatório a todos os brasileiros. O próprio site do SUS apresenta um exemplo em Java (e em outras linguagens).

Utilizei o código de exemplo, mas na minha opinião ele está tão mal feito que isso passou a manhã inteira me atormentando. Fiquei tentando me convencer de que "você tem um prazo para cumprir, o importante é funcionar", mas não consegui. Logo depois do almoço tive que refazê-lo. O relevante é que se você analisar o código para verificar "o que ele deve fazer", ao invés do "como fazer", perceberá que é algo extremamente simples. Passei de 93 linhas para as 15 abaixo.

Código bem-feito:

O projeto que contém este código, os testes e outras benesses está disponível em https://github.com/insula/opes

Para quem tiver curiosidade em saber como é o código original no site do SUS, segue abaixo. Mas cuidado! Pode causar náuseas e vômitos. Se tiver estômago forte, pode seguir adiante...

Código "normal":

[Dica] Normalização de Strings em Java


Dica rápida para quem já passou pela situação de ter que "normalizar" Strings em Java. Por "normalizar" eu defino que é a rotina de se remover todos os caracteres não-ASCII de uma determinada String.

Segue abaixo:

segunda-feira, 18 de junho de 2012

[Dica] Desfazendo o último commit do git

Você acabou de fazer um commit no seu repositório do git, mas esqueceu de alguma coisa, ou resolveu mudar a mensagem do log, ou cometeu um erro e gostaria de desfazê-lo.

Para os impacientes:
git reset --soft HEAD~1
Quem quiser uma explicação de como o comando funciona pode referenciar diretamente em http://stackoverflow.com/questions/927358/git-undo-last-commit

Ou se quiser aproveitar e criar um alias para poder executar simplesmente um git undo:
git config --global alias.undo "reset --soft HEAD~1"

domingo, 17 de junho de 2012

Eclipse fullscreen no MacOSX


Certamente uma das formas de aumentar a sua produtividade é eliminar o máximo possível de distrações no trabalho. Assim você torna mais fácil fazer o que tem que ser feito.

Recentemente passei a utilizar um recurso do MacOSX Lion pouco explorado por mim até então: o modo fullscreen das aplicações. Não tenho nenhuma informação numérica para provar, mas a minha impressão é a de que realmente o modo fullscreen melhora a produtividade. Não tenho mais e-mail, twitter etc aparecendo nos cantos da tela para tirar o meu foco da tela.

Na parte psicológica, parece-me que alivia também a sensação de "sobrecarga de informação". Ajuda a lidar com uma coisa de cada vez.

Para quem considera o Eclipse a sua IDE favorita, descobri um plugin que faz com que ele fique compatível com o modo fullscreen do MacOSX Lion. http://marketplace.eclipse.org/content/full-screen-enabler-eclipse-3637-osx-lion. Nos outros SOs não faz diferença.

Aos felizes usuários do Eclipse no MacOSX, depois me reportem se a produtividade de vocês realmente aumentou ou não.

Dica: utilizem o Cocoa 32 bits. Carbon é um toolkit muito antigo, e 64 bits só pra quem utilizar heaps maiores que 4GB.

Falhas no cloud computing da Amazon no dia 14/06/2012


Muitas pessoas tiveram problemas no dia 14/06/2012 com suas instâncias disponibilizadas no Amazon EC2 na região us-east-1. Com sorte, felizmente, não fui um dos afetados. Mesmo assim tive o interesse de ler o relatório que a Amazon disponibilizou sobre as causas do incidente.

Se errar (e falhar) é humano, então certamente não há uma outra disciplina tão humana quanto a Tecnologia da Informação. Nossa área de atuação possui tantos fatores interligados que torna o improvável muito mais plausível.

Notem a sequência de eventos da falha:
  1. Um cabo de alta tensão que fornecia energia ao datacenter falhou.
  2. Duas subestações de energia desligaram.
  3. Imediatamente os geradores do datacenter foram ligados e o sistema de energia foi trocado sem interrupções.
  4. Após um tempo de operação, um dos geradores superaqueceu graças a um cooler defeituoso, e desligou-se.
  5. Automaticamente todos os equipamentos que estavam ligados àquele gerador tiveram seu circuito de energia trocado para o conjunto de geradores secundário, que também foi ligado de modo imediato.
  6. Infelizmente o disjuntor que ligava o circuito ao conjunto de geradores secundários estava configurado com uma amperagem muito baixa, e desligou no momento da troca.
  7. A partir deste instante os equipamentos conectados àquele gerador ficaram sem energia e foram desligados.
Improvável? Certamente. Isso só evidencia a fragilidade das operações. Se num ambiente de altíssima disponibilidade como o da Amazon uma falha dessas aconteceu, imagine nos pseudo-datacenters ou pseudo-infraestruturas locais que muitas empresas utilizam por aí.

Notem que mesmo com uma falha deste porte, somente uma pequena quantidade de equipamentos ficou sem energia (somente os ligados ao gerador com cooler defeituoso).

Para garantir a continuidade do negócio, é necessário seguir o manual à risca: replicar os dados e o serviço em datacenters em regiões geográficas distintas. Os clientes da Amazon que utilizaram o multi-AZ não foram afetados pela falha.

quinta-feira, 14 de junho de 2012

O preço da felicidade: R$ 12.500/mês


O estudo não é novo (foi publicado em 2010 com dados relativos a 2008 e 2009), mas ainda assim acredito que vale a pena trata-lo. Neste link é possível encontrar uma reportagem a respeito.
"Quem disse que dinheiro não traz felicidade?"
Dois pesquisadores (incluindo um ganhador do prêmio Nobel em economia) de Princeton realizaram um estudo e descobriram quanto custa a felicidade: US$ 75.000 anuais. Convertendo em Reais a uma cotação de R$ 2,00 = US$ 1,00 em Junho/2012, temos que a felicidade custa R$ 150.000,00 anuais ou aproximadamente R$ 12.500,00 por mês.

Como a pesquisa foi realizada nos EUA, há uma margem de erro para os padrões brasileiros, mas podemos acreditar em um valor próximo de R$ 12.500,00 por mês.

Quais são os indicativos da pesquisa? Até uma renda mensal de R$ 12.500,00 quaisquer acréscimos de renda provocam um aumento diretamente proporcional no índice de felicidade das pessoas. Acima deste valor mensal o aumento de renda não influencia mais na felicidade. Outros fatores passam a influenciar a balança, tais como religião, filhos, saúde etc.

Posso ousar em dizer que o dinheiro não traz felicidade, mas certamente a falta dele a leva embora. A falta de dinheiro costuma exacerbar os outros problemas que enfrentamos no cotidiano. Na pior das hipóteses com o dinheiro pode-se comprar excelentes antidepressivos...

Este tópico está relacionado a um outro tema que pretendo tratar em breve: motivação no trabalho. Mais ficará para um próximo post.

Olhando minha situação por uma perspectiva boa, creio que minha felicidade ainda pode crescer muito! Só preciso aumentar a minha renda em boas doses. E você, já conseguiu comprar a sua?

quarta-feira, 13 de junho de 2012

Programador Profissional #2: Arrogância e humildade


Primeiramente definirei as acepções que utilizarei das palavras "arrogância" e "humildade":
Arrogância: (do latim arrogantia). Atitude altaneira; altivez, orgulho.
Humildade: Consciência da própria fraqueza ou situação.
Um programador profissional é arrogante, pois tem consciência do que representa seu trabalho e do que é capaz de fazer. Não há porque sermos modestos neste ponto: programar é provavelmente a atividade intelectual mais difícil de todos as profissões existentes.

Nós, programadores, somos os seres mais poderosos do universo. Nós, programadores, somos capazes de criar ordem a partir do caos. Nós, programadores, somos capazes de enviar passarinhos ao espaço para matar porcos que roubam ovos. E nós temos esse poder pois somos capazes de criar software.

A cura do câncer só será possível pois um programador profissional criará um software que permitirá que isso aconteça. Os limites da idade humana serão rompidos porque um programador profissional criará um software que permitirá que isso aconteça. A fome de todos os habitantes do planeta será extinta porque um programador profissional criará um software que permitirá que haja comida em abundância. Absolutamente nenhuma inovação da produção humana ocorrerá sem que um programador profissional  esteja por trás dela.

E "quanto maior o poder, maior a responsabilidade". Um programador profissional tem consciência e orgulho de seu poder; e o utiliza com responsabilidade.

Um programador profissional não se contenta em fazer "cadastros": ele sabe que pode e se empreende em fazer muito mais.

Mas um programador profissional também tem humildade. Ele sabe que é humano, e que pode e falhará muitas vezes em sua jornada. Admitir seus erros, desculpar-se e corrigi-los faz parte do seu cotidiano.

Um programador profissional não é um chato que precisa proclamar para todas as paredes que "eu sou foda". (Não faltariam exemplos se quisesse cita-los).

Um programador profissional usa o seu conhecimento, sua habilidade e a sua experiência como um relógio de bolso: deixa-o guardado sem exibi-lo, mas oferece e mostra as horas quando necessário ou quando solicitado.

Um programador profissional é humilde como um super-herói: ele dorme com a satisfação de quem tornou o seu mundo um pouquinho melhor, mas contenta-se em permanecer no anonimato...

terça-feira, 12 de junho de 2012

De aprendiz a mestre: os 3 primeiros livros


Frequentemente alguém me indaga com uma frase parecida com "Gostaria de aprender. Quais livros você me recomenda?" Esta semana aconteceu novamente e resolvi deixar aqui registrado para facilitar o acesso a esta informação.

Java continua sendo minha referência, e embora quase todos os conceitos possam ser aplicados provavelmente em qualquer linguagem, os exemplos dos livros são em Java. Os livros que indico abaixo não são livros para se aprender a programar, ou para se aprender Java. São livros que considero fundamentais para alguém tornar-se um programador profissional. Afinal, aprender Java (ou qualquer linguagem) é uma questão de conhecimento da sintaxe e familiaridade. O que buscamos com esta bibliografia são os conceitos fundamentais de código bem-feito.

Estes três livros são suficientes? Certamente que não! A lista de livros é potencialmente infinita. Mas toda jornada se inicia com os primeiros passos. Acredito que com estes três livros a caminhada comece bem. E por que três livros? Pura liberalidade. Geralmente no início da jornada o dinheiro é curto, e a frase que ouvi esta semana foi: "Tenho verba pra comprar três livros. Quais você me indica?" Segue a tríade. São referências que de tempos em tempos você voltará a ler por prazer e necessidade. Boa leitura.

Effective Java, de Joshua Block

Clean Code, de Robert C. Martin (Uncle Bob)

Refactoring, de Martin Fowler

segunda-feira, 11 de junho de 2012

Técnica do espelho: olhe pelos olhos do usuário


Hoje pela manhã gastei uma hora e meia do meu tempo para renovar a minha CNH. Tive a sensatez de preencher a guia pela Internet e já levá-la paga ao posto de atendimento do DETRAN. Isto fez com que eu economizasse no mínimo mais umas 2 horas.

A senha que obtive para cadastrar as digitais e tirar a foto digital foi a de número 47. No painel indicava já o atendimento 23. Levei mais de uma hora para ser chamado, mesmo com 4 atendentes realizando o trabalho simultaneamente. Fazendo umas continhas básicas constatei a média de 10 minutos para cada cadastro. Blasfemei silenciosamente alguns impauperios ao funcionalismo público, somente para depois ter que perdoá-los...

O motivo da lentidão não era o ritmo de trabalho dos atendentes, e sim o software que fazia o registro das digitais. Logo pensei: certamente o responsável (ou os responsáveis) pelo software nunca devem ter passado por esta situação de morosidade. Ou se o fizeram, não olharam com os "olhos do usuário".

Uma das melhores coisas que aprendi na minha vida como profissional de software foi a técnica do espelho. Em tudo o que você faça, sempre olhe pelos olhos de quem usa. No nosso caso, o usuário. Penso sempre assim: se eu tivesse pago pelo software que eu mesmo fiz, xingaria a mãe do programador ou ficaria satisfeito com o resultado (ou numa situação ideal, mais que satisfeito)?

Nunca considere o seu trabalho como finalizado somente porque "está funcionando". Sempre pense como o usuário. Tenha o desejo e o objetivo de surpreender positivamente quem quer que utilize o seu software.

Quando alguém liga ou manda um e-mail reportando um bug, você se irrita? Se o usuário é rude com você, você retruca também de modo grosseiro? Pense bem. Quem é o f**** d* p*** que não está fazendo o trabalho direito? Você (programador) ou o usuário? Se você recebe a enésima ligação reclamando que um usuário não consegue executar tal rotina: o idiota é o usuário ou você que fez algo extremamente não intuitivo?

Faça esse exercício. Se depois de utilizar a técnica do espelho você realmente concluir que o culpado é o outro, aí sim poderá exercitar o seu vocabulário de baixo calão à vontade...

sexta-feira, 8 de junho de 2012

Educação na área de Tecnologia da Informação

É necessário curso superior?

Se você quiser um diploma de um curso da área de Tecnologia da Informação sem realmente ter que saber programar, você consegue. Afinal, educação no fundo tornou-se um negócio, e se você tiver o dinheiro e quiser comprar, alguém irá vendê-lo para você. E não há nada de ilegal nisso. Há um infinidade de cursos em que você pode entrar, passar em todas as disciplinas, e se formar sem nem saber escrever código. Se o curso for muito exigente, muitos reprovam, desistem... E os alunos somem. Negócio é negócio. Você sempre tem que deixar os clientes (ops, alunos) satisfeitos.

Se você quiser um diploma que realmente lhe ensine a programar e que lhe capacite a ser um profissional de sucesso, você também consegue. Em algumas instituições você não se forma se não conseguir demonstrar um bom nível de competência em suas habilidades. Mas infelizmente em boa parte das instituições que consideramos respeitáveis você obtém um nível de competência proporcional ao esforço que você dedica. Como a maioria dos estudantes aplica pouco esforço, já sabemos qual resultado esperar.

Quem me dera saber e ter convicção das soluções para estes problemas. Cada dia mais acredito que o modelo aprendiz-mestre é o mais adequado para formar programadores. Os anos de experiência me mostraram e fizeram acreditar que software é muito menos (quase nada) de engenharia e muito de artesanato.

É necessário um programador profissional para trabalhar em conjunto e ensinar outros aprendizes. Claro que há uma série de conhecimentos básicos e fundamentais que todo programador deve adquirir; mas as técnicas, o espírito e a habilidade de programar e fazer código bem-feito devem ser transmitidas por um mestre.

Sim, há os autodidatas, e estes são imprescindíveis.

O modelo aprendiz-mestre e o conceito de artesanato de software é algo em que pretendo trabalhar e elaborar um projeto nos próximos meses... Quem sabe conseguir aplica-lo em alguma(s) instituição(ões) de ensino da região. Depois reporto os resultados.