quinta-feira, 22 de julho de 2010

Não sofra depois, aperte o cinto logo no começo...

Com o passar do tempo em que você fica dentro de um único cliente, e quanto mais entende do negócio, sua importância aumenta exponencialmente dentro do projeto ou na integração desses projetos.

Por um lado essa situação é super interessante, pois é criado um elo de confiança, um relacionamento duradouro entre as empresas e, muito provavelmente, você melhore a efetividade do seu trabalho e dos resultados. Por outro lado, existe uma boa chance de que você acabe se tornando um ponto focal para solução de problemas e novas demandas, que vai impactar diretamente o gerenciamento do seu trabalho, pois o número de interrupções cresce demais e aquele trabalho técnico isolado fim a fim (que tanto gostamos de fazer), acaba sendo atrapalhado.


Particularmente eu estou vivendo essa situação que é muito gratificante e, como sempre, aprendendo demais com novos trabalhos, então resolvi compartilhar um aprendizado com vocês...


Estou trabalhando com o CRM 4.0 da Microsoft e carregando uma série de dados (oriundos de fontes diversas) utilizando como canal de entrada os web services publicados pelo produto. Recentemente codifiquei tudo o que precisava para importar uma entidade específica e larguei a rotina em background no servidor, fazendo a importação dos dados para essa entidade, que terá alguns milhões de registros.


Em um primeiro momento estávamos com uma média de 36.000 registros por hora, o que me dizia que em dez horas eu teria importado aproximadamente 360.000 registros. Como a rotina de inserção faz algumas chamadas de validação, para evitar - por exemplo - registros com um campo específico duplicado, essas rotinas ficariam mais pesadas com o tempo (pois aumentaria o volume de registros para validação dentro do CRM) e imaginei que o processamento efetivamente iria demorar mais do que um número X de dias estimados.


Com as inserções em andamento, o que eu previa aconteceu. Com o passar do tempo o número de registros importados por hora caiu, fazendo que a importação passasse a demorar mais tempo. Eu, com outras demandas (sempre urgentes e para ontem - vide parênteses abaixo) pensei: larga esse trem lá em background enquanto eu toco as outras tarefas, está ficando cada vez mais lento, mas me parece ser o comportamento normal.


Abre parênteses: ODEIO quando as pessoas que insistem em falar "ISSO É PARA ONTEM". Por acaso você têm uma máquina do tempo? Vai usar o delorean e viajar para o passado e fazer a entrega? Então animal da cauda, que tal parar de irritar as pessoas falando isso e discutir estratégias e novos prazos para você conseguir o que quer? Se era para ontem, ou não foi comunicado, planejado ou alguém cometeu um erro de estimativa, mas não importa, entenda o que aconteceu e foque na solução. Fecha parênteses.


Nesse meio tempo a importação ficou cada vez mais lenta, chegando a ficar quase 10 vezes mais devagar que a velocidade original. Achei bem estranho os números que estava vendo, mas sem tempo de analisar se o comportamento (e bem ou mal estava rodando), dei prioridade para outras tarefas, até esse fim de semana, onde o processo insistiu em sofrer com exceções de timeout do CRM.


Sem ter para onde correr, fui em busca da raiz o problema: VS debugger, profiler, tudo rodando direitinho e sabe o que eu descobri? Um índice fundamental para minha pesquisa no SQL Server não estava criado na tabela que representa a entidade! Pelo padrão de implementação que estamos utilizando, este índice já deveria ter sido criado, mas na falta dele as consultas acabavam em um lindo table scan.


Criado o índice para suportar a consulta, voltamos à taxa de importação que eu via no início do processamento (quando um table scan era baratinho, baratinho). Tudo resolvido, voltei para as outras atividades com essa experiência me cutucando (doida para chegar ao blog).


O interessante é que durante o fim de semana mandei um e-mail para um dos envolvidos no projeto, falando sobre o problema de timeout, e ontem fomos conversar quando ele disse: "Uma das ações que vou fazer é aumentar o timeout.". Sabe qual foi minha resposta: "Não, eu quero que você coloque o valor mais baixo possível para o timeout!" (foi curioso a cara de espanto do meu amigo).


Entendeu o motivo da minha requisição? Espero que sim...



A lição


Trabalhe (principalmente desenvolva) sempre com os menores limites possíveis, isto é, seja o mais restritivo possível nos tempos de resposta.


Passamos uma semana com uma importação rendendo pouco, muito pouco, mas como a coisa estava funcionando e rodando em background, eu priorizei outras atividades. Quando a tarefa realmente parou, eu precisei de menos de uma hora para corrigir o problema e voltar com uma importação dez vezes mais rápida. Acabei adiando o fim da importação em alguns dias por não ter gastado uma hora (OK, não tinha como adivinhar que seria somente uma horinha) para ver se a demora da importação era natural.


No que toca o CRM, se o timeout desde o início estivesse sido colocado bem baixo, o problema teria acontecido antes e com certeza hoje eu já estaria com todos os milhões de registros importados. Se pensarmos no desenvolvimento de novas soluções, é mais fácil você trabalhar com massas de dados e distribuições de recursos menores no desenvolvimento do que na produção. Aí talvez passe por aquele conhecido problema: "nossa, no desenvolvimento essa tarefa é tão rápida".


Então se no desenvolvimento você restringir bastante os seus timeouts (dos testes de unidade, acesso a dados - SQLConnection e SQLCommands -, chamadas a web services, etc.) provavelmente irá encontrar e resolver mais cedo alguns problemas que te assombrariam em produção. A partir de agora vou apertar o cinto logo no começo!



Melhor dificultar a coisa na sua máquina e resolver mais problemas, do que assistir de camarote quando, em produção, estiverem milhares de usuários acompanhando sua aplicação falhar... Pense nisso!


[]s
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
http://www.srnimbus.com.br/

terça-feira, 20 de julho de 2010

Treinamento São Paulo: SQL Server 2008 R2: Administração e Monitoramento

Bom dia amigos.
Ando com uma agenda bem corrida e gastei parte do meu tempo para tentar organizá-la, então tentando atender a pedidos que eu recebi (e minha vontade), estou agendando um treinamento para ser ministrado em São Paulo.


Antes um comentário: já tenho montado um treinamento de 36 horas que é o SQL04, mas para esse curso vou colocar mais informações (sempre mais profundas e detalhadas, atentendo meu espírito geek) e também atualizá-lo com algumas novidades do SQL Server 2008 R2, então ainda não sei a duração exata, mas o curso provavelmente terá 44 horas de duração.


Treinamento: [SQL04] SQL Server 2008 R2: Administração e Monitoramento
Duração: 44 horas
Local: a definir (provavelmente na Paulista)
Datas:
    Setembro - 28 (vespertino), 29 e 30 (integral)
    Outubro - 05, 06 e 07 (integral)
Investimento: R$ 1.500,00 reais
Instrutor: eu
Interessados: Enviem um e-mail para o endereço luciano.moreira@srnimbus.com.br.

Observação: somente após um número mínimo de alunos terem confirmado presença é que a turma será efetivamente confirmada.

Para ver a ementa atual (só vou atualizar a ementa para o R2 mais para frente), basta acessar o nosso site e conferir: http://intranet.srnimbus.com.br/treinamento/paginas/curso.aspx?COD=SQL04

Espero vocês por lá!

[]s
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
http://www.srnimbus.com.br/

domingo, 11 de julho de 2010

[SQLServerDF] Encontro VIII - Introdução a storage e discos (parte II)

Bom dia pessoal.

Depois de um longo inverno, estamos de volta com os encontros do grupo SQLServerDF, e nada mais natural do que retomarmos o curso do grupo exatamente de onde paramos, storage e discos. Nosso último encontro estava em andamento quando faltou luz em metade de BSB, então vamos retomar o assunto, revisar os últimos slides que foram apresentados e mostrarmos mais outras coisas, como algumas ferramentas. Eu também vou tentar preparar alguma coisa interessante para acrescentar a apresentação do Wagner.

Favor mandar para o grupo um e-mail confirmando sua presença, pois o tamanho do auditório não é ilimitado.

As informações sobre o encontro são:

Local: Auditório da Microsoft - Edifício Corporate Financial Center, sala 302
Data e horário: 21/07/2010, 17:00h ~ 19:30h
Tema: Introdução a discos e storage (Parte II)
Descrição: Nesta apresentação faremos uma pequena jornada pelo mundo dos discos, desde sua criação e história, interfaces de comunicação, tipos de disco e RAID, componentes básicos de uma SAN e seu funcionamento. Após a apresentação o aluno entenderá melhor como funciona esse recurso, de suma importância para o funcionamento adequado do SQL Server. Nessa segunda etapa mostraremos outros recursos, considerações de I/O para o SQL Server e também alguma ferramentas.
Palestrante: Wagner Andrade e Luciano Moreira (entro rapidinho com alguns extras)
Mini-CV: Wagner é especialista em SQL Server e Storage, atuando nos últimos anos com a plataforma Microsoft e administração de bancos de dados/storage. Possui certificações Microsoft (MCP, MCTS e MCITP) e SNIA SCSP (SNIA Certified Storade Profissional).

[]s
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
http://www.srnimbus.com.br/

segunda-feira, 5 de julho de 2010

Microsoft SQL Server MVP (1.0)

Na última quinta-feira recebi uma notícia mais do que boa, chegou na minha caixa de entrada um e-mail do Rodolfo Roim (MVP Lead do Brasil - http://mvpbrasil.spaces.live.com/blog/) informando que eu fui nomeado Microsoft MVP (Most Valuable Professional) na especialidade de SQL Server.

Recebi o e-mail, a notícia se espalhou pelo twitter, recebi ligações dos amigos do Brasil afora e rapidinho já tinha muita gente falando sobre os novos MVPs (parabéns a todos!). Logo após o alvoroço inicial eu optei por sair um pouco de cena e refletir um pouco sobre o assunto...



O programa MVP


Eu sempre achei o programa MVP uma idéia espetacular desde antes de ingressar na Microsoft e durante os meus dias no time do MSDN (onde pude dar minhas sugestões e fornecer o máximo de informações que nos era requisitado). Ao longo dos anos eu vi o programa amadurecer e ganhar um respeito cada vez maior, pelo mercado e por todos os profissionais que trabalham com a plataforma Microsoft.

Hoje o Rodolfo está a frente dos MVPs e tive o prazer de acompanhar o seu trabalho a dois anos atrás, enquanto Microsoft, e gosto muito da seriedade e da maneira como ele está conduzindo o programa. Pelo menos pelo próximo ano será um grande prazer tê-lo como lead no Brasil.

Como também é natural, cada vez mais excelentes profissionais espalhados pelo mercado buscam o título de MVP, o que me deixa um pouco agoniado... Explico: Eu acho que as pessoas podem e devem almejar o recebimento do título de MVP, mas não tomar as ações simplesmente buscando esse objetivo, a pessoa no fundo têm que se doar por um objetivo maior, que é ajudar a comunidade técnica. Se ela vai receber ou não o título, isso não têm que importar, o que me leva ao próximo tópico desse post.



Me tornei um MVP, e agora?


Me tornar um MVP é motivo de orgulho e um reconhecimento gigantesco, e eu não poderia estar mais feliz. Mas aí eu andei pensando no que eu farei de diferente a partir de agora e a conclusão que cheguei foi: nada! Isso mesmo, nadinha.

Durante toda a minha carreira eu tive blogs, escrevi artigos, fiz palestras, trabalhei com grupos de usuários e me dá extremo prazer ajudar as pessoas, saber que algumas coisas que escrevo pode ajudar alguém em algum lugar. E me tornar um MVP me anima a escrever mais, falar mais, enfim, a continuar com mais dedicação o que eu já faço. Mas não necessariamente preciso fazer algo diferente, pois o que me trouxe até aqui foi justamente as coisas que fiz, e estou satisfeito com o balanço atual.

Talvez seja uma decisão curiosa, mas o meu momento "Sou MVP, e agora?" já passou e continuo o mesmo Luti de sempre, só que bem mais feliz e com uma injeção de energia para continuar meus trabalhos com a comunidade técnica.

Vou sim, como MVP, tentar aproveitar todas as oportunidades do programa e de crescimento como profissional, dos debates técnicos que espero ter, e as maneiras em que poderei colaborar com a comunidade técnica. Espero poder contribuir com o programa e tentarei fazer com que o título de MVP seja cada vez mais importante dentro da nossa comunidade. E, além disso tudo, espero que minhas ações continuem a gerar um dos frutos mais legais de trabalhar com a comunidade técnica: novos amigos pelo Brasil (e mundo) afora.
Deixo um abraço para todos aqueles que acompanham esse blog, para os amigos que me deram parabéns no twitter, por e-mail, telefone, enfim, todos que fazem parte dessa pequena história.

Obrigado!

No mais vou aproveitar ao máximo esse meu ano como MVP e, como ouvi no twitter de um amigo, o MVP 1.0. Espero que meu trabalho seja bom e quem sabe no futuro vou poder comemorar um 2.0...


PS: ainda me é estranho fazer parte de um grupo onde estão Paul Randall, Kimberly Tripp, Itzik Ben Gan, Andrew Kelly, Linchi Shea, entre muitos outros feras.

[]s
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
http://www.srnimbus.com.br/