<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>tucaz</title>
 <link href="http://blog.tucaz.net/atom.xml" rel="self"/>
 <link href="http://blog.tucaz.net"/>
 <updated>2015-04-26T23:28:29+00:00</updated>
 <id>http://blog.tucaz.net/index.html</id>
 <author>
   <name>tucaz</name>
   <email>me@tucaz.net</email>
 </author>

 
 <entry>
   <title>DevOpando em ambientes Windows com Performance Counters - Requests per Second</title>
   <link href="http://blog.tucaz.net/2012/11/30/devopando-em-ambientes-windows-com-performance-counters-requests-per-second"/>
   <updated>2012-11-30T22:00:00+00:00</updated>
   <id>http://blog.tucaz.net/2012/11/30/devopando-em-ambientes-windows-com-performance-counters-requests-per-second</id>
   <content type="html">&lt;p&gt;Quando desenvolvimentos aplicaçoes, conhecer bem o ambiente em que fazemos o deploy é fundamental. Principalmente quando falamos de aplicaçoes web
e abertas pra internet. Estas aplicaçoes estao mais expostas e sujeitas a todo tipo de situaçoes como um pico de acessos e até maldosos ataques.
Geralmente esta tarefa é deixada para a equipe de infra-estrutura, mas cada vez mais os desenvolvedores estao se metendo nessa área e
aprendendo a configurar e otimizar seus servidores.&lt;/p&gt;

&lt;p&gt;Vamos DevOpar!&lt;/p&gt;

&lt;h4&gt;Performance Counters&lt;/h4&gt;

&lt;p&gt;Este é um assunto que gosto muito e que vou explorar agora começando com performance counters. Performance counters, como o próprio nome diz, sao
contadores que o Windows e muitas aplicaçoes que rodam sobre ele disponibilizam pra nós. Por meio destes contadores é possível verificar desde o uso
de CPU da máquina até informaçoes detalhadas sobre a execuçao do Garbage Collector em aplicaçoes .NET.&lt;/p&gt;

&lt;h4&gt;Performance Monitor&lt;/h4&gt;

&lt;p&gt;Para ter acesso aos contadores de performance basta digitar &quot;perfmon&quot; no prompt &quot;Executar&quot; do Windows:&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;center-image&quot;&gt;
&lt;img src=&quot;/assets/post-images/2012/11/executar_perfmon.png&quot; alt=&quot;Prompt Executar&quot; /&gt;
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;que a janela principal do &lt;em&gt;Perfomance Monitor&lt;/em&gt; se abrirá já com algumas informaçoes básicas sobre sua máquina:&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;center-image&quot;&gt;
&lt;img src=&quot;/assets/post-images/2012/11/perfmon_principal.png&quot; alt=&quot;Tela principal do Performance Monitor&quot; /&gt;
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Clicando em &quot;Performance Monitor&quot; ganhamos acesso a o que realmente nos interessa:&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;center-image&quot;&gt;
&lt;img src=&quot;/assets/post-images/2012/11/perfmon_grafico.png&quot; alt=&quot;Tela com gráficos no Performance Monitor&quot; /&gt;
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Através do botao existente na barra de tarefas é possível trocar o tipo do gráfico e mudar para um que nôs de os valores absolutos dos contadores
que já traz, por padrao, a utilizaçao de CPU:&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;center-image&quot;&gt;
&lt;img src=&quot;/assets/post-images/2012/11/perfmon_texto.png&quot; alt=&quot;Tela com valores absolutos dos contadores&quot; /&gt;
&lt;/span&gt;&lt;/p&gt;

&lt;h4&gt;Requests Per Second / Requisiçoes Por Segundo&lt;/h4&gt;

&lt;p&gt;Agora que já nos ambientamos com nossa nova ferramenta de trabalho vamos começar a falar dos contadores em si. O primeiro que vou falar a respeito é
&lt;em&gt;Requests Per Second&lt;/em&gt;, ou na sigla, RPS.&lt;/p&gt;

&lt;p&gt;Este contador é o mais básico e ainda um dos mais importante quando analisamos qualquer aspecto relacionado a performance em aplicaçoes Web.
Ele nos fornece o número de requisiçoes que uma instância do .NET (comumente um site do IIS) está executando a cada segundo.&lt;/p&gt;

&lt;p&gt;Baseado no número de requests podemos dizer se nossa aplicaçao irá ou nao aguentar a demanda prevista ou identificar o momento (número de requests)
em que nossa aplicaçao começa a se comportar mal, por exemplo &lt;a href=&quot;#footnotes&quot;&gt;[1]&lt;/a&gt;. A partir deste contador é que a análise de todos os outros fará sentido.&lt;/p&gt;

&lt;p&gt;Para incluí-lo na sua janela do performance monitor basta utilizar o botao &quot;Adicionar&quot; na barra de ferramentas.&lt;/p&gt;

&lt;p&gt;É importante entender que todo contador está sempre associado a uma instância que será selecionada no momento que adicionamos o contador. Neste caso,
uma instância é um site do IIS, mas em outros casos podemos encontrar o acumulado de todas as instâncias disponível em uma instância chamada
&lt;em&gt;_Global_&lt;/em&gt; ou &lt;em&gt;_Total_&lt;/em&gt;, um executável .NET ou até mesmo uma instância especifíca de um serviço exposto por meio de WCF.&lt;/p&gt;

&lt;p&gt;Este contador está localizado dentro do grupo &lt;em&gt;ASP.NET Applications&lt;/em&gt; com o nome de &lt;em&gt;Requests/Sec&lt;/em&gt; &lt;a href=&quot;#footnotes&quot;&gt;[2]&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;center-image&quot;&gt;
&lt;img src=&quot;/assets/post-images/2012/11/perfmon_adicionar.png&quot; alt=&quot;Adicionando novo contador no Performance Monitor&quot; /&gt;
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Uma vez adicionado, você verá, em tempo real &lt;a href=&quot;#footnotes&quot;&gt;[3]&lt;/a&gt;, o número de requisiçoes por segundo que seu site está atendendo. Na maioria das aplicaçoes
este número é relativamente baixo nao passando de 5 ou 10 já que pra que este contador seja incrementado é necessário que as requests sejam executadas
exatamente no mesmo segundo. Isto geralmente acontece em duas situaçoes: você tem vários usuários acessando sua aplicaçao ao mesmo tempo
ou caso suas requisiçoes demorem muito pra terminar a execuçao.&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;center-image&quot;&gt;
&lt;img src=&quot;/assets/post-images/2012/11/perfmon_adicionado.png&quot; alt=&quot;Contador RPS no Performance Monitor&quot; /&gt;
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Já em alguma aplicaçoes este número pode ser bem alto. O &lt;a href=&quot;http://www.tumblr.com&quot;&gt;Tumblr&lt;/a&gt; por exemplo, atende cerca de 40 mil &lt;a href=&quot;#footnotes&quot;&gt;[4]&lt;/a&gt;
requisiçoes em um dado segundo o que requer uma arquitetura bem desenhada e implementada.&lt;/p&gt;

&lt;p&gt;Nos próximos posts sobre este assunto vou falar de contadores de exceptions, caching, memória e diversos outros que devem ser monitorados e medidos
pra garantir a boa saúde de sua aplicaçao.&lt;/p&gt;

&lt;p&gt;Era isso. :)&lt;/p&gt;

&lt;p&gt;&lt;span id=&quot;footnotes&quot;&gt;
&lt;strong&gt;[1]&lt;/strong&gt; Ele também serve pra você se gabar para seus amigos nerds já que construir uma aplicaçao que atende milhares de RPS nao é trivial&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[2]&lt;/strong&gt;  A Microsoft pisou na bola na hora de nomear os contadores do Windows na versao em Português. O nome dos contadores foi traduzido.
A maioria deles você consegue encontrar facilmente, mas alguns tem nomes totalmente toscos e por conta da ordenaçao alfabética contadores
relacionados acabam ficando em posiçoes nao sequencias dentro de seus grupos o que é um pé no saco.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[3]&lt;/strong&gt; Os contadores sao coletados em intervalos super baixos (1 em 1 segundo no Windows 8 Ultimate, por exemplo) o que, pra todos os efeitos, é
em tempo real e este valor é configuável por meio das propriedades do Performance Monitor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[4]&lt;/strong&gt; Fonte - &lt;a href=&quot;http://highscalability.com/blog/2012/2/13/tumblr-architecture-15-billion-page-views-a-month-and-harder.html&quot;&gt;http://highscalability.com/blog/2012/2/13/tumblr-architecture-15-billion-page-views-a-month-and-harder.html&lt;/a&gt;
&lt;/span&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Como armazenar senhas de forma segura em sua aplicaçao - Parte 2</title>
   <link href="http://blog.tucaz.net/2012/11/30/como-armazenar-senhas-de-forma-segura-em-sua-aplicacao-parte-2"/>
   <updated>2012-11-30T22:00:00+00:00</updated>
   <id>http://blog.tucaz.net/2012/11/30/como-armazenar-senhas-de-forma-segura-em-sua-aplicacao-parte-2</id>
   <content type="html">&lt;p&gt;Na &lt;a href=&quot;http://blog.tucaz.net/2012/11/02/como-armazenar-senhas-de-forma-segura-em-sua-aplicacao-parte-1/&quot;&gt;primeira parte&lt;/a&gt; desta série
abordei alguns conceitos básicos e terminei falando de hashing e como ele serve pra gerarmos um valor único e irreversível a partir
de um input de dados.&lt;/p&gt;

&lt;h4&gt;Como utilizar hashing pra proteger nossa aplicaçao&lt;/h4&gt;

&lt;p&gt;Já que nao conseguimos reverter o valor gerado a partir de uma funçao de hashing como podemos utiliza-lo como forma de proteçao de senha?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public void CadastroUsuario(string login, string senha /* outros dados do usuário */)
{
    var hashSenha = GerarHash(senha);
    Usuarios.Armazenar(login, hashSenha /* outros dados do usuário */ )
}

public bool LoginEhValido(string login, string senha)
{
    var hashUsuarioArmazenado = Usuarios.RecuperarHash(login);
    var hashSenha = GerarHash(senha);

    return hashSenha == hashUsuarioArmazenado;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;ol&gt;
&lt;li&gt;No momento do cadastro do usuário, ao invés da senha, armazenamos o hash resultante da senha do usuário como exemplificado no método &lt;em&gt;CadastroUsuario&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Na hora de verificar o login, como bons algoritmos de hashing garantem unicidade, basta comparar o hash armazenado com o hash resultando da senha
informada pelo usuário pra verificar se ele é quem diz ser já que apenas a senha original terá o hash compatível com o armazenado&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Além de garantirmos que mesmo que nossa base de dados caia em maos erradas ninguém terá acesso a senha original do usuário também garantimos que nós
(mantenedores da aplicaçao) também nao teremos acesso o que também é muito bom já que a maioria dos usuários utiliza a mesma senha em mais de uma
aplicaçao.&lt;/p&gt;

&lt;h4&gt;Criando um algorítmo simples de hashing&lt;/h4&gt;

&lt;p&gt;Pra entender melhor a idéia de um algorítmo desse tipo vamos implementar uma versao bem simplificada:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public static string GerarHash(string entrada)
{
    var hash = entrada.Sum(caracter =&amp;gt; (int) caracter);
    return hash.ToString();
}

GerarHash(&quot;senha&quot;);  //resultado 527
GerarHash(&quot;SENHA&quot;);  //resultado 367
GerarHash(&quot;ddddM2&quot;); //resultado 527
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Podemos perceber algumas coisas neste método:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mesmo inserindo uma entrada com o mesmo significado em portugûes (&quot;senha&quot; e &quot;SENHA&quot;) obtemos dois hashes diferentes, o que é desejável, pois tratando-se de
senhas, diferenciar maíusculas e mínusculas é uma maneira de gerar senhas mais complexas e difíceis de se adivinhar&lt;/li&gt;
&lt;li&gt;Este algoritmo garante unicidade apenas em um pequeno grupo de entradas já que tanto &quot;senha&quot; quanto &quot;ddddM2&quot; geraram o mesmo resultado.
Isto acontece, pois o algorítmo é muito simples e apenas soma o valor &lt;a href=&quot;http://www.asciitable.com/&quot;&gt;ASCIÎ&lt;/a&gt; de cada um dos caracteres da sequência de entrada&lt;/li&gt;
&lt;li&gt;Ainda assim, podemos perceber também que é virtualmente impossível, a partir do hash, descobrir com certeza qual entrada originou o hash
já que executamos uma sequência matemática que nos permite obter o mesmo resultado com mais de um input diferente.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Como vocês já devem ter concluído este nao é um algoritmo de hashing que devemos usar caso nosso objetivo seja garantir a segurança de nossa aplicaçao
já que colisoes sao muito frequentes.&lt;/p&gt;

&lt;p&gt;Partindo dai é que surgiu o MD5, um dos algorítmos mais utilizados hoje em dia pra geraçao de hashes. Em .NET ele
está disponível nativamente por meio da classe MD5 existente no namespace System.Security.Criptography. Um exemplo de uso pode ser encontrado na
&lt;a href=&quot;http://msdn.microsoft.com/pt-br/library/system.security.cryptography.md5.aspx&quot;&gt;página oficial de documentaçao no MSDN&lt;/a&gt; e o &lt;a href=&quot;http://en.wikipedia.org/wiki/MD5&quot;&gt;pseudo código e algumas
implementaçoes simples na Wikipedia&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Apesar de MD5 ser um bom algorítmo ele já nao é mais considerado seguro e pode ser quebrado facilmente. Contudo existem outras maneiras de mesmo
com MD5 garantir que as senhas de seus usuários estejam seguras e é sobre isso que vou falar no próximo post.&lt;/p&gt;

&lt;p&gt;Até lá!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Como armazenar senhas de forma segura em sua aplicaçao - Parte 1</title>
   <link href="http://blog.tucaz.net/2012/11/02/como-armazenar-senhas-de-forma-segura-em-sua-aplicacao-parte-1"/>
   <updated>2012-11-02T16:00:00+00:00</updated>
   <id>http://blog.tucaz.net/2012/11/02/como-armazenar-senhas-de-forma-segura-em-sua-aplicacao-parte-1</id>
   <content type="html">&lt;p&gt;Esse é um assunto básico e relativamente simples no contexto que vou apresentar. No entanto é algo largamente negligenciado
por muitos sites e aplicaçoes que construimos e consumimos todo dia. Talvez pela aparente simplicidade.&lt;/p&gt;

&lt;p&gt;Armazenar adequadamente as senhas dos nossos usuários é  um dos muitos aspectos que compoe a segurança de nossas aplicaçoes
e com poucas horas, ou até minutos, de estudo sobre o assunto é possível faze-lo de maneira bastante satisfatória.&lt;/p&gt;

&lt;p&gt;Portanto, se você nao quiser fazer um papelao como o &lt;a href=&quot;http://arstechnica.com/security/2012/06/8-million-leaked-passwords-connected-to-linkedin/&quot;&gt;LinkedIn, que armazenava suas senhas em plaintext&lt;/a&gt;
 quando foi hackeado ou como o próprio &lt;a href=&quot;http://news.cnet.com/8301-1009_3-57471178-83/yahoos-password-leak-what-you-need-to-know-faq/&quot;&gt;Yahoo que também nao utilizava melhores praticas&lt;/a&gt;
 é fundamental levar este assunto a sério.&lt;/p&gt;

&lt;h4&gt;Conceitos Básicos&lt;/h4&gt;

&lt;p&gt;A idéia por trás do armazenamento seguro de senhas é garantir que mesmo que alguém nao autorizado tenha acesso a seu banco de dados
nao irá conseguir tirar proveito dos dados que acessou.&lt;/p&gt;

&lt;p&gt;A fim de atingir esse objetivo a prática mais utilizada (se nao única) é a de criptografia. De acordo com a definiçao do &lt;a href=&quot;http://pt.wikipedia.org/wiki/Criptografia&quot;&gt;Wikipedia&lt;/a&gt;
&lt;em&gt;criptografia&lt;/em&gt; significa:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;O estudo dos princípios e técnicas pelas quais a informaçao pode ser transformada da sua forma original
para outra ilegível, de forma que possa ser conhecida apenas por seu destinatário&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Em termos práticos, criptografar uma informaçao significa transformá-la, por meio de um algorítmo, em qualquer outra informacao
 diferente da original tornando possível a transmissao ou armazenamento de maneira segura.&lt;/p&gt;

&lt;p&gt;Utilizamos criptografia reversível como &lt;a href=&quot;http://pt.wikipedia.org/wiki/3DES&quot;&gt;3DES&lt;/a&gt; ou &lt;a href=&quot;http://pt.wikipedia.org/wiki/AES&quot;&gt;AES&lt;/a&gt;
em cenários onde recuperar a informaçao original é fundamental, como no caso de armazenamento de informaçoes confidenciais
 como por exemplo números de cartoes de crédito &lt;strong&gt;[1]&lt;/strong&gt;.
Sem que o número do cartao de crédito do cliente seja recuperado é impossível efetuar uma cobranca.&lt;/p&gt;

&lt;p&gt;Um ponto importante a respeito de criptografia reversível é que a informaçao resultante do processo tem um tamanho
variável e geralmente próximo do tamanho da informaçao original portanto uma entrada de dados com tamanho de 3mb, por exemplo,
teria uma saída criptografada de aproximadamente 3mb, também.&lt;/p&gt;

&lt;h4&gt;Hashing&lt;/h4&gt;

&lt;p&gt;Contudo, em nosso cenário de armazenamento de senhas, nao estamos realmente interessados em conhecer a informaçao original (a senha do usuário),
mas sim em garantir que ele tenha digitado-a corretamente quando quiser acessar nossa aplicaçao.&lt;/p&gt;

&lt;p&gt;Ai entra um outro tipo de algoritmo criptográfico chamado de hashing.&lt;/p&gt;

&lt;p&gt;Funçoes de hashing recebem uma entrada de dados de tamanho variável e através de um algoritmo fornecem uma saída de dados única e
com tamanho fixo e irreversível nao importando o tamanho da entrada. Tomando &lt;a href=&quot;http://pt.wikipedia.org/wiki/MD5&quot;&gt;MD5&lt;/a&gt; como exemplo,
uma entrada de dados de 100kb ou 3mb iriam produzir uma saída única e diferente para cada uma das entradas de dados com um tamanho
de fixo 128 bits.&lt;/p&gt;

&lt;p&gt;A unicidade da saída de dados é garantida até certo ponto e varia de acordo com o algoritmo utilizado e a entrada de dados
passada para a funçao. No entanto as chances de colisao (mais de uma entrada mapear para a mesma saida de dados) sao pequenas o
suficiente para ignorarmos na maioria dos casos. Ainda no caso de MD5, a primeira colisao apareceria depois de cerca de 2e64
hashes gerados.&lt;/p&gt;

&lt;h4&gt;Conclusao&lt;/h4&gt;

&lt;p&gt;Portanto, em nosso cenário a melhor saída é a utilizaçao de uma funçao de hashing ao invés de criptografia. Ainda assim, existem
outros cuidados que devemos tomar no uso de funcoes de hashing e é sobre isso que falarei no próximo post quando mostrarei como
aplicar tais funçoes no armazenamento e validaçao da senha de um usuário.&lt;/p&gt;

&lt;p&gt;Até lá :)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[1]&lt;/strong&gt; - Armazenar cartoes de crédito de seus clientes nao é uma boa idéia. Quando devemos fazer a cobrança apenas uma vez normalmente
nao armazenamos esse número, mas no caso de cobranças recorrentes este é um mal necessário e existem outras regras além de
criptografia pra garantir que este processo seja seguro.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Validando domínio de maneira simples em C#</title>
   <link href="http://blog.tucaz.net/2012/10/25/validando-dominio-de-maneira-simples-em-CSharp"/>
   <updated>2012-10-25T22:00:00+00:00</updated>
   <id>http://blog.tucaz.net/2012/10/25/validando-dominio-de-maneira-simples-em-CSharp</id>
   <content type="html">&lt;p&gt;Faz algum tempo que nao começo um projeto novo onde eu tenha a oportunidade de pensar em todos detalhes envolvidos na arquitetura do sistema. Esses dias comecei um novo projeto e a oportunidade apareceu. Junto com ela veio também aquele sentimento de perfeccionismo que nos &lt;em&gt;obriga&lt;/em&gt; a achar a melhor maneira possível pra resolver um problema e muitas vezes acaba fazendo com que muito tempo seja perdido e nenhuma soluçao seja encontrada já que somos totalmente livres pra fazer o que quisermos.&lt;/p&gt;

&lt;p&gt;Precisava pensar em como fazer pequenas validaçoes em meus objetos de domínio pra garantir que nao fiquem em um estado inválido.&lt;/p&gt;

&lt;p&gt;Dessa vez decidi que nao ia deixar isso acontecer e tomei a decisao mais pragmática possivel: vou achar algo bacana &lt;em&gt;pronto&lt;/em&gt; e por pra rodar. Rapidinho achei a biblioteca &lt;a href=&quot;http://fluentvalidation.codeplex.com&quot;&gt;FluentValidation&lt;/a&gt; que de acordo com o próprio autor faz o que eu precisava.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;A small validation library for .NET that uses a fluent interface and lambda expressions for building validation rules for your business objects - Fluent Validation&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;E um exemplo básico de uso retirado da documentaçao:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;using FluentValidation;

public class CustomerValidator: AbstractValidator&amp;lt;Customer&amp;gt; {
  public CustomerValidator() {
    RuleFor(customer =&amp;gt; customer.Surname).NotEmpty();
    RuleFor(customer =&amp;gt; customer.Forename).NotEmpty().WithMessage(&quot;Please specify a first name&quot;);
    RuleFor(customer =&amp;gt; customer.Company).NotNull();
    RuleFor(customer =&amp;gt; customer.Discount).NotEqual(0).When(customer =&amp;gt; customer.HasDiscount);
    RuleFor(customer =&amp;gt; customer.Address).Length(20, 250);
    RuleFor(customer =&amp;gt; customer.Postcode).Must(BeAValidPostcode).WithMessage(&quot;Please specify a valid postcode&quot;);
  }

  private bool BeAValidPostcode(string postcode) {
    // custom postcode validating logic goes here
  }
}

Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);

bool validationSucceeded = results.IsValid;
IList&amp;lt;ValidationFailure&amp;gt; failures = results.Errors;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;No entanto, seguindo a idéia de manter as coisas simples, construir uma nova classe só pra colocar minhas validaçoes me pareceu demais. Pra nao perder mais tempo e resolver de vez resolvi implementar minha soluçao.&lt;/p&gt;

&lt;p&gt;Primeiro aos testes:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[TestFixture]
public class NovoUsuarioTest
{
    [Test, TestCaseSource(&quot;Cenarios&quot;)]
    public string validacoes_basicas(NovoUsuario usuario)
    {
        var erros = new List&amp;lt;string&amp;gt;();
        var valido = usuario.IsValid();

        return usuario.Errors.First();
    }


    private static IEnumerable Cenarios()
    {
        yield return new TestCaseData(new NovoUsuario() { Senha = &quot;abc&quot;, ConfirmacaoSenha = &quot;abc&quot; })
            .SetName(&quot;Email obrigatório&quot;)
            .Returns(Mensagens.Usuario.EmailEhObrigatorio);

        yield return new TestCaseData(new NovoUsuario() { Email = &quot;abc@gmail.com&quot;, ConfirmacaoSenha = &quot;abc&quot; })
            .SetName(&quot;Senha obrigatória&quot;)
            .Returns(Mensagens.Usuario.SenhaEhObrigatoria);

        yield return new TestCaseData(new NovoUsuario() { Email = &quot;abc@gmail.com&quot;, Senha = &quot;abc&quot; })
            .SetName(&quot;Confirmaçao de senha obrigatória&quot;)
            .Returns(Mensagens.Usuario.ConfirmacaoSenhaEhObrigatoria);

        yield return new TestCaseData(new NovoUsuario() { Email = &quot;abc@gmail.com&quot;, Senha = &quot;abc1&quot;, ConfirmacaoSenha = &quot;abc&quot; })
            .SetName(&quot;Senha e confirmaçao devem ser iguais&quot;)
            .Returns(Mensagens.Usuario.SenhaEConfirmacaoDevemSerIguais);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Usei TestCases do NUnit pra descrever os 4 cenarios que queria testar. Na sequencia desenhei a biblioteca pensando em como gostaria de consumi-la:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public class NovoUsuario : ValidationBase&amp;lt;NovoUsuario&amp;gt;
{
    public string Id { get; set; }
    public string Email { get; set; }
    public string Senha { get; set; }
    public string ConfirmacaoSenha { get; set; }

    public override bool IsValid()
    {
        Require(x =&amp;gt; x.Email, Mensagens.Usuario.EmailEhObrigatorio);
        Require(x =&amp;gt; x.Senha, Mensagens.Usuario.SenhaEhObrigatoria);
        Require(x =&amp;gt; x.ConfirmacaoSenha, Mensagens.Usuario.ConfirmacaoSenhaEhObrigatoria);
        Enforce(x =&amp;gt; x.Senha == x.ConfirmacaoSenha, Mensagens.Usuario.SenhaEConfirmacaoDevemSerIguais);

        return base.Errors.Count == 0;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Bem simples né? A idéia é ter apenas dois métodos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Require -&gt; Garante que uma propriedade esta preenchida&lt;/li&gt;
&lt;li&gt;Enforce -&gt; Recebe uma lambda que permite passar validaçoes mais elaboradas, mas ainda assim nao tao complicadas&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Por último, o código que fez meus testes passarem:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public abstract class ValidationBase&amp;lt;T&amp;gt; where T : ValidationBase&amp;lt;T&amp;gt;
{
    public List&amp;lt;String&amp;gt; Errors { get; private set; }

    public ValidationBase()
    {
        this.Errors = new List&amp;lt;string&amp;gt;();
    }

    protected void Require(Expression&amp;lt;Func&amp;lt;T, object&amp;gt;&amp;gt; property, string message)
    {
        var prop = property.Compile();
        var value = prop((T)this);

        var isValid = false;

        if (value == null)
            isValid = false;
        else if (value.GetType() == typeof(String))
            isValid = !String.IsNullOrWhiteSpace(value.ToString());
        else if (value.GetType() == typeof(Guid))
            isValid = (Guid)value != Guid.Empty;
        else if (value.GetType() == typeof(int))
            isValid = (int)value == 0;
        else if (value.GetType() == typeof(decimal))
            isValid = (decimal)value == 0;
        else if (value.GetType() == typeof(DateTime))
            isValid = (DateTime)value == DateTime.MinValue;         

        if (!isValid)
            this.Errors.Add(message);
    }

    protected void Enforce(Func&amp;lt;T, bool&amp;gt; validation, string message)
    {
        var isValid = false;            

        if (validation != null)
            isValid = validation.Invoke((T)this);
        else
            throw new ArgumentNullException(&quot;validation&quot;);

        if (!isValid)
            this.Errors.Add(message);
    }

    public abstract bool IsValid();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Simples, mas poderosa o suficiente pra me oferecer que eu preciso &lt;em&gt;agora&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Quando eu precisar de mais conversamos novamente sobre o assunto. :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Blog de volta e em nova plataforma</title>
   <link href="http://blog.tucaz.net/2012/10/20/blog-de-volta-e-em-nova-plataforma"/>
   <updated>2012-10-20T18:00:00+00:00</updated>
   <id>http://blog.tucaz.net/2012/10/20/blog-de-volta-e-em-nova-plataforma</id>
   <content type="html">&lt;p&gt;Depois de quase dois anos sem postar nada no blog decidi colocar ele de volta pra funcionar.&lt;/p&gt;

&lt;p&gt;Pra dar uma animada (e aprender algo novo) sai do wordpress pra uma soluçao mais manual, mas mais completa no meu ponto de vista.&lt;/p&gt;

&lt;p&gt;Agora estou usando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows Azure (de grátis!) com Ubuntu como host&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mojombo/jekyll&quot;&gt;Jekyll&lt;/a&gt; + Git para geraçao do conteúdo&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://disqus.com&quot;&gt;Disqus&lt;/a&gt; pra comentários&lt;/li&gt;
&lt;li&gt;Qualquer editor de texto (até mesmo o notepad!!!) pra escrever os posts utilizando &lt;a href=&quot;http://daringfireball.net/projects/markdown/&quot;&gt;markdown&lt;/a&gt; que é BEM egal&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Mudei também a cara dele com meu próprio layout mesmo sendo péssimo designer em favor de algo mais clean.&lt;/p&gt;

&lt;p&gt;Espero que gostem e avisem em caso de qualquer problema que eu tenha deixado passar.&lt;/p&gt;

&lt;p&gt;Até! :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Começando a aprender F# com: Ubuntu, Mono e Vim</title>
   <link href="http://blog.tucaz.net/2011/01/10/comeando-a-aprender-f-com-ubuntu-mono-e-vim"/>
   <updated>2011-01-10T21:58:47+00:00</updated>
   <id>http://blog.tucaz.net/2011/01/10/comeando-a-aprender-f-com-ubuntu-mono-e-vim</id>
   <content type="html">&lt;p&gt;Já faz algum tempo que estou meio de saco cheio de desenvolvimento comercial tradicional que a maioria de nós, desenvolvedores, está acostumado a fazer. De uma forma ou de outra, exceto em projetos excepcionais tudo é uma variação de CRUD o que é um pé no saco pra quem gosta de código. Chega uma hora que a gente começa a procurar maneiras diferentes (não necessariamente melhores) de fazer a mesma coisa só pra acabar com o tédio. Isso estava me incomodando.&lt;/p&gt;

&lt;p&gt;Há alguns meses quando este sentimento veio novamente decidi que iria tentar algo diferente. Foi ai que comecei com o combo título deste post. Uma mudança radical de ares.&lt;/p&gt;

&lt;p&gt;Não sou o primeiro e com certeza não serei o último.&lt;/p&gt;

&lt;p&gt;Apesar de trabalhar com Windows e depender dele pro meu ganha pão adotei o Ubuntu como sistema operacional padrão deixando o Windows em uma VM &lt;strong&gt;[1]&lt;/strong&gt; apenas para trabalho e comecei a estudar F# que é uma linguagem com paradigma funcional que é completamente diferente de C#, Java e parentes próximos. Não bastasse a mudança de sistema operacional e de paradigma decidi também aprender mais a respeito de shell e editores de texto pra me livrar mais ainda dos atalhos que uma IDE como o VS proporcionam e adotei o VIM como editor de texto.&lt;/p&gt;

&lt;p&gt;Nest post vou mostrar como montar um ambiente como o meu e os primeiros (primeiros mesmo, nada avançado) passos nessa estrada de aprendizado. Se tudo der certo e eu não desistir transformo numa série pra poder compartilhar meu aprendizado e com a colaboração de vocês aprender mais sobre o assunto.&lt;/p&gt;

&lt;p&gt;Tudo que estou fazendo é no Ubuntu 10.10, mas deve funcionar com uma boa parte dos *nix por ai.&lt;/p&gt;

&lt;h3&gt;Instalando F# com Mono&lt;/h3&gt;

&lt;p&gt;Provavelmente o Linux que você tem instalado já deve ter o mono instalado, portanto não precisamos nos preocupar com esta etapa. De qualquer forma, só pra garantir abra o shell (Terminal) veja se você está realmente como o Mono instalado e qual sua versão:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mono -V
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Se tudo estiver certo teremos algo parecido com isso:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Mono JIT compiler version 2.6.7 (Debian 2.6.7-3ubuntu1)
Copyright (C) 2002-2010 Novell, Inc and Contributors. www.mono-project.com
    TLS:           __thread
    GC:            Included Boehm (with typed GC and Parallel Mark)
    SIGSEGV:       altstack
    Notifications: epoll
    Architecture:  amd64
    Disabled:      none
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Caso ele não esteja instalado basta ir ao Ubuntu Software Center &lt;strong&gt;[2] &lt;/strong&gt;para instalá-lo ou &lt;a href=&quot;http://www.go-mono.com/mono-downloads/download.html&quot;&gt;baixá-lo no site oficial&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Com Mono instalado corretamente e acessível de qualquer lugar precisamos agora baixar a última versão disponível da biblioteca e compilador FSharp. Temos três opções para a instalação:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Efetuar o download do código fonte, compilá-lo e efetuar a instalação&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Baixar um &lt;a href=&quot;http://fsxplat.codeplex.com/&quot;&gt;pacote cross-platform&lt;/a&gt; que faz a instalação de tudo&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Baixar o pacote oficial compilado, efetuar a instalação e configurar as variáveis de ambiente “manualmente”&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Vamos com a terceira opção, pra ver onde vai cada coisa e como cada um dos executáveis funciona.&lt;/p&gt;

&lt;p&gt;A última versão disponível no momento deste post é a 2.0.0.0 de Novembro de 2010.&lt;/p&gt;

&lt;p&gt;Como somos usuários ninjas de Linux vamos efetuar o download via linha de comando com &lt;a href=&quot;http://www.gnu.org/software/wget/&quot;&gt;wget&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;wget http://download.microsoft.com/download/4/5/B/45BD9FBC-22BA-4B45-84B7-17D1AD0122A1/fsharp.zip
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Terminado o download, um pacote zip, extraimos todo o conteúdo pra uma pasta qualquer.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;unzip fsharp.zip
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora devemos ter todo o conteúdo do zip extraido em uma pasta chamada &lt;em&gt;FSharp-2.0.0.0&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Antes de instalar sugiro mover a pasta com o conteúdo extraido do zip para um local mais apropriado para este tipo de arquivos já que é a partir desta pasta que iremos fazer referência mais pra frente aos executáveis do FSharp. Eu utilizo &lt;em&gt;/usr/lib/ &lt;/em&gt;&lt;strong&gt;[3]&lt;/strong&gt;. Além de mover, vamos renomear a pasta de destino apenas para fsharp a fim de deixar tudo mais simples.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo mv FSharp-2.0.0.0/ /usr/lib/fsharp/
cd /usr/lib/fsharp/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora para instalar basta executar:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd fsharp
sudo sh install-mono.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Este comando provavelmente retornará um erro indicando que a DLL não pôde ser adicionada ao GAC por conta de seu strongname. O que acontece é que a versão compilada que baixamos está com uma assinatura para o .NET Framework do Windows então antes de conseguir instalar o FSharp no Mono devemos baixar um &lt;a href=&quot;https://github.com/mono/mono/raw/master/mcs/class/mono.snk&quot;&gt;arquivo.snk&lt;/a&gt; próprio para ele e ai sim executar novamente o setup.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;wget -O mono.snk https://github.com/mono/mono/raw/master/mcs/class/mono.snk --no-check-certificate
sudo sh install-mono.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dando tudo certo, devemos receber uma mensagem de sucesso:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-- Resigning FSharp.Core.dll with mono.snk
Assembly bin/FSharp.Core.dll signed.
-- Installing FSharp DLLS into the GAC
Installed bin/FSharp.Core.dll into the gac (/usr/lib/mono/gac)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pra testar se tudo der certo, ainda de dentro do diretório onde instalamos o FSharp, podemos executar:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mono bin\fsi.exe
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Se tudo estiver OK vamos entrar no FSharp Interactive que é uma console &lt;a href=&quot;http://en.wikipedia.org/wiki/Read-eval-print_loop&quot;&gt;REPL&lt;/a&gt; pra F# muito legal:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Microsoft (R) F# 2.0 Interactive build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

For help type #help;;

&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Podemos também fazer o tradicional “Hello World”:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; printfn &quot;Hello World!&quot;;;
Hello World!
val it : unit = ()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Pronto! &lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tecnicamente temos o FSharp instalado com sucesso e pronto para usar. No entanto, tanto o compilador (fsc.exe) e o REPL (fsi.exe) não fazem parte do PATH configurado em nosso Linux. Desta forma, ele está apenas acessível a partir do diretório onde está localizado.&lt;/p&gt;

&lt;p&gt;Pra resolver isso vamos baixar o pacote de ferramentas adicionais para FSharp que irá nos prover algums aliases que permitirão o acesso as ferramentas a partir de qualquer diretório.&lt;/p&gt;

&lt;p&gt;Dessa vez, como este pacote está hospedado no Codeplex, temos que efetuar o download do pacote “Additional scripts and tools only (.tgz archive)” manualmente localizado em &lt;a href=&quot;http://fsxplat.codeplex.com/releases/view/55463&quot;&gt;http://fsxplat.codeplex.com/releases/view/55463&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Feito o download podemos voltar ao nosso querido shell e instalar o pacote de bonus.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd ~/Downloads
mkdir fsharp-bonus
tar -xvzf fsharp-bonus.tgz -C fsharp-bonus
cd fsharp-bonus
sudo bash install-bonus.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Este script de instalação espera que as DLLs do FSharp estejam na pasta &lt;em&gt;/usr/lib/fsharp. &lt;/em&gt;No entanto, no nosso caso elas se encontram em &lt;em&gt;/usr/lib/fsharp/bin&lt;/em&gt;, portanto caso o script solicite esta informação, fica fácil de prover. :)&lt;/p&gt;

&lt;p&gt;Feito isso é hora de testar e já podemos chamar &lt;em&gt;fsharpi&lt;/em&gt; de qualquer lugar no shell:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;tucaz@tucaz-nb:~$ fsharpi

Microsoft (R) F# 2.0 Interactive build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

For help type #help;;

&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora podemos chamar tanto o REPL quanto o compilador a partir de qualquer diretório já que os alias foram devidamente criados e adicionados ao PATH.&lt;/p&gt;

&lt;h3&gt;Primeiro Hello World com Vim&lt;/h3&gt;

&lt;p&gt;Agora que temos todo o ambiente instalado (o que na minha opinião é um dos primeiros grandes obstáculos no aprendizado de uma nova linguagem) podemos fazer nosso primeiro Hello World e gerar uma DLL .NET com F#!&lt;/p&gt;

&lt;p&gt;Primeiro, vamos definir um diretório de trabalho onde vamos colocar todos nossos projetos. Eu costumo usar um diretório chamado &lt;em&gt;Workspace&lt;/em&gt; dentro do meu profile:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd ~
mkdir Workspace
cd Workspace
mkdir HelloWorldFSharp
cd HelloWorldFSharp
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Criado o diretório, criamos também nosso primeiro arquivo com código fonte FSharp utilizando o Vim &lt;strong&gt;[4]&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;vim HelloWorldFSharp.fs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Isso cria um arquivo chamado HelloWorldFSharp.fs (assumindo que um não exista ou abre para edição caso ele exista) e o abre no nosso editor de texto funcionando dentro de um terminal shell, que pra um usuário Windows (que não tenha usado o Edit do DOS) é algo geralmente desconhecido.&lt;/p&gt;

&lt;p&gt;O Vim (como o Vi) oferece basicamente dois modos de trabalho: modo de comando e edição/inserção de texto. Quando abrimos um arquivo, por padrão temos o modo de comando onde o texto digitado não é o que vai para o arquivo, mas sim interpretado como um comando (a seguir).&lt;/p&gt;

&lt;p&gt;Para entrar no modo de edição de texto digitamos &lt;em&gt;i&lt;/em&gt; ou apertamos a tecla &lt;em&gt;insert&lt;/em&gt; do teclado. Note que o texto --INSERT-- irá aparecer no canto esquerdo inferior da tela indicando que agora estamos no modo de inserção de texto. Esta área é destinada aos comandos e mensagens do editor.&lt;/p&gt;

&lt;p&gt;Estando no modo de edição vamos escrever nosso Hello World!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#light 

printfn &quot;Hello World!&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Com “todo” nosso código completo vamos sair do modo de edição (e voltar ao modo comando) apertando &lt;em&gt;ESC. &lt;/em&gt;Para salvar e sair digitamos o comando :wq (write and quit) e enter retornando ao terminal.&lt;/p&gt;

&lt;p&gt;Pra compilar nosso código fonte e gerar o primeiro .exe no Linux:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;fsharpc HelloWorldFSharp.fs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Obtendo a resposta:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Microsoft (R) F# 2.0 Compiler build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.
tucaz@tucaz-nb:~/Workspace/HelloWorldFSharp$ ls
HelloWorldFSharp.exe  HelloWorldFSharp.fs
tucaz@tucaz-nb:~/Workspace/HelloWorldFSharp$ 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E por último, vamos executar nosso primeiro programa .NET em Linux:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mono HelloWorldFSharp.exe
Hello World!
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Fim!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Neste post vimos como instalar Mono/F# no Linux e como criar nosso primeiro programa Hello World em F# utilizando o Vim. No próximo, quero começar a falar mais a respeito de F# e Vim e deixar para trás&lt;strong&gt; &lt;/strong&gt;questões de ambiente.&lt;/p&gt;

&lt;p&gt;Até lá!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[1] – &lt;/strong&gt;Estou utilizando Ubuntu 10.10 AMD64 rodando em um notebook Core i7 (2.66ghz) com 6gb de memória RAM sendo que 2gb ficam exclusivos para VM rodando no Virtual Box. A performance é ótima!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[2] – &lt;/strong&gt;Menu Principal –&gt; Applications –&gt; Ubuntu Software Center&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[3] –&lt;/strong&gt; Alguma outra sugestão?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[4]&lt;/strong&gt; – Se o Vim não estiver instalado, basta executar “sudo apt-get install vim” para instalá-lo&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Lendo e consumindo XML com dynamic em C# 4</title>
   <link href="http://blog.tucaz.net/2010/11/18/lendo-e-consumindo-xml-com-dynamic-em-c-4"/>
   <updated>2010-11-18T20:57:30+00:00</updated>
   <id>http://blog.tucaz.net/2010/11/18/lendo-e-consumindo-xml-com-dynamic-em-c-4</id>
   <content type="html">&lt;p&gt;Sei que faz tempo que não posto então aqui vai um post rápido, mas com conteúdo (espero que vocês vejam dessa forma também). Finalmente comecei a trabalhar efetivamente com C# 4 e por coincidência (ou não) já precisei de dynamic objects pra resolver um problema.&lt;/p&gt;

&lt;p&gt;Meu sistema recebe como entrada alguns arquivos XML para serem processados e transformados em outros objetos posteriormente. XML é um saco e é definitivamente uma das coisas que eu mais odeio em desenvolvimento de software. Tudo com XML é trabalhoso. Sendo assim criei uma pequena Lib que transforma XML em objetos dinamicos pra eliminar a necessidade de lidar com nós e atributos diretamentes e também permitir futuras implementacões.&lt;/p&gt;

&lt;p&gt;Com XmlToObjectParser é possível:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&amp;gt;
&amp;lt;catalog&amp;gt;
  &amp;lt;cd country=&quot;USA&quot;&amp;gt;
    &amp;lt;title&amp;gt;Empire Burlesque&amp;lt;/title&amp;gt;
    &amp;lt;artist&amp;gt;Bob Dylan&amp;lt;/artist&amp;gt;
    &amp;lt;price&amp;gt;10.90&amp;lt;/price&amp;gt;
  &amp;lt;/cd&amp;gt;
  &amp;lt;cd country=&quot;UK&quot;&amp;gt;
    &amp;lt;title&amp;gt;Hide your heart&amp;lt;/title&amp;gt;
    &amp;lt;artist&amp;gt;Bonnie Tyler&amp;lt;/artist&amp;gt;
    &amp;lt;price&amp;gt;10.0&amp;lt;/price&amp;gt;
  &amp;lt;/cd&amp;gt;
  &amp;lt;cd country=&quot;USA&quot;&amp;gt;
    &amp;lt;title&amp;gt;Greatest Hits&amp;lt;/title&amp;gt;
    &amp;lt;artist&amp;gt;Dolly Parton&amp;lt;/artist&amp;gt;
    &amp;lt;price&amp;gt;9.90&amp;lt;/price&amp;gt;
  &amp;lt;/cd&amp;gt;
&amp;lt;/catalog&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var numberOfCDsinCatalog = catalog.catalog.cd.Count; //Retorna 3
var titleFromUKCD = catalog.catalog.cd[1].title; // Retorna &quot;Hide your heart&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Bem mais legível e prático de usar, na minha opinião.&lt;/p&gt;

&lt;p&gt;O &lt;a href=&quot;https://github.com/tucaz/XmlToObjectParser&quot;&gt;projeto&lt;/a&gt; e a &lt;a href=&quot;https://github.com/downloads/tucaz/XmlToObjectParser/XmlToObjectParser-1.0.zip&quot;&gt;DLL compilada&lt;/a&gt; estão no GitHub assim como a &lt;a href=&quot;https://github.com/tucaz/XmlToObjectParser/wiki/Getting-Started&quot;&gt;documentacão e informacões adicionais&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Enjoy! :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Performance: NHibernate versus ADO.NET</title>
   <link href="http://blog.tucaz.net/2010/08/31/performance-nhibernate-versus-ado-net"/>
   <updated>2010-08-31T22:18:21+00:00</updated>
   <id>http://blog.tucaz.net/2010/08/31/performance-nhibernate-versus-ado-net</id>
   <content type="html">&lt;h3 style=&quot;color: red;&quot;&gt;&lt;em&gt;Disclaimer&lt;/em&gt;&lt;/h3&gt;


&lt;p&gt;&lt;em style=&quot;color: red;&quot;&gt;
Os testes neste post apresentados não representam uma amostra exata ou fidedigna que represente uma condição real de acesso a dados de uma aplicação a fim de comparar a performance das duas tecnologias. A idéia é apenas mostrar alguns dados e exemplos com o objetivo de dismistificar a idéia de que ORM é uma ferramenta lenta e estes testes são apenas um exercício.&lt;/p&gt;

&lt;p&gt;Sou usuário de NHibernate e defendo o uso de ORM’s portanto as conclusões apresentadas com certeza não são as mais imparciais possíveis.
&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Motivado &lt;a href=&quot;http://groups.google.com/group/dotnetarchitects/browse_thread/thread/dc01630511ec34ec&quot;&gt;por esta thread no DNA hoje&lt;/a&gt; decidi fazer alguns testes de perfomance pra comparar acesso a dados utilizando ADO.NET nativo (queries AdHoc e Stored Procedures) versus NHibernate.&lt;/p&gt;

&lt;p&gt;Sempre rolam diversas discussões a respeito do assunto e a conclusão que geralmente se chega é de que qualquer ORM vai ser mais lento do que uma chamada nativa. É uma conclusão óbvia já que utilizar um ORM é adicionar uma camada de abstração a mais dentro da nossa aplicação. No entanto, até então eu nunca havia efetuado nenhuma medição pra ver qual a diferença de performance.&lt;/p&gt;

&lt;p&gt;Todos os testes foram executados na minha máquina com código compilado em modo Release com banco de dados Sql Server 2008 também local.&lt;/p&gt;

&lt;p&gt;Vamos aos testes.&lt;/p&gt;

&lt;h1&gt;Cenário de testes&lt;/h1&gt;

&lt;p&gt;Criei uma tabela (Product) e populei com cerca de 500 registros vindos do AdventureWorks (banco de dados exemplo do SqlServer).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/post-images/2010/08/image.png&quot;&gt;&lt;img src=&quot;/assets/post-images/2010/08/image_thumb.png&quot; alt=&quot;Modelo de Dados&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contra essa tabela executei duas categorias de testes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Carregar todos os registros da tabela em um List&amp;lt;&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Carregar apenas um registro&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Pra ficar mais interessante fiz algumas variações dos testes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Query AdHoc/Inline&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Query AdHoc/Inline com hidratação&lt;strong&gt;[1]&lt;/strong&gt; via reflection&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Query utilizando uma procedure&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;NHibernate com LINQ&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;NHibernate com HQL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;NHibernate com Criteria&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nhibernate com Projections&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Como rodando uma única vez não foi possível obter dados suficientes, executei cada teste dentro de um loop com 1000 (numberOfIterations = 1000) iterações que resultou no código abaixo:&lt;/p&gt;

&lt;p&gt;Método principal:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;static void Main(string[] args)
{
    for (int i = 1; i &amp;lt;= 3; i++)
    {
        Console.WriteLine(&quot;Test &quot; + i.ToString());
        Console.WriteLine(&quot;======================&quot;);

        SqlAdHocAllProducts();
        SqlAdHocAllProductsWithReflection();
        SProcAllProducts();
        NHibernateAllProductsWithLinq();
        NHibernateAllProductsWithHql();
        NHibernateAllProductsWithCriteria();
        NHibernateAllProductsWithProjections();

        SqlAdHocOneProduct();
        SqlAdHocOneProductWithReflection();
        SProcOneProduct();
        NHibernateOneProduct();

        Console.WriteLine();
    }

    Console.ReadLine();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Um dos métodos usando Sql AdHoc e outro usando NHibernate:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;private static void SqlAdHocAllProducts()
{
    List&amp;lt;Product&amp;gt; allProducts = null;

    var connectionString = &quot;Data Source=(local);Integrated Security=SSPI;Database=TDC2010;&quot;;
    var select = @&quot;SELECT P.Id, P.Description, P.Name, P.Price FROM dbo.Product P&quot;;

    var connection = new SqlConnection(connectionString);
    connection.Open();

    Stopwatch watch = new Stopwatch();
    watch.Start();

    for (int i = 0; i &amp;lt; numberOfIterations; i++)
    {
        allProducts = new List&amp;lt;Product&amp;gt;();
        var command = new SqlCommand(select, connection);
        var reader = command.ExecuteReader();

        while (reader.Read())
        {
            allProducts.Add(new Product()
                {

                    Id = Convert.ToInt32(reader[&quot;Id&quot;]),
                    Name = Convert.ToString(reader[&quot;Name&quot;]),
                    Description = Convert.ToString(reader[&quot;Description&quot;]),
                    Price = Convert.ToDecimal(reader[&quot;price&quot;])
                });
        }

        reader.Close();
    }

    watch.Stop();

    connection.Close();
    connection.Dispose();

    Console.WriteLine(
        &quot;Loading &quot; + allProducts.Count + &quot; Products with Sql AdHoc took &quot; + watch.ElapsedMilliseconds + &quot; ms&quot;);
}

private static void NHibernateAllProductsWithLinq()
{
    List&amp;lt;Product&amp;gt; allProducts = null;

    var session = CreateForSqlServer().OpenSession();

    Stopwatch watch = new Stopwatch();
    watch.Start();

    for (int i = 0; i &amp;lt; numberOfIterations; i++)
    {
        allProducts = session.Linq&amp;lt;Product&amp;gt;().ToList();
    }

    watch.Stop();

    session.Close();

    Console.WriteLine(
        &quot;Loading &quot; + allProducts.Count + &quot; Products with NHibernate took &quot; + watch.ElapsedMilliseconds + &quot; ms&quot;);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Vou omitir o restante dos métodos para evitar duplicações já que eles são apenas variações dos dois exemplos acima.&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;Resultado Geral&lt;/h1&gt;

&lt;p&gt;&lt;a href=&quot;/assets/post-images/2010/08/image1.png&quot;&gt;&lt;img src=&quot;/assets/post-images/2010/08/image_thumb1.png&quot; alt=&quot;Resultados dos Testes&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;Análise dos Resultados&lt;/h1&gt;

&lt;h3&gt;Stored Procedures versus Queries AdHoc/Inline [500 registros]&lt;/h3&gt;

&lt;p&gt;A diferença entre o uso de stored procedures e queries AdHoc é praticamente inexistente. A diferença média medida foi de &lt;strong&gt;menos de 1%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Isso acontece, pois não existe complexidade suficiente neste tipo de query para que a armazenagem do plano de execução no banco de dados faça diferença.&lt;/p&gt;

&lt;p&gt;Portanto, na grande maioria dos cenários Stored Procedures não são necessárias.&lt;/p&gt;

&lt;h3&gt;NHibernate versus NHibernate [500 registros]&lt;/h3&gt;

&lt;p&gt;Na média, todas as variações de consulta utilizando NHibernate também tiveram &lt;strong&gt;mais ou menos o mesmo resultado (~1500ms)&lt;/strong&gt; com exceção do uso de &lt;strong&gt;Projections&lt;/strong&gt;, que levou o dobro&lt;strong&gt; (~3000ms)&lt;/strong&gt; do tempo.&lt;/p&gt;

&lt;p&gt;Não conheço o NHibernate suficiente pra afirmar com 100% de certeza o motivo, mas acredito que seja pelo fato de esse tipo de query retornar Arrays bidimensionais que são criados e redimensionados em runtime até que todos os itens possam ser acomodados.&lt;/p&gt;

&lt;h3&gt;NHibernate versus ADO.NET [500 registros]&lt;/h3&gt;

&lt;p&gt;Este e o comparativo mais importante. Carregando (e hidratando) 500 registros o ADO.NET é cerca de &lt;strong&gt;30% mais&lt;/strong&gt; rapido do que o NHibernate. A causa dessa discrepância é uma só e se chama reflection.&lt;/p&gt;

&lt;p&gt;Apesar de todas as otimizações o NHibernate utiliza-se de reflection para efetuar a hidratação&lt;strong&gt;[1] &lt;/strong&gt;de todos os objetos e é dai que vem a queda de performance que fica clara quando executamos queries AdHoc usando hidratação via reflection conforme o código abaixo.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;private static void SqlAdHocAllProductsWithReflection()
{
    List&amp;lt;Product&amp;gt; allProducts = null;

    var connectionString = &quot;Data Source=(local);Integrated Security=SSPI;Database=TDC2010;&quot;;
    var select = @&quot;SELECT P.Id, P.Description, P.Name, P.Price FROM dbo.Product P&quot;;

    var connection = new SqlConnection(connectionString);
    connection.Open();

    Stopwatch watch = new Stopwatch();
    watch.Start();

    for (int i = 0; i &amp;lt; numberOfIterations; i++)
    {
        allProducts = new List&amp;lt;Product&amp;gt;();
        var command = new SqlCommand(select, connection);
        var reader = command.ExecuteReader();

        while (reader.Read())
        {
            var newProduct = Activator.CreateInstance&amp;lt;Product&amp;gt;();
            SetProperty(newProduct, &quot;Id&quot;, Convert.ToInt32(reader[&quot;Id&quot;]));
            SetProperty(newProduct, &quot;Description&quot;, Convert.ToString(reader[&quot;Description&quot;]));
            SetProperty(newProduct, &quot;Name&quot;, Convert.ToString(reader[&quot;Name&quot;]));
            SetProperty(newProduct, &quot;Price&quot;, Convert.ToDecimal(reader[&quot;Price&quot;]));
            allProducts.Add(newProduct);
        }

        reader.Close();
    }

    watch.Stop();

    connection.Close();
    connection.Dispose();

    Console.WriteLine(
&quot;Loading &quot; + allProducts.Count + &quot; Products with Sql AdHoc and Reflection took &quot; + watch.ElapsedMilliseconds + &quot; ms&quot;);
}

private static void SetProperty(object instance, string property, object val)
{
    Type t = instance.GetType();
    var prop = t.GetProperty(property, BindingFlags.Instance | BindingFlags.Public);
    prop.SetValue(instance, val, null);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Este código quando executado demora cerca de &lt;strong&gt;6000ms, ou 4 vezes mais&lt;/strong&gt;, do que o código executado pelo NHibernate.&lt;/p&gt;

&lt;p&gt;Mas por que a diferença não é de 30%? Porque o NHibernate possui otimizações quanto ao modo de hidratar um objeto via reflection. No meu código acima podemos ver, por exemplo, que toda vez que chamo o método SetProperty o Type da propriedade a ser refletida ainda não está criado. Provavelmente o NHibernate deve manter cache deste tipo de informação (e de outras) a fim de otimizar o processo de hidratação das entidades.&lt;/p&gt;

&lt;h3&gt;Stored Procedures versus Queries AdHoc/Inline [1 registro]&lt;/h3&gt;

&lt;p&gt;Mesmo resultado do cenário onde 500 registros são carregados. Não há diferença.&lt;/p&gt;

&lt;h3&gt;NHibernate versus ADO.NET [1 registro]&lt;/h3&gt;

&lt;p&gt;Aqui a diferença é gigantesca sendo de &lt;strong&gt;quase 4000% a favor do NHibernate. &lt;/strong&gt;Isso acontece, pois o NHibernate implementa cache nível 1 nativamente então dentro de uma mesma ISession o objeto é carregado apenas uma vez enquanto com ADO.NET é necessário ir ao banco e carregar o objeto diversas vezes.&lt;/p&gt;

&lt;h1&gt;Conclusões&lt;/h1&gt;

&lt;p&gt;Olhando para os números apenas, em casos onde diversos registros precisam ser carregados, ADO.NET nativo oferece uma performance superior e parece ser a escolha óbvia. No entanto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Os testes com NHibernate foram executados utilizandos exemplos simples e sem qualquer tipo de otimização.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;NHibernate oferece nativamente cache de resultados de queries e cache nível 2 que se utilizados iriam exibir um resultado bem próximo ao cenário “&lt;em&gt;NHibernate versus ADO.NET [1 registro]” &lt;/em&gt;onde o NHibernate é 4 vezes mais rápido.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ADO.NET oferece um custo de desenvolvimento e manutenção altissimo e este custo torna-se ainda maior se utilizado com Stored Procedures que transformam o cenário em algo totalmente caótico de gerenciar devido a dificuldade de manter a rastreabilidade desses diabinhos malignos.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;No caso de sistemas &lt;a href=&quot;http://pt.wikipedia.org/wiki/OLTP&quot;&gt;OLTP&lt;/a&gt; onde as transações carregam unidades individuais e/ou pequenas coleções de entidades por sessão, NHibernate não só é mais rápido como também oferece muito mais flexibilidade pra lidar com praticamente todos os cenários existentes. &lt;a href=&quot;http://ayende.com/Blog/archive/2006/05/12/25ReasonsNotToWriteYourOwnObjectRelationalMapper.aspx&quot;&gt;Este post do Ayende&lt;/a&gt; mostra 25 funcionalidades importantes (cache, gerenciamento de concorrência, etc) que você vai precisar quando estiver lidando com dados e que custariam muito caro (tempo e complexidade) caso você queira escreve-las “na mão”.&lt;/p&gt;

&lt;p&gt;Em cenários de aplicações de internet onde o número de leituras é infinitamente superior ao número de escritas no banco de dados deve se utilizar cache no front end (IIS), portanto o tempo que se leva pra montar uma página é irrelevante. Mesmo que você carregasse os dados de um servidor remoto via conexão discada não faria diferença uma vez que os dados estivessem em cache.&lt;/p&gt;

&lt;p&gt;Por último, se você se encontrar em uma situação utilizando NHibernate onde o acesso a dados é o gargalo da sua aplicação seu problema não é o NHibernate (a não ser que você tenha usado-o de maneira totalmente absurda, mas a probabilidade de você fazer o mesmo com ADO.NET é grande também). Nestes cenários o problema não é o acesso a dados em si, mas o resto da arquitetura que não escala de maneira adequada seja por meio de cache, processamento assincrono, filas, etc.&lt;/p&gt;

&lt;p&gt;Sendo assim, acredito que podemos concluir que não faz sentido algum no meio do ano de 2010 utilizar queries AdHoc ou Stored Procedures em aplicações &lt;a href=&quot;http://en.wikipedia.org/wiki/Line_of_business&quot;&gt;LoB&lt;/a&gt;. :)&lt;/p&gt;

&lt;p&gt;O código completo utilizado está no GitHub e pode ser &lt;a href=&quot;http://github.com/tucaz/Samples/tree/master/NHPerf/&quot;&gt;acessado online&lt;/a&gt; ou baixado em &lt;a href=&quot;http://github.com/downloads/tucaz/Samples/NHPerf.zip&quot;&gt;formato zip&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[1] – Hidratação é o processo de preenchimento (filling) das propriedades de uma entidade&lt;/strong&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Material da palestra no TDC2010 - ORM: Por que isso te interessa?</title>
   <link href="http://blog.tucaz.net/2010/08/26/material-da-palestra-no-tdc2010-orm-por-que-isso-te-interessa"/>
   <updated>2010-08-26T19:09:38+00:00</updated>
   <id>http://blog.tucaz.net/2010/08/26/material-da-palestra-no-tdc2010-orm-por-que-isso-te-interessa</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/assets/post-images/2010/08/barratopbasic_thumb.jpg&quot; alt=&quot;TDC 2010&quot; /&gt;&lt;/p&gt;

&lt;p&gt;No último fim de semana rolou em São Paulo o &lt;a href=&quot;http://www.thedevelopersconference.com.br/&quot;&gt;TDC2010&lt;/a&gt; organizado pela &lt;a href=&quot;http://www.globalcode.com.br&quot;&gt;Globalcode&lt;/a&gt;.
Fui convidado a palestrar na &lt;a href=&quot;http://www.thedevelopersconference.com.br/tdc/2010/sp/trilha-dot-net&quot;&gt;trilha de .NET&lt;/a&gt; pelo &lt;a href=&quot;http://www.twitter.com/giovannibassi&quot;&gt;@giovannibassi&lt;/a&gt; pra falar um pouquinho sobre ORM e porque é uma boa idéia usá-lo.&lt;/p&gt;

&lt;p&gt;Abaixo estão os &lt;a href=&quot;http://www.slideshare.net/tucaz/orm-por-que-isso-te-interessa-tdc2010/&quot;&gt;slides da minha palestra&lt;/a&gt;, que não fazem muito sentido por si só, mas que tem umas imagens divertidas!&lt;/p&gt;

&lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/5047644&quot; width=&quot;427&quot; height=&quot;356&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px&quot; allowfullscreen&gt; &lt;/iframe&gt;


&lt;p&gt; &lt;div style=&quot;margin-bottom:5px&quot;&gt; &lt;strong&gt; &lt;a href=&quot;http://www.slideshare.net/tucaz/orm-por-que-isso-te-interessa-tdc2010&quot; title=&quot;ORM: Por que isso te interessa? (TDC2010)&quot; target=&quot;_blank&quot;&gt;ORM: Por que isso te interessa? (TDC2010)&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/tucaz&quot; target=&quot;_blank&quot;&gt;tucaz&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Em um dos últimos slides tem uma porção de links muito legais sobre NHibernate então pra quem não quiser ter o trabalho de ver os slides ai vai:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://nhforge.org/&quot;&gt;http://nhforge.org/&lt;/a&gt; -&gt; NHibernate official website&lt;br/&gt;
&lt;a href=&quot;http://fluentnhibernate.org/&quot;&gt;http://fluentnhibernate.org/&lt;/a&gt; -&gt; Fluent Mappings for Nhibernate&lt;br/&gt;
&lt;a href=&quot;http://nhprof.com/&quot;&gt;http://nhprof.com/&lt;/a&gt; -&gt; NHibernate Profiler with 30 day trial&lt;br/&gt;
&lt;a href=&quot;http://www.summerofnhibernate.com/&quot;&gt;http://www.summerofnhibernate.com/&lt;/a&gt; -&gt; More than 14 hours of free videos&lt;br/&gt;
&lt;a href=&quot;http://www.manning.com/kuate/&quot;&gt;http://www.manning.com/kuate/&lt;/a&gt; -&gt; “NHibernate In Action” Book by Manning&lt;br/&gt;
&lt;a href=&quot;http://ayende.com/Blog/category/510.aspx&quot;&gt;http://ayende.com/Blog/category/510.aspx&lt;/a&gt; -&gt; NHibernate @ Ayende’s&lt;br/&gt;
&lt;a href=&quot;http://tinyurl.com/25reasons&quot;&gt;http://tinyurl.com/25reasons&lt;/a&gt; -&gt; 25 reasons NOT to write yout own ORM @ Ayende’s&lt;br/&gt;
&lt;a href=&quot;http://fabiomaulo.blogspot.com/search/label/NHibernate&quot;&gt;http://fabiomaulo.blogspot.com/search/label/NHibernate&lt;/a&gt; -&gt; NHibernate @ Fabio Maulo’s&lt;br/&gt;
&lt;a href=&quot;http://blogs.hibernatingrhinos.com/nhibernate/&quot;&gt;http://blogs.hibernatingrhinos.com/nhibernate/&lt;/a&gt; -&gt; NHibernate Blog&lt;br/&gt;
&lt;a href=&quot;http://code.google.com/p/unhaddins/&quot;&gt;http://code.google.com/p/unhaddins/&lt;/a&gt; -&gt; unhaddins, Unofficial addins for Nhibernate&lt;/p&gt;

&lt;p&gt;Além dos slides, &lt;a href=&quot;http://github.com/tucaz/Samples&quot;&gt;coloquei no GitHub também o código fonte do projetinho que usei na demo que fiz&lt;/a&gt;. Apesar de ser uma demo, o código serve como referência pra começar a utilizar o NHibernate e FluentMapping e ter uma idéia de algumas features bem legais que ele oferece.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://github.com/downloads/tucaz/Samples/TDC2010.zip&quot;&gt;Download do zip com o código.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Palestraram também, da Stefanini, &lt;a href=&quot;http://www.twitter.com/vquaiato&quot;&gt;@vquaiato&lt;/a&gt; na trilha de Ruby e .NET, &lt;a href=&quot;http://www.twitter.com/alnascimento&quot;&gt;@alnascimento&lt;/a&gt; e &lt;a href=&quot;http://www.twitter.com/manoelp&quot;&gt;@manoelp&lt;/a&gt; em Agile, &lt;a href=&quot;http://www.twitter.com/vcavalcante&quot;&gt;@vcavalcante&lt;/a&gt; em .NET e &lt;a href=&quot;http://www.twitter.com/jorgediz&quot;&gt;@jorgediz&lt;/a&gt; em Testes.&lt;/p&gt;

&lt;p&gt;Por último, mas não menos importante eu queria deixar registrado meu agradecimento ao &lt;a href=&quot;http://ayende.com/&quot;&gt;Oren Eini (a.k.a. Ayende Rahien&lt;/a&gt;) pelos cupons de desconto e licensa do &lt;a href=&quot;http://nhprof.com/&quot;&gt;NHProf&lt;/a&gt; que distribui ao final da palestra e também a Candace da &lt;a href=&quot;http://www.manning.com/&quot;&gt;Manning Publications&lt;/a&gt; pelas cópias dos eBooks “&lt;a href=&quot;http://www.manning.com/kuate/&quot;&gt;NHibernate In Action&lt;/a&gt;” que também dei de brinde. Muito obrigado pelas contribuições a comunidade! :)&lt;/p&gt;

&lt;p&gt;Now in English so I can make this public to English speakers too. Thanks to &lt;a href=&quot;http://ayende.com/&quot;&gt;Oren Eini (a.k.a Ayende Rahien&lt;/a&gt;) for the discount coupons and &lt;a href=&quot;http://nhprof.com/&quot;&gt;NHProf&lt;/a&gt; license that I gave out and to Candace from &lt;a href=&quot;http://www.manning.com/&quot;&gt;Manning Publications&lt;/a&gt; for the copies of “&lt;a href=&quot;http://www.manning.com/kuate/&quot;&gt;NHibernate In Action&lt;/a&gt;” that were also given at the event. You guys are amazing. Thanks a lot for contributing with this growing community! :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Ninject, StructureMap e Padrões de Injeção de Dependência</title>
   <link href="http://blog.tucaz.net/2010/08/04/ninject-structuremap-e-padroes-de-injecao-de-dependncia"/>
   <updated>2010-08-04T00:57:56+00:00</updated>
   <id>http://blog.tucaz.net/2010/08/04/ninject-structuremap-e-padroes-de-injecao-de-dependncia</id>
   <content type="html">&lt;p&gt;Este post foi motivado por &lt;a href=&quot;http://groups.google.com/group/dotnetarchitects/browse_thread/thread/3fc4c95c4f0c150d&quot;&gt;esta thread no DNA&lt;/a&gt; e por &lt;a href=&quot;http://stackoverflow.com/questions/3335735/resolving-automatic-and-manual-dependencies&quot;&gt;essa question no StackOverflow.com&lt;/a&gt; a respeito de um problema que encontrei nesta última semana em um cenário relativamente complexo de injeção de dependência.&lt;/p&gt;

&lt;h2&gt;Contexto&lt;/h2&gt;

&lt;p&gt;A arquitetura em questão utiliza injeção de dependência com base em interfaces, ou seja, todas as dependências das minhas classes são sempre pra interfaces (contratos) e nunca para classes concretas (implementação) exatamente como manda o figurino.&lt;/p&gt;

&lt;p&gt;Meu domínio é o padrão: carrinho de compras com Pedido e seus itens. Uma classe é responsável por efetuar o processamento do pedido (&lt;em&gt;GeradorPedido&lt;/em&gt;). Ela executa todos os procedimentos necessários para que um pedido seja gerado de maneira correta, dentre eles aplicar um determinado fator de ajuste de preços dos itens acordo com a loja onde o pedido foi vendido. Este fator de ajuste é determinado pela classe &lt;em&gt;Precificador&lt;/em&gt; e deve ser desconhecido para o restante dos outros objetos a fim de não violar o &lt;a href=&quot;http://en.wikipedia.org/wiki/Single_responsibility_principle&quot;&gt;SRP&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O diagrama abaixo representa as classes envolvidas e suas dependências:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/post-images/2010/07/classes2.png&quot;&gt;&lt;img src=&quot;/assets/post-images/2010/07/classes2.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como aplicar este fator ao preço do item não é responsabilidade do &lt;em&gt;GeradorPedido&lt;/em&gt;, sempre que uma instância de &lt;em&gt;GeradorPedido&lt;/em&gt; é criada, injeto via construtor uma nova instância de &lt;em&gt;Precificador&lt;/em&gt; pra ser usado quando necessário. Neste caso, temos uma dependência direta de &lt;em&gt;GeradorPedido&lt;/em&gt; para &lt;em&gt;IPrecificador&lt;/em&gt; que é resolvida em tempo de execução.&lt;/p&gt;

&lt;p&gt;Tudo estava sendo resolvido utilizando &lt;a href=&quot;http://www.ninject.org/&quot;&gt;Ninject&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;MyModule.cs&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public class MyModule : NinjectModule
{
    public override void Load()
    {
        Bind&amp;lt;IPrecificador&amp;gt;().To&amp;lt;Precificador&amp;gt;();
        Bind&amp;lt;IGeradorPedido&amp;gt;().To&amp;lt;GeradorPedido&amp;gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;UnitTest1.cs&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[TestMethod]
public void consegue_resolver_GeradorPedido()
{
    MyModule module = new MyModule();
    StandardKernel kernel = new StandardKernel(module);
    var geradorPedido = kernel.Get();

    Assert.IsNotNull(geradorPedido);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Precificador.cs&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Precificador : IPrecificador
{
    private decimal _fatorAjuste;

    public Precificador()
    {
        _fatorAjuste = 10m;
    }

    public decimal CalcularPreco(ItemPedido item)
    {
        return item.Preco * _fatorAjuste;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;GeradorPedido.cs&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class GeradorPedido : IGeradorPedido
{
    private IPrecificador _precificador;

    public GeradorPedido(IPrecificador precificador)
    {
        _precificador = precificador;
    }

    public string Processar(Pedido novoPedido)
    {
        decimal total = 0;

        foreach (var item in novoPedido.Itens)
        {
            total += _precificador.CalcularPreco(item);
        }

        //Faz mais algumas operações com pedido

        //Número do pedido
        return &quot;ABC123&quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Até aqui, tudo OK, certo? Ai entra um novo requisito e com ele aparece o problema...&lt;/p&gt;

&lt;h2&gt;Novo Requisito&lt;/h2&gt;

&lt;p&gt;Alguém decidiu que o fator dos preços deveria variar de acordo com a loja em que o pedido estava sendo feito. Se isso é uma regra de preço, a qual classe pertence? &lt;em&gt;Precificador&lt;/em&gt;!&lt;/p&gt;

&lt;p&gt;Quais opções temos pra implementar isso com o mínimo de impacto possível no sistema (já que a interface &lt;em&gt;IPrecificador&lt;/em&gt; já estava sendo usada) e de maneira que a coesão e desacoplamento seja mantido?&lt;/p&gt;

&lt;h3&gt;Opção 1 - Adicionar um paramêtro no método CalcularPreco&lt;/h3&gt;

&lt;p&gt;A primeira opção que me veio a cabeça foi adicionar o paramêtro com a loja diretamente no método CalcularPreco da interface &lt;em&gt;IPrecificador&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;IPrecificador.cs&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Precificador : IPrecificador
{
    private decimal _fatorAjuste;

    public decimal CalcularPreco(ItemPedido item, Loja vendaEfetuadaEm)
    {
        if (vendaEfetuadaEm == Lojas.LojaUm)
            _fatorAjuste = 10m;
        else if (vendaEfetuadaEm == Lojas.LojaDois)
            _fatorAjuste = 15.4m;
        else
            _fatorAjuste = 0.9m;

        return item.Preco * _fatorAjuste;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Parecia uma boa saída, mas depois de pensar alguns minutos encontrei dois side-effects graves que me fizeram mudar de idéia:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;O novo paramêtro, &lt;em&gt;Loja&lt;/em&gt;, passaria também a virar uma dependência direta pra todos que consumissem a interface &lt;em&gt;IPrecificador&lt;/em&gt; já que estes [consumidores] seriam responsáveis por repassar a loja para poder realizar a chamada a CalcularPreco. Com isso estariamos violando o SRP adicionando um motivo a mais pra classe &lt;em&gt;GeradorPedido&lt;/em&gt; e outras mudarem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Diversos testes seriam quebrados pela adição do novo paramêtro, indicando que talvez não fosse a melhor alternativa já que essa alteração deveria afetar apenas uma classe&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h3&gt;Opção 2 - Adicionar este paramêtro ao construtor da classe Precificador e utilizar uma Factory&lt;/h3&gt;

&lt;p&gt;Já que esta alteração diz respeito apenas a responsabilidade da classe &lt;em&gt;Precificador&lt;/em&gt;, que tal adicionar este paramêtro ao construtor da classe? Ótima idéia, não?&lt;/p&gt;

&lt;p&gt;De fato foi a solução que fez mais sentido já que necessariamente para chegar ao fator de preço a ser aplicado a classe precisa saber com qual loja estamos lidando. Para implementar, bastaria fornecer a loja via construtor e armazenar o valor em um membro privado da classe pra uso posterior. Dessa forma, todos os consumidores dessa classe iriam receber uma instância de &lt;em&gt;IPrecificador&lt;/em&gt; já configurada e pronta pra uso sem a necessidade de se preocupar em fornecer a loja.&lt;/p&gt;

&lt;p&gt;Nosso novo Precificador.cs ficaria assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Precificador : IPrecificador
{
    private decimal _fatorAjuste;

    public Precificador(Loja vendaEfetuadaEm)
    {
        if (vendaEfetuadaEm == Lojas.LojaUm)
            _fatorAjuste = 10m;
        else if (vendaEfetuadaEm == Lojas.LojaDois)
            _fatorAjuste = 15.4m;
        else
            _fatorAjuste = 0.9m;
    }

    public decimal CalcularPreco(ItemPedido item)
    {
        return item.Preco * _fatorAjuste;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;No entanto, na hora que fui implementar esta solução esbarrei no meu container de DI, até então o Ninject, que resolvia a dependência de &lt;em&gt;IPrecificador&lt;/em&gt; pra mim automaticamente sempre que necessário. Contudo, pra esta implementação eu precisaria fornecer um valor (a &lt;em&gt;Loja&lt;/em&gt;) que só podia ser obtido em runtime na hora de construir a instância de &lt;em&gt;IPrecificador&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Então a solução seria utilizar uma Factory!&lt;/p&gt;

&lt;p&gt;GeradorPedidoFactory.cs&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class GeradorPedidoFactory
{
    public static IGeradorPedido Criar(Loja vendaEfetuadaEm)
    {
        IPrecificador precificador = new Precificador(vendaEfetuadaEm);
        return new GeradorPedido(precificador);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Mas trinta segundos depois descartei essa idéia porque &lt;em&gt;IPrecificador&lt;/em&gt; estava sendo usado por outras classes além de &lt;em&gt;GeradorPedido&lt;/em&gt; então eu teria que criar uma factory pra cada uma das classes que fosse consumidora de &lt;em&gt;IPrecificador&lt;/em&gt;. Também dessa forma eu estaria anulando meu Container de DI espalhando a criação de tipos concretos por diversas factories ao invés de centralizar em apenas um ponto.&lt;/p&gt;

&lt;h3&gt;Opção 3 – Manter o construtor e utilizar uma Abstract Factory pra criar IPrecificador&lt;/h3&gt;

&lt;p&gt;A terceira e ultima opção antes da solução final foi utilizar uma Abstract Factory, que seria injetada via DI em todo mundo que precisasse de &lt;em&gt;IPrecificador&lt;/em&gt; eliminando a necessidade de uma factory pra cada construtor e mantendo a responsabilidade no lugar adequado. Algo assim:&lt;/p&gt;

&lt;p&gt;PrecificadorFactory.cs&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class PrecificadorFactory : IPrecificadorFactory
{
    public IPrecificador Criar(Loja vendaEfetuadaEm)
    {
        return new Precificador(vendaEfetuadaEm);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;MyModule.cs&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public class MyModule : NinjectModule
{
    public override void Load()
    {
        Bind&amp;lt;IPrecificadorFactory&amp;gt;().To&amp;lt;PrecificadorFactory&amp;gt;();
        Bind&amp;lt;IGeradorPedido&amp;gt;().To&amp;lt;GeradorPedido&amp;gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;GeradorPedido.cs&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class GeradorPedido : IGeradorPedido
{
    private IPrecificadorFactory _precificadorFactory;

    public GeradorPedido(IPrecificadorFactory precificadorFactory)
    {
        _precificadorFactory = precificadorFactory;
    }

    public string Processar(Pedido novoPedido, Loja vendaEfetuadaEm)
    {
        IPrecificador precificador = _precificadorFactory.Criar(vendaEfetuadaEm);
        decimal total = 0;

        foreach (var item in novoPedido.Itens)
        {
            total += precificador.CalcularPreco(item);
        }

        //Faz mais algumas operações com pedido

        //Número do pedido
        return &quot;ABC123&quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Contudo, na hora que implementei pra ver como ficaria, percebi que tinha o mesmo problema da primeira solução: todo mundo que precisasse consumir &lt;em&gt;IPrecificador&lt;/em&gt; teria que receber o paramêtro informando a &lt;em&gt;Loja&lt;/em&gt; onde a venda foi efetuada para repassar para a abstract factory de IPrecificador a fim de criar uma instância concreta da classe. A dependência tinha voltado, apesar de a responsabilidade estar um pouco melhor distribuida. :(&lt;/p&gt;

&lt;h3&gt;A Solução Final&lt;/h3&gt;

&lt;p&gt;Quando eu já estava quase desistindo de procurar outra alternativa (mais uma) o &lt;a href=&quot;http://twitter.com/pedroreys&quot;&gt;@pedroreys&lt;/a&gt; deu uma idéia excelente: fornecer previamente ao container de DI a instância de &lt;em&gt;IPrecificador&lt;/em&gt; que deveria ser usada quando ela fosse necessária.&lt;/p&gt;

&lt;p&gt;Na hora fui atrás de como fazer isso com o Ninject que, era meu container até então. Infelizmente ele não implementa essa funcionalidade especifíca. Pelo menos não da maneira que eu gostaria &lt;strong&gt;[1]&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Foi ai que decidi mudar para o &lt;a href=&quot;http://structuremap.github.com/structuremap/index.html&quot;&gt;StructureMap&lt;/a&gt;, container utilizado no exemplo do &lt;a href=&quot;http://twitter.com/pedroreys&quot;&gt;@pedroreys&lt;/a&gt;. O StructureMap, apesar de ter sido um dos primeiros containers de DI/IoC lançados (e de ser um pouco &lt;em&gt;verboso&lt;/em&gt; demais pro meu gosto), se mantém atualizado e com uma excelente interface fluente exatamente como o Ninject.&lt;/p&gt;

&lt;p&gt;A troca foi simples já que eu utilizo um Wrapper (omitido por breviedade) pro Ninject e a aplicação não tem contato com o container em si. O resultado acabou sendo um Mix de todas as soluções:&lt;/p&gt;

&lt;p&gt;PrecificadorFactory.cs&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class PrecificadorFactory
{
    public static IPrecificador Criar(Loja vendaEfetuadaEm)
    {
        return new Precificador(vendaEfetuadaEm);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;UnitTest1.cs&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[TestMethod]
public void consegue_resolver_GeradorPedido()
{
    Loja vendaEfetuadaEm = RecuperarLojaOndeVendaFoiEfetuada();

    IPrecificador precificador = PrecificadorFactory.Criar(vendaEfetuadaEm);

    Container container = new Container();

    IGeradorPedido geradorPedido = container.With&amp;lt;IPrecificador&amp;gt;(precificador).GetInstance&amp;lt;IGeradorPedido&amp;gt;();

    Assert.IsNotNull(geradorPedido);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dessa forma consigo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Criar a instância de &lt;em&gt;IPrecificador&lt;/em&gt; separadamente&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dizer ao container que quero que esta instância especifica seja usada somente nesta resolução de &lt;em&gt;IGeradorPedido&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Manter cada classe com sua responsabilidade&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Any thoughts o this?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[1] – O Ninject, na última versão (2.0), implementa o método Rebind() que permite trocar o bind de uma interface em runtime. No entanto, esta troca é permanente e afeta todos os consumidores do container (Singleton, no meu caso) e no meu contexto, não faz muito sentido.&lt;/strong&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>A caminho do Zen</title>
   <link href="http://blog.tucaz.net/2010/04/18/a-caminho-do-zen"/>
   <updated>2010-04-18T22:24:33+00:00</updated>
   <id>http://blog.tucaz.net/2010/04/18/a-caminho-do-zen</id>
   <content type="html">&lt;p&gt;Hoje temos a nossa disposição milhares de fontes de informação e algumas dezenas de grandes agregadores de informação (rss, twitter, etc) que multiplicam a quantidade de informação a que somos expostos diariamente.&lt;/p&gt;

&lt;p&gt;Agora, o desafio não é encontrar a informação, mas sim escolher qual informação iremos consumir. Até pouco tempo atrás quantidade significava qualidade, mas isso já não é mais verdade e a maioria das pessoas está tentando diminuir a quantidade de coisas que faz e a quantidade de informação a que é exposta. Menos virou mais.&lt;/p&gt;

&lt;p&gt;Diariamente, incluindo RSS, Twitter, DNA e os links gerados a partir destes agregadores (que são os que mais uso) acho que gasto umas quatro horas lendo. Isso sem contar a pilha de livros que compro mensalmente e que vai se acumulando para leitura posterior.&lt;/p&gt;

&lt;p&gt;Por conta disso, acabo não tendo tempo de executar os projetos que gostaria, entre eles escrever mais neste blog. Ler é excelente, mas a rede da web faz com que cada link aberto gere mais outros 200 e não conseguimos processar tudo ao mesmo tempo. Por isso, foco é fundamental.&lt;/p&gt;

&lt;p&gt;Nos últimos dias defini uma lista de projetos/items que quero concluir nas próximas semanas. Sendo assim, vou tentar reduzir minha exposição à toda essa informação pra dar uma &quot;desintoxicada&quot; e focar nestes itens.&lt;/p&gt;

&lt;p&gt;Estou compartilhando essa dificuldade por dois motivos: 1) Tornar um problema público faz com que a gente se mexa pra resolve-lo, afinal ninguém gosta de ter seus problemas expostos (ainda mais sem resolve-los, né?) e 2) Ver se alguém compartilha do mesmo &quot;problema&quot; e entender como cada um lida com isso, portanto você que está lendo isso, saia do read-only mode e comente este post! :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Você é importante?</title>
   <link href="http://blog.tucaz.net/2010/03/02/voce-e-importante"/>
   <updated>2010-03-02T23:50:51+00:00</updated>
   <id>http://blog.tucaz.net/2010/03/02/voce-e-importante</id>
   <content type="html">&lt;p&gt;Reza a lenda[1] que, trabalhando na Apple, a qualquer momento você pode encontrar Steve Jobs e ouvir dele a seguinte pergunta: &quot;O que você faz aqui?&quot; e, caso ele não goste da resposta você pode ser demitido na hora.&lt;/p&gt;

&lt;p&gt;Apesar de essa ser uma atitude drástica, acho que faz bastante sentido, principalmente no cenário de desenvolvimento de software. Alguma vez você já se perguntou o que &lt;strong&gt;realmente&lt;/strong&gt; faz na empresa onde trabalha? Se a resposta for tão simples como &quot;escrevo código&quot; talvez você esteja prestes a ser (merecidamente) &lt;s&gt;demitido&lt;/s&gt; promovido ao mercado de trabalho . Mesmo como programador seu trabalho não é apenas escrever código, mas sim transformar idéias em maravilhas tecnológicas que vão fazer seu usuário delirar e com isso agregar valor para a empresa ou qualquer outra coisa que o valha. Isso vale para todas as posições.&lt;/p&gt;

&lt;p&gt;Desde gerentes (que tradicionalmente só controlam cronogramas, ou seja, fazem nada) até gerentes de produto que ficam pra cima e pra baixo mandando as pessoas fazerem coisas. O ponto é, se você não contribui para o produto final você é &lt;strong&gt;inútil, totalmente dispensável e deveria arrumar uma outra coisa pra fazer&lt;/strong&gt;. Sua contribuição não precisa ser necessariamente técnica (com código), mas também com soft skills (organização, segurança, criatividade, etc) que ajudem efetivamente seu time a chegar ao objetivo.&lt;/p&gt;

&lt;p&gt;Acho que esse é um ponto importante de reflexão. Para sermos melhores no que fazemos temos que entender realmente o que queremos e temos de fazer.&lt;/p&gt;

&lt;p&gt;O que você acha?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[1]&lt;/strong&gt; - Segundo relatos existentes de (ex) funcionários no livro &quot;A cabeça de Steve Jobs&quot;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Cuidado com os especialistas!</title>
   <link href="http://blog.tucaz.net/2010/02/23/cuidado-com-os-especialistas"/>
   <updated>2010-02-23T23:42:30+00:00</updated>
   <id>http://blog.tucaz.net/2010/02/23/cuidado-com-os-especialistas</id>
   <content type="html">&lt;p&gt;Hoje em dia com toda essa modernidade (como diria minha vovó) e a facilidade na disseminação da informação que a internet nos trouxe surgem a cada dia mais e mais especialistas. Em cada esquina da internet é possível encontrar um. Não importa o assunto.&lt;/p&gt;

&lt;p&gt;O cara começa com um blog ou um grupo de discussão, manda bastante tweets, adiciona uma pitada de promoção pessoal em todo canto, dai avança pra meia dúzia de palestras e até se propõe a ministrar um curso sobre o assunto. De repente, em poucos tempo virou especialista &lt;strong&gt;E&lt;/strong&gt; referência no assunto!&lt;/p&gt;

&lt;p&gt;Vendo tanta propaganda você deve achar que o cara tem muita experiência e é uma ótima fonte de informação. Boa fonte de informação pode até ser, mas repetir tudo que ve como um papagaio é ser um especialista? Ministrar cursos e posar de conhecedor do assunto apenas com conhecimento teórico é suficiente? É ético?&lt;/p&gt;

&lt;p&gt;Será que é essa mesmo a definição de especialista que procuramos? Ainda mais sobre assuntos não técnicos ou &lt;a href=&quot;http://en.wikipedia.org/wiki/Soft_skills&quot;&gt;soft-skills&lt;/a&gt; onde toda a bagagem e experiência que podemos conferir é escrita/falada?  São essas nossas referências?&lt;/p&gt;

&lt;p&gt;Tenha cuidado quando alguém lhe apresentar o título de &quot;Especialista em XYZ&quot;. Papel e meios de comunicação similares aceitam qualquer coisa, já dizia minha professora na quina série.&lt;/p&gt;

&lt;p&gt;Infelizmente não há maneiras práticas e fáceis de reconhecer falsos especialistas. O único jeito é desconfiar sempre e não disseminar informações baseadas na &lt;a href=&quot;http://www.nizkor.org/features/fallacies/appeal-to-authority.html&quot;&gt;falácia da autoridade&lt;/a&gt;. Seus amigos, seu chefe e seu bolso agradecem!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Lidando melhor com WCF - Ciclo de vida no cliente</title>
   <link href="http://blog.tucaz.net/2010/02/23/lidando-com-wcf-ciclo-de-vida-no-cliente"/>
   <updated>2010-02-23T14:02:31+00:00</updated>
   <id>http://blog.tucaz.net/2010/02/23/lidando-com-wcf-ciclo-de-vida-no-cliente</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;lt;Importante&amp;gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Todos sabem que WCF é uma plataforma poderosa e extensível. O que muita gente não sabe é que WCF é para poucos.&lt;/p&gt;

&lt;p&gt;WCF é uma plataforma que permite a construção de sistemas distribuidos e sistemas distribuidos raramente são necessários. De maneira simplificada, podemos dizer que um sistema é distribuido quando tem seus componentes instalados em mais de um computador.&lt;/p&gt;

&lt;p&gt;O problema da construção de sistemas distribuídos é que devido a não centralização de seus compnentes existe um overhead de comunicação entre os computadores e serialização/deserialização de objetos e isso consome muita memória e banda de rede.&lt;/p&gt;

&lt;p&gt;Como gastamos mais recursos do que necessário temos como resultado final um aumento no tempo de resposta e gasto extra de hardware que, as vezes pode ser um problema grave além é claro do aumento da complexidade técnica.&lt;/p&gt;

&lt;p&gt;No entanto, não sei por qual motivo, no momento em que lançou o produto, a Microsoft esqueceu de avisar seus &quot;consumidores&quot; a respeito destes pequenos detalhes. Talvez porque queria promover o produto?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;lt;/Importante&amp;gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;lt;Importante 2&amp;gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;WCF é uma tecnologia relativamente simples, mas apenas depois que você entende o BeABá da coisa (ou ABC&lt;strong&gt;[1]&lt;/strong&gt; no caso do WCF). Até lá, qualquer coisa que fuja do point&amp;amp;click que o Visual Studio nos oferece é relativamente complexo.&lt;/p&gt;

&lt;p&gt;Portanto, sugiro que antes de aplicar WCF você procure entender um pouco mais dos fundamentos e do papel de cada objeto que ele utiliza.&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;lt;/Importante 2&amp;gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agora que entendemos que não devemos usar WCF em toda aplicação que construimos (talvez isso seja tópico pra outro post?) vou falar um pouco da experiência que estou tendo com esta tecnologia e das boas práticas e atalhos que conheci.&lt;/p&gt;

&lt;p&gt;Pretendo fazer uma pequena série e pra começar vou abordar boas práticas de consumo de serviços WCF, ou em outras palavras, como acessar um serviço WCF a partir de um cliente da maneira mais eficiente possível.&lt;/p&gt;

&lt;p&gt;Para que seja possível consumir um serviço WCF é necessário que alguém o tenha publicado e também que tenha disponibilizado o WSDL&lt;strong&gt;[2]&lt;/strong&gt; do serviço.&lt;/p&gt;

&lt;p&gt;O WSDL nada mais é do que um arquivo XML que descreve quais são os tipos de dados que o serviço irá trafegar e quais operações ele oferece.&lt;/p&gt;

&lt;p&gt;Geralmente, assim que temos um WSDL para consumir vamos ao Visual Studio e utilizamos a funcionalidade de &lt;em&gt;Add Service Reference&lt;/em&gt; que ele nos oferece para gerar o objeto proxy que irá cuidar pra nós da comunicação com WCF. A partir dai utilizamos este objeto em toda nossa aplicação__. E este é o nosso maior erro.&lt;/p&gt;

&lt;p&gt;Este proxy, gerado pelo Wizard, encapsula todas as classes necessárias para ler o WSDL, criar os tipos necessários e lidar com os canais de comunicação em cada operação que executamos. No entanto, ele o faz da &lt;strong&gt;pior&lt;/strong&gt; maneira possível.&lt;/p&gt;

&lt;p&gt;Cada vez que invocamos uma operação através deste proxy, ele cria uma instância da classe &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms576132.aspx&quot;&gt;ChannelFactory&amp;lt;T&amp;gt;&lt;/a&gt;. Esta classe é responsável por ler as configurações definidas em nosso app.config e baseado nestas configurações abrir os canais de comunicação com o serviço que iremos consumir. Este processo é &lt;strong&gt;muito lento&lt;/strong&gt;, pois todos os sockets, listeners e objetos necessários da própria infra estrutura do WCF são criados e configurados neste momento.&lt;/p&gt;

&lt;p&gt;No entanto, este processo não precisa ser feito a cada chamada para o serviço WCF uma vez que estas informações não mudarão enquanto a aplicação estiver rodando. Então, para otimizar bastante o consumo de serviços devemos ignorar o proxy gerado pelo Wizard e cuidar da criação e destruição de canais nós mesmos mantendo este objeto (ChannelFactory&amp;lt;T&amp;gt;) como &lt;a href=&quot;http://pt.wikipedia.org/wiki/Singleton&quot;&gt;Singleton&lt;/a&gt; que irá durar pelo tempo de vida da aplicação. Dessa forma toda vez que chamamos uma operação remota não existe a necessidade de executar o setup e tear down desse objeto.&lt;/p&gt;

&lt;p&gt;Para facilitar a gerência desses objetos construi uma pequena DLL que é composta apenas de uma classe. O código está disponível no &lt;a href=&quot;http://github.com/tucaz/CommunicationsManager&quot;&gt;github&lt;/a&gt; e a &lt;a href=&quot;http://github.com/tucaz/CommunicationsManager/downloads&quot;&gt;DLL compilada está aqui&lt;/a&gt;. A &lt;a href=&quot;http://wiki.github.com/tucaz/CommunicationsManager/&quot;&gt;documentação inicial também está lá&lt;/a&gt;. Tudo pronto para ser usado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Referências adicionais (e importantes)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://blogs.msdn.com/wenlong/archive/2007/10/27/performance-improvement-of-wcf-client-proxy-creation-and-best-practices.aspx&quot;&gt;Performance improvement for WCF client proxy creation in .NET 3.5 and best practices @ Wenlong Dong's Blog&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.israelaece.com/post/Internals-Proxy-de-servicos-WCF.aspx&quot;&gt;Internals - Proxy de Serviços WCF @ Israel Aece&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://weblogs.asp.net/pglavich/archive/2007/05/07/wcf-client-channel-pool-improved-client-performance.aspx&quot;&gt;WCF Client Channel Pool - Improved Client Performance @ Glavs Blog&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://stackoverflow.com/questions/1825990/wcf-channelfactory-and-channel-caching-in-asp-net-client-application&quot;&gt;Bate papo que me levou a este componente @ StackOverflow&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;[1]&lt;/strong&gt; ABC = Address, Bindings e Contracts&lt;br/&gt;
&lt;strong&gt;[2]&lt;/strong&gt; É possível consumir um serviço WCF sem acesso ao WSDL, mas este é um cenário pouco comum&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>[Off-Topic] Problemas com monitor Samsung e exemplo de péssimo atendimento</title>
   <link href="http://blog.tucaz.net/2010/02/13/off-topic-problemas-com-monitor-samsung-e-exemplo-de-pessimo-atendimento"/>
   <updated>2010-02-13T09:32:58+00:00</updated>
   <id>http://blog.tucaz.net/2010/02/13/off-topic-problemas-com-monitor-samsung-e-exemplo-de-pessimo-atendimento</id>
   <content type="html">&lt;p&gt;Não costumo fazer esse tipo de off-topic, mas essa situação me revolta simplesmente pelo fato de não poder fazer nada além de reclamar e &quot;chorar&quot; por ai.&lt;/p&gt;

&lt;p&gt;Em dezembro de 2007 adquiri um monitor Samsung 2232BW pelo valor de &lt;strong&gt;R$1027,00&lt;/strong&gt;. Até onde eu sei esse valor não é baixo e tem gente que não ganha isso em um ano inteiro de trabalho.&lt;/p&gt;

&lt;p&gt;Pouco mais de 2 anos passados, mês passado ele começou a apresentar um problema com seu painel. Isso já me deixou p*** da vida, pois 2 anos de vida útil em um produto deste valor é rídiculo. Meu CRT 17 nunca deu um problema em quase 5 anos que ficou em uso.&lt;/p&gt;

&lt;p&gt;Como um monitor equivalente hoje custa na faixa de R$500, decidi que valeria a pena tentar levar meu monitor para conserto e caso o custo do serviço ficasse em até R$200,00 acredito que compensaria.&lt;/p&gt;

&lt;p&gt;Procurei no site da Samsung as assistências técnicas autorizadas, que apesar de serem terceirizadas, levam o nome Samsung e deveriam responder com o  mesmo padrão de qualidade que a Samsung vende em seus produtos e encontrei 3 em um ráio de 20km da minha casa. Fui as três e realmente conclui que elas atendem seguinde o mesmo padrão inexistente de qualidade da Samsung com filas de mais de uma hora e meia apenas para ser atendido na recepção pra tentar descobrir se é possível o conserto e qual seria o valor.&lt;/p&gt;

&lt;p&gt;Conclusão: é mais fácil ser atendido no poupa tempo ou em um posto do INSS do que em um serviço autorizado da Samsung que iria &lt;em&gt;&lt;strong&gt;receber&lt;/strong&gt;&lt;/em&gt; pelo atendimento.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Obrigado Samsung pelos momentos de frustração e pela demonstração de como operar um negócio onde o cliente claramente não tem importância nenhuma além, é claro, de me colocar em uma posição onde eu tenha que implorar para ter meu monitor consertado!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Qual é a dos apertadores de botões?</title>
   <link href="http://blog.tucaz.net/2010/01/29/qual-e-a-dos-apertadores-de-botoes"/>
   <updated>2010-01-29T13:19:52+00:00</updated>
   <id>http://blog.tucaz.net/2010/01/29/qual-e-a-dos-apertadores-de-botoes</id>
   <content type="html">&lt;p&gt;Não importa onde eu vá, seja a empresa grande ou pequena, sempre existem pessoas dos dois grupos: apertadores de botões e as pessoas que vão pra frente.&lt;/p&gt;

&lt;p&gt;As pessoas que vão pra frente são fáceis de identificar e não me interessa falar muito sobre elas neste post. Elas estão sempre empolgadas, comentam a respeito de novidades e procuram fazer ela e as pessoas em sua volta prosperarem, mesmo quando essa não é a intenção.&lt;/p&gt;

&lt;p&gt;Já os apertadores de botão estão sempre na mesma. O incrível é que esse perfil (ou falta de perfil?) existe em todos os papéis e profissões. DBAs -que só rodam scripts e não analisam o log (nem quando solicitado!) pra ver o que aconteceu e ajudar o pobre desenvolvedor que não tem acesso ao DB-, Desenvolvedores -que programam o que está especificado não importando o quão errado esteja do ponto de vista técnico ou funcional-, entre muitos outros.&lt;/p&gt;

&lt;p&gt;No entanto, podemos ainda criar outra categoria de apertadores de botões: os que fazem apenas tarefas repetitivas. Quem nunca viu o &quot;operador de computador&quot; (acho que essa expressão é do mesmo tempo CPD) que todo dia, o dia inteiro, fica copiando/alterando arquivos de lá pra cá, sempre igual?&lt;/p&gt;

&lt;p&gt;Por mais que eu não goste do meu trabalho (ainda bem que &lt;em&gt;&lt;strong&gt;eu&lt;/strong&gt;&lt;/em&gt; gosto!), acredito que devemos tirar o melhor proveito dele. Ou melhor, devemos tirar o melhor proveito de tudo que fazemos na vida. Portanto, o que motiva uma pessoa a executar o mesmo processo &lt;em&gt;&lt;strong&gt;igual&lt;/strong&gt;&lt;/em&gt; todo dia sem nem mesmo pensar em uma maneira de automatizá-lo ou de faze-lo de maneira diferente?&lt;/p&gt;

&lt;p&gt;Mesmo que você não consiga remover todos os processos repetitivos ou não crie uma obra de arte quando conseguir é importante tentar. Não importa se você vai ser reconhecido por isso, não importa se você irá ganhar $algo$ em troca e não importa se você não é pago pra automatizar nada. &lt;em&gt;&lt;strong&gt;Faça por você!&lt;/strong&gt;&lt;/em&gt; Mesmo quando o esforço não valer a pena você vai &lt;em&gt;&lt;strong&gt;no mínimo ter aprendido alguma coisa nova&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Portanto, se você se encaixa em algum desses perfis, já passou da hora de se mexer e mudar, não acha?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Reunião .NET Architects em 16/01/2010 - Referências</title>
   <link href="http://blog.tucaz.net/2010/01/17/reuniao-net-architects-em-16012010-referencias"/>
   <updated>2010-01-17T15:09:52+00:00</updated>
   <id>http://blog.tucaz.net/2010/01/17/reuniao-net-architects-em-16012010-referencias</id>
   <content type="html">&lt;p&gt;Ontem durante a reunião do nosso &lt;a href=&quot;http://www.dotnetarchitects.net/&quot;&gt;grupo de discussão de .NET&lt;/a&gt; o &lt;a href=&quot;http://fabiogaluppo.spaces.live.com/&quot;&gt;Fabio Galuppo&lt;/a&gt; falou sobre um pouco sobre F#. A apresentação foi muito boa e logo após, durante a &quot;mesa redonda&quot;, eu mencionei uma série de aulas gravadas na Universidade de Berkeley sobre o assunto Linguagens Funcionais. É o curso completo gravado. Como o pessoal se interessou e pediu os links ai vai:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=zmYqShvVDh4&quot;&gt;Primeira aula do curso&lt;/a&gt; - As demais podem ser encontradas nos vídeos relacionados&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/user/UCBerkeley&quot;&gt;Outros Cursos de Berkeley&lt;/a&gt; - Canal da universidade no YouTube com outras diversas aulas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://webcast.berkeley.edu/course_details.php?seriesid=1906978502&quot;&gt;Vídeos e WebCasts no site oficial da Faculdade&lt;/a&gt; - O primeiro link contém os vídeos disponibilizados no YouTube. No entanto, a faculdade também disponibiliza em seu site os mesmos vídeos além de outros da disciplina de ciências da computação.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Depois da reunião oficialmente terminada fomos almoçar e como acabamos entrando no assunto de gestão de projetos comentei um pouquinho a respeito de gestão democrática e prometi deixar alguns links disponíveis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://akitaonrails.com/2009/07/07/screencast-agilidade-qualidade-e-futuro&quot;&gt;Palestra do Akita que foi uma das minhas maiores motivações sobre esse assunto&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://blog.tucaz.net/en/2009/07/13/leading-by-omission/&quot;&gt;Palestra do Ricardo Semler no MIT&lt;/a&gt; - Essa é a palestra que o Akita cita como referência&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/s/ref=nb_ss?url=search-alias%3Daps&amp;amp;field-keywords=ricardo+semler&amp;amp;x=0&amp;amp;y=0&quot;&gt;Lvros de Autoria do Ricardo Semler no Amazon&lt;/a&gt; e no &lt;a href=&quot;http://www.submarino.com.br/busca?q=ricardo+semler&amp;amp;dep=+&amp;amp;x=0&amp;amp;y=0&quot;&gt;Submarino&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://hbr.org/product/managing-without-managers/an/89509-PDF-ENG&quot;&gt;Manager Without Managers&lt;/a&gt; - Paper da Harvard Business Review também de Autoria do Ricardo Semler sobre o assunto&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://vimeo.com/7961281&quot;&gt;Palestra do Akita @ RailsSummit 2009&lt;/a&gt; - Essa é pra quem quiser viajar mais e conhecer as entradas que levam ao assunto de maneira mais profunda&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Eu não uso Scrum porque Scrum não funciona!</title>
   <link href="http://blog.tucaz.net/2010/01/14/eu-nao-uso-scrum-porque-scrum-nao-funciona"/>
   <updated>2010-01-14T19:28:15+00:00</updated>
   <id>http://blog.tucaz.net/2010/01/14/eu-nao-uso-scrum-porque-scrum-nao-funciona</id>
   <content type="html">&lt;p&gt;É Isso ai! Scrum não funciona!&lt;/p&gt;

&lt;p&gt;Sabe porque Scrum não funciona? Porque se chama Scrum. Esse hoje é o maior problema do Scrum. Há dois anos atrás pouquíssimo se falava nisto que hoje virou hype. Nessa época as pessoas só falavam que usam Scrum depois de estudar bastante, trocar experiências e exercitar bastante. Ai sim alguém tinha coragem de dizer &quot;Eu uso Scrum&quot; e ainda assim com um pouco de receio, pois sabiam que tinha mais coisas além de apagar toda documentação do projeto e e quebrar as cadeiras pra fazer as reuniões em pé. As pessoas (a maioria) que diziam isso sabiam o que estavam dizendo. Scrum tinha credibilidade.&lt;/p&gt;

&lt;p&gt;Nessa época, essas pessoas que conheciam agiram como evangelizadores do Scrum e finalmente ele atingiu as massas. No entanto, hoje o que mais se ouve são times/pessoas que não tem a menor idéia das noções e fundamentos por trás do Scrum ou qualquer outro processo/metodologia/framework ágil dizendo que são praticantes de Scrum. Até gente que nunca participou de um projeto usando Scrum hoje vende Scrum.&lt;/p&gt;

&lt;p&gt;Isso é propaganda ruim. E propaganda ruim se multiplica muito mais rápido do que a boa. O pior da propaganda ruim é que cria-se ainda mais preconceito em cima de algo que já encontra resistência naturalmente. Isso tira todas as chances de sucesso de uma implementação de Scrum. Estou cansado de ver em todos os lugares pessoas frustradas dizendo que tentaram implantar Scrum em suas empresas e não conseguiram. Mas é claro que não! O filme do Scrum já está queimado. Você vai falhar antes mesmo de tentar.&lt;/p&gt;

&lt;p&gt;Já faz um tempo que eu parei de vender a idéia de usar Scrum. Desde então eu digo que eu procuro executar práticas ágeis. Soa mais leve, mais simples. O pré-conceito diminui dessa forma e a resistência também. Do que importa se meu facilitador chama Gerente de Projetos ou Scrum Master? As pessoas se preocupam mais com nomes do que com resultados e esse é o problema. Agilidade é o que há, mas funciona melhor sem rótulos.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Verbos HTTP: GET e POST. Você sabe mesmo a diferença?</title>
   <link href="http://blog.tucaz.net/2009/11/22/verbos-http-get-e-post-voce-sabe-mesmo-a-diferenca"/>
   <updated>2009-11-22T21:23:51+00:00</updated>
   <id>http://blog.tucaz.net/2009/11/22/verbos-http-get-e-post-voce-sabe-mesmo-a-diferenca</id>
   <content type="html">&lt;p&gt;Até pouco tempo atrás quando eu fazia entrevistas a fim de contratar desenvolvedores, não importando o nível, eu fazia a mesma pergunta: &quot;Você sabe a diferença entre GET e POST em uma request HTTP?&quot;. Por incrível que pareça poucas pessoas sabiam responder. Na maioria das vezes alguém que se considerava um desenvolvedor web não tinha a menor idéia  sobre o que eu estava falando. Acho que era culpa do RH que fazia uma pré-seleção muito ruim, mas anyway...&lt;/p&gt;

&lt;p&gt;Hoje essa informação já chegou a maioria dos desenvolvedores web (já era hora, não?) então a pergunta no contexto original perdeu um pouco a validade. Todo mundo sabe que enviar formulários via GET manda as informações pela querystring e que POST manda encapsulado dentro da request e bla bla bla. No entanto, com a nova &quot;moda&quot;, que acho bem bacana aliás, de REST(ful) a pergunta ganhou um contexto novo e tornou a ser válida: você sabe qual a diferença dos verbos em uma request HTTP? Não só de GET e POST, mas de todo o resto?&lt;/p&gt;

&lt;p&gt;Decidi fazer esse post rápido enquanto retomava meus estudos a respeito de WCF e assistia a um vídeo do MIX do ano passado que está no final deste post.&lt;/p&gt;

&lt;p&gt;POST não escala, GET sim. Porquê? Por causa da semântica! POST, PUT, DELETE e outros verbos são por definição non-safe e com efeitos colaterais, ou seja, é esperado que uma request usando esses verbos modifique algum recurso. Dessa forma é impossível fazer cache desse tipo de chamada. E como todos nós sabemos, sem cache = sem escalabilidade, isn't that right?&lt;/p&gt;

&lt;p&gt;Vamos tomar como exemplo uma chamada a URI imaginária: &lt;em&gt;http://meusite.com.br/usuario/novo&lt;/em&gt; passando via POST todas as informações necessárias para se criar um usuário. Se tudo correr bem, vamos receber como resposta um HTTP Status Code 201 indicando que o recurso foi criado e a URL para acessa-lo. Provavelmente algo como &lt;em&gt;http://meusite.com.br/usuário/765&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Agora a pergunta: é seguro para os intermediários dessa request tais como proxies, clientes, etc efetuarem o cache disso? Não! Imagine um usuário do sistema que utiliza esse recurso tentando cadastrar um novo usuário com os mesmos dados. Ao invés de receber uma resposta de conflito ele receberia um status 201 dizendo que o recurso foi criado. De fato o recurso foi criado, mas será que deveriamos mostrar isso pra ele quando na verdade a criação desse recurso já havia acontecido e a ação que ele executou neste momento não trouxe sucesso? Acho que não.&lt;/p&gt;

&lt;p&gt;Já o GET, por definição é cacheavel, pois não possui efeitos colaterais. Ele apenas devolve o recurso desejado sem modificar nada. Claro que isso só acontece quando bem usado, pois tem muita gente que utiliza esse verbo de maneira errada e baseado em parâmetros executa ações que deveriam ser associadas a outros verbos HTTP. Como não modifica nenhuma informação é possível efetuar o cache desse recurso com segurança.&lt;/p&gt;

&lt;p&gt;Pra quem quiser ver mais a respeito de &lt;a href=&quot;http://videos.visitmix.com/MIX09/T64M&quot;&gt;REST, GET, POST e cache, basta acessar o vídeo no site do MIX 09&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>De volta a terrinha</title>
   <link href="http://blog.tucaz.net/2009/10/29/de-volta-a-terrinha"/>
   <updated>2009-10-29T11:41:38+00:00</updated>
   <id>http://blog.tucaz.net/2009/10/29/de-volta-a-terrinha</id>
   <content type="html">&lt;p&gt;Acho que todo mundo já sabe, mas para aqueles que não sabem ainda voltei ao Brasil no mês passado. A idéia era ir para os EUA e ficar por lá, mas como nem tudo na vida são rosas tive uns problemas familiares por aqui que fizeram com que voltasse. A idéia de me mudar daqui ainda é muito forte e vai acontecer. Só teve de ser postergada um pouquinho :)&lt;/p&gt;

&lt;p&gt;Apesar de voltar pro Brasil continuo trabalhando pra HNI, mas de maneira remota, o que não deixa de ser uma experiência bem interessante dada a diferença de timezone e dificuldade de comunicação.&lt;/p&gt;

&lt;p&gt;Isso quer dizer que vou voltar a postar bastante no blog como eu fazia antes? Espero que sim, mas agora vou fazer um pouco diferente e gostaria de um feedback de quem lê pra ver se estou agradando ou não. A idéia do blog foi sempre postar coisas que eu acho interessante e conheço, mas com alguma experiência prática e opinião pessoal no assunto. Isso faz com que os posts saiam relativamente grandes e demorem muito para serem escritos (da trabalho, mesmo que o resultado final não seja o melhor do mundo! eheheh).&lt;/p&gt;

&lt;p&gt;Por conta dos problemas do dia a dia e da natureza do meu atual trabalho posts assim vão ficar um pouco mais raros, mas quero aumentar sua frequência em breve. Enquanto isso, vou compartilhar informações mais curtas, comentários menores e links que acho que valham a pena divulgar.&lt;/p&gt;

&lt;p&gt;Além disso, também estou fazendo uns tweaks no blog e um deles que já pode ser visto é o de idiomas. Quando acessarem o blog pela próxima vez via HTTP o plugin vai identificar sua origem e direcionar para os posts na lingua correspondente: inglês ou português. As duas línguas vão ficar disponíveis, mas será necessário clicar no post de outro idioma para le-lo.&lt;/p&gt;

&lt;p&gt;O endereço direto para os posts em inglês é: &lt;a href=&quot;http://blog.tucaz.net/en&quot;&gt;http://blog.tucaz.net/en&lt;/a&gt; e para os posts em português é: &lt;a href=&quot;http://blog.tucaz.net/br&quot;&gt;http://blog.tucaz.net/br&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Dessa maneira contínuo escrevendo em inglês e praticando o idioma e posso escrever também em portugûes conteúdo que acho que valha a pena apenas para nós brasileiros (como é o caso do próximo post que está na fila).&lt;/p&gt;

&lt;p&gt;Ainda não sei exatamente como os feeds vão se comportar, mas vamos descobrir em breve. :)&lt;/p&gt;

&lt;p&gt;Por último, caso encontrem problemas com o feed ou com o blog ou tenham comentários ou perguntas de qualquer natureza, &lt;strong&gt;POR FAVOR&lt;/strong&gt; me avisem pra eu melhorar/resolver o que for necessário. Okidoki?&lt;/p&gt;

&lt;p&gt;SoçarbaI guess everybody already knows, but for those who don't: I'm back to Brazil. The initial idea was to move to USA for good, but unfortunately some family matters came to show up here and I had to come back. The idea still lives and it's gonna happen, but not so soon now. I'm still working for HNI, remotely though. However, It's still a great and new experience due to timezone differences and communications problems. A lot of opportunities to learn from.&lt;/p&gt;

&lt;p&gt;Because of that, I think I won't be able to write long posts as I use to do before. Posts like that, mainly related to people and management ideas, are hard to write and take a lot of time. In this case I'm going to write smaller posts with personal opinion regarding the subjects I like and share useful information about mixed subjects without deeper thoughts. At least for now.&lt;/p&gt;

&lt;p&gt;Another thing I wanted to say is that I'm working on some blog tweaks and you already going to see a new one: multiple language plugin. Based on the HTTP request the plugin is going to identify which language should be shown to the user: English or Portuguese. I did that because I still want to write in English to reach more people and to practice the language, but there are some content that are only relevant for Brazilian people who on the majority only understands Portuguese and I want to reach these people too.&lt;/p&gt;

&lt;p&gt;All posts are still available to both languages but you will need to click on those that are not you're native language in order to ream them. The home URL of the blog is going to make the distinction between the languages but if you want to choose yourself you can access &lt;a href=&quot;../en&quot;&gt;http://blog.tucaz.net/en&lt;/a&gt; for English content and &lt;a href=&quot;../br&quot;&gt;http://blog.tucaz.net/br&lt;/a&gt; for Portuguese.&lt;/p&gt;

&lt;p&gt;So, to end this post, I want to ask you to report any errors or problems with the blog itself or with the feed (I still don't know how it's going to behave with this new plugin) and say that any questions, suggestions and complaints are more than welcome. Feel free to contact me anytime :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>(Inglês) [Book Review] Startup</title>
   <link href="http://blog.tucaz.net/2009/10/02/book-review-startup"/>
   <updated>2009-10-02T18:22:11+00:00</updated>
   <id>http://blog.tucaz.net/2009/10/02/book-review-startup</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/assets/post-images/2009/10/2709850.jpg&quot; alt=&quot;Front cover of Startup&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It's been a while since my last post. I was in USA at the time. Now I'm Brazil again. A lot of things have changed, but I will (hopefully) write about it on another entry.&lt;/p&gt;

&lt;p&gt;Right now I want to write about a book that was on my reading queue for a while: Startup by Jessica Livingston. I got this book last weekend and, truth to be told, I am a little bit frustrated with it.&lt;/p&gt;

&lt;p&gt;Before I bought it I expected to see great insights about starting a new company, making it develop and grow. But this wasn't what I got. The book follows the format of a series of interviews made with founders and co-founders of big and important companies of our time where they explain a little bit about how they started, but without any deep thoughts. Companies like Apple, Hotmail, Yahoo!, Firefox and other.&lt;/p&gt;

&lt;p&gt;So, after some moments of frustration I changed my mindset and could actually enjoy the reading. I stopped thinking about getting good insights from it and started to read it to understand how American startups worked, subject that I had a vague idea about. Now I have a little bit more information about it and it goes like this:&lt;/p&gt;

&lt;p&gt;Most American startup companies are created in college/university. Great and brilliant students get together and talk about a really nice idea. You can almost think that they can predict the future because they changed the way we use computers today, but they don't. They actually make the future happen the way they wanted. Almost always, after discussing and prototyping a bit they come up with a business plan and with this very important piece of paper in hands they go after investors. &lt;a href=&quot;http://en.wikipedia.org/wiki/Venture_capital&quot;&gt;Venture capital&lt;/a&gt; investors. People who want to risk their money in things that &lt;em&gt;might&lt;/em&gt; work in exchange of a piece of the company. Making a long story short, after a lot of work and effort they sell (or not) their companies for billions, pay back the investors and sometimes keep working for the company as an ordinary employee.&lt;/p&gt;

&lt;p&gt;Getting back to the book and startups formation, the first thing you will notice is the fact that opening a startup company has nothing to do with Brazilian reality. It won't work here the same way it does in USA. Not even close. It's all about culture and infrastructure.&lt;/p&gt;

&lt;p&gt;In USA you can find good universities (they are expensive, but also good) that teaches you a lot of new things and the basics about everything you need to know to work with computers (or whatever subject that you are studying). But we also have good universities, right? Yes we do, but the problem is that only a minor portion of our students have their studies paid by their parents, like they do. In Brazil we have to work our way through college/university and think about bringing money to our home and families. We have to worry about making a living. In my opinion this is the big difference: investment in education. We could use some of that here.&lt;/p&gt;

&lt;p&gt;While in college, American students don't have to worry about anything else other than studying. The structure offered by the government and their families makes students prosper. They have the knowledge in their hands, the supplies and tools needed to transform the knowledge into something tangible and in the end a culture of investment that makes it possible to raise large amounts of money needed to start a company and keep it breathing. We have all this guts too, but unfortunately we don't have the culture and the investments necessary to make it work.&lt;/p&gt;

&lt;p&gt;Of course we cannot take away all the quality and merit that they deserve. They have great ideas and guide our IT world. But, I would say that this only happens because they have a more fertile environment (government quality, economics, security, etc) than we do.&lt;/p&gt;

&lt;p&gt;It doesn't mean that we can't do something like that. It only means that is harder here. Thanks to our interest rates, taxes and politics. We can see that this is true by counting the number of startups in Brazil and how many companies survives after five years that they are open. I don't think I can fill my hand's fingers couting it. Can you?&lt;/p&gt;

&lt;p&gt;Although it's not a must read book I would say that is a good reading that can help you understand a little bit more about the foundations of the companies that currently rule our world when it comes to IT.&lt;/p&gt;

&lt;p&gt;Hope you enjoy!&lt;/p&gt;

&lt;p&gt;ps: Even though I was in USA for three months and studied a lot of English it still needs improvement and because of that you will find some errors in the text. If you want to help, please leave a comment when you find one. Thanks! :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>(Inglês) Basic stuff: handling exceptions in .NET</title>
   <link href="http://blog.tucaz.net/2009/07/21/basic-stuff-handling-exceptions-in-net"/>
   <updated>2009-07-21T13:19:09+00:00</updated>
   <id>http://blog.tucaz.net/2009/07/21/basic-stuff-handling-exceptions-in-net</id>
   <content type="html">&lt;p&gt;Last week we had a severe problem with exception handling in a project I'm working in. All the exceptions were being suppressed so we couldn't know what was going on when some functionality didn't work as we expected it to. This happened because a member of our team misinterpreted exception handling and put try/catch blocks in every method that he coded, but didn't put any code in the catch block.&lt;/p&gt;

&lt;p&gt;The  code spreaded everywhere looked like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;try
{
     //Aplication logic goes here
}
catch (Exception ex)
{
     string error = ex.Message;
     //No re-throw or any exception handling code. Just this.
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As soon as we discovered the problem (and who was causing it), Max (a co-worker) wrote this &quot;guide&quot; and we made sure that everybody involved in the project read it. This is pretty basic stuff, but lot's of people still don't understand it. I'll reproduce it below &quot;as is&quot; hoping that it will help you or someone you know :)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the problem?&lt;/strong&gt; Whenever an expection is trown, the code is trapping it in the catch block and it’s basically destroying it without proper handling and without escalete it in the stack (exception bubbling).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is it a problem?&lt;/strong&gt; This results in one of the worst maintenance nightmares. As the exception is being destroyed before it can be captured, bugs will become almost impossible to track in an QA/Production environment where debug is not available. Even in the development environment, chances are you’re only going to be able to track the root cause stepping through the code line by line.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do?&lt;/strong&gt; Unless you really have a need to do something specific with an exception, just let it escalete through the stack. Exceptions are usually handled at a higher level (like the user interface). Even when you need to do something with the exception, it will usally be necessary to re-throw it at the end of your code uless you’re coding the last layer (like a UI).&lt;/p&gt;

&lt;p&gt;Here are some good practice examples:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example 1:&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public string GetUser(string userName)
{
    return new DAL().GetUser(userName);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In this example the GetUser represents a intemediate layer code. As we don’t need any special handling, any exceptions resulting from the DAL method call will be simply escalted to the caller through the exception bubbling.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example 2:&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public string GetUser(string userName)
{
    try
    {
        return new DAL().GetUser(userName);
    }
    catch (Exception ex)
    {
        LogHelper.LogException(ex);
        throw;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In this case we do need to do something special about the exception. A good example would be a web service, where we should be loggin any errors, but re-throwing it to the caller so the application will be aware of it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example 3:&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;bool isValid = false;
try
{
    //Your application logic goes here
    isValid = true;
}
catch (DivideByZeroException)
{
    //Nothing needs to be done in case of an exception, this will kee the flag isValid as false
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This example illustrates a situation where you really need to destroy the exception. The Try/Catch block is being used exclusively to set a flag that depends on the result of an operation that might throw an exception, which would mean the status is invalid. Please note three important things:&lt;/p&gt;

&lt;p&gt;a) In this case it is fundamental to add a comment to the Catch block in order to let your intention clear.&lt;/p&gt;

&lt;p&gt;b) As you’re not planning to do anything special with the exception, a “catch(DivideByZeroException)” syntax is enough, since you won’t need to assign the exception to a local variable (which would generate a compilation warning about an unused variable). e.g.: catch (DivideByZeroException ex).&lt;/p&gt;

&lt;p&gt;c) In this type of scenario you’re looking for a specific exception, so make sure you’re catching only that specific type of exception and let anything else bubble up (meaning, do not use “catch { }”). Also, when catching a specific exception, there’s no need for adding extra catch for the generic exception, anything else will automatically bubble up:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;catch (DivideByZeroException)
{
    //Nothing needs to be done in case of an exception, this will kee the flag isValid as false
}
catch //There’s no need for this block
{
    throw;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Issue:&lt;/strong&gt; You re-throw the exception using the “throw Exception” syntax:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the problem?&lt;/strong&gt; This resets the exception stack trace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is it a problem?&lt;/strong&gt; The stack trace is lost and higher levels will perceive the error as being generated by your code. The main issue is the fact that it won’t allow you to track the root cause of the exception.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do?&lt;/strong&gt; The correct syntax to re-throw an exception is to simple state “throw” in your code, this way the stack trace is preserved.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;try
{
    //Application logic goes here
}
catch (Exception ex)
{
    LogHelper.LogException(ex);
    throw;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;What if you need to generate a custom exception? Same issue with the stack trace. In this case the Exception constructor provides a parameter for the inner exception that must be used:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;try
{
    //Application logic goes here
}
catch (Exception ex)
{
    LogHelper.LogException(ex);
    throw new Exception(&quot;My custom message&quot;, ex);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Issue:&lt;/strong&gt; Unnecessary use of a Catch block when all you need is to get some code running at the Finally block:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;try
{
    //Application logic goes here
}
catch
{
    throw;
}
finally
{
    //Your finally code goes here
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;What is the problem?&lt;/strong&gt; The catch block in this case is completely unecessary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is it a problem?&lt;/strong&gt; Not a big deal, but it represents unecessary lines of code that will make your code look dumb to your collegues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do?&lt;/strong&gt; Just use a Try/Finally block:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;try
{
    //Your application logic goes here
}
finally
{
    //Your finally code goes here
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;ps: methods used in the examples are using an anemic model for simplicity purposes. &lt;/strong&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>(Inglês) Leading by omission</title>
   <link href="http://blog.tucaz.net/2009/07/13/leading-by-omission"/>
   <updated>2009-07-13T10:08:42+00:00</updated>
   <id>http://blog.tucaz.net/2009/07/13/leading-by-omission</id>
   <content type="html">&lt;p&gt;Yesterday I was watching a great &lt;a href=&quot;http://www.akitaonrails.com/2009/07/07/screencast-agilidade-qualidade-e-futuro&quot;&gt;screencast made by Akita On Rails&lt;/a&gt; about agile software development and the future of software organizations and at some point he mentioned a speech named &quot;Leading by Omission&quot; that &lt;a href=&quot;http://en.wikipedia.org/wiki/Ricardo_Semler&quot;&gt;Ricardo Semler&lt;/a&gt;, CEO of &lt;a href=&quot;http://www.semco.com&quot;&gt;Semco&lt;/a&gt;, gave some time ago at MIT about nonexistence of hierarchical chain of command at Semco and how it works for them. With that kind of management system Ricardo was able to drag Semco out the down path twenty five years ago and turned his company into one of the most successful companies in their field.&lt;/p&gt;

&lt;p&gt;During the screencast, Akita also mentioned that, at Semco, the employees are responsible for defining their own salaries and they can choose who their boss is. This different way of working attracted my attention and made me search for Ricardo's speech.&lt;/p&gt;

&lt;p&gt;I found it at &lt;a href=&quot;http://mitworld.mit.edu/&quot;&gt;MIT World website&lt;/a&gt; which also holds many other videos about almost all subjects you can think of, from science to religion. I only watched Ricardo's speech, but definitely other videos are on my queue now :)&lt;/p&gt;

&lt;p&gt;The video is almost fifty minutes long and worth's every second of it. You can find &lt;a href=&quot;http://video.mit.edu/watch/leading-by-omission-9965/&quot;&gt;it here&lt;/a&gt;&lt;/p&gt;

&lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;http://video.mit.edu/embed/9965/&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;

</content>
 </entry>
 
 <entry>
   <title>(Inglês) Communicating and understanding are the keys to succeed</title>
   <link href="http://blog.tucaz.net/2009/07/08/communicating-and-understanding-are-the-keys-to-succeed"/>
   <updated>2009-07-08T00:52:21+00:00</updated>
   <id>http://blog.tucaz.net/2009/07/08/communicating-and-understanding-are-the-keys-to-succeed</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;/assets/post-images/2009/07/balanco.png&quot;&gt;&lt;img src=&quot;/assets/post-images/2009/07/balanco.png&quot; alt=&quot;Is that what you really want?&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a very simple thought once you figure it out, but it appears that most team leaders and managers didn't figure it out yet. So, I'll write explicitly and hope that some of these people out there will read it here. :)&lt;/p&gt;

&lt;p&gt;In order to achieve a goal through team work&lt;strong&gt;[1]&lt;/strong&gt;, the manager, or whoever is responsible for that, has to make his team understand three things: &lt;strong&gt;what exactly they are supposed to do&lt;/strong&gt;, &lt;strong&gt;why they have to do it&lt;/strong&gt; and what is the unacceptable result or, in other words, &lt;strong&gt;what they can't do&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It's really simple, but I only realized that this is an universal truth one year ago when my first agile attempt failed. After that, I spent a lot of time thinking why it went out that way. My first thought was that my team really sucked and because of that they were unable to do what I expected them to do. But after some time I realized that my team was very good technically and that the problem was my failure to properly communicate with them. I was unable to communicate them these three simple pieces of information.&lt;/p&gt;

&lt;p&gt;Since that, every time I need to lead people, I try my best to make sure that they &lt;strong&gt;really understand&lt;/strong&gt; what's going on. Because if they don't, the best result I can expect is that they'll follow my instructions as a monkey will do and, hopefully, I'll get the job done. I don't want that. I don't want to hope for something. I want to &lt;strong&gt;be sure&lt;/strong&gt; that, at least,  I'll have the best that these people can offer and don't have to review their stuff all the time to make sure they got it right.&lt;/p&gt;

&lt;p&gt;In this whole last year, I gathered some thoughts from my experiences on how to communicate these simple pieces of information and here is what I came with:_
_&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Explain how it's going down, present the context&lt;/em&gt; - &lt;strong&gt;Before any movement&lt;/strong&gt;, present the general idea of the project&lt;strong&gt;[2]&lt;/strong&gt; to everyone that's involved in it. Don't simply tell them which tasks they are supposed to execute. Understanding the context (technical, business and political) is &lt;strong&gt;very important&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Make sure they understood&lt;/em&gt; - Ask some questions, have them presenting some ideas and thoughts about the project. If they really understood it, they'll look excited (unless the project sucks!) and you will quickly notice they got it. This feeling of understanding will be presented to you as shinning eyes. That thing we all have when it rings a bell inside our head.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Tell them how/why it works&lt;/em&gt; - Talking specifically about software now, if we need someone to solve a problem by coding something we can't just tell them how a screen or a procedure should work and expect success. To achieve it we need to fully explain why that thing should be made in this or that way. By explaining how things work we get two main benefits: 1) The act of explaining is the best way to make sure we understand about the subject ourselves and 2) We can use other's knowledge and experience to make it work even better.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Show you trust them, share responsability and authority&lt;/em&gt; - &lt;a href=&quot;http://www.akitaonrails.com/2009/07/05/off-topic-autoridade-vs-responsabilidade&quot;&gt;Akita described it very well (it's in portuguese, sorry) in his blog post&lt;/a&gt;. It's vital that who is going to execute something has the authority to fulfill the responsibility he just received.  You should &lt;strong&gt;trust and believe&lt;/strong&gt; that the responsible person is going to execute it in the best way he can and give him all freedom he needs to do his job.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Make a plan&lt;/em&gt; - Planning is a very important thing. Not because of the final plan, but because of the act of planning itself. When you plan you have to think about the subject. You have to think how it can be done, what are the risks, what more should I know that I don't know, etc. Do it together, with all team members.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Also, give limit boundaries&lt;/em&gt; - Last tip, it's important to define some boundaries to everyone that is involved, borders that they can't cross. If for any reason they can't do something or you don't want them to do something you have to explicitly tell them no to do so. Otherwise there's no way they'll know it. And of course, you have to explain why they can't or shouldn't do it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I believe that these five tips can increase the success chances in almost all scenarios we face everyday dealing with teamwork and I also hope that it will help you the next time you ask for something and get it different than you imagined.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[1]&lt;/strong&gt; It doesn´t have to be a big team. I consider team work when more than one person is engaged in the same project to achieve the same goals.&lt;br/&gt;
&lt;strong&gt;[2]&lt;/strong&gt; I'm using the same definition for project that &lt;a href=&quot;http://www.davidco.com/&quot;&gt;David Allen&lt;/a&gt; does. Project is anything that needs at least two steps to be done.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>(Inglês) Almost good!</title>
   <link href="http://blog.tucaz.net/2009/07/06/english-almost-good"/>
   <updated>2009-07-06T03:33:16+00:00</updated>
   <id>http://blog.tucaz.net/2009/07/06/english-almost-good</id>
   <content type="html">&lt;p&gt;Hey!&lt;/p&gt;

&lt;p&gt;It's been a while since I wrote my last post. That's because I was a little bored of writing. But now, I think I'm good to start it again. Did you miss me? :)&lt;/p&gt;

&lt;p&gt;When I moved this blog from the old server I had some troubles during the change and I was too lazy to fix them, until today. I took a deep breath and made a fresh install of &lt;a href=&quot;http://wordpress.org/&quot;&gt;Wordpress&lt;/a&gt;. I still have to install some missing plugins, but I'm pretty confident that everything is going to work normally again.&lt;/p&gt;

&lt;p&gt;I also changed the blog template (but I guess that you can see that, right?) and during the next few days I'll still be adjusting it to look better ( I don't know if it's possible for it to look good, but I liked it anyway).&lt;/p&gt;

&lt;p&gt;So, from now on you can start waiting for regular updates again on this blog :).&lt;/p&gt;

&lt;p&gt;By the way, I gave up on my Flickr because it really sucks. So if you want to see my pictures you can go to my &lt;a href=&quot;http://picasaweb.com/tucazbr&quot;&gt;Picasa Web&lt;/a&gt;. I hope you enjoy! :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>(Inglês) Blog Maintenance</title>
   <link href="http://blog.tucaz.net/2009/05/24/blog-maintenance"/>
   <updated>2009-05-24T16:21:13+00:00</updated>
   <id>http://blog.tucaz.net/2009/05/24/blog-maintenance</id>
   <content type="html">&lt;p&gt;Today i'll be moving my blog from the current host. During this time it may be inaccessible due to DNS changes and it should take some time until new DNS are replicated. Sorry for the inconvenience.&lt;/p&gt;

&lt;p&gt;See you soon!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>(Inglês) We should fire more</title>
   <link href="http://blog.tucaz.net/2009/05/19/we-should-fire-more"/>
   <updated>2009-05-19T22:08:42+00:00</updated>
   <id>http://blog.tucaz.net/2009/05/19/we-should-fire-more</id>
   <content type="html">&lt;p&gt;Before I get to the point in this post I should say that this is my first post in English and because of that I'm sure that it's going to have a lot of mistakes. Knowing that, I would like to ask you to correct me whenever you find one of them. Ok? Let's go!&lt;/p&gt;

&lt;p&gt;I've been working as a professional developer since 2004. At that time I didn't really know anything about software development. Nowadays, almost six years later I still don't know much, but one thing I do know: only people can make a project succeed.&lt;/p&gt;

&lt;p&gt;Since I started working I talked to many people from many different companies (clients and co-workers) and for a little bit more than two years i am in a position where i can choose if we should hire someone or fire someone. During this time I've heard almost nothing about people getting fired for being a bad professional. That's a strange behavior and made me think. Why don't I see many people being fire? I think I can count on my fingers how many times I saw someone getting kicked out from a company. If we pick my team as example I can tell you that we worked approximately with thirty different people in these years and I can only remember of letting one person go.&lt;/p&gt;

&lt;p&gt;After gathering this personal experience, watching a lot of presentations and reading books and articles I realized that projects and products that were successful had one simple[1] thing in common: good people.&lt;/p&gt;

&lt;p&gt;I think that the modern companies that are full of those &quot;quality guaranteed&quot; processes (ISO, CMM, ITIL and [put another silver bullet process in here]) forget how to make people perform good on their jobs. They put too much effort in the belief that the process is enough to keep things great and forget that people doing mediocre work are very bad for business.&lt;/p&gt;

&lt;p&gt;By doing nothing to this people, we are encouraging who doesn't do a good job instead of congratulate who really does. If I stop and look backwards I'll see that i did that myself a lot of times. I saw someone on the team that was not up to his/her tasks and even seeing that I kept myself quiet. This is very harmful for everyone involved.&lt;/p&gt;

&lt;p&gt;Another reason of why it happens is laziness. Managers and leaders often see that a team member is not corresponding well but they are too lazy and accommodated to do something about it. It's easier to let things just happen than change the situation and hire someone more skilled[2] to do the job.&lt;/p&gt;

&lt;p&gt;I could seat here and write until sun shines again how a bad professional looks like, but I'm pretty sure you know how to recognize one. Everybody knows what a bad professional looks like, but still, they have jobs and they make my job (and yours, good one) more difficult.&lt;/p&gt;

&lt;p&gt;So from now on, promise yourself that you're not just going to keep the wheels spinning. Propose changes, challenge people, force them to do their best. If after all this hard work you still have a bad team member, fire him/her and give his/her place to someone who deserves it. This is the only way we can build better teams and make bad professionals go away (or improve themselves).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[1] &lt;/strong&gt;Yeah, it's pretty simple once you've figured that out.&lt;strong&gt;&lt;br/&gt;
[2]&lt;/strong&gt; By skilled I meant technical and personal skills that are very necessary to make a person able to be part of a team.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Flickr!</title>
   <link href="http://blog.tucaz.net/2009/05/14/flickr"/>
   <updated>2009-05-14T21:41:25+00:00</updated>
   <id>http://blog.tucaz.net/2009/05/14/flickr</id>
   <content type="html">&lt;p&gt;Não, esta ainda não é a volta dos meus posts técnicos. Essa semana estou me ajeitando aqui em BH então se tudo der certo volto a postar nesse fim de semana, ja que vou ter bastante tempo livre.&lt;/p&gt;

&lt;p&gt;Enquanto isso, criei uma &lt;a href=&quot;http://flickr.com/photo/tucaz&quot;&gt;conta no Flickr&lt;/a&gt; pra colocar algumas fotinhas que for tirando. &lt;a href=&quot;http://flickr.com/photo/tucaz&quot;&gt;Check it out!&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Novos ares</title>
   <link href="http://blog.tucaz.net/2009/04/30/novos-ares"/>
   <updated>2009-04-30T18:11:45+00:00</updated>
   <id>http://blog.tucaz.net/2009/04/30/novos-ares</id>
   <content type="html">&lt;p&gt;As férias estão acabando, mas o tempo acabou não sendo 100% dedicado a descanso. Quem convive comigo sabe que a algum tempo eu estava participando de um processo interno da Stefanini para uma posição em um cliente nos EUA. Eu sempre trabalhei em consultorias e tinha vontade de trabalhar em uma &quot;empresa de verdade&quot; onde o core business não fosse TI, mas sim uma ferramenta de apoio onde os projetos tem continuidade e você pode ver o monstrinho crescer. Outra vontade sempre foi morar fora do país, principalmente onde a desigualdade e as possibilidades de levar uma vida mais justa fossem maiores. E este momento chegou, foi um processo longo e cansativo, mas durante esse período de férias o resultado saiu e eu tive que começar a mexer os pauzinhos para deixar o pais.&lt;/p&gt;

&lt;p&gt;Isso mesmo. A partir da próxima semana não farei mais parte do time que ajudei a montar aqui em São Paulo. Irei para Belo Horizonte em outro escritório da Stefanini fazer um &quot;estágio&quot; com a equipe que atende a &lt;a href=&quot;http://www.hnicorp.com/&quot;&gt;HNI Corp&lt;/a&gt; aqui do Brasil para na sequência, provalvemente no final de junho, me juntar ao time in-loco da HNI em &lt;a href=&quot;http://ci.muscatine.ia.us/&quot;&gt;Muscatine&lt;/a&gt; no Iowa.&lt;/p&gt;

&lt;p&gt;A empresa onde vou trabalhar é uma das maiores fabricantes de móveis do mundo e curiosamente fica numa cidade minúscula de apenas 25 mil habitantes bem no centro dos EUA. O time da HNI, que não é pequeno, já conta com uma dúzia de brasileiros então não vou ficar completamente sozinho nesse novo ambiente. No entanto, a dor de barriga é grande, pois é uma mudança enorme deixar tudo que construi aqui no Brasil para começar uma vida nova fora do pais.&lt;/p&gt;

&lt;p&gt;Não posso afirmar com certeza se vai ser para sempre, mas a curto prazo não pretendo voltar pro Brasil (só a passeio :) ).&lt;/p&gt;

&lt;p&gt;O blog continua, mas provavelmente começarei a escrever em inglês apenas. Acredito que isso não seja um problema porque a grande maioria dos leitores aqui do blog e do público em geral de TI se vira bem no idioma. Minhas outras participações na comunidade também continuam de maneira remota e com uma experiência diferente e cheia de uma nova visão.&lt;/p&gt;

&lt;p&gt;Bão...era isso! :)&lt;/p&gt;

&lt;p&gt;Wish me luck!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Hello and Farewell!</title>
   <link href="http://blog.tucaz.net/2009/04/20/hello-and-farewell"/>
   <updated>2009-04-20T15:21:30+00:00</updated>
   <id>http://blog.tucaz.net/2009/04/20/hello-and-farewell</id>
   <content type="html">&lt;p&gt;Hmmm.... bastante tempo sem escrever já né? Quase um mês!&lt;/p&gt;

&lt;p&gt;Nestas últimas semanas muitas coisas aconteceram e não sobrou tempo e nem paciência para escrever. E olha que eu &lt;strong&gt;adoro &lt;/strong&gt;escrever, principalmente quando tem coisas legais para falar.&lt;/p&gt;

&lt;p&gt;Mas...não vai ser hoje ainda que vou escrever. Depois de três anos sem férias, finalmente saio hoje e volto 04/05. Espero voltar renovado, pois foi um ano complicado e cansativo.&lt;/p&gt;

&lt;p&gt;Meu projetinho de FTP com Rails andou e quero postar a respeito e também pude usar bastante (não o suficiente ainda) da API do Google Maps que é muitoooo legal! Na volta com certeza vou escrever sobre.&lt;/p&gt;

&lt;p&gt;E se tudo der certo...terei algumas novidades.&lt;/p&gt;

&lt;p&gt;Até lá!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Ruby on Rails e WinDBG</title>
   <link href="http://blog.tucaz.net/2009/04/03/ruby-on-rails-e-windbg"/>
   <updated>2009-04-03T23:46:39+00:00</updated>
   <id>http://blog.tucaz.net/2009/04/03/ruby-on-rails-e-windbg</id>
   <content type="html">&lt;p&gt;Não, não, não! Uma coisa não tem nada a ver com a outra. Não é um post falando de como debuggar rails utilizando o WinDBG. Mas um único post dando dicas de boas referências sobre o assunto.&lt;/p&gt;

&lt;p&gt;Ultimamente não tenho mexido muito em código. Na verdade não tenho visto nada técnico, pois estou atolado de propostas pra fazer (quem mandou não estudar? :) ). Mas...hoje quando cheguei em casa decidi que iria dedicar algum tempinho para mexer em algo interessante e diferente. Foi ai que topei primeiro com rails que eu já queria começar a estudar e depois com o WinDBG numa dica que veio do Twitter do &lt;a href=&quot;http://twitter.com/nbrtec&quot;&gt;André Nobre&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ruby on Rails&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Há alguns dias instalei o ubuntu em uma VM aqui em casa e montei todo o ambiente Rails para começar a fuçar. Apesar de ainda não ter concluído e contrariando as dicas do &lt;a href=&quot;http://www.rafaelrosafu.com/&quot;&gt;Rafael Rosa&lt;/a&gt; que disse para eu fazer algo mais simples, iniciei a construção de um programinha de FTP web em Rails. Na verdade, hoje eu parei num &quot;Hello World&quot;. De qualquer forma, para quem está curioso para começar a mexer e ver o poder da ferramenta decidi disponibilizar alguns links que eu já havia encontrado e que o Rafa me passou. Ai vai:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.rubyinside.com.br/&quot;&gt;RubyInside&lt;/a&gt; - Maior portal Brasileiro sobre notícias de Ruby. Primo do site gringo &lt;a href=&quot;http://www.rubyinside.com&quot;&gt;http://www.rubyinside.com&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://railscasts.com/&quot;&gt;RailsCasts&lt;/a&gt; - Diversos screencasts gratuitos a respeito de Rails. Cobre diversos assuntos com exemplos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.zenspider.com/Languages/Ruby/QuickRef.html&quot;&gt;RubyQuickRef&lt;/a&gt; - Site contendo uma referência rápida as classes de Ruby.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://guides.rubyonrails.org/&quot;&gt;Rails Guides&lt;/a&gt; - Segundo o Rafa, site que contém guias obrigatórios para os Railers que além de ensinar a programar em RoR, ensina &quot;in the rails way&quot;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://api.rubyonrails.org/&quot;&gt;Rails API&lt;/a&gt; - Toda documentação da API do Rails.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.ruby-doc.org/core/&quot;&gt;Ruby API&lt;/a&gt; - Toda documentação da API do Ruby.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Micro-tutorial Rails &lt;a href=&quot;http://www.akitaonrails.com/2008/11/10/micro-tutorial-de-ruby-parte-i&quot;&gt;Parte 1&lt;/a&gt;, &lt;a href=&quot;http://www.akitaonrails.com/2008/11/10/micro-tutorial-de-ruby-parte-ii&quot;&gt;Parte 2&lt;/a&gt; e &lt;a href=&quot;http://www.akitaonrails.com/2008/11/10/micro-tutorial-de-ruby-parte-iii&quot;&gt;Parte 3&lt;/a&gt; - Micro-tutorial sobre Ruby no blog do AkitaOnRails. Desde o básico até alguns conceitos avançados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.akitaonrails.com/2009/01/12/o-melhor-ambiente-windows-para-rails&quot;&gt;Montando ambiente Rails em Windows&lt;/a&gt; - Tutorial ensinando a montar o melhor ambiente Rails em Windows também do AkitaOnRails.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.rafaelrosafu.com/&quot;&gt;Blog do Rafael Rosa&lt;/a&gt; - Várias coisas a respeito de Rails e também de Asp.NET MVC :)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Esses são só alguns. Com certeza tem muito mais e espero colocar mais informações a respeito de Rails conforme eu for mexendo!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WinDBG&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Debuggar código é uma arte. As vezes mais difícil do que criar código do zero. Afinal, quando debuggamos código que não é nosso temos que entender o que quer dizer e as vezes é tão mau escrito que é triste de ver...&lt;/p&gt;

&lt;p&gt;Além do debug que estamos acostumados, dentro do VS existem debugs mais baixo nível que podemos fazer. Lá na CLR e no Windows, quando as fronteiras já passaram nossa aplicação. Praticamente coisa de louco!&lt;/p&gt;

&lt;p&gt;Não é um assunto simples, nem tão pouco fácil de aprender. Há alguns meses navegando nos blogs da Microsoft encontrei o blog da &lt;a href=&quot;http://blogs.msdn.com/tess/&quot;&gt;Tess Fernandes&lt;/a&gt; que é engenheira da Microsoft. A menina é du mau e ela fala basicamente de debugging e assuntos relacionados a performance. O problema é que muito dos tópicos sobre debug que ela aborda são muito avançados para newbies como eu.&lt;/p&gt;

&lt;p&gt;Ai é onde entra o blog do &lt;a href=&quot;http://weblogs.asp.net/andrenobre/&quot;&gt;André Nobre&lt;/a&gt; que já tem &lt;a href=&quot;http://weblogs.asp.net/andrenobre/archive/tags/WinDBG/default.aspx&quot;&gt;diversos posts&lt;/a&gt; em português e em um nível iniciante para ajudar as mentes mais ignorantes neste assunto como é meu caso. Alguns dos posts inclusive são em formato de screencast com demos. Vale a pena conferir para aprofundar um pouquinho mais nesse assunto e conhecer uma outra alternativa para descobrir porque aquela maravilhosa aplicação que desenvolvemos não funciona como deveria. :)&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Procura-se parceiro/sócio</title>
   <link href="http://blog.tucaz.net/2009/03/25/procura-se-parceirosocio"/>
   <updated>2009-03-25T18:44:56+00:00</updated>
   <id>http://blog.tucaz.net/2009/03/25/procura-se-parceirosocio</id>
   <content type="html">&lt;p&gt;Quem acompanha o blog e/ou me conhece sabe que já a algum tempo tenho várias idéias de produtos e serviços que poderiam ser oferecidos e que dariam uma graninha a médio e longo prazo. No entanto, nunca coloquei nenhuma dessas idéias em prática, mas um dia chega a hora né?&lt;/p&gt;

&lt;p&gt;Não sei se é uma coisa comum oferecer parcerias e sociedades em blog, mas como já estou chegando em quase cem assinantes (de acordo com o feedburner) acho que o público e a visibilidade são propícias. Pode ser que não de em nada, mas não custa tentar.&lt;/p&gt;

&lt;p&gt;Estou sem escrever a alguns dias, pois nesse tempo estava pensando e colocando algumas idéias no papel, maquinando como poderia arquitetar um ou outro projeto.&lt;/p&gt;

&lt;p&gt;O que eu preciso então? Qual a idéia do parceiro/sócio?&lt;/p&gt;

&lt;p&gt;Desde sempre, fui e sou desenvolvedor de software, mas nunca tive muito tato para design, usabilidade e marketing. Acho que essas áreas de conhecimento são fundamentais para qualquer oferta de sucesso, pois não adianta de nada termos o melhor produto do mundo se ele não for fácil de usar, bonito e tiver um bom apelo comercial. Portanto, procuro alguém com essas habilidades para formar uma parceria para trabalhar com produtos e serviços web. Por conta disso, quem quiser tem que gostar muito da coisa.&lt;/p&gt;

&lt;p&gt;Neste momento, não consigo oferecer nenhum incentivo financeiro ou prometer qualquer retorno em curto prazo, mas é por isso que procuro alguém para trabalhar &lt;strong&gt;junto&lt;/strong&gt; comigo e não &lt;strong&gt;para&lt;/strong&gt; mim.&lt;/p&gt;

&lt;p&gt;Tudo que posso oferecer é muita vontade em construir algo próprio e boas idéias. :)&lt;/p&gt;

&lt;p&gt;Claro que qualquer necessidade financeira não muito grande que venha a ser necessária para fazer o negócio andar pode ser suprida, mas tudo com muita calma.&lt;/p&gt;

&lt;p&gt;A preferência é para as pessoas que forem de São Paulo, pois é onde moro e dessa forma ficaria muito mais fácil tocar o negócio. Não que seja impeditivo trabalhar com alguém de fora, mas com certeza será mais um desafio a ser vencido.&lt;/p&gt;

&lt;p&gt;Se alguém tiver interesse e vontade de ser dono do próprio nariz dentro de algum tempo favor entrar em contato por &lt;a href=&quot;mailto:%20me@tucaz.net&quot;&gt;email&lt;/a&gt; ou me adicionar no MSN para conversarmos.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Pré venda, negociação e propostas em Modelo Ágil. Como fazer?</title>
   <link href="http://blog.tucaz.net/2009/03/14/pre-venda-negociacao-e-propostas-em-modelo-agil-como-fazer"/>
   <updated>2009-03-14T16:11:16+00:00</updated>
   <id>http://blog.tucaz.net/2009/03/14/pre-venda-negociacao-e-propostas-em-modelo-agil-como-fazer</id>
   <content type="html">&lt;p&gt;Ontem participei de um evento da &lt;a href=&quot;http://www.stefanini.com.br&quot;&gt;Stefanini &lt;/a&gt;sobre agilidade junto com o &lt;a href=&quot;http://anascimento.wordpress.com&quot;&gt;André&lt;/a&gt;, &lt;a href=&quot;http://amagno.blogspot.com/&quot;&gt;Alexandre Magno&lt;/a&gt; da &lt;a href=&quot;http://adaptworks.com.br/&quot;&gt;Adaptworks&lt;/a&gt; e &lt;a href=&quot;http://fabiokung.com/&quot;&gt;Fábio Kung&lt;/a&gt; da &lt;a href=&quot;http://www.caelum.com.br/&quot;&gt;Caelum&lt;/a&gt; e como não podia deixar de ser, esse assunto surgiu: como vender este tipo de serviço? Como elaborar propostas que estejam alinhadas com modelo ágil e que não exponham exclusivamente o fornecedor e ao mesmo tempo sejam atrativas ao cliente? Infelizmento como esperado, não existe resposta exata para essa pergunta (ainda?).&lt;/p&gt;

&lt;p&gt;No entanto, existem algumas abordagens que podemos utilizar a fim de chegar em um consenso. Vou falar um pouquinho a respeito e se alguém tiver algo a contribuir, será melhor ainda.&lt;/p&gt;

&lt;p&gt;Atualmente vendemos software na ilusão de que alcançaremos prazo, custo e escopo sem surpresas. Mas... isso não é verdade. Nunca foi. Trabalhar dessa maneira, a não ser que seja em um ambiente conhecido e extremamente controlado quase sempre nos leva a fracassar em um desses pontos, quando não em todos.&lt;/p&gt;

&lt;p&gt;O ideal nesse caso, é sentar com quem vende, com quem elabora contratos, com a área jurídica e com quem executa e procurar o modelo ideal para sua oferta de agilidade. Scrum, XP, MSF são apenas modelos de gerenciamento de projetos e engenharia, que não dizem como realizar essa venda. Isso não é o papel dessas ferramentas. Cada empresa deve encontrar sua forma de trabalhar essas ofertas.&lt;/p&gt;

&lt;p&gt;Se utilizarmos métodos ágeis e iterativos em uma proposta de escopo fechado das duas uma: ou não vamos efetivamente trabalhar de maneia iterativa, pois precisamos controlar o escopo o tempo todo ou como fornecedores  vamos tomar prejuízo, pois provavelmente o escopo será maior do que o contratado já que não conseguimos medir de maneira confiável o escopo de um projeto em tempo de proposta.&lt;/p&gt;

&lt;p&gt;Fora do Brasil um modelo de venda que já é muito aceito e difundido é o &quot;Tempo e Material&quot; (Time and Material) que é basicamente trabalhar &quot;hora aberta&quot;, ou seja, o fornecedor recebe X por cada hora trabalhada. Posso afirmar com certeza que essa é a melhor maneira do fornecedor de trabalhar com metodologias ágeis já que não temos um cronomêtro financeiro em contagem regressiva. Mas será que essa é a melhor maneira pro cliente? Muitos deles dizem que sim, pois se a consultoria aplicar realmente um modelo ágil é fácil medir e verificar se o trabalho está sendo feito e se está sendo feito de maneira adequada atendendo as expectativas e objetivos do cliente. O problema é que nosso mercado, principalmente as repartições públicas, não estão preparadas para isso, ainda. Fornecedores e clientes ainda não se entenderam a ponto de confiarem uns nos outros e acreditar que esse modeo colaborativo funciona melhor do que o baseado em documentos que-me-protegem-de-qualquer-mudança ao qual estamos acostumados. Enquanto isso não acontece (e tenho fé que vai acontecer!) temos que continuar vendendo e comprando e trabalhando para alcançar os objetivos do cliente.&lt;/p&gt;

&lt;p&gt;Para diminuir um pouco esse medo dos clientes de serem enganados e gastarem demais e diminuir o risco do fornecedor na presação de serviços existem algumas coisas que podemos fazer.&lt;/p&gt;

&lt;p&gt;Uma delas é adicionar uma cláusula de fuga nestes contratos &quot;hora aberta&quot; que permite que, caso um cliente ou até mesmo o fornecedor não esteja satisfeito com o andamento do projeto, este possa cancelar o contrato sem onûs para ambos os lados. Dessa forma, é possível &quot;obrigar&quot; tanto ao fornecedor quanto ao cliente a trabalharem em conjunto, pois se qualquer um pisar na bola o outro pode sair fora num piscar de olhos.&lt;/p&gt;

&lt;p&gt;Outra maneira é elaborar um contrato de preço fixo e com tempo estimado utilizando qualquer técnica com as quais já estamos acostumados, mas não fixar completamente o escopo do projeto ou então garantir que apenas uma parte do escopo seja entregue. Talvez algo entre 60% e 80%. Isso também diminui um pouco o risco do fornecedor em dar um preço fechado e ao mesmo tempo garante ao cliente que ele terá seu sistema desenvolvido com um método de qualidade mesmo sem ter 100% de escopo definido em proposta entregue. Na verdade, muitas vezes isso nem é necessário já que o &lt;a href=&quot;http://pt.wikipedia.org/wiki/Princ%C3%ADpio_de_Pareto&quot;&gt;principrio de pareto&lt;/a&gt; afirma que 80% dos benefícios gerados por um sistema são proporcionados por apenas 20% das funcionalidades.&lt;/p&gt;

&lt;p&gt;Seja qual for a maneira que você trabalha, o mais importante é estar alinhado com seu cliente e trabalhar de maneira honesta e transparente porquê se você for sinero e honesto e realmente ajudar seu cliente a atingir seus objetivos, ele provavelmente não irá te deixar na mão. Isso também vale para clientes. Se você ajudar seu fornecedor e não procurar tirar vantagem de contratos que obriguem ele a ter prejuízo com certeza ele não irá faltar com você e te ajudará a crescer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Referências adicionais&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.erudio.com.br/&quot;&gt;José Papo Website&lt;/a&gt; - Apresentações e informações a respeito de contratos ágeis&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.improveit.com.br/br/xp/praticas/contrato&quot;&gt;Improve IT&lt;/a&gt; - Modelo de contrato ágil&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Como gerenciar versões de banco de dados - Parte 2</title>
   <link href="http://blog.tucaz.net/2009/03/08/como-gerenciar-versoes-de-banco-de-dados-parte-2"/>
   <updated>2009-03-08T00:42:17+00:00</updated>
   <id>http://blog.tucaz.net/2009/03/08/como-gerenciar-versoes-de-banco-de-dados-parte-2</id>
   <content type="html">&lt;p&gt;Na &lt;a href=&quot;http://blog.tucaz.net/2009/03/01/como-gerenciar-versoes-de-banco-de-dados-parte-1/&quot;&gt;primeira parte&lt;/a&gt; falei um pouco dos problemas envolvidos no controle de versionamento de banco de dados. Agora esta na hora de apresentar alguma solução, certo? :)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apresentando Migrator.NET&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para resolver a maioria (senão todos) os problemas de versionamento de banco temos uma ferramenta maravilhosa chamada&lt;a href=&quot;http://code.google.com/p/migratordotnet/&quot;&gt; Migrator.NET&lt;/a&gt;. Essa ferramenta é um port para .NET do original em &lt;a href=&quot;http://api.rubyonrails.org/classes/ActiveRecord/Migration.html&quot;&gt;Rails&lt;/a&gt;. A idéia por trás dela é bastante simples: consiste em diversos objetos (classes) versionados (da mesma maneira que código normal) contendo as instruções que devem ser executadas para gerar e/ou voltar o schema do banco de dados. Cada classe corresponde a uma instrução de alteração e contém um método Up (adicionar/avançar) e um método Down (retroceder/fallback) equivalente. Vejamos como é facil no exemplo abaixo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#region Usings

using System.Data;
using Migrator.Framework;

#endregion

namespace NetScrum.Migrations.Tables
{
    [Migration(20090209211900)]
    public class CreateTableProject : Migration
    {
        public override void Down()
        {
            Database.RemoveTable(&quot;netscrum_project&quot;);
        }

        public override void Up()
        {
            Database.AddTable(&quot;netscrum_project&quot;,
                new Column(&quot;id&quot;, DbType.Int32, ColumnProperty.Identity)
                , new Column(&quot;name&quot;, DbType.AnsiString, 100, ColumnProperty.NotNull)
                , new Column(&quot;description&quot;, DbType.AnsiString, 300, ColumnProperty.Null)
                );

            Database.AddPrimaryKey(&quot;pk_project&quot;, &quot;netscrum_project&quot;, &quot;id&quot;);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Viram? Basta referenciar a DLL &lt;strong&gt;Migrator.Framework.dll&lt;/strong&gt;, adicionar a diretiva &lt;strong&gt;using&lt;/strong&gt; criar sua classe herdando de &lt;strong&gt;Migration&lt;/strong&gt; e dar override nos métodos &lt;strong&gt;Up&lt;/strong&gt; e &lt;strong&gt;Down&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gerenciando as versões&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para gerenciar as versões e garantir que os migrations sejam executados na ordem correta, você deve utilizar o atributo &lt;strong&gt;Migration(long version)&lt;/strong&gt; decorando a classe. Você deve preenche-lo com um long contendo o timestamp no formato AAMMDDhhmmss (ano/mes/dia/hora/minuto/segundo) em que seu migration foi gerado. Ou seja, um alter table da tabela projeto, por exemplo, deve conter um valor mais novo (maior) que o create table correspondente para que o migration de create seja executado antes do alter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configurando o build&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Criar e gerenciar migrations é muito fácil. No entanto, as configurações dele são um pouquinho chatas para quem não está familizarizado com &lt;a href=&quot;http://msdn.microsoft.com/pt-br/library/0k6kkbsd.aspx&quot;&gt;MSBuild&lt;/a&gt; ou &lt;a href=&quot;http://nant.sourceforge.net/&quot;&gt;NAnt&lt;/a&gt;. Neste artigo vamos usar o MSBuild que já é nativo e eu gosto mais simplesmente por estar familiarizado.&lt;/p&gt;

&lt;p&gt;Junto com o código fonte compilado do Migrator.NET vem também o assembly &lt;strong&gt;Migrator.MSBuild.dll &lt;/strong&gt;que é onde está a o target especifico que o MSBuild precisa para executar os migrations. Este target será usado no arquivo de build (explicado mais abaixo) e deve ser configurado como o exemplo abaixo apontando para o caminho onde esta o assembly. Arquivos Migrator.Targets:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; $(MigratorTasksPath)\Migrator.MSBuild.dll
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A propriedade &lt;em&gt;$(MigratorTasksPath)&lt;/em&gt; define onde está o assembly Migrator.MSBuild.dll. O valor desta propriedade pode ser hard-coded ou então preenchida no arquivo de build conforme veremos.&lt;/p&gt;

&lt;p&gt;Por padrão, todo projeto (arquivo.csproj no caso de C#) é um arquivo de MSBuild. É possível editá-lo para incluir as configurações necessárias ao Migrations, mas cedo ou tarde é perigoso que Visual Studio o recrie ou o modifique a seu bel prazer e ai perderiamos as customizações. Portanto, prefiro criar um outro arquivo de build exclusivo para os migrations e chama-lo quando eu bem entender. Segue abaixo o arquivo NetScrum.Migrations.build:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; $(MSBuildProjectDirectory)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Este arquivo define uma série de paramêtros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;MigratorTasksPath - Caminho utilizado para apontar onde esta o target (mencionado acima). Neste caso, é preenchido pela propriedade $(MSBuildProjectDirectory) que aponta para onde o arquivo build que está sendo chamado está localizado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DatabaseVersion - Será passado via paramêtro na hora da chamada do Migrator.NET. Caso não seja informado, o valor default é -1 que indica para a última versão.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provider = Banco de dados de destino. Neste caso estamos usando SqlServer, mas Migrator.NET funciona para &lt;a href=&quot;http://code.google.com/p/migratordotnet/&quot;&gt;outros bancos também&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connectionstring -  Óbvio, né? :)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To - Recebe o valor do parametro DatabaseVersion indicando a versão de destino do migrations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Migrations - Caminho onde se encontra o assembly compilado contendo as migrations.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Existem alguns outros paramêtros que permitem uma configuração um pouco diferenciada, como por exemplo, ao invés de fornecer o assembly compilado apenas informar o caminho onde estão as classes para que o próprio Migrator.NET faça a compilação.&lt;/p&gt;

&lt;p&gt;Uma vez que tudo esteja configurado, basta ir até o command prompt, navegar até a pasta onde o arquivo.build e chamar o MSBuild passando os paramêtros conforme o exemplo abaixo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;%windir%\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe NetScrum.Migrations.build /t:Migrate /p:DatabaseVersion=-1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Os paramêtros são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;NetScrum.Migrations.build - Nome do arquivo de build que contém as configurações do Migrator.NET&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;/t:Migrate - Target que deve ser executado. Neste caso o target de migrations :)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;/p:DatabaseVersion=-1 - Versão do banco para qual desejo ir. Caso queira ir para última versão é só informar -1. Caso queira zerar o banco (executar Down de todas as migrations) é só informar 0. No caso de ir para uma versão específica é só informar o timestamp desejado.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;É isso! Configurar a primeira vez é um pouco chato. Acertar os caminhos dos arquivo requer algumas tentativas para quem não está familizarizado com o MSBuild, mas nada muito traumático. Nos exemplos, todos os arquivos necessários (menos o assembly contendo as migrations) estavam na mesma pasta (tools) para facilitar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quem quiser ver o exemplo funcionando, basta baixar a &lt;a href=&quot;http://netscrum.codeplex.com/&quot;&gt;última versão do .NET Scrum&lt;/a&gt;. Ele contém as pastas e arquivos configurados direitinho pra funcionar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Importante&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A versão utilizada para este artigo foi a 0.8 que baixei tem uns 45 dias. Na época, apesar de compilada não estava funcionando então tive que efetuar umas pequenas correções do trunk. Não testei a versão 0.8 disponível hoje, portanto você pode &lt;a href=&quot;http://tucaz.net/downloads/Migrator_0.8.zip&quot;&gt;baixar aqui a versão 0.8 compilada e corrigida por mim&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Referências&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Até alguns dias atrás eu não tinha encontrado nenhum outro artigo a respeito deste assunto em português. Acredito que ainda não exista e esse seja o primeiro. Além das instruções básicas de banco que foram apresentadas no migration do exemplo ainda é possível criar PKs, FKs, executar Sql's open text entre outros procedimentos não descritos aqui.&lt;/p&gt;

&lt;p&gt;Vocês podem encontrar informações a respeito desses &lt;a href=&quot;http://code.google.com/p/migratordotnet/wiki/WritingMigrations&quot;&gt;procedimentos no site do projeto&lt;/a&gt; ou tirar dúvidas e perguntar aqui mesmo no blog.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Pai Rico, Pai Pobre: Resenha</title>
   <link href="http://blog.tucaz.net/2009/03/03/pai-rico-pai-pobre-resenha"/>
   <updated>2009-03-03T12:00:14+00:00</updated>
   <id>http://blog.tucaz.net/2009/03/03/pai-rico-pai-pobre-resenha</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=379064&amp;amp;sid=18912151811218730771895267&amp;amp;k5=237B319B&amp;amp;uid=&quot;&gt;&lt;img src=&quot;http://www.livrariacultura.com.br/imagem/capas1/064/379064.jpg&quot; alt=&quot;Pai Rico, Pai Pobre&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Livro meio clichê, né? Mesmo assim é muito bom!&lt;/p&gt;

&lt;p&gt;Li &lt;a href=&quot;http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=379064&amp;amp;sid=18912151811218730771895267&amp;amp;k5=237B319B&amp;amp;uid=&quot;&gt;esse livro de um pouco menos de 200 páginas escrito por Robert Kiyosaki e Sharon Lechter&lt;/a&gt; há quase dez anos atrás. No entanto, recentemente decidi le-lo novamente. Sei que nada tem a ver com o assunto do blog, mas acho super pertinente comentar a respeito do livro pelo seguinte motivo:  informática não é uma profissão regulamentada no Brasil e até onde sei a maioria dos empregados das empresas ainda é contratado na forma de pessoa júridca. CLT ainda não é uma realidade para todos e eu particularmente acho uma boa, pois acredito que cuido melhor do meu dinheiro do que o governo (mas isso é assunto pra discutir numa mesa de bar, ehhee...).&lt;/p&gt;

&lt;p&gt;Como não temos uma aposentadoria garantida pelo governo e temos salários relativamente altos em relação a outros mercados é fundamental que saibamos como cuidar de nosso dinheiro para que no futuro não tenhamos que depender de parentes, amigos ou o que é pior ainda: do governo.&lt;/p&gt;

&lt;p&gt;Pai Rico, Pai Pobre é um livro bem antigo que apresenta em uma linguagem muito simples como aumentar sua inteligência financeira para começar a caminhada a fim de atingir independência financeira. Através da história de um garoto que cresceu tendo dois pais, um rico e um pobre, é possível aprender o que é um investimento, diferenciar um ativo de um passivo e diversos outros termos que rodeiam o mundo financeiro.&lt;/p&gt;

&lt;p&gt;Além desse aprendizado, ele nos desafia a pensar se realmente trabalhar com afinco do começo ao fim da vida é a melhor opção. Existe outra? Claro que sim! Podemos colocar nosso dinheiro para trabalhar para nós. Mesmo que iniciemos com pouco dinheiro, é possível montar uma riqueza inimaginável. Afinal, os grandes donos de empresas e milionários que vemos por ai não nasceram ricos (pelo menos não a maioria) e começaram com pouco.&lt;/p&gt;

&lt;p&gt;Além deste livro, o mesmo autor escreveu uma &lt;a href=&quot;http://www.submarino.com.br/produto/1/21436022/colecao+pai+rico,+pai+pobre&quot;&gt;série de outros livros&lt;/a&gt; de mesmo assunto para apoia-lo nessa caminhada. Além dos assuntos técnicos que estudo, também estou estudando mercado financeiro, investimentos, etc, mas não pretendo ficar discutindo sobre isso aqui no blog (o objetivo do blog não é esse). Então se alguem quiser bater papo a respeito pode me contatar diretamente, ok?&lt;/p&gt;

&lt;p&gt;Enfim, a idéia do post é mais dar uma dica no sentido de que devemos aproveitar enquanto somos novos para começar a montar um patrimônio que nos permita viver bem e desfrutar a aposentadoria.&lt;/p&gt;

&lt;p&gt;Hoje tenho 22 anos, estou começando essa caminhada agora e quero me aposentar antes dos 40 para curtir um pouco da vida. E você? Quer trabalhar a vida inteira e ainda assim depender de terceiros no final da vida? Eu não quero!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Como gerenciar versões de banco de dados - Parte 1</title>
   <link href="http://blog.tucaz.net/2009/03/01/como-gerenciar-versoes-de-banco-de-dados-parte-1"/>
   <updated>2009-03-01T16:19:52+00:00</updated>
   <id>http://blog.tucaz.net/2009/03/01/como-gerenciar-versoes-de-banco-de-dados-parte-1</id>
   <content type="html">&lt;p&gt;Quando estamos desenvolvendo software, seja ele um produto com desenvolvimento contínuo (como o Wordpress, por exemplo) ou um sistema&lt;strong&gt; &lt;/strong&gt;customizado para um cliente nos deparamos com um problema no mínimo chato de resolver: gerenciar as versões do banco de dados (tabelas, procedures, etc) que evoluem ao longo do projeto. Vou apresentar a  vocês em um artigo com duas partes uma solução que tem me trazido paz e segurança nos últimos tempos e que talvez possa te ajudar também.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O problema&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Controlar o código fonte que é compilado pela nossa ferramenta de trabalho é uma tarefa que já foi bem complicada, mas que se tornou relativamente fácil com a evolução dos próprios editores de código (Visual Studio) e dos repositórios de código (&lt;a href=&quot;http://msdn.microsoft.com/en-us/teamsystem/dd408382.aspx&quot;&gt;TFS&lt;/a&gt;, &lt;a href=&quot;http://subversion.tigris.org/&quot;&gt;SVN&lt;/a&gt;, &lt;a href=&quot;http://www.nongnu.org/cvs/&quot;&gt;CVS&lt;/a&gt;, etc). No entanto, não podemos dizer o mesmo dó código fonte que utilizamos para nossa aplicação acessar  bancos de dados. Na maioria da vezes esse código não é compilado e por mais que existam checagens de sintaxe os erros tendem a aparecer na hora que estamos desenvolvendo a versão 2.1 do sistema e precisamos recuperar versão 1.5 para corrigir bugs. Isto, quando esse controle é feito de alguma forma e esse processo é possível, pois na maioria das vezes tudo que as pessoas mantém são os dados no próprio &lt;a href=&quot;http://pt.wikipedia.org/wiki/Sistema_de_gerenciamento_de_banco_de_dados&quot;&gt;SGBD &lt;/a&gt;sem nenhum controle de versão.&lt;/p&gt;

&lt;p&gt;Gerenciar a versão do banco de dados quer dizer que no momento em que eu recuperar a versão XYZ do meu sistema também vou conseguir recuperar os artefatos de banco (tabelas, procedures, triggers, etc) correspondentes a esta versão, restaurando desta forma o sistema em um ponto estável tanto do ponto de vista de estrutura quanto do ponto de vista de dados.&lt;/p&gt;

&lt;p&gt;Além dos pontos falhos óbvios que essa falta de controle apresenta existe mais um problema que considero grave e que, inclusive prejudica a aplicação de práticas ágeis como integração contínua e testes automatizados. Existindo a necessidade de efetuar esse controle de maneira manual fica impraticável a execução dessas práticas, pois para executá-las durante todo o tempo &lt;strong&gt;tudo&lt;/strong&gt; (incluindo os scripts de banco de dados) que compõe o sistema deve permitir automatização.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;As opções existentes
&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;É claro que não posso falar por toda a comunidade de desenvolvimento Microsoft, mas  a grande maioria dos projetos que já participei ou conversei a respeito com outros colegas de plataforma tinha pouquissimo (não confiável) ou nenhum controle deste tipo. Geralmente as pessoas efetuam este tipo de controle de duas formas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Como se fosse código-fonte normal&lt;/em&gt; - Scripts de create table, procedures e demais artefatos são mantidos em diversos arquivos SQL (ou em um linguição) no repositório de código e o desenvolvedor utiliza eles na hora em que precisa avançar ou restaurar uma versão. O maior problema desta técnica é que como o desenvolvedor não precisa efetivamente gerar scripts de banco de dados para modificar o banco, pois pode faze-lo pela ferramenta RAD com arrasta-estica-e-puxa dificilmente ele gera esses scripts depois da primeira vez e mais raramente ainda ele gera esses scripts de maneira correta. No final, temos uma salada de scripts: alguns utilizando alter table, outros modificando um script de create já existente, diversas versões da mesma procedure e possívelmente nenhum daqueles scripts de carga feitos pelo joãozinho no começo do projeto. Dessa forma, é impossível ir para a versão de banco de dados desejada de maneira fácil e sem dores de cabeça.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Mantendo tudo no banco de dados&lt;/em&gt; - A maioria dos desenvolvedores, infelizmente, se preocupa pouquissimo com o futuro do projeto e estão preocupados apenas com suas tarefas atuais. Dessa forma, qualquer atalho para terminar uma tela mais rápido é bem vindo, mesmo que este atalho cause um grande problema no futuro. Por este motivo, muitas pessoas mantem a estrutura de banco de dados apenas no SGBD. Alguns projetos inclusive não tem nem um modelo de dados em uma ferramenta como o ErWin ou DBDesigner por exemplo. Agora vamos imaginar que por algum motivo o banco de dados de desenvolvimento foi pro espaço. Se não tiver alguém da equipe que mantem um backup local o projeto está perdido. Possívelmente milhões $$$ perdidos por preguiça e falta de organização.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;A Microsoft tentou no &lt;a href=&quot;http://msdn.microsoft.com/pt-br/library/aa833253.aspx&quot;&gt;Visual Studio Team System Database Edition&lt;/a&gt; com o projeto de banco de dados (somente para SqlServer) uma alternativa a essas maneiras, mas infelizmente não obteve sucesso. A idéia é manter um projeto que por meio de um banco de dados local simula a compilação dos scripts diminuindo os erros de deploy. No entanto, todo este processo é lento, obriga o desenvolvedor a ter um SqlServer instalado localmente e tem uma série de limitações como não poder acessar outros bancos diferentes do banco com qual o sistema trabalha e de outros providers (Oracle, MySql, etc.). Ainda não testei o VSTS 2010, mas não acredito que seguindo esta receita seja possível obter muito sucesso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A solução&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para resolver este problema, o ideal seria que pudéssemos tratar dos objetos de banco da mesma maneira que tratamos os objetos do nosso sistema. Objetos que compilam efetivamente nos oferecem mais segurança, ainda mais se estes forem construidos utilizando uma API simples e padronizada que possibilite o deploy em bancos distintos. Melhor ainda se o desenvolvedor não precisar ter muito trabalho para efetuar este controle, pois se o processo exigir muito trabalho ninguém irá utilizá-lo.&lt;/p&gt;

&lt;p&gt;No &lt;a href=&quot;http://blog.tucaz.net/2009/03/08/como-gerenciar-versoes-de-banco-de-dados-parte-2/&quot;&gt;próximo post&lt;/a&gt;, vou falar sobre o &lt;a href=&quot;http://code.google.com/p/migratordotnet/&quot;&gt;Migrator.NET&lt;/a&gt; que oferece essas características que apresentei no paragráfo anterior de uma maneira rápida e fácil de usar. :)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.tucaz.net/2009/03/08/como-gerenciar-versoes-de-banco-de-dados-parte-2/&quot;&gt;Link para parte 2&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Channel 9 Brasileiro</title>
   <link href="http://blog.tucaz.net/2009/02/21/channel-9-brasileiro"/>
   <updated>2009-02-21T16:57:18+00:00</updated>
   <id>http://blog.tucaz.net/2009/02/21/channel-9-brasileiro</id>
   <content type="html">&lt;p&gt;Essa vale repassar. Agora temos a &lt;a href=&quot;http://channel9.msdn.com/brasil/&quot;&gt;versão brasileira do Channel 9;&lt;/a&gt; ponto central para acompanhar vídeos e podcasts em português. :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Impulsionando a produtividade pessoal: conhecendo GTD</title>
   <link href="http://blog.tucaz.net/2009/02/18/impulsionando-a-produtividade-pessoal-conhecendo-gtd"/>
   <updated>2009-02-18T22:27:39+00:00</updated>
   <id>http://blog.tucaz.net/2009/02/18/impulsionando-a-produtividade-pessoal-conhecendo-gtd</id>
   <content type="html">&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Era uma vez um cara que não conseguia desligar sua cabeça das atividades que tinha que fazer. O tempo todo ele ficava pensando no que tinha que fazer e principalmente no que estava deixando de fazer. Um dia esse cara ficou louco e largou tudo!&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=833691&amp;sid=18912151811218730771895267&amp;k5=2E8E9658&amp;uid=&quot;&gt;&lt;img src=&quot;/assets/post-images/2009/02/gtd_livro.jpg&quot; class=&quot;book-cover&quot; &gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quem é que nunca se sentiu assim? Seja durante um projeto, uma fase ruim da vida ou mesmo durante todo o tempo. Há cerca de um mês atrás eu estava me sentindo dessa forma (isso não quer dizer que eu não precise de férias :) ). Só que antes de ficar louco e largar tudo como na historinha acima decidi fazer alguma coisa a respeito. Foi quando encontrei uma técnica fabulosa chamada GTD oriunda do inglês &lt;em&gt;Getting Things Done&lt;/em&gt; traduzida livremente em português para &lt;em&gt;Fazendo as coisas acontecerem&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Quando você tem projetos que de alguma maneira participa ou atividades/objetivos/metas que deve cumprir (com certeza todos nós temos vários) é inevitável que sua mente fique ligada tomando conta disso tudo pra você. O problema é que nesse ponto nosso cerébro não é tão inteligente assim e lembra você de coisas que você tem que fazer, mas geralmente nas horas erradas.&lt;/p&gt;

&lt;p&gt;De que adianta meu cerébro me lembrar de fazer a matrícula da faculdade hoje se as inscrições serão abertas apenas em junho? De que adianta ele me lembrar de comprar fraldas no momento que já cheguei em casa vindo do super mercado? &lt;strong&gt;Não adianta de nada!&lt;/strong&gt; Dessa maneira, apenas problemas são causados e o resultado é que você fica ligado o tempo todo sem descanso por nem um minuto.&lt;/p&gt;

&lt;p&gt;Mas por que isso acontece? Porque o cerébro não conhece nenhum sistema externo a ele em que confie para fazer esse controle. Enquanto não houver um sistema em que onfie, ele irá fazer esse trabalho (que percebemos que ele não faz muito bem...). É ai onde entra uma técnica que possibilite seu cerébro relaxar e ao mesmo tempo te manter no controle &lt;s&gt;isso se você ainda tiver algum&lt;/s&gt;.&lt;/p&gt;

&lt;p&gt;GTD é uma técnica de administração de tempo e de produtividade criada por &lt;a href=&quot;http://www.davidco.com/&quot;&gt;David Allen&lt;/a&gt; que tem como objetivo limpar sua mente e deixa-lo num estado de controle relaxado, sem neuras e stress.&lt;/p&gt;

&lt;p&gt;O fluxo é bastante simples e pode ser visto na figura mais abaixo. São basicamente 5 etapas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Coletar&lt;/strong&gt; - É a primeira parte do processo. Neste momento você deve pegar &lt;strong&gt;absolutamente tudo&lt;/strong&gt; que tem a fazer e colocar em um lugar, algo como uma caixa de entrada. Você pode usar uma caixa literalmente ou então uma ferramenta no seu computador. Eu recomendo a utilização de um compartimento físico, pois representa efetivamente a realidade e não apenas uma abstração. Pros itens &quot;virtuais&quot; que devem ser processador você pode criar um cartão e colocar dentro da caixa. A partir do momento que você inicia a aplicação da técnica tudo de novo que surgir deve ir para sua caixa de entrada. Desde contas a pagar até uma ligação que você deve fazer para um amigo no dia de seu aniversário.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processar&lt;/strong&gt; - Se você coletou direitinho seu itens, neste momento você deve ter uma enorme pilha de coisas a executar. O problema é que nem tudo é passivel de ação neste momento. Algumas coisas você precisa fazer em determinada data, outras dependendem de terceiros e outras você não quer fazer em um futuro próximo, por exemplo. Isto é processar. Você vai parar 1 minuto e pensar o que fará com cada um dos itens.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Organizar&lt;/strong&gt; - Uma vez decidido o que fazer com o item, você deve organizá-lo em um dos locais apropridados. Podem ser:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Lixeira - Isso não serve pra nada? Não consegue ver valor? &lt;strong&gt;Lixo!&lt;/strong&gt; Não tenha dó, pois dessa maneira você só irá acumular tranqueiras.&lt;/li&gt;
&lt;li&gt;Algum dia/Talvez - &quot;Viajar para acapulco no México&quot;. Não é algo que você possa fazer agora, mas quer fazer algum dia. Muito bem, vai para uma lista exclusiva para esse tipo de itens.&lt;/li&gt;
&lt;li&gt;Referências - Seu amigo te passou um artigo super interessante que você não irá usar no momento, mas pode vir a servir para alguma coisa? Coloque-o em uma pasta só para consultar futuras.&lt;/li&gt;
&lt;li&gt;Fazer agora - Você precisa ligar para sua namorada avisando que precisa da ajuda dela no final de semana. Isso demora menos do que dois minutos. Então faça agora mesmo!&lt;/li&gt;
&lt;li&gt;Delegar - Isso não depende de você, mas você precisa saber do resultado ou acompanhar por outro motivo. Coloque em uma lista separada, delegue ao responsável e fique tranquilo.&lt;/li&gt;
&lt;li&gt;Agenda - Consulta médica daqui 30 dias. Marque no calendário (físico ou virtual). Ele vai garantir que você não se esqueça.&lt;/li&gt;
&lt;li&gt;Projetos - Existe algo que precisa de mais de uma ação física para ser completado? Talvez &quot;construir uma casinha para meu cachorro&quot;. Para executar isso você precisará orçar os materiais e fazer um plano antes de executar a construção. Essas ações devem ficar agrupadas em pastas separadas para projetos. Uma por projeto.&lt;/li&gt;
&lt;li&gt;Próximas ações - Nesta lista vai as ações que você deve executar que não encaixaram em nenhuma outra lista e que você irá fazer assim que tiver um tempo livre. Por exemplo: &quot;ler post a respeito de GTD no &lt;a href=&quot;http://blog.tucaz.net&quot;&gt;blog do Tuca&lt;/a&gt;&quot; :)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Executar&lt;/strong&gt; - Uma vez que você tenha tudo organizado chegou a hora de executar! Eu costumo começar pelo que é mais importante e depois executando a lista de &quot;Próximas ações&quot; conforme possível. É importante ter uma meta pessoal ou objetivo a ser alcançado (lembra daquelas promessas de ano novo?), pois eles podem te guiar na escolha do próximo item a ser executado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Revisar&lt;/strong&gt; - Este momento é que torna possível o funcionamento do processo. Pelo menos uma vez por semana é necessário que você tire um momento em que possa ficar tranquilo para revisar os itens da sua lista, removendo os completos, processando e organizando os novos itens e acompanhando os itens que você delegou. Eu faço este processo uma vez por dia pelo menos. Isso garante que eu não esqueça de nenhum compromisso e também que minha caixa de entrada não fique cheia.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;&lt;img src=&quot;/assets/post-images/2009/02/diagrama_gtd.gif&quot; alt=&quot;Fluxo de execução do GTD&quot; /&gt;&lt;/p&gt;

&lt;p&gt;O processo é bastante simples e você pode usar diversas ferramentas para executá-lo. Ir atrás de ferramentas é inclusive divertido e motivador. Num post futuro vou detalhar um pouco mais a respeito das ferramentas que utilizo, mas entre elas estão: o &lt;a href=&quot;http://www.rememberthemilk.com/&quot;&gt;RememberTheMilk&lt;/a&gt; para atividades virtuais e referências, um bloco &lt;a href=&quot;http://www.moleskineus.com/moleskine-reporter-notebook.html&quot;&gt;Moleskine Reporter&lt;/a&gt; para anotações e idéias para usar quando não tenho acesso ao computador e um &lt;a href=&quot;http://www.kalunga.com.br/product.asp?category%5Fdisplay%5Fname=&amp;amp;category%5Fname=C7%7CM%F3veis+%26+Equipamentos&amp;amp;catalog%5Fname=KommerceII&amp;amp;product%5Fid=665205&quot;&gt;rotulador eletrônico&lt;/a&gt; que me ajuda a organizar os itens na minha caixa física.&lt;/p&gt;

&lt;p&gt;Iniciei os estudos comprando o livro do David Allen que tem cerca de 200 páginas na &lt;a href=&quot;http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=833691&amp;amp;sid=18912151811218730771895267&amp;amp;k5=2E8E9658&amp;amp;uid=&quot;&gt;Livraria Cultura&lt;/a&gt; por R$44,00.e desde que estou aplicando o método na vida pessoal e profissional (é quase impossível separar) senti uma melhora sensível na minha organização, no cumprimento de objetivos e atividades e na concentração enquanto executo alguma coisa. Afinal, meu cerébro não precisa mais se preocupar em cuidar das minhas pendências porque tenho um sistema para isso! :)&lt;/p&gt;

&lt;p&gt;Foi um post longo e com toda a certeza não é possível passar todos os detalhes de como aplicar essa técnica, mas a idéia é mostrar por onde começar e mais importante, mostrar que existe uma maneira de manter o controle de suas atividades de uma maneira tranquila e relaxada sem precisar arrancar os cabelos (se você tiver).&lt;/p&gt;

&lt;p&gt;Além do livro, segue abaixo diversas outras referências que podem ajudar, em vídeo &lt;a href=&quot;http://www.efetividade.net&quot;&gt;inclusive.&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.efetividade.net&quot;&gt;Efetividade.NET&lt;/a&gt; - Blog a respeito de produtividade com diversas dicas e métodos para ser mais efetivo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.43folders.com/&quot;&gt;43 Folders&lt;/a&gt; - Blog americano também a respeito de produtividade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.lifehack.org/&quot;&gt;LifeHack&lt;/a&gt; - Site em inglês com dicas hacks para melhorar seu dia a dia.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://blog.tucaz.net/2009/01/19/personal-scrum-a-tecnica-pomodoro/&quot;&gt;Técnica Pomodoro&lt;/a&gt; - Outra técnica de organização que bloguei anteriormente&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;E pra finalizar um &lt;a href=&quot;http://www.youtube.com/watch?v=Qo7vUdKTlhk&quot;&gt;vídeo do próprio autor&lt;/a&gt; em uma palestra sobre GTD&lt;/p&gt;

&lt;iframe width=&quot;420&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/Qo7vUdKTlhk&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;


&lt;p&gt;Espero que gostem e aproveitem!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EDIT:&lt;/strong&gt; Produtos Moleskines até pouco tempo atrás não eram vendidos no Brasil, mas agora você pode encontrar na &lt;a href=&quot;http://www.livrariacultura.com.br/scripts/cultura/catalogo/busca.asp?tipo_pesq=titulo&amp;amp;palavra=moleskine&amp;amp;topo=livro&amp;amp;sid=01482213811211468901693653&amp;amp;k5=1C725740&amp;amp;uid=&amp;amp;lastreg=&amp;amp;parceiro=111155&quot;&gt;Livraria Cultura&lt;/a&gt;. Nas lojas físicas e online. Valeu por lembrar &lt;a href=&quot;http://www.cavalcante.net/&quot;&gt;Victor&lt;/a&gt;!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Integração Contínua com .NET</title>
   <link href="http://blog.tucaz.net/2009/02/13/integracao-continua-com-net"/>
   <updated>2009-02-13T15:30:09+00:00</updated>
   <id>http://blog.tucaz.net/2009/02/13/integracao-continua-com-net</id>
   <content type="html">&lt;p&gt;E o &lt;a href=&quot;http://twitter.com/tucaz&quot;&gt;Twitter&lt;/a&gt; já traz bons resultados! eheehe... :)&lt;/p&gt;

&lt;p&gt;O &lt;a href=&quot;http://twitter.com/brunocaimar&quot;&gt;Bruno &lt;/a&gt;acabou de me passar um link excelente que vale compartilhar com vocês aqui. &lt;a href=&quot;http://dotnet.org.za/cjlotz/archive/2008/01/15/continuous-integration-from-theory-to-practice-2nd-edition.aspx&quot;&gt;Um guideline criado por Carel Lotz com passo a passo para montar um processo de Integração Contínua completo!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have fun!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Eu no Twitter</title>
   <link href="http://blog.tucaz.net/2009/02/12/eu-no-twitter"/>
   <updated>2009-02-12T17:28:32+00:00</updated>
   <id>http://blog.tucaz.net/2009/02/12/eu-no-twitter</id>
   <content type="html">&lt;p&gt;Até então sempre subestimei esta ferramenta. Há alguns dias atrás comecei a dar uma olhada no Twitter de algumas pessoas e acabei achando bacana.&lt;/p&gt;

&lt;p&gt;No começo eu estava meio relutante, mas me passaram o add-on &lt;a href=&quot;https://addons.mozilla.org/pt-BR/firefox/addon/5081&quot;&gt;TwitterFox &lt;/a&gt;que ajuda &lt;strong&gt;muito!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Enfim, &lt;a href=&quot;http://twitter.com/tucaz&quot;&gt;estou no Twitter&lt;/a&gt;. :)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://twitter.com/tucaz&quot;&gt; Follow me!&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Como aprender TDD?</title>
   <link href="http://blog.tucaz.net/2009/02/12/como-aprender-tdd"/>
   <updated>2009-02-12T17:03:49+00:00</updated>
   <id>http://blog.tucaz.net/2009/02/12/como-aprender-tdd</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Test-driven_development&quot;&gt;Test driven development&lt;/a&gt; não é uma das práticas mais fáceis de se aprender. Por experiência própria, posso afirmar que no começo geralmente as pessoas se empolgam, mas logo -em menos de duas semanas- a empolgação foi embora assim como a escrita dos testes.&lt;/p&gt;

&lt;p&gt;Isso acontece, pois durante este período o desenvolvedor ainda está aprendendo como a coisa funciona e não tem certeza se esta dando certo ou não. Além disso, esbarramos vez ou outra em código legado que &lt;s&gt;inviabiliza&lt;/s&gt; dificulta os testes. Isso é normal, não só com TDD, mas com uma série de práticas/tecnologias que temos que aprender para melhorarmos nosso produto final.&lt;/p&gt;

&lt;p&gt;O importante é esperar este período e continuar se esforçando para que os resultados comecem a aparecer.&lt;/p&gt;

&lt;p&gt;Recentemente a InfoQ BR traduziu um &lt;a href=&quot;http://www.infoq.com/br/articles/levison-TDD-adoption-strategy&quot;&gt;excelente artigo de Mark Levision&lt;/a&gt; sobre este assunto que vale a pena conferir.&lt;strong&gt;
&lt;/strong&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Team System na quinta reunião do DotNetArchitects</title>
   <link href="http://blog.tucaz.net/2009/02/01/team-system-na-quinta-reuniao-do-dotnetarchitects"/>
   <updated>2009-02-01T21:20:23+00:00</updated>
   <id>http://blog.tucaz.net/2009/02/01/team-system-na-quinta-reuniao-do-dotnetarchitects</id>
   <content type="html">&lt;p&gt;No último sábado dia 31/01 aconteceu a &lt;a href=&quot;http://dotnetarchitects.net/dotnetarchitects/post/Quinta-Reuniao-do-grupo-Tema-Ciclo-de-vida-de-desenvolvimento-com-Team-System.aspx&quot;&gt;quinta reunião do DotNetArchitects&lt;/a&gt; com a apresentação do &lt;a href=&quot;http://blogs.msdn.com/andredias&quot;&gt;André Dias&lt;/a&gt; a respeito do Microsoft Team System. Assim que o vídeo da apresentação estiver disponível coloco por aqui.&lt;/p&gt;

&lt;p&gt;Essa, na minha opinião, foi uma das melhores reuniões do grupo até então. Acredito que por falar em um tema mais difundido do que os anteriores (Scrum e DDD) as pessoas participaram mais e houve mais discussão.&lt;/p&gt;

&lt;p&gt;Fiquei feliz, pois sem querer querendo ganhei um voucher para certificação do André que distribuiu mais um de brinde além do meu (valeu!).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Livro grátis até dia 28 - SQL Server Integration Services</title>
   <link href="http://blog.tucaz.net/2009/01/22/livro-gratis-ate-dia-28-sql-server-integration-services"/>
   <updated>2009-01-22T23:08:16+00:00</updated>
   <id>http://blog.tucaz.net/2009/01/22/livro-gratis-ate-dia-28-sql-server-integration-services</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://co1piltwb.partners.extranet.microsoft.com/mcoeredir/mcoeredirect.aspx?linkId=11195719&amp;s1=90bae0dc-2517-92f9-48c3-7d7cb9de60e&quot;&gt;&lt;img src=&quot;/assets/post-images/2009/01/imageaxd.png&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa eu peguei no blog do &lt;a href=&quot;http://unplugged.giggio.net/&quot;&gt;Giggio&lt;/a&gt;. Até dia 28 deste mês a Microsoft está disponibilizando o livro &lt;a href=&quot;http://co1piltwb.partners.extranet.microsoft.com/mcoeredir/mcoeredirect.aspx?linkId=11195719&amp;amp;s1=90bae0dc-2517-92f9-48c3-7d7cb9de60e0&quot;&gt;&quot;Sql Server 2005 - Integration Services Step by Step&quot; de &quot;grátis na faixa&quot; para download&lt;/a&gt;. É necessário um rápido cadastro e zap! É só efetuar o download.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Evento: .NET Architects Day 2009</title>
   <link href="http://blog.tucaz.net/2009/01/22/evento-net-architects-day-2009"/>
   <updated>2009-01-22T23:02:35+00:00</updated>
   <id>http://blog.tucaz.net/2009/01/22/evento-net-architects-day-2009</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;http://dotnetarchitects.net/dotnetarchitects/image.axd?picture=2009%2f1%2fimage_3.png&quot; alt=&quot;&quot; /&gt;Apesar de ter sido fundada a pouco tempo o grupo &lt;a href=&quot;http://www.dotnetarchitects.net&quot;&gt;.NET Architects&lt;/a&gt; já está a todo vapor e já vamos ter nosso primeiro grande evento presencial: &lt;a href=&quot;http://dotnetarchitects.net/dotnetarchitects/post/Primeiro-Evento-Presencial-da-Comunidade-NET-Architects.aspx&quot;&gt;&quot;.NET Architects Day 2009&quot;.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O evento está marcado para dia 25 de abril em São Paulo e provavelmente participarei com uma apresentação, mas ainda não está 100% certo.&lt;/p&gt;

&lt;p&gt;Mais informações podem ser encontradas na &lt;a href=&quot;http://dotnetarchitects.net/dotnetarchitects/page/NET-Architects-Day-2009.aspx&quot;&gt;página do evento&lt;/a&gt; e conforme a programação e informações complementares forem saindo eu divulgo por aqui.&lt;/p&gt;

&lt;p&gt;Participem e divulguem!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Personal Scrum: A técnica Pomodoro</title>
   <link href="http://blog.tucaz.net/2009/01/19/personal-scrum-a-tecnica-pomodoro"/>
   <updated>2009-01-19T18:02:21+00:00</updated>
   <id>http://blog.tucaz.net/2009/01/19/personal-scrum-a-tecnica-pomodoro</id>
   <content type="html">&lt;p&gt;Achei hoje no blog do &lt;a href=&quot;http://blog.crisp.se/henrikkniberg/&quot;&gt;Henrik Kniberg&lt;/a&gt; a indicação de uma técnica que me parece ser excelente e gostaria de indicar a leitura a todos: &lt;a href=&quot;http://www.tecnicadelpomodoro.it/docs/francesco-cirillo/2007/ThePomodoroTechnique_v1-3.pdf&quot;&gt;Controle do tempo e atividades via Pomodoro&lt;/a&gt;&lt;img src=&quot;http://blog.crisp.se/henrikkniberg/&quot; alt=&quot; &quot; /&gt;&lt;/p&gt;

&lt;p&gt;Estou terminando de ler, mas já da pra adiantar que é uma técnica de gerenciamento pessoal de atividades muito parecida com Scrum. Ela é baseada em uma lista de todo's para o dia a dia e espaços de tempos definidos e fechados para execução dessas atividades. Tudo muito simples e funcional, assim como Scrum.&lt;/p&gt;

&lt;p&gt;Vou começar usar a partir de amanhã e comento sobre os resultados posteriormente. Vale a leitura!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Vídeo: Scrum em menos de 10 minutos</title>
   <link href="http://blog.tucaz.net/2009/01/16/video-scrum-em-menos-de-10-minutos"/>
   <updated>2009-01-16T21:59:23+00:00</updated>
   <id>http://blog.tucaz.net/2009/01/16/video-scrum-em-menos-de-10-minutos</id>
   <content type="html">&lt;p&gt;Ultimamente nas apresentações que tenho feito no &lt;a href=&quot;http://www.stefanini.com.br&quot;&gt;trabalho&lt;/a&gt; e nas reuniões do &lt;a href=&quot;http://www.dotnetarchitects.net/&quot;&gt;grupo&lt;/a&gt; temos falado muito a respeito de Scrum e muitas pessoas ainda não conhecem e me perguntam a respeito. Eu já falei &lt;a href=&quot;http://blog.tucaz.net/category/metodologias/scrum-metodologias/&quot;&gt;bastante aqui&lt;/a&gt;, mas há aqueles que não tem paciência ou ainda não tem interesse suficiente pra ler tudo e se inteirar.&lt;/p&gt;

&lt;p&gt;Para essas pessoas eu trago hoje um vídeo feito pelo Hamid Shojaee que apresenta Scrum em menos de 10 minutos. Não concordo com tudo que ele fala e com certeza algumas partes fundamentais ficaram fora, mas para dar um gostinho do que Scrum é vale a pena ver.&lt;/p&gt;

&lt;p&gt;Segue o vídeo:&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/XU0llRltyFM&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;


&lt;p&gt;Outro material muito interessante de referência e complementar é um PDF famoso chamado &lt;a href=&quot;www.softhouse.se/Uploades/Scrum_eng_webb.pdf&quot;&gt;&quot;Scrum in Five minutes&quot;&lt;/a&gt;. Também vale como introdução e é rapidinho de ler.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;É importante ressaltar que estes materias são bastante básicos e não são totalmente completos. Sendo assim é fundamental procurar outras fontes de informação antes de sair fazendo de qualquer jeito e dizendo que usa Scrum. Ok? :)&lt;/strong&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Windows 7. Funciona?</title>
   <link href="http://blog.tucaz.net/2009/01/12/windows-7-funciona"/>
   <updated>2009-01-12T21:52:46+00:00</updated>
   <id>http://blog.tucaz.net/2009/01/12/windows-7-funciona</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://blog.tucaz.net/2009/01/11/windows-7-beta-disponivel-para-download/&quot;&gt;Baixei ontem o Windows 7&lt;/a&gt; e já estou usando desde então no meu HP dv2760br. A instalação foi muito rápida (acho que uns quinze minutos) e o Windows já reconheceu todos os drivers do notebook, só restando instalar os softwares adicionais controladores das frescuras do equipamento. Instalei também o Office 2007, Firefox e outros softwares menos importantes. Todos sem problemas.&lt;/p&gt;

&lt;p&gt;Tá tudo rodando 100% perfeito e estou adorando o novo SO. Muito mais bonito, rápido e fácil de usar do que o Windows XP e o próprio Windows Vista. Nessa mão a M$ acertou! Essa semana ainda vou instalar ele nas minhas outras máquinas.&lt;/p&gt;

&lt;p&gt;Portanto, fica ai a dica e o tranquilizante para os mais inseguros: podem instalar que tá bala!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Windows 7 Beta disponível para download</title>
   <link href="http://blog.tucaz.net/2009/01/11/windows-7-beta-disponivel-para-download"/>
   <updated>2009-01-11T14:00:57+00:00</updated>
   <id>http://blog.tucaz.net/2009/01/11/windows-7-beta-disponivel-para-download</id>
   <content type="html">&lt;p&gt;O pessoal da Microsoft &lt;a href=&quot;http://windowsteamblog.com/blogs/windows7/archive/2009/01/07/information-on-downloading-and-installing-windows-7-beta.aspx&quot;&gt;havia prometido&lt;/a&gt; que no dia 09/01 (sexta-feira) o Beta do Windows 7 estaria disponível para 2,5 milhões de download. No entanto, devido a procura o download foi retirado do ar e colocado novamente &lt;a href=&quot;http://windowsteamblog.com/blogs/windows7/archive/2009/01/10/here-s-where-we-stand.aspx&quot;&gt;ontem a tarde&lt;/a&gt;, só que dessa vez sem limites de número de downloads até dia 24/01 quando os download encerrarão.&lt;/p&gt;

&lt;p&gt;Esta versão do Windows é Beta então cuidado onde instalam. O trial ficará ativo até agosto de 2009 quando irá expirar.&lt;/p&gt;

&lt;p&gt;O ISO Inglês 32 bits tem 2.2GB e estou baixando neste momento!&lt;/p&gt;

&lt;p&gt;O link para download é &lt;a href=&quot;http://www.microsoft.com/windows/windows-7/beta-download.aspx&quot;&gt;http://www.microsoft.com/windows/windows-7/beta-download.aspx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>User Stories Applied - For Agile Software Development: Resenha</title>
   <link href="http://blog.tucaz.net/2009/01/05/user-stories-applied-for-agile-software-development-resenha-mike-cohn"/>
   <updated>2009-01-05T22:50:07+00:00</updated>
   <id>http://blog.tucaz.net/2009/01/05/user-stories-applied-for-agile-software-development-resenha-mike-cohn</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/User-Stories-Applied-Development-Addison-Wesley/dp/0321205685&quot;&gt;&lt;img alt=&quot;User Stories Applied - For Software Development&quot; src=&quot;/assets/post-images/2009/01/user_stories_applied.jpg&quot; class=&quot;book-cover&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ano novo! Energias parcialmente renovadas (ainda não tive as férias que quero) e tempo de terminar a leitura de alguns livros que eu não conseguia me concentrar para ler durante o mês de dezembro devido ao &lt;a href=&quot;http://www.efetividade.net/2007/11/05/burnout-lidando-com-o-esgotamento-pessoal-no-ambiente-de-trabalho/&quot;&gt;burnout&lt;/a&gt; adquirido do último projeto.&lt;/p&gt;

&lt;p&gt;Vamos lá!&lt;/p&gt;

&lt;p&gt;Desde que eu escrevo a respeito dos livros que leio eu nunca escrevi aqui no blog qual a idéia por trás dos posts de &lt;a href=&quot;http://blog.tucaz.net/category/resenhas/&quot;&gt;resenhas &lt;/a&gt;que faço e acho que esse é um ótimo post para falar a respeito.&lt;/p&gt;

&lt;p&gt;A idéia não é nunca foi escrever longos e chatos resumos de livros iguais aqueles que usávamos para as provas de literatura do colégio. Por dois motivo: &lt;em&gt;a)&lt;/em&gt; É um pé no saco fazer esse tipo de trabalho e ao invés de ter prazer ao escrever esses posts eu me sentiria entediado (sem falar no tempo que levaria) e &lt;em&gt;b)&lt;/em&gt; porque ninguém procura esse tipo de resumo (acredito eu) de livros técnicos ou relacionados a área técnica, pois o conhecimento contido nessas obras não pode ser absorvido apenas com um resumo.&lt;/p&gt;

&lt;p&gt;Acompanhando a cronologia dos meus resumos é possível conhecer também um pouquinho mais a respeito de mim e quais focos estou dando para meus estudos. Isso é legal pra eu poder ver a qualidade das leituras que fiz ao longo do tempo quando olhar pra traz e pros leitores enxergarem um ser humano por trás deste blog e não apenas mais alguém escrevendo sobre tecnologia (até coloquei uma foto minha no &lt;a href=&quot;http://blog.tucaz.net/about/&quot;&gt;about&lt;/a&gt;! :D).&lt;/p&gt;

&lt;p&gt;Outro aspecto importante que eu procuro passar nesse tipo de post é o que eu buscava quando comecei a ler o livro e se efetivamente minhas ansiedades e expectativas a respeito do assunto foram atendidas. Além desses pontos também acabo indiretamente dando feedback de onde comprei os livros e fornecendo os preços para que quem quiser possa comparar e ver se está pagando mais caro ou barato.&lt;/p&gt;

&lt;p&gt;E como não podia deixar de ser, falo um pouquinho a respeito dos pontos mais importantes do livro e que mais chamaram minha atenção.&lt;/p&gt;

&lt;p&gt;Enfim, achei que como esses posts estão entre os mais visitados no blog valia a pena esclarecer as minhas motivações.&lt;/p&gt;

&lt;p&gt;Agora é bom falar a respeito do assunto principal do post, né?&lt;/p&gt;

&lt;p&gt;Este livro escrito por &lt;a href=&quot;http://blog.mountaingoatsoftware.com/&quot;&gt;Mike Cohn&lt;/a&gt; é simplesmente &lt;strong&gt;f a n t á s t i c o! &lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Apesar de ter lido bastante a respeito deste assunto na internet e em outras referências ágeis menos específicas, desde que comecei a aplicar práticas e disciplinas ágeis, há algum tempinho atrás, eu vinha esbarrando em agluns aspectos desta técnica e não conseguia alcançar todos os benefícios oferecidos por ela.&lt;/p&gt;

&lt;p&gt;Parece que a partir do momento que comecei a ler este livro uma luz se acendeu na minha cabeça. Luz essa que iluminou e sanou as dúvidas que eu tinha sobre o assunto e também a respeito de alguns outros tópicos que eu ainda não tinha uma informação muito concreta e corroborada.&lt;/p&gt;

&lt;p&gt;Mike começa o livro falando do básico: o que são histórias, roles, personas, quando usá-las, testes de aceitaçao, como escrever histórias de qualidade seguindo o acrônimo INVEST (assunto pra outro post com certeza) e comparações com outras técnicas oferecendo inclusive uma excelente referência a respeito de casos de uso (use case). Terminar de ler essa primeira parte é mais do que suficiente pra aplicar a técnica já com um certo grau de exatidão e eficiência.&lt;/p&gt;

&lt;p&gt;Mais adiante, ele aborda priorização (explicando o excelente acrônimo MoSCoW que com certeza será assunto pra mais um post futuro), estimativas e planejamento. Estes eram assuntos que não eram muito claros em minha mente e que com certeza estão muiiiiiito mais claros agora.&lt;/p&gt;

&lt;p&gt;Mais pro final ele apresenta uma introdução rápida a respeito de &lt;a href=&quot;http://pt.wikipedia.org/wiki/Scrum&quot;&gt;Scrum&lt;/a&gt; e como utilizar as histórias em conjunto com Scrum e também uma introdução aos principais conceitos de XP.&lt;/p&gt;

&lt;p&gt;Além da qualidade e quantidade de informações a respeito de user stories, Mike ainda apresenta alguns capítulos dedicados a um case real que começa da identificação das histórias, passando pela estimativa e priorização e indo até os testes de aceitação. Essa parte é importantíssima e agrega muito porque consolida através de exemplos reais (e não aqueles exemplos bobos que esbarramos constantemente) as informações apresentadas em todo o livro.&lt;/p&gt;

&lt;p&gt;Se eu tivesse que recomendar um único livro para mudar a forma de pensar das pessoas e para que essas pessoas começassem a fazer software de uma maneira melhor, com certeza esse seria o livro. É &quot;totalmente excelente&quot;!&lt;/p&gt;

&lt;p&gt;Me empolguei tanto escrevendo sobre o livro que já ia esquecendo das informações básicas de sempre: o livro possui 268 páginas e pode ser encontrado na &lt;a href=&quot;http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=749985&amp;amp;sid=9121301681115833348642818&amp;amp;k5=24D5F6E&amp;amp;uid=&quot;&gt;Livraria Cultura&lt;/a&gt; por R$132,00 (paguei R$80,00 há dois meses atrás). Chegou no mesmo dia que comprei então pra quem não gosta de esperar é uma ótima pedida.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recomendadissímo!&lt;/strong&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Resultado da terceira reunião do grupo DotNetArchitects - Com vídeo :)</title>
   <link href="http://blog.tucaz.net/2008/12/29/resultado-da-terceira-reuniao-do-grupo-dotnetarchitects-com-video"/>
   <updated>2008-12-29T21:27:55+00:00</updated>
   <id>http://blog.tucaz.net/2008/12/29/resultado-da-terceira-reuniao-do-grupo-dotnetarchitects-com-video</id>
   <content type="html">&lt;p&gt;No último dia 13 tivemos a terceira reunião do &lt;a href=&quot;http://www.dotnetarchitects.net/&quot;&gt;grupo&lt;/a&gt; e os resultados podem ser vistos &lt;a href=&quot;http://dotnetarchitects.net/dotnetarchitects/post/Resultado-da-terceira-reuniao-DDD.aspx&quot;&gt;nesse post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Os vídeos da apresentação do &lt;a href=&quot;http://unplugged.giggio.net/&quot;&gt;Giovanni&lt;/a&gt; sobre DDD e do debate posterior também já estão disponíveis para quem não pode ir ou tem interesse no assunto assim como os slides:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apresentação&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;embed id=VideoPlayback src=http://video.google.com/googleplayer.swf?docid=-7056786168177403020&amp;hl=pt-BR&amp;fs=true style=width:400px;height:326px allowFullScreen=true allowScriptAccess=always type=application/x-shockwave-flash&gt; &lt;/embed&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Debate&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;embed id=VideoPlayback src=http://video.google.com/googleplayer.swf?docid=3055016873351250860&amp;hl=pt-BR&amp;fs=true style=width:400px;height:326px allowFullScreen=true allowScriptAccess=always type=application/x-shockwave-flash&gt; &lt;/embed&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slides&lt;/strong&gt;&lt;/p&gt;

&lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/852102&quot; width=&quot;427&quot; height=&quot;356&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px&quot; allowfullscreen&gt; &lt;/iframe&gt;


&lt;p&gt; &lt;div style=&quot;margin-bottom:5px&quot;&gt; &lt;strong&gt; &lt;a href=&quot;http://www.slideshare.net/giovanni.bassi/ddd-experincias-presentation&quot; title=&quot;DDD &amp;gt; ExperiÎÎÎncias&quot; target=&quot;_blank&quot;&gt;DDD &amp;gt; Experiencias&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/giovanni.bassi&quot; target=&quot;_blank&quot;&gt;Giovanni Bassi&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Olha como melhoramos! Em comparação com o material da &lt;a href=&quot;http://blog.tucaz.net/2008/11/27/video-da-segunda-reuniao-dotnetarchitects-com-miinha-apresentacao-online/&quot;&gt;minha apresentação&lt;/a&gt;, a gravação do áudio e vídeo já estão muito melhores.&lt;/p&gt;

&lt;p&gt;Obrigado e parabéns novamente ao pessoal da UNIP que está apoiando a gente.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>.NET Scrum - Projeto Open Source</title>
   <link href="http://blog.tucaz.net/2008/12/28/net-scrum-projeto-open-source"/>
   <updated>2008-12-28T17:16:31+00:00</updated>
   <id>http://blog.tucaz.net/2008/12/28/net-scrum-projeto-open-source</id>
   <content type="html">&lt;p&gt;Há poucas semanas, batendo papo com o pessoal do &lt;a href=&quot;http://www.dotnetarchitects.net/&quot;&gt;DotNetArchitects&lt;/a&gt;, surgiu a idéia de utilizarmos uma ferramenta de gerenciamento de projetos Scrum pra cuidar dos das nossas atividades dentro do grupo.&lt;/p&gt;

&lt;p&gt;Fui pesquisar, mas não encontrei nenhuma ferramenta gratuita web que pudessemos usar. Foi ai que surgiu o &lt;a href=&quot;https://www.codeplex.com/netscrum&quot;&gt;&lt;strong&gt;.NET Scrum&lt;/strong&gt;&lt;/a&gt;. A idéia não é construir nada pra competir com o que existe por ai, mas utilizar da idéia pra ter um laboratório e construir um projeto onde possamos aplicar o que há de mais novo em tecnologia além de boas práticas de engenharia e condução de projetos.&lt;/p&gt;

&lt;p&gt;Portanto, quem der uma olhada no projeto e quiser contribuir ou apenas acompanhar vai encontrar um ASP.NET MVC, jQuery, NHibernate usando interfaces fluentes, DDD, TDD, Spring.NET e outros frameworks e design patterns importantes para a construção de uma boa solução em .NET.&lt;/p&gt;

&lt;p&gt;Se deixarmos de lado a parte tecnológica também é possível aprender um bocado trabalhando na organização de um projeto open source. Projetos de código aberto e mantidos pela comunidade são o maior caso de sucesso de times distribuidos trabalhando juntos a fim de atingir um objetivo. Se já é difícil obter sucesso em um projeto com o time no mesmo lugar, imagine trabalhar com pessoas que você nunca viu na vida e com comunicação relativamente limitada? Um grande desafio!&lt;/p&gt;

&lt;p&gt;O &lt;a href=&quot;http://aniche.com.br/blog/&quot;&gt;Maurício Aniche&lt;/a&gt; que participa do DotNetArchitects já se juntou ao projeto pra me ajudar. Já existem alguns códigos publicados no codeplex e uma documentação miníma também. Quem quiser ajudar é mais do que bem vindo! :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Boas festas!</title>
   <link href="http://blog.tucaz.net/2008/12/24/boas-festas"/>
   <updated>2008-12-24T00:11:46+00:00</updated>
   <id>http://blog.tucaz.net/2008/12/24/boas-festas</id>
   <content type="html">&lt;p&gt;Neste último post do ano de 2008 eu quero desejar a todos os leitores os meus mais sinceros votos de boas festas!&lt;/p&gt;

&lt;p&gt;Que todos (cada um a sua maneira) aproveitem bem o Natal e Ano Novo e que o próximo ano traga apenas coisas boas (mais) pra cada um de nós.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/post-images/2008/12/boas-festas.jpg&quot;&gt;&lt;img src=&quot;/assets/post-images/2008/12/boas-festas.jpg&quot; alt=&quot;Boas festas!&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aproveitem esses dias pra dar uma descansada (eu vou!), pois ano que vem vamos ter bastante coisa nova pintando por ai!&lt;/p&gt;

&lt;p&gt;Feliz Natal a todos e próspero Ano Novo!!!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Scrum for Team System na MundoNET deste mês</title>
   <link href="http://blog.tucaz.net/2008/12/24/scrum-for-team-system-na-mundonet-deste-mes"/>
   <updated>2008-12-24T00:03:06+00:00</updated>
   <id>http://blog.tucaz.net/2008/12/24/scrum-for-team-system-na-mundonet-deste-mes</id>
   <content type="html">&lt;p&gt;&lt;img alt=&quot;Revista Mundo NET - Edição 12&quot; src=&quot;/assets/post-images/2008/12/capamnet012.jpg&quot; class=&quot;book-cover&quot;&gt;&lt;/p&gt;

&lt;p&gt;Recebi em casa e com certeza também já está nas bancas a edição número 12 (novembro-dezembro) da revista Mundo NET. Nesta edição meu artigo (escrito em conjunto com &lt;a href=&quot;http://anascimento.wordpress.com&quot;&gt;André&lt;/a&gt;) fala a respeito da utilização de Scrum junto com o Microsoft Team System como ferramenta e mais algumas dicas e cuidados que se deve ter na adoção de uma metodologia ágil como Scrum.&lt;/p&gt;

&lt;p&gt;Além da minha contribuição a revista traz ainda artigos sobre Parallels Extensions pro .NET (&lt;a href=&quot;http://blog.tucaz.net/2008/12/03/net-framework-4-universe-e-paralelismo-com-linq/&quot;&gt;que eu já comentei aqui&lt;/a&gt;), sindicalização ATOM e um super apanhado a respeito de coleções e estruturas de dados entre outros.&lt;/p&gt;

&lt;p&gt;Não sei se foi só eu ou se outros leitores também vão ter a mesma reação, mas me espantei com a qualidade da impressão desta edição e da parte gráfica da revista que ficou muito legal, diferente do que estamos acostumados a ver.&lt;/p&gt;

&lt;p&gt;Vale a pena conferir!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Hiperprodutividade em times Scrum</title>
   <link href="http://blog.tucaz.net/2008/12/17/hiperprodutividade-em-times-scrum"/>
   <updated>2008-12-17T22:23:19+00:00</updated>
   <id>http://blog.tucaz.net/2008/12/17/hiperprodutividade-em-times-scrum</id>
   <content type="html">&lt;p&gt;Acabei de assistir a uma palestra feita pelo Jeff Sutherland no &lt;a href=&quot;http://research.google.com/video.html&quot;&gt;Google Tech Talks&lt;/a&gt; entitulada &lt;a href=&quot;http://www.youtube.com/watch?v=Ht2xcIJrAXo&quot;&gt;&quot;Hyperproductive distributed Scrum teams&lt;/a&gt;&quot; onde ele apresenta estudos de casos onde times distribuidos usando Scrum alcançaram um estado que ele chama de hiperprodutivo. De acordo com Jeff, nesse estado esses times são até dez vezes mais produtivos que times padrão.&lt;/p&gt;

&lt;p&gt;Eu acredito que existem diversas formas de se executar um projeto, mas na minha humilde opinião nesta apresentação o Jeff Sutherland da a entender que Scrum é a única forma de se trabalhar e que serve pra todos os cenários e empresas. No entanto todos sabem que cada caso é um caso e que não existe uma única maneira que vai dar certo pra todos.&lt;/p&gt;

&lt;p&gt;Não sei se é meu inglês que está meio enferrujado, mas durante alguns momentos da apresentação ele me pareceu muito arrogante falando de coisas que já viu e que está acostumado a ver. Não acho que é a melhor maneira de melhorar as coisas agindo desta forma.&lt;/p&gt;

&lt;p&gt;Apesar desses dois pontos que eu não gostei muito é um excelente vídeo que acrescenta bastante no aprendizado e uso do Scrum.&lt;/p&gt;

&lt;iframe width=&quot;420&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/Ht2xcIJrAXo&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;

</content>
 </entry>
 
 <entry>
   <title>No ar novamente</title>
   <link href="http://blog.tucaz.net/2008/12/16/no-ar-novamente"/>
   <updated>2008-12-16T19:01:14+00:00</updated>
   <id>http://blog.tucaz.net/2008/12/16/no-ar-novamente</id>
   <content type="html">&lt;p&gt;Até que enfim! Estamos de volta!&lt;/p&gt;

&lt;p&gt;Desde antes de ontem o host que hospeda meu blog vivenciou alguns problemas e só voltou hoje a tarde.&lt;/p&gt;

&lt;p&gt;Peço desculpas pelo off-time, mas já passou. :)&lt;/p&gt;

&lt;p&gt;Esses dias a coisa está corrida e não posto faz alguns dias, mas até o fim dessa semana espero voltar ao ritmo normal.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Domain-Driven Design, Eric Evans - Livro gratuito na web</title>
   <link href="http://blog.tucaz.net/2008/12/12/domain-driven-design-eric-evans-livro-gratuito-na-web"/>
   <updated>2008-12-12T10:30:17+00:00</updated>
   <id>http://blog.tucaz.net/2008/12/12/domain-driven-design-eric-evans-livro-gratuito-na-web</id>
   <content type="html">&lt;p&gt;Navegando, há pouco, nas minhas feeds encontrei um &lt;a href=&quot;http://unplugged.giggio.net/unplugged/post/Livro-de-DDD-do-Evans-de-graca-na-web.aspx&quot;&gt;post que o Giovanni&lt;/a&gt; publicou recentemente oferecendo o link para o livro &quot;Domain-Driven Design: Tackling Complexity in the Heart of Software&quot; do Eric Evans disponível &lt;a href=&quot;http://books.google.com/books?id=7dlaMs0SECsC&amp;amp;printsec=frontcover&quot;&gt;gratuitamente na web através do Google Books&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Este é um dos livros que recomendo fortemente a leitura e que está na minha seção de indicados. Acredito que todo bom desenvolvedor deve dar uma boa lida, pois os benefícios oferecidos pela técnica são inúmeros.&lt;/p&gt;

&lt;p&gt;Embora eu prefira livros impressos e tenha este é uma ótima maneira de economizar e ter o livro disponível sempre que precisar para referências.&lt;/p&gt;

&lt;p&gt;Fica ai a dica! :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Terceira reunião sobre arquitetura DotNetArchitects</title>
   <link href="http://blog.tucaz.net/2008/12/11/terceira-reuniao-sobre-arquitetura-dotnetarchitects"/>
   <updated>2008-12-11T19:57:43+00:00</updated>
   <id>http://blog.tucaz.net/2008/12/11/terceira-reuniao-sobre-arquitetura-dotnetarchitects</id>
   <content type="html">&lt;p&gt;No próximo sábado (13/12/2008) , nosso grupo de arquitetura de software fará sua &lt;a href=&quot;http://dotnetarchitects.net/dotnetarchitects/post/Terceira-reuniao-e-neste-sabado.aspx&quot;&gt;terceira reunião&lt;/a&gt; (nossa! como passou rápido...).&lt;/p&gt;

&lt;p&gt;O local será o mesmo das outras vezes, na UNIP Jaguaré. Nesta semana o &lt;a href=&quot;http://unplugged.giggio.net/unplugged/post/Net-Architects-Terceira-reuniao-do-grupo-e-neste-sabado.aspx&quot;&gt;Giovanni&lt;/a&gt; irá falar um pouco a respeito de Domain Driven Design.&lt;/p&gt;

&lt;p&gt;A participação é aberta e muito bem vinda. Quem ainda não mandou seus dados pode fazer pelo blog do Giovanni ou pelo grupo do Google onde também está disponível a &lt;a href=&quot;http://groups.google.com/group/dotnetarchitects/t/86ff07c740bfc361?hl=pt-br&quot;&gt;pauta&lt;/a&gt; para próxima reunião.&lt;/p&gt;

&lt;p&gt;Na última reunião falei sobre Scrum e o&lt;a href=&quot;http://blog.tucaz.net/2008/11/27/video-da-segunda-reuniao-dotnetarchitects-com-miinha-apresentacao-online/&quot;&gt; vídeo da apresentação está disponível aqui no blog&lt;/a&gt; e no site do grupo.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>.NET Framework 4 Universe e paralelismo com LINQ</title>
   <link href="http://blog.tucaz.net/2008/12/03/net-framework-4-universe-e-paralelismo-com-linq"/>
   <updated>2008-12-03T09:21:48+00:00</updated>
   <id>http://blog.tucaz.net/2008/12/03/net-framework-4-universe-e-paralelismo-com-linq</id>
   <content type="html">&lt;p&gt;Navegando nos links da microsoft, buscando a respeito de algumas features novas que vão estar disponíveis a partir do .net framework 4.0 encontrei duas coisas especialmente interessantes que merecem ser comentadas e linkadas.&lt;/p&gt;

&lt;p&gt;Na edição deste ano do PDC foi entregue aos participantes um poster gigante com as novidades que devem vir para próxima versão do framework que deve sair ano que vem. O poster pode ser baixado por este link no blog do &lt;a href=&quot;http://blogs.msdn.com/brada/archive/2008/10/29/net-framework-4-poster.aspx&quot;&gt;Brad Adams&lt;/a&gt;. Existe também uma versão estilo google maps onde você pode dar zoom e visualizar no browser com mais facilidade do que o faria em uma imagem gigante.&lt;/p&gt;

&lt;p&gt;Antes de chegar a este link do poster assisti um &lt;a href=&quot;mms://wm.microsoft.com/ms/uk/msdn/nuggets/PFX_PLINQ_Moth.wmv&quot;&gt;webcast&lt;/a&gt; muito legal feito pelo Daniel Moth (Microsoft UK Developer) a respeito de paralelismo em queries LINQ. Hoje, quando rodamos software feito em .NET em em hardware multi-processado não conseguimos obter todo o benefício da utilização de multi processamento.&lt;/p&gt;

&lt;p&gt;Com Parallel LINQ (ou PLINQ para facilitar) será possível tirar vantagem de todas as CPUs disponíveis no equipamento para diminuir drasticamente o tempo de processamento. Na demo feita pelo Daniel o ganho ficou em torno de 50%. A melhor parte disto é que quase nenhum código é necessário para obter essas melhorias. Se você ainda não viu nada a respeito de Paralelismo vale a pena dar uma conferida no vídeo.&lt;/p&gt;

&lt;p&gt;Vou deixar também aqui alguns outros links complementares que eu peguei &lt;a href=&quot;http://blogs.msdn.com/hulot/archive/2008/09/02/computa-o-de-alto-desempenho-hpc-e-paralelismo.aspx&quot;&gt;deste post no blog do Carlos Hulot&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;mms://wm.microsoft.com/ms/uk/msdn/nuggets/PFX_TourOfSamples_Moth.wmv&quot;&gt;mms://wm.microsoft.com/ms/uk/msdn/nuggets/PFX_TourOfSamples_Moth.wmv&lt;/a&gt; - MMS Vídeo&lt;a href=&quot;mms://wm.microsoft.com/ms/uk/msdn/nuggets/PFX_TourOfSamples_Moth.wmv&quot;&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;mms://wm.microsoft.com/ms/uk/msdn/nuggets/PFX_ParallelClass_Moth.wmv&quot;&gt;mms://wm.microsoft.com/ms/uk/msdn/nuggets/PFX_ParallelClass_Moth.wmv&lt;/a&gt; - MMS Vídeo&lt;/p&gt;

&lt;p&gt;Mais referências oficiais:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/concurrency/default.aspx&quot;&gt;http://msdn.microsoft.com/en-us/concurrency/default.aspx&lt;/a&gt; - Página oficial Microsoft sobre computação paralela&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blogs.msdn.com/pfxteam/&quot;&gt;http://blogs.msdn.com/pfxteam/&lt;/a&gt; - Blog do time de desenvolvimento de Paralelismo&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Vídeo da segunda reunião DotNetArchitects com minha apresentação online</title>
   <link href="http://blog.tucaz.net/2008/11/27/video-da-segunda-reuniao-dotnetarchitects-com-miinha-apresentacao-online"/>
   <updated>2008-11-27T23:44:09+00:00</updated>
   <id>http://blog.tucaz.net/2008/11/27/video-da-segunda-reuniao-dotnetarchitects-com-miinha-apresentacao-online</id>
   <content type="html">&lt;p&gt;Conforme prometido, o Victor disponibilizou pra gente o vídeo e o &lt;a href=&quot;http://unplugged.giggio.net&quot;&gt;Giovanni&lt;/a&gt; já colocou no Google vídeos pra galera e publicou no &lt;a href=&quot;http://dotnetarchitects.net/dotnetarchitects/post/Video-da-segunda-reuniao-esta-online.aspx&quot;&gt;site do grupo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;De qualquer forma, vou colocar aqui também pra fazer mais jabá!&lt;/p&gt;

&lt;p&gt;&lt;embed flashvars=&quot;&quot; src=&quot;http://video.google.com/googleplayer.swf?docId=6643046568576792451&amp;amp;hl=en&quot; type=&quot;application/x-shockwave-flash&quot; id=&quot;VideoPlayback&quot; wmode=&quot;transparent&quot; style=&quot;width: 400px; height: 326px;&quot;/&gt;&lt;/p&gt;

&lt;p&gt;Tá, tá, tá. Eu estava nervoso no começo, mas depois a coisa fluiu melhor. :)&lt;/p&gt;

&lt;p&gt;Críticas como sempre, são bem vindas.&lt;/p&gt;

&lt;p&gt;Espero que gostem!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Práticas ágeis são consistentes e replicáveis ao longo do tempo?</title>
   <link href="http://blog.tucaz.net/2008/11/27/praticas-ageis-sao-consistentes-e-replicaveis-ao-longo-do-tempo"/>
   <updated>2008-11-27T22:43:14+00:00</updated>
   <id>http://blog.tucaz.net/2008/11/27/praticas-ageis-sao-consistentes-e-replicaveis-ao-longo-do-tempo</id>
   <content type="html">&lt;p&gt;Que as práticas ágeis funcionam, são gostosas de trabalhar e melhoram de uma forma geral o ciclo de desenvolvimento de software nós já sabemos. No entanto, existe uma dúvida: aplicar essas práticas de forma crescente, continua e de maneira comercial é possível?&lt;/p&gt;

&lt;p&gt;Pergunto isso, pois aqui no Brasil ainda não temos nenhum grande case (que eu conheça pelo menos) de empresas prestadora de serviços (as famosas consultorias) que tenham investido nesse modelo durante tempo o suficiente (aka bastante tempo) e tenham conseguido se consolidar mantendo dentro de toda a cadeia de consultores e projetos as mesmas práticas e cultura envolvidas na utilização de métodos ágeis.&lt;/p&gt;

&lt;p&gt;O motivo para isso não ter acontecido, na minha opinião, é que agilidade é um &lt;em&gt;hype&lt;/em&gt; recente e por conta disso as consultorias ainda não chegaram no momento de replicar esse conhecimento para muita gente e muito rápido. Esse conhecimento ainda está na cabeça de poucos e os projetos que estão sendo executados utilizando agilidade são coordenados por estes poucos.&lt;/p&gt;

&lt;p&gt;Mesmo em empresas &quot;de verdade&quot; (costumo chamar assim empresas &quot;não consultorias&quot; onde TI é importante, mas não é o core business) ainda não tenho certeza se isso é possível. Sei que o pessoal da &lt;a href=&quot;http://gc.blog.br/&quot;&gt;Globo.com&lt;/a&gt; obteve muito sucesso em disseminar as práticas em mais de dez equipes, mas isso aconteceu com bastante trabalho, muito coaching e depois de algum tempo. Não do dia para a noite. Não tinha como ser diferente. Nesse cenário (vou me dar a liberdade de falar uma possível bobagem) onde a equipe tem um tamanho fixo ou perto disso e a demanda é mais ou menos conhecida acredito que escalar agilidade e disseminar as práticas seja mais fácil. Mas e em um cenário onde essas informações não são conhecidas, como fazer?&lt;/p&gt;

&lt;p&gt;Como vocês sabem, trabalho em uma &lt;a href=&quot;http://www.stefanini.com.br&quot;&gt;consultoria de software&lt;/a&gt; e estamos procurando aplicar práticas ágeis no maior número de projetos que pudermos (e onde agilidade for a melhor estratégia). No entanto, estamos indo com responsabilidade, pois senão de ágil só vamos levar o nome e nada da cultura. Por conta disso, esse movimento ainda não está em seu ápice de maturidade e poucos projetos (em relação ao todo que a empresa executa) estão utilizando dessas práticas. Contudo, a demanda por essas práticas está aumentando de uma maneira gigantesca e em algum momento a cultura e as práticas vão se perder se nada for feito a respeito.&lt;/p&gt;

&lt;p&gt;Em resumo, temos um cenário onde a demanda não é conhecida nem de perto, as pessoas que farão parte dos novos projetos também não são conhecidas (pelo menos a maioria) e o tamanho das equipes e requisitos não são sabidos. Ai volto para pergunta inicial: como escalar e ainda assim obter consistência com agilidade em um curto espaço de tempo? Tenho certeza que não existe resposta mágica para essa pergunta.&lt;/p&gt;

&lt;p&gt;É por isso que estou iniciando uma pesquisa não focada em agilidade e nem em aspectos técnicos, mas sim em um assunto que eu pouco vi comentado nas minhas leituras: capacitação de equipes ágeis. Ok, ok, ok...vocês vão me dizer que tá cheio de gente por ai que ministra cursos de capacitação de equipes em Scrum, XP, etc. Só que quando falo de capacitação, não estou falando em dar um treinamento de dezesseis horas para uma equipe e deixar a bola rolar. Isso, apesar de fundamental, está longe de ser suficiente.&lt;/p&gt;

&lt;p&gt;Para inciar o estudo, estou me apoiando na experiência adquirida pela Toyota com a utilização do método de Instrução de trabalho e que está disponível em diversas literaturas onde cada um dos operários da linha de produção é um instrutor em potencial. É desse tipo de capacitação que estou falando. Executar um processo detalhado e peculiar (como são as metodologias ágeis) com a mesma precisão e qualidade em todas as pontas. Independente de gestão, equipe e localidade. Compartilhar os mesmos principíos desde o estagiário até o último nível da gestão. Para atingir esse objetivo é necessário aplicar um esforço brutal em treinamento e capacitação para que, na eventualidade, seja possível formar uma nova equipe treinada e preparada rapidamente.&lt;/p&gt;

&lt;p&gt;Portanto, se alguém tiver experiência ou conhecimento de referências sobre esse assunto peço encarecidamente que compartilhe comigo (e com todos os leitores do blog), pois tenho certeza que esse é um assunto que em breve vai dar bastante dor de cabeça para muita gente. A idéia não é ficar esperando sentado até que as práticas e o nome se deteriorem pelo mau uso, mas fazer algo a respeito.&lt;/p&gt;

&lt;p&gt;Conforme eu for avançando vou compartilhar minhas descobertas e experiências com vocês. Me desejem boa sorte. :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Retrospective: 2º reunião DotNetArchitects</title>
   <link href="http://blog.tucaz.net/2008/11/24/retrospective-2c2ba-reuniao-dotnetarchitects"/>
   <updated>2008-11-24T18:59:24+00:00</updated>
   <id>http://blog.tucaz.net/2008/11/24/retrospective-2c2ba-reuniao-dotnetarchitects</id>
   <content type="html">&lt;p&gt;Pronto...agora com um pouco mais de tempo posso comentar a respeito da nossa segunda reunião que aconteceu no último sábado dia 22/11 novamente nas instalações da &lt;a href=&quot;http://www3.unip.br/default.aspx&quot;&gt;UNIP&lt;/a&gt; Jaguaré.&lt;/p&gt;

&lt;p&gt;Nessa reunião colocamos em prática o formato que haviamos combinado onde teriamos: uma apresentação de 30 minutos com tema relacionado a alguma experiência dos membros do grupo, discussão a respeito do assunto e por último pontos que surgiram por email e que o grupo deveria discutir a respeito.&lt;/p&gt;

&lt;p&gt;A apresentação foi feita por mim e foi a respeito de como estamos adotando metodologias ageis em nossos projetos aqui na &lt;a href=&quot;http://www.stefanini.com.br/&quot;&gt;Stefanini&lt;/a&gt;. Poucos membros do grupo tiveram algum contato anterior com Scrum então a recepção do assunto foi muito boa (pelo menos foi o que pareceu pra mim...rs). Quem não conhecia ficou bastante interessado pelo assunto e desconfio que em breve iremos ter novos relatos a respeito deste assunto. Acho que consegui passar a mensagem durante a reunião, mas vale reforçar que quem precisar de apoio pode contar comigo além dos outros canais já existentes na comunidades.&lt;/p&gt;

&lt;p&gt;Um ponto interessante é que a apresentação e toda a reunião foram gravadas em aúdio e vídeo. Como foi a primeira vez que eu fiz uma apresentação gravada foi um pouco estranho no começo usar o microfone &quot;à lá Big Brother&quot;, mas depois fiquei tranquilo e correu tudo bem. Assim que os vídeos estiverem disponíveis pra download disponibilizo o link por aqui.&lt;/p&gt;

&lt;p&gt;Depois da discussão conversamos a respeito de algumas pendências que o grupo tinha e ficaram decididos os seguintes pontos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;O site do &lt;a href=&quot;http://dotnetarchitects.net/&quot;&gt;grupo&lt;/a&gt; será, pelo menos até que não sirva mais, baseado no &lt;a href=&quot;http://www.dotnetblogengine.net/&quot;&gt;BlogEngine.NET&lt;/a&gt; que inclusive já está no ar;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O período entre reuniões foi encurtado e agora acontecerão a cada três semanas sendo a próxima no dia 13/12;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O tempo da apresentação inicial aumentou pra uma hora (os trinta minutos ficaram bem apertados e eu acabei estourando na minha apresentação) e o &lt;a href=&quot;http://unplugged.giggio.net/&quot;&gt;Giovanni&lt;/a&gt; vai falar sobre &lt;a href=&quot;http://en.wikipedia.org/wiki/Domain-driven_design&quot;&gt;DDD&lt;/a&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Por último, mas nao menos importante, tivemos o nosso almoço! Como o grupo ainda está se formando e as pessoas não se conhecem muito foi bem legal e pudemos conversar a respeito de diversos assuntos relacionados e não relacionados a tecnologia.&lt;/p&gt;

&lt;p&gt;O pessoal tirou algumas fotos, mas ningúem publicou ainda. Quando publicarem eu faço o link aqui também.&lt;/p&gt;

&lt;p&gt;Em resumo a reunião foi &lt;strong&gt;EXCELENTE&lt;/strong&gt; e o grupo promete bastante!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EDIT: Sabia que estava esquecendo algo quando postei. Eu gostaria de agradecer ao Vitor e Valdir e todas as outras pessoas da UNIP por sediar nossos encontros e pela excelente infra-estrutura e trabalho que possibilitaram a gravação deste encontro. Muito obrigado!&lt;/strong&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Slides apresentação "Encontros e desencontros na adoção de Scrum"</title>
   <link href="http://blog.tucaz.net/2008/11/22/slides-apresentacao-encontros-e-desencontros-na-adocao-de-scrum"/>
   <updated>2008-11-22T23:19:15+00:00</updated>
   <id>http://blog.tucaz.net/2008/11/22/slides-apresentacao-encontros-e-desencontros-na-adocao-de-scrum</id>
   <content type="html">&lt;p&gt;Conforme eu havia prometido, estou publicando os slides que utilizei na apresentação de hoje de manhã na reunião do &lt;a href=&quot;http://www.dotnetarchitects.net/&quot;&gt;DotNetArchitects&lt;/a&gt;. Apesar de ter estourado no tempo (calculei mau...rs...) foi bem legal (deu pra gravar!) e tão logo o audio e vídeo estejam disponíveis eu posto aqui também.&lt;/p&gt;

&lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/779070&quot; width=&quot;427&quot; height=&quot;356&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px&quot; allowfullscreen&gt; &lt;/iframe&gt;


&lt;p&gt; &lt;div style=&quot;margin-bottom:5px&quot;&gt; &lt;strong&gt; &lt;a href=&quot;http://www.slideshare.net/tucaz/apresentao-scrum-dotnetarchitects-presentation&quot; title=&quot;ApresentaçÎÎo Scrum DotNetArchitects&quot; target=&quot;_blank&quot;&gt;ApresentaçÎÎo Scrum DotNetArchitects&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/tucaz&quot; target=&quot;_blank&quot;&gt;Antonio Zegunis&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Na sequência vou escrever outro post com minhas impressões a respeito da reunião.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Arregace as mangas - Liberte o seu espirito empreendedor: Resenha</title>
   <link href="http://blog.tucaz.net/2008/11/18/arregace-as-mangas-liberte-o-seu-espirito-empreendedor-resenha"/>
   <updated>2008-11-18T23:19:57+00:00</updated>
   <id>http://blog.tucaz.net/2008/11/18/arregace-as-mangas-liberte-o-seu-espirito-empreendedor-resenha</id>
   <content type="html">&lt;p&gt;&lt;img alt=&quot;Capa do livro Arregace as Mangas: Liberte seu espirito empreendedor&quot; src=&quot;http://i.s8.com.br/images/books/cover/img2/261082.jpg&quot; class=&quot;book-cover&quot;&gt;&lt;/p&gt;

&lt;p&gt;Recentemente por meio de uma indicação de um colega na lista &lt;a href=&quot;http://br.groups.yahoo.com/group/scrum-brasil&quot;&gt;Scrum-BR &lt;/a&gt;adquiri no Submarino o pequeno livro de 140 páginas &lt;a href=&quot;http://www.submarino.com.br/produto/1/261082/arregace+as+mangas:+liberte+seu+espirito+empreendedor&quot;&gt;&quot;Arregace as mangas: Liberte seu espirito empreendedor&quot;&lt;/a&gt; dos autores Fernandos Jucá e &lt;a href=&quot;http://pt.wikipedia.org/wiki/Max_Gehringer&quot;&gt;Max Gehringer&lt;/a&gt;. O livro custou um pouquinho menos de R$30,00 e no dia seguinte a minha compra já estava em casa!&lt;/p&gt;

&lt;p&gt;O livro foi escrito a partir de uma série de emails trocados entre os autores a respeito de diversas discussões sobre empreendedorismo. No entanto, no final das contas o formato final ficou sem alterações então todos os tópicos abordados sobre o assunto seguem um esquema de conversação e não uma narrativa tradicional. Essa característica da um aspecto diferente e bem legal ao livro tornando a leitura bem fácil e descontraida.&lt;/p&gt;

&lt;p&gt;Fernando Jucá, desde o começo de sua carreira foi empreendedor logo não é de se estranhar que escreva um livro a respeito do assunto. Max Gehringer por outro lado, nunca foi do tipo empreendedor que tem seu próprio negócio, mas sempre foi um excelente empregado. Esse lance de ser empreendedor e ter seu próprio negócio é um dos temas abordados no livro. Max conta que apesar de nunca ter investido em seu próprio negócio obteve muito sucesso em sua carreira sendo um intra-empreendedor que é o termo utilizado para definir o empregado que trabalha para a empresa de seu patrão como se fosse sua. Este não é o primeiro lugar onde vejo falarem que esse é o novo perfil de sucesso do futuro.&lt;/p&gt;

&lt;p&gt;Antigamente, o funcionário padrão que entrava as 8:00AM e saia as 17:00PM tinha bastante espaço no mercado e possibilidades grandes de crescer dentro da empresa, mas hoje em dia isso não é mais suficiente. As empresas estão trabalhando mais enxutas, com menos margem de manobra e em busca de mais eficiência. Sendo assim, as pessoas que tiverem esse espirito intra-empreendedor tem muito mais possibilidades de crescer profissionalmente.&lt;/p&gt;

&lt;p&gt;Um outro tópico do livro que vale destacar é aquele papo antigo de &quot;Ele venceu por seus próprios esforços&quot; ou &quot;Ele conquistou tudo sozinho&quot;. Isso não é verdade! De acordo com os autores (e eu tenho que concordar) ninguém consegue vencer sozinho na vida. Principalmente um empresário, pois ele depende de fornecedores, de empregados, de clientes e de todos os outros que estão diretamente ou não ligados a sua atividade. Portanto é importantíssimo saber lidar com toda a rede de pessoas envolvidas com sua empresa para obter sucesso.&lt;/p&gt;

&lt;p&gt;Eu não conhecia os autores, mas já descobri que existem diversos outros livros deles e que Max Gerhinger escreve pra Exame e participa de programas de rádio além de palestrar a respeito de liderança e aspectos de administração. Assim que puder, com certeza vou atrás de mais livros deles, pois apesar de não apresentarem nada de novo (e essa não é a idéia, de acordo com eles próprios) eles tem diversas sacadas bem interessantes e que com certeza agregam para aqueles que pensam ou já pensaram em deixar de trabalhar para os outros.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Search engine optimization: boas práticas e dicas</title>
   <link href="http://blog.tucaz.net/2008/11/18/search-engine-optimization-boas-praticas-e-dicas"/>
   <updated>2008-11-18T22:42:51+00:00</updated>
   <id>http://blog.tucaz.net/2008/11/18/search-engine-optimization-boas-praticas-e-dicas</id>
   <content type="html">&lt;p&gt;Nos últimos dias, no meio das minhas feeds apareceram dois posts super interessantes a respeito de práticas para SEO que eu gostaria de compartilhar com vocês.&lt;/p&gt;

&lt;p&gt;O primeiro post veio do &lt;a href=&quot;http://www.desenvolvimentoparaweb.com/seo/guia-seo-iniciantes-boas-praticas-site-na-primeira-pagina-do-google/&quot;&gt;blog Desenvolvimento para Web do Tárcio Zemel&lt;/a&gt; e apresenta o SEO Starter Guide publicado pelo Google com diversas dicas de como utilizar as tags HTML para melhor posicionar e organizar seu site.&lt;/p&gt;

&lt;p&gt;O &lt;a href=&quot;http://www.desenvolvimentoparaweb.com/wordpress/check-list-de-uma-instalacao-basica-do-wordpress/&quot;&gt;outro post&lt;/a&gt; que é do mesmo blog passa diversas dicas para para otimizar o seu a instalação do seu Wordpress e plugins com o mesmo objetivo: SEO.&lt;/p&gt;

&lt;p&gt;Desde que fiz a minha própria instalação tenho na minha lista de pendências ir atrás dessas alterações pra melhorar o posicionamento e acesso ao meu blog, mas infelizmente ainda não tive tempo suficiente. Quem sabe depois de post eu arrume tempo e faça as alterações necessárias, né?&lt;/p&gt;

&lt;p&gt;Espero que aproveitem as dicas!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>DotNetArchitects - Próximo Encontro</title>
   <link href="http://blog.tucaz.net/2008/11/18/dotnetarchitects-proximo-encontro"/>
   <updated>2008-11-18T20:14:15+00:00</updated>
   <id>http://blog.tucaz.net/2008/11/18/dotnetarchitects-proximo-encontro</id>
   <content type="html">&lt;p&gt;Para quem acompanha meu blog e ainda não sabe do que se trata nosso grupo pode ver informações a respeito dele &lt;a href=&quot;http://blog.tucaz.net/2008/10/21/grupo-de-estudos-sobre-arquitetura/&quot;&gt;aqui&lt;/a&gt;, &lt;a href=&quot;http://blog.tucaz.net/2008/10/28/primeira-reuniao-do-grupo-de-arquitetura/&quot;&gt;aqui&lt;/a&gt; e &lt;a href=&quot;http://dotnetarchitects.net/&quot;&gt;aqui&lt;/a&gt;. Nossa...quanto aqui!&lt;/p&gt;

&lt;p&gt;Para quem já sabe o que é mais não se juntou ainda ou não acompanha, faço um convite a conhecer através do nosso &lt;s&gt;não-muito-joia-ainda&lt;/s&gt; &lt;a href=&quot;http://dotnetarchitects.net/&quot;&gt;site&lt;/a&gt; e se juntar também ao &lt;a href=&quot;http://groups.google.com/group/dotnetarchitects?hl=pt-br&quot;&gt;nosso grupo&lt;/a&gt; do Google onde algumas discussões bem legais já foram iniciadas.&lt;/p&gt;

&lt;p&gt;Desde a primeira reunião do grupo combinamos que em todas as nossas reuniões alguém iria fazer uma apresentação para que posteriormente o grupo discutisse o assunto e a primeira apresentação sou eu quem vai fazer. A idéia não é dar uma aula ou falar como &quot;o expert&quot; do assunto, mas tentar passar experiências interessantes para todos.&lt;/p&gt;

&lt;p&gt;Esta primeira apresentação vai ser a respeito de Scrum e como estamos utilizamos dentro da &lt;a href=&quot;http://www.stefanini.com.br&quot;&gt;nossa equipe&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Na sequência da apresentação eu disponibilizo os slides aqui para quem não pôde ir. É possível que consigamos gravar a reunião. Se der certo, disponibilizo também por aqui.&lt;/p&gt;

&lt;p&gt;Junte-se a nós! :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>CMMI or Agile: Are we really falling?</title>
   <link href="http://blog.tucaz.net/2008/11/15/cmmi-or-agile-are-we-really-falling"/>
   <updated>2008-11-15T13:00:33+00:00</updated>
   <id>http://blog.tucaz.net/2008/11/15/cmmi-or-agile-are-we-really-falling</id>
   <content type="html">&lt;p&gt;Com a recente publicação do report &lt;a href=&quot;http://www.sei.cmu.edu/pub/documents/08.reports/08tn003.pdf&quot;&gt;&quot;CMMI or Agile: Why not embrace both!&quot;&lt;/a&gt; pelo &lt;a href=&quot;http://www.sei.cmu.edu&quot;&gt;SEI&lt;/a&gt; muito flame-war tem sido gerado nos blogs do mundo da agilidade e nas listas de discussões sobre esse assunto. Alguns posts, não sei se motivados por esse report ou não, inclusive clamam que o início da queda dos processos ágeis e do movimento ágil começou.&lt;/p&gt;

&lt;p&gt;Lendo a opinião das pessoas, é possível separar em dois grupos distintos os tipos de reclamação:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Os &quot;early-adopters&quot; de Agile que acreditam que, por causa da chegada de Agile ao main stream aqui no Brasil, as práticas ficaram(ão) deturpadas e distorcidas e que agora todo mundo diz que é ágil, mas na prática,de acordo com a opinião desses mesmos &quot;early-adopters&quot; não são;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As pessoas que não acreditam que seja possível a co-existência entre CMMI e Agile e recusam-se a acreditar que isso possa trazer benefício algum;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Eu discordo dessas duas linhas de pensamentos e acredito que, mais que nunca, agora é que a coisa principalmente aqui no Brasil tende a melhorar.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://jamesshore.com/Blog/The-Decline-and-Fall-of-Agile.html&quot;&gt;Neste&lt;/a&gt; post, &lt;a href=&quot;http://jamesshore.com/&quot;&gt;James Shore&lt;/a&gt; conta que antigamente ele era chamado para introduzir agilidade nos ambientes corporativos (e da a entender que essa época era boa). No entanto, hoje ele é chamado para ajudar a corrigir equipes &quot;so called agile&quot; que na verdade de ágil não tem nada. Bom... os tempos mudaram! É pouco provável que essa época onde a iniciação em agilidade &lt;strong&gt;deveria&lt;/strong&gt; ser feita por um dos &lt;em&gt;agile-gurus&lt;/em&gt; durasse pra sempre.&lt;/p&gt;

&lt;p&gt;Como eu disse acima, o movimento chegou ao mainstream, mas isso só aconteceu porque quem iniciou esse movimento assim o quis. Agile veio do povo para o povo e isso agora incomoda muita gente. Hoje, quem quiser manter o título de &lt;em&gt;master-introduzidor-de-agilidade-e-coaching&lt;/em&gt; vai ter que ralar e se ajustar as novas demandas.&lt;/p&gt;

&lt;p&gt;Ainda comentando a respeito do primeiro grupo de opiniões, assim como a bíblia (é, aquela sagrada a respeito de Deus) e de acordo com os próprios autores de alguns livros conhecidos como referência (Scott Ambler em Agile Modeling e Ken Schwaber em Project Management with Scrum, por exemplo), práticas ágeis são apenas o que o próprio nome diz: &lt;strong&gt;práticas&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Como não são um how-to detalhado que você deve aplicar em todas as ocasiões e muitas vezes bastante abstratas são passíveis de interpretação. Sendo assim, como alguém pode dizer se você é ou não ágil? Se as práticas que você aplica estão trazendo resultados satisfatórios qual o problema em se referir ao termo agilidade? Está acontecendo a mesma coisa que acontece com alguns usuários de Linux e alguns participantes de projetos open-source: as pessoas estão se apegando demais aos termos e títulos e deixando de lado realmente o que o movimento prega. Parece ciúmes.&lt;/p&gt;

&lt;p&gt;Movendo agora o foco para o segundo grupo de reclamantes, acredito que afirmar que CMMI é incapaz de trazer benefícios para as práticas ágeis é no mínimo uma contradição visto que um dos princípios básicos de agile é adaptação. Sempre quando alguém fala a respeito de como iniciar com metodologias ágeis uma das primeiras recomendações que ouço é &quot;Não tente mudar o processo antes de utilizar ele da forma padrão. Experimente e depois decida se é necessário fazer alterações&quot;. Olha lá! Mais um motivo para não fazer essa afirmação de que nenhum benefício pode ser colhido dessa co-existência. Como alguém pode afirmar que não vai dar certo se esse report foi uma das primeiras menções (se não a primeira) a respeito dessa co-existência e nada concreto ainda foi gerado? É a mesma coisa que dizer que não gosta de brocólis sem nunca antes ter provado.&lt;/p&gt;

&lt;p&gt;Não sou expert em CMMI, tão pouco em Agile. No entanto, se verificarmos a origem do CMM e como a transformação ocorreu para o CMMI é possível entender porque as práticas são tão distoantes. O CMM teve origem no departamento de defesa dos Estados Unidos. Eles precisavam de um modelo que pudesse garantir que o software funcionando em um avião militar não parasse de funcionar no meio de um vôo. Hmm... não precisamos pensar muito pra concluir que antes de testar um treco desses em produção (guerra?) ou em homologação (vôo de treinamento?) seriam necessários muitos testes para garantir que os milhares de dólares que essas belezinhas custam não fossem jogados no buraco; sem falar na vidas dos pilotos.&lt;/p&gt;

&lt;p&gt;Dessa forma, acredito que essa abordagem extremamente pesada, com longa duração e diversas exigências de verificação e validação em diversos níveis hierarquicos, de fato, não parece a pior opção pra esse cenário.&lt;/p&gt;

&lt;p&gt;São duas abordagens diferentes e que devem ser usadas em cenários diferentes. O perigo é conhecer uma ferramenta só (martelo) e sair martelando tudo que encontrar pela frente até quando o alvo não é um prego, mas sim um parafuso.&lt;/p&gt;

&lt;p&gt;Em resumo e para conluir (já escrevi muita coisa...) acredito que é cedo pra afirmar qualquer coisa e que não devemos nos opor tão radicalmente as mudanças (como o próprio manifesto prega). Se essas mudanças tanto no aspecto da ascensão de Agile ao mainstream quanto das mudanças oriundas da co-existência com CMMI forem pra melhor, vão permanecer. Se forem para pior, com certeza o mercado logo, logo esquece... e se não esquecer cada um pode sempre criar seu próprio mundo onde tudo é bonito e belo! :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Dando as caras</title>
   <link href="http://blog.tucaz.net/2008/11/11/dando-as-caras"/>
   <updated>2008-11-11T21:23:27+00:00</updated>
   <id>http://blog.tucaz.net/2008/11/11/dando-as-caras</id>
   <content type="html">&lt;p&gt;Post só pra dizer que estou vivo!&lt;/p&gt;

&lt;p&gt;Esse último mês tem sido bastante complicado (fim de projeto) e nós últimos dias não consegui parar pra postar &lt;strong&gt;nada. &lt;/strong&gt;Odeio ficar sem postar porque gosto de escrever, mas nos próximos dias se tudo der certo coloco a pauta que tenho guardada pra rodar e os posts voltam a seu ritmo.&lt;/p&gt;

&lt;p&gt;Enquanto isso, acompanhem um pouco das novidades no link do nosso recém criado grupo de arquitetura: &lt;a href=&quot;http://dotnetarchitects.net/&quot;&gt;http://dotnetarchitects.net/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fiquem ligados!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Design para quem não é Designer: Resenha</title>
   <link href="http://blog.tucaz.net/2008/11/03/design-para-quem-nao-e-designer-resenha"/>
   <updated>2008-11-03T21:15:02+00:00</updated>
   <id>http://blog.tucaz.net/2008/11/03/design-para-quem-nao-e-designer-resenha</id>
   <content type="html">&lt;p&gt;&lt;img alt=&quot;Design para quem não é designer&quot; src=&quot;/assets/post-images/2008/11/67203.jpg&quot; class=&quot;book-cover&quot;&gt;&lt;/p&gt;

&lt;p&gt;Esta resenha é a respeito de um livro com um assunto um pouquinho diferente do que estou acostumado a ler: design visual. Já há algum tempo, tenho algumas idéias de produtos/sistemas/serviços que eu poderia construir e lançar no mercado. No entanto, de nada adianta ter um bom produto se ele não tiver uma cara apresentável e que prenda a atenção do consumidor. Como não conheço ninguém que topasse fazer esse tipo de trabalho só por hobbie, decidi estudar um pouco por conta própria.&lt;/p&gt;

&lt;p&gt;Sendo assim, há algumas semanas, terminei de ler este livro de 144 páginas que comprei na &lt;a href=&quot;http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=67203&amp;amp;sid=89121114910113779619427174&amp;amp;k5=1D3D79AD&amp;amp;uid=&quot;&gt;Livraria Cultura por R$40,00&lt;/a&gt;. O livro foi escrito por uma autora americana chamada Robin Williams que além deste, escreveu uma série de livros relacionados a design.&lt;/p&gt;

&lt;p&gt;Eu não tenho pretensão nenhuma de mudar de área e me especializar em arte gráfica ou coisas do tipo, mas este livro me chamou bastante a atenção. Além das idéias que relatei acima, construir um produto ou uma marca é uma coisa muito complicada, mas como alguns outros colegas sempre dizem e foi dito também no livro do &lt;a href=&quot;http://blog.tucaz.net/2008/10/13/my-job-went-to-india-resenha/&quot;&gt;Chad Fowler&lt;/a&gt;: meu nome é minha marca. Portanto, tudo que acompanhar meu nome além de qualidade no conteúdo e veracidade nas informações pode ser melhorado se possuir um bom visual.&lt;/p&gt;

&lt;p&gt;O Livro explica de uma maneira bem leve e didática (procurei outros livros sobre o assunto, mas nenhum me prendeu tanto quando este) os quatro princípios básicos do design: Alinhamento, Proximidade, Contraste e Repetição. Todas as peças publicitárias e materiais relacionados a publicidade e design possuem esses 4 princípios aplicados e fica muito mais interessante olhar e avaliar os trabalhos do outros (e o meu próprio) quando se sabe o conceito por trás da coisa.&lt;/p&gt;

&lt;p&gt;Além dos princípios o livro também apresenta uma boa introdução a respeito de tipografia e uso de tipos na escrita. Estudando um pouco a respeito deste assunto fica claro porque algumas fontes são melhores para leitura do que outras e porque algumas fontes bizarras são empregadas em nos usos mais diversos e por mais incrível que pareça ainda consigam produzir um bom resultado.&lt;/p&gt;

&lt;p&gt;Durante todo o livro, a autora apresenta diversos exemplos &quot;Antes&quot; da aplicação dos princípios básicos e &quot;Depois&quot;. São várias figuras que vão desde papéis de carta até cartões de visita e folhetos de anúncio. É impressionante como pequenas alterações no layout de um texto conseguem mudar totalmente a cara e a impressão que o documento passa.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/post-images/2008/11/cartao1.jpg&quot;&gt;&lt;img src=&quot;/assets/post-images/2008/11/cartao1.jpg&quot; alt=&quot;Cartao Antes&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/post-images/2008/11/cartao2.jpg&quot;&gt;&lt;img src=&quot;/assets/post-images/2008/11/cartao2.jpg&quot; alt=&quot;Cartao Depois&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O exemplinho bobo que fiz acima é apenas para ilustrar como o mero fato de agrupar informações relacionadas já garante uma aparência mais satisfatória a um cartão de visitas.&lt;/p&gt;

&lt;p&gt;Esse é um livro que eu recomendaria a todos que tenham interesse em aprender um pouco a respeito de conceitos de design visual e também a quem se chama de web-designer porque consegue fazer páginas e sites bonitinhos, mas nunca procurou entender realmente o porque das coisas.&lt;/p&gt;

&lt;p&gt;Leitura recomendadissíma!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Primeira reunião do Grupo de Arquitetura</title>
   <link href="http://blog.tucaz.net/2008/10/28/primeira-reuniao-do-grupo-de-arquitetura"/>
   <updated>2008-10-28T09:12:51+00:00</updated>
   <id>http://blog.tucaz.net/2008/10/28/primeira-reuniao-do-grupo-de-arquitetura</id>
   <content type="html">&lt;p&gt;Bão, sábado foi a primeira reunião do grupo de arquitetura que eu &lt;a href=&quot;http://blog.tucaz.net/2008/10/21/grupo-de-estudos-sobre-arquitetura/&quot;&gt;já havia postado a respeito&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Como o Giovanni já blogou sobre o que rolou na reunião não vale repetir tudo aqui, mas sim &lt;a href=&quot;http://unplugged.giggio.net/unplugged/post/Resultado-da-primeira-reuniao-do-grupo-de-arquitetura.aspx&quot;&gt;linkar para o post dele&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A reunião foi excelente, muito divertida e de um ótimo nível. Felizmente conseguimos reunir um grupo que não chegava em acordos sempre e isso é fundamental para crescermos.&lt;/p&gt;

&lt;p&gt;Os interessados em entrar no grupo podem me mandar email, comentar aqui ou então postar no próprio blog do Giovanni. &quot;Você decide&quot;. :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Download VS2010 + Framework 4.0 CTP </title>
   <link href="http://blog.tucaz.net/2008/10/28/download-vs2010-framework-40-ctp"/>
   <updated>2008-10-28T09:08:01+00:00</updated>
   <id>http://blog.tucaz.net/2008/10/28/download-vs2010-framework-40-ctp</id>
   <content type="html">&lt;p&gt;Post rápido! Saiu o link para o download do Visual Studio 2010 e Framework 4.0. Ambos em CTP.&lt;/p&gt;

&lt;p&gt;O Download tem 7gb e &lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?familyid=922b4655-93d0-4476-bda4-94cf5f8d4814&amp;amp;displaylang=en&amp;amp;tm&quot;&gt;este&lt;/a&gt; é o link. Comecei a baixar faz pouco tempo e quando terminar e (conseguir) testar posto minhas impressões.&lt;/p&gt;

&lt;p&gt;Mas já da pra adiantar que tem bastante novidades: o &lt;a href=&quot;http://weblogs.pontonetpt.com/israelaece/posts/28353.aspx&quot;&gt;Israel Aece blogou&lt;/a&gt; sobre algumas e eu já havia postado também alguns links &lt;a href=&quot;http://blog.tucaz.net/2008/10/22/visual-studio-2010-diversas-novidades/&quot;&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Go!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Falha nossa</title>
   <link href="http://blog.tucaz.net/2008/10/23/falha-nossa"/>
   <updated>2008-10-23T20:06:36+00:00</updated>
   <id>http://blog.tucaz.net/2008/10/23/falha-nossa</id>
   <content type="html">&lt;p&gt;Gostaria de pedir desculpas aos leitores que utilizam o Internet Explorer, pois desde que publiquei &lt;a href=&quot;http://blog.tucaz.net/2008/10/01/nem-tudo-e-relacional/&quot;&gt;este&lt;/a&gt; post o blog ficou com o layout todo deformado neste navegador. Isso aconteceu, pois tinha escrito originalmente o post no Word e na hora de colar no blog colei errado e um monte de tags oriundas do Word vieram parar no meio do post bagunçando todo o HTML do blog.&lt;/p&gt;

&lt;p&gt;Como uso praticamente só o Mozilla só fui perceber esse erro hoje. Já arrumei e tudo deve ter voltado ao normal. Por favor, me avisem se ainda tiver algum problema. :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Visual Studio 2010: Diversas novidades</title>
   <link href="http://blog.tucaz.net/2008/10/22/visual-studio-2010-diversas-novidades"/>
   <updated>2008-10-22T18:43:24+00:00</updated>
   <id>http://blog.tucaz.net/2008/10/22/visual-studio-2010-diversas-novidades</id>
   <content type="html">&lt;p&gt;Este é um post rápido. O Carlos Hulot publicou há pouco em seu blog links para diversos vídeos e informações a respeito da nova plataforma da linha Visual Studio e Team Foundation Server da Microsoft.&lt;/p&gt;

&lt;p&gt;Comecei a ver os vídeos agora e estou baixando ainda outros, mas está bem interessante. Vale a pena dar uma olhada.&lt;/p&gt;

&lt;p&gt;Segue o link: &lt;a href=&quot;http://blogs.msdn.com/hulot/archive/2008/10/22/application-lifecycle-management-vsts2010.aspx&quot;&gt;http://blogs.msdn.com/hulot/archive/2008/10/22/application-lifecycle-management-vsts2010.aspx&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Contratando novamente!</title>
   <link href="http://blog.tucaz.net/2008/10/22/contratando-novamente"/>
   <updated>2008-10-22T11:49:43+00:00</updated>
   <id>http://blog.tucaz.net/2008/10/22/contratando-novamente</id>
   <content type="html">&lt;p&gt;Mais uma vez estamos contratando. Duas vezes em dois meses... estamos indo bem!&lt;/p&gt;

&lt;p&gt;Vamos ao que interessa. Como dito no outro post, continuamos com Scrum e uma equipe enxuta (alguns sairam, pois não se encaixaram e outros entraram) de 12 pessoas distribuidas em três times pequenos e focados. Só que nessa vez não estamos atrás de desenvolvedores (mas se alguém tiver interesse, nunca desprezamos novos bons membros para a equipe), mas sim de um Database Aniquilator, conhecido também como DBA. :)&lt;/p&gt;

&lt;p&gt;A fim de eliminar o desperdício de esforço e melhorar alguns processos descobrimos (antes tarde do que nunca) que alguém especialista em banco de dados, SQL Server principalmente, faz &lt;strong&gt;muita&lt;/strong&gt; falta. No entanto o que precisamos não é alguém que apenas fique conectado como &quot;sa&quot; rodando scripts em produção. Precisamos de alguém que esteja em sintonia com as equipes de desenvolvimento e as apoie o tempo todo em desenvolvimento (dúvidas, organização e tuning), seja responsável pela saúde dos bancos de dados e nos ajude a criar uma política mais eficiente de integração, consistência de dados e deploy.&lt;/p&gt;

&lt;p&gt;Somos uma equipe ágil e altamente entrosada onde todo mundo joga junto. Nossa equipe não é grande e cresce de maneira organizada e estruturada.&lt;/p&gt;

&lt;p&gt;Sendo assim, o perfil de entusiasta é &lt;strong&gt;fundamental&lt;/strong&gt;. Graduação, pós-graduação, mestrado e certificações não é o que estamos buscando. Portanto, não são um diferencial. Fazer apenas sua parte não é o suficiente. Como de costume, é necessário ter interesse em aprender e aplicar novas práticas, interagir com os membros da equipe e aceitar ser desafiado e questionado, pois é isso que faz com que nossa equipe cresca.&lt;/p&gt;

&lt;p&gt;Nessa vaga, em especial, além das soft skills os conhecimento técnicos são extremamente importantes. Hoje, nossos bancos de dados são gerenciados por mim e alguns outros membros da equipe. Nós conhecemos alguma coisa de banco de dados, mas nossa especialidade é desenvolvimento, portanto no mínimo o candidato deve conhecer mais banco de dados do que a gente :). Especificando um pouco mais precisamos de conhecimentos em: replicação, segurança (roles, rules, etc), organização e distribuição de filegroups, pagefile, etc e SSIS. Experiência em shell, execução de scripts via batch e gerenciamento de instâncias e administração windows server também são necessárias.&lt;/p&gt;

&lt;p&gt;Enfim, tudo que um bom projeto de software precisa no que diz respeito a banco de dados.&lt;/p&gt;

&lt;p&gt;Estamos em São Paulo capital, na região de Pinheiros. A Contratação é como PJ e temos alguns benefícios.&lt;/p&gt;

&lt;p&gt;Se você se interessou pela oportunidade email-me azegunis@stefanini.com.br.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Grupo de estudos sobre Arquitetura - 1ª Reunião</title>
   <link href="http://blog.tucaz.net/2008/10/21/grupo-de-estudos-sobre-arquitetura"/>
   <updated>2008-10-21T10:52:02+00:00</updated>
   <id>http://blog.tucaz.net/2008/10/21/grupo-de-estudos-sobre-arquitetura</id>
   <content type="html">&lt;p&gt;Há alguns dias atrás o Giovanni Bassi trouxe a idéia pra comunidade de criar um grupo com o objetivo de discutir arquitetura de software nos moldes dos grupos &lt;a href=&quot;http://altdotnet.org/&quot;&gt;ALT.NET&lt;/a&gt; e a idéia me interessou muito.&lt;/p&gt;

&lt;p&gt;Enfim, a primeira reunião é sabado agora na UNIP da Marginal Pinheiros. Quem tiver interesse será muito bem vindo.&lt;/p&gt;

&lt;p&gt;Os detalhes podem ser encontrados &lt;a href=&quot;http://feeds.feedburner.com/~r/DotNetUnplugged/~3/426006693/post.aspx&quot;&gt;aqui no blog do Giovanni&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Boas práticas de engenharia podem influenciar a motivação?</title>
   <link href="http://blog.tucaz.net/2008/10/20/boas-praticas-de-engenharia-podem-influenciar-a-motivacao"/>
   <updated>2008-10-20T22:36:41+00:00</updated>
   <id>http://blog.tucaz.net/2008/10/20/boas-praticas-de-engenharia-podem-influenciar-a-motivacao</id>
   <content type="html">&lt;p&gt;Hoje, como nunca, acredito que o mercado esteja cheio de profissionais ruins. Não digo somente no sentido técnico, mas principalmente em perfil (que ao meu ver é o mais importante); que faz um desenvolver correr atrás de estudar, procurar as melhores práticas de software e buscar melhorar seu trabalho. &lt;strong&gt;Motivação&lt;/strong&gt;. Encontrar um profissional motivado que aceite críticas e procure crescer e agregar a equipe e empresa que pertence é raro, muito raro.&lt;/p&gt;

&lt;p&gt;Existem diversos fatores que julgo influenciarem esse tipo de perfil: escassez de pessoas qualificadas, ofertas de trabalho em abundância, prostituição do mercado de trabalho, políticas falidas de recursos humanos, entre outros. Dependendo da nossa posição, poucos desses fatores são de nosso controle.&lt;/p&gt;

&lt;p&gt;No entanto, nos últimos dias passei por uma experiência interessante e percebi que existe um ponto em especial que podemos controlar plenamente ou contribuir para evitar esse tipo de comportamento desinteressado: &lt;strong&gt;boas práticas de engenharia de software&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;É impressionante como encorajar a aplicação de boas práticas de desenvolvimento de software pode transformar pessoas antes desinteressadas novamente em profissionais ativos e entusiasmados. Não é necessário ter as melhores ferramentas, utilizar a última tecnologia da moda ou o melhor processo de desenvolvimento. Na maioria das vezes basta que o líder incentive e apoie esse tipo de comportamento para obter bons resultados.&lt;/p&gt;

&lt;p&gt;Mesmo que você não seja líder de equipe e que algumas pessoas o desencoragem com aquele papo de &lt;em&gt;&quot;não adianta tentar fazer X oy Y porque aqui isso não vai funcionar&quot;&lt;/em&gt;, não entre nessa onda. Procure incentivar as pessoas que estão ao seu redor a buscar a melhoria contínua e mesmo que todos não te ouçam não desista. Existem &lt;strong&gt;muitas&lt;/strong&gt; empresas que valorizam profissionais com perfil arrojado e pró ativo.&lt;/p&gt;

&lt;h2&gt;Valorize-se!&lt;/h2&gt;
</content>
 </entry>
 
 <entry>
   <title>Artigo a respeito de Scrum na revista MundoNET</title>
   <link href="http://blog.tucaz.net/2008/10/17/artigo-a-respeito-de-scrum-na-revista-mundonet"/>
   <updated>2008-10-17T23:19:35+00:00</updated>
   <id>http://blog.tucaz.net/2008/10/17/artigo-a-respeito-de-scrum-na-revista-mundonet</id>
   <content type="html">&lt;p&gt;&lt;img alt=&quot;MundoNET - Número 11&quot; src=&quot;/assets/post-images/2008/10/mundonet11.jpg&quot; class=&quot;book-cover&quot;&gt;&lt;/p&gt;

&lt;p&gt;Essa semana saiu nas bancas a edição número 11 da revista &lt;a href=&quot;http://mundodotnet.com.br/default.shtml&quot;&gt;MundoNET&lt;/a&gt;. A partir dessa edição comecei a participar com artigos e o primeiro &quot;Scrum - Introdução a Agilidade&quot; já foi publicado. :)&lt;/p&gt;

&lt;p&gt;Fiquei muito feliz em poder participar e contribuir com minha experiência e espero que todos gostem também. Acho pouco provável que irei agradar a todos com o artigo, mas se gerar algum tipo de discussão já é válido. Afinal, é a partir de críticas e discussões que crescemos, não é mesmo?&lt;/p&gt;

&lt;p&gt;Durante o tempo que estava escrevendo para a revista acabei dando uma esfriada aqui no blog, mas já estou me organizando melhor e devo postar com mais frequência daqui pra frente.  É bem legal e bastante diferente escrever para revista e é uma experiência que eu ainda não tinha, mas gostei bastante!&lt;/p&gt;

&lt;p&gt;Nessa edição tem outros dois artigos que, particularmente, achei bem legais a respeito de Flex com .NET e BI em projetos Web.&lt;/p&gt;

&lt;p&gt;Vale a pena conferir!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>My Job Went to India: Resenha</title>
   <link href="http://blog.tucaz.net/2008/10/13/my-job-went-to-india-resenha"/>
   <updated>2008-10-13T22:55:02+00:00</updated>
   <id>http://blog.tucaz.net/2008/10/13/my-job-went-to-india-resenha</id>
   <content type="html">&lt;p&gt;&lt;img alt=&quot;My Job Went to India&quot; src=&quot;http://ecx.images-amazon.com/images/I/51BfF0wLtEL._SL500_AA300_.jpg&quot; class=&quot;book-cover&quot;&gt;&lt;/p&gt;

&lt;p&gt;Há uns três meses atrás, enquanto navegava pelos &lt;a href=&quot;http://blog.jayfields.com/2008/08/be-your-start-up.html&quot;&gt;links &lt;/a&gt;que leio frequentemente, mesmo sem antes ter feito nenhuma dessas perguntas encontrei algo parecido com a resposta e esse livro fazia parte dela. Me interessei e comprei o livro.&lt;/p&gt;

&lt;p&gt;Para variar, comprei na &lt;a href=&quot;http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=1306182&amp;amp;sid=018111356101012809588621332&amp;amp;k5=23628178&amp;amp;uid=&quot;&gt;Livraria Cultura&lt;/a&gt; por R$64,84 e em umas duas semanas recebi o pequeno livro de 252 páginas em casa.&lt;/p&gt;

&lt;p&gt;O autor, Chad Fowler (que não é parente do Martin Fowler), conta em 52 &quot;mini-histórias&quot; o que fazer para não perder seu emprego e da diversas dicas de como crescer tanto profissional quanto pessoalmente.&lt;/p&gt;

&lt;p&gt;O livro foi escrito na época em que executar projetos &lt;a href=&quot;http://pt.wikipedia.org/wiki/Offshore_(Gest%C3%A3o&quot;&gt;offshore&lt;/a&gt;) era visto como a melhor e mais barata maneira de se construir projetos de software nos Estados Unidos. De acordo com Fowler, nesse época muitos programadores acabaram perdendo seus empregos para indianos do outro lado do mundo e cada vez mais achavam que os indianos estavam tirando seus empregos.&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;O que fazer para crescer na carreira profissional? &lt;/strong&gt;&lt;/h3&gt;

&lt;h3&gt;&lt;strong&gt;Como manter meu emprego? &lt;/strong&gt;&lt;/h3&gt;

&lt;h3&gt;&lt;strong&gt;Como posso melhorar profissional e pessoalmente?&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Em um desses projetos o autor foi enviado pra India com a responsabilidade de abrir uma filial e contratar indianos para montarem a filial supostamente mais barata e eficiente. No entanto, gerenciar uma equipe a milhares de quilometros de distância não é fácil como parece (se é que parece). Durante todo o livro ele relata os obstáculos que existem em se montar uma operação desse tipo e porque essa forma de trabalho não vai deixar os americanos desempregados.&lt;/p&gt;

&lt;p&gt;Ele descreve exemplos de como é importante trabalhar no marketing pessoal e não focar apenas na parte técnica, pois não adianta você ser o melhor técnico do mundo e não investir na comunicação para que as pessoas saibam o quão bom você é. Comunicação é fundamental.&lt;/p&gt;

&lt;p&gt;Outro ponto que achei bastante interessante é que devemos aprender a falhar, tirar proveito disso e crescer. Não devemos nunca imaginar que estamos na crista da onda porque conhecemos uma tecnologia em especifico. Uma hora a onda passa e nós ficamos pra trás. É necessário que não deixemos que o rumo de nossas carreiras seja definido ao acaso, mas sim baseado em decisões concientes e estratégicas sempre de olho no mercado atual e nas mudanças que estão ocorrendo.&lt;/p&gt;

&lt;p&gt;Além dos aspectos técnicos é também uma oportunidade de conhecer um poquinho a respeito da cultura de outro país e aprender como lidar com pessoas diferentes.&lt;/p&gt;

&lt;p&gt;Enfim, este é um livro bastante amplo e ao mesmo tempo específico que com certeza vai abrir sua mente. Acredito que seja um dos melhores que já li e é uma leitura obrigatória pra quem quer crescer!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Nem tudo é relacional</title>
   <link href="http://blog.tucaz.net/2008/10/01/nem-tudo-e-relacional"/>
   <updated>2008-10-01T21:47:08+00:00</updated>
   <id>http://blog.tucaz.net/2008/10/01/nem-tudo-e-relacional</id>
   <content type="html">&lt;p&gt;Esses dias me peguei pensando em um costume interessante que temos. Quando digo &quot;nós&quot;, falo de min e das pessoas com as quais já trabalhei nesses 4 anos que atuo com .NET. Fomos acostumados, em se tratando de persistência em banco de dados, de sempre utilizar modelo relacional pra qualquer tipo de armazenamento de objeto. O problema é que nem sempre isso é necessário e acabamos perdendo ou tempo em codificação ou desempenho ou espaço em disco.&lt;/p&gt;

&lt;p&gt;A idéia de banco de dados orientado a objetos sempre me agradou e acho uma pena não ter chegado ao mainstream. No entanto o conceito de armazenar o grafo todo de objetos é muito interessante em algumas situações. Vou usar um exemplo que talvez não seja o melhor, mas deve passar a idéia.&lt;/p&gt;

&lt;p&gt;Imagine um cadastro de cliente com diversas entidades relacionadas: diversos endereços, vários telefones para contato, dependentes, etc.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/post-images/2008/10/relacional01.jpg&quot;&gt;&lt;img src=&quot;/assets/post-images/2008/10/relacional01.jpg&quot; alt=&quot;Modelo de Classes&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Normalmente criaríamos uma tabela para cada uma das entidades e essas tabelas teriam uma referência (FK) para a tabela principal de clientes:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/post-images/2008/10/relacional02.jpg&quot;&gt;&lt;img src=&quot;/assets/post-images/2008/10/relacional02.jpg&quot; alt=&quot;Modelo de Dados normalizado&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se considerássemos que um endereço ou automóvel pudesse pertencer a mais de um cliente a coisa ficaria ainda mais complicada e teríamos que criar tabelas de relacionamento N:M.&lt;/p&gt;

&lt;p&gt;Para que o exemplo seja útil, vamos considerar que nesse sistema não fosse possível efetuar pesquisas utilizando como filtro nenhuma dessas entidades (em um sistema real é óbvio que requisito é um absurdo) e só seria disponibilizada uma funcionalidade de busca por meio de código (id). Mesmo com esse requisito, como pensamos sempre em de forma relacional o caminho natural seria criar o modelo de dados acima e armazenar tudo bastante normalizado.&lt;/p&gt;

&lt;p&gt;No entanto existe outra opção que em determinados casos é muito interessante. Guardar o objeto inteiro no banco.&lt;/p&gt;

&lt;p&gt;Em .NET, por exemplo, bastaria criar um modelo simples de dados contendo o idCliente e um campo que armazene binário (varbinary em SQL), serializar o objeto e pronto.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/post-images/2008/10/relacional03.jpg&quot;&gt;&lt;img src=&quot;/assets/post-images/2008/10/relacional03.jpg&quot; alt=&quot;Modelo de dados mais simples&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public Cliente Consultar(int codigoCliente)
{
    //Recupera do DB
    byte[] clienteSerializado = DaoCliente.ConsultarPorCodigo(codigoCliente);
    //Devolve o objeto deserializado
    return this.DeserializarObjeto&amp;lt;Cliente&amp;gt;(clienteSerializado);
}

public void Salvar(Cliente novoCliente)
{
    //Serializa o objeto
    byte[] clienteSerializado = this.SerializarObjeto&amp;lt;Cliente&amp;gt;(novoCliente);
    //Guarda o cliente no DB
    DaoCliente.Inserir(novoCliente.Codigo, clienteSerializado);
}

private byte[] SerializarObjeto&amp;lt;T&amp;gt;(T objeto)
{
    MemoryStream ms = new MemoryStream();
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(ms, objeto);
    byte[] objetoSerializado = ms.ToArray();
    ms.Close();
    return objetoSerializado;
}

private T DeserializarObjeto&amp;lt;T&amp;gt;(byte[] objetoSerializado)
{
    MemoryStream ms = new MemoryStream();
    BinaryFormatter formatter = new BinaryFormatter();
    ms.Write(objetoSerializado, 0, objetoSerializado.Length);
    ms.Position = 0;
    return (T)formatter.Deserialize(ms);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dessa maneira, sempre que precisarmos, já iremos ter o objeto completo e não seria necessário executar diversas instruções SQL ou stored procedures e muitas chamadas ao banco. Iriamos apenas executar uma chamada que nos retornaria o objeto completo e pronto para uso.&lt;/p&gt;

&lt;p&gt;Essa é uma solução diferente e que pode ser útil em alguns cenários, principalmente se você não utiliza nenhum framework ORM. Contudo, é importante verificar todos os requisitos com bastante cuidado, com essa solução corremos o risco de ficar com dados desatualizados e perdemos a possibilidade de efetuar buscas por campos que estejam dentro dos objetos armazenados.&lt;/p&gt;

&lt;p&gt;Acho muito legal encontrarmos formas diferentes de fazer as mesmas coisas que estamos habituados. É uma maneira muito eficiente de aprendizado e conhecimento das nossas ferramentas.&lt;/p&gt;

&lt;p&gt;O que você acha?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Editado:&lt;/strong&gt; sem saber, acabei descrevendo o pattern Serialized Lob já catalogo pelo Fowler em seu livro PoEAA. O Bruno achou e comentou o post colocando &lt;a href=&quot;http://martinfowler.com/eaaCatalog/serializedLOB.html&quot;&gt;este link&lt;/a&gt;. Valeu! :D&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Novo Microsoft Architecture Guide lançado</title>
   <link href="http://blog.tucaz.net/2008/09/24/novo-microsoft-architecture-guide-lancado"/>
   <updated>2008-09-24T10:49:12+00:00</updated>
   <id>http://blog.tucaz.net/2008/09/24/novo-microsoft-architecture-guide-lancado</id>
   <content type="html">&lt;p&gt;Lá atrás, em 2002, a Microsoft lançou a &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms978348.aspx&quot;&gt;primeira versão&lt;/a&gt; da sua arquitetura de referência para os cenários mais comuns de aplicações corporativas.&lt;/p&gt;

&lt;p&gt;Esse é um documento, que apesar de antigo, é bastante interessante e ainda atual na maioria dos aspectos. Eu descobri esse documento cerca de uns 1 ano e meio atrás quando procurava melhores práticas para aplicar no primeiro sistema pelo qual eu seria responsável.&lt;/p&gt;

&lt;p&gt;Sempre achei uma pena o fato de eles não manterem esse documento atualizado. Talvez isso acontecesse, pois é sempre complicado falar a respeito de arquiteturas de referência já que cada caso é um caso.&lt;/p&gt;

&lt;p&gt;No entanto, pra nossa felicidade, eles lançaram uma nova versão esse mês e está disponível através &lt;a href=&quot;http://www.codeplex.com/AppArch/Wiki/View.aspx?title=Guidelines&amp;amp;referringTitle=Home&quot;&gt;deste link&lt;/a&gt; no Codeplex.&lt;/p&gt;

&lt;p&gt;O documento apresenta quais decisões tomar e porque toma-las em uma série de cenários. Desde aplicações desktop até aplicações web com SOA e RIA.&lt;/p&gt;

&lt;p&gt;Ainda não tive tempo de ir a fundo no documento, mas parece estar bastante atualizado.&lt;/p&gt;

&lt;p&gt;Há algum tempo atrás, eu procurava saber porque raios alguém construiria uma aplicação utilizando WCF/Remoting/Web Services se essa aplicação não teria seus componentes de negócio reutilizados. Nunca entendi isso e achava um absurdo a Microsoft não disponibilizar nenhum &quot;guia&quot; (eu nunca achei, pelo menos) que dissesse quando devo distribuir as camadas de uma aplicação fisicamente e quando não. Infelizmente algumas coisas nós acabamos aprendendo só depois de aplicar e apanhar um pouco.&lt;/p&gt;

&lt;p&gt;Nesse documento, pelo menos &lt;a href=&quot;http://www.codeplex.com/AppArch/Wiki/View.aspx?title=Web%20Application%20Archetype&amp;amp;referringTitle=Application%20Types&quot;&gt;este ponto a Microsoft esclareceu&lt;/a&gt; e isso já é suficiente pra me deixar bastante feliz.&lt;/p&gt;

&lt;p&gt;Esse documento não vai evitar que nós, desenvolvedores, cometamos erros, mas acredito que é muito importante os fornecedores de plataformas e tecnologias grandes como .NET se pronunciarem e fornecerem guias, mesmo que simples e com uma visão bem macro, para que as pessoas não fiquem perdidas e cometam erros demais em seus sistemas.&lt;/p&gt;

&lt;p&gt;Ponto pra Microsoft.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Faça o que tem que ser feito</title>
   <link href="http://blog.tucaz.net/2008/09/19/faca-o-que-tem-que-ser-feito"/>
   <updated>2008-09-19T20:03:04+00:00</updated>
   <id>http://blog.tucaz.net/2008/09/19/faca-o-que-tem-que-ser-feito</id>
   <content type="html">&lt;p&gt;Na área de TI, principalmente em desenvolvimento, o que eu mais vejo são pessoas que estão trabalhando simplesmente por estar. Este é um assunto que, inclusive, eu já havia comentado &lt;a href=&quot;http://blog.tucaz.net/2008/07/31/as-pessoas-merecem-o-trabalho-que-tem/&quot;&gt;aqui mesmo no blog&lt;/a&gt;. São poucas as pessoas que procuram fazer seu trabalho da melhor maneira possível e menor ainda é a quantidade de pessoas que usam de seu tempo livre para estudar e encontrar maneiras de fazer seu trabalho melhor.&lt;/p&gt;

&lt;p&gt;Se você não é uma dessas pessoas que apenas empurra seu trabalho com a barriga, existem algumas coisas que você pode fazer para ter mais chances de ser bem sucedido durante sua carreira profissional.&lt;/p&gt;

&lt;p&gt;Não são raras as vezes em que trabalhamos em uma empresa grande e não passamos de um número. Essa é uma situação relativamente ruim e pessoas ambiciosas (no bom sentido da palavra se é que tem um ruim) não se sentem confortáveis nessa posição. No entanto, ganhar visibilidade no meio de tanta gente não é uma coisa muito fácil e pode demorar muito tempo. E não é só questão de visibilidade, mas também de procurar um sentido para aquilo que você se dedica diariamente. Dependendo do tamanho da empresa e da posição as vezes não temos condições nem de dizer o que realmente a empresa faz.&lt;/p&gt;

&lt;p&gt;Uma das formas de ganhar visibilidade e reconhecimento dentro da empresa é fazer alguma coisa que impacte positivamente no resultado da empresa dela. Seja esse resultado financeiro, operacional ou de qualquer outro tipo.&lt;/p&gt;

&lt;p&gt;O problema é que é muito complicado, como um mero desenvolvedor em uma grande organização, fazer alguma coisa sozinho que faça esse tipo de diferença.&lt;/p&gt;

&lt;p&gt;&quot;Como vou fazer isso?&quot;&lt;/p&gt;

&lt;p&gt;Geralmente toda equipe de desenvolvimento tem um gerente (independentemente de ser um gerente tradicional ou não) ou algum tipo de chefe. Esse gerente tem problemas ou objetivos a cumprir e se utiliza de sua equipe (se não utiliza, deveria) para resolve-los. Em uma empresa organizada, esse problema que ele tem que resolver deve estar alinhado com os objetivos da empresa. Sendo assim, como membro do time de desenvolvimento, você deve descobrir qual o problema que seu time deve resolver e trabalhar o máximo que puder para resolve-lo ou pelo menos ajudar seu time a faze-lo. Dessa maneira você estará ajudando seu time e de brinde seu gerente, pois o problema que ele tinha já não exisitirá mais.&lt;/p&gt;

&lt;p&gt;Nesse momento, somente pelo fato de trabalhar pela equipe e cumprir um objetivo que não é pessoal, você já deve se sentir bem.&lt;/p&gt;

&lt;p&gt;Se seu gerente também estiver alinhado com esse pensamento e estiver tentando resolver o problema do chefe dele, com essa sucessão de acontecimentos você vai acabar resolvendo ou contribuindo para a solução do problema do chefe do seu chefe. E assim a coisa vai até o topo da empresa...&lt;/p&gt;

&lt;p&gt;&quot;Mas ai meu gerente vai pegar todo meu crédito? Nem a pau!&quot;&lt;/p&gt;

&lt;p&gt;É, podemos dizer que ele irá, mas esse é o trabalho dele. Como gerente, ele deve utilizar-se das pessoas corretas (uma dessas pessoas é você) nos lugares corretos para atingir um objetivo. Quando você menos esperar, você estará contribuindo para um movimento que provavelmente fará a diferença no resultado da empresa. Dessa forma, seu chefe será reconhecido e conforme as coisas forem avançando isso irá refletir em você também.&lt;/p&gt;

&lt;p&gt;Não podemos esquecer, que acima de tudo, estamos trabalhando para uma empresa. Essa empresa tem objetivos a serem cumpridos. É muito fácil falar que devemos estar alinhados com esses objetivos. Difícil é realmente estar alinhado, mas faz parte do nosso trabalho tentar.&lt;/p&gt;

&lt;p&gt;Se a organização conseguir passar esses objetivos para seus funcionarios e estes se comprometerem realmente para com a equipe inevitavelmente todos irão ganhar. Espirito de equipe é fundamental!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>DDD no Entity Framework</title>
   <link href="http://blog.tucaz.net/2008/09/11/ddd-no-entity-framework"/>
   <updated>2008-09-11T02:15:18+00:00</updated>
   <id>http://blog.tucaz.net/2008/09/11/ddd-no-entity-framework</id>
   <content type="html">&lt;p&gt;Essa informação é não a mais nova do mundo (saiu há 3 meses atrás), mas da mesma maneira que passou desapercebido pra min e pro &lt;a href=&quot;http://unplugged.giggio.net/unplugged/post/Microsoft-de-olho-em-Domain-Driven-Design.aspx&quot;&gt;Giovanni Bassi&lt;/a&gt; (que foi onde eu vi hoje), pode ter passado pra muita gente e eu acho mais do que legítimo divulgar.&lt;/p&gt;

&lt;p&gt;Depois do &lt;a href=&quot;http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/&quot;&gt;oba-oba&lt;/a&gt; que a comunidade fez contra o Entity Framework que acabou saindo meio mal acabado e ainda totalmente focado em banco de dados sem suporte a PI para POCOs no SP1 a Microsoft finalmente deu uma dentro.&lt;/p&gt;

&lt;p&gt;Eles convidaram Eric Evans (criador do domain-driven design), Martin Fowler (não preciso dizer quem é, né?), Jimmy Nilsson (praticante de DDD com .NET que escreveu um &lt;a href=&quot;http://blog.tucaz.net/2008/08/15/applying-domain-driven-design-and-patterns-resenha/&quot;&gt;ótimo livro&lt;/a&gt;), Stephen Forte e Pavel Hruby para formar um conselho com o objetivo de palpitar a respeito de como o Entity Framework deveria ser remodelado.&lt;/p&gt;

&lt;p&gt;Com esse pessoal todo envolvido e mais algumas coisas que o pessoal anda soltando no &lt;a href=&quot;http://blogs.msdn.com/efdesign/default.aspx&quot;&gt;blog do EF&lt;/a&gt;, boto fé que vem coisa boa ai pela frente!&lt;/p&gt;

&lt;p&gt;A &quot;notícia&quot; pode ser vista com mais detalhes neste &lt;a href=&quot;http://blogs.msdn.com/dsimmons/archive/2008/06/03/dp-advisory-council.aspx&quot;&gt;link&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Inspeção e adaptação: a força dos processos ágeis</title>
   <link href="http://blog.tucaz.net/2008/09/08/inspecao-e-adaptacao-a-forca-dos-processos-ageis"/>
   <updated>2008-09-08T07:13:31+00:00</updated>
   <id>http://blog.tucaz.net/2008/09/08/inspecao-e-adaptacao-a-forca-dos-processos-ageis</id>
   <content type="html">&lt;p&gt;Até começarmos a utilizar Scrum eu nunca havia entendido direito o mecanismo chamado de inspeção e adaptação. Toda a minha experiência com desenvolvimento de software até então era com utilização de processos cascata em caixinha. Eu chamo de processos em caixinha aqueles processos utilizados em grandes consultorias geralmente mantidos por uma equipe de tamanho razoavel que tem como principal responsabilidade escrever e gerenciar diversos templates de documentos. O interessante é que quase nunca as pessoas sabem porque devem preencher esses documentos e na maioria das vezes nem as pessoas que escrevem os templates sabem pra que eles servem.&lt;/p&gt;

&lt;p&gt;Nessa época eu sempre me perguntava se era realmente necessário documentar nos mínimos detalhes tudo que era feito dentro do projeto e, quando eu falo de documentar não me refiro somente a artefatos intimamente ligados com código como especificações e modelos, mas também a extensas planilhas de rastreabilidade, longos emails com cópia pra Deus e o mundo entre outros tipos de documentos que completam essa lista.&lt;/p&gt;

&lt;p&gt;No final, esses documentos eram todos utilizados pra poder garantir os selos de ISO e CMM que a consultoria buscava ou já mantinha.&lt;/p&gt;

&lt;p&gt;No entanto, nunca nenhum desses milhares de documentos que só enchiam o Source Control ajudou algúem em alguma ocasião de problema. Muito pelo contrário: as vezes o cidadão tomava uma bela chamada porque não mantinha os malditos documentos atualizados. Também pudera, diversos documentos espalhados e sem nenhuma utilidade prática. Quem é que tem paciência de manter atualizado um troço desses?&lt;/p&gt;

&lt;p&gt;Em uma dessas empresas que trabalhei, numa determinada época, os desenvolvedores tiveram que estudar a respeito de Six Sigma, pois uma auditoria estava próxima e todos deveriam estar com as respostas prontas na ponta da lingua. Foi ai que eu tive o primeiro contato com o mecanismo que intitula este post. Ai foi só ligar as peças. Todos esses documentos que a equipe gerava deveriam servir como base histórica para consulta a fim de melhorar futuras estimativas e antecipar problemas, ou seja, inspecionar e adaptar!&lt;/p&gt;

&lt;p&gt;O problema é que apesar de termos diversos documento e dos mantenedores de processo apostarem suas vidas quando diziam que as metodologias de caixinha utilizavam deste mecanismo, nunca faziamos nada parecido com uma sprint retrospective, por exemplo. Este é o grande ponto falho de modelos cascata. Como tudo é feito de uma vez, fase a fase, quando percebemos que alguma coisa foi mal (geralmente nas últimas semanas de projeto) já é muito tarde pra correr atrás do problema. Tudo o que sobra então é procurar quem culpar.&lt;/p&gt;

&lt;p&gt;Inspeção e adaptação é um dos mecanismos mais importantes e úteis que você pode utilizar pra melhorar seu trabalho. E é ai que a força dos processos ágeis está. E não são necessários documentos para isso. Basta comunicação fluente e contínua entre os membros da equipe.&lt;/p&gt;

&lt;p&gt;Os processos agéis são a evolução do &lt;a href=&quot;http://pt.wikipedia.org/wiki/Modelo_em_cascata&quot;&gt;modelo cascata&lt;/a&gt;. No entanto essa retroalimentação do processo é algo que foi deixada de lado.&lt;/p&gt;

&lt;p&gt;Modelos ágeis nos forçam a olhar pra trás frequentemente para ver onde erramos e onde acertamos. Dentro do Scrum nós temos pelo menos dois momentos para realizar a inspeção e adaptação: Daily Meeting e Sprint Retrospective. Essa primeira reunião executa este processo de maneira menos formal, mas possibilita que todos os membros do time sincronizem seus trabalhos e evitem cometer erros que outros membros já cometeram. Isso acontece naturalmente na conversa diária de quinze minutos. Já no Sprint Retrospective, que no meu caso acontece de duas em duas semanas, todos estão focados para identificar o que não foi legal e poder corrigir e continuar executando o que estiver dando certo.&lt;/p&gt;

&lt;p&gt;Contudo, existe uma coisa que pode prejudicar essa retroalimentação: a incapacidade dos membros do time entenderem que as críticas não são pessoais, mas para críticas as atitudes que levam a falha e ao erro. É importantíssimo que todos no time saibam aceitar quando erraram e procurar melhorar, pois só um time que não deixa de se criticar a cada momento consegue ter pleno sucesso. A crítica é a base para o crescimento.&lt;/p&gt;

&lt;p&gt;E funciona porque o processo é executado todo o tempo, e desvios são encontrados quando ainda há tempo de corrigi-los. É o puro exercício do aprendizado contínuo!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Eba! Primeira certificação Microsoft!</title>
   <link href="http://blog.tucaz.net/2008/09/03/eba-primeira-certificacao-microsoft"/>
   <updated>2008-09-03T20:56:05+00:00</updated>
   <id>http://blog.tucaz.net/2008/09/03/eba-primeira-certificacao-microsoft</id>
   <content type="html">&lt;p&gt;Esse é um post mais pessoal do que técnico ou com contribuição profissional. Ontem fiz minha primeira prova de certificação microsoft, a &lt;a href=&quot;http://www.microsoft.com/learning/en/us/exams/70-536.aspx&quot;&gt;70-536&lt;/a&gt;, e passei! :D&lt;/p&gt;

&lt;p&gt;O engraçado foi que, na metade da prova, eu tinha certeza que já tinha reprovado. A prova tem duração de 3 horas e 40 questões. Em menos de 30 minutos estava prontinha!&lt;/p&gt;

&lt;p&gt;O fato de achar que tinha reprovado não foi porque não estudei (eu não estudei mesmo), mas sim pelo fato da prova não cobrar nada que seja realmente útil ou do dia-a-dia. Fiquei decepcionado com o conteúdo da prova. Foram muitas questões a respeito de COM+ que na minha opinião já não tem mais nada a ver com a atualidade da plataforma e várias questões também sobre aspectos de segurança que eu particularmente nunca usei e acredito que nunca vou usar.&lt;/p&gt;

&lt;p&gt;Eu nunca valorizei muito certificações, principalmente Microsoft que até pouco tempo atrás era bem mais fraca, e por isso demorei tanto tempo pra tirar a primeira. Hoje, no nível atual das certificações que já incluem WCF, WWF e WPF acho que começa a ser interessante e valer a pena, pelo menos pela realização pessoal.&lt;/p&gt;

&lt;p&gt;Mesmo assim, certificação na minha opinião serve mais como um mecanismo pessoal que diz que o sujeito se interessou e deu-se o trabalho de estudar e fazer as provas do que como um mecanismo de avaliação técnica.&lt;/p&gt;

&lt;p&gt;Quem quiser fazer sua prova, pode aproveitar o &lt;a href=&quot;http://blog.tucaz.net/2008/08/23/certificacoes-microsoft-em-dobro/&quot;&gt;second shot que ainda está valendo&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Agile Project Management with Scrum: Resenha</title>
   <link href="http://blog.tucaz.net/2008/09/01/agile-project-management-with-scrum-resenha"/>
   <updated>2008-09-01T22:22:10+00:00</updated>
   <id>http://blog.tucaz.net/2008/09/01/agile-project-management-with-scrum-resenha</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/214WVTC2UjL._BO2,204,203,200_PIsitb-sticker-arrow-click-small,TopRight,12,-30_AA300_SH20_OU01_.jpg&quot; class=&quot;book-cover&quot;&gt;&lt;/p&gt;

&lt;p&gt;Assim como o &lt;a href=&quot;http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1220317847&amp;amp;sr=8-1&quot;&gt;livro do Eric Evans&lt;/a&gt; está para modelagem e DDD este livro do Ken Schwaber está para agilidade. É com certeza um “must read”.&lt;/p&gt;

&lt;p&gt;Comprei na Livraria Cultura por R$71,00 e tem pouco mais de 150 páginas . O livro é importado então demora um bucadinho pra chegar. No meu caso foram aproximadamente 4 semanas.&lt;/p&gt;

&lt;p&gt;O livro não é uma bíblia explicando como utilizar Scrum e nem um guia de implantação da metodologia (até porque os processos e regras são bem simples e existe um &lt;a href=&quot;http://www.amazon.com/Agile-Software-Development-SCRUM/dp/0130676349/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1220318064&amp;amp;sr=8-1&quot;&gt;outro livro&lt;/a&gt; do mesmo autor com esse intuito), mas sim uma parte da experiência que o Ken acumulou a respeito de Scrum desde sua criação e gerenciamento e desenvolvimento de projetos de software.&lt;/p&gt;

&lt;p&gt;Apesar de não ser a bíblia, até quem não conhece pode comprar o livro e tirar muito proveito dele, pois o primeiro capítulo e os apêndices são dedicados a descrição do processo e as regras que a metodologia diz que você deve seguir.&lt;/p&gt;

&lt;p&gt;O restante dos capítulos é dedicado a histórias curtas (de 2 ou 3 páginas cada) narradas pelo autor e tem como objetivo dar uma mão para aqueles que já implantaram Scrum, mas engasgam no meio do caminho e/ou tem algumas dúvidas a respeito do que pode e não pode.&lt;/p&gt;

&lt;p&gt;Como exemplo do conhecimento que o livro oferece, posso citar uma história onde o cliente/patrocinador de um determinado projeto não queria saber de processos e metodologias, mas ainda sim queria poder acompanhar o andamento de seus proejtos. Como tudo o que o cidadão conhecia para acompanhamento de projetos era &lt;a href=&quot;http://en.wikipedia.org/wiki/Gantt_chart&quot;&gt;Gantt Chart&lt;/a&gt;, Ken e o Scrum Master do projeto tiveram que bolar outra forma, sem fugir das premissas do Scrum, de reportar o andamento do projeto com sucesso ao gestor ranzinza.&lt;/p&gt;

&lt;p&gt;Histórias referentes a todos os papéis do Scrum e suas dificuldades particulares aparecem no livro. Outro ponto interessante que vale a pena citar é que diversas formas de customização e adaptação da metodologia são apresentadas no livro e esse tipo de informação é&lt;em&gt; muito valiosa&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;De fácil leitura e entendimento, é um livro obrigatório para os agilistas adeptos de Scrum, escrito por um dos criadores da metodologia e praticante até hoje, que vai ajudar MUITO aqueles que já aplicam Scrum e dar uma prévia dos benefícios oferecidos pelas práticas ágeis aos entusiastas e &quot;scrum-master-wannabe’s&quot; de plantão.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Mudança de endereço do blog</title>
   <link href="http://blog.tucaz.net/2008/09/01/mudanca-de-endereco-do-blog"/>
   <updated>2008-09-01T01:31:11+00:00</updated>
   <id>http://blog.tucaz.net/2008/09/01/mudanca-de-endereco-do-blog</id>
   <content type="html">&lt;p&gt;Nesta última semana que passou postei pouco por diversos motivos (vocês vão ver daqui a alguns dias). Um deles é a mudança de endereço do blog. Agora com domínio e hospedagem própria (hospedando no &lt;a href=&quot;http://www.eapps.com&quot;&gt;eapps.com&lt;/a&gt;). Vou manter este aqui por mais alguns dias para que todos possam atualizar seus bookmarks.&lt;/p&gt;

&lt;p&gt;O novo endereço é:&lt;/p&gt;

&lt;h2&gt;&lt;strong&gt;&lt;a href=&quot;http://blog.tucaz.net&quot;&gt;http://blog.tucaz.net&lt;/a&gt;&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;(bem grande pra dar destaque!!! ehehhee)&lt;/p&gt;

&lt;p&gt;Quem assinava o blog pelo feedburner não deve ter problemas em continuar recebendo as atualizações, mas quem assinava pelo link aqui do wordpress favor atualizar também:&lt;/p&gt;

&lt;h2&gt;&lt;a href=&quot;http://blog.tucaz.net/feed&quot;&gt;http://blog.tucaz.net/feed&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;O Host fica localizado nos EUA, portanto é possível que o acesso fique um pouquinho mais lento. Trocar de host vai me permitir muito mais liberdade em futricar no blog e ir melhorando cada vez mais. Ao longo dos próximos dias ainda vou estar mexendo e migrando algumas informações, mas vou tentar não fazer bobagem para que o blog não fique fora do ar.&lt;/p&gt;

&lt;p&gt;Se alguém tiver qualquer tipo de problema de acesso (dns, feed, encoding, etc) favor me avisar pra eu corrigir o mais rápido possível.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Download Full .NET Framework SP1</title>
   <link href="http://blog.tucaz.net/2008/08/25/download-full-net-framework-sp1"/>
   <updated>2008-08-25T15:24:18+00:00</updated>
   <id>http://blog.tucaz.net/2008/08/25/download-full-net-framework-sp1</id>
   <content type="html">&lt;p&gt;Eu gosto bastante do site da Microsoft, mas tenho uma dificuldade pessoal. Sempre que sai um SP de alguma ferramenta da Microsoft eles disponibilizam um setup de ~2Mb e esse é quem baixa todos os arquivos necessários para a instalação da atualização.&lt;/p&gt;

&lt;p&gt;No entanto, se você vai instalar a atualização no servidor, não se pode dar ao luxo de conecta-lo na internet para que o download seja feito. Você precisa de uma versão completa do pacote de atualização e é ai que eu me complico pra achar (podem rir...). Dessa vez até que foi rápido, mas pra quem não quiser ter o trabalho de procurar como eu é só clicar &lt;a href=&quot;http://download.microsoft.com/download/2/0/e/20e90413-712f-438c-988e-fdaa79a8ac3d/dotnetfx35.exe&quot;&gt;aqui&lt;/a&gt; e baixar o arquivo completo.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Certificações Microsoft em dobro!</title>
   <link href="http://blog.tucaz.net/2008/08/23/certificacoes-microsoft-em-dobro"/>
   <updated>2008-08-23T01:29:35+00:00</updated>
   <id>http://blog.tucaz.net/2008/08/23/certificacoes-microsoft-em-dobro</id>
   <content type="html">&lt;p&gt;Post rápido!&lt;/p&gt;

&lt;p&gt;Foi reaberto o programa Second Shot da Microsoft que permite que, caso você falhe na primeira prova, você possa fazer a segunda &quot;de-grátis-na-faixa&quot;!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.microsoft.com/learning/mcp/offers/secondshot/default.mspx&quot;&gt;Clique aqui&lt;/a&gt; pra pegar seu voucher.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Daily Meeting e Reunião do AA</title>
   <link href="http://blog.tucaz.net/2008/08/21/daily-meeting-e-reuniao-do-aa"/>
   <updated>2008-08-21T17:04:07+00:00</updated>
   <id>http://blog.tucaz.net/2008/08/21/daily-meeting-e-reuniao-do-aa</id>
   <content type="html">&lt;p&gt;No nosso último Daily Meeting o Gustavo fez um comentário interessante &quot;Pô! Isso aqui tá parecendo reunião dos alcólicos anônimos!&quot;. Depois desse dia eu fui dar uma procurada e de fato o Daily Meeting ou Daily Scrum é bastante parecido com uma &lt;a href=&quot;http://www.aaceara.org.br/sobre_o_aa.asp&quot;&gt;reunião do AA&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;São diversas as semelhanças no modus operandi, logo os resultados podem no mínimo ser parecidos.&lt;/p&gt;

&lt;p&gt;As duas reuniões tem como objetivo a comunicação e utilizar dessa comunicação pra que todos os participantes saiam no &lt;a href=&quot;http://www.golfinho.com.br/artigospnl/artigodomes1299.htm&quot;&gt;ganha-ganha&lt;/a&gt;. Quando tornamos hábito o fato de expor nosso dia-a-dia para os outros membros na equipe (assim como no AA) automaticamente o relacionamento entre as pessoas fica melhor e por termos vergonha de falar que fizemos alguma bobagem (beber, por exemplo) nos preocupamos mais com nossas ações e o resultado que elas podem trazer. Outro grande benefício é que podemos compartilhar experiências ruins para que possamos ser ajudados e experiências boas para ajudar outras pessoas.&lt;/p&gt;

&lt;p&gt;O melhor de tudo é que o processo todo é bastante simples. Podemos dizer que o custo X benefício é excelente!&lt;/p&gt;

&lt;p&gt;Portanto, não deixem de fazer o Daily Meeting!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Estamos contratando!</title>
   <link href="http://blog.tucaz.net/2008/08/19/estamos-contratando"/>
   <updated>2008-08-19T13:02:37+00:00</updated>
   <id>http://blog.tucaz.net/2008/08/19/estamos-contratando</id>
   <content type="html">&lt;p&gt;Agora que o blog está ganhando um pouquinho mais de visitas acho que já posso usar dele pra me ajudar a agregar pessoas a equipe. Há pouco tempo atrás eu postei a respeito de como é &lt;a href=&quot;http://tucaz.wordpress.com/2008/07/31/as-pessoas-merecem-o-trabalho-que-tem/&quot;&gt;difícil contratar bem&lt;/a&gt; hoje e ainda temos vagas aqui na equipe a serem preenchidas.&lt;/p&gt;

&lt;p&gt;Nesse momento, acho que não tem como não roubar um poquinho da descrição das &lt;a href=&quot;http://blog.fragmental.com.br/2007/02/24/we-want-you-again/&quot;&gt;vagas&lt;/a&gt; que o &lt;a href=&quot;http://fragmental.tw&quot;&gt;Philip&lt;/a&gt; anunciava em sua época de Globo.com.&lt;/p&gt;

&lt;p&gt;Um dos meu objetivos, desde que assumi posições de liderança, eram prover para a equipe um ambiente bastante descontraido, uso de tecnologia de ponta e todos os outros recursos necessários para que pudessemos trabalhar de forma adequada.&lt;/p&gt;

&lt;p&gt;Hoje já estamos muito próximos dessa realidade (ainda temos problemas, é claro!) e a cada dia estamos trabalhando para elevar o conhecimento da equipe, portanto alguns dos requisitos para a vaga são:&lt;/p&gt;

&lt;p&gt;Ter vontade de aprender e aceitar estar errado, pois nos desafiamos nossas soluções diariamente então o que era bom ontem pode não ser mais bom hoje e todo mundo em determinado momento vai ter sua solução questionada. Buscar soluções novas o tempo todo a fim de melhorar nosso trabalho e entender quando alguma solução não puder ser aplicada naquele momento.&lt;/p&gt;

&lt;p&gt;Deve conhecer razoavelmente bem modelagem (atualmente nós utilizamos DDD) e gostar de desenhar (muito papel também!), pois todo o trabalho de criação é feito sem o uso de ferramentas.&lt;/p&gt;

&lt;p&gt;Conhecimento e experiência em processos agéis são um diferencial, mas não obrigatório. No entanto (sei que estou sendo repetitivo) ter mente aberta é muito importante. Aqui a equipe decide como as coisas vão funcionar. Não é o gerente , não é o arquiteto, não é o analista e nem o desenvolvedor. Nós trabalhamos em equipe, portanto auto organização é vital.&lt;/p&gt;

&lt;p&gt;Utilizamos Scrum como processo e diversas práticas de XP tais como TDD e Integração Continua. Conhecimentos em infra-estrutura que ajudem a facilitar esses processos são muito bem vindos, pois atualmente temos poquissimas pessoas pra cuidar disso o que acaba sobrecarregando um pouquinho elas.&lt;/p&gt;

&lt;p&gt;Como ambiente técnico nós utilizamos somente Microsoft, ou seja, .NET 3.5, SQL 2008/2008, VSTS 2008 e todas suas ferramentas (Database edition, Test edition, etc), Team System como ferramenta de apoio a projeto e muita tecnologia web 2.0 (REST, Ajax, frameworks JS, etc). Trabalhamos também com Spring, frameworks ORM e diversos padrões de projeto.&lt;/p&gt;

&lt;p&gt;Dentre todos os aspectos, acredito que conhecimento técnologico tem a menor importância no processo de contratação. Durante o tempo que trabalho com .NET já tivemos 2 caras na equipe que vieram de Java e nunca tiveram nenhum contato com .NET e com certeza eles fazem parte dos melhores que trabalharam comigo. Inclusive, se houver alguém de Java interessado em conhecer a plataforma Microsoft será muito bem vindo! :)&lt;/p&gt;

&lt;p&gt;As vagas são pra Pinheiros em São Paulo capital, contratação como Pessoa Jurídica e remuneração relativamente interessante.&lt;/p&gt;

&lt;p&gt;De uma forma geral, acho que é isso! Quem tiver interesse favor enviar um curriculum em PDF ou em DOC para azegunis@stefanini.com.br e aguardar contato.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Applying Domain-Driven Design and Patterns with examples C# and .NET: Resenha</title>
   <link href="http://blog.tucaz.net/2008/08/15/applying-domain-driven-design-and-patterns-resenha"/>
   <updated>2008-08-15T20:22:54+00:00</updated>
   <id>http://blog.tucaz.net/2008/08/15/applying-domain-driven-design-and-patterns-resenha</id>
   <content type="html">&lt;p&gt;&lt;img alt=&quot;Applying Domain-Driven Design and Patterns&quot; src=&quot;http://ecx.images-amazon.com/images/I/51yQ7TZUVAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA278_PIkin4,BottomRight,-50,22_AA300_SH20_OU01_.jpg&quot; class=&quot;book-cover&quot;&gt;&lt;/p&gt;

&lt;p&gt;Terminei essa semana de ler o livro do &lt;a href=&quot;http://www.amazon.com/exec/obidos/search-handle-url?_encoding=UTF8&amp;amp;search-type=ss&amp;amp;index=books&amp;amp;field-author=Jimmy%20Nilsson&quot;&gt;Jimmy Nilson&lt;/a&gt; &lt;a href=&quot;http://www.amazon.com/Applying-Domain-Driven-Design-Patterns-Examples/dp/0321268202&quot;&gt;&quot;Applying Domain-Driven Design and Patterns: with examples in C# and .NET&quot;&lt;/a&gt; e vou compartilhar minhas impressões.&lt;/p&gt;

&lt;p&gt;É um livro com 11 capítulos, 2 apendíces e aproximadamente 500 páginas. Paguei R$100,00 na &lt;a href=&quot;http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=1372086&amp;amp;sid=19412718610721322379644546&amp;amp;k5=2E1CA023&amp;amp;uid=645446973683189&quot;&gt;Livraria Cultura&lt;/a&gt; e chegou em menos da metade das 8 semanas prometidas no site.&lt;/p&gt;

&lt;p&gt;Geralmente livros técnicos depois de algumas página se tornam cansativos de ler. Não li nenhum outro livro deste autor anteriormente, mas o cara escreve de uma forma muito gostosa e tranquila de se ler. Nos primeiros dias eu não conseguia fechar o livro. Tive que me segurar pra não passar a madrugada lendo.&lt;/p&gt;

&lt;p&gt;Quando comprei o livro imaginei que fosse unicamente a respeito de DDD, mas na prática são poucos os capítulos referentes a esse assunto.&lt;/p&gt;

&lt;p&gt;O primeiro capítulo é bastante interessante (principalmente pra quem não está acostumado com agilidade, DDD e Testes) porque ele conceitua esses pontos de uma forma que é impossível não ter vontade de aplicar e ler mais sobre.&lt;/p&gt;

&lt;p&gt;A partir dai e durante todo o livro ele apresenta diversos design patterns e como aplicá-los em situações práticas. Existe também um capítulo inteiro sobre TDD que passa por todos os aspectos desde o ciclo de desenvolvimento com TDD, mocks e stubs, e até técnicas de refatoração.&lt;/p&gt;

&lt;p&gt;A partir do quarto capítulo que ele comça a falar propriamente dos novos aspectos da modelagem orientada ao domínio e da nova proposta de arquitetura. Sempre com &lt;strong&gt;muitos&lt;/strong&gt; exemplos de código e modelos.&lt;/p&gt;

&lt;p&gt;Antes de ler o livro eu havia lido muito a respeito de DDD no &lt;a href=&quot;http://www.guj.com.br&quot;&gt;GUJ&lt;/a&gt;, no &lt;a href=&quot;http://www.infoq.com/minibooks/domain-driven-design-quickly&quot;&gt;resumo do livro do Evans&lt;/a&gt; e mais da metade do &lt;a href=&quot;http://domaindrivendesign.org/books/index.html#DDD&quot;&gt;livro que deu origem ao resumo&lt;/a&gt;. Exatamente nesta ordem. Então já estava bem familiarizado com os novos conceitos e já havia aplicado bastante.&lt;/p&gt;

&lt;p&gt;Acho que por conta disso, me decepcionei um pouquinho, pois o Jimmy Nilson falou quase nada a respeito de Services e de interações mais complexas entre objetos. Outro ponto que me deixou bastante frustrado foi o fato dos exemplos dos repositórios serem implementados apenas com ORM (NHibernate no caso deste livro). Em Java ORM é uma realidade. Em .NET a coisa ainda está começando a andar com o &lt;a href=&quot;http://msdn.microsoft.com/en-us/netframework/aa904594.aspx&quot;&gt;LINQ&lt;/a&gt;, &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa697427(VS.80&quot;&gt;EF&lt;/a&gt;.aspx) e o próprio NHibernate, mas a maioria das pessoas ainda implementa acesso a dados na mão. No fundo, acho que o fato de implementar repositório de forma elegante apenas com ORM é um problema do padrão e não do livro (esse é assunto pra um outro post que vai render pedras). Eu particularmente gosto muito de implementar na mão (mais pedras!).&lt;/p&gt;

&lt;p&gt;Outro ponto que ficou por último, mas sem menos importância é UI. Ele fala de UI com MVC e MVP inclusive a respeito de como testar a UI. No entanto achei que os exemplos nesse caso não ficaram legais principalmente pelo fato de durante todo o livro o conceito de web ser enfatizado e no caso da UI os testes serem escritos com exemplos em Windows Forms.&lt;/p&gt;

&lt;p&gt;Já ao final do livro alguns colegas dele falam a respeito de outros padrões e frameworks tais como: PI utilizando POCO/POJO, SOA, AOP, DI, IoC, NHibernate e SPRING. Inclusive este livro serve como um bom início para o aprendizado desses frameworks, pois os exemplos ilustram cenários bastante reais e práticos.&lt;/p&gt;

&lt;p&gt;E por último mais alguns colegas explicam outras abordagens de design de aplicação orientada a domínio.&lt;/p&gt;

&lt;p&gt;Se você ficou empolgado por imaginar que fosse encontrar bons exemplos de como testar sua UI nesse livro, acho que essa não é a melhor literatura. Mas para todo o restante dos assuntos é um livro altamente recomendado e que me proporcionou muito aprendizado durante a leitura.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>MSBuild com Team System e template de Scrum</title>
   <link href="http://blog.tucaz.net/2008/08/14/msbuild-com-team-system-e-template-de-scrum"/>
   <updated>2008-08-14T13:59:52+00:00</updated>
   <id>http://blog.tucaz.net/2008/08/14/msbuild-com-team-system-e-template-de-scrum</id>
   <content type="html">&lt;p&gt;Hoje estou trabalhando na &lt;a href=&quot;http://martinfowler.com/articles/continuousIntegration.html&quot;&gt;integração continua&lt;/a&gt; do &lt;a href=&quot;http://www.fnac.com.br/&quot;&gt;nosso projeto&lt;/a&gt; utilizando Team Build do Team System. Quando um Build falha, por padrão um Work Item de Bug é criado pela próprio Team Build. No entanto, se você estiver utilizando um template diferente do padrão (nós utilizamos o template do &lt;a href=&quot;http://www.scrumforteamsystem.com/en/default.aspx&quot;&gt;Scrum&lt;/a&gt;) é provável que o Work Item de Bug não seja criado, pois os campos do arquivo padrão do MSBuild que mapeia pro Work Item são diferentes do padrão.&lt;/p&gt;

&lt;p&gt;Pra corrigir isso basta abrir o arquivo.proj do seu Build e comentar/apagar/modificar as regiões que ele não estiver conseguindo mapear. No meu caso, o único campo que ele tentava mapear errado era a Reason do Bug que não existe no template do Scrum.&lt;/p&gt;

&lt;p&gt;Então no arquivo.proj comentei a seguinte parte:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;WorkItemFieldValues&amp;gt;System.Reason=Build Failure;System.Description=Start the build using Team Build&amp;lt;/WorkItemFieldValues&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;que ficou:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;!-- 
&amp;lt;WorkItemFieldValues&amp;gt;System.Reason=Build Failure;System.Description=Start the build using Team Build&amp;lt;/WorkItemFieldValues&amp;gt;
--&amp;gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pronto!&lt;/p&gt;

&lt;p&gt;Ainda estou engatinhando com o MSBuild. Minhas primeiras impressões são de que ele não é tão difícil quanto parece (principalmente se você gostar de XML, o que não é meu caso) e é bastante completo.&lt;/p&gt;

&lt;p&gt;Achei dois links interessantes pra compartilhar:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blogs.conchango.com/stuartpreston/archive/2007/07/29/Using-MSBuild-with-the-Visual-Studio-IDE-and-Source-Control.aspx&quot;&gt;Blog do Stuart da Conchango (mantenedora do template do Scrum pro Team System)&lt;/a&gt; que criou um template de projeto pro visual studio só pra cuidar de builds. Ainda não testei (estou baixando agora), mas parece bem bacana.&lt;/p&gt;

&lt;p&gt;E um outro link muito básico, mas que muita gente tem dificuldade de achar que é a &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms171452(VS.80&quot;&gt;documentação oficial do MSBuild&lt;/a&gt;.aspx).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Agilidade na confecção de roupas!</title>
   <link href="http://blog.tucaz.net/2008/08/10/agilidade-na-confeccao-de-roupas"/>
   <updated>2008-08-10T17:30:10+00:00</updated>
   <id>http://blog.tucaz.net/2008/08/10/agilidade-na-confeccao-de-roupas</id>
   <content type="html">&lt;p&gt;Ontem a tarde descobri uma coisa interessante: Agilidade é coisa de mulher!&lt;/p&gt;

&lt;p&gt;Brincadeira! Mas de fato, em uma conversa ontem com a patroa descobri que as mulheres (pelo menos ela) tem mais facilidade pra entender alguns principios da agilidade do que muitos homens.&lt;/p&gt;

&lt;p&gt;Estavamos conversando sobre nossos trabalhos (ela trabalha com logística/compras) e caimos no papo de projetos em geral e no porque especifíco da &lt;a href=&quot;http://www.crisippolite.com/?p=11&quot;&gt;maioria dos projetos de software falharem&lt;/a&gt;. Expliquei pra ela que um dos motivos é a utilização de &lt;a href=&quot;http://pt.wikipedia.org/wiki/Modelo_em_cascata&quot;&gt;modelos em cascata&lt;/a&gt; onde em um projeto de 12 meses o fornecedor fica 4 meses junto com o cliente no início do projeto e só da as caras novamente 8 meses depois com um software (ou parte dele apenas) fresquinho funcionando.&lt;/p&gt;

&lt;p&gt;Foi incrível que no momento que terminei de explicar o processo em cascata e ia começar a falar a respeito de agilidade ela me interrompeu (ela não sabe nada de software) e traçou um paralelo MUITO legítimo que serve como um ótimo exemplo da aplicabilidade de métodos agéis. Explico:&lt;/p&gt;

&lt;p&gt;No tempo livre ela pratica &lt;a href=&quot;http://mulher.terra.com.br/interna/0,,OI505237-EI4788,00.html&quot;&gt;dança do ventre&lt;/a&gt; e, esse ano junto com seu grupo de dança, ela participou de duas apresentações abertas ao público. Para isso, o grupo teve que encomendar roupas sob medida e combinando até certo ponto entre si. Foi ai que os problemas começaram. Apesar de seguirem um modelo básico -como quando construimos softwares diferentes para o mesmo seguimento de empresas- cada roupa tinha suas peculiaridades -assim como as regras de negócio especifícas de cada empresa-. Ela passou as necessidades de sua roupa pra professora do grupo -podemos chamá-la de analista de negócios- e essa por sua vez especificou para as costureiras da empresa fornecedora -os programadores!- como o cliente queria a roupa. Conversaram uma ou duas vezes na primeira semana e depois de aproximadamente 3 meses a roupa estava pronta e perfeita!&lt;/p&gt;

&lt;p&gt;Será que estava mesmo?&lt;/p&gt;

&lt;p&gt;É claro que NÃOOOOOOOOOOOOOOOOOOOOOOOOO!&lt;/p&gt;

&lt;p&gt;(Até então eu imaginava que processos em cascata falhassem só em projetos de software, mas pelo jeito parece que não)&lt;/p&gt;

&lt;p&gt;Já com a roupa nas mãos e p*** da vida por ter gasto uma grana preta com a roupa (acreditem, custa caro) que apesar de seguir um esqueleto básico e padronizado não estava nem perto de estar pronta (tamanho, cores e acessórios errados) ela entrou em contato com o fornecedor. Apesar dos problemas ela imaginou que seria possível consertar a roupa a tempo da apresentação que iria acontecer em 1 mês. No entanto, ao final desse mês e no dia da apresentação a roupa tinha sido consertada, mas ainda estava cheia de problemas -assim como as milhares de não conformidades de software feitos por esse processo-. O jeito foi se apresentar do jeito que estava (meia boca) -ida a produção!- e ainda hoje (6 meses depois) ela ainda esta brigando com as costureiras pra ter a roupa 100%.&lt;/p&gt;

&lt;p&gt;O mais interessante é que depois de me contar essa história, ela mesmo conseguiu chegar a solução mais óbvia (que ainda não entra na cabeça da maioria das pessoas no nosso mercado de software) que havia pra evitar ou diminuir os problemas com a roupa: provar semanalmente a roupa junto com as costureiras ao invés de ver apenas o resultado final depois de um tempão. Ou seja, abstraindo um pouco mais temos: &lt;a href=&quot;http://www.controlchaos.com/about/&quot;&gt;ITERATIVIDADE&lt;/a&gt;, &lt;a href=&quot;http://www.linhadecodigo.com.br/ArtigoImpressao.aspx?id=1182&quot;&gt;PARTICIPAÇÂO DO CLIENTE&lt;/a&gt;, ACOMPANHAMENTO FREQUENTE e muitos outros &lt;a href=&quot;http://agilemanifesto.org/principles.html&quot;&gt;príncipios da agilidade&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A idéia dessa analogia que nem saiu da minha cabeça não é mostrar que é possível fazer roupas com metodologias agéis, mas sim o quão prejudicial é desenvolver software sob medida de forma cascateira. Ser ágil, ou ao menos iterativo é muito fácil e os benefícios são claros.&lt;/p&gt;

&lt;p&gt;Ultimamente tenho conversado bastante com pessoal da área comercial e todos confirmam o que nós consultores já sabemos: os clientes estão cansados de perder dinheiro com projeto de software! Acredito que agilidade ainda não é uma coisa mais bem aceita e padronizada no Brasil porque a maioria dos clientes compradores de software ainda não sabem que uma alternativa a processos cascata e escopo fechado existe.&lt;/p&gt;

&lt;p&gt;Sendo assim, por meio desta analogia das roupas ou por &lt;a href=&quot;http://amagno.blogspot.com/2008/07/dentro-do-txi.html&quot;&gt;esta outra do Alexandre Magno&lt;/a&gt; ou ainda com esta do &lt;a href=&quot;http://blog.improveit.com.br/articles/2008/07/24/a-responsabilidade-pelo-sucesso-de-um-projeto&quot;&gt;Vinicius&lt;/a&gt; da &lt;a href=&quot;http://improveit.com.br&quot;&gt;Improve IT&lt;/a&gt; nosso papel é evangelizar os clientes e promover métodos agéis, pois somente desta forma essa bagunça que é nosso mercado hoje vai mudar!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Quando utilizar propriedades ou métodos?</title>
   <link href="http://blog.tucaz.net/2008/08/04/quando-utilizar-propriedades-ou-metodos"/>
   <updated>2008-08-04T09:00:01+00:00</updated>
   <id>http://blog.tucaz.net/2008/08/04/quando-utilizar-propriedades-ou-metodos</id>
   <content type="html">&lt;p&gt;A partir do momento que aceitamos ou escolhemos utilizar orientação a objetos acredito que devemos fazer de tudo para utilizá-la da melhor forma, ou seja, criar modelos simples (não simples demais) e que comuniquem seu objetivo de maneira clara e com fácil entendimento.&lt;/p&gt;

&lt;p&gt;No entanto, poucas são as pessoas que realmente se preocupam se seu modelo está com o mínimo possível de qualidade (&lt;a href=&quot;http://martinfowler.com/bliki/AnemicDomainModel.html&quot;&gt;não é&lt;/a&gt;?), vista a quantidade de modelos orientados a banco de dados que vemos por ai.  Menos pessoas ainda, são as que procuram entender e se aproveitar das sutilezas existentes nos objetos para tornar o modelo mais claro e ter como boa conseqüência a comunicação de suas intenções facilitada.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Bons designers utilizam-se da linguagem pra facilitar seu trabalho.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;O ponto que me motivou a escrever sobre isso é o motivador para utilização de propriedades e métodos. Desde a &lt;a href=&quot;http://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_objeto&quot;&gt;teoria mais básica de orientação a objetos&lt;/a&gt; aprendemos que objetos são classes (entidades) que possuem estado (propriedades) e comportamento (métodos) próprio.&lt;/p&gt;

&lt;p&gt;Em .NET possuímos propriedades nativamente. Em java obtemos propriedades através de métodos get() e set(), por exemplo. Diretamente ou não, todas as linguagens orientadas a objetos fornecem mecanismos para utilização de propriedades. Mas quando devemos utilizar propriedades ao invés de métodos?&lt;/p&gt;

&lt;p&gt;Conforme a própria teoria, propriedades devem refletir o estado de um objeto, ou seja, as características que o definem naquele exato momento de sua vida. Como exemplo simples teríamos dentro de um objeto do tipo Cliente as propriedades: Nome, Telefone, Idade, Sexo, etc. No entanto, a partir do momento em que para responder a uma pergunta sobre seu estado o objeto precise efetuar algum tipo de processamento deveremos transformar a então propriedade em um método, pois propriedades devem ser utilizadas para descrever estado que seja sabido &quot;de bate pronto&quot; pelo objeto em questão. Qualquer outro tipo de resposta a perguntas feitas para o objeto deve ser respondida através de métodos.&lt;/p&gt;

&lt;p&gt;Um exemplo um pouco mais concreto: vamos imaginar que estamos desenvolvendo um sistema de controle de usuários e que no momento de uma exclusão de usuário precisamos saber se ele possui ou não emails.&lt;/p&gt;

&lt;p&gt;Podemos modelar desta maneira:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/post-images/2008/08/class1.jpg&quot;&gt;&lt;img src=&quot;/assets/post-images/2008/08/class1.jpg?w=241&quot; alt=&quot;Utilizando propriedades&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Claro que existem exceções, mas normalmente um usuário não sabe se possui emails (a não ser que fique de 5 em 5 minutos apertando o botão send/receive do outlook! :D) e no caso desta pergunta teria que sair de onde está, ir até sua mesa, abrir seu programa de email e verificar se possui ou não algum email. O administrador poderia checar, mas deveria também executar uma série de operações até descobrir se o usuário possui ou não emails. Sendo assim, acredito que essa operação deveria ser comunicada de forma explicita por meio de um método para que quem estivesse utilizando essa API soubesse que uma operação (processamento) irá ocorrer para checar se existem ou não emails.&lt;/p&gt;

&lt;p&gt;Outro motivo para utilização de métodos nesses casos é a possível necessidade de passagens de parâmetros para essas verificações. Ainda no nosso cenário de controle de usuários, vamos assumir que um novo requisito deve ser implementado: somente os usuários que não receberam emails na última hora podem ser removidos. Se utilizarmos propriedades como no exemplo acima como iríamos fazer? Criar outra propriedade chamada &quot;RecebeuEmailNaUltimaHora&quot;? Ou poderíamos modelar dessa forma:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/post-images/2008/08/class2.jpg&quot;&gt;&lt;img src=&quot;/assets/post-images/2008/08/class2.jpg?w=300&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Desta maneira, acredito que o mundo real seja mais bem representado e o utilizador da API irá utilizar os métodos com mais cuidado, pois o modelo comunica que para fazer essa verificação é necessário processamento (que pode ou não ser pesado). Outro ponto a favor é que podemos ter (quanto menos melhor) diversos métodos para execução de operações, mas caso esse tipo de checagem deva ser feito de diversas maneiras não podemos sair criando uma propriedade para cada um dos cenários senão corremos um sério risco de desconfigurar a identidade do objeto por ter propriedades demais.&lt;/p&gt;

&lt;p&gt;Como tudo em OO, não devemos ter isso como uma regra, mas sim verificar o que é melhor para cada cenário. Acredito que mais do que a sugestão apresentada nesse post, o mais importante é a mensagem de que devemos modelar com cuidado procurando abstrair nosso domínio da maneira mais fiel possível e comunicando o máximo através das ferramentas que a OO nos oferece.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Dica de Blog!</title>
   <link href="http://blog.tucaz.net/2008/07/31/dica-de-blog"/>
   <updated>2008-07-31T11:07:36+00:00</updated>
   <id>http://blog.tucaz.net/2008/07/31/dica-de-blog</id>
   <content type="html">&lt;p&gt;Ontem a noite eu estava navegando atrás de mais informações a respeito de &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms181710.aspx&quot;&gt;Team Build&lt;/a&gt; e encontrei um blog com várias coisas úteis, inclusive add-ons para o próprio &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/fda2bad5.aspx&quot;&gt;Team System&lt;/a&gt;. O blog já não é mais atualizado ha pelo menos um ano, mas os archives são realmente bons.&lt;/p&gt;

&lt;p&gt;O endereço é: http://blogs.vertigosoftware.com/teamsystem/&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>As pessoas merecem o trabalho que tem</title>
   <link href="http://blog.tucaz.net/2008/07/31/as-pessoas-merecem-o-trabalho-que-tem"/>
   <updated>2008-07-31T00:02:07+00:00</updated>
   <id>http://blog.tucaz.net/2008/07/31/as-pessoas-merecem-o-trabalho-que-tem</id>
   <content type="html">&lt;p&gt;Existem algumas coisas que são engraçadas... com qualquer linguagem que se trabalhe, desde as mais novas até as mais antigas, vejo gente reclamando do trabalho que tem. Seja pela empresa que não deixa o cara crescer, seja pela tecnologia que utiliza e não pode mudar ou seja pelo processo que é muito engessado. Só reclamações.&lt;/p&gt;

&lt;p&gt;No entanto nada fazem para mudar isso.&lt;/p&gt;

&lt;p&gt;No meu &lt;a href=&quot;http://www.fnac.com.br&quot;&gt;atual projeto&lt;/a&gt; estamos pagando relativamente bem (se comparado com a maioria das consultorias de body shop), temos um ambiente bastante descontraido, estamos implantando &lt;a href=&quot;http://blog.tucaz.net/2008/07/23/adocao-de-scrum/&quot;&gt;metodologias agéis&lt;/a&gt; no lugar do processo cascata, trabalhamos com tecnologia Microsoft de ponta (.NET 3.5, SQL 2005/2008, SSIS), temos o apoio de &lt;a href=&quot;http://msdn.microsoft.com/en-us/vsts2008/default.aspx&quot;&gt;ótimas&lt;/a&gt; &lt;a href=&quot;http://www.sparxsystems.com.au/&quot;&gt;ferramentas&lt;/a&gt; e ainda assim não conseguimos preencher as três vagas que temos abertas. Por que? Por que exigimos muitos conhecimentos nas tecnologias citadas? Não! Mas porque as pessoas não querem mudar.&lt;/p&gt;

&lt;p&gt;Hoje por exemplo, tinhamos duas entrevistas marcadas. Nenhum dos candidatos apareceu ou sequer ligou para avisar que não iria poder comparecer ou que não tinha mais interesse na vaga. Se formos pensar um pouco no assunto não é muito dificíl entender a razão disso acontecer. De acordo com as pesquisas que o Luciano citou &lt;a href=&quot;http://blogs.msdn.com/luti/archive/2008/07/21/mercado-em-alta-faltam-profissionais-problemas-na-forma-o.aspx&quot;&gt;nesse post&lt;/a&gt; existem mais vagas do que profissionais disponíveis, muito mais! Sendo assim, poucas são as pessoas que dão a atenção devida para um compromisso tão importante como uma entrevista. E mais importante ainda quando a questão $financeira$ e técnica são favoravéis.&lt;/p&gt;

&lt;p&gt;Não é a primeira vez que isso acontece. Nos últimos dois anos sempre esbarramos nessa dificuldade em contratar. Pessoalmente, acho que é uma pena para ambos os lados: a) para o contratante que se vê refém da falta de profissionais ou da esbórnia que é o mercado e é obrigado a contratar sem critérios, contribuindo para que isso continue acontecendo e b) para os profissionais da área que deixam de investir nas formação profissional e pessoal e agem da maneira que descrevi acima. É importante perceber, que nesse momento nem os profissionais e nem as empresas contribuem para mudança desse cenário.&lt;/p&gt;

&lt;p&gt;O ponto positivo é que esse cenário está cada vez mais evidente a todos e é um cenário longe do adequado. Logo, seguindo a lei de &lt;a href=&quot;http://en.wikipedia.org/wiki/Charles_Darwin&quot;&gt;Darwin &lt;/a&gt;(ele mesmo que falou das &lt;a href=&quot;http://en.wikipedia.org/wiki/Natural_selection&quot;&gt;girafas&lt;/a&gt;?), esse modelo deve cair. A partir dai ou as empresas vão diminuir seus projetos de TI por não conseguirem os profissionais necessários ou então os profissionais vão evoluir de acordo com a necessidade das empresas fazendo com que o equilibrio seja alcançado. De um jeito ou de outro, acredito que estamos caminhando para frente. Só espero que não demore &lt;em&gt;tempos demais&lt;/em&gt; até chegarmos lá.&lt;/p&gt;

&lt;p&gt;Claro que essa é apenas uma das minhas teorias com relação a esse assunto dentre as outras que tenho e milhares que podem ser encontradas navegando um pouco na internet.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Scrum Planning!</title>
   <link href="http://blog.tucaz.net/2008/07/25/scrum-planning"/>
   <updated>2008-07-25T01:12:00+00:00</updated>
   <id>http://blog.tucaz.net/2008/07/25/scrum-planning</id>
   <content type="html">&lt;p&gt;Hoje no fim da tarde tivemos nossa primeira reunião de planning. O objetivo era traçar a estratégia para implementar as últimas funcionalidades de um dos módulos do projeto que estamos desenvolvendo. Como o product backlog esta bem pequeno nesse momento serão somente necessários 2 sprints (definimos duas semanas de prazo) pra terminá-lo. Ainda assim acho que a reunião foi bastante produtiva.&lt;/p&gt;

&lt;p&gt;Os pontos positivos foram:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;De uma forma geral todo mundo participou, ou opinando nas funcionalidades ajudando a agregar mais valor ao cliente ou na estimativa do prazo (utilizamos horas ao invés de pontos, pois precisavamos dar um prazo mais confiável pro cliente)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dada a participação das pessoas, existiram ganhos reais nas histórias inicialmente levantadas pelo PO&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A equipe realmente pareceu uma equipe. Existiu um pouco de stress, mas acho que nada acima do que seria normal!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Acredito que o PO ficou bastante confiante com as estimativas e com a qualidade que ele vai receber ao final do sprint&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Conseguimos cumprir os objetivos da reunião nas 4 horas limite :D&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Com relação a pontos negativos, tenho mais do que positivos pra listar, mas de menor valor. São eles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;O espaço pra nossa reunião realmente é muito pequeno então alguns membros do time ficaram relativamente desconfortáveis&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nosso time tem 12 pessoas, ou seja, 4 acima do recomendado pelo SCRUM. Ao final da reunião quebramos em dois times (um deles já vai iniciar outro módulo), mas todos participaram da reunião o que gerou bagunça ao longo da reunião&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Não tinhamos o product backlog inteiramente concluido e nem priorizado então tivemos que parar no meio para inserir as histórias na ferramenta (excel + Team System) para que o PO pudesse priorizar&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Estamos apanhando um pouco da ferramenta. Como não temos espaço pra quadro branco a solução é cadastrar e gerenciar os backlogs e atividades dos sprints através da ferramenta que acaba tirando um pouco do dinamismo do SCRUM.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Como utilizamos quase 4 horas pra fazer tudo que era necessário, não temos lugar muito adequado e não estamos habituados com reuniões dessa duração (principalmente o PO) as vezes o pessoal dispersava a atenção ou entrava em brincadeira, mas conseguimos contornar numa boa&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Por causa do velho hábito ainda fizemos algumas estimativas pensando em quem iria fazer cada atividades quando o ideal seria estimar sem esse direcionamento&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Apesar dos problemas, todos sairam da reunião muito empolgados e com vontade de terminar o sprint logo, pra ver o que vem pela frente.&lt;/p&gt;

&lt;p&gt;Amanhã tem planning do outro módulo com o time 2.Vamos ver o que acontece :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Adoção de Scrum</title>
   <link href="http://blog.tucaz.net/2008/07/23/adocao-de-scrum"/>
   <updated>2008-07-23T21:36:00+00:00</updated>
   <id>http://blog.tucaz.net/2008/07/23/adocao-de-scrum</id>
   <content type="html">&lt;p&gt;Estamos no atual projeto desde fevereiro, trabalhando em modelo cascata dos brabos. Como era de se esperar tivemos todas as terríveis experiências que esse modelo pode proporcionar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inexistência da participação do cliente&lt;/li&gt;
&lt;li&gt;Atraso nas entregas&lt;/li&gt;
&lt;li&gt;Entregas que não atendem o objetivo do cliente&lt;/li&gt;
&lt;li&gt;Foco em documentação que fica desatualizada, ou seja, inútil&lt;/li&gt;
&lt;li&gt;Não cumprimento dos objetivos de ROI&lt;/li&gt;
&lt;li&gt;Bugs&lt;/li&gt;
&lt;li&gt;Retrabalho&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Enfim... fins de semanas perdidos...&lt;/p&gt;

&lt;p&gt;Ta certo que quando iniciamos o projeto nós e o cliente já tinhamos o sentimento de que não iamos concluir tudo no prazo estipulado, mas havia a esperança otimista (falsa, no caso do modelo cascata) de que podiamos superar as expectativas.&lt;/p&gt;

&lt;p&gt;Fazem uns 3 meses que eu venho lendo bastante a respeito de agilidade no &lt;a href=&quot;http://www.guj.com.br&quot;&gt;GUJ&lt;/a&gt; e blogs do pessoal de lá e chegou a hora de mudar.&lt;/p&gt;

&lt;p&gt;No último sábado participei do &lt;a href=&quot;http://www.aspercom.com.br/ead/course/view.php?id=15&quot;&gt;Workshop de SCRUM&lt;/a&gt; com o &lt;a href=&quot;http://blog.aspercom.com.br/&quot;&gt;Rodrigo&lt;/a&gt;. Pouca coisa quanto a teoria (que eu já havia estudado exaustivamente) foi acrescentado, mas MUITO foi agregado nas experiências e na forma de tocar um projeto com SCRUM.&lt;/p&gt;

&lt;p&gt;Muito bem. Essa semana eu e o André (GP do projeto) fizemos um workshop de dois dias com toda a equipe e o cliente a fim de mudar radicalmente nossa forma de trabalho. Desde o processo (vamos utilizar SCRUM junto com &lt;a href=&quot;http://www.scrumforteamsystem.com/en/default.aspx&quot;&gt;Team System&lt;/a&gt;) até modelagem saindo de um modelo anêmico e com processo de qualidade artesanal para algo próximo de DDD com TDD. Uma revolução para equipe e para o cliente!&lt;/p&gt;

&lt;p&gt;O resultado dos dois dias foi: 90% da equipe super entusiasmada com todas as idéias e com o horizonte de ter uma boa parte das funcionalidades entregues dentro de um prazo aceitável. O cliente gostou bastante do processo também, mas ainda tem a falsa percepção de que um projeto sem um calhamaço de documentos não é legal. Conversamos bastante e nesse ponto fizemos um acordo em busca do meio termo. Vamos fazer a documentação que o cliente achar que devemos fazer. Não vamos estipular uma regra-de-prata, mas sim definir durante os sprints o que será mantido como documentação ativa no projeto.&lt;/p&gt;

&lt;p&gt;Uma das coisas que particularmente me atrai no SCRUM é o fato do cliente priorizar o que vai ser feito então se ele quiser MUITA documentação vai acabar recebendo poucas histórias implementadas.&lt;/p&gt;

&lt;p&gt;Acredito que conforme os sprints forem correndo e o cliente pegar mais segurança com relação a qualidade do trabalho essa noção de documentação melhore e nossa vida venha a ficar mais fácil nesse aspecto.&lt;/p&gt;

&lt;p&gt;Conforme conselho do Rodrigo para iniciar com o uso de SCRUM, marcamos nossa primeira reunião de planning e vamos começar a utilizar o processo. Tenho bastante esperança de que o sucesso vai vir, mas tenho consciência de que não virá de uma hora pra outra.&lt;/p&gt;

&lt;p&gt;Nesse momento principais pontos que temos a vencer são os débitos ténicos. O projeto depende de algumas integrações que estão meio capengas e os builds são bastante complicados por enquanto. Outro ponto é que o SCRUM é fortemente baseado em modelagem e reuniões com o uso de papel e lousa. O problema é que não temos espaço disponível pra fazer o &quot;deploy&quot; desses objetos (a lousa principalmente) e nem reuniões com a equipe inteira então vamos ter que nos virar com as abstrações dos post-its que o Team System consegue nos fornecer e um espaço meio apertado pra equipe toda. A última fatia que temos que adaptar é o fato de termos diversos casos de uso e a resistência do cliente em transformá-los em histórias. Sendo assim, vamos ter que improvisar a manter a referência das histórias aos casos de uso.&lt;/p&gt;

&lt;p&gt;Acho que após superarmos esses aspectos tudo deve decolar! Mesmo que não decole como um foguetão turbinado, só o fato de melhorarmos a modelagem, introduzirmos testes e trabalhar iterativamente já vai nos trazer ganhos.&lt;/p&gt;

&lt;p&gt;Conforme formos avançando (ou não) vou postando a respeito da experiência.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>O papel do Arquiteto...</title>
   <link href="http://blog.tucaz.net/2008/05/22/o-papel-do-arquiteto"/>
   <updated>2008-05-22T02:48:00+00:00</updated>
   <id>http://blog.tucaz.net/2008/05/22/o-papel-do-arquiteto</id>
   <content type="html">&lt;p&gt;De uns tempos pra cá venho percebendo que o papel do &quot;Arquiteto de Software&quot;  tá na boca do povo e em muitos lugares as pessoas falam, falam e falam a  respeito do que esse fulano deveria fazer e/ou não fazer. Hoje recebi o último  &lt;a href=&quot;http://msdn.microsoft.com/en-us/arcjournal/default.aspx&quot;&gt;Architecture Journal&lt;/a&gt; que fala apenas a respeito deste papel  dentro das empresas e do processo de desenvolvimento e manutenção de sistemas e  como estou cada vez mais assumindo esse título decidi tentar colocar  resumidamente o que &lt;strong&gt;eu &lt;/strong&gt;penso a respeito desta importante  figura.&lt;/p&gt;

&lt;p&gt;Na realidade, eu não gosto muito do título, pois por toda minha vida  profissional (que não é tããããão longa assim) eu acreditei que esse cara era o  guru da sapiência e que ele nunca ficaria sem respostas a qualquer pergunta que  fosse feita. Então, soa como uma responsabilidade muitooooo grande (e é mesmo)  pra um desenvolvedor de apenas 21 anos como eu. De fato, deveria ser assim, mas  é humanamente impossível ser ao mesmo tempo generalista e especialista em todas  as áreas. Isso me frustrou um pouco, mas ao mesmo tempo, por outro lado abriu  minha cabeça e me fez reconhecer que existem diversos tipos de arquitetos, cada  um na sua. E que existem pessoas, mesmo sem carregar o título, que também fazem  arquitetura em um momento ou outro de um projeto. É baseado em conhecimento  próprio e utilizando o conhecimento dos membros da equipe que o arquiteto deve  trabalhar.&lt;/p&gt;

&lt;p&gt;Inicialmente, dentro da área de software (imaginando que infra-estrutura não  exista) eu identifico dois principais arquitetos: Arquiteto de Soluções ou  Corporativo e Arquiteto de Sistemas. O primeiro deles define quais  tecnologias, metodologias e ambientes serão utilizados para os sistemas da  empresa e procura manter todos os sistemas seguindo essas linhas agindo de forma  incisiva nas fronteiras entre implementação e processos de negócio sem dar muita  atenção nos detalhes técnicos de cada sistema.&lt;/p&gt;

&lt;p&gt;Já o segundo, que é onde eu me encaixo por trabalhar em consultoria atendendo  a diversos clientes, é o cara que dado um projeto &lt;strong&gt;deve &lt;/strong&gt;atuar em  todas as etapas da construção do sistema. Desde levantamentos inicias, passando  por implementação e até roll-out em produção. Além das habilidades técnicas que  são imprescendiveis nesse papel e isso ninguém pode negar, o arquiteto deve ser  um cara balanceado pra atuar como um mediador entre todos os stakeholders do  projeto. Em um projeto com papéis bem definidos, a tendência é que cada um cuide  das apenas das suas responsabilidades. Isso é bom, pois cada especialista atua  onde mais conhece, mas se não houver cuidado, pode fazer com que os principios  inicialmente definidos não sejam seguidos. É ai onde o arquiteto deve entrar pra  fazer com que todas as diretivas sejam seguidas. Isso exige liderança,  habilidades em negociação e muitas vezes pulso forte pra suportar caras feias  que aparecem quando uma decisão não agrada a todos.&lt;/p&gt;

&lt;p&gt;No âmbito técnico, além de definir um modelo a ser seguido para  implementação, ele deve atuar junto a equipe de análise nas etapas de modelagem  a fim de entender do negócio para que seja possível escolher as tecnologias que  melhor se encaixam no domínio de negócio. Uma vez modelado o domínio de negócio  e tendo as tecnologias definidas, ele deve atuar junto a equipe de  desenvolvimento guiando a implementação e removendo possíveis &lt;em&gt;roadblocks. &lt;/em&gt;Sempre que houver um conflito técnico, ele deve atuar em prol do projeto  para decidir a questão independente de chateação ou não por parte dos membros da  equipe.&lt;/p&gt;

&lt;p&gt;E pra finalizar, deve conhecer metodologia e processos de desenvolvimento a  fim de tornar o planejamento e execução dos projetos mais baratos e acertivos.&lt;/p&gt;

&lt;p&gt;Dava pra ficar enumerando a respeito das skills e habilidades que um  arquiteto deve ter, mas em resumo acho que isso é o principal. O importante é  ter em mente que não importa o quanto estudemos nunca vamos chegar no que eu  imaginava que existia: arquitetos-sabe-tudo.&lt;/p&gt;

&lt;p&gt;Ao longo dos dias vou procurar postar &lt;em&gt;entries &lt;/em&gt;nessa categoria pra ir  complementando os pensamentos e ai, quem sabe um dia, eu formato tudo num grande  apinhado de informações! ehehehe...&lt;/p&gt;

&lt;p&gt;Soçarba&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>E quem disse que o WCF não tem limite?</title>
   <link href="http://blog.tucaz.net/2008/05/17/e-quem-disse-que-o-wcf-nao-tem-limite"/>
   <updated>2008-05-17T02:33:00+00:00</updated>
   <id>http://blog.tucaz.net/2008/05/17/e-quem-disse-que-o-wcf-nao-tem-limite</id>
   <content type="html">&lt;p&gt;Apesar de ter estudado bastante, feito alguns POCs e lido Inside Windows Communication Foundation inteiro (é, nem eu acredito), desde que comecei a trabalhar com WCF em aplicaçoes grandes de verdade, que nao tinham como objetivo servir apenas um departamento de 50 usuários, estou me sentindo meio barriga verde...&lt;/p&gt;

&lt;p&gt;Hoje foi mais um dos momentos (em uma outra oportunidade eu coloco os outros) em que a coisa quase deu m****! Por uma série de motivos decidimos constuir em um ínico serviço WCF todas as funcionalidades de um determinado módulo do sistema. Sendo assim, o serviço está hoje com 63 método e crescendo... No entanto, qual foi a surpresa quando decidi atualizar a referência para o serviço após muda-lo novamente?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&quot;The maximum nametable character count quota (16384) has been exceeded while reading XML data. The nametable is a data structure used to store strings encountered during XML processing ÎÎ long XML documents with non-repeating element names, attribute names and attribute values may trigger this quota. This quota may be increased by changing the MaxNameTableCharCount property on the XmlDictionaryReaderQuotas object used when creating the XML reader&quot;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Ou seja, ferrou! A equipe de desenvolvimento ficou quase 2 horas &quot;semi-parada&quot; esperando a resoluçao do problema. Depois de pesquisar bastante ainda nao tinha achado uma soluçÎÎo que fosse satisfatória para o problema. Na prática, o problema acontece pois o XMLDictionary, por padrao, nao consegue armazenar mais do que o valor default de chaves/valor referentes ao XML gerado pelo MEX/WSDL do WCF.
Algumas das soluçoes apresentadas envolviam gerar o proxy do WCF diretamente através do svcutil.exe ou até mesmo em runtime! Para atualizaçoes feitas de tempos em tempos até acredito que a utilizaçao do svcutil.exe diretamente nao é problema, mas no meio do desenvolvimento é um parto!
No final, juntando alguns posts em blogs e msdn consegui chegar a soluçao que me servia: Criar um arquivo de configuraçao para o svcutil.exe com um bindind customizado aumentando esse limite. Existem duas formas de fazer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Criar um arquivo svcutil.exe.config no diretório padrÎÎo onde o svcutil.exe está (geralmente dentro de \Program Files\Microsoft Visual Studio 9.0) contendo as configuraçoes abaixo. No entanto nao sei porque (e nem vou saber, porque no momento a opçao 2 resolve pra mim) meu svcutil.exe se encontra no diretório do framework e se eu colocar o arquivo.config lÎÎÎ quando o VS2008 chamar o svcutil.exe por trás dos panos o arquivo.config nÎÎo ÎÎÎ carregado.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modificar o machine.config (geralmente dentro de \WINDOWS\Microsoft.NET\Framework\v2.0.50727) adicionando as chaves abaixo. Caso a chave &lt;client&gt; já exista, adicione o &lt;endpoint&gt; dentro da existente.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; &amp;lt;system.serviceModel&amp;gt;
 &amp;lt;bindings&amp;gt;  
     &amp;lt;custombinding&amp;gt;  
         &amp;lt;binding name=&quot;CustomSizeMex&quot;&amp;gt;   
             &amp;lt;textmessageencoding&amp;gt;   
                 &amp;lt;readerquotas maxdepth=&quot;2147483647&quot; maxstringcontentlength=&quot;2147483647&quot; maxarraylength=&quot;2147483647&quot; maxbytesperread=&quot;2147483647&quot; maxnametablecharcount=&quot;2147483647&quot;&amp;gt;   
             &amp;lt;/readerquotas&amp;gt;&amp;lt;/textmessageencoding&amp;gt; &amp;lt;httptransport maxreceivedmessagesize=&quot;2147483647&quot; maxbuffersize=&quot;2147483647&quot;&amp;gt;   
         &amp;lt;/httptransport&amp;gt;&amp;lt;/binding&amp;gt;   
     &amp;lt;/custombinding&amp;gt;   
 &amp;lt;/bindings&amp;gt;   
 &amp;lt;client&amp;gt;   
     &amp;lt;endpoint binding=&quot;customBinding&quot; bindingconfiguration=&quot;CustomSizeMex&quot; contract=&quot;IMetadataExchange&quot; name=&quot;http&quot;&amp;gt;&amp;lt;/endpoint&amp;gt;
 &amp;lt;/client&amp;gt;   
 &amp;lt;/system.serviceModel&amp;gt;  
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;E é isso! Reiniciar o VS2008 e mandar atualizar a referência ao serviço monstro! Tudo funcionando bonitinho&lt;/p&gt;

&lt;p&gt;Espero que daqui pra frente os sustos diminuam! :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>O profissional barriga verde...</title>
   <link href="http://blog.tucaz.net/2008/05/16/o-profissional-barriga-verde"/>
   <updated>2008-05-16T02:29:00+00:00</updated>
   <id>http://blog.tucaz.net/2008/05/16/o-profissional-barriga-verde</id>
   <content type="html">&lt;p&gt;Do meu &lt;em&gt;humilde&lt;/em&gt; ponto de vista existem três perfis básicos  distintos de profissionais de TI: a) aqueles que adoram o que fazem e por  conta de experiência e muito esforço aplicado conseguem de alguma maneira se  manter antenados na maioria das coisas interessantes e úteis que aparecem e  &lt;strong&gt;aplicá-las&lt;/strong&gt;, b) o extremo oposto disso que são profissionais que  estão na área de TI e tomam isso apenas como uma forma de ganhar dinheiro  suficiente pra levar a vida e c) os caras que nós últimos dias eu consegui (com  a ajuda do meu amigo Tuxo) qualificar como barrigas verdes.&lt;/p&gt;

&lt;p&gt;E é sobre esse último perfil que eu quero falar. Me desculpem os  catarinenses pelas próximas frases mas ai vai...&lt;/p&gt;

&lt;p&gt;Barriga verde é o cara que pode no futuro virar tanto o perfil a) quanto o  perfil b) dependendo do que ele conseguir aproveitar das experiências as quais  ele teve oportunidade de se submeter. Explico. Quem nunca viu um cara que não é  bom e nem é ruim, não apresenta domínio pleno das coisas com as quais trabalha,  mas no final consegue terminar um projeto com aceitável sucesso? Eu cruzo o  tempo todo com caras desse tipo e inclusive estou me sentindo um pouco assim  atualmente. Desde que assumi o papel de desenhar e ajudar a implementar a  arquitetura dos projetos que participo, de vez em quando bate um frio na  barriga. Esses caras por sorte, milagre, reza ou sei-lá-o-quê conseguem fazer  tudo dar certo no final, mas quem acompanha eles de perto percebe que ao menor  deslize tudo pode vir a explodir!&lt;/p&gt;

&lt;p&gt;Espero (no fundo eu acredito bastante nisso) que com o passar do tempo essa  insegurança e medo de por tudo a perder por querer experimentar uma coisa nova  me levem ao perfil a). Mas isso... só o tempo poderá mostrar...&lt;/p&gt;

&lt;p&gt;Soçarbas!&lt;/p&gt;
</content>
 </entry>
 
 
</feed>
