AgileBrazil 2011 – parte 2

Essa parte é sobre minha palestra no AgileBrazil 2011. Sexta-feira, resolvi que apenas apresentaria minha palestra, depois iria curtir Fortaleza (sério, aquele lugar é muito bom!).

Enfim, minha palestra foi Mantendo a Qualidade dos Códigos de Teste, e nela resolvi arriscar duas coisas novas: primeira, em fazer uma palestra para pessoas de nível intermediário, para não ter que ficar explicando o que são mocks, stubs, etc. Segundo, que a palestra seria de duas horas, para dar tempo de falar tudo o que eu queria.

Claro, a segunda opção quase me deu um tiro no pé. Primeiro, porque para não soar irreal, eu resolvi que todo o código da palestra (que por sinal, está disponível no link acima. Recomendo que vocês baixem o link, a versão do slideshare esconde algumas coisas) ficaria disponível no Github, com exemplos reais (assim, qualquer pessoa poderia rodar os códigos e ver que é possível sim fazer testes daquela forma). Segundo, porque essas duas idéias me tomaram um tempo absurdo para escrever a palestra. Demorei MUITO para fazê-la, bem mais do que eu esperava. E terceiro, porque descobri que duas horas também não é muito tempo…
(more…)

AgileBrazil 2011 – parte 1

Bom, pensei em como escrever um post sobre o AgileBrazil E Fortaleza ao mesmo tempo, mas não dá. Há muito o que contar sobre ambos, então vai um post de cada vez. O de hoje, falarei sobre o evento.

O AgileBrazil é uma convenção muito boa de métodos ágeis de desenvolvimento de software. Frequentei-o ano passado, e esse ano achei a organização muito melhor do que da outra vez (e o lugar também foi uma excelente escolha). Porém, senti uma queda no nível das palestras, embora eu não sei se foi por má escolha minha ou porque o nível estava mais baixo mesmo. Por sinal, todas as palestras estão disponíveis no site oficial do AgileBrazil, para quem quiser baixá-las (a minha estará em breve também).

No primeiro dia, quarta-feira, optei pela palestra Slicing and dicing your user stories. Achei fraquíssima, até porque a palestra mesmo foi muito abstrata: o assunto foi tão vago que eu senti que, se eu estivesse falando de maçãs ao invés de user-stories, o resultado final seria o mesmo. Faltou profundidade, tudo ficou muito superficial, e sendo bem sincero eu não entendi direito aonde eles queriam chegar.
(more…)

Auditando Métodos em Ruby

Mais um da série “Coisas que você nunca quis fazer com Ruby, e tinha medo de perguntar”, embora o título não seja tão correto assim: bem ou mal, eu precisei fazer isso algumas vezes em um ou outro trabalho meu, mas enfim, vamos ao cenário:

Imagine que você está mexendo num código de alguém. O código está com acoplamento muito alto, e antes de refatorá-lo você precisa entendê-lo – e é aí que entra o problema. Ruby, como todos sabemos, não tem uma IDE muito boa, com um debugger muito bom, e para fazer esse processo seria legal se, por exemplo, eu pudesse rodar um comando e ele me retornasse: “Entrei no método X, Entrei no método Y, Saí do método Y”, etc.

Bom, o fato é que é bem simples de fazer isso com Ruby:

Para tal, basta “apenas” reabrir todas as classes que formos auditar, puxar todos os métodos que são implementados naquela classe, e re-escrevê-los de forma que seja informado que aquele método foi chamado. Como não há muito desafio em fazer tal coisa, apresentarei duas formas de fazê-lo.
(more…)

A Maldita “Parte Teórica”

Uma das frases que eu mais odeio, quando converso com alguém muito estudioso mas com pouca prática, é a frase “mas você sabe que, por definição…”. Isso sempre me lembra o velho ditado “na prática, a teoria é outra” e o post de hoje é sobre isso: como eu odeio teoria não aplicada.

Isso é especialmente verdade em programação. Graças à frase “mas por definição, a equipe que testa tem que ser diferente de quem desenvolve” atrasa ou freia completamente Test-Driven Development, assim como várias outras “verdades” são seguidas, metodicamente, desde os primórdios da programação e as pessoas nem sequer sabem se é ainda válido.

Pegando, por exemplo, Design Patterns. Eu não sou contra a idéia geral dos design patterns, apenas questiono (e questiono MUITO mesmo) quando usá-los. É comum ver códigos que são relativamente simples que usam três ou quatro patterns diferentes, sem nenhum motivo aparente.
(more…)

Minha Saída de um Cargo Público

Bom, para os que não sabem, eu deixei um cargo público, estatutário, numa universidade federal. Na verdade, pedi um afastamento, mas gostaria de não voltar para lá e conseguir guiar minha vida de outras formas. O motivo é muito parecido com outros que já vi, mas acho legal contar um pouco da história também.

Quando se usa o termo “a máquina do governo”, acredito sinceramente que o termo é bem apropriado. Quando se fala a palavra “máquina”, eu pelo menos imagino aquelas máquinas antigas, totalmente mecânicas, que fazem um barulho absurdo e soltam fumaça e cheiros enquanto funcionam. O engraçado dessas máquinas antigas é que, mesmo com essas características peculiares, digamos assim, elas funcionam. Claro, comparando com modelos mais modernos, elas são BEM piores, são mais lentas, tem BEM menos recursos, mas com essas máquinas antigas, mesmo acumulando um pouco de ferrugem aqui, ou arrebentando uma correia ali, elas continuam funcionando como se nada tivesse acontecido. Detalhe que essas máquinas antigas gastam mais de energia, combustível, etc, e isso também é uma metáfora apropriada…

Assim é o governo. Pior ainda, há uma completa resistência em adotar coisas mais modernas, em mudar algo que funciona mal, mas que está em produção há anos, ou de arriscar algo novo: desde linguagens até frameworks diferentes.

E isso não é a pior parte.
(more…)

Bytecodes, e JIT

Resolvi escrever este post por muitos motivos, mas o principal deles é porque vi muitos amigos e colegas meus sem saber, direito, o que é um bytecode. Muitos acham que apenas linguagens como Python (com seus arquivos .pyc) e Java (com seus arquivos .class) possuem bytecodes, justamente porque ao “compilar” o programa, um novo arquivo é criado.

Nada poderia estar tão longe da verdade.

Bytecode é um conjunto de instruções, em forma binária ou seja, em uma forma não legível por humanos, que instrui uma máquina virtual a fazer determinadas ações. Bytecode não é apenas um arquivo, ou um código intermediário entre o executável nativo e a linguagem, e na maioria das vezes nem sequer é um código otimizado, com algumas raras exceções (scala 2.8, por exemplo, pode otimizar “tail call” em recursões). É importante entender essa parte, porque nem sempre um bytecode é gravado em um arquivo, e em algumas vezes sequer é um formato simples.
(more…)

Otimizando com Javascript

Inicialmente, o nome desse post era pra ser: “otimizar ou escalar?”, mas acabei optando por este outro nome. Afinal, a postagem é sobre como foi otimizado, então…

Há algum tempo, aqui em meu trabalho, sofríamos com um sistema meio problemático: o sistema em questão é um sistema montado para que alunos possam escolher disciplinas, e é feito em duas fases. Nosso problema específico era com a segunda fase: um aluno só pode escolher uma disciplina desde que ela possua vagas, e como há certas disciplinas que muitas pessoas querem, isso vira uma corrida contra o tempo: praticamente metade da universidade acessando o sistema ao mesmo tempo, para conseguir sua vaga, e o sistema demorando muito tempo para completar cada requisição, enfileirando requisições, e um tempo absurdo para atender cada uma…

Enfim, foi jogado mais poder de processamento, mas para cada um processador que acrescentávamos, entravam mais quinheitos alunos, e cerca de cem disciplinas. Claramente, não haveria load-balancer que aguentasse, nem máquina que pudesse aceitar. Estudamos uma base não-relacional, diversas soluções, até chegar em uma: processar a página no cliente.
(more…)

Update: o que estou estudando?

Como faz tempo que não posto nada no blog (falta tempo), resolvi fazer este post meio que para iluminar um pouco o que tenho estudado ultimamente.

Comecei a aprender Scala. Na verdade, peguei esse tempo para estudar linguagens interessantes, que há tempos quero estudar como Scala, Haskell e Lisp. Criei um repositório de testes para brincar com essas linguagens no meu github: https://github.com/mauricioszabo/learning. Futuramente, farei posts sobre Scala também, que é uma linguagem interessante para substituir Java.

Comecei também a estudar desenvolvimento para Android. Instalei o emulador, fiz uns “hello, worlds” com Scala, Java e JRuby (Ruboto), o suficiente pra descobrir que rodar algo em Ruboto é inviável de tão lento…
(more…)

A Humanidade de um Cientista

Esses dias, estava lendo um blog de um professor daqui da UFABC. Um professor que, conforme a noticia oficial, “faleceu em circunstâncias trágicas”. Não o conhecia, pessoalmente, mas gostaria mesmo de tê-lo conhecido. Alguém que possuía uma inteligência acima do normal, alguém que via e sentia acima de sua inteligência, inconformado com o mundo, e pelas suas postagens, inconformado consigo mesmo.

Alguém que juntou algumas cadeiras, no décimo primeiro andar do prédio, e de lá se atirou.

Não quero discorrer sobre o quão certo ou errado isso é. Religiões o culpariam, alguns apontam o dedo e dizem “suicida!”, mas a verdade é que: 1) ninguém sabe o que ele estava passando (nem mesmo eu, só posso deduzir brevemente pelo seu diário abandonado na internet), e 2) eu acredito, sinceramente, que cada um de nós é dono de sua própria vida, por mais que algumas religiões insistam em contrário, por mais que a própria lei brasileira criminalize o suicídio. Sua escolha foi errada? Sim, pelo lugar escolhido. Acredito que muitas pessoas devam ter sido obrigadas a ver algo que não estavam preparadas, mas também, vejo que isso expõe certas verdades ocultas.

Em primeiro lugar, por que escolher a universidade, seu local de trabalho? Por que escolher logo a entrada do prédio, um lugar aonde todos veriam sua decisão, e ao mesmo tempo ter pensado em um lugar aonde, com toda a certeza, ele não cairia sobre ninguém?

Sua morte foi noticiada como “circunstâncias trágicas”. Claro, suicídios normalmente incitam mais suicídios quando são noticiados como tal. Não caberia uma discussão maior sobre o assunto? Por que ocultar um suicídio com medo de uma “epidemia”, ao invés de tentar evitar que as pessoas tenham essa vontade? Se é sabido que isso gera epidemia, por que não estudar e tentar minimizar os motivos que levam pessoas a quererem tirar sua própria vida? Ou será que isso não é, digamos, interessante para a “sociedade”? Eles realmente não acham que criminalizar o suicídio, ou dizer “quem se mata vai pro inferno” vai evitar esse tipo de incidente, não é?
(more…)

Como eu Entendo BDD

Test Driven Development, ou Behaviour Driven Development… duas “buzzwords” que, só de serem pronunciadas, trazem milhares de sentimentos. Porém, isso não mostra uma cruel realidade:

Poucas pessoas concordam com o que é, de fato, “teste de software”.

Em uma apresentação que fui, no AgileBrazil, com cerca de 150 pessoas na platéia, o apresentador lançou a pergunta: “o que é teste de software para você?”. O experimento era escrever em um papel sua resposta, e trocar com a pessoa do lado. Estranhamente, apenas 5 pessoas, na platéia toda, receberam um papel com uma explicação que batia com a sua.

Então, acho que seria interessante citar o que eu entendo por Teste de Software, e porque eu considero que pratico “Behaviour Driven Development”.
(more…)