Sprocs???

Com razoável frequência alguém levanta a ideia de usar stored procedures (procs, para abreviar) porque melhora segurança e performance.

Como eu sei que isso não é verdade, e o assunto é levantado sempre, vou escrever esse post, depois é só linkar. Smile

Geralmente as consultas via procs são comparadas com queries feitas com texto SQL, que vou chamar de ad-hoc. Esse tipo de consulta é aquela onde você escreve “SELECT Id, Campo FROM Cliente WHERE Id = 1” e manda direto para o banco, e é também o usado por mapeadores objeto relacional (ORMs).

Vamos aos mitos:

  1. Stored Procedures permitem fazer cache do plano de execução, enquanto consultas ad-hoc não permitem
    Mito. Os planos de execução são armezanados para reutilização em procs e também em consultas ad-hoc. Vejam essa afirmação do MSDN:
    “In SQL Server 2000, whenever a statement within a batch causes recompilation, the whole batch, whether submitted through a stored procedure, trigger, ad-hoc batch, or prepared statement, is recompiled. In SQL Server 2005 and later, only the statement inside the batch that causes recompilation is recompiled.” Daqui.
    Esse outro artigo entra mais a fundo. Notem que o importante é o uso de parâmetros, não só para evitar o SQL Injection, mas também para permitir o cache do plano de execução (algo que o SQL Server 2008 já tenta resolver, mesmo se você não enviar o parâmetro).
  2. Stored Procedures estimulam reusabilidade.
    Mito. Reusabilidade pode ser atingida de diversas formas. Um modelo procedural, como o da programação de um banco de dados relacional, possibilita reusabilidade dentro deste paradigma. Eu prefiro estimular reusabilidade com OO, mas isso não quer dizer que não podemos reutilizar tanto em um quanto no outro.
  3. Stored Procedures ajudam a encapsular regras de negócio.
    Mito. Eu posso encapsular, com mais produtividade na programação, em um modelo OO.
  4. Stored Procedures são mais seguras. Com procs você pode remover os direitos a insert, update, delete e consulta, inclusive com granularidade na coluna de uma tabela.
    Mito. Ainda que seja possível fazer isso, se em uma operação de negócio o usuário precisa atualizar um campo, ele terá que ter acesso de atualização deste campo, se não direto, indiretamente pela proc. Isso fica ainda mais irrelevante quando vemos aquelas procs de CUD, ou seja, quando o programador cria 3 procs, uma para cada operação do CUD, e simplesmente pega os parâmetros e repassa para as declarações de insert, update e delete. A proc nesse caso é um mero proxy. A outra opção é colocar a regra de negócio no banco, algo absurdo na maioria dos cenários (não vou me aprofundar no porquê, vai ficar para outro post).
  5. Stored Procedures diminuem o consumo de banda, já que a consulta que vai ao banco é somente o nome da proc e seus parâmetros.
    Meia verdade. De fato a operação que vai ao banco é menor. Mas em uma operação de consulta, o maior peso está no retorno da consulta, cheio de dados, e não na solicitação, que é um texto curto. A diferença entre a consulta com proc e sem chega a ser ridícula. E em uma operação de atualização do banco, os dados que vão subir tem que ser enviados da mesma forma, e o resto da declaração de uma operação ad-hoc é só um pouco maior se comparado com a proc. Além disso, nas redes de hoje, com servidores web ao lado de servidores de banco em rede gigabit, o gargalo não fica na rede.

Além destes mitos, o que mais me incomoda é que procs praticamente impedem o uso de ORMs. E ORMs são praticamente obrigatórios em um projeto que quer ter um mínimo de produtividade. Escrever SQL na mão hoje em dia é algo absolutamente desnecessário para 90% das aplicações, e nos 10% que sobram, só um pequeno percentual teria algum ganho sobre o uso de SQL manual sobre um ORM. Mas isso fica para outro post também.

Um caso onde vejo uso de procs como útil: ETL. Geralmente é muito difícil fazer carga de grandes massas de dados via interação com o client, seja ele .Net, Java, C++, VB6, ou o que for. O ideal é a carga acontecer no banco, e aí procs vão bem. O maior problema, derivado do ETL, é a duplicação de regras de negócio, já que uma operação de negócio que entra via carga externa estará sujeita às mesmas regras de uma entrada manual, normalmente também permitida. É algo que aumenta o custo de manutenção, mas muitas vezes não tem jeito.

É isso. Joguem as procs no lixo, programem com ORMs (ou bancos NOSQL), e sejam produtivos.


Postado na(s) categoria(s) Polêmicas pelo Giovanni Bassi em 22 de julho de 2010 às 16:16 | Tags:

Eu testo minhas aplicações, e algo que não pode ficar de fora é o teste do banco de dados. Vocês sabem que eu não gosto de colocar regras de negócio no banco de dados (e isso é assunto para outra discussão), então para mim, testar o banco de dados é testar a interação da aplicação com o banco de dados. E eu uso ORMs, ou seja, na verdade, o que eu preciso testar é a se o meu mapeamento está funcionando e se o schema do banco está correto, de acordo com o que a aplicação espera.

Neste post eu vou mostrar como fazer isso com infra Microsoft, ou seja, com Data Dude (VS Database) e Entity Framework. No próximo vou mostrar com alguns componentes open source. O próximo vem semana que vem.

Você só precisa de um Visual Studio 2010 Premium, porque na edição professional não vem o Data Dude, que é o antigo VS Database edition, que não existe mais. Ele tem um projeto de banco de dados, e vou usá-lo.

Mas antes de mais nada…

Como testar algo que interage com o banco de dados? É óbvio que se interage com o BD, não pode ser um teste unitário, tem que ser um teste integrado, nesse caso, integrado com o banco. O que testar?

Os testes vão manipular o banco, vão incluir, alterar, excluir, e consultar, ou seja, vão fazer operações CRUD. Quando um teste altera os dados do banco pode ser que ele altere o resultado de outro teste. Por exemplo, em um teste eu incluo um item em uma nota fiscal e salvo, antes ela tinha 10, agora tem 11. Em outro teste eu consulto a mesma nota, e verifico se ela tem 10 itens, o teste falha, porque o teste que inseriu o teste rodou antes. Eu até poderia determinar a ordem dos testes, mas isso deixaria meu plano de testes confuso e ruim: jamais poderia rodar um único teste sem antes rodar os outros. Testes devem rodar sempre independentes uns dos outros. Como resolver? A cada teste o banco deve ter seus dados reiniciados. Como subir estes dados? Já vi pessoas usarem transações, e dar rollback no final, mas isso é no mínimo incompleto: quem sobe os dados iniciais? É feito na mão? Além disso, o esquema tem que estar atualizado. Não dá pra testar se falta uma tabela, uma coluna, ou se há alguma diferença. Nossa infra de testes deve resolver esse problema.

Primeiro vamos resolver o problema do esquema. O Data Dude tem um projeto de banco de dados. Vejam lá, File > New > Project > Database > SQL Server > SQL Server 2008 Database Project (clique nas imagens para ampliar):

image

Esse projeto cria todo o esquema que você vai precisar e também os dados. Não vou explicar aqui o que é o Data Dude, mas confie em mim, funciona e é muito legal. Para mais informações, baixe o training kit, baixe a VM, e/ou veja online a documentação.

Criei também um projeto class library e fiz um mapeamento simples no EF, vejam só:

image

Esse mapeamento já gerou a classe de produto e também o contexto que eu quero testar.

Gerei o SQL, importei ele pro projeto de database:

image

E tenho o schema lá:

image

Eu quero ter uma carga de dados, então criei um plano de geração de dados, ou data generation plan:

image

Ele gera dados para minhas tabelas, vou precisar disso mais pra frente.

Criei um projeto de testes, e pra ganhar tempo, pedi pra criar um teste de banco de dados, que vai me ajudar na criação da infra de testes com banco:

image

Ele me dá a opção de gerar meu banco (fecha azul), e incluir o meu plano de geração de dados (flecha vermelha).

image

Ao fazer isso, vários artefatos interessantes apareceram no meu projeto. Vamos vê-los. Primeiro meu web.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="DatabaseUnitTesting" type="Microsoft.Data.Schema.UnitTesting.Configuration.DatabaseUnitTestingSection, Microsoft.Data.Schema.UnitTesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </configSections>
    <DatabaseUnitTesting>
        <DatabaseDeployment DatabaseProjectFileName="..\..\..\Database1\Database1.dbproj"
            Configuration="Debug" />
        <DataGeneration DataGenerationFileName="..\..\..\Database1\Data Generation Plans\DataGenerationPlan1.dgen"
            ClearDatabase="true" />
        <ExecutionContext Provider="System.Data.SqlClient" ConnectionString="Data Source=.\sqlexpress;Initial Catalog=TesteIntegradoBanco;Integrated Security=True;Pooling=False"
            CommandTimeout="30" />
        <PrivilegedContext Provider="System.Data.SqlClient" ConnectionString="Data Source=.\sqlexpress;Initial Catalog=TesteIntegradoBanco;Integrated Security=True;Pooling=False"
            CommandTimeout="30" />
    </DatabaseUnitTesting>
</configuration>

O Web.config está com toda a configuração para gerar o banco e fazer o deploy dos dados, inclusive o ponteiro para o data generation plan.

Foi criada também esta classe:

[TestClass]
public class DatabaseSetup
{
    [AssemblyInitialize]
    public static void InitializeAssembly(TestContext ctx)
    {
        DatabaseTestClass.TestService.DeployDatabaseProject();
        DatabaseTestClass.TestService.GenerateData();
    }

}

Notem o atributo AssemblyInitialize. Ele indica que quando antes deste assembly de teste rodar, este método será executado. Ele fará duas coisas: subirá o schema do banco de dados (método DeployDatabaseProject) e gerará os dados (método GenerateData). Esse segunda chamada de método não vai ficar aí, mas por enquanto tudo bem.

Agora eu posso excluir o teste de banco de dados que foi criado, ele servia pra criar os artefatos.

Agora só falta criar o teste que testa a interação com o banco em si. Vamos adicionar a classe de testes, usando o novo basic test, que vem sem aquele monte de linhas que eu sempre apago:

image

Ela fica assim:

[TestClass]
public class TesteInclusao
{
    private Produto _produtoParaIncluir;
    private Model1Container _container;

    [TestInitialize]
    public void Initialize()
    {
        Arrange();

        Act();
    }

    private void Arrange()
    {
        _container = new Model1Container();
        _produtoParaIncluir = new Produto
                       {
                           Nome = "um"
                       };
    }
    
    private void Act()
    {
        _container.AddToProdutoes(_produtoParaIncluir);
        _container.SaveChanges();
    }
   
    [TestMethod]
    public void NaoEhIgualAZero()
    {
        Assert.AreNotEqual(0, _produtoParaIncluir.Id);
    }

    [TestMethod]
    public void EstaNoBD()
    {
        var outroContainer = new Model1Container();
        var produtoIncluido = outroContainer.Produtoes.Single(p => p.Id == _produtoParaIncluir.Id);
        Assert.AreEqual("um", produtoIncluido.Nome);
    }
}

Notem que estou testando diretamente o container do Entity Framework.

O teste deve passar. Não esqueça de puxar as strings de conexão do projeto de class library para o projeto de testes, senão o container não vai ser criado. O banco subiu, o dado foi inserido. Você pode realizar uma consulta manual e confirmar, se você não acreditar no seu teste.

E um teste para excluir? Será que fuciona? Vamos olhar os dados gerados no plano de geração de dados:

image

Posso pedir para consultar por id, ou por nome, e então excluir. Vou pedir por id, que é gerado automaticamente por identity no SQL Server. Vejam o teste:

 

[TestClass]
public class TesteExclusao
{
    private const int IdParaExcluir = 1;
    private Model1Container _container;

    [TestInitialize]
    public void Initialize()
    {
        Arrange();

        Act();
    }

    private void Arrange()
    {
        _container = new Model1Container();
    }
    
    private void Act()
    {
        var produtoParaExcluir = _container.Produtoes.Single(p => p.Id == IdParaExcluir);
        _container.DeleteObject(produtoParaExcluir);
        _container.SaveChanges();
    }
   
    [TestMethod]
    public void NaoEstaNoBD()
    {
        var outroContainer = new Model1Container();
        var produtoExcluido = outroContainer.Produtoes.SingleOrDefault(p => p.Id == IdParaExcluir);
        Assert.IsNull(produtoExcluido);
    }
}

 

 

E funciona!

Se em outro teste eu quiser consultar o id 1, eu poderia ter problemas, já que o teste de exclusão poderia interferir. Para resolver isso eu puxo para o teste de consulta o setup dos dados no banco, veja a chamada de GenerateData, destacada.

 

[TestClass]
public class TesteConsulta
{
    private const int IdParaConsultar = 1;
    private Model1Container _container;
    private Produto _produtoEncontrado;

    [TestInitialize]
    public void Initialize()
    {
        Arrange();

        Act();
    }

    private void Arrange()
    {
        _container = new Model1Container();
        DatabaseTestClass.TestService.GenerateData();
    }
    
    private void Act()
    {
        _produtoEncontrado = _container.Produtoes.SingleOrDefault(p => p.Id == IdParaConsultar);
    }
   
    [TestMethod]
    public void ExisteNoBD()
    {
        Assert.IsNotNull(_produtoEncontrado);
    }
    [TestMethod]
    public void TemNomeCorreto()
    {
        Assert.AreEqual("aquele dado gigante gerado", _produtoEncontrado.Nome);
    }
}

Isso garante a consistência dos dados entre os testes.

 

Com isso posso criar testes à vontade, o banco sempre vai ter o último esquema e dados atualizado. Não preciso me preocupar com os dados, eles sempre vão estar lá. Isso é o básico dos testes integrado com banco de dados. O Visual Studio permite toda essa integração de maneira simples. Esse tipo de cenário fica especialmente importante quando não usamos ORMs, já que todo o acesso a dados é manual, e nesse caso testamos nossos DAOs, e também quando usamos POCO, onde o mapeamento é mais manual do que o que usei aqui.

No próximo vou mostrar como resolver isso sem o Data Dude, já que ele está limitado ao SQL Server e aos poucos providers extras que foram feitos até agora. E sem Entity Framework também.


Postado na(s) categoria(s) Team System , Testes pelo Giovanni Bassi em 19 de julho de 2010 às 19:02 | Tags: ,

Eu vou no TechEd Brasil 2010. Você vai?Sim, os motores estão começando a esquentar: o Tech·Ed Brasil 2010 está chegando. Milhares de pessoas estarão presentes no maior evento da comunidade Microsoft brasileira.  O Tech·Ed  é promovido pela Microsoft, e com conteúdo entregue por MVPs, funcionários Microsoft, e membros influentes da comunidade, ou seja, só gente que sabe muito sobre tecnologia em geral, e mais ainda sobre o tema que estará palestrando.

Esse ano o evento será em Setembro, de 13 a 15, no Expo Center Norte, em São Paulo. É um lugar grande, que é capaz de receber muita gente confortavelmente. Pra quem é de fora de São Paulo, tem um motivo a mais para vir: o QCon São Paulo acontece exatamente antes, dias 11 e 12 de Setembro, sábado e domingo. O Tech-ed começa na segunda.

Eu sou presença assídua no TechEd a anos, praticamente desde que o evento iniciou no Brasil. É imperdível, é sem dúvida o melhor evento do ano no país para absorver conteúdo técnico. Além disso, todo mundo sabe, Tech Ed não é só estudo, é também networking e diversão. Ano passado nos divertimos muito reencontrando amigos da comunidade que são de fora de São Paulo, tanto durante o evento em si, quanto depois, nos happy hours, jantares e baladas que acompanham obrigatoriamente qualquer evento de peso. Metade do evento são esses encontros e a experiência de estar presente. Só a outra metade é o conteúdo. E um não vive sem o outro.

O conteúdo do evento está ótimo: basta olhar as tracks, lotadas de assuntos instigantes: computação na nuvem, desenvolvimento web, ferramentas, linguagens e frameworks de desenvolvimento, e, vejam só: práticas de desenvolvimento. Sim, no TechEd se fala bastante de práticas, basta dar uma olhada nas palestras sobre práticas do TechEd americano deste ano pra ter um gostinho. Se o nosso tiver metade destas palestras já está ótimo.

Pra ter uma ideia de como foi o TechEd nos anos passados, basta dar uma olhada nos posts anteriores deste blog, na tag “teched”. Está lotado de fotos e comentários, e tem até um post onde cataloguei o twitter, sempre usando a hashtag #TechEdBrasil (esse ano mudou, estamos usando a hashtag #TechEdBR). O primeiro relato é de 2008, já que o blog só nasceu neste ano, e dá pra ver que eu estava começando a falar com a comunidade para criar o .Net Architects. Sim, o TechEd de 2008 ajudou a fazer o grupo acontecer, foi lá que eu conheci o Victor Cavalcante e o Valdir Rogerio, que na época trabalhavam na Unip, e apoiaram a ideia de fazer as reuniões do grupo por lá, onde elas são até hoje. TechEd não é só conteúdo, diversão e networking, também é comunidade!

 

Foi no TechEd que conheci muita gente da comunidade técnica. Não é toda hora que você tem a oportunidade de ver juntas dezenas de pessoas que conhecem tão a fundo cada assunto.

Vi algumas críticas com relação ao valor do evento, que está agora por 900 reais (vai aumentar mais ou menos uma vez por mês, o preço inicial era 800 reais). Mas dada a qualidade do evento e do conteúdo, eu acho que é um preço justo. Lá fora o TechEd bate quase 4 mil reais, e sempre lota com milhares e milhares de pessoas. Se pesar pra você, faça como eu sempre fiz: peça para seu empregador pagar. Eu acho que nunca paguei um TechEd, porque eu ia atrás dos executivos da empresa para bancarem o evento, eu justificava que era importante, que ia dar retorno. Quando me tornei independente comecei a palestrar no evento, não preciso mais pagar. Mas não teria problemas em pagar, aliás, pagaria até mais. Acredito que vale cada centavo.

Pra ajudar a promover o evento montei alguns badges. Pegue o que fizer mais sentido pra você e coloque onde achar melhor (site, blog, email). Não esqueçam de linkar para www.teched.com.br (vejam exemplo aí do lado direito, em “Selos”). As imagens estão abaixo (clique para link para imagem ampliada):

EuVou-P

EuVou-P

EuVou-P

Mais informações para ficar atento ao evento, e se preparar:

  1. O Fabio Hara está no comitê do evento, e está falando toda hora sobre ele. E também no twitter.
  2. Também da comissão, o João Paulo (aka JP) também pode soltar alguma coisa no seu blog. Mas ele está falando sobre o assunto mesmo é no Twitter.
  3. O Thiago Everton montou um guia para quem vai pela primeira vez.
  4. No Twitter, a hashtag #TechEdBR já está bombando, e a conta oficial é a @TechEdBrasil.
  5. Fique atento aos MVPs brasileiros, sempre sai alguma coisa lá. O Rodolfo Roim, que é MVP Lead também é capaz de soltar alguma informação por lá, senão antes, talvez depois do evento.
  6. Fique atento à página de palestrantes, que acredito que vai ser atualizada em breve. Os palestrantes, assim que puderem contar que foram convocados para palestrar vão começar a falar sobre o assunto.

Para aproveitar melhor, algumas dicas:

  1. Essa é óbvia: vá ao evento. Por mais que algumas palestras depois vão parar em webcasts, ou até que você possa baixá-las online do site americano ou coisa do tipo, nada substitui a experiência ao vivo.
  2. Fale com as pessoas. Não tenha receio de entrar em uma roda de pessoas desconhecidas, principalmente se forem funcionários Microsoft ou MVPs. Chegue junto, se apresente, tire dúvidas, troque cartão de visita, conte experiências. Uns anos atrás, antes de eu ser nomeado, me parecia que alguns MVPs davam a impressão que não queriam falar com a comunidade. Era impressão errada minha: todos gostam de uma boa conversa. Se a pessoa não puder falar porque tem algum compromisso ou algo do tipo, ela vai te dizer.
  3. Durma antes do evento. Pra aguentar o ritmo intenso da semana. Esse vale mais ainda se você for ao QCon.
  4. Agende-se para dormir menos durante os dias do evento. À noite sempre tem happy hour, balada, jantares, alguma coisa. O Twitter avisa, e as pessoas no próprio evento se comunicam. Só como exemplo: No AgileBrazil saimos praticamente todas as noites, no TechEd de 2009 também.
  5. Assista as palestras mais importantes, mas você não precisa assistir todas. Às vezes um bate papo com um palestrante no corredor vale 10 vezes mais que uma palestra.
  6. Assista aos keynotes. Eles dão o tom do resto do evento.
  7. Vá ao ask the experts. É lá que a comunidade pode realmente se conhecer e tirar suas dúvidas com os caras que mais manjam de cada assunto no país.

É isso aí. Vejo vocês lá.


Postado na(s) categoria(s) Eventos pelo Giovanni Bassi em 3 de julho de 2010 às 02:05 | Tags: ,

Não estou entendendo nada!!!

Cliente presente é algo que todos entendemos que é obrigatório para entregar um projeto com sucesso. Será que é suficiente?

Tenho visto alguma frequência que desenvolvedores se esforçam para construir uma aplicação corretamente, buscam um modelo rico, OO, fugindo do modelo anêmico. Usam tecnologias de ponta, ORMs, bancos NOSQL. Tem cliente presente. Entregam em iterações curtas, e chegam até a buscar o release contínuo. Buscam evitar o Scrum flácido, praticam XP, programam pareados. E falham. Quero analisar aqui um dos motivos que tenho visto para essa falha.

É comum que o cliente, apesar de presente, não tenha todo o entendimento de como o software deve se comportar. Um Product Owner pode saber o que deve ser feito, mas frequentemente não sabe como a aplicação deve funcionar em detalhes. Mas tudo bem, ele sabe quem sabe. E quem sabe é o especialista de negócio, ou business expert. Essa é a pessoa que realmente realiza as ações de negócio hoje, provavelmente de forma manual no Excel, como boa parte do planeta. É ele que sabe como as coisas devem funcionar, em detalhes.

Só que entender o negócio é algo complicado, e hoje em dia, mais do que nunca, precisamos de especialistas. E quem faz o trabalho super especializado de entender o negócio? O analista de negócio, é claro; vou chamá-lo de André. Ok, temos times multidisciplinares, pessoas multidisciplinares. Isso significa que provavelmente temos mais de uma pessoa no time que sabe fazer análise, mas ninguém o faz tão bem quanto o André. O André se especializou, ele leu o BABOK todo, fez cursos e mais cursos de análise, entende bem de usabilidade, conhece diversas técnicas para entender o que o especialista de negócio precisa, e sabe como documentar isso, como passar esse conhecimento pra frente.

Mas ele não programa.

Quer dizer, ele está num time multidisciplinar, mas ele prefere não programar. Quando está na hora de ele ser multidisciplinar ele escreve uns casos de testes, e está aprendendo a especificar com testes de aceitação com os Test Cases do Visual Studio, ou Fitnesse, ou Cucumber. Já faz uns 5 anos ou mais que o André prefere não programar. E ele é feliz assim, ele gosta de investir seu tempo no desenvolvimento de suas soft skills, é o que ele mais gosta de fazer. Isso é normal, todo mundo tem suas preferências, e estas habilidades são úteis ao projeto.

Então ele vai lá, analisa o negócio. Prepara o conhecimento e o transfere da melhor forma possível para o codificador – vou chamá-lo de Carlos – que vai implementar com código o que André analisou. O Carlos não fala com o especialista de negócio, ele fala com o André.

O André fala com o especialista de negócio sobre o negócio. Se o domínio é um caixa eletrônico, ele fala em saques, depósitos, saldos.

O André também fala com o Carlos. Ele fala de regras de negócio, fluxos principais, fluxos alternativos, wireframes, critérios de aceitação e até de tabelas de banco de dados de vez em quando. E no meio desse monte de outras coisas, ele também fala de saques, depósitos e saldos.

O Carlos, quando tem uma dúvida, pergunta pro André, que pergunta pro especialista de negócio. O especialista responde pro André, o André responde pro Carlos. O Carlos daí conta pros outros codificadores, analistas de banco de dados, etc. Ou o André conta.

Não preciso dizer que isso é um telefone sem fio, não é? Quem já brincou de telefone sem fio sabe que o que sai de um lado dificilmente é igual ao que chega do outro lado. E é assim que tantos consultores, cursos, etc, recomendam que façamos análise de negócio. Com telefone sem fio. Esse é um dos grandes motivos para a falha na entrega: entendemos errado porque o processo de comunicação é falho.

O Carlos, ao contrário do André, não se aprofundou em análise de negócio. Pode ser que ele odeie analisar o negócio, pode ser que não, mas de qualquer forma ele não desenvolveu tanto suas soft skills. Ele prefere codificar, ele se aprofundou em padrões de projeto, em OO, em assuntos diferentes do que o André se aprofundou.

Como resolver isso? Eliminando o analista de negócio do projeto? Claro que não! Quem fará a análise, o Carlos, que não é tão especializado? Não, é o próprio analista que fará a análise do negócio, mas ele o fará de uma maneira um pouco diferente. Em vez de fazer a ponta entre especialista de negócio e codificador, ele vai trabalhar como um facilitador da comunicação dos dois. Ele vai trazer o codificador ao especialista de negócio, ou vice-versa, e usar suas técnicas e soft skills para levantar as informações mais relevantes, na maior quantidade possível. Os três, juntos, vão desenhar a aplicação.

E na hora de parear, porque não o André, sentado ao lado do Carlos, enquanto ele codifica? Isso sim, é trabalhar num time verdadeiramente multidisciplinar.

Ingrediente pro sucesso.


Postado na(s) categoria(s) Gestão de projeto pelo Giovanni Bassi em 1 de julho de 2010 às 01:26 | Tags: ,

logo-trans Ok, eu ia reportar o evento ao vivo… mas eu também ia dormir 8 horas por dia. Nenhum dos dois aconteceu. Então o relatório do evento segue agora, alguns dias atrasado, mas nem por isso tão desatualizado.

O evento foi muito bom. Já vi diversos relatos em blogs de amigos e de desconhecidos agora, depois que o evento já aconteceu, e só sucessos. Algumas críticas vieram, mas nada demais, só recomendações para deixar o de 2011 ainda melhor. Trabalhamos intensamente no evento vários meses, e o sucesso é a concretização deste trabalho.

O evento abriu com dois dias de cursos, sendo um de XP, onde fui um dos instrutores, um de CSM, um de CSPO, e outro de coaching. Não estive presente nos outros 3 cursos, mas pelo feedback que recebi também foram muito bons. No de XP tivemos nada menos do que seis instrutores (contando comigo) com vasta experiência e conhecimento. Passamos por toda a teoria, e ainda tivemos exercícios práticos e muitas dúvidas resolvidas. Dava pra ter feito 2 dias de curso tranquilamente, e aprofundado mais em alguns assuntos. Na verdade, dava pra fazer 1 semana numa boa, de tanto conteúdo que nós 6 tinhamos pra falar. Considerando que os 6 eram também palestrantes do evento e membros da organização, ou seja, todos adoram falar, nos saímos muito bem, e a dinâmica do curso foi ótima. Com os três cursos somamos mais de cem pessoas.

Algumas fotos (clique para ampliar):

Dúvidas dos alunos para resolver e horário:

Coffee-break:

Times praticando:

Pareando a três:

Parte da turma:

Curso de CSM:

Curso de CSPO:

À noite saímos pra jantar, foi muito legal. Aqui vocês vêem parte dos instrutores e comissão do evento:

No segundo dia do evento, outro jantar, dessa vez bem mais cheio. Muita gente já tinha chegado para participar do evento. A mesa deve ter batido quase 100 pessoas:

Em Porto Alegre é comum esse licor, servido em cascata. Novamente tomamos neste restaurante. Quem foi que disse que agilista não gosta de cascata?

No terceiro dia do evento abrimos com as palestras, onde quase 900 pessoas participaram. A abertura foi feita pelo Martin Fowler, e foi como a apresentação de um Rock Star. O Fowler é engraçado, ele ficou disponível o evento todo no estande da Thoughtworks, empresa que trabalha que também patrocionou o evento e estava lá, mas não tirava foto com ninguém porque dizia que ia parecer um político. Eu já tinha ouvido essas histórias, é engraçado ver que as idiossincrasias afetam todos. A palestra foi ótima, foi na verdade 3 palestras em 1, onde ele abordou, entre outros assuntos, o Scrum Flácido e o débito técnico. Isso foi muito legal, porque foi o Scrum flácido que inspirou a criação do programa Professional Scrum Developer da Scrum.org. Várias outras palestras no evento se relacionaram com a do Fowler, o que foi ótimo.

Fowler palestrando:

Auditório lotado:

Um telão reportou o evento ao vivo no twitter:

Isso foi ótimo porque dava pra ver na hora o que o pessoal estava pensando, além de estimular o pessoal a dar feedback.

Esta é a área onde ficavam os patrocinadores, aqui vocês me vêem ao lado da grade:

Aqui uma visão melhor, em um momento em que não estava tão cheio:

O evento seguiu o resto do dia com break-out sessions, e bastante movimento no open space, com diversas discussões:

Tivemos um workshop com o Philippe Kruchten de Release Planning Game, onde de Mariana Bravo, Samuel Crescêncio, Teresa Maciel e eu servimos de facilitadores, ao lado do Philippe:

Achei o workshop muito legal, principalmente para quem está começando. É um jogo, onde as pessoas conseguem ter uma visão clara sobre débito técnico, planejamento iterativo, entre outros conceitos.

A Microsoft palestrou também. O Igor Abade foi o responsável por mostrar que a Microsoft está abraçando a ideia de apoiar processo ágeis. O Igor parecia apreensivo com a palestra, mas foi muito bem recebido e a sala estava bem cheia, ainda mais se considerar que palestras de patrocinador não costumam ter muita gente:

Eu estava particularmente podre. Como fazia parte da organização estava dormindo muito pouco, e eu já vinha de uma semana fora de casa, ministrando o Professional Scrum Developer em BH, e também dormindo pouco por lá. Na quinta atingi meu limite, estava exausto e com dor de cabeça. E no fim do dia tinha minha palestra. A adrenalina da palestra me reanimou, e apresentei a palestra com toda a energia:

Mas depois eu quase desmaiei.

Mentira, depois fomos para o John Bull, um bar de Porto Alegre onde estava rolando um Rock, para a festa do evento. Mas não consegui acompanhar o resto do pessoal, que esticou madrugada adentro. Eu estava quase morto, voltei pro hotel para descansar. Descansei tanto que perdi o keynote do Philippe Kruchten, cheguei lá para o jogo do Brasil, que todos já sabem, era melhor não ter assistido. Perdemos um slot de palestra, mas imaginem se o Brasil tivesse ido bem? Seríamos crucificados por termos ignorado o jogo. Fazer o que?

A sexta seguiu com mais palestras e no final um keynote que foi um fechamento excepcional! O Klaus Wuestefeld, um dos pioreiros da agilidade no país apresentou sua visão sobre o futuro do XP, onde ele praticamente desconstruiu o XP todo, e criou o Klaus Process, o KP, onde somente dois valores importam: Learning e Coolness. Fui uma palestra muito boa, e serviu para dar uma ótima visão sobre para onde estamos indo. Pode ser que não seja exatamente onde o Klaus espera que seja, mas ele ajudou a abrir os horizontes:

 

Na sexta tivemos um jantar da organização e alguns amigos, que eu não fotografei porque merecia descansar da câmera um pouco. Depois publico as outras fotos.

Gostei do evento e provavelmente estarei na organização da edição do ano que vem. Vamos ver. Foi ótimo dar rostos aos membros da organização, já que eu só conhecia pessoalmente um ou outro. Aproximar-me de pessoas como o Samuel Crescêncio, Rodrigo de Toledo, Paulo Caroli, entre outros, é algo sem preço.

Aqui o time todo da organização reunida para foto histórica:

Acreditem se quiserem, nossa primeira reunião presencial se deu na segunda-feira, um dia antes do evento. Toda a coordenação foi remota. Quem disse que times ágeis obrigatoriamente tem que estar colocados?

Valeu pessoal!


Postado na(s) categoria(s) Agilidade , Eventos pelo Giovanni Bassi em 29 de junho de 2010 às 02:09 | Tags: ,

ndc2010

A Conferência Norueguesa de Desenvolvedores de 2010 (NDC – Norwigean Developers Conference) postou novamente (assim como no ano passado) todos os videos para download. E as palestras foram incríveis. Não dá pra não ver.

A conferência é anual, caríssima, e focada em .Net e Agile.

Vão lá baixar e divirtam-se.


Postado na(s) categoria(s) Agilidade , .Net , Eventos pelo Giovanni Bassi em 28 de junho de 2010 às 02:48 | Tags: ,

QCon SP Fechei com o pessoal da InfoQ minha participação no QCon São Paulo 2010. O evento vai ser nos dias 11 e 12 de Setembro, sábado e domingo, logo antes do TechEd Brasil (que começa dia 13, segunda-feira, e vai até a quarta-feira, dia 15 de Setembro).

No QCon vou valar de BDD, com minha palestra intitulada “Behavior-Driven Development (BDD) no mundo real”. Vejam o resumo:

BDD é um assunto controverso, muitos não entendem o que ele significa, e não sabem como usar. O que é (e de acordo com quem)? É igual TDD, é diferente, é melhor, é pior? Precisamos de ferramentas? Quais as opções disponíveis? Vale a pena? O que as pessoas que trabalham com BDD querem dizer quando falam em "especificações executáveis"? O que funciona e o que o levou a falhar?
Nesta palestra abordaremos essas perguntas, e avaliaremos algumas técnicas e ferramentas que você pode usar para começar a desenvolver software com BDD para aplicações do mundo real. Mais do que uma excelente técnica para criar e organizar testes unitários, BDD é também uma ótima maneira de se comunicar com os usuários.

Interessante, não?

Estou na track de Agile, no sábado, dia 11. Por lá teremos outros MVPs, na track de .Net, como o grande Thiago Soares, falando de .Net e o futuro, e o Israel Aéce, falando de WCF (obviamente). Outros amigos por lá serão o Rodrigo Yoshima e o Alexandre Magno, também na track de Agile, além de outros. O sábado terá ainda uma track de Java, com o Paulo Silveira, que conheci no AgileBrazil. Figuras de peso abrem o evento, como o Nick Kallen, engenheiro do Twitter, que vai falar de escalabilidade, e o Douglas Crockford, ninguém menos do que o criador do JSON.

Domingo segue com tracks de arquitetura, casos de sucesso, e Ruby, que obviamente contará com o Akita. Uma das palestras que abre o evento é do Scott Ambler, falando sobre como escalar Agile. O Guilherme Silveira, da Caelum, que me chamou a palestrar, também estará lá, falando de REST. Aliás, o Guilherme esteve no AgileBrazil, e ele faz uma palestra de 45 minutos sem respirar. Juro. Vale a pena assistir.

Em resumo: o evento é imperdível, e eu não vou trabalhar a semana toda, já que logo em seguida tem TechEd. Eu já estava arrumando minha agenda pra ir, mesmo se não fosse convidado a palestrar. Vejo vocês lá.


Postado na(s) categoria(s) Eventos pelo Giovanni Bassi em 28 de junho de 2010 às 01:34 | Tags: , , ,

Segue a palestra feita ontem no AgileBrazil 2010:

Depois faço meu relato. Depois que eu morrer e descansar nesse fim de semana.


Postado na(s) categoria(s) Agilidade , Eventos pelo Giovanni Bassi em 25 de junho de 2010 às 16:48 | Tags: ,

Segue a palestra feita em BH pro evento de inauguracão do DevIsland:

Links relacionados:


Postado na(s) categoria(s) Arquitetura , Eventos pelo Giovanni Bassi em 25 de junho de 2010 às 16:44 | Tags: ,

AgileBrazil 2010

Estou indo hoje para o AgileBrazil 2010, que tenho certeza será um dos melhores eventos do ano. Faço parte da organização, e vai ser muito legal ver o trabalho finalmente entregue. Vai ser uma conferência incrível.

Estou feliz de reencontrar amigos da comunidade de agilidade que não são de São Paulo e que por isso não vejo com tanta frequencia. O clima neste tipo de evento é muito rico, pessoas com backgrounds muito diferentes e com muito a acrescentar. Comunidades de Ruby, Java, PHP, .Net, entre várias outras, estarão representadas no evento. O .Net Architects, mais uma vez, vai estar lá em peso, estou estimando algumas dezenas de pessoas. O evento vai reunir mil pessoas, e é sua primeira edição!

As palestras estão excepcionais, com assuntos muito diversos e importantes. Eu acompanhei de perto a seleção das propostas de palestras, e foi algo absurdamente profissional e criterioso. Membros expoentes da comunidade de software brasileira, além da organização, avaliaram as propostas, com cada proposta sendo avaliada três vezes. Os track leaders então, baseando-se nas avaliações fecharam várias propostas de agenda, e a organização pesou muito até escolher uma que apresentasse ótimos temas, representasse todo o país, e trouxesse tanto membros antigos da comunidade quanto os mais novos.

Isso sem falar dos palestrantes convidados, muitos deles internacionais. Imperdível.

Vou, como sempre, reportar o progresso do evento por aqui. Espero conseguir fazer isso ao final de cada dia, se eu não estiver morto de tanto trabalhar. Quero ver o evento, mas também vou palestrar, e ajudar na organização local do evento. Vamos ter muito trabalho. E espere uma avalanche no twitter na hashtag #agilebrazil. Se você não vai, pelo menos dá pra ter uma ideia de como foi.

A Microsoft está patrocinando o evento com a cota mais alta de patrocínio. Eu mesmo puxei isso com o Rodrigo de Carvalho da Microsoft, que está comprometidíssimo com a agilidade aqui no Brasil (o Rodrigo também ajudou na ponte para realizar o Scrum Spike Brasil em um espaço cedido pela Microsoft). Teremos uma palestra do grande Igor Abade por lá, falando adivinhem de que?

Vejo vocês lá.


Postado na(s) categoria(s) Eventos , Agilidade , Scrum pelo Giovanni Bassi em 20 de junho de 2010 às 05:09 | Tags: , ,

Direto do site da Scrum.org, estou traduzindo aqui (update: agora traduzido por lá também). O evento vai contar com palestras o dia inteiro, com a presença do Ken Schwaber, eu, e outros membros da comunidade. Isso é parte de uma iniciativa que inclui também um curso de Scrum In Depth com o Ken e eu nos dias 22 e 23 de Julho, e outro de Scrum Developer nos dias 26 a 30 de Julho, também com nós dois e mais o Alex Armstrong.

Tradução abaixo:

 

Scrum Spike Brasil
Você é o melhor Scrummer do Brasil?

Leve o seu conhecimento de Scrum a uma nova profundidade em uma spike de imersão em Scrum. Liderado por Ken Schwaber, os melhores Scrummers no Brasil e América do Sul vão trabalhar juntos para levar seus conhecimentos a uma nova profundidade. Abrangendo temas como arquitetura emergente, definição de pronto, dívida técnica, custo total de propriedade, práticas de desenvolvimento ágil, e "Scrum but". Scrum Spike Brasil

Somente os melhores do Brasil e América do Sul estão convidados. Depois de participar, eles serão listados publicamente como tendo alcançado tal distinção. 

Qualificação: Para participar, você deve ficar entre as 150 melhores pontuações em uma avaliação de Scrum. A avaliação será realizada até 10 de julho de 2010, e baseia-se no corpo de conhecimento do Scrum. As pessoas que mostrarem maior conhecimento serão convidadas sem custo para um dia inteiro na Spike que acontecerá na Microsoft Brasil em São Paulo no sábado, 24 de julho.

Logística: Você deve registrar-se em ScrumSpike para a avaliação da Scrum Spike. Há uma taxa 20 dólares para fazer a avaliação. Você pode se registrar quantas vezes desejar. Ao se registrar, você receberá uma senha que será utilizada para realizar a avaliação, comece por aqui. Até 10 de julho, os 150 melhores colocados serão afixados publicamente. O melhores 150 ao final receberão convites.

Preparação: Se você quer se preparar para a avaliação, leia o Guia do Scrum (www.scrum.org/scrumguides) e faça a avaliação gratuita de Scrum (Scrum open assessment), www.scrum.org/scrumopen/

Nota: Esta avaliação e o Scrum Spike são em Inglês. No entanto, uma edição em Português do Guia do Scrum está disponível em scrum.org.

Patrocinado pela Scrum.org


Postado na(s) categoria(s) Scrum , Scrum Developer , Agilidade , Eventos pelo Giovanni Bassi em 17 de junho de 2010 às 09:59 | Tags: , ,

DevIsland Estou em BH para mais uma edição do curso de Professional Scrum Developer e vou aproveitar a vinda para cá para palestrar sobre Domain Driven Design no DevDay, evento de lançamento do DevIsland, comunidade de .Net recente daqui.

O evento conta ainda com palestras de Scrum, TDD, BDD, e ASP.Net MVC. Mais ágil impossível.

Teremos também um encontro com a “filial” de Minas do .Net Architects. Vai ser a primeira vez que encontro um pedaço do grupo que criei, fora de São Paulo!

Mais informações sobre o evento você acha aqui. As inscrições estão lotadas, mas eles estão tentando abrir para acomodar mais algumas.

Até lá.


Postado na(s) categoria(s) Eventos pelo Giovanni Bassi em 17 de junho de 2010 às 00:11 | Tags: , , , , , ,

Quem não tem cão caça com gato? Depois da última reunião do .Net Architects deste sábado, saimos para o tradicional almoço. Na mesa, discutimos os problemas que cada um enfrentava no dia a dia. Foi consenso na mesa de que estamos com uma deficiência séria na classificação dos profissionais.

O caso mais emblemático é o ““senior””. Coloquei com aspas quádruplas, porque o termo merece. Por todo o mercado estamos encontrando empresas que subvertem a profissão, contratando pessoas como seniors, que na verdade não são. O profissional muitas vezes também não se entende como senior, mas como negar o salário mais polpudo? Isso tem gerado ““seniors em ASP.Net””, ou ““seniors em WPF””, ou outras aberrações. E o tal do senior não consegue nem gerenciar uma conexão com o banco de dados, ele é ““senior em ASP.Net””, e só em ASP.Net, mais nada. Parece que em todo o resto ele é junior, e só é senior em ASP.Net. E muitas vezes isso significa que ele sabe arrastar controles para a tela, e entende o que é Request e Response. O senior muitas vezes nunca viu uma página assincrona, e não conhece ASP.Net MVC. Ou seja, ele é incompleto na plenitude da sua senioridade, já que não conhece quase nada além da tecnologia principal com que trabalha, e é limitado mesmo nesta. Em qualquer lugar do mundo ele seria um pleno, ou até um junior, no Brasil ele é senior.

Quando falamos de um modelo de terceirização normalmente a culpa deste problema recai sobre as consultorias, já que elas fornecem a mão de obra, e supostamente devem avaliar o profissional. Isso é uma falácia, já que a empresa contratante também deve avaliar quem está lhe prestando serviço. Na prática, contratante e contratada sabem que o profissional não é senior, mas o mercado está com a demanda muito alta e há falta de profissionais, e os que há querem ganhar muito alto, e pra justificar o salário, só lhe classificando como senior. Pra piorar todos os projetos eram para ontem e o tempo pra contratação está cada vez menor. Não tenham dúvida, as empresas clientes sabem que estão comprando gato por lebre. E a grande maioria das consultorias faz isso, mesmo algumas daquelas grandes muito conhecidas.

Quem não tem cão caça com gato?

Como um profissional que passou por apenas alguns poucos projetos pode ser senior? Senioridade implica experiência, é daí que vem a palavra. Um profissional não é senior se ele trabalhou em 3 projetos ASP.Net quase iguais. A senioridade significa que ele já resolveu problemas diferentes, em domínios diferentes, com tecnologias diversas. Ele já usou ADO puro e Entity Framework, e ele sabe a diferença. Ele conhece padrões de projeto, e ainda que não conheça todos (ninguém conhece) ele conhece alguns que sabe que fazem diferença em alguns cenários. Ele já atendeu projetos para 5 usuários, mas já teve que fazer alguns testes de performance pra fazer uma aplicação com alta disponibilidade funcionar, e já teve que refazer alguns pedaços da aplicação porque simplesmente não funcionava.

Em resumo: senior de verdade já sofreu, já tem cicatriz. Senior de verdade foi pra guerra soldado e voltou sargento, porque tomou bala pelos colegas. E a bala deixou cicatriz. Ele virou uma guerra inteira, ele não é senior porque passou por 3 encontros com o inimigo, esse é o junior, esse é o cara que não tem ainda todas as manhas da guerra.

. . .

Vou deixar aqui outra provocação pra um post futuro: Outro caso citado no nosso almoço foi de uma empresa com vários “““arquitetos””” (aspas sextuplas agora) com 20 anos de idade. Eu não posso falar de idade, sempre fui precoce profissionalmente, e aceito pontos fora da curva. Mas entendo que, por serem fora da curva eles são raros. Será que uma empresa conseguiu contrariar toda a estatística e contratou os 3 únicos arquitetos de software de 20 anos de idade? O que será que estas pessoas estão decidindo? Como suas decisões recaem sobre o resto do time? Qual o impacto nos softwares sendo construídos, no TCO? Será feito concientemente pela empresa que contratou? Fica pra outro post.


Postado na(s) categoria(s) Carreira pelo Giovanni Bassi em 13 de junho de 2010 às 23:41 | Tags:

Continuando a série “Eu adoro”, agora é a vez do C#.

Já usaram o yield? É algo já não tão novo, apareceu no C# 2.0, e só existe no C#, não existe no VB.

O yield serve para gerar um Enumerable on demand. Por exemplo, se você quiser criar uma coleção de inteiros rapidamente, como faz? Veja abaixo, com yield:

public static IEnumerable<int> GetNums(int from, int to)
{
    for (int i = from; i <= to; i++)
        yield return i;
}

Legal, né? Para usar é fácil, verificamos com um teste:

[TestMethod()]
public void GetNumsTest()
{
    var nums = Class1.GetNums(2, 5);
    Assert.AreEqual(4, nums.Count());
    Assert.IsTrue(nums.Contains(2));
    Assert.IsTrue(nums.Contains(3));
    Assert.IsTrue(nums.Contains(4));
    Assert.IsTrue(nums.Contains(5));
}

Gosto bastante também do exemplo do MSDN:

public static IEnumerable<int> Power(int number, int exponent)
{
    int counter = 0;
    int result = 1;
    while (counter++ < exponent)
    {
        result = result * number;
        yield return result;
    }
}

Mais uma vez, para testar:

[TestMethod]
public void PowerTest()
{
    var nums = Class1.Power(2, 5);
    Assert.AreEqual(5, nums.Count());
    Assert.IsTrue(nums.Contains(2));
    Assert.IsTrue(nums.Contains(4));
    Assert.IsTrue(nums.Contains(8));
    Assert.IsTrue(nums.Contains(16));
    Assert.IsTrue(nums.Contains(32));
}

Mas o yield não é para ser usado somente com inteiros, você pode usá-lo para retornar um IEnumerable de qualquer coisa. Aqui um exemplo com strings:

public static IEnumerable<string> GetWordsUpper(string phrase)
{
    foreach (var word in phrase.Split(' '))
    {
        yield return word.ToUpper();
    }
}

Para testar é fácil:

[TestMethod]
public void GetWordsUppderTest()
{
    var palavras = Class1.GetWordsUpper("ola como vai?");
    Assert.AreEqual(3, palavras.Count());
    Assert.IsTrue(palavras.Contains("OLA"));
    Assert.IsTrue(palavras.Contains("COMO"));
    Assert.IsTrue(palavras.Contains("VAI?"));
}

Você pode levar isso longe, como obtenção de dados do banco, obtenção de input do usuário, tudo somente quando precisar, e por aí vai.

E você, já usou o yield? Gosta? Onde? Comente aqui.


Postado na(s) categoria(s) C# pelo Giovanni Bassi em 6 de junho de 2010 às 01:20 | Tags:

Já foi.

Videos:

#1

#2

#3


Postado na(s) categoria(s) Agilidade pelo Giovanni Bassi em 2 de junho de 2010 às 13:03 | Tags: ,

Quem é Giovanni Bassi

Giovanni Bassi Sou uma pessoa apaixonada por tecnologia e especificamente por .Net. Sou consultor independente especialista em .Net, focado em arquitetura e melhores práticas. Tenho dezenas de artigos publicados na .Net Magazine, revista da qual sou editor técnico. Ministro palestras e cursos de vez em quando, e quando dá tempo eu respiro um pouco. Mais detalhes nesta página.

Busca

Selos

Eu vou ao TechEd Brasil 2010, e você?

MVP

MCPD

MCSD

.Net Magazine

Abaixo ao if!

Calendário

«  julho 2010  »
seteququsedo
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
Ver detalhamento de posts no calendário

Blogs interessantes

    OPMLDownload OPML file

    Postagens recentes

    Comentários recentes

    Disclaimer / Aviso
    As opiniões colocadas neste blog são minhas e pessoais e não expressam necessariamente as opiniões de meus empregadores, pareceiros e amigos. Da mesma forma, os comentários feitos por leitores do blog não expressam a minha opinião.

    © Copyright 2010 .Net Unplugged
    Log in