Resenha – O Monge e o Executivo

Pra espanar um pouco a poeira do blog pensei em fazer essa recomendação de livro que li há poucos dias. Ok, o livro já não é novidade e mesmo eu tendo lido há pouco tempo eu já o conhecia há anos.

Quem me conhece sabe que sou um pouco cético quanto a esse tipo de livro que intitulo de “auto-ajuda profissional”, mas decidi largar o ceticismo de lado e comprá-lo por uma bagatela. Depois da leitura admito que valeu cada centavo. O intuito deste post é, além de resumir a obra sem estragar a diversão, falar um pouco da minha experiência com o mesmo.

O Livro

O Monge e o Executivo (The Servant nos EUA) é um livro pequeno, com 140 páginas aproximadamente. Sua fonte é mediana e o mesmo é organizado em capítulos, o que facilita a leitura para pessoas super atarefadas que não dispõem de longas horas para leitura. Eu particularmente lia um capítulo ou dois antes de deitar todas as noites. A leitura é agradável, em vez de nos descer goela abaixo centenas de teorias de liderança e administração, o autor nos conta uma “historinha” fictícia e que nos ajuda a compreender melhor os conceitos e até mesmo nos identificarmos mais com o livro. Em 12 anos o livro vendeu 200 mil exemplares nos EUA. Já no Brasil passou da marca 2,4 milhões de exemplares, se tornando o maior sucesso da história da Editora Sextante.

A História

O livro narra a história de John Daily, um executivo estadunidense que possui um cargo de liderança em uma grande empresa que fatura milhões. Ele é marido de um psicóloga e pai de dois filhos. O que aparentemente seria uma vida perfeita, profissional e pessoal, está em colapso.

John começa a notar que sua vida está ruindo, como líder, como marido e como pai. Aceitando a sugestão de sua esposa e do pastor local, John vai para um mosteiro em Michigan ficar uma semana com um grupo de monges para espairecer e para colocar sua vida em ordem. Na verdade o que chama a atenção do executivo (e que dá nome à versão portuguesa) é um monge do mosteiro chamado Simeão (nome este que tem um significado místico para John) que na verdade é Leonard Hoffman, um ex-empresário de sucesso que largou tudo e se dedicou ao mosteiro integralmente por ter encontrado a paz e a felicidade.

Simeão se torna o mentor de John e outros líderes que vieram para o “curso”, ensinando-os as virtudes de um líder verdadeiro, como amor, empatia, humildade e autoridade. Com diálogos cheios de referências históricas e frases de grandes pensadores, a narrativa é rica em detalhes e nos faz refletir sobre o nosso próprio comportamento, seja como líderes, maridos, etc.

Os Personagens

Além do personagem principal, John Daily, e do monge Simeão, existem outros colegas de retiro de John, entre eles um pastor, uma treinadora de baseball, uma enfermeira e um militar (acho que tem outros, mas já esqueci, hehehe). Embora os mais leigos acabem odiando o sargento (Greg) ele acaba se tornando um dos elementos principais da história, fazendo o papel de “do contra” e questionador da aplicabilidade das técnicas de liderança ensinadas por Simeão.

Quem realmente entende a história percebe que todos nós temos um pouco de “Greg”. Sinceramente se não existisse o personagem do militar no livro a leitura não seria tão proveitosa.

Fica aí a dica para quem não leu. Obviamente eu não sou o primeiro a indicar este livro e com certeza não serei o último.

Benchmark de Expressões Regulares

regexRecentemente eu li o fantástico Expressões Regulares – Uma Abordagem Divertida de Aurélio Marinho Jargas (@oreio e http://www.aurelio.net), buscando mais informações a respeito do uso de Regular Expressions em parsers HTML (como os que uso para criar mecanismos de busca). Não posso dar mais detalhes sobre o projeto, mas o que originou este post foi a dúvida que o livro me deixou: até que ponto vale a pena utilizar expressões regulares em um sistema para realizar parsing de HTML ao invés dos métodos existentes na classe string, como Replace, IndexOf, Split etc?

Este post relata algumas experiências que tive durante os testes, informações estas que não encontrei na net e tive de fazer por mim mesmo!

O que são Expressões Regulares?

Para quem não sabe do que se trata, segue um trecho retirado do próprio livro, que a meu ver, é uma excelente definição:

Bem resumido, uma expressão regular é um método formal de se especificar um padrão de texto.

Mais detalhadamente, é uma composição de símbolos, caracteres com funções especiais, que, agrupados entre e si e com caracteres literais, formam uma sequência, uma expressão. Essa expressão é interpretada como uma regra, que indicará sucesso se uma entrada de dados qualquer casar (match) com essa regra, ou seja, obedecer exatamente a todas suas condições.

O que é um benchmark?

Este é o primeiro de muitos benchmarks que pretendo fazer. Sempre gostei do assunto de desempenho computacional e gosto de criar códigos que realmente utilizem todo o poder de uma linguagem e de uma máquina. Benchmarks nada mais são do que testes de performance entre soluções concorrentes.

Benchmarks de peças de hardware existem aos montes pela Internet, incluindo o fantástico site Tom’s Hardware que é fonte recomendadíssima de consulta para quem quer comprar uma nova placa de vídeo ou processador. Porém benchmarks de código são mais difíceis de achar, principalmente em língua portuguesa. Espero agregar valor aos visitantes do blog com conteúdo exclusivo do que eu chamo de C# Tuning!

Let’s do it!

Todos os testes foram feitos sobre um arquivo HTML contendo 206KB em 2073 linhas. A máquina onde rodaram os testes é meu PC comum, um Athlon X2 2.2GHz com 2GB RAM. O projeto era um Console Application utilizando o .NET Framework 4.0.

Vamos ao que interessa, os testes realizados foram:

  1. Busca por palavras
  2. Troca de palavras
  3. Quebra de palavras

1º Cenário: Busca por Palavras

No primeiro embate da noite tivemos uma busca por uma determinada palavra dentro do HTML. Esta palavra estava na (teoricamente) pior posição do arquivo: na última linha, última coluna. Foi feito um código utilizando os métodos tradicionais de busca por string, Substring e IndexOf. O IndexOf me dava a posição daquela palavra para poder retirá-la de dentro do HTML usando o substring. Ou seja, você tem a palavra e quer encontrá-la no texto (igual aos que os editores de texto fazem). Já o Regex usa apenas seu comando Match passando por parâmetro a entrada (o HTML) e o padrão (a expressão regular). Vitória esmagadora da Regex: 24.316 Ticks no método tradicional contra 3.278 Ticks da Regex. Quase 10x mais rápido.

Segue o código:

2º Cenário: Troca de Palavras

No 2º round temos um desafio um pouco maior: o usuário quer encontrar determinada palavra no texto e trocá-la por outra palavra. Mais uma vez, a palavra que se busca estará no final do HTML, para forçar os dois métodos a usarem o máximo de seu potencial, enfrentando o pior caso possível. No método tradicional temos o uso do método String.Replace, e no córner azul temos o Regex.Replace. Tim-tim! Empate técnico: o Replace tradicional obteve um tempo de 7753 Ticks, contra 7859 Ticks do seu rival mais elaborado.

Segue o código:

3º Cenário: Quebra de Palavras

No último embate da noite, temos o duelo de Splits. Quem sairá melhor: String.Split ou Regex.Split? Dessa vez a palavra que será usada como padrão para a “quebra” estará uma linha antes da última linha do HTML, para exigir ao máximo dos métodos. Ready…Go! Nocaute da Regex: o comando Split da Regex conseguiu a façanha de quebrar o texto em três pedaços (sim, a Regex inclui a palavra buscada dentro do array de retorno) em apenas 5.354 Ticks, contra 13.351 Ticks do Split tradicional, que traz apenas 2 posições no array.

Segue o código:

Ok, você pode achar que o método Split da Regex não corresponde de forma idêntica ao Split da String, porém, note que o Split da Regex te dá outros incríveis recursos como delimitar o número máximo de posições no array, iniciar a quebra do texto a partir de uma posição específica, iniciar da direita para a esquerda, entre outras. Sem contar que a versatilidade de descrever o seu separador usando um expressão regular ao invés d euma palavra literal não tem preço.

Conclusões

Regex na veia!

Ok, se escreve mais linhas e os ganhos são imperceptíveis em aplicações tradicionais, mas não se esqueça de usar Regex caso suas aplicações processem texto pesado (como parsers), mesmo que você não esteja buscado uma palavra que atenda a uma regra elaborada, mas uma simples palavra literal como utilizada nos exemplos.

Você fez um código mais otimizado para tentar provar que os métodos tradicionais são mais rápidos que a Regex? Mande pra mim!

Você tem outra idéia de embate entre String vs Regex que gostaria de ver publicado aqui? Mande pra mim também!

Usando cookies com WebClient

WebClient é uma classe muito útil quando você precisa fazer download ou upload de dados da ou para a web. Entretanto, quando você precisa fazer uma sequência de chamadas você vai perceber que o WebClient não preserva cookies atribuídos pelo servidor entre as requisições. Fezlimente, WebClient lhe dá a oportunidade para você mesmo gerenciar seus cookies.

Uma solução muito simples e que aprendi no blog It Could Be Done! é sobrescrever o método GetWebRequest da classe WebClient e atribuir a propriedade CookieContainer. Abaixo segue a minha implementação:

Eu testei na prática e funciona perfeitamente, por isso não resisti e tive de dar um re-post em pt-BR. Enjoy it!