Minha experiência com o Windows Azure

by Cássio R Eskelsen 22. março 2009 16:45

Sei que esse é um YAWAP (yet another Windows Azure post) já que existem por aí bom artigos sobre o Azure, mas talvez possa trazer alguns elementos novos para quem, assim como eu, está começando a viver nas nuvens!

O Windows Azure

Para quem ainda não conhece, o Windows Azure é uma plataforma da Microsoft para rodar aplicações em esquema de Cloud Computing, ou seja, rodando em um farm de servidores. Obviamente não basta pegar qualquer aplicação é subí-la para o datacenter: ela precisa estar preparada para rodar na nuvem. No caso específico do Windows Azure, essas aplicações deverão ser feitas em .Net. Quem já tem aplicações muito bem estruturadas em termos de arquitetura não terá muito problema para rodar sua aplicação na nuvem, apenas terá um trabalho pesado na layer de persistência.

A aplicação que pretendo fazer

image Pretendo colocar nas nuvens uma aplicação que modelei a quase 10 anos atrás e da qual já existe uma versão rodando feita em Delphi e que é mantida pela empresa onde fui sócio. Tenho toda análise pronta, incluindo algoritmos (sim, milagre!), então não precisarei me preocupar com regras de negócio. Como na  época a OO ainda era algo novo para mim, talvez tenha que fazer alguns ajustes agora.

Essa aplicação calcula os custos de uma empresa de serviços utilizando a metodologia RKW. Essa metodologia também é conhecida como Método dos Centros de Custos, Método das Seções Homogêneas, Mapa de Localização de Custos ou ainda, Custeio Pleno. Essa metodologia foi criada na primeira metade do século 20 na Alemanha, por isso tem como nome as iniciais do conselho governamental alemão para assuntos econômicos (Reichskuratorium für Wirtschaftlichtkeit).

Saliento que esse post é focado na descrição da minha experiência com o Azure em uma aplicação LoB e não em detalhes da implementação da solução em si, já que necessitaria de vários posts para isso!

Esse post estou escrevendo enquanto desenvolvo a aplicação, então ainda não sei se tudo que pretendo funcionará no Azure.

Leia mais...

Tags: , ,

Arquitetura | .Net

Engenharia de Software Conference

by Cássio R Eskelsen 17. março 2009 23:06

banner_ESconference_220x105-35kbA DevMedia, editora das revistas Java Magazine, Engenharia de Software Magazine, SQL Magazine, .NET Magazine, WebMobile e Clubedelphi estará produzindo, nos dias 22 e 23 de Maio, em São Paulo, o evento “Engenharia de Software Conference”.

O Conteúdo do evento é exclusivamente voltado para gerentes. Serão três tracks simultâneos onde os melhores palestrantes do mercado discutirão os principais temas da Engenharia de Software atual. Acontecerão mais de 30 palestras que vão desde o projeto até os últimos testes de um software, passando pelos diversos conceitos de gerenciamento. A Keynote do evento será a brasileira Ana Regina Rocha, uma das responsáveis pela criação do MPS.BR, uma metodologia de gerenciamento desenvolvida especialmente para as empresas brasileiras.

Veja algumas das palestras:

Alexandre Magno - Atribuições do Product Owner na Gerência de Projetos com Scrum
Ana Regina Rocha - Processos de software com MPS.BR
Antonio Mendes da Silva Filho - Descubra como os Requisitos podem Impactar na Arquitertura de sua Aplicação
Arilo Cláudio Dias Neto - Elaborando Casos e Procedimentos de Teste na Prática -Partes 1 e 2
Carlos Eduardo Vazquez - Estimativas de Software - Fundamentos, Técnicas e Modelos... e o principal, integrando isso tudo!
Claudia Hazan - Palestra: Como melhorar a previsibilidade de Custo de Prazo de Projetos de Software e Como evitar problemas na gestão de contratos de software
Cidinha Gouveia - Palestra: Estruturas Organizacionais de Teste - Uma Experiência Prática Palestra: Boas Práticas de Testes
Dairton Bassi - Palestra: Planejamento Ágil de Projetos Palestra: XP na Prática
Fabio Kon - Desenvolvimento de Software de Qualidade com Métodos Ágeis e Software Livre
Fabiano Milani - Elaboração e Manutenção de um Product Backlog com Qualidade e Garantia de ROI (Return of Investment)
Fabio Câmara - SCRUM e VSTS, o melhor de dois mundos
Isabella Fonseca - Gerenciamento Ágil de Projetos com SCRUM - Partes 1 e 2
Juan Esteban Bernabó - Desmistificando Scrum & Agile: Better, Cheaper, Faster & Cooler Software Projects
Marcelo Costa - Uma Experiência na implantação de CMMI em sites distribuídos
Marcos Kalinowski - Palestra: Melhorando Produtos através de Revisões de Software e Melhorando Processos de Software através de Análise Causal de Defeitos
Mariano Angel Montoni - Palestra: MPS.BR - Implantando o nível G - Partes 1 e 2
Melissa Pontes - Palestra: Elaborando Casos e Procedimentos de Teste na Prática - Partes 1 e 2
Nikolai Dimitrii - Você precisa desenvolver uma metodologia de gerenciamento de projetos de software?
Paulo Pires - Desenvolvimento de sistemas com MDA: Conceitos e Estado da Arte
Rodrigo Spínola - Escrevendo Casos de Uso Efetivos
Sérgio Akio Tanaka - Metodologias Ágeis: Estágio Atual e Perspectivas Futuras

Veja maiores informações em http://www.devmedia.com.br/es_conference/index.html

Tags: ,

Arquitetura

Design Patterns - Parte 4 - Repository

by Cássio R Eskelsen 11. dezembro 2008 10:12

"Subindo" um pouco o nível da série de posts sobre design patterns, falarei hoje sobre o pattern "Repository".

Este pattern não é tão amplamente difundido, apesar de sua grande flexibilidade e poder de resolver nosso velho dilema de como isolar a persistência das demais camadas permitindo uma arquitetura plugável onde podemos utilizar múltiplos bancos de dados (na verdade, uma implementação concreta de repositório pode persistir dados em qualquer lugar, não necessariamente direto em um banco de dados.

Um repositório media o relacionamento entre o dominio e os dados. Imagine um repositório literalmente: é um lugar onde são guardadas coisas e coleções de coisas e onde efetuamos pesquisas dessas coisas.


Fonte: http://www.martinfowler.com/eaaCatalog/repository.html

Leia mais...

Tags: , , ,

Design Pattern | Arquitetura

Linq to Sql Context único por aplicação

by Cássio R Eskelsen 14. setembro 2008 14:04

Otávio P. Coelho escreveu recentemente um post sugerindo o uso de singletons para manter o contexto de um Entity Data Model.

Venho utilizando essa estratégia há um bom tempo já  para minhas aplicações que usam Linq to SQL e a partir do post do Otávio resolvi compartilhar um trecho de código que pode ser usado por todos.

Qual a vantagem de criar um singleton para isso? Bom, imagine que uma determinada rotina do seu código precise “atravessar”  por vários métodos de instâncias de várias classes e imagine que essa “travessia” precise estar coberta por uma transação. Você não pode então criar uma instância do seu data context em cada método e passar um context já criado e passar como parâmetro é uma solução muito “feia” além  de não permitir a separação das suas regras de negócio da camada de persistência.

Com um singleton, os métodos passam a “buscar” um data context já aberto, ou, se ainda não estiver criado, instancia um novo.

Usando os métodos CallContext e SetContext podemos manter o data context no contexto da aplicação, o que significa que em aplicações Windows Forms ele estará válido durante toda a execução do programa, ou no caso de aplicações WEB, durante o ciclo de vida de uma chamada Http Request.

Essa solução é transparente para aplicações WEB e Desktop, ou seja, se sua camada de negócios e/ou sua camada de persistência são usadas simultaneamente nas duas plataformas, a solução não precisa ser “ajustada”.

Exemplo abaixo, DataRepository é o nome do meu Data Context. Substitua pelo seu.

using System.Runtime.Remoting.Messaging;

namespace LINQToSQL
{
    public class Helper
    {
        #region Privates

        private static string _stringConexao = null;

        private const string DATACONTEXT_ITEMS_KEY = "DBHelperContextKey";

        private static DataRepository DataBaseContext
        {
            get
            {
                return (DataRepository)CallContext.GetData(DATACONTEXT_ITEMS_KEY);
            }
            set
            {
                CallContext.SetData(DATACONTEXT_ITEMS_KEY, value);
            }
        }

        #endregion

        #region Public and Protected Properties and Methods

        /* a string de conexão você pode manter de várias formas
         * talvez a mais prática seja recuperar diretamente via ConfigurationManager
         */
        public static string StringConexao
        {
            get
            {
                return _stringConexao;
            }
            set
            {
                if (_stringConexao != null && _stringConexao.Equals(value))
                    return;

                //Se já tem um DatabaseContext criado, elimina ele para
                //que na próxima chamada seja reaberto com a nova string
                //de conexao.
                if (DataBaseContext != null)
                {
                    CleanUp();
                }

                _stringConexao = value;
            }
        }

        public static DataRepository Db
        {
            get
            {
                if (DataBaseContext == null)
                {
                    DataBaseContext = new DataRepository(StringConexao);
                }

                return DataBaseContext;
            }
        }

        public static System.IO.TextWriter Log
        {
            get
            {
                return Db.Log;
            }
            set
            {
                Db.Log = value;
            }
        }

        public static void CleanUp()
        {
            if (DataBaseContext != null)
            {
                DataBaseContext.Dispose();
                DataBaseContext = null;
            }
        }

        #endregion
    }
}

Tags: , ,

.Net | Arquitetura

Servidor SVN com autenticação no Active Directory

by Cássio R Eskelsen 11. setembro 2008 13:15

Na empresa em que trabalho, fiquei responsável pela criação de um servidor SVN usando o Active Directory para autenticação dos usuários juntamente com um gerador de builds automatizados.

Irei relatar como montei esse servidor. Se esse post está no ar é porque deu tudo certo!

As ferramentas que utilizadas são:

a) Servidor (que chamarei de SVNSERVER) usando o Windows XP como sistema operacional. O ideal seria uma versão server obviamente, mas não queríamos torrar uma licença de servidor apenas para isso. No entanto, os fontes não ficarão nessa máquina, serão gravadas em um servidor de arquivos com backup automatizado.

b) Subversion para controle de versão. Como usaremos o Apache de intermediário para autenticação no AD, temos que utilizar o build correto, de acordo com a versão do Apache que estivermos utilizando. Usarei a versão gerada com o Apache 2.2. Cuidado com as versões: no momento em que eu escrevo este artigo, a versão do setup é a do SVN 1.4, no entanto, o Tortoise (item d) está usando o SVN 1.5. Eu instalei o SVN via setup e depois atualizei manualmente através do arquivo zipado que está na mesma pasta ( http://subversion.tigris.org/files/documents/15/43244/svn-win32-1.5.1.zip)

c) Apache HTTPD: o servidor apache será responsável pela interface entre o SVN e o Active Directory. A versão que irei utilizar é a http://linorg.usp.br/apache/httpd/binaries/win32/apache_2.2.9-win32-x86-openssl-0.9.8h-r2.msi

d) Tortoise SVN: cliente gráfico para o SVN.

Instalação

Instalei os programas na seguinte ordem:

Leia mais...

Tags: ,

Arquitetura

Herança x interface x associação - quando usar um ou outro

by Cássio R Eskelsen 5. agosto 2008 22:45

Na empresa onde trabalho, estamos criando uma nova arquitetura de sistemas foi me solicitado que criasse um pequeno exemplo usando essa arquitetura, com as classes Cidade, Estado, etc.

A princípio, o design mais comum seria o de criar uma superclasse comum (ex. "Região") e a partir dela herdar cada uma.

No entanto, IMHO, não é uma resposa tão óbvia, já que uma Cidade "é um" Região mas também "é um" divisão política.

Talvez, nesse caso, fosse mais interessante usar Interface.

Alguns links para estudo:

http://guj.com.br/posts/list/87814.java

http://blog.caelum.com.br/2006/10/14/como-nao-aprender-orientacao-a-objetos-heranca/

http://www.datasuldirect.com.br/flash/JAVA_SC/Or_Obj.pdf

UPDATE (11/08)

Mais um post interessante sobre o mesmo assunto:No, inheritance is not the way to achieve code reuse!

UML or Not UML

by Cássio R Eskelsen 5. agosto 2008 22:44

 

Semana passada passei para alguns  o link http://blog.fragmental.com.br/2008/07/25/uh-eme-ele/ onde o Schoes (um programador bastante conhecido na comunidade JAVA brasileira) fala sobre alguns problemas com a UML.

Por coincidência em outro blog, este internacional, um cara postou um artigo chamado 13 Reasons For UML Descent Into Darkness.

Somado a outros artigos que já li, percebo que a UML não é mais considerada no meio como sendo a Panacéia que resolverá todos nossos problemas.

Alguns fatos que pinço dos textos:

----

"Acontece que ao passar do diagrama (e diagramas aceitam qualquer besteira) para o código (onde o compilador e testes unitários são muito exigentes – fora os usuários) o tal do pseudo-modelo criado pelo “analista” no Rational Rose (porque a empresa não percebeu que o Rose foi descontinuado há anos) é completamente diferente do modelo implementado. As classes até têm o mesmo nome mas a mecânica interna é bem diferente. E por quê? Porque UML não vai te oferecer tudo o necessário para modelar. O mínimo que se espera de um modelo de um sistema é que ele seja verificável para saber se cumpre seus requisitos. Como é que eu vou saber isso com UML? Como eu testo UML?"

"

---------

10. Lack of solutions for real software design issues

While the specifications are huge there are no good solutions for problems common in software systems. Quick examples are:

  • No solution for multi-tasking and communication between tasks
  • No dependency between use cases"

--------

5. Concept bloat

Trying to bridge UML to reality made it incorporate concepts from all the languages in fashion during the last 10-15 years. Anybody knows how to represent a Java anonymous inner class?

-------- 

Claro que não estou propondo abolirmos a UML. Apenas trouxe esse tema para reflexão pois acredito que não podemos levar a ferro e fogo a idéia de que nossos diagramas UML tenham que representar todos os nossos projetos e que existem ferramentas auxiliares muito importantes para o entendimento/manutenção de uma necessidade (como por exemplo, descritivos textuais, testes unitários, documentação de código fonte, etc).

Tags: ,

Arquitetura