As desventuras de um casal nérdico
Hachihoku à Otimização de Código
25 janeiro 2010, por Edson, às 17:53

Toyota_AE86_Sprinter_TruenoA minha sogra tem hoje uma Ecosport e, pessoalmente, gosto muito mais da Eco que do que o Corolla que ela tinha.

Para quem não é entendido em carros não deve saber que o Corolla é um carro da Toyota. Sim, Corolla é um carro com excelente motor da Toyota e, inclusive, ele foi o substituto do Hashi-Roku.

Mas WF é Hashi-Roku??? Hashi-Roku significa AE86, um carro da Toyota (japonesa) que até virou mangá e anime (Initial-D) por conta do ótimo motor e da facilidade de modificá-lo. O Corolla chegou a ser o carro mais vendido no mundo. Mas nem sempre foi assim. Após a segunda guerra mundial, quem dominava o mercado era a Ford (americana) e eles faziam isso de modo fácil. A Ford comprava tudo, de aço ao volante, em toneladas, fabricava carros aos milhares e empurrava tudo aos americanos. A Toyota vivia num mundo bem diferente: em um país falido onde duas grandes bombas atômicas tinham explodido, um país que tinha perdido a guerra.

Então a Toyota decidiu comprar apenas o que precisava para fabricar os carros que seus clientes compravam, sem manter nada em estoque (just-in-time). Mas isso significava ter preços mais caros (pois todos sabem que comprar em quantidade reduz o preço). Desde modo, se a Toyota queria competir, ela precisava economizar e economizar significava, principalmente, evitar o desperdício.

Com isso, eles descobriram coisas que os americanos não sabiam. Descobriram, por exemplo, que “inspecionar seus produtos para encontrar erros” era desperdício. Um produto com defeito era um produto que ia pro lixo. Mas como fazer para manter a qualidade? O erro tinha que ser descoberto ANTES que o produto fosse feito, ou seja, era preciso impedir que o defeito ocorresse. Daí saiu o padrão “à prova de idiota”, ou seja, se antes tinha um parafuso que podia se encaixar em vários buracos (mas só um deles era o correto), fizeram o parafuso só  entrar em um buraco.

Outra coisa legal que descobriram é que otimizar parte do carro enquanto este era construído era desperdício também. Pois muitas vezes se otimizava achando que aquilo era importante e no final apenas piorava o projeto do carro, pois aquilo não era tão importante quanto se imaginava no começo. Logo, começaram a construir os carros e otimizar no final apenas as peças que realmente precisavam ser otimizadas.

E, olha que interessante, todos esses conceitos podem ser aplicados em construção de software!

Just-in-time

Clientes não querem projetos longos que levam seis meses, um ano para ficar prontos. Eles querem que a coisa seja feita exatamente no momento solicitado. E para este problema, metodologias como XP devem ser aplicadas (faço posteriormente um post apenas sobre isso).

À prova de idiotas

Para que testar teu software depois que você fez? E se você primeiro fizesse o teste e depois criasse o aplicativo?
- Mas se eu testar antes do aplicativo ficar pronto vai dar erro! – e vai, de fato. E é para dar mesmo! Mas o interessante é que somente depois que o teste está pronto é que você codifica o programa, aí à medida em que você constrói o programa, você vai usando o programa de testes para verificar se de fato funciona. Isso impede que você vá por um caminho muito errado, descobrindo o erro antes do programa estar pronto.

Otimizar o todo

Regra 1: Código enxuto e sem lixo

Regra 1: Código enxuto e sem lixo

Este era a principal razão deste post, e ela pode ser dividida em dois motivos:

Métodos Ágeis

Eu tive um curso de “Métodos Ágeis” na USP semana passada, em que muitas dessas coisas foram faladas. E eu sinceramente adorei o curso, pois vi que eram exatamente as conclusões a que eu estava chegando na prática, via tentativa e erro. Mas ali foram me passadas todas consolidadas, de uma vez e provavelmente para chegar nesse conhecimento eu ia levar mais dez anos batendo a cabeça.
Para quem quiser aprender algo sobre métodos ágeis eu recomendo muito o site da agilcoop.

Twitter

Eu estava conversando via twitter com um amigo (Maximus) e ele disse todo empolgado:
“Eureka! Descobri que se fizer (valor<0)?-valor:valor é mais rápido que fazer Math.abs(valor)”

E aí eu respondi que, na realidade, era a mesma coisa. Claro que tem diferença, mas era uma provocação intelectual =P. Acontece que a diferença é tão pequena que você pode arredondar para zero e, desta forma, mesmo que você use 1 milhão de vezes, 1kk vezes zero é zero.

Então ele me disse que testou e que em 6kk vezes ele tinha economizado 1 segundo e meio de processamento. Neste ponto eu larguei a conversa pois o twitter não é lugar pra discutir. Não, não estou dizendo que sou chato e estou reclamando de quem discute no twitter, não é isso. É que vocẽ só pode discutir algo no twitter se você conseguir provar sua teoria em 256 caracteres. Einstein jamais conseguiria por exemplo demonstrar sua teoria =D.

Ok, mas o que pode ser dito além disso? O seguinte:

Otimize se você realmente precisar!

Primeiro que, se o seu programa roda isso 6 milhões de vezes por segundo, por favor não use Math.abs. MESMO!
Mas acontece que a maioria dos programas não usa com essa frequência, e é muito mais fácil você cometer um erro de programação escrevendo (valor<0)?-valor:valor do que Math.abs(valor). Ou seja, você pode estar incluindo erros no seu código para otimizar algo que não precisa ser otimizado. Já dizia Tony Hoare “Premature optimization is the root of all evil” (Pré-otimização é a raiz de todo mal).

Não reinvente a roda…

Dentro da função Math.abs(valor) o que é feito é justamente (valor<0)?-valor:valor. Logo, o que você estaria economizando seria apenas o call da função. Ou seja, se é para economizar chamadas de função então uma linguagem orientada a objeto como java ou C# não são a opção correta para você. Escreva seu código todo em C e de preferência com “goto” sem função alguma. Pois, senão, toda função você terá esse tempo perdido que foi analisado ali em cima.

O Java é amigo do peito

Se você é javeiro, você tem menos motivos ainda para fazer essa otimização. Pois quando você faz chamadas à função no java, ele começa a criar cache de respostas para ficar mais otimizado (em tempo de execução). É o que torna aplicativos feitos em java mais rápidos até que em C quando o aplicativo fica longas horas ligado (como em servidores). Mas, para ele fazer isso, é necessário que você crie seu projeto com muitas funções e bem orientado a objetos. Desse modo, se o teu programa pergunta quanto é Math.abs(-1) muitas vezes, logo ele vai cachear a resposta de que Math.abs(-1) é igual a 1 e ele vai retornar 1 em vez de chamar a função. Ocasionando um ganho de tempo absurdo. Logo, use funções e deixe o java te ajudar a otimizar.

Use Profiles

Praticamente em todas as linguagens existem plugins ou programas que rodam o seu sistema e mede o tempo e quantidade de vezes que as funções são chamadas. Usando um programa assim, você chegará aos métodos que são gargalos no sistema e aí sim você deve otimizá-los.

Conclusão:

Muitos que cursaram Ciências da Computação ou graduações semelhantes devem ter topado com alguma matéria semelhante à Otimização de Código. Nessas matérias você consegue aprender a contar a grandeza da função, se ela é de ordem logarítima ou exponencial. Quando você estuda isso, tem facilidade maior de otimizar código onde realmente precise. Removendo fors que estão dentro de fors. Chamadas de banco dentro de loops, e coisas assim. Mas novamente, só faça isso se você usou um Profile e mediu que era este o seu gargalo.

Então espero que vocês tenham aprendido algumas coisas sobre Toyota, carros e otimização. E, principalmente, se eu fugir de uma discussão via Twitter, aguarde um post explicando o motivo =D.


Avatar- Meu primeiro filme no Cinema
4 janeiro 2010, por Edson, às 11:04

avatar-creatureFui assitir ao filme Avatar no iMax-3D. Eu sabia que o filme tinha uma história meia boca, não sabia nada sobre ela, mas sabia que era meia boca. Porém Avatar é, por muitos críticos, avaliado como o primeiro filme 3D, não que outros filmes 3D não existissem, afinal esta é uma velha técnica, mas este é o primeiro a mesclar 3D ao filme sem piedade, sem economia de modo a proporcionar uma experiência única. Então, fui ver meu primeiro filme 3D.

Logo nos trailers, Alice, Shrek 3 e Toy Story 3 deu para notar que 3D estava impregnado em todos os lugares. O chapeleiro maluco e o gato ficaram cara a cara comigo, sobre a pessoa que estava na minha frente. Não é um efeito “parece 3D”, não! É um 3D real, salta na cara, objetos saem da tela, tal como no filme “O Ultimo Grande Herói” de 93.

A sensação que tive foi a mesma de quando eu tinha 5 anos e entrei pela primeira vez no cinema, a diversão ampliada da tela da TV para a tela do cinema, foi a mesma do cinema pro cinema 3D. Decidi, jamais gastarei dinheiro em cinema novamente se não for 3D, a menos que eu tenha visto todos os 3D em cartaz.

Ver Avatar em DVD? Passo, não tenho interesse algum, história fraca, atores medíocres. Tudo somado leva nota 5 no máximo, mas o fato de ser totalmente 3D eleva a diversão para nota 10, comparado a grandes obras do cinema.

Agora acredito que todo grande filme Holywoodiano vai estar lotado de imagens e efeitos 3D, o que é ótimo! A tecnologia vai barateando, os filmes vão aderindo e em breve até filmes bons vão ter efeitos 3D. Aliás, Alice acho que será o primeiro filme bom com efeitos 3D fortes.

E os efeitos? Nunca me senti tão dentro do filme. Sem tirar nem por, jogaram agua na minha calça, levei ferpas de madeira na cara, chamas de fogo cairam sobre mim e ao meu redor. Você fica no meio do filme e não atrás, só vendo um filme 3D você percebe como o cinema tradicional 2D é falso, como a câmera estraga a imagem do filme, como tudo é falso na tela de TV ou mesmo na tela do cinema 2D. Quando é 3D você nota a fumaça em volta de você, o filme não termina na tela, mas em você e as vezes atrás de você. Você vê como se fosse real, como se o que separa você dos personagens fosse uma cortina de vidro e nada mais. A sensação de que você pode pegar no braço de um personagem, ou esticar a mão e pegar um folha que cai da árvore é real.

Sim, vi meu primerio filme no cinema, todo o resto nos 31 anos anteriores foram filmes visto em uma televisão em casa.