Welcome to MSDN Blogs Sign in | Join | Help

Arquitetura e sobrevivência – Winchester House

Por vezes a arquitetura de software é comparada com a arquitetura de casas, por outras com ó urbanismo. Ambas são metáforas importantes para justificar o planejamento de um software ou infra-estrutura de TI antes da aventura de implementá-la.

Algumas vezes utilizei o contraste de uma favela perto do escritório da Microsoft em São Paulo em comparação às ricas construções da Av. Berrini.

 Foto: Isabela Noronha/G1(foto da Favela emprestada deste artigo)

Favelas costumam nascer sem planejamento e, aos poucos, surgem problemas comuns como a falta de vias públicas que viabilizem o transporte de cargas, a falta de infra-estrutura comum para água, esgoto ou luz e surge também o risco de incêndios, a dificuldade para realizar segurança, etc. O controle urbanístico nasce assim de uma necessidade de reuso de uma infra-estrutura comum e da certeza de que uma cidade cresce e deve se precaver antes, de modo a evitar o custo freqüente de re-engenharia para suportar os futuros carros, prédios, etc. Existe melhor metáfora para a necessidade de uma arquitetura de software ou emresarial?

Outro exemplo clássico, pouco conhecido no Brasil, é o da Winchester House. Imagine uma casa construída durante anos, mas sem o mínimo planejamento, isto é, sem a figura do arquiteto. O resultado? Uma casa com 160 quartos, 47 escadas de incêndio, 17 lareiras, 10000 janelas, muitas escadas (aonde muitas não vão a lugar nenhum, ou melhor, param no teto da casa), várias portas e armários falsos, outras portas que simplesmente dão para fora da casa, três elevadores, etc..

 img_0850_med

É fato que existem dúvidas se não havia um certo plano em prática ali. Sarah, a viúva do criador do rifle Winchester, perdeu seu marido e filha, e lhe foi dito que havia uma maldição devido aos vários mortos em decorrência do invento de seu marido. Para amenizar a maldição, ela deveria construir uma casa para ela e os espíritos dos mortos. Ela viveria enquanto a casa estivesse em construção.

Hoje a casa é um exemplo clássico da falta de arquitetura e suas consequências. Ela é também um ponto turístico.

Um comentário que ouvi outro dia: ela não seria também uma metáfora do instinto de sobrevivência de alguns departamentos de TI?

Posted by Otavio Pecego Coelho | 0 Comments
Filed under:

Julho, mês de Data Center

O mês de Julho vai trazer ao ar dois novos Data Centers para a Microsoft e sua comunidade.

O primeiro, em Dublin, já está em ação. É o primeiro mega Data Center da Microsoft fora dos EUA. Aproximadamente 28 mil metros quadrados podendo usar hoje 5,4 mega watts, mas com capacidade para chegar a 22,2 mega watts.

Dublin data center

O segundo é o Data Center em Chicago que entra no ar dia 20 de Julho. Com 65 mil metros quadrados e capacidade de 60 megawatts ele foi feito para receber containers com até 2.500 servidores dentro.

Chicago data center

Outra expectativa importante para este mês será o anúncio dos preços e modelo de negócio para o Azure que deve acontecer na WPC (World Partner Conference). Esta é uma notícia muito aguardada e esperam-se preços competitivos.

Sinais de que a casa está ficando pronta para chegada comercial do Azure em novembro.

Falando de Public Cloud, Private Cloud e S+S

Foram dois eventos quase que em seqüência.

Primeiro um lançamento de um produto no auditório da Microsoft em São Paulo que já se baseia no Azure (mesmo estando ele em CTP). O produto se chama Promotor Móvel e foi feito pela CSIT Desenvolvimento de Software. A idéia é coletar dados via celular sobre produtos a vendas no mercado e enviá-los para uma base central. Ao final, prover os dados para o Excel para medir questões relativas aos produtos como distribuição, exposição, avarias, faltas, concorrência, etc. No centro, uma aplicação na nuvem com todos os cadastros e responsável por armazenar os dados que podem conter descrições, fotos, etc. A união do celular, Excel e Azure é um exemplo perfeito da visão de Software + Serviços - poder contar sempre com o melhor de cada tecnologia. Como a CSIT visa um universo multi-inquilino e com o provável crescente armazenamento de dados pelos promotores, a elasticidade do Azure cai como uma luva. A Microsoft prometeu para este julho os preços a serem cobrados pela utilização de CPU, disco e rede do Azure. A expectativa é que a economia de escala dos Datacenters do Azure se realizem.

Na CIAB, estive numa apresentação/debate sobre o tema “Cloud Computing e novas tecnologias” com o Gartner e a IBM (Diebold na mediação). Dois pontos me chamaram a atenção. Primeiro que todos afirmaram que o termo “cloud computing” não é bem definido – algo que venho falando há tempos (http://blogs.msdn.com/otavio/archive/2008/09/20/viveremos-e-veremos.aspx). O Gartner luta para corrigir isto dando sua definição, mas parece que o artigo A Break in the Clouds: Towards a Cloud Definition (http://ccr.sigcomm.org/online/?q=node/439) recém citado num documento da McKinsey tornou o sentimento de confusão uma unanimidade.

Um segundo ponto se refere ao novo termo Private Cloud. Outro nome de semântica não muito bem determinada. Mas vamos ao que o mercado está falando... Imagine sua empresa ter o seu Datacenter baseado fortemente nos princípios de virtualização, auto-provisionamento (como no Azure, onde pela web você pode alocar máquinas onde rodarão seus processos e o Azure aloca os recursos para você) e gerenciamento automatizado. Estes parecem ser os conceitos comuns ao Private Cloud.

O que a Public Cloud faz a mais que o Private Cloud não faz? 1) Com certeza você não conseguirá a mesma economia de escala, pois o compartilhamento da infra-estrutura é de uma escala menor – mas a sensação de controle é maior; 2) Ainda não encontrei ninguém ofertando estruturas de armazenamento de alta redundância e particionamento como Tables, Blobs e Queues do Azure ou estruturas semelhantes fornecidas pela Amazon ou Google.

A Microsoft, em particular, está apostando em mais esta alternativa para as empresas. Segundo http://www.microsoft.com/virtualization/cloud-computing/privatecloud.mspx , logo será oferecido um Toolkit gratuito que pode estender uma infra-estrutura (virtualizada com o Hyper-V e gerenciada com o System Centar) com o auto-provisionamento, realizando então seu Private Cloud.

Como uma das promessas do Steve Ballmer é que boa parte da pesquisa e desenvolvimento do Azure chegará aos poucos para o OS Windows do Servidor, posso imaginar que logo você também poderá ter Tables, Blobs e Queues semelhantes ao do Azure na sua TI.

Abraços

Animação sobre Azure e Cloud Computing

Explicar o que faz o Azure ou o que é “cloud computing” nem sempre é simples. Como técnicos, tendemos a falar de detalhes e acabamos confundindo nossos interloctores.

Steve Marx faz parte da equipe do Azure e tem um dos melhores blogs sobre o assunto.

Desta vez, ele fez um desenho animado explicando o que é o Azure e “utility computing”. Claro e simples!

 

Abraços

(PS.: outra dica é a seqüência de pequenos “how to´s” sobre como melhorar a interface da sua aplicação com o Windows 7 que encontrei no blog do Miguel Ferreira Ferreira. Poucas linhas de código para uma boa melhoria visual)

DSL DevCon 2009

Domain Specific Languages (DSLs) são linguagens normalmente pequenas e que visam certos domínios como queries (SQL), construção de programas (MSBuild), etc. DSL´s são hoje um campo interessante de pesquisa e desenvolvimento na indústria e na academia.

Se você se interessa pelo assunto, aqui vai um convite: dê um click no link http://msdn.microsoft.com/en-us/oslo/dd861661.aspx e assista as apresentações da DSL DevCon 2009. Nele vocês vão encontrar Martin Fowler, Intentional Programming, M, F#, Groovy e outras tecnologias e palestrantes populares.

Saboreie.

Posted by Otavio Pecego Coelho | 0 Comments
Filed under:

Dicas sobre Azure e Oslo

1) Saiu já há algum tempo, mas ainda vale recomendar, bons textos sobre o uso de Tabelas, Blobs e Filas no Azure: você pode checar em http://www.microsoft.com/azure/whitepaper.mspx. Junto você pode encontrar também três excelentes textos (estes um pouco mais antigos) sobre o serviço de Controle de Acesso, o Service Bus e o Serviço de Workflow. Todos os textos claros (em inglês) e compreensíveis.

2) Quarta passada Waldemir e eu fizemos um WebCast sobre Model Driven Design e Oslo. No meio da demo em que estava mostrando uma definição em MSchema para mostrar a transformação para T-SQL acabei apanhando de um erro quando estava definindo um tipo. Faltava um ponto-e-vírgula no final da definição, mas com a pressa e meu óculos para perto, não vi.

Bem, isto não é motivo para vocês não testarem e verem com seus próprios olhos. O SDK do Oslo se encontra aqui – basta baixar.

Quanto ao webcast, vocês podem acessar aqui. E me perdoem a falha.

Abraços

Mandrake e o futuro da Ciência da Computação

Um colega da Microsoft que trabalha com a área educacional me relatou que o número de candidatos a uma vaga na área de Ciência da Computação nas Universidades caiu para ¼ do que tínhamos há alguns anos. Ele também me conta que o interesse tem se mantido muito mais pela empregabilidade do setor do que pelo amor à computação.

Este comportamento parece ser mundial. Sociedades como a ACM (Association of Computing Machinery) têm alertado sobre o problema e investido bastante em divulgar o lado criativo e multidisciplinar desta ciência.

Formei-me em Engenharia quando a micro computação estava chegando. Vivíamos a possibilidade de ter nossos próprios computadores e com o sonho de criar um novo mundo onde a inteligência artificial, automatização e outros iriam liberar a humanidade para uma vida melhor. O famoso HAL de “2001 uma Odisséia no Espaço” ainda estava nas nossas cabeças. E, é claro, havia também o sonho de ficar rico com alguma descoberta ou desenvolvimento.

Hoje o sonho continua, mas para bem poucos. A maioria dos empregos é para desenvolvimentos de pouca criatividade, como aplicativos departamentais ou páginas web simples. A rotatividade no emprego também é muito alta. Conheço empresas que chegam a ter a permanência de um empregado de apenas 9 meses/ano! Não é de espantar que o interesse diminua.

Quando vejo isto me lembro do pesadelo que adquiri a partir de uma leitura de uma revista do Mandrake na década de 70 - que me impressionou muito na época e continua povoando meus sonhos. Nesta estória, Mandrake e seu amigo Lotar tinham que investigar o desaparecimento de alunos novos e de QI altíssimos das escolas americanas. Na investigação, Mandrake e Lotar vêem dois homens estranhos levarem um menino para um portal do tempo e conseguem segui-los até um tempo futuro e distante. Lá conversam com os estranhos que lhes relatam o problema e a causa dos seqüestros: neste futuro a sociedade se encontra completamente automatizada e o computador garante toda infra-estrutura para que a humanidade viva e se divirta. Porém, a humanidade perdeu o gosto de enfrentar problemas difíceis. Não havia mais quem quisesse ou quem tivesse formação para dar manutenção aos sistemas existentes. Daí os seqüestros.

Não me lembro do fim da estória, se o Mandrake resgatou ou deixou os meninos salvarem a humanidade no futuro. Mas pouco importa, a visão continua terrível.

A ciência da computação é uma ciência nova (60 anos?). Cresceu muito rapidamente gerando sonhos irrealistas. Tornou-se com o tempo uma ciência com desenvolvimento mais lento. Desenvolvimento lento como as demais ciências - só isto. O que pode torná-la menos popular, mas não menos interessante.

Temos ainda problemas duros, como a inteligência artificial, a computação em paralelo, a resolução de problemas que exigem algoritmos não polinomiais, etc. Já ajudamos em todos os campos: Biologia, Finanças, Administração, etc.

Para ser mais sexies, talvez só precisemos de uma educação mais conectada à multidisciplinaridade do nosso tempo e uma visão empresarial que equilibre melhor o modelo indiano de serviço com o modelo americano de alto investimento em pesquisa e desenvolvimento. Caso contrário, estaremos cada vez mais e mais investindo para formar programadores COBOL para dar manutenção em sistemas caros e à baixo custo. Uau... exatamente o futuro que o Mandrake nos avisou que poderia acontecer.

Reengenharia e Refactoring – nosso destino

“Things alter for the worse spontaneously, if they be not altered for the better designedly”
Francis Bacon

Refactoring é uma necessidade para a TI, nossos softwares e, diria o filósofo, para a vida.

Vale uma lida no blog da Susan Cramm (http://blogs.harvardbusiness.org/cramm/2009/04/why-it-solutions-are-never-sim.html ).

Como ela diz, os sistemas nascem enxutos e arrumados, mas com o tempo deterioram.

O mesmo acontece com softwares grandes como ERP’s ou Sistemas Operacionais. De tempos em tempos precisamos de uma reengenharia para diminuir o número e a complexidade de interfaces ou a redundância exagerada de software. Por isto o investimento é constante.

Mesmo no desenvolvimento de um primeiro software esta tendência já está à espreita. Com uma equipe grande, a má-comunicação e a falta de sincronismo garantem uma complexidade exagerada e/ou um provável retardo na entrega do software.

Existem várias boas práticas para tentar evitar o caos: comunicação eficiente, separação clara dos módulos e interfaces, divisão clara de papéis na equipe, revisões freqüentes de projeto e código, o famoso “build diário”, etc.

Mas e quanto ao que já está em produção?

Trabalhei numa empresa em que implantamos um sistema que mapeava as reclamações feitas ao suporte pelos clientes contra o módulo/função do código fonte relativo à falha. Com os histogramas decorrentes, em pouco tempo pudemos perceber que havia picos de erros em algumas poucas funções. Nossa medida foi simples: redesenhar e reescrever o que provocava os muitos erros. O sucesso foi imediato - em poucos meses tínhamos um sistema muito melhor que o inicial.

Na hora de um grande refactoring é essencial conseguir um grafo de dependência entre módulos, classes, variáveis e funções. Assim vocês podem imaginar o prazer que tive logo após instalar o Beta 1 do Visual Studio (ver aqui). Uma das novas funcionalidades é exatamente a de criar grafos de dependência com a possibilidade de queries (com o Architecture Explorer) sobre um código já existente. Bom para a engenharia reversa (quem não teve que dar manutenção a um código desconhecido?) e para o refactoring . Vale a pena uma olhada.

Para quem não quiser baixar antes de saber mais, sugiro uma olhada na documentação em http://msdn.microsoft.com/en-us/library/dd409365(VS.100).aspx.

Para dar um gostino, na figura abaixo você pode ver um grafo de dependência de um código meu de teste. Na parte de baixo da figura, está o “Architecture Explorer” para fazer queries.

image

Abraços

Tendências em Linguagens de Programação

Hoje, no universo das linguagens de programação, fica clara a existência de uma fricção entre três dimensões distintas: 1) entre o mundo tipado e o não tipado; 2) entre o imperativo e o funcional; 3) entre linguagens específicas e linguagens genéricas.

Como trabalhei em projetos muito grandes, tendo a usar linguagens imperativas, genéricas e fortemente tipadas (como o C#), mas fico contente com a volta das linguagens sem tipos como Ruby ou Phyton. De certa forma, vejo estas linguagens forçando as linguagens tipadas a incorporar novos mecanismos que as tornem mais ágeis. Um exemplo claro disto é a incorporação da inferência de tipos tanto em VB quanto em C#, levando a uma simplificação no código (parece que o mesmo vai acontecer com o C++).

Linguagens funcionais é um caminho interessante para procurar novas tendências. Elas foram as primeiras a incorporarem os mecanismos de inferência de tipos e de “comprehensions” (como as cláusulas where do Linq) e trazem características declarativas que podem ser úteis para que os compiladores possam achar oportunidades de paralelismo. Elas têm algo da economia de linguagens não tipadas, com a precisão de tipos das linguagens tipadas. Por isto é grande a sua influência atual no design de linguagens.

Ainda sobre as linguagens funcionais, percebo que nem todos compreendem que elas funcionam a partir de regras de reescrita, o que as torna bem diferentes das demais. Por exemplo, em F# podemos definir uma função que retorna a soma entre dois números da seguinte forma:

> let add (x, y) = x+y;;

val add : int * int -> int

Como nas linguagens imperativas, podemos chamar add passando parâmetros:

> add (3,4);;

val it : int = 7

Mas existe uma forma chamada de curried (em homenagem ao matemático Haskell Curry) que pode ser definida na própria linguagem F#. Para isto precisamos apenas de um novo operador

> let curry f x y = f (x, y);;

val curry : ('a * 'b -> 'c) -> 'a -> 'b -> 'c

Esta forma de chamada nos permite tanto tirar os parêntesis na passagem de parâmetros (como abaixo)

> curry add 3 4;;

val it : int = 7

como nos permite definir uma nova função reutilizando nosso add de uma forma muito simples:

> let succ = curry add 1;;

val succ : (int -> int)

Com esta definição, podemos chamar a nova função succ como abaixo

> succ 4;;

val it : int = 5

Creio que este exemplo já dá um gostinho do poder de reescrita de uma linguagem funcional.

Interessante também é a perspectiva das linguagens específicas de domínio (DSL’s). Penso que, de certa forma, toda biblioteca ou framework gostaria de ser uma. Este conceito influenciou Ruby on Rails e atualmente influencia o projeto Oslo para modelagem de SOA da Microsoft. Vale a pena uma checada.

Para finalizar: esta disponível os vídeos do último simpósio do Lang.Net em http://langnetsymposium.com/. Este é um simpósio bem interessante entre experts no tema. Pena não haver tradução...

Dos que vi (e vi poucos) e recomendo:

  • a do Lars Bark que fala da otimização do JScript no Chrome (V8);
  • a do Erik Meijer sobre Observers;
  • e a do David Langworthy sobre Oslo (devo fazer um WebCast sobre Oslo e vou usar o exemplo dele…);

Bom simpósio.

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

Que tipo de transação usar?

Esta semana recebi um questionamento de quando usar que tipo de transação no .Net Framework. Como creio que a resposta é genérica e pode ajudar outros arquitetos, aqui vai a minha resposta para todos:

“Caro X,

Infelizmente não consigo me lembrar de um documento consolidando os tipos de transações e quando usá-las, mas me diga se a explicação abaixo ajuda:

                - Light Transaction (LT) do .Net: é como se fosse um DTC re-escrito pra .Net (coordenador do two-phase commit) e coordena transações dentro de um mesmo Application Domain. Assim, se você usar o .Net para abrir bancos diferentes (com o ADO.Net) ou incorporar messages queues (com o System.Messaging ou WCF) em uma mesma transação, este é o coordenador de transação a ser utilizado. Ele adiciona uma latência na ordem de poucos milissegundos;

                - DTC: continua existindo. Sempre que um Light Transaction recebe um pedido para falar com um objeto COM+ ele passa o controle da transação para o DTC (o mesmo usado pelo COM+), por tratar de transações em contextos diferentes (processos diferentes). Lembrando sempre que, transações em uma mesma máquina têm custo muito menor do que em máquinas diferentes. O tempo típico de latência p/ coordenação em uma mesma máquina é da ordem de dezenas a uma centena de milissegundos;

                - WCF: o WCF pode utilizar o WS- Transaction para coordenar uma transação entre máquinas. Exemplo: cliente abre no WCF um contexto de transação chamando dois métodos de servidores remotos. O WS-Transaction pede a ajuda de um coordenador externo para garantir um two-phase commit. O coordenador, no caso da Microsoft, é o próprio DTC remoto utilizando o protocolo WS-Transaction. Como o WS-Transaction é um protocolo padrão, coordenadores de outros fabricantes podem ser utilizados. Este método é o que tem pior desempenho e é análogo ao uso de um DTC remoto. Isto acontece porque quanto maior o custo de conversação com o coordenador maior é a latência e o impacto no tempo de locking dos recursos usados na transação. O tempo típico de latência p/ coordenação é de centenas de milissegundos (pode variar muito, dependendo da rede, do desempenho da máquina do dtc e da velocidade do disco para o log da transação);

                - Long running transactions (LRT): usado pelo Biztalk ou pelo Workflow Foundation, este método não usa um coordenador de transação, mas utiliza sim um método de desfazimento. Com isto, transações que levam de minutos a semanas não fazem lock em nenhum recurso. Caso uma falha aconteça no processo, um processo (workflow) de desfazimento entra em ação. O exemplo típico seria o agendamento de uma viagem com posterior cancelamento no caso de não conseguirmos hotel (cancelamento = procedimento de desfazimento);

Quando projeto um aplicativo tento ao máximo utilizar os dois primeiros mecanismos e sempre na mesma máquina. Evito ao máximo a coordenação entre máquinas diferentes como acontece no caso do WCF ou DTC remoto. Faço isto não por problemas do WCF/DTC, mas porque prefiro, sempre que possível, criar um terceiro serviço que usa o LT ou DTC localmente para coordenar duas chamadas internas (do .Net ou do COM+) – garanto assim o bom desempenho com a composição de métodos. Se quiserem utilizar um coordenador externo será importante garantir que o tempo total (dos serviços chamados + overhead do DTC) não seja muito grande, causando eventual time-out devido ao tempo total de locking na transação. Tenho um artigo que já falava sobre este problema com o uso do DTC remoto (ver http://www.microsoft.com/brasil/msdn/Tecnologias/arquitetura/EnterpriseServices.mspx). Creio que isto continua valendo tanto para o uso do DTC remoto quanto do uso do WS-Transaction.

No caso da SOA, tento sempre que possível usar LRT, uma vez que, na teoria da SOA, devemos pensar os serviços como autônomos. Isto me obriga a usar workflows, message queues e desfazimento. Perco em complexidade mas ganho a total autonomia dos serviços.

                Em tempo: uma boa leitura também seria http://msdn.microsoft.com/en-us/library/ms998530.aspx . As boas práticas contidas no capítulo http://msdn.microsoft.com/en-us/library/ms998556.aspx continuam valendo seja para DTC ou no uso do WS-Transaction. “

Abraços

REST e Linq: transformando queries Linq em URI’s

Há poucos dias Rafael Godinho e eu realizamos um WebCast sobre REST e aplicações RESTful (você pode encontrar o WebCast aqui: https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032410135&culture=pt-BR ).

Uma das coisas que acredito que deixamos de chamar a atenção neste WebCast foi sobre o uso do Linq e de chamadas assíncronas no Silverlight com o ADO.Net Data Services.

Primeiro, para quem não sabe, o ADO.Net Data Services é uma tecnologia que oferece interfaces REST para serem acessadas por agentes externos – isto é, interfaces clientes ou outros sistemas externos. As interfaces exposta são interfaces CRUD utilizando os verbos do http (GET, PUT, etc.) onde a uri, no caso de um read, pode ter expressões de filtragem (ex.: http://.../Livros()?$filter=(novo eq true) ). É importante também saber que o ADO.Net Data Services expõe entidades que podem vir de um Entity Framework (com quase nenhum esforço) ou de entidades em memória (estes últimos, com um pequeno esforço).

Quando um serviço REST é exposto pelo ADO.Net Data Services o cliente Silverlight pode usar a API do System.Data.Services.Client para acessar o serviço REST remoto. Para isto, ele cria um contexto indicando a uri raiz dos serviços a serem chamados e , com ele, pode realizar queries Linq como se estivesse junto ao Banco de Dados local.

Os aspectos que não chamamos a atenção no WebCast são:

  1. o comando Linq realizado no cliente cria uma uri que inclui a condição de filtro. Portanto, a filtragem já é feita no servidor. Temos, por assim dizer, um LinqToUri !! A alternativa de trazer toda a coleção para o cliente e lá usar a condição de filtro na coleção retornada não seria aceitável, pois incorreria num custo alto de rede;
  2. num cliente, como o Silverlight, é importante utilizar a chamada REST de forma assíncrona. A penalidade no caso de não fazer isto é ter a thread do cliente parada à espera da resposta, levando insatisfação ao usuário. O System.Data.Services.Client oferece esta possibilidade com a simples indicação de uma callback.

É muito simples e creio que vale uma olhada nestas tecnologias. Sugiro também o artigo do John Papa sobre o assunto: http://msdn.microsoft.com/en-us/magazine/dd569758.aspx.

Abraços

Entity Framework, DTOs e Self-Tracking Entities

O último post do time do Entity Framework é bem interessante no contexto dos assuntos discutidos neste Arquitetura em Pauta nos últimos tempos.

Numa aplicação complexa e n-camadas, sabemos que nem sempre queremos passar os dados das nossas entidades conceituais para a camada de apresentação. O motivo é simples: por vezes precisamos apresentar menos dados do que a entidade contém (ex.: só nome e código, deixando os outros de lado); outras vezes queremos esconder do usuário campos para cálculos internos usados na camada de negócio.

A solução para isto tem sido o uso de DTO’s. Eles contêm a projeção mínima e necessária de um subconjunto dos dados das entidades conceituais e servem para levar e trazer dados entre a regra de negócio e a apresentação e/ou um serviço externo.

No entanto, usar um DTO é trabalhoso. Por exemplo, uma entidade conceitual pode exigir diferentes DTOs em contextos diferentes aumentando a complexidade devido ao grande número de DTOs exigidos. Pior: DTOs exigem uma boa carga de programação para marcarmos o que o usuário mudou e devolver ao Entity Framework para que este atualize o ObjectContext e o Banco de Dados.

Uma segunda solução seria usar as entidades conceituais como base para a transferência entre camadas. Neste caso aceitamos expor mais dados do que necessário visando ganhar simplicidade. Mas ainda falta o tracking do que foi editado, tornando difícil a atualização do ObjectContext e Banco de Dados.

O que o blog anuncia? Um novo tipo de objeto de transferência denominado “self-tracking entities”. Ele visa a simplicidade por dois caminhos: resolve o problema do tracking e não deixa a complexidade se espalhar devido às várias projeções comum em DTOs.

Queria pedir sua atenção em duas questões neste blog:

A) Notem como eles usam exemplos de uso destas entidades para testar o conceito. Se a programação for simples, é porque foi criada uma API/classe/framework simples (ver blog passado);

b) Notem também que estão abrindo mais uma opção de tipo de objeto de transferência no leque entre RAD e LCMD (ver blog).

  1. DTO’s são complexos, mas minimizam transferência de dados e protegem dados de serem modificados fora de contexto (a opção mais LCMD);
  2. A passagem de Entidades Conceituais (como acontece hoje no Entity Framework) simplifica o número de classes, mas não minimiza a transferência de dados, não protege dados de mudanças fora de contexto (como a atualização indevida de um atributo que não deveria ser exposto em um contexto de diálogo com o usuário), nem facilita a atualização do ObjectContext e Banco de Dados (intemediário entre LCMD e RAD);
  3. Self-tracking entities simplifica o número de classes e a programação para a atualização do Object Context e Banco de Dados. POrtanto, um mix de Entidade Conceitual com tracking (a opção mais RAD);

O que eu gostaria? DTOs + tracking!

Bom saber que posso mandar minha opinião para lá.

Abraços

Ergonomia no Design e Arquitetura de Software

Michi Henning escreveu um artigo na ACM Communications de Maio sobre um assunto recorrente neste blog aqui: a importância de levar em conta o usuário na heurística para o bom desenho de uma API.

As principais sugestões de boas práticas para o design de API´s dadas no artigo são:

  • Uma API deve prover funcionalidades suficientes para que o chamador possa realizar suas tarefas;
  • Uma API deve ser mínima, sem impor inconvenientes indevidos ao chamador;
  • APIs não podem ser concebidas sem uma compreensão do contexto de uso;
  • APIs de propósito geral devem ser “ policy-free”; APIs de propósito especial devem ser “ policy-rich”; (aqui entendendo-se política como restrições de parâmetros, da ordem de chamadas, valores defaults, etc.)
  • A API deve ser projetada pela perspectiva do chamador;
  • Boas APIs não passam sua responsabilidade para o usuário;
  • APIs devem ser documentadas antes de implementadas;
  • Boas APIs devem ser ergonômicas;

Vale a leitura.

Três comentários (meus):

  • Estas regras devem ser levadas em consideração também quando no design de classes, frameworks e interfaces com o usuário;
  • Creio que todas estas regras derivam de uma inicial: “A API deve ser projetada pela perspectiva do chamador “. As demais são decorrentes.
  • Uma impressão minha: arquitetos e designers costumam pensar em si mesmos como os usuários de uma API. Eis o grande erro;

Abraços

Frameworks, treinamento e qualidade

Estivemos a pouco visitando um cliente que pretende desenvolver/utilizar um framework de programação visando um maior controle e desempenho dos aplicativos que irão rodar na empresa. Hoje em dia eles não têm uma padronização na programação dos softwares da casa e, pior, estes não são instrumentados. Esta falta de instrumentação, por sua vez, é responsável por certo caos no dia a dia da operação, pois fica difícil: saber que parte do aplicativo está causando problemas; fazer um capacity planning; etc.

Conversando sobre as expectativas reais que eles deveriam esperar com o uso de um framework, alertamos:

  1. Um framework não garante desempenho. A chance de uma query causar scan table ou um lock, ou de um programador causar um loop infinito ou um memory leak, ou etc., é independente do uso ou não de um framework. No entanto, um framework pode ajudar a prover informações em tempo de compilação (ex.: forçando a tipagem forte) ou execução (ex.: incluindo log e instrumentação) para que seja mais simples achar e corrigir erros;
  2. Um framework não é barato. Ele exige um treinamento ostensivo para arquitetos e programadores, pois ele induz a uma forma de desenhar e programar um aplicativo. No entanto, quando a cultura está estabelecida, é normal conseguir melhor qualidade e produtividade devido ao reuso e alto grau de repetição nas tarefas de programação;
  3. Um framework por si só não garante uma programação correta. É fácil errar uma fórmula, é muito simples escrever uma query que traz milhões de linhas, é simples armazená-las numa variável de sessão, é mais simples ainda fazer um binding destas milhões de linhas em um grid. Porém, com boas práticas de revisão de design e de programação é simples visualizar erros como estes.

Portanto, aviso então aos navegantes: frameworks devem ser acompanhados por treinamento, arquitetura e processos que garantam a qualidade, produtividade e desempenho. Sozinho, nenhum destes vem de graça.

Este caso me fez recordar também de um outro cliente que produz um software altamente dependente do bom uso do banco de dados e que me pediu ajuda para melhorar a qualidade do produto. Como ele não tinha nenhum especialista em banco de dados e vendo que boa parte dos problemas advinha disto (sim – ele tinha muitos processos), recomendei a ele a contratação ou o investimento na formação de especialistas na empresa. Neste instante, para a minha surpresa, obtive uma resposta veemente: - não quero ficar refém de um profissional caro como este!

Bem, pelo que me consta, até hoje o produto tem problemas de qualidade e desempenho!

O que há de comum nestes dois casos? Creio que até hoje ainda não há solução de software/hardware que garanta qualidade e desempenho de um aplicativo sem um investimento mínimo no lado do recurso humano. Treinamento, um mínimo de processos e ferramentas adequadas faz a diferença entre o sucesso ou fracasso no uso de uma tecnologia.

Estou errado?

Low Cost Maintenance Development - LCMD

Sempre quis criar meu próprio acrônimo, mas, infelizmente nunca tive a necessidade ou oportunidade. Creio que encontrei uma oportunidade: o LCMD. Vejamos...

Outro dia, estávamos discutindo Waldemir, Rogério, Condé, Markus e eu sobre como ajudar aos arquitetos a escolherem entre MVC e outras tecnologias de interface oferecidas pela Microsoft. Nesta ocasião propus a eles diferenciarmos as tecnologias sobre alguns aspectos como: a capacidade de apresentação, o tipo de navegação suportado pelas ferramentas, e, por fim, o ferramental disponível para este desenvolvimento.

  • Capacidade de apresentação: É simples... WPF é mais capaz que Silverlight por poder ter acesso a toda API gráfica. Silverlight é mais que ASP.Net com Ajax( ou não), porque traz maior capacidade gráfica e de interação e assim por diante.
  • Ferramental : Tenta discernir questões como: é fácil fazer um binding? O editor é simples e poderoso como um Expression Blend? É fácil depurar? A instalação é necessária ou simples? etc.
  • Tipo de Navegação: aqui era a minha dica para a introdução do MVC. Imaginava algo como uso de hyperlinks, binding, code behind ou o SoC (separation of concerns) como o MVC propõe.

Perfeita a divisão? Claro que não. É sempre nossa escolha definir as fronteiras, e minha intenção aqui era mostrar que temos um espectro de tecnologias que percorrem 1) da apresentação rica à apresentação padrão (HTML web ou Cliente Windows) e 2) da engenharia simples ou RAD (Rapid Application Development) à engenharia complexa.

Oops... Eis o problema e a oportunidade: engenharia complexa é um péssimo nome. Quando usamos MVC ou MVP ou outro padrão qualquer, buscamos várias capacidades, mas talvez a mais fundamental seja a Facilidade de Manutenção (manutenabilidade). Não procuramos a complexidade – é a existência de objetivos maiores, funcionais ou arquitetônicos, que nos leva à ela.

Daí o meu mais novo acrônimo: para diferenciar de Rapid Application Development precisamos do

                                                LCMD – Low Cost Maintenance Development

Definição: uma arquitetura, desenho e programação voltada para o baixo custo de manutenção do software.

Por que precisamos de um LDMC? Porque existem dados que correlacionam complexidade de um software com o custo da sua manutenção (e operação). Existem casos em que a manutenção e operação chegam a custar cerca de 75% do custo total do software em todo seu tempo de vida. Estes são normalmente softwares complexos e de missão crítica. A manutenção é alta porque a dinâmica do mercado exige um alto grau de mudanças funcionais sobre cargas e tecnologias que evoluem no tempo (de cliente/servidor para intranet, inclusão de serviços, etc.).

Se diferenciarmos assim, poderemos dizer que quem usa o MVC deve ganhar em manutenção ao compararmos com quem usa um form ASP.Net?

Resposta: Depende. O ASP.Net tem alta produtividade, tem muitos componentes prontos no mercado e pode ser excelente para projetos pequenos ou médios. O ASP.Net MVC, por sua vez, é menos produtivo, tem poucos componentes prontos, mas tem melhor manutenabilidade, além de permitir associar uma uri com o conteúdo dinâmico da página, tornando-a “searchable”.

E então, ...vocês compram o LCMD? (procurei um similar e não achei – se alguém souber, por favor, me avisa?)

 

PS.: Duas dicas finais:

  1. Saiu o Visual Studio Team Test Quick Reference Guide: para quem usa o Visual Studio e trabalha com testes, é uma excelente ajuda;
  2. O MSDN do Brasil lançou um DevCenter do Azure e junto uma série de vídeos sobre o Azure na página do Azure Academy. Boa diversão!
More Posts Next page »
 
Page view tracker