Archive for the ‘Desenvolvimento de Software’ Category

Scrum no Visual Studio

Monday, April 25th, 2011

As metodologias de desenvolvimento “ágeis” traçam as suas origens ao “Manifesto Ágil” de 2001. Estas, são frutos da frustração com as técnicas de desenvolvimento tradicionais, principalmente o chamado “waterfall”. As metodologias tradicionais são usualmente associadas a atrasos de entrega, excesso de custos, frustração dos usuários com o produto final e também com o ritmo de trabalho maluco imposto aos desenvolvedores, especialmente próximo ao prazo final de entrega.
O “waterfall” define fases precisas e seqüenciais de “levantamento”, “projeto”, “construção”, “integração”, “testes”, “implantação” e “manutenção”. É uma metodologia usada com sucesso em outros ramos da engenharia, notoriamente na construção civil e manufatura, o que dá a ela certa credibilidade e facilidade de criar paralelos e metáforas, tanto para pessoal técnico como não técnico. O “waterfall” tem também outra grande vantagem: é muito fácil de ensinar, pois as etapas são precisamente definidas, assim como suas interfaces e que tipo de informação são passadas de uma fase para outra. Por estas razões, o “waterfall” atingiu altos níveis de popularidade, apesar de seus problemas.

No “waterfall”, se uma fase deu errado, é sempre possível “apontar um culpado” em alguma fase anterior e resolver qualquer dilema. Em geral, a fase padrão para levar a culpa é a primeira, o levantamento. Por exemplo: o usuário não disse bem o que queria ou o analista que fez o levantamento não anotou direito. Ou seja, é “só fazer o levantamento direito que tudo dará certo na próxima vez”. Ou algo parecido.
Se o waterfall é tão estudado e tão preciso, por que as coisas dão tão errado? Cada um tem uma opinião ligeiramente diferente, mas as minhas razões preferidas são as seguintes:

• É impossível capturar todas as nuances no levantamento. O usuário sempre se esquece de coisas – sem querer ou até mesmo de propósito. O analista não só não é um ser onisciente e telepata como na verdade está mais interessado em produzir um monte de documentos bonitos mesmo que sem utilidade real, já que são os outros que vão construir o software. Mesmo escalonar as prioridades, ou seja dizer o que é mais ou menos importante, é uma atividade que costuma ser ofuscada por preconceitos ou modas;

• Todo software tem alguma complexidade que só pode ser definida na implementação. Quase sempre estamos fazendo algo mais complexo do que antes e usando novas tecnologias. Isto traz inerentemente uma boa dose de risco, algo que devemos gerenciar ao invés de fingir que não existe. Por mais levantamento e projeto que façamos, eles nunca serão suficientes;

• Os negócios mudam. Eu um mundo de negócios cada vez mais dinâmico, é comum durante e execução de um projeto de software que as prioridades mudem e que as pessoas troquem de emprego. Mesmo que o levantamento seja executado 100% à perfeição – algo que considero simplesmente impossível – é muito provável que no momento da implantação aquele software perfeitamente desenvolvido não adéqüe-se mais às necessidades de negócio naquele momento.

As metodologias ágeis reconhecem que os problemas acima existem e procuram abraçá-los, de forma a conviver com eles. Existem vários métodos “ágeis”, como por exemplo “Extreme Programming (XP)”, “MSF/Agile” e “Scrum”.

Pessoalmente eu estou cada dia mais interessado no Scrum, também apoiado por vários criadores do “Agile Manifest”. Ao contrário de algumas técnicas ágeis, especialmente o XP, o Scrum inclui bastante planejamento, disciplina, responsabilidade dos integrantes da equipe e gerenciamento de riscos, em um pacote que faz sentido.

É perfeitamente possível trabalhar com Scrum sem nenhuma ferramenta de software, mas obviamente as coisas ficam mais fáceis se você tiver uma ferramenta para registrar as tarefas a fazer, as feitas e prioridades. Recentemente a Microsoft anunciou apoio ao Scrum e, com o apoio do Ken Schwaber (www.scrum.org), um dos “profetas” do Scrum, criou um template “Scrum” para o Visual Studio 2010. Isto, certamente dará um impulso extra a esta técnica na plataforma Microsoft.

O Scrum não é uma “bala de prata”, pois exige mudanças culturais, tanto em quem contrata como em quem desenvolve. Ele exige que todos trabalhem em comum de forma a entregar alguma coisa que tenha valor ao negócio, substituindo o relacionamento antagonista e burocratizado tradicional.

Ambiente de desenvolvimento

Monday, April 25th, 2011

Todos certamente concordarão que os desenvolvedores devem ter um bom ambiente de desenvolvimento. Note que por “ambiente” eu estou falando do hardware e software que eles têm à sua disposição e não considerações de ergonometria – embora isso também seja importante. Já vi desenvolvedores empilhados em condições que os operadores de telemarketing chamariam fiscais do ministério do trabalho, apesar do salário dos desenvolvedores ser bem maior.
Na minha experiência, costumo ver os desenvolvedores usando computadores capazes e com boas ferramentas do tipo “ambiente integrado” como Visual Studio ou Eclipse. O problema é que o “ambiente de desenvolvimento” não acaba por aí e as coisas ficam mais complicadas.
Em primeiro lugar, considero essencial ter algum software de “controle de versão”. Existem várias opções, desde o velho Microsoft Visual Source Safe, que apesar das limitações ainda é bem melhor que nada. Na plataforma Microsoft a versão mais nova do software de controle de versão é um componente do “Visual Studio Team System”. Além de outros produtos comerciais, existem também opções gratuitas “Open Source” como o CVS ou o Subversion. O assunto “controle de versão” costuma hoje ser tratado como um tópico do “gerenciamento de configuração”, mas não se sinta intimidado a estudar o assunto profundamente, pois o software de controle de versão é o componente básico e o mais importante de todos. Ou seja, mesmo que você não entenda muito de “gerencia de configuração”, instale um controlador de versão.
Outro aspecto muito importante é desenvolver e testar em um ambiente o mais parecido possível com o ambiente de produção, desde que isso não atrapalhe o trabalho. Desenvolver em um ambiente próximo ao de produção evita muitos problemas no momento das primeiras implantações.
Alguns problemas comuns são os seguintes:
• Diferenças de idioma/cultura, por exemplo, desenvolver com Windows em Português e rodar sob Windows em inglês. Rodar sob sistema operacional inglês é típico em servidores Web, pois as atualizações de segurança saem antes em inglês do que em outros idiomas e, portanto um servidor Web em inglês é provavelmente mais seguro. Outro cenário é a hospedagem de aplicativos Web no exterior por questões de custo;
• Desenvolver com credenciais de administrador e rodar com credenciais de usuário limitado. É difícil rodar o ambiente de desenvolvimento em si sem ser administrador, pois o suporte à depuração seria perdido. Mas isto causa desde problemas sutis como falta de permissão de acesso à diretórios até impossibilidade de acesso à banco de dados. Na medida do possível os outros componentes como o servidor Web e o servidor de banco de dados devem ser rodados com contas mais limitadas, como “NETWORKSERVICE” por exemplo. Esta também é uma razão para não usar o servidor de desenvolvimento que vem com o Visual Studio e sim o Internet Information Server completo;
• Usar versões diferentes de servidores, como por exemplo de bancos de dados ou Web. Por exemplo, o IIS do Windows Server 2008 R2 é o 7.5, enquanto a versão usada em uma estação Windows XP seria a 5.1. Mesmo que elas sejam “supostamente idênticas”, existem pequenos detalhes diferentes. Uma versão mais nova pode ter quebrado a compatibilidade com a versão anterior de propósito ou mesmo acidentalmente;
• Usar massas de dados em desenvolvimento diferentes das de produção, o que costuma trazer problemas de desempenho quando encontramos massas de dados grandes em produção.
Outro ambiente importante é o de homologação, que idealmente deve ser muito idêntico ao de produção, tanto sob o aspecto de que software está instalado como também de hardware, para ser possível fazer testes de carga. É muito comum os equipamentos de homologação acabarem sendo usados para outras tarefas secundárias como, por exemplo, back-up, visto que são máquinas boas que “não fazem nada o dia inteiro”. Esta é uma tentação que se não puder ser resistida, deve ao menos ser mitigada, estabelecendo procedimentos como horários reservados para a homologação.

A Batalha pelo Telefone

Monday, April 25th, 2011

O “mission statement” ou “declaração de missão” da Microsoft em seus primeiros anos de vida era “um computador em cada escrivaninha”. Por mais incrível que isso parecesse no início dos anos oitenta, a verdade é que essa “missão” foi essencialmente realizada no início do século XXI. O número de usuários de computadores nos países desenvolvidos cresceu pouco nos últimos dez anos; essencialmente quem tinha que estar usando computador já está. Evidentemente um mercado saturado é um mercado altamente competitivo, de preços e margens de lucro baixas.

Por esta razão os países em desenvolvimento e, especialmente os BRIC (Brasil , Rússia, Índia e China), foram alvos de muita atenção nos últimos anos por parte das empresas de informática: são países grandes e nos quais havia ainda o potencial de crescimento comparável aos “anos de ouro” dos países desenvolvidos. Os BRIC ainda têm algum potencial inexplorado, mas são mercados com algumas complicações, como pouco respeito à propriedade intelectual, problemas de infra-estrutura ou até mesmo um “capitalismo oligárquico” difícil para estrangeiros navegar. Será que ainda não existe algum grande mercado de informática inexplorado?

A constante miniaturização dos componentes de computador aliada a diminuição do consumo de eletricidade permite agora fazer um computador bastante capaz, equivalente a um desktop de dez anos atrás, mas que cabe no bolso e funcionam vários dias com uma única carga de bateria. É também simples e barato colocar um telefone celular com acesso à internet no mesmo aparelho.

Depois de sofrer por anos com poucas vendas de seus “smartphones” – telefones com computadores acoplados, tanto a Microsoft como a Nokia viram seu mercado ser roubado pela Apple, exatamente quando o hardware tina tornado-se suficientemente barato e poderoso. Não só a Apple redefiniu o que deveria ser um computador portátil com telefone, ela fez isso com margens de lucro mais associadas à época de ouro dos próprios computadores. Estima-se que a Apple nos EUA recebe da AT&T, a operadora exclusiva, algo como US$300 por ano por cada iPhone vendido.
Depois de salivar ao ver estes números, os concorrentes se deram conta que a penetração do iPhone no universo dos “smartphones” ainda é relativamente pequena, algo na casa dos 15%. Se levarmos em conta as vendas totais de telefones celulares, as vendas do iPhone correspondem a menos de 3% das vendas totais de aparelhos celulares. Isso é que é um grande mercado inexplorado!

Por estas razões, a Google lançou rapidamente seu “smartphone” o Android, produzido tanto por terceiros como por ela mesma.

Após vários altos e baixos com sua plataforma “Windows Mobile”, a Microsoft finalmente renovou completamente sua oferta de Smartphone com o seu “Windows Phone 7”. Desta vez ela resolveu deter mais controle sobre o hardware, impedindo o aparecimento de telefones de mau desempenho e também padronizando a interface com o usuário. Ele é claramente inspirado no iPhone, mas promete brilhar onde a Microsoft é forte: integração com seus outros softwares, como Windows e Office e disponibilidade de boas ferramentas de desenvolvimento.

O kit de desenvolvimento de software do iPhone não fazia parte dos planos originais da Apple e foi feito às pressas, utilizando uma tecnologia de desenvolvimento relativamente obsoleta e também exige que o desenvolvedor utilize um computador Mac, mais caro e raro que os Windows.

Acredito que a Microsoft trará para o seu telefone uma plataforma de desenvolvimento muito mais moderna, poderosa e fácil de usar. Isso deve atrair imediatamente para a plataforma os desenvolvedores tradicionais de aplicativos e contribuir bastante para o sucesso do “Windows Phone 7”.

Os dilemas da nuvem

Monday, April 25th, 2011

Em artigos anteriores nesta coluna eu defendi a idéia de que: 1)existem enormes economias de escala em hospedagem de sites e 2)a infra-estrutura atual, por ter acumulado anos e anos de modificações, é muito mais complexa do que deveria ser. Estes fatores apontam para grandes oportunidades em uma nova plataforma, feita desde o início visando fácil hospedagem e escalabilidade. Idealmente, os aplicativos nesta nova plataforma não deveriam sequer se preocupar com servidores físicos; o ambiente todo seria “virtual”. O Microsoft Azure, conforme inicialmente anunciado seria uma plataforma assim. Ele é baseado no ASP.NET, mas com APIs novas, de forma a viabilizar este “ambiente virtual”. Por exemplo, existe um novo tipo de aplicativo chamado “Worker Role” que é uma espécie de serviço, mas sem as suas complexidades de instalação e administração.
A Microsoft anunciou em novembro de 2009 os detalhes da versão final do Azure, disponível em ambiente de produção a partir do segundo trimestre de 2010. A versão final inclui além do “ambiente virtual” a possibilidade de executar praticamente qualquer aplicativo Windows em “máquinas virtuais”, incluindo aplicativos não desenvolvidos especificamente para o Azure. Evidentemente, neste caso temos que nos preocupar muito mais com o ambiente de execução, negando muitas das vantagens do “ambiente virtual”.

Eu confesso que fiquei um pouco decepcionado, visto que este tipo de oferta não aproveita o ponto forte da Microsoft, que é exatamente a possibilidade de estender a plataforma de desenvolvimento e execução. Ela é semelhante a outras ofertas de hospedagem em máquinas virtuais como a Amazon ou mesmo de provedores tradicionais. O ambiente virtual continua lá, mas não é enfatizado – pelo menos nesta versão.

Por que esta mudança de paradigma? A resposta, em uma palavra é “inércia”. Em primeiro lugar, pouca gente está interessada em modificar aplicativos que já funcionam. Em segundo lugar, o pessoal já está meio acostumado – para o bem e para o mal – com máquinas virtuais. A oferta do “ambiente virtual” é pouco familiar e talvez até mesmo desconfortável.

Além disso, existe nas empresas uma divisão forte em departamento de desenvolvimento e departamento de produção (ou infra-estrutura). Eles usualmente têm orçamentos separados e não gostam de conversar muito um com o outro. A quem o Azure se destina então? A médio e longo prazo, os desenvolvedores teriam que desenvolver aplicativos para ele. Mas visto que não existe ainda nenhum aplicativo desenvolvido, quem poderia comprar o Azure agora? Evidentemente o pessoal de “produção”, que está acostumado com a idéia de máquinas virtuais, mas é absolutamente imune a conversas de “plataformas virtuais”, para as quais eles não têm a menor necessidade, visto a falta de aplicativos para rodar.

A realidade é então que a Microsoft teve que oferecer um produto para o qual existe um mercado agora – as máquinas virtuais, mesmo que isso não a interesse tanto em longo prazo.

Isto significa que nós desenvolvedores devemos esquecer o Azure? Eu acho que não. O principal é que escrevamos os novos aplicativos de forma que eles possam ser facilmente adaptados no futuro par o Azure, mesmo que eles rodem de maneira convencional no presente. Por exemplo, devemos fatorar serviços de forma que o código de negócios esteja bem separado e possa ser colocado no futuro em um “Worker Role”. Ou separa o código de acesso a banco de dados. Na verdade, se implementarmos as boas práticas de desenvolvimento, nossos aplicativos estarão substancialmente bem preparados para uma eventual migração futura para o Azure.

Descompilando programas

Tuesday, July 13th, 2010

Volta e meia me perguntam sobre a possibilidade de decompilar programas .NET. Por “descompilar” entendo “produzir a partir de um executável um programa fonte em linguagem de alto-nível que, quando compilado, tem a mesma funcionalidade que o executável original”. É importante observar que qualquer programa, em qualquer linguagem de alto nível é “descompilável” pelo menos em linguagem Assembly ou similar, até porque a própria CPU do computador tem que saber executá-lo.

É então possível descompilar programas .NET, de maneira semelhante ao que era possível com descompiladores para o Clipper como “Unclip” ou “Valkyre”, que tanto transtornos causaram nos anos noventa? A resposta curta é sim. Mas continue lendo.

Uma das grandes vantagens dos “assemblies”.NET  (.EXE ou .DLL) é que eles rodam em um “ambiente gerenciado”, onde os programas não podem causar danos aos outros programas rodando no computador do usuário. Este ambiente gerenciado depende basicamente do seguinte para funcionar:

  • Código executável definido em uma “linguagem intermediária – IL” ao invés da linguagem do processador. Este código pode ser “verificado” em tempo de carga e execução pelo compilador “JIT”, de forma que o mesmo não possa efetuar operações não permitidas pelas configurações de segurança, como acessar um endereço de memória não permitido;
  • Informação de tipo em tempo de execução (“metadata”) de forma a validar os “casts”, chamadas de funções entre diferentes DLLs e manter a integridade do sistema de tipos;
  • A primeira compilação (VB ou C# para IL) não deve otimizar o código, pois as otimizações podem impedir que o compilador JIT verifique o código. A presença de otimizações tem o efeito colateral de atrapalhar os descompiladores.

Evidentemente, os fatores acima facilitam a descompilação dos programas. Note que estes recursos têm como efeito principal o aumento da segurança e integridade tanto para os desenvolvedores como para os usuários finais, o que é considerado hoje em dia uma grande vantagem. Por exemplo, a maioria dos erros no gerenciamento manual de memória dos ambientes tradicionais é eliminada. A robustez e a vulnerabilidade à descompilação também são características do outro grande ambiente gerenciado utilizado atualmente, o Java.

Dito isto, como impedir que um usuário do seu software possa descompilá-los? Existem várias maneiras:

  • Impedir o acesso aos executáveis. Um aplicativo web, por exemplo, roda em um servidor e os usuários não têm acesso aos executáveis. Mesmo um aplicativo desktop pode ter parte da sua funcionalidade em WebServices, que também rodam em um servidor.
  • Escrever parte do programa como código não gerenciado, quer como DLL, objeto COM ou mesmo em código não-gerenciado dentro de programas C++ .NET. Evidentemente isto elimina as vantagens do código gerenciado pelo menos em parte do seu programa.
  • Escrever parte do código em Assembler IL usando recursos que dificultam a descompilação, como o uso de identificadores não suportados pelas linguagens C# ou VB.NET, por exemplo, chamando uma função com o mesmo nome de uma palavra reservada de linguagem de alto-nível.
  • Usar um “ofuscator” para alterar o código de forma a impedir a descompilação.

Os ofuscadores (pesquise por “.NET obfuscators” na Web) são a maneira mais fácil e direta de proteger o seu código, pelo menos a níveis comparáveis aos de outras linguagens de alto nível como C/C++ ou Delphi. Basicamente eles processam os assemblies (.EXE/.DLL) e geram outros assemblies que tem a mesma funcionalidade, mas que são mais difíceis de descompilar.

Como isso é feito? Um dos truques é renomear os símbolos (funções, propridedades, campos etc) “private” de seus executáveis. Quando um programa .NET referencia um símbolo dentro do mesmo assembly, ele não o faz por nome e sim através de um índice em uma tabela. O nome é então supérfluo e pode ser trocado para identificadores repetidos ou mesmo palavras reservadas da linguagem, tornando o fonte descompilado impossível de ser recompilado. Alguns produtos possuem recursos bastante sofisticados e o resultado é uma proteção até maior que um programa Delphi ou C++.

Caso você deseje proteger seus programas, os ofuscadores são uma alternativa bastante prática.

Culto à Carga no desenvolvimento de software

Thursday, June 24th, 2010

>>>> Esta é uma coluna publicada em 2004 na MSDN Magazine Brasil, mas bastante comentada.

Durante a Segunda Guerra Mundial os americanos ocuparam várias ilhas no Pacífico Sul em suporte às operações contra o Japão. Eles construíram nestas ilhas pistas de pouso e armazéns para facilitar a movimentação de carga por via aérea. De forma a não serem massacrados e devorados pela população local – que estava em ampla maioria – os americanos distribuíam parte da carga que circulava pelas bases à população local. Os nativos adoraram ganhar coisas como comida enlatada e tendas. Rapidamente eles se acostumaram com as comodidades da “vida moderna”.

Terminada a guerra os americanos foram embora e abandonaram as instalações, até porque os aviões tinham autonomia maior e as pistas não eram mais necessárias. Os nativos, acostumados com a carga ficaram desolados. Partiram então para imitar o que os militares americanos costumavam fazer e que, na percepção deles, era a causa da vinda dos aviões. Construíram novas pistas de pouso, torres de controle, fones de ouvido de madeira “operados” por nativos e tudo mais de forma que os aviões “pudessem” voltar à pousar. Eles criaram um “Culto à Carga” (“cargo cult”). Evidentemente, apesar do grande esforço empreendido pelos nativos, os aviões não retornaram.

Note que construir as pistas de pouso era a forma encontrada para suprir a razão original de movimentar carga. Os nativos confundiram a forma com a necessidade original e ficavam cultuando a forma sem se importar com a razão.

Nós, desenvolvedores, nos achamos mais espertos que os nativos da Micronésia, mas o “Culto à Carga” é muito comum no desenvolvimento de software. Às vezes gasta-se um grande esforço para repetir um ritual cuja razão original de existir há muito se foi. O meu exemplo preferido é a chamada “notação húngara” para dar nomes às variáveis.

Na década de oitenta, Chales Symoniy, então um arquiteto chefe da Microsoft, defendeu uma convenção na qual os nomes das variáveis na linguagem C deveriam ter o tipo como prefixo. Por exemplo, uma variável do tipo usingned int teria o prefixo uint. Essa notação resolvia um sério problema da linguagem C antiga (padrão “Kernighan & Ritchie”) usada na época, que era a falta de tipagem forte. Podia-se atribuir um “char * para um int e o compilador não reclamava! Com a notação, tinha-se alguma tipagem no “olhômetro”: era só ver se os prefixos nas atribuições eram iguais. Como os nomes das variáveis ficavam muitas vezes impronunciáveis e dada a origem Húngara do Sr. Symoniy, seus colegas por gozação deram o apelido de “notação húngara” e o apelido pegou. Ela foi bastante popularizada pela API do Windows 3.0 e muito utilizada pela Microsoft e pelos programadores em geral.

A notação húngara tinha lá seus problemas. Ela impedia que se abstraíssem os tipos com o uso do comando typedef. Se você desejasse mudar o tipo de uma variável (de int para float, por exemplo), deveria alterar não só a declaração, mas também todos os lugares que usassem a variável, já que o prefixo tinha mudado de “i” para “f”.
Com o passar dos anos, a utilidade da notação húngara foi diminuindo. O padrão C ANSI de 1990 que substituiu o “Kernighan & Ritchie” era fortemente tipado e não permitia coisas como atribuir um char * a um int por acidente. A API do Windows 3.10 de 1991 abandonou o húngaro tradicional, pois já previa futuras extensões de 32 bits e a codificar tipos de 16 bits nos programas traria problemas no futuro. Acabou a guerra. Os aviões voltaram para casa. É o fim da notação húngara então?

Nem tanto. Ainda hoje, em 2004, eu vejo nativos, quer dizer, programadores de linguagem fortemente tipadas como o C# usando notação húngara, mais de 10 anos depois de qualquer razão lógica para seu uso ter evaporado. Na verdade, nas minhas consultorias eu freqüentemente encontro não só a notação húngara como normas e convenções sem o menor sentido. A única explicação que eu recebo sobre sua existência é uma variação do “aqui nós sempre fizemos assim”. Fico então imaginando algum analista bem intencionado de farda verde e com um capacete de tenente do exército americano elaborando um padrão que fazia sentido para resolver um problema que com o tempo desapareceu, mas que continua sendo cultuado pelos nativos em trajes sumários, colares de conchas e ossos amarrados aos cabelos sentados à frente dos computadores.
Conclamo a todos os desenvolvedores que são vítimas de padrões aparentemente sem sentido que questionem a razão da existência desses padrões. Caso as razões não sejam aparentes, adote um novo padrão usando o bom senso. No caso dos nomes de variáveis, acho um bom padrão usar uma expressão baseada em um ou mais substantivos seguido ou não de um adjetivo que expresse o que a variável é. Por exemplo, “TotalPedido”, “NomeUsuario” e “QtdTelasAbertas” e evitar nomes que não tem significado como “temp1”, “var2” e “xxx0”, para não dizer do “húngaro”.

Ao contrário dos habitantes da Micronésia, não temos a desculpa de sermos nativos ignorantes para adorarmos algum “Culto à Carga”.

Mauro Sant’Anna (mas_mauro@hotmail.com) não conhece a Micronésia nem nunca gostou da notação húngara, até porque mesmo antes do padrão ANSI a maioria dos compiladores C já tinha tipagem forte. Para saber mais sobre Culto à Carga leia em http://en.wikipedia.org/wiki/Cargo_cult. Charles Simonyi (http://en.wikipedia.org/wiki/Charles_Simonyi) tornou-se o primeiro turista espacial a repetir a viajem.

Windows Mobile (não Phone 7) ainda está vivo

Saturday, June 19th, 2010

Quando a Microsoft anunciou sua nova plataforma móvel, o Phone 7, algumas pessoas ficaram preocupadas porque ele não seria compatível com a plataforma atual (WinMo 6. 5). O problema é que existem alguns dispositivos e aplicativos desenvolvidos para esta plataforma, especialmente usando dispositivos da Symbol (agora Motorola) e seus concorrentes.

Em um recente anúncio (http://bit.ly/aP8w4f), a Microsoft declarou seu apoio continuado a plataforma atual e até mesmo uma nova versão para o próximo ano.

Então, me parece que a Microsoft terá duas linhas de sistemas operacionais para telefone/celular:

  • Phone 7: Mais orientada para o consumidor, um pouco fechado (como o iPhone)
  • Windows Embedded Compact 7: uma nova versão da plataforma atual, aberta e compatível

Vejo isso como boa notícia. Sempre gostei de meus dispositivos de CE (estou no meu terceiro telefone WinMo). Eu nunca gostei da abordagem “fechada” da Apple; essa é a razão que eu nunca tive um iPhone. Apesar de perder mercado e um pouco órfãos, ainda existem alguns bons produtos baseados WinMo, como o Samsung Omnia II.

Os dilemas da nuvem

Thursday, June 17th, 2010

>>>>>> Coluna publicada na .NET Magazine.

Em artigos anteriores nesta coluna eu defendi a idéia de que: 1)existem enormes economias de escala em hospedagem de sites e 2)a infra-estrutura atual, por ter acumulado anos e anos de modificações, é muito mais complexa do que deveria ser. Estes fatores apontam para grandes oportunidades em uma nova plataforma, feita desde o início visando fácil hospedagem e escalabilidade. Idealmente, os aplicativos nesta nova plataforma não deveriam sequer se preocupar com servidores físicos; o ambiente todo seria “virtual”. O Microsoft Azure, conforme inicialmente anunciado seria uma plataforma assim. Ele é baseado no ASP.NET, mas com APIs novas, de forma a viabilizar este “ambiente virtual”. Por exemplo, existe um novo tipo de aplicativo chamado “Worker Role” que é uma espécie de serviço, mas sem as suas complexidades de instalação e administração.

A Microsoft anunciou em novembro de 2009 os detalhes da versão final do Azure, disponível em ambiente de produção a partir do segundo trimestre de 2010. A versão final inclui além do “ambiente virtual” a possibilidade de executar praticamente qualquer aplicativo Windows em “máquinas virtuais”, incluindo aplicativos não desenvolvidos especificamente para o Azure. Evidentemente, neste caso temos que nos preocupar muito mais com o ambiente de execução, negando muitas das vantagens do “ambiente virtual”.

Eu confesso que fiquei um pouco decepcionado, visto que este tipo de oferta não aproveita o ponto forte da Microsoft, que é exatamente a possibilidade de estender a plataforma de desenvolvimento e execução. Ela é semelhante a outras ofertas de hospedagem em máquinas virtuais como a Amazon ou mesmo de provedores tradicionais. O ambiente virtual continua lá, mas não é enfatizado – pelo menos nesta versão.

Por que esta mudança de paradigma? A resposta, em uma palavra é “inércia”. Em primeiro lugar, pouca gente está interessada em modificar aplicativos que já funcionam. Em segundo lugar, o pessoal já está meio acostumado – para o bem e para o mal – com máquinas virtuais. A oferta do “ambiente virtual” é pouco familiar e talvez até mesmo desconfortável.

Além disso, existe nas empresas uma divisão forte em departamento de desenvolvimento e departamento de produção (ou infra-estrutura). Eles usualmente têm orçamentos separados e não gostam de conversar muito um com o outro. A quem o Azure se destina então? A médio e longo prazo, os desenvolvedores teriam que desenvolver aplicativos para ele. Mas visto que não existe ainda nenhum aplicativo desenvolvido, quem poderia comprar o Azure agora? Evidentemente o pessoal de “produção”, que está acostumado com a idéia de máquinas virtuais, mas é absolutamente imune a conversas de “plataformas virtuais”, para as quais eles não têm a menor necessidade, visto a falta de aplicativos para rodar.

A realidade é então que a Microsoft teve que oferecer um produto para o qual existe um mercado agora – as máquinas virtuais, mesmo que isso não a interesse tanto em longo prazo.

Isto significa que nós desenvolvedores devemos esquecer o Azure? Eu acho que não. O principal é que escrevamos os novos aplicativos de forma que eles possam ser facilmente adaptados no futuro par o Azure, mesmo que eles rodem de maneira convencional no presente. Por exemplo, devemos fatorar serviços de forma que o código de negócios esteja bem separado e possa ser colocado no futuro em um “Worker Role”. Ou separa o código de acesso a banco de dados. Na verdade, se implementarmos as boas práticas de desenvolvimento, nossos aplicativos estarão substancialmente bem preparados para uma eventual migração futura para o Azure.