Welcome to MSDN Blogs Sign in | Join | Help

Tecnologia e Diferenciação: Sem Riscos – Sem Ganhos

Em conversas com clientes, recebo pedidos freqüentes de apoio para usar tecnologias da Microsoft na diferenciação dos seus produtos frente a concorrência. Nestas conversas os assunto campeões de audiência costumam ser:

  • Melhorias na interface gráfica (e então me pedem para apoiá-los com tecnologias como WPF, Prism, Silverlight, DirectX, multitouch, speech API, etc.);
  • Melhorias na gerência do ciclo de vida de uma aplicação (e então me pedem para que eu fale de Visual Studio, o Project, Visio, etc.);
  • Funcionalidades horizontais, como relatórios, segurança, etc. (e então discorro sobre Reporting Services, ADSI, CryptoAPI, etc.);

O interessante é que quando falo destas tecnologias logo vem o diálogo:

- Mas não ficaremos dependentes da plataforma de aplicativos da Microsoft?

- Com certeza, sim!, é a minha resposta sincera.

Se pergunto em seguida o que estão usando, em poucos minutos se percebem já utilizando toneladas de infraestruturas únicas da plataforma. É muito comum encontrarmos:

  • Máquinas Virtuais únicas na plataforma (VB, .Net, Delphi, etc.);
  • Uso da infraestrutura de componentização da plataforma (ActiveX, OCX, COM+ e DLLs) e componentes de mercado, frameworks e bibliotecas que utilizam esta infraestrutura como base;
  • Infraestrutura de administração (instalação com msi, contadores de performance, uso do registry, event trace, ETW para log, bibliotecas como o Entity Framework que abstraem parte desta infraestrutura, etc.);
  • Serviços externos (como extensões e/ou interoperabilidade com o Office, SharePoint, Exchange, etc.) ou internos (como o MSMQ, pool de conexões para o banco de dados, sistema de arquivos transacionais, hospedeiros de aplicações como o Windows Service, o IIS ou o WAS, etc.)

Constatação: se você usa qualquer destas tecnologias, mesmo num aplicativo simples no cliente Windows, você já sabe usar o Windows para se diferenciar de um bom número de competidores.

Depois desta avalanche é normal certo ar de surpresa. Ele se conscientizou que já usa um grande número de tecnologias que o fizeram ao longo do tempo produzir software mais rápido, com melhor gerenciamento, com melhor a experiência do usuário, etc. Portanto, a proposta do uso de novas tecnologias não é de todo absurda.

A pergunta seguinte, e mais difícil de responder, costuma ser: mas esta tecnologia vai pegar?

Não tenho bola de cristal, mas existem indicadores interessantes. Por exemplo, como o Windows 7 está se saindo muito bem (veja as vendas), é bem provável que tecnologias como multitouch, WPF e outras específicas deste SO ganhem mais adeptos – já percebo isto no meu dia a dia. Existem boas chances destas tecnologias se tornarem diferenciais de mercado.

Mas fica o lembrete: faça você também as suas apostas, ouça seu instinto. Sempre haverá riscos.

Sem riscos – sem ganhos, diz o ditado.

Abraços

A Nuvem Privada vai acabar! (será?)

Quando participo de debates e conferências sobre cloud computing percebo que a Private Cloud, ou nuvem privada, tem levantado interesse entre as pessoas.

Li em dois links recentes (aqui e aqui) que o futuro não será o Private Cloud, pois a nuvem privada seria apenas uma solução temporária - que perderá sentido com a maturidade e o baixo preço que as nuvens públicas irão logo alcançar. É, por falar, uma tecnologia natimorta.

O maior argumento é a economia de escala. Por mais que uma empresa sozinha possa investir e conseguir bons preços construindo sua infraestrutura de nuvem, ela dificilmente conseguirá um preço melhor do que um provedor público, que consegue melhores preços e investimentos por ter muitos clientes. Algo semelhante à chegada do WallMart, Carrefour e outros grandes supermercados no mercado de supermercados.

Eles argumentam que mesmo que a nuvem pública não consiga tratar hoje de todos os itens de sua lista de exigências, tudo é apenas uma questão de tempo. Com os custos de processamento, rede, armazenamento baixando de ano para ano, com o respectivo aumento no número de clientes, e com o aumento de investimentos para lidar com uma massa cada vez maior de clientes, o sonho de uma computação remota segura e barata estará na mão dos provedores públicos.

Será?

Eu teria receios de fazer uma previsão deste tipo. As mesmas forças de comoditização de hoje poderão fazer um contra-efeito no futuro. Será que os datacenters, eles mesmos, virarão comodities um dia? Falei há muito do personal datacenter. Com o anúncio da Intel de um processador de 48 núcleos, você ainda duvidaria da possibilidade de existência deste personal datacenter?

Vi os antigos bureaus rodarem nas décadas de 70 e 80 as folhas de pagamentos das empresas. Vi também eles (quase?) desaparecerem nas décadas seguintes devido ao advento de servidores baratos e rápidos. A comoditização chegou para eles. Ela poderá chegar para os datacenters? Quem sabe?

Trabalho com tecnologia há anos. Olhando para trás tudo faz sentido. O problema é que, quando estávamos lá trás, a realidade de hoje era só uma das muitas possibilidades.

Como disse o Niels Bohr: “Previsão é muito difícil, especialmente sobre o futuro.”

Abraços

Computação e Dados massivos – a nova fronteira

Existe um livro da Microsoft Research chamado The Fourth Paradigm - Data Intensive Scientific Discovery, disponível para download, que trata de uma realidade nova da ciência de hoje.

Jim Gray, um dos desenvolvedores do System R nos primórdios dos Bancos de Dados Relacionais, do WorldWide Telescope e outros, escritor de um dos melhores livros da informática que já li (Transaction Processing: Concepts and Techniques) e Fellow da Microsoft até o ano de 2007, quando teve um acidente trágico, colocou o problema da seguinte forma: a ciência está iniciando o seu quarto paradigma que vai se apoiar numa TI que ainda não existe e temos que construir.

imageHistoricamente, a Ciência está sofrendo as seguintes mudanças de paradigmas:

  1. Ciência Empírica: onde os cientistas coletavam os dados de suas observações diretas e eles mesmos analisam esta informação chegando a algumas regras da natureza;
  2. Ciência Teórica: os cientistas constroem modelos analíticos (fórmulas) coerente com as observações e começam a fazer predições;
  3. Ciência Computacional: os cientistas adicionam ao seu instrumental computadores capazes de simular modelos analíticos, validá-los e construir predições (ex.: simulação da colisão de galáxias ou formação e morte de uma estrela);
  4. eScience: onde os computadores geram dados de simulações (exigindo muita computação), recebem eventos adquiridos por instrumentação, armazenam dados em arquivos ou banco de dados muitas vezes distribuídos (exigindo grande poder de armazenamento), e apoiam os cientistas na captura, organização, sumarização, análise e visualização desta monumental massa de dados (mais computação), tornando factível encontrar novas correlações e modelos analíticos capazes de novas predições.

Neste novo tempo, o computador tem o papel fundamental de analisar uma crescente massa de informações (na ordem hoje de muitos pentabytes e com previsão de dobrar nos próximos 2 anos) e  torná-los coerentes.

A computação, assim usada, seria comparável com a experiência do uso do telescópio por Galileu Galilei.

As empresas provavelmente terão um desafio semelhante. Elas também recebem um turbilhão de dados (dados de mercado, preços, vendas, ações dos clientes, etc.), e precisam entender rapidamente o que está acontecendo para agir corretamente e em tempo.

Investimentos enormes têm sido feitos para lidar com este novo volume de dados. Novas tecnologias para cubos OLAP (vide SQL Server 2008 R2 Parallel Data Warehouse), serviços para a coleta massiva de eventos (SQL Streaming), computação em paralelo, seja por HPC (Beowulf Computing) ou cloud computing (como o Azure), são exemplos de alternativas reais hoje.

Ao estabelecer este 4º paradigma Jim Gray parece estabelecer uma direção de forma semelhante ao que John Kennedy colocou para a ciência americana ao apontar como objetivo o homem na lua.

Quem ganha? Todos. Como na corrida espacial, toda a sociedade recebe seus benefícios diretos ou indiretos. Mas muito já pode ser feito agora, e a direção não é a de um computador muito grande, mas a de uma rede de armazenamento e computação em paralelo.

Quanto ao livro, recomendo a leitura do primeiro artigo, do próprio Jim Gray.

Abraços

A Verificação Formal de programas vai acabar com a necessidade de Testes?

No último post falei da verificação e corretude de programas, da lógica de Hoare e de ferramentas que apoiam o desenvolvedor/arquiteto a verificar formalmente se uma implementação está de acordo com a especificação.

Existe um artigo recente do Hoare na ACM communications de Outubro de 2009 (Retrospective: An Axiomatic Basis for Computer Programming) que é interessante para quem gosta deste tópico.

Nele, o cientista discorre sobre seus muitos anos de esforços rumo à verificação, que teve como base o uso da lógica e a definição formal das linguagens de programação. Seu objetivo era eliminar erros e, neste caso, a prova formal de programas eliminaria a necessidade de testes.

Em certo ponto ele confessa: “Em um ponto eu estava espetacularmente errado. Eu pude perceber que os programas estavam ficando maiores e eu pensei que testar poderia ser um caminho crescentemente ineficaz de remover seus erros”. Onde estava seu engano? “Eu não percebi que o sucesso dos testes é que eles testam o programador, não o programa.”...”A falha num teste pune qualquer lapso de concentração do programar e (tão importante quanto) a contagem de falhas permitem aos implementadores resistirem a pressões gerenciais para a distribuição prematura de um código não confiável.”  Mais adiante: “... de fato ambos (testes e verificação formal) são valiosos e suportam mutualmente meios para acumular evidências da corretude e “serviciability” dos programas”.

Existem vários pontos que nos levam ao uso ou não de testes e/ou verificação formal:

  1. Custo. No estágio atual, a verificação formal ainda é cara, mas pode se justificar caso haja riscos de vida ou de perdas significativas caso falhas ocorram;
  2. A verificação formal não nos protege contra erros de especificação;
  3. Existem erros, como as vulnerabilidades de segurança, que são extremamente difíceis de testar. Neste caso, o uso da verificação formal parece ser inestimável.

Recado dado: nada de sonhar em um dia parar com testes e provas de conceito. A verificação formal será mais uma arma no nosso arsenal.

Minha experiência pessoal diz que especificar, testar e implementar são coadjuvantes. Ao testar e desenhar testes pegamos tanto erros de programação quanto de especificação; ao programar pegamos erros nos testes e na especificação; ao checar contra a especificação pegamos erros tanto nos nossos testes quanto na implementação… e, nesta luta contra erros, todas ferramentas são bem vindas.

Para terminar, uma visão dada pelo próprio Hoare: num futuro, “… eu espero que o fenômeno do erro de programação seja reduzido à insignificância: a programação de computadores será reconhecida como a mais confiável das disciplinas da engenharia e os programas de computação serão considerados os componentes mais confiáveis em qualquer sistema que os incluam”.

Um belo objetivo a ser perseguido!

Abraços

(obs.: todas traduções são minhas)

Agilidade X Formalismo

Sempre vimos o formalismo no desenvolvimento de software como um misto de desejo e desconfiança. Isto é explicável porque se por um lado ele melhora ou mesmo garante a qualidade de uma implementação de software, por outro lado ele costuma implicar em um custo muito alto, exigindo um tempo maior de desenvolvimento e o uso de profissionais com alto grau de formação.

A técnica de prova de corretude que aprendi na universidade foi a do uso da lógica de Hoare – o mesmo que criou o Quicksort, CSP e outros. Nesta técnica, Hoare nos ensinou que cada comando de nosso programa tem uma pré-condição e uma pós-condição que, em resumo, indicam a transformação exercida do comando em nosso ambiente em tempo de execução.

Outro conceito que levei algum tempo para compreender foi a ideia de “invariante”. Para poder indicar o que um loop deve fazer, Hoare nos pedia para definir o ponto-fixo do loop, garantindo que o loop iria convergir para a pós-condição pós-loop.

Complicado? Bem, fica a minha dica para vocês darem uma olhada no vídeo abaixo do time de pesquisa do RiSE. Fica muito mais simples quando temos uma ferramenta de apoio.

Get Microsoft Silverlight

Para mim, projetos como este, ou como o Pex e Qex (ambos ferramentas que geram testes a partir de código, seja uma classe ou função, seja uma query SQL), são uma clara indicação de que logo será possível conciliar o desenvolvimento ágil com o rigor formal e o baixo custo.

Se isto acontecer, finalmente poderemos usar sem constrangimentos o termo Engenharia de Software. Sem o cálculo da corretude, ao meu ver, ficamos ainda desmerecedor do termo. Vocês não acham?

PS.: Me desculpem este um mês de ausência, mas as férias me chamavam e não pude resistir. Um grande 2010 para todos!

Paralelismo em Profundidade

O uso de paralelismo num mundo multi-cpus está se tornando um tema cada vez mais quente (para tornar nossos PCs mais frios).

Para quem se interessa, como eu, sobre este tema, aqui vão alguns bons artigos (bem técnicos) referentes ao assunto. Reserve um tempo e boa leitura:

Por fim, o blog do time de Parallel Programing listou um conjunto extenso de exemplos muito bons. A lista está em: http://blogs.msdn.com/pfxteam/archive/2009/12/09/9934811.aspx.

Meu preferido? O clássico “ Dinning Philosophers”em WPF! (mas há quem prefira o Sudoku).

image
Project Name: DiningPhilosophers
Languages: C#, Visual Basic
Description: A WPF application that demonstrates the classic “Dining Philosophers” synchronization problem.  The application implements several solutions, including one based on asynchronous techniques using Tasks.

 

Abraços

A Origem das Linguagens de Patterns

Há muito estava na minha lista de livros para ler os livros do Christopher Alexander.

Para quem não conhece, ele é o arquiteto (não de TI, mas de arquitetura de casas, etc.) que influenciou a comunidade de TI com o conceito de linguagem de padrões.

O livro que escolhi para começar foi o “The Timeless Way of Building” – o primeiro de uma trilogia.

Para quem gosta de uma leitura Zen, este é o caso. Por exemplo, ele define uma “qualidade sem nome” que define uma boa arquitetura em contraste com uma má. Para ele, se entendi bem, uma boa arquitetura é algo que está viva, que potencializa o prazer de habitar, que está em equilíbrio com as forças (da natureza e/ou do homem), que permite ao homem ser ele mesmo porque nos deixa imunes a autocontradições. Esta “qualidade” é ao mesmo tempo precisa, mas sem nome, pois não se confunde com nenhuma qualidade próxima a ela (viva, completa, confortável, exata, sem ego e eterna).

O caminho dele na pesquisa desta “qualidade sem nome” o levou à procura de um padrão de eventos para qual a arquitetura deve servir. Comer, ler, passear, etc., todos são eventos que acontecem e que precisam de um ambiente. Este ambiente é construído por outros padrões de eventos (entrar/sair, sentar, iluminar, etc.) e estes por outros ainda menores. Não importam os objetos, mas sim a relação entre eles que, por sua vez realizam uma linguagem de padrões.

Assim, todo padrão está associado a um contexto de eventos em que ele faz sentido e, por sua vez, os padrões harmonizados junto a estes contextos permitem que nossas ações (eventos) aconteçam, dando vida ao ambiente e fazendo a arquitetura eterna.

Não conheço nenhuma construção projetada pelo Christopher Alexander que tenha tido impacto estético ou histórico. Aliás, do pouco que pude ver em fotos da internet, seus projetos são de medianos a medíocres.

Dizem ter sido um bom professor, um tanto o quanto contra a arquitetura moderna, e com uma importância hoje maior na arquitetura de TI do que na Arquitetura de fato. Mesmo o pensar o mundo através de relações não foi uma novidade de fato. Antes dele já existia, por exemplo, a ontologia de Wittgenstein, a Antropologia de Lévi-Strauss e a ciência da Ecologia (correlação de estruturas e eventos em um contexto, etc.).

Mesmo assim é um bom livro que nos leva a pensar e sonhar com uma arquitetura mais holística.

Vale a leitura.

Abraços

Manifesto SOA

 

Para quem não viu ainda, está no ar um manifesto SOA bem interessante que defende a prática consciente de SOA.

Vou reproduzir aqui abaixo, mas você pode ler e assinar diretamente em http://www.soa-manifesto.org/aboutmanifesto.html.

Gostaria de ouvir a opinião de vocês....

Aqui vai:

SOA Manifesto

Service orientation is a paradigm that frames what you do. Service-oriented architecture (SOA) is a type of architecture that results from applying service orientation.

We have been applying service orientation to help organizations consistently deliver sustainable business value, with increased agility and cost effectiveness, in line with changing business needs.

Through our work we have come to prioritize:

Business value over technical strategy

Strategic goals over project-specific benefits

Intrinsic interoperability over custom integration

Shared services over specific-purpose implementations

Flexibility over optimization

Evolutionary refinement over pursuit of initial perfection

That is, while we value the items on the right, we value the items on the left more.

 

Guiding Principles

We follow these principles:

Respect the social and power structure of the organization.

Recognize that SOA ultimately demands change on many levels.

The scope of SOA adoption can vary. Keep efforts manageable and within meaningful boundaries.

Products and standards alone will neither give you SOA nor apply the service-oriented paradigm for you.

SOA can be realized through a variety of technologies and standards.

Establish a uniform set of enterprise standards and policies based on industry, de facto, and community standards.

Pursue uniformity on the outside while allowing diversity on the inside.

Identify services through collaboration with business and technology stakeholders.

Maximize service usage by considering the current and future scope of utilization.

Verify that services satisfy business requirements and goals.

Evolve services and their organization in response to real use.

Separate the different aspects of a system that change at different rates.

Reduce implicit dependencies and publish all external dependencies to increase robustness and reduce the impact of change.

At every level of abstraction, organize each service around a cohesive and manageable unit of functionality.

Abraços

Posted by Otavio Pecego Coelho | 0 Comments
Filed under:

Private Class ResumoPDC

1 semana de férias + 1 semana de PDC + rede lenta no hotel = -posts

Então não devo ter notícias novas para vocês. Waldemir, Condé, Giovanni e Rogério falaram boa parte das novidades. Vou ficar com o que ficou de mais importante na minha memória:

1) , é claro, a entrada do Azure no ar para valer em fevereiro;

2) Tudo que tem de novo nesta última versão do Azure:

a) A API de monitoração (http://code.msdn.microsoft.com/windowsazuremmc ) onde você pode agora pegar o Log do IIS, eventos do Windows, iniciar/remover instâncias de roles do Azure, enfim, tudo para você começar a identificar quando aumentar ou diminuir o número de processos no Azure (elasticidade);

b) Agora você define novos tipos de workers. Você cria endpoints e pode usar o WCF para a comunicação entre eles, o que implica em migração mais fácil para quem tem aplicativos multicamadas usando o WCF;

c) Existe agora a noção de update domains: conjunto de workers que serão atualizados em conjunto. Com isto, podemos atualizar um update domain e testá-lo antes de atualizar os demais, garantindo uma instalação mais suave e controlável. Além disto, podemos pedir a atualização de um tipo de worker – nada de ter que baixar/levantar todo o conjunto de workers por causa de um oatch simples;

d) O PinPoint: um Market Place para mostrar seus produtos que rodam no Azure para seus futuros clientes (ver http://pinpoint.microsoft.com/en-US/ );

e) O Windows Azure Content Delivery Network (CDN), isto é, um cache global distribuido em 18 países que você pode usar para colocar imagens usadas no seu site do Azure (veja http://blog.smarx.com/posts/using-the-new-windows-azure-cdn-with-a-custom-domain);

3) Tudo que está para vir no Azure

a) O SQL Azure Data Sync: para sincronizar um ou mais bancos com o SQL Azure (mesmo o SQL Compact) (ver em http://www.microsoft.com/windowsazure/developers/sqlazure/datasync/);

b) O Projeto Dallas: serviços de dados da Nasa e outros que você pode incorporar no seu aplicativo (ver em http://www.microsoft.com/windowsazure/developers/dallas/);

c) A promessa de novos tamanhos limites para o SQL Azure;

4) A palestra do Erik Meijer sobre o Reactive Extension (http://blogs.msdn.com/somasegar/archive/2009/11/18/reactive-extensions-for-net-rx.aspx)

san francisco 321

4) O Silverlight 4 chegando e fazendo drag and drop entre aplicativos no Windows e o aplicativo Silverlight no Browser (http://silverlight.net/ );

5) O RIA Services, levando o Silverlight para tratar aplicativos multicamadas e usando agora o WCF para levar queries Linq do cliente para o servidor, e dados em ambas as direções (ver http://blogs.msdn.com/brada/archive/2009/11/19/pdc09-talk-building-amazing-business-applications-with-silverlight-4-ria-services-and-visual-studio-2010.aspx);

6) O Container do Azure que estava a mostra:

 

Tem muito material para ser visto.

Vale uma olhada nos vídeos do PDC em http://microsoftpdc.com/Videos (os do Azure estão listados em http://blogs.msdn.com/jnak/archive/2009/11/19/videos-of-the-windows-azure-sessions-at-pdc09.aspx )

Os treinamentos no http://channel9.msdn.com/learn/courses/Azure/

...e , claro, as últimas Ferramentas e SDK em http://www.microsoft.com/windowsazure/tools/

 

Abraços

Posted by Otavio Pecego Coelho | 0 Comments
Filed under: ,

Faça seu Gerador de Código com o T4 do Visual Studio

Tenho visto poucos arquitetos utilizando uma tecnologia interessante para gerar código de acordo com templates e que já está embutida no Visual Studio, sejam 2005, 2008 ou 2010.

Trata-se do T4 (Text Template Transformation Toolkit) Code Generation. Ele está contido no Visual Studio SDK e pode ser usado para gerar um código de acordo com um template que você ou seu time escreve.

Pense nele como a metade de uma infraestrutura para um gerador de código.

Um gerador completo costuma ter duas partes: a primeira é a responsável pela leitura dos metadados de uma especificação ou modelo; a segunda é a que lê estes metadados e gera algum artefato (código, html, etc.) a partir destes.

O Visual Studio SDK já vem com o Domain Specific Language Tools onde você pode especificar uma DSL visual (o Carlos Hulot falou muito disto no seu blog) e utilizar dentro dos templates T4 um conjunto de classes que permitem ler estes metadados para gerar o código correspondente.

Mas o DSL do SDK é um pouco complexo e você pode precisar de algo bem mais simples. Saiba que você pode construir seu próprio parser ou mero formulário para dar a entrada dos metadados que o template T4 usará para gerar seu código. Por exemplo, você pode fazer uma biblioteca para ler os metadados de um banco de dados e colocá-los a disposição para o template T4 percorrê-los gerando, por exemplo, classes com seus campos - como o Entity Framework faz.

Como exemplo, veja a figura abaixo.

image

Nela, você pode ver código que será rodado pelo template para gerar código (ele está sempre entre <# #> ). Em especial, o código no bloco que começa com <#+ é uma função de ajuda que retirar espaços de dentro de strings e é utilizado no bloco logo abaixo para gerar strings do nome de cidades sem espaços. Textos fora dos blocos <# #> são copiados diretamente para o arquivo de saída.

Quando abrimos o arquivo gerado (genclass.cc) deste exemplo encontramos o seguinte texto:

Cidades sem " " entre nomes
NewYork
London
Seattle
SanFrancisco
NewDelhi

Simples, não é?

Existe um post ótimo do Scott Hanselmann que dá vários links interessantes sobre o assunto.

Fica a dica: se você está querendo trabalhar com MDD e pensa em fazer seu próprio gerador, dê uma olhada no T4!

Abraços

(Dica 2: pense no Oslo como o parser e o T4 como gerador)

Quando usar o Azure?

Existem dois tipos de respostas aqui: uma que visa o diferencial do aplicativo do ponto de vista Controle X Custo, já abordado em http://msdn.microsoft.com/pt-br/azure/dd638038.aspx; outra que visa a adequação tecnológica no uso do Azure . Hoje vou tratar da segunda.

Em minha opinião, nem todo tipo de arquitetura de aplicativo é susceptível de ir para o Azure, seja por impossibilidade técnica atual, seja por custo.

Para ficar mais claro qual tipo de arquitetura eu creio ser viável no Azure, criei o seguinte quadro:

image

 

Para tornar mais claro, vamos tratar de cada caso:

1) Web 2.0 (Privado/Público): imagine cenários que precisam compartilhar um volume muito grande de dados não transacionais, podendo ter que escalar eventualmente para milhares ou mesmo milhões de usuários. Pense em Facebook, Youtube, sites de blogs, sites de notícias, etc. Neste caso você vai poder usar o Azure em todo seu potencial, utilizando a elasticidade de processamento e storage (Azure Tables), armazenando tudo num volume virtualmente infinito de recursos. Estes é um dos cenários mais favoráveis para o Azure!

image

2) SaaS (Privado/Público): imagine fazer um aplicativo para ser vendido para milhares ou mesmo milhões de clientes, cada um utilizando seus dados de forma exclusiva, tendo um máximo de 10G de banco SQL (limitação atual do SQL Azure), mas podendo guardar em Blobs e Tables do Azure um volume virtualmente infinito de documentos, fotos, vídeos, etc – o que diminui consideravelmente a limitação de volume máximo do banco. Imagine poder crescer/decrescer o número de clientes de acordo com a sazonalidade sem custo de compras ou ociosidade de recursos. Este é também um cenário para o Azure.

 image

3) High Performance Computing: imagine um aplicativo que precise de um alto grau de processamento paralelo, para criar animações de filmes, analisar proteínas, construir plataformas de petróleo, etc, utilisando algoritmos como MapReduce. Se não houver impeditivo na carga/descarga de dados a serem trabalhados (devido à latência ou volume), o Azure pode ser utilizado para a infraestrutura deste aplicativo, com a vantagem de você só alocar os servidores quando realmente necessitar rodar o processamento. Por que só bom? Ainda não existe framework MapReduce pronto, você terá que fazer o seu. Outra questão é o eventual volume de dados para ser carregado para uma análise.

image

4) Small/Medium Transaction Processing: se você tem um aplicativo para empresas pequenas e/ou médias, ou mesmo aplicativos departamentais, provavelmente você poderá usar o SQL Azure de 1G ou 10G, migrando o seu aplicativo para o Azure. Lembre-se que fotos, documentos e outros podem migrar do Banco para Tables e Blobs, pois isto diminui o risco do limite do SQL ser atingido. Por que só bom? O limite atual de 10 Gb pode ser um impeditivo.

image

5) Remote SQL: você pode utilizar o SQL remotamente, ganhando latência (o que é ruim), mas conseguindo tanto um custo pequeno quanto a possibilidade de compartilhar os dados com outras empresas, sites, etc. Porque não deixar a lista de produtos e preços da sua empresa disponível para terceiros? (leitura somente, é claro!). Por que só bom? A latência da Internet pode ser um impeditivo.

image

6) Internet Service Bus: se você precisa da comunicação com aplicativos externos à sua rede, eventualmente de terceiros, o Internet Service Bus é uma infraestrutura interessante. Ele permite a troca de mensagens com autenticação federada, diminuindo o custo de infraestrutura e gerenciamento de um EDI. Por que só bom? Latência, de novo.

image

7) Mistos: imagine uma loja online, onde pedidos são feitos pelo site no Azure (com lista de produtos no SQL Azure e fotos dos produtos nos blobs) e em que toda a infraestrutura de pagamento e entrega está na sua empresa, ou na empresa de terceiros. Neste caso, você poderá complementar sua loja online, que habita no Azure, com os demais sistemas de logística, meios de pagamentos, etc, utilizando o Internet Service Bus como mecanismo de troca de mensagens confiável. Este e muitos outros cenários podem utilizar o melhor de cada tipo de ambiente (nuvem, dispositivos, sistemas internos ou de terceiros), realizando uma verdadeira arquitetura Software+Serviços. Por que só bom? Latência e limite de SQL Azure…

image

Por fim, dois cenários, ao meu ver, não parecem ser convenientes para o Azure atualmente:

1) eXtreme Transaction Processing: que necessitam de Base de Dados muito grandes e que não pode ser resolvido com particionamento (vide post).

image

2) Sites HTMLs puros: neste caso, você até pode colocar o site no Azure, mas como você não estará compartilhando o IIS com outros usuários, o custo, potencialmente, será desvantajoso com o que praticado por hosters do mercado.

image

 

Esta é a minha análise dentro da situação atual. Você concorda?

Abraços

Padrões para Cloud Computing no Azure – Particionamento com o SQL Azure (Sharding)

O interessante da computação em sistemas elásticos, como o Azure, é que eles tornam factíveis padrões computacionais que costumam ser caros para as empresas.

É claro que podemos utilizar o Azure para migrar sistemas convencionais de nossas empresas (como sistemas departamentais ou algum outro sistema LOB), tentando minimizar o custo total da nossa TI. Mas tudo fica mais divertido – e potencialmente lucrativo - quando pensamos nas oportunidades para modelos computacionais que lidam com uma massa grande de dados ou de computação. E, para compreender isto, vale descrever alguns padrões recorrentes nestes tipos de problemas.

Imagine milhões de usuários visitando o seu site. Que padrões você pode utilizar para viabilizar tamanho número de acessos?

Imagine um cálculo que pode levar milhões de MIPS. Tenho padrões similares?

A resposta a estas perguntas costuma ser um grupo de padrões recorrentes. São eles:

1) Replicação: que se caracteriza pelo uso de uma estrutura repetitiva de computação e/ou armazenamento – o que proporciona a elasticidade pelo simples aumento ou diminuição desta “célula de computação”.

Neste caso temos dois sub-padrões comuns:

a. Sites convencionais compostos de WebFarms + storage: onde repetimos o mesmo código para cada servidor Web (web role, em bom azurês) e colocamos os mesmos dados de leitura copiados (em memória cachê ou cópia em storages (Azure Tables, em bom azurês));

b. Sites SaaS: onde repetimos a estrutura de cada célula (servidores+storage) onde, porém, tanto a estrutura de storage quanto a de código podem ser ligeiramente diferentes para cada usuário/inquilino, devido a customizações e/ou dados exclusivos;

2) Particionamento: que se caracteriza pela subdivisão da computação ou armazenamento com fins de distribuir as demandas para subsistemas diferentes, aliviando subsistemas e evitando potenciais gargalos.

Os sub-padrões seriam:

a. Grid: sites que trabalham com algoritmos de alto paralelismo, com a distribuição de subconjuntos (normalmente distintos) de dados para cada servidor, como acontece no MapReduce (ver post) ou processamentos em pipeline;

b. Sites que possam ser particionados em subsistemas distintos, como Vendas, Cobrança e Logística numa loja virtual, onde cada subsistema tem código e dados distintos, referentes à cada passo do processo de compra e entrega de um pedido, e cada sub-sistema se comunica com o outro por redirecionamento, compartilhamento de dados e/ou envio de mensagens (filas, em azurês);

c. Sharding: O particionamento de dados em storages diferentes, visando distribuir estatisticamente o acesso aos dados e, assim, diminuir o tempo de espera médio para uma escrita ou leitura. Tables do Azure, por exemplo, têm este comportamento por natureza/construção;

3) Misto: o mais comum, onde padrões de replicação e particionamento são utilizados em conjunto formando arquiteturas complexas.

O SQL Azure, em particular, nasce um pouco limitado devido à sua condição ACID (ver post). Porém isto não impede de você utilizar algumas destas estratégias visando arquiteturas para milhões de usuários. As estratégias possíveis são:

a) SaaS: um banco de dados para cada inquilino ou pequeno grupo de inquilino (ver 1.b acima);

b) Subsistemas distintos: um banco de dados para cada subsistema (ver 2.b acima);

c) Particionamento: um banco de dados para cada subconjunto de dados (ver 2.c acima);

Como o SQL Azure, ao contrário do MS SQL não tem infra-estrutura interna para particionamento, caberá a você construir uma :(

A boa nova é que o Windows Azure Platform Training Kit de outubro traz um lab com um código exemplo que implementa o particionamento com o SQL Azure usando o sharding.

Aos estudiosos, vale a pena baixar o Kit e ir direto para a Demo “Scaling Out SQL Azure with Database Sharding” e dar uma olhada.

Abraços

Arquitetura de Software – Boas Referências

Há muito venho recebendo pedidos de referências para o estudo e formação em arquitetura de software e soluções. Como este é um campo muito novo (cerca de 20 anos) poucos são os livros e artigos que consolidam as práticas mais atuais de uma forma estruturada, com linguagem simples, direta e com conteúdo atualizado.

A boa notícia é que tenho duas referências que creio serão muito úteis para todos nós.

A primeira referência é o livro Software Architecture: Foundations, Theory, and Practice. Este talvez seja um dos melhores livros que já li sobre o tema. Tem uma excelente cobertura do assunto, abordando práticas reais e mais ágeis de fazer arquitetura. Ele aborda temas atuais, como Domain Specific Software Architectures, tratando de assuntos que vão do básico “o que é arquitetura de software?“ até considerações de design, modelagem, análise, implementação e implantação. Um excelente livro para iniciantes. Um livro para os profissionais revisitarem seus conhecimentos que, dado a novidade do campo, foram muitas vezes adquiridos de forma empírica através de acertos e erros em projetos reais.

51hsJUa7JxL__BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_

A minha segunda referência é o e-book do Waldemir Cambiucci, nosso colega de blog de arquitetura aqui do time de arquitetura da Microsoft Brasil. Ele consolidou e reestruturou um conjunto grande de posts do seu blog em um e-book que pode ser usado como uma referência atual das abordagens de arquitetura de software utilizando as tecnologias da Microsoft. Waldemir é um incansável estudioso e escritor de posts, e aproveita cada projeto, cada preparação, para também divulgar o que está sendo experimentado e aprendido.

image1

Boa leitura!

Linguagens Funcionais, Internet Service Bus, SQL Azure e Windows Indentity Foundation

Com o feriado chegando sempre vale algumas recomendações (referentes a arquitetura de software) para as horas vagas.

1) Que tal melhorar seu conhecimento no uso de linguagens funcionais e alguns padrões de código úteis para construir melhores bibliotecas, frameworks, etc. Minhas sugestões são:

a. O artigo Functional Programming for Everyday .Net Development. Este artigo vai mostrar alguns padrões e princípios interessantes como essência/cerimônia, Princípio da Segregação de Interfaces e outros, ilustrando tudo com lambda expressions em C#. São conhecimentos e truques que podem ser úteis na sua próxima biblioteca;

b. Motivado com o uso de expressões funcionais? Por que não continuar com as duas primeiras aulas do Erik Meijer (um dos autores do Linq) sobre os fundamentos da programação funcional? Você encontra aqui a primeira aula, e aqui a segunda. Imperdível!

2) Que tal colocar seu conhecimento de ISB em dia lendo uma série de 3 artigos do Juval Loy sobre Azure Services? Este talvez seja o futuro do EDI... será? Você pode achá-los em 1, 2 e 3;

3) Se você já se cadastrou no SQL Azure no sql.azure.com, talvez valha apena baixar o SQL Azure Explorer http://sqlazureexplorer.codeplex.com/ para o Visual Studio 2010. Ele vai te dar uma experiência interessante para administrar tabelas, views e stored procedures no SQL Azure;

4) Por que não compreender melhor como você pode criar e testar um aplicativo no Azure que aceita identidades de um identity provider externo (por exemplo, o ActiveDirectory da sua empresa ou de uma empresa parceira) usando o Windows Identity Foundation (WIF)? Neste caso, recomendo a leitura do WIF e Autenticação Federada no Windows Azure Web Role.

…e, claro, reserve um tempo para passear e descançar.

Bom feriado

Otavio

Preços do Azure e simulação por Monte Carlo

Tenho recebido perguntas de como calcular o custo do Azure para compará-lo com o custo de outras alternativas.

Já existem algumas calculadoras disponíveis para isto, mas, infelizmente todas as que eu vi fazem contas simples, que poderiam ser feitas com o Excel com pouco esforço, e que não levam em conta a variação probabilística de alguns fatores que influenciam no preço final.

Quando temos variáveis como GB de storage utilizados no mês, trafego de mensagens, número de transações, etc., melhor do que fazer uma conta com um número estimado (nosso “chute”) é utilizar uma estimativa estatística baseada em algum comportamento padrão – e aqui entram as distribuições normais, uniformes, binárias, etc.

Vamos a um exemplo. Distribuições normais são interessantes para modelar distribuições que tendem a se aglomerar perto de uma média – o que acontece, a meu ver, com todas as variáveis componentes do preço final do uso do Azure à exceção do custo de uso de CPU e SQL.

Outro fator interessante de uma distribuição normal é que podemos simular seu comportamento empiricamente se soubermos dois dados que nos dão os limites do intervalo de confiança em que temos 90% de confiança (ver figura).

normal

E aqui um ponto importante: “chutar” um intervalo de confiança é mais fácil e preciso (!) do que “chutar” o valor esperado. Por exemplo, no Excel, bastaria utilizarmos a fórmula

=norminv(rand(),média,desvioPadrão)

onde

média = (Limite 90% do Intervalo de Certeza + Limite 10% do Intervalo de Certeza)/2

desvioPadrão = (Limite 90% do Intervalo de Certeza - Limite 10% do Intervalo de Certeza)/3,29

Levar em conta valores probabilísticos nos leva a um resultado probabilístico também. Isto é, ao invés de obtermos um único número obtemos uma curva probabilística que nos conta nossa variação com o risco. Por exemplo, podemos perceber que temos 10% de chance de pagar um valor de 800 quando o valor médio estaria em 700 e, ao final, saber estas chances pode nos levar a um processo de decisão mais realista – numa comparação entre preços ofertados no mercado, será factível compreender melhor quando ou com que probabilidade uma composição de preço é melhor que outra.

Como isto é um instrumento útil não só para cálculo de preços, mas para planejamento de capacidades e outros, vale a pena mostrar o como calcular levando em conta as curvas de probabilidades.

A maneira mais comum e genérica que temos hoje para calcular uma expressão que é constituída da composição de fórmulas probabilísticas é o método de Monte Carlo. O método de Monte Carlo é um método de simulação - isto é, são gerados vários números que obedecem as curvas de probabilidade de cada fórmula estatística da expressão. Por exemplo: se temos o custo em GB de storage e o custo de transferência de GB dados, podemos pensar que a expressão do custo dos dois é dado por P_usoGb()*custoPorGB + P_transfGB()*custoTransfPorGB. Como cada função P é de fato uma curva probabilística, podemos simular milhares de resultados ao gerar números (que obedeçam a curva de distribuição de cada função P_) para P_usoGb() e P_transfGB() e calculando milhares de resultados para esta expressão.

Com milhares de resultados, podemos agora calcular intervalos e suas probabilidades contando quantos dados simulados ficaram abaixo de um determinado valor. Outra maneira de lidar com isto é ordenar o array de resultados e calcular, por exemplo, 10 intervalos a partir dos valores mínimos e máximos da amostra. Sabendo os intervalos, podemos contar o total de valores dentro de cada intervalo e, com isto, temos a probabilidade para cada intervalo.

Um Excel ou um programa ajuda no cálculo. Como gosto de programas, vou contar como fiz minha versão 0.01 da minha calculadora do Azure.

Passo 1: Interface – Usei WPF pensando em usar gráficos no futuro.

image

Passo 2: Funções de geração de distribuição aleatórias para serem usadas na simulação – Coloquei em uma biblioteca 3 tipos de distribuição, mas uso apenas a distribuição normal aqui (de um algorítmo achado na internet). Aqui vai o código:

public class MathHelp
{
    static Random r = new Random();

    // Gera número randômico segundo a distribuição normal
    // decimal upper90 => valor superior do Intervalo de 90% de Confiança
    // decimal low90 => valor inferior do Intervalo de 90% de Confiança
    public static double GenByNormal(double upper90, double low90)
    {
        double norminv = 0;

        double probability = r.NextDouble();
        double mean = (upper90 + low90)/2;
        double sigma = (upper90 - low90)/ 3.29; // standard deviation

        double x = 0;
        double p = 0;
        double t = 0;
        double q = 0;

        const double c0 = 2.515517, c1 = 0.802853, c2 = 0.010328;
        const double d1 = 1.432788, d2 = 0.189269, d3 = 0.001308;

        q = probability;
        if (q == 0.5) norminv = mean;
        else { 
            q = 1 - q;
            if ((q >= 0) && (q < 0.5)) p = q;
            else {
                if (q == 1.0) p = 1 - 0.9999999; // JPR - attempt to fix divide by zero below, what is NormInv(1,x,y)?
                else p = 1 - q;
            }

            t = Math.Sqrt(Math.Log(1 / (p * p)));

            x = t - (c0 + c1 * t + c2 * (t * t)) / (1 + d1 * t + d2 * (t * t) + d3 * (t * t * t));

            if (q > 0.5) x = -1 * x;

            norminv = (x * sigma) + mean;
        }

        return norminv;
    }


    // Gera número randômico segundo a distribuição uniforme
    // decimal upper => valor superior do Intervalo 
    // decimal low => valor inferior do Intervalo 
    public static double GenByUniform(double upper, double low)
    {
        return r.NextDouble() * (upper - low) + low;
    }

    // Gera número randômico segundo a distribuição binária
    // decimal oneProb => probabilidade de dar 1
    public static double GenByBin(double oneProb)
    {
        return ((r.NextDouble()> oneProb)?1:0);
    }

}

Passo3: Criação dos arrays com valores aleatórios – Note que minha amostragem é de 1000 simulações para cada variável. Também vale a pena lembrar dos custos do Azure aqui ou aqui.

// Cria array de 1000 posições para cada par Upp-Lower
double[] cpuRequest = GenNormalArray(1000, 0.15, convertDoubleToString(txReqUpp.Text), convertDoubleToString(txReqLow.Text));
double[] kTrans = GenNormalArray(1000, 0.001, convertDoubleToString(txKTransacoesUpp90.Text), convertDoubleToString(txKTransacoesLow10.Text));
double[] gbUsados = GenNormalArray(1000, 0.15, convertDoubleToString(txGBUsadosUpp.Text), convertDoubleToString(txGBUsadosLow.Text));
double[] storageRead = GenNormalArray(1000, 0.15, convertDoubleToString(txLeituraUpp.Text), convertDoubleToString(txLeituraLow.Text));
double[] storageWrite = GenNormalArray(1000, 0.15, convertDoubleToString(txEscritaUpp.Text), convertDoubleToString(txEscritaLow.Text));
double[] sqlRead = GenNormalArray(1000, 0.15, convertDoubleToString(txSQLLeituraUpp.Text), convertDoubleToString(txSQLLeituraLow.Text));
double[] sqlWrite = GenNormalArray(1000, 0.15, convertDoubleToString(txSQLEscritaUpp.Text), convertDoubleToString(txSQLEscritaUpp.Text));

onde

private double convertDoubleToString(string s)
{
    if ( s==String.Empty || s == "" ) s = "0";
    double result = 0;
    try
    {
        result = Convert.ToDouble(s);
    }
    catch (Exception err)
    {
        throw new Exception("Erro de digitação: " + err.Message);
    }
    return result;
}

private double[] GenNormalArray(int size, double value, double upper90, double low90)
{
    double[] arr = new double[size];
    for (int i = 0; i < size; i++)
    {
        arr[i] = MathHelp.GenByNormal(upper90, low90) * value;
    }
    return arr;
}

Passo 4: Cálculo do custo total para cada linha

double[] total = new double[1000];
double custoCPUs = convertDoubleToString(txNumCPUs.Text) * 24 * 30.5 * 0.12;
double custoSQL = convertDoubleToString(txNumSQL10GB.Text) * 99.99 + convertDoubleToString(txNumSQL1GB.Text) * 9.99;

for (int i = 0; i < 1000; i++)
{
    // calcula custo Azure
    total[i] = custoCPUs + cpuRequest[i] + gbUsados[i] + storageRead[i] + storageWrite[i] + kTrans[i];
    if (custoSQL != 0)
    {
        total[i] += custoSQL + sqlRead[i] + sqlWrite[i];
    }
}

Passo 5: Criação dos intervalos – Neste código deixei um valor fixo de 10 intervalos.

// Sort nos resultados para poder achar os intervalos
Array.Sort(total);

// cria 10 intervalos de acordo com o s valores mínimos e máximos encontrados
double interval = (total[999] - total[0]) / 10;
int[] counters = new int[10]; // array para contar número de resultados a cada intervalo

int index = 0;
counters[index] = 0;
double toCompare = total[0] + interval; // valor de teste
// inicia a contagem
for (int j = 0; j < 1000; j++)
{
    if (total[j] >= toCompare)
    {
        index++;
        toCompare += interval;
    }
    if (index < 10) counters[index]++;
    else break;
}

Passo 6: Mostra dos resultados – Nesta versão, só um MessageBox

string s = "";
for (int i = 0; i < 10; i++)
{
    s += "\n Maior Igual a " + Convert.ToString(total[0] + interval * i) + " val " + counters[i];
}

MessageBox.Show(s);

image

Note, neste exemplo, que temos uma variação de custo em dólares de ~290 a ~385, com valor mais provável no intervalo entre 322 a 354 (com ~78,5% de chance).

É claro que é uma versão draft com muitos defeitos. Por exemplo, o tratamento de erros é fraco e um gráfico final seria bom para melhorar sua venda. Mas a intenção é só mostrar um método de avaliação quando temos a composição de valores probabilísticos. Qualquer erro, por favor, e-mail para mim.

O importante é que este método de cálculo pode ser usado com o Azure, com preços de terceiros ou mesmo com o cálculo dos custos da sua TI. Lembre-se, de no custo total, colocar preços como eletricidade, custo de pessoal, etc.

Abraços

Posted by Otavio Pecego Coelho | 0 Comments
Filed under: ,
More Posts Next page »
 
Page view tracker