Publicado por: robsonvf em: 7 07UTC Novembro 07UTC 2009
como já diria Joel Spolsky… este blog já está fedendo a cupim (não, Joel não disse isso, na verdade do que se trata dele terminou nas reticências e tinha a ver com o titulo do post) mas tudo bem, esta é uma rapidinha que, se eu tivesse um numero consideravel de seguidores no twitter, seria um twitt… mas, como eu não gosto do twitter e nem quero que você me siga, vai pra cá mesmo.
Tudo que você faz, o faz como se você mesmo fosse usar? Pense nisso antes de construir a próxima linha de código lá no seu trabalho, esqueça seu chefe chato (não que o meu seja, caso o mesmo leia este post…) e codifique como se você mesmo fosse seu próprio usuário, como se você dependesse do seu próprio sistema para realizar seu trabalho.
Afinal de contas meu caro colega, os usuários gostariam tanto, mas tanto, que o que tu faz realmente funcionasse, que eles seriam capazes de te dar um beijo nas nadegas a cada dia de caixa fechado sem bug no sistema. E eu, sendo o cara que irá dar manutenção no seu código, adoraria tanto ver uma suite de testes unitários bem construidos quando o pegasse, que seria capaz de.. te pagar uma Polar bem gelada no boteco mais badalado da cidade baixa aqui de POA.
“Ah, mas eu já escrevo todo aquele código e testo tudo no main.. ainda tenho que escrever testes unitários pra ele?” Amigão, se tu quiser não precisa mais escrever este código todo.. escreva apenas os testes então. Ééé, isso mesmo. Esqueça aquela coisa toda logo de cara e vá direto aos seus @Test.. apenas coloque na cabeça: só entregue este código depois que os testes passarem! Se por acaso, tu ter que codificar um pouco para os testes passarem, beleza, tu faz classe a classe, mas espere, a classe não precisa existir para tu escreve-la pela primeira vez no seu teste… deixe o Eclipse chorar mesmo, só depois tu cria, ou melhor, rode a droga do teste sem a classe, para tu VER na tela que nada funciona sem a presença da maldita classe. É bem simples, não precisa ler um livro para começar.. são regrinhas básicas: da direita (seus testes) <simula erro> para a esquerda (implementação de uma pequena porção de código) <testa>.
“Mas quando eu sei que não preciso mais testar?” Quem disse que não precisa mais testar? Sempre que tu tocar aí tu vai testar, a unica diferença é que não precisará mais se preocupar com o que já está testado, pois se der algum tipo de erro, tu saberá exatamente onde consertar. Eu mesmo, sei quando não preciso mais testar quando o código que eu preciso para entregar a minha estória está pronto e é suficiente, pois de acordo com o TDD, se ele já está pronto, é porque existe um teste para ele!
Finalizando.. “eat your own dog food” .. estou ficando louco ou:
a propósito (falando em loucos), aproveitando a presença do Rod Johnson na TDC, nos diga Rod: o que faz a SpringSource, usar PHP no seu portal? http://www.springsource.com/index.php, Por quê não o nosso amigo SpringMVC?
E que calor infernal em Porto Alegre…
Publicado por: robsonvf em: 19 19UTC Julho 19UTC 2009
Eu tenho um notebook da Amazon PC, já faz quase dois anos. De uns dias para cá, o mesmo começou com um probleminha estranho: ligava apenas após várias tentativas. A tela sequer dava sinal de vida. Isto não me encomoda tanto, pois estou afim de comprar um Desktop. No mais, esperava pelo menos vendê-lo. Ainda bem que não o fiz, pois senão teria que arcar com esta tralha para com quem eu teria feito tal negócio. De todo modo, fica a dica para quem pretende comprar notebook: Fuja da Amazon PC.
Uma reclamação idêntica à minha pode ser conferida aqui.
Abraços, e bom FDS. (sorry pelo post fora de foco)
Publicado por: robsonvf em: 16 16UTC Julho 16UTC 2009
Apenas um delegate para atualizar o blog com um assunto interessante que apareceu no TheServerSide, portanto, segue uma ótima leitura para quem quer sair fazendo DAOs a todo custo utilizando JPA, assim como as melhores práticas para tal ato: http://www.theserverside.com/news/thread.tss?thread_id=55191
Publicado por: robsonvf em: 26 26UTC Abril 26UTC 2009
Vejo muita gente confundindo e fazendo besteira com JSF por não saber configurar o escopo correto dos Beans, ou até mesmo não saber o significado entre um Model Bean x Backing Bean, por exemplo. Neste post, Neil Griffin explica com detalhes estas importantes informações. Para quem deseja trabalhar com JSF, é leitura obrigatória.
Publicado por: robsonvf em: 31 31UTC Março 31UTC 2009
Não, eu não sou nenhum guru em TDD, mas aos poucos estou notando a vantagem desta técnica que agrega muito mais do que simples junits ao seu projeto. TDD te fornece na verdade outra abordagem: o desenho do seu software de uma maneira mais desacoplada e coesa.
... um pouco de história: Era uma vez um jovem desenvolvedor empolgado em introduzir técnicas de testes ágeis em sua empresa, porem, foi barrado pelo seguinte motivo: Testes (senão, os feito por testadores) são uma segunda opção (precisa dizer que a primeira é o cronograma?). Esta é a visão dos gerentes/gestores de projetos que não conhecem TDD. A única coisa que sabem a respeito é de que TDD se testa primeiro. Na verdade, alguém que pensa assim, não sei nem como chega a este raciocínio, pois duvido muito que eles entendam o que dizem -i.e. como assim testar primeiro algo que ainda nem existe?-
TDD, não deve ser considerado como uma prática de teste -apenas-, mas sim como uma técnica poderosa de desenho/construção de aplicações OO, E, DE QUEBRA, tu ganhas o teste de unidade. Simples assim. Para cada caso, um teste que falha, onde sua história só termina quando ele passa. Por completo! A principio a idéia parece um pouco radical, mas é isso mesmo: você deve construir um teste que falhe primeiro, (nem que seja para testar se o seu JUnit está presente no seu classpath!), para, então, você ir incrementando aos poucos, refatorando, e criando as classes, métodos, xpto… que sejam necessários para o mesmo passar e testando. Vamos brincar com isso em um exemplo simples, de Conta Corrente:
Criamos um novo projeto, e nele, um novo teste unitário (estou utilizando o JUnit 4):
package com.wordpress.robsonvf;
import org.junit.Assert;
import org.junit.Test;
public class ContaCorrenteTest {
@Test
public void umDepositoDeveAumentarOSaldoNoValorDoDeposito() {
Assert.assertTrue(false);
}
@Test
public void umSaqueDeveDiminuirOSaldoNoValorDoSaque() {
Assert.assertTrue(false);
}
@Test(expected=RuntimeException.class)
public void umSaqueSoEhPossivelSeTemSaldo() {
}
}
Esta é a abstração mais simples possível de conta corrente que consegui chegar, creio que para o exemplo seja suficiente. Rode este teste, e veja-o falhar descaradamente e sem dó: o primeiro passo rumo a TDD foi dado. O segundo é fazer isso tudo funcionar! Notaram que, quando eu disse “abstração mais simples possível de conta corrente” ficou claro que, eu comecei a desenhar meu software antes mesmo de criar uma única classe de negócio sequer? E ainda tem gente que duvida que simples testes unitários são tão claros quanto montanhas de documentos.
Vamos trabalhar então no método: umDepositoDeveAumentarOSaldoNoValorDoDeposito, o que este método precisa para viver numa conta corrente? Na minha abstração primária, ficou assim:
@Test
public void umDepositoDeveAumentarOSaldoNoValorDoDeposito() {
ContaCorrente cc = new ContaCorrente(200d);
double saldo = cc.getSaldo();
cc.deposita(100d);
Assert.assertTrue(saldo+100d == cc.getSaldo());
}
Precisa explicar? uma nova sessão de conta corrente, um registro histórico do saldo atual com o qual a conta foi criada, um deposito, e uma verificação: o saldo esperado é igual ao saldo da conta? Você já consegue rodar este teste? Não? Está esperando o que então para criar a classe ContaCorrente e os métodos que o sua IDE chora sem parar por eles não existirem? Se utiliza o eclipse/netbeans, basta ir clicando nos erros e gerando a classe, construtores, métodos…, faltaria só implementar. Este é o seu exercício antes de continuar com a leitura.
Implementou? Rode o teste agora. Passou? Ótimo! Seu primeiro teste usando TDD foi concluído com sucesso. Se quiser, faça isso com os outros métodos até todos passarem. (recomendo fazer isso antes de ver, logo abaixo, o restante do código).
O teste pronto:
package com.wordpress.robsonvf;
import junit.framework.Assert;
import org.junit.Test;
public class ContaCorrenteTest {
@Test
public void umDepositoDeveAumentarOSaldoNoValorDoDeposito() {
ContaCorrente cc = new ContaCorrente(200d);
double saldo = cc.getSaldo();
cc.deposita(100d);
Assert.assertTrue(saldo+100d == cc.getSaldo());
}
@Test
public void umSaqueDeveDiminuirOSaldoNoValorDoSaque() {
ContaCorrente cc = new ContaCorrente();
cc.deposita(100);
cc.saque(90d);
Assert.assertTrue(10 == cc.getSaldo());
}
@Test(expected=RuntimeException.class)
public void umSaqueSoEhPossivelSeTemSaldo() {
ContaCorrente cc = new ContaCorrente();
cc.deposita(200);
cc.saque(201);
}
}
A minha classe ContaCorrente (aposto que a sua ficou igualzinha!):
package com.wordpress.robsonvf;
public class ContaCorrente {
private double saldo;
public ContaCorrente() { }
public ContaCorrente(double d) {
this.saldo +=d;
}
public double getSaldo() {
return this.saldo;
}
public void deposita(double d) {
saldo +=d;
}
public void saque(double d) {
if ((saldo-d) < 0)
throw new RuntimeException(“Saldo insuficiente!”);
saldo -= d;
}
}
Aprimore mais a lógica de negócio desta classe, envolva outras classes, e não se esqueça: primeiro o teste, depois a especificação do negócio, e por fim, a implementação… E FUNCIONANDO…
Este post foi apenas um simples estimulo para quem está querendo aprender TDD, assim como eu. Espero que você adote esta pratica para seus novos algoritmos, e, que convença seu chefe de que TDD não é apenas teste unitário avulso, mas, sim, uma nova maneira de se pensar na hora de sair construindo software.
Até a próxima.. e que venha a Agile Weekend aqui em poa
Publicado por: robsonvf em: 26 26UTC Março 26UTC 2009
Depois de um tempo sem postar (puderas, semanas de finalização de versões, instalações e suporte ao teste lá no trabalho, sim, tudo isso em paralelo e não necessariamente se referem ao mesmo projeto. Já disse que começou a faculdade?), venho deixar uma lembrança aos dois ou três (obrigado mãe!) navegantes que tenho por aqui: Sabe aqueles projetinhos simples, que seu chefe tirou lá do fundo do baú, que ninguém queria fazer e você foi o felizardo em “matar no peito”? É dele que quero falar hoje.
Quando você está envolvido num novo projeto, principalmente nas vezes em que você responderá pela arquitetura do mesmo, te vem na cabeça milhares de idéias que –a principio- estão fora do escopo do mesmo (e do cliente), em conjunto com as idéias, surge uma nuvem de frameworks na sua mente, e o tesão de integrá-los, utilizando o maior numero possível de jars, preferindo a escolha de um framework de validação para o “isBlank” (créditos ao Alex) ao invés de implementar a droga do método e, de quebra, tudo isso bombando com aspectos e injeções de dependências na testa. Pense sobre isso, e reflita: Você precisa disso tudo? Você vai precisar daquela coisa que você fez apenas para “SE UM DIA…” mesmo? Não e não!
Projetos simples devem ficar simples. Quanto mais simples ele ficar, melhor pra você, pro seu cliente e para o futuro desenvolvedor que irá dar manutenção no mesmo, pois não precisará aprender aquele bolo de tecnologias que você pensou em empurrar no seu projeto. Faça uso de ferramentas que vieram para facilitar, desde frameworks para desenvolvimento rápido e ágil: Grails, Django, Rails, .. até mesmo as boas e velhas IDEs, como o NetBeans, que já gera uma aplicação JSF a partir de entidades JPA, completinha e bonitinha. Dentre várias outras opções. Keep It Simple, Stupid!
Publicado por: robsonvf em: 8 08UTC Março 08UTC 2009
Antes de falar sobre este assunto, vamos lembrar o significado da palavra ignorância, que não necessariamente significa que o ignorante é BURRO, pois este problema se cura com a informação, mas o pior ignorante é aquele que boicota sugestões, opiniões, etc. Ao pé da letra, ignora a informação.
Estimativas de itens no processo de desenvolvimento de software, costumam ser algo que não se tem receita definida, senão a própria experiência do desenvolvedor. Metodologias ágeis introduzem algumas orientações para se fazer isso, mas ainda assim não há mágica, a métrica normalmente vem da média anterior x complexidade de cada caso –e da competência de cada um-.
Estimar bugs não faz parte do cotidiano do desenvolvedor moderno, do homem sem defeitos. O problema é que muitos esquecem que são seres humanos, e que certamente, terão que alterar casos de uso, discutir com o analista de negócios, cliente, refatorar, testar e refatorar novamente item por item, bug por bug. E, sim, imprevistos irão aparecer, e eles devem ser considerados dentro da iteração.
Mas como eu vou estimar algo que não é certo que vai aparecer? O segundo parágrafo responde novamente esta questão. O importante aqui é: Sim, você deve considerar o tempo gasto com imprevistos dentro do seu item. Nem que considerar este tempo signifique separar tempo para prever a criação de uma nova estória para um futuro conserto em uma futura iteração, mas isso valerá com base no que você espera entregar ao fim da iteração, e normalmente algo indefinido/com defeito não faz parte deste plano. Lembrem-se: estimativas andam lado a lado com o cronograma e, por motivos óbvios, a idéia do cronograma não é atrasar. Se o cronograma da vez está apto a responder por 100 horas de itens, é mais fácil incluir 4 itens de 25 horas com testes, refatorações e correções de imprevistos inclusos na estimativa, do que incluir 5 itens de 20 horas, sendo necessário atrasar o cronograma ou pior, remover um item do mesmo para entregar.
Mas, se mesmo assim, esta estimativa imprevista sobrar? Há tanta coisa que você pode fazer se ficar idle, como: testes, melhorias no código, automatizar processos, etc. Mas isso já é assunto para outro post.
Publicado por: robsonvf em: 26 26UTC Fevereiro 26UTC 2009
Então, sexta passada fui até o Carrefour comprar uma cadeira descente para o notebook daqui do apartamento, de modo compulsivo, acabei comprando uma mesinha também, andando com o carrinho de compras praticamente transbordando em direção ao caixa, visualizei de longe as tirinhas de Dilbert, você está demitido! E não resisti, já coloquei pra dentro, e logo ao lado, vi A Cabeça de Steve Jobs, ele parecia piscar para mim e não teve jeito, levei também. Esta é a parte ruim da história, sim, meu bolso.

Agora a parte boa, o livro é fantástico! Duhh! Óbvio, se tratando de Steve Jobs, qualquer coisa se torna fantástica e é exatamente disso que Leander Kahney retrata durante as 200 e poucas paginas, que você pode ler durante um carnaval, por exemplo. (sim, eu fiz isso durante o carnaval!). Kahney, inicia a obra dando um resumo geral do que viria pela frente, desde o inicio de Jobs na Apple, junto a Wozniak, até sua saída e, posteriormente, seu retorno a empresa –então a beira da falência-, quando Jobs a coloca no topo novamente (“O que tem de errado por aqui? São os produtos! Os produtos são uma #%$@*! – Steve, em seu pré-retorno a Apple”).
Mostra o que os funcionários temem, o conceito de ser “stevado” gira em torno da Apple, pois a figura de Jobs decreta que, ou você é um gênio ou é um idiota, e normalmente quem não se considera gênio, não gostaria de cruzar o caminho de Jobs pelos elevadores da empresa. Também descreve um Jobs perfeccionista, extremamente poderoso em marketing, com um potencial fantástico para criação de novos produtos, rigoroso com design, somado a uma personalidade tão forte, que ninguém consegue dizer “não” a ele, apenas o inverso acontece bastante. Há também umas boas pinceladas pelos principais produtos da Apple, principalmente os criados pela cabeça de Jobs, inclusive, sempre retratando números de lucros, vendas, etc. O autor detalha bem este aspecto, o que é algo bem interessante.
E principalmente, demonstra como um líder de verdade deve ser! Você deveria ler este livro…
Publicado por: robsonvf em: 20 20UTC Fevereiro 20UTC 2009
Ei você, você mesmo! Eu sei que você pesquisa meu nome no google, talvez até você tenha sido meu gerente em uma empresa que estive, estou ou estarei. Vou te dar uma dica, lembra daquele esquema todo sobre cargos e salários em TI? Lembra? Bom, isso não importa, apenas LEIA ESTE EXCELENTE POST DO GC e aprenda de uma vez por todas que… homem é homem, menino é menino, macaco é macaco e veado é veado.
Publicado por: robsonvf em: 11 11UTC Fevereiro 11UTC 2009
O que mais vejo nas comunidades que freqüento é gente perguntando coisas como “Vale a pena aprender X?”, “Tenho Y anos, ainda consigo aprender a tempo para entrar no mercado Z?”, “O que devo aprender primeiro para começar a trabalhar com XPTO?”. Depois de sempre responder prontamente este tipo de assunto, resolvi blogar sobre o mesmo. Então, vamos lá:
- O mercado de TI está escasso? Está! Mas não para profissionais ruins. Falta gente qualificada. Então sabichão, se você acha que é só fazer aquele cursinho de verão de Java da vida e já vai sair bombando no mercado, está muito enganado! O negócio é pontual: aprendizado contínuo. Você vai precisar estar sempre atualizado, lendo livros técnicos, estar por dentro das ultimas tecnologias do mercado, assinar blogs/feeds (já assinou meu blog?) sobre o assunto, ler as revistas em destaque relacionadas E, mesmo assim, ainda não será suficiente, pois faltará o ânimo para por tudo isso em prática (e acredite, esta é a parte mais difícil).
- Existe idade para começar na tecnologia X? Mas é obvio que não! Conforme respondido na questão anterior, o mercado de TI está escasso, então, se você for bom, não importa se você tem 10 ou 100 anos, apenas pare de perder tempo e encare logo.
- Vale a pena aprender XYZ? Pergunta juvenil! Se você quer ganhar dinheiro (e acho que é este o seu objetivo em querer aprender XYZ), olhe para o mercado, veja o que mais se pede, pois o que mais falta é o que mais viabiliza o retorno, por isso vá com cautela na escolha do seu próximo alvo, se XYZ está em falta, é claro que vale a pena.
- E o salário, é bom? Não, é ruim. Mas (em minha opinião), TI te da um retorno mais rápido, e o salário é melhor do que outras profissões mais comuns, além de faltar profissional bom (oferta > procura). Na verdade, acredito que quem trabalha em TI não é nem tanto pelo salário, e sim porque gosta da profissão, então se você está em dúvida por causa do salário, não creio que terá sucesso com TI.
- Vale a pena trocar A por B? Já disse, o mercado quem manda. Se a demanda de B for maior que A, vale, é claro.
Boa sorte a todos!