Sunday, June 09, 2013

Vantagens e Desvantagens do Controle de Versão Distribuído

Controle de versão distribuído (Distributed Version Control Systems – DVCS) é a mais nova geração de sistemas de controle de versão de software. Apesar de o conceito existir já há algum tempo, recentemente as ferramentas se tornaram maduras o suficiente para chamar a atenção de diversos projetos open source, que migraram ou expandiram seu suporte do Subversion (centralizado) para o Mercurial, Git e Bazaar (distribuídos) por exemplo.
Mas o que tem de errado com o controle de versão centralizado? Nada. Ele usa uma estrutura que atende muito bem a grande parte das equipes de desenvolvimento de software. Baseia-se na arquitetura cliente-servidor, com um repositório central (servidor) e cópias de trabalho para os desenvolvedores (clientes).
Para equipes de desenvolvimento com acesso ao repositório pela rede local, essa arquitetura funciona bem. A velocidade da rede não é problemática, o tempo de resposta do processamento é aceitável e todos os desenvolvedores da equipe têm permissão de leitura e escrita no repositório.
Não foi para resolver exatamente esse tipo de necessidade que o controle de versão distribuído foi criado. Imagine uma situação diferente:
  • Equipe com centenas de desenvolvedores. Significa que mais processamento vai ser exigido do servidor central, piorando o tempo de resposta;
  • Equipe espalhada em diferentes filiais da empresa. Acesso remoto ao repositório com limitações de conexão e de permissão de escrita;
A arquitetura cliente-servidor não funciona tão bem para essas situações. Soluções alternativas como aumentar a capacidade de processamento do servidor ou replicar os repositórios nem sempre são viáveis ou fáceis de serem implementadas.
Para essas situações, a arquitetura peer-to-peer, na qual o controle de versão distribuído se baseia, é muito mais adequada.

Benefícios do Controle de Versão Distribuído

As vantagens estão relacionadas à distribuição do processamento, redundância/replicação de repositórios e as novas possibilidades de colaboração entre desenvolvedores.

Do ponto de vista do desenvolvedor

  • Rapidez. As operações são processadas localmente. Não é necessário passar pela rede e contatar o servidor central para fazer um commit, log ou diff por exemplo.
  • Autonomia. A conexão com a rede só é necessária para trocar revisões com outros repositórios. Fora isso, trabalha-se desconectado e em qualquer lugar, como num cliente por exemplo.
  • Ramos privados. Além de um repositório próprio, o trabalho local é feito em um ramo privado que não interfere, nem sofre interferência dos demais, mesmo nas operações de sincronização entre repositórios. O momento de combinar um ramo com outro é uma decisão do desenvolvedor e não obrigatório antes de cada commit, como acontece no centralizado.
  • Facilidade de Mesclagem. Só a facilidade de criação de ramos não seria suficiente se não fosse o rastreamento automático usado pelos DVCS, que torna o processo de mesclagem muito mais simples e indolor. Observação: No Subversion, o rastreamento automático de merges começou a partir da versão 1.5

Do ponto de vista da gerência/coordenação

Parte das decisões gerenciais envolve manter livre o caminho da equipe para que possam trabalhar da melhor maneira possível. Outras decisões importantes são sobre redução de custos. Nestes dois casos específicos, o modelo distribuído oferece as seguintes vantagens:
  • Confiabilidade. No sistema centralizado, uma pane no servidor interrompe todo o desenvolvimento. Já no sistema distribuído, além de a equipe poder continuar seu trabalho (observação: veja a seção “controle de mudança ainda é centralizado” mais abaixo), os repositórios dos desenvolvedores funcionam como cópias de backup de todo o projeto.
  • Redução de custos com servidor. A carga de processamento fica distribuída nas próprias máquinas dos desenvolvedores. O repositório “central”, quando existe, tem o papel do repositório “oficial” e não como processador central das requisições.

Em que situações o controle de versão distribuído não vai tão bem?

Nem tudo são flores com o modelo distribuído de controle de versão.

Maior complexidade

No centralizado, os desenvolvedores trabalham no mesmo ramo, seja esse ramo o principal ou um ramo de manutenção.
Essa forma de trabalho é mais simples de se entender. Mesmo que limitadamente, uma pessoa com pouco conhecimento de controle de versão consegue trabalhar com o resto da equipe.
O modelo distribuído é mais complicado. A arquitetura peer-to-peer, ramos privados e as mesclagens aparentemente desordenadas podem tornar o grafo da evolução do projeto confuso à primeira vista.
Ao contrário do centralizado, não adianta só commit e update para funcionar “no tranco”. Todos os desenvolvedores da equipe precisam ter um conhecimento maior do modelo, da ferramenta e, de preferência, também de um processo de desenvolvimento que padronize fluxos de trabalho a serem seguidos. Só assim, o grafo acima deixa de ser apenas um emaranhado e passa a representar muito claramente o fluxo do trabalho.

Travamento de arquivos binários precisa ser centralizado

Diferentemente dos arquivos de texto, arquivos binários possuem um formato interno que não é baseado em linhas de texto e, por isso, não podem ser mesclados automaticamente pelo controle de versão ou manualmente pelo desenvolvedor.
Sendo assim, a edição concorrente de arquivos binários é problemática. Duas pessoas editando ao mesmo tempo uma figura, por exemplo, não conseguirão mesclar as modificações depois e o trabalho de uma delas precisará ser refeito.
Com arquivos binários, a melhor solução é usar o travamento, isto é, sinalizar que o arquivo está travado para edição e que ninguém mais deve editá-lo enquanto isso.
O modelo puramente distribuído não é adequado para lidar com travamento justamente por não possuir um servidor central que possa controlar as travas de todos.

Controle de mudança ainda é centralizado

As ferramentas de controle de mudança (e.g. Trac, Redmine, Mantis, Bugzilla) ainda não acompanharam as de controle de versão na arquitetura peer-to-peer. Isto significa que mesmo usando um DVCS, ainda haverá uma ferramenta centralizada para controle de mudança.
O ideal seria que o controle de versão e o controle de mudança  fossem integrados e distribuídos, tal como é no Fossil. Essa ferramenta parece ser interessante, mas ainda é muito incipiente.

Resumo das Características do Controle de Versão Distribuído

Ponto de VistaVantagensDesvantagens
Desenvolvedor
  • Rapidez
  • Autonomia
  • Ramos Privados
  • Facilidade de Mesclagem
  • Necessidade de maior conhecimento da ferramenta e do processo
Coordenação/Gerência
  • Redução de custos com servidor e infraestrutura externa de rede
  • Confiabilidade
  • Aumento da produtividade
  • Necessidade de maior capacitação de desenvolvedores
  • Importante ter um processo definido
  • O controle de mudança ainda precisa ser centralizado

Considerações Finais

Controle de versão distribuído oferece muitas vantagens interessantes. Mesmo projetos que não se encaixam diretamente no perfil podem se beneficiar. Entretanto, por ser um pouco mais complexo, o modelo distribuído requer mais preparo da equipe e também do processo, o que não chega a ser realmente um impedimento uma vez que um processo formalizado e equipes capacitadas são fundamentais para produção de software de qualidade.
Em um próximo artigo, vou analisar alguns pontos que ajudarão a decidir a viabilidade ou não de se mudar do centralizado para o controle de versão distribuído.

Referências e Leitura Complementar

  1. Conceitos Básicos de Controle de Versão Centralizado e Distribuído
  2. Capítulo 1 do manual o Mercurial
  3. Distributed Version Control Systems – Why and How
  4. Distributed Revision Control

Sunday, June 02, 2013

Requirements Engineering




Especificação e Análise de Requisitos de Software

“A parte individual mais difícil da construção de um sistema de software é decidir o que construir. Nenhuma parte do trabalho danifica tanto o sistema resultante se for feita errado. Nenhuma outra parte é mais difícil de consertar depois” [Fred Brooks]

“Uma das principais medidas do sucesso de um software é o grau no qual ele atende aos objetivos e requisitos para os quais foi construído. De forma geral, a Engenharia de Requisitos de Software é o processo de identificar todos os envolvidos, descobrir seus objetivos e necessidades e documentá-los de forma apropriada para análise, comunicação e posterior implementação [4]” [Ricardo Falbo, notas de Aula, Engenharia de Software, 2005]


Love, Reign O'er Me- Pearl Jam



Good songs can be found everywhere and anytime. Please do yourself a favor. Search the original.

Tuesday, May 28, 2013

Equipes de alto desempenho: utopia ou possibilidade?

Uma das maiores utopias empresariais refere-se à formação das chamadas equipes de alta performance. É mais do que natural que, em uma época onde o trabalho em equipe está tão divulgado, se busque um discurso que, além de atender às demandas do mercado, ainda consiga maximizar seus resultados.
Antes de se discutir performance, é necessário discutir o conceito de equipe que, apesar de ser uma palavra de aparente fácil definição, pode trazer dúvidas.
Existe vasta literatura sobre o processo de formação de equipe e de liderança. Durante anos, a formação de um líder foi a menina dos olhos dos programas de MBA no mundo todo. Drucker definiu três possíveis equipes, usando sempre a referência ao esporte como exemplo:
- a equipe de beisebol, semelhante a uma equipe cirúrgica ou a uma linha de montagem: tarefas independentes fazendo parte de um todo;
- a equipe de futebol, semelhante a uma equipe de projeto: trabalhos semelhantes, com funções ligeiramente diferentes e ocorrendo em paralelo;
- uma dupla de tênis, semelhante a um conjunto de jazz: trabalhos absolutamente interdependentes.
A grande maioria das equipes que encontramos nas organizações funciona na prática como grupos de trabalho, ou seja, membros dividem informação e práticas, além de tomarem decisões para ajudar cada um a desenvolver tarefas de sua área de responsabilidade. São equipes de beisebol ou no máximo de futebol.
Mas, por que é tão difícil formar equipes?
Em minha opinião, em primeiro lugar, existe uma grande contradição inicial. Somos uma sociedade toda voltada ao desempenho individual, desde o colégio até os planos de metas e objetivos das grandes empresas. Isso causa um conflito natural, tão relevante como o conflito que já discuti antes aqui, entre chefes e comandados. Nenhum programa de distribuição de lucros global paga mais do que o desenvolvimento pessoal individual, seja por meio de promoção, seja por bônus.
Além disso, as estruturas organizacionais ainda são fortemente baseadas no modelo Taylorista-Fordista, que vigorou por muito tempo como modelo de sucesso e organização. Isso fez com que o foco na figura do chefe, do líder e dos processos firmes fosse sempre o primordial. E isso é bem distante do conceito de formação de equipe.
Resumindo, há evidente conflito natural entre os interesses coletivos e os individuais. Pessoas educadas em princípios individualistas precisam renunciar a eles ao menos temporariamente em prol do trabalho coletivo.
O que se busca numa equipe é sinergia, sempre. O objetivo de uma equipe é que seus talentos individuais se somem de forma que o resultado dessa soma seja superior à simples soma de suas partes. Dois mais dois tem que ser mais do que quatro.
Mas muitas empresas adotam as teorias de trabalho em equipe apenas para predispor maior cooperação entre funcionários, sem fazer esforço algum para a construção da equipe. Pior ainda, assumem que o ato de juntar as pessoas fará com que elas aprendam a interagir produtivamente de forma instantânea.
E o desafio para montar essa equipe se inicia no processo seletivo, coordenando três fatores: habilidades técnicas, habilidades interpessoais e aderência das pessoas à missão da equipe. Ou seja, lembre-se bem que não necessariamente uma equipe de pessoas iguais a você lhe trará o melhor resultado. É provável que não traga…
Partindo do processo seletivo chega-se à mentalidade, agora em novos três fatores: missão do time, objetivos do time e regras. Os famosos “por quê, para quê e como”.
Resumindo:
Picture2
E esse é o primeiro passo para que você possa, antes de pensar em performance, pensar em formar a equipe com a correta indução de comportamento dos seus membros.
Feito isso, pode-se pensar em buscar uma performance acima dos padrões normais dos grupos que são montados como equipes. Com as pessoas certas e a mentalidade adequada você terá a chance de buscar o que quer, embora isso não baste.
Uma performance acima da média se obtém com a tarefa contínua de se relembrar os objetivos, medir resultados, discutir de forma clara e direta o que precisa ser melhorado e ter velocidade para remodelar quando necessário.
Para finalizar, deixo alguns conselhos de fatores que nunca podem ser esquecidos no processo:
- Não se esquecer que trabalho em equipe não é algo natural e demanda tempo
- É fundamental eliminar formalidades e aquele espírito colegial de falsa camaradagem
- Lembrar-se sempre que buscar a harmonia a qualquer custo é um dos grandes inimigos de uma performance alta
- Ter tolerância a erros. Medo de errar impede inovação
Vitor Roma
(@vromaCS)
Fontes: DYER, W. Team Building. New York: Addison-Wesley Publishing Company, Inc. 1995
DRUCKER, P.F. Administrando em tempos de grandes mudanças. São Paulo: Editora Pioneira, 2011

Check List para o Mapeamento de Processos

Check List para o Mapeamento de Processos


Introdução:Post de referência: O que é Mapeamento de Processos ?

Quando estamos trabalhando um projeto BPM, precisamos garantir que todas as atividades de uma fase estejam completas para irmos para a fase seguinte. Aqui discutiremos sobre o final da fase de Mapeamento e inicio da fase de Modelagem de Processos.

Questão-chave: Como sabemos que fase de Mapeamento terminou ?
Podemos imaginar o seguinte: Todas as atividades foram feitas. Ok, isso é pode ser um indicador para passarmos para frase próxima fase (Modelagem de Processos).
Entretanto, contudo, todavia, porém (ficou exagerado...mas este é objetivo), vamos refazer a  questão-chave: Será que temos informações suficiente para irmos para fase de Modelagem ?
Agora sim, temos uma dúvida.

Importante:
  As fases não são lineares, elas são iterativa e incrementais, mas toda vez que  começamos uma fase sem terminar a outra, será necessário retroceder a fase anterior, isto feito com frequência, dispara um sinal de alerta, pois pode comprometer a produtividade e causar danos ao progresso do projeto BPM.

Check List para o Mapeamento de Processos:
Para esclarecer a dúvida sobre o final da fase de Mapeamento de Processos e também facilitar o trabalho do Analista de Negócio, desenvolvemos ao longo do tempo, resultado de experiência prática,  um pequeno Check List, que ajuda aumentar a certeza que a fase de Mapeamento foi finalizada com sucesso, ou seja, com informações suficientes para iniciar a fase de Modelagem de Processos, próxima fase.

Check List:
1 - Quais são o eventos que iniciam o processo ?
2 - Quando o processo acaba, quais são os resultados esperados ?
3 - Quem são as partes interessadas ?
4 - Quais são as funções de negócios (áreas ou departamentos) que estão envolvidas com o processo?
5 - Quem é dono do processo (responsável pelo processo)?
6 - Quais são as exceções ?
7 - Quais sãos as metas do processo ?
8 - Quais são os indicadores de desempenho ?
9 - 
Quais são as métricas ?
10 - Quais são os recursos necessários para execução do processo ?
11 - Quais são os documentos associados ao processo ?
12 - Quais são as principais atividades ?
13 - Quem executa essas atividades ?
14 - Quais são as principais interfaces com outros processos ?
15 - Quais são os sistemas informatizados ou aplicações que dão suporte ao processo?
16 - Quais são as regras de negócio ?
17 - Qual o volume / quantidade / frequência de execução do processo ?
18 - Quais são as restrições ?
19 - Quais são os riscos ?  
20 - Qual o tipo de processo: negócio ou suporte ?

Observações:
- Quando estamos mapeando o modelo AS-IS, algumas perguntas do Check list podem ficar sem resposta, pois temos que mapear o cenário (situação) atual e algumas tais resposta não existem.


Thursday, May 23, 2013

Sistemas

Um sistema é algo que mantém a sua existência e funciona com um todo através da interação de suas partes. Sistemas têm propriedades emergentes que não são encontradas em suas partes. Você não pode predizer as propriedades de um sistemas completo considerando partes e analisando estas partes.



Se você dividir um sistema em partes ele perde as propriedades. Análise é o nome que se dá para dividir alguma coisa em suas partes para ver como ela funciona. Isto é muito útil para certos tipos de problemas, ou para ver como um sistema grande é feito de pequenos subsistemas. Você ganha conhecimento através da análise. Entretanto, você não pode compreender as propriedades do sistema todo, dividindo o sistema em suas partes constituintes. O complemento da análise é a síntese – construindo as partes em um todo. Você ganha compreensão através da síntese. O único modo de descobrir como um sistema funciona e quais são suas propriedades emergentes, é vê-lo em ação como um todo.

Fonte: The Art of to Systems Thinking ( Joseph O ́Connor & Ian McDermott) Ed Thorsons . 1997.

Sunday, May 19, 2013

Planet of the Apes



Conceito de Otimalidade de Pareto

“Uma sociedade se encontra em um estado ótimo se nenhuma pessoa desta sociedade pode melhorar sua situação sem que piore a situação de alguma outra pessoa da mesma sociedade”.

Vilfredo Pareto


Saturday, April 27, 2013

Apollo: Bringer Of Wisdom

"I bring truth and understanding,
I bring wit and wisdom fair,
Precious gifts beyond compare.
We can build a world of wonder,
I can make you all aware.
I will find you food and shelter,
Show you fire to keep you warm
Through the endless winter storms.
You can live in grace and comfort
In the world that you transform."


A Farewell To Kings

When they turn the pages of history
When these days have passed long ago
Will they read of us with sadness
For the seeds that we let grow?
We turned our gaze
From the castles in the distance
Eyes cast down
On the path of least resistance


Cities full of hatred, fear and lies
Withered hearts and cruel, tormented eyes
Scheming demons dressed in kingly guise
Beating down the multitude and
Scoffing at the wise

The hypocrites are slandering
The sacred Halls of Truth
Ancient nobles showering
Their bitterness on youth
Can't we find the minds that made us strong?
Can't we learn to feel what's right
And what's wrong?
What's wrong?

Stranger In A Strange Land

Was many years ago that I left home and came this way,
I was a young man full of hopes and dreams,
But now it seems to me that all is lost and nothing gained,
Sometimes things ain't what they seem,
No brave new world, no brave new world.


Watchmaker

"In a young man's quest to follow his dreams, he is caught between the grandiose forces of order and chaos. He travels across a lavish and colorful world of steampunk and alchemy, with lost cities, pirates, anarchists, exotic carnivals, and a rigid Watchmaker who imposes precision on every aspect of daily life."

Cândido, Voltaire, 1759


Monday, April 15, 2013

Decision Support System

A Decision Support System (DSS) is a collection of integrated software applications and hardware that form the backbone of an organization’s decision making process. Companies across all industries rely on decision support tools, techniques, and models to help them assess and resolve everyday business questions. The decision support system is data-driven, as the entire process feeds off of the collection and availability of data to analyze. Business Intelligence (BI) reporting tools, processes, and methodologies are key components to any decision support system and provide end users with rich reporting, monitoring, and data analysis.


Sunday, April 14, 2013

The Garden

Long ago I read a story from another timeline about a character named Candide. He also survived a harrowing series of misadventures and tragedies, then settled on a farm near Constantinople. Listening to a philosophical rant, Candide replied, "That is all very well, but now we must tend our garden."

I have now arrived at that point in my own story. There is a metaphorical garden in the acts and attitudes of a person's life, and the treasures of that garden are love and respect. I have come to realize that the gathering of love and respect - from others and for myself - has been the real quest of my life.

"Now we must tend our garden."


Rush - The Garden




The treasure of a life is a measure of love and respect
The way you live, the gifts that you give
In the fullness of time
Its the only return that you expect

Introduction to Scrum - CollabNet Scrum Training

Filosofia

No começo de uma vida podemos fazer tudo, mas sabemos muito pouco. No final sabemos muito, mas não podemos fazer nada.  (Anônimo)

Sunday, April 07, 2013

Couch potato


Ann Marie Calhoun - Deathless Dance

Steve Vai - In My Dreams With You

Quem nunca jogou?


Definição de Arquitetura de Software por Perry e Wolf

Perry e Wolf introduziram sua definição para arquitetura de software em seu artigo seminal Foundations for the Study of Software Architecture. A definição que eles propõem consiste na Fórmula abaixo e na explicação de seus termos:

Arquitetura={Elementos,Organização,Decisões}

De acordo com essa definição, a arquitetura de software é um conjunto de elementos arquiteturais que possuem alguma organização. Os elementos e sua organização são definidos por decisões tomadas para satisfazer objetivos e restrições. São destacados três tipos de elementos arquiteturais:

Elementos de processamento: : são elementos que usam ou transformam informação;
Elementos de dados: : são elementos que contêm a informação a ser usada e transformada; e
Elementos de conexão: : são elementos que ligam elementos de qualquer tipo entre si.
Já a organização dita as relações entre os elementos arquiteturais. Essas relações possuem propriedades e restringem como os elementos devem interagir de forma a satisfazer os objetivos do sistema. Adicionalmente, essas relações devem ser ponderadas de modo a indicar sua importância no processo de seleção de alternativas.


Arquitetura de Software em Camadas


Arquitetura de Software

Comecemos com algumas definições conceituais sobre Arquitetura de Software, segundo David Garlan e Mary Shawn:
“arquitetura de software é um nível de design voltado para questões que vão: além dos algoritmos e das estruturas de dados da computação. A projeção e a especificação da estrutura geral do sistema emergem como um novo tipo de problema. As questões estruturais incluem organização total e estrutura de controle global; protocolos de comunicação, sincronização e acesso a dados; atribuição de funcionalidade a elementos de design; distribuição física; composição de elementos de design; escalonamento e desempenho; e seleção entre as alternativas de design.”
No RUP temos a seguinte definição:
“a arquitetura de um sistema de software (em um determinado ponto) é a organização ou a estrutura dos componentes significativos do sistema que interagem por meio de interfaces, com elementos constituídos de componentes e interfaces sucessivamente menores.”
Existem diversos padrões de arquitetura de software, abaixo uma lista de alguns separados por sua forma:
  • Estrutura: Camadas, Pipes e Filtros, Quadro-negro
  • Sistemas Distribuídos: Broker
  • Sistemas Interativos: Modelo-Visão-Controlador (MVC), Apresentação-Abstração-Controle
  • Sistemas Adaptáveis: Reflexo, Microkernel
Partindo desta lista podemos perceber que de acordo com nossa necessidade e contexto, nossos aplicativo, ou partes dele, pode ser projetado de diferentes formas arquiteturais. No decorrer do texto falaremos mais do padrão arquitetural em Camadas.

Visões de Arquitetura:

Ao projetar a arquitetura de um software, podemos visualizar sua estrutura por vários “ângulos”. Estas diferentes visões de arquitetura podem ser divididas em:
  • Visão de Casos de Uso,  que contém casos de uso e cenários que abrangem comportamentos significativos em termos de arquitetura, classes ou riscos técnicos. Ela é um subconjunto do modelo de casos de uso.
  • Visão Lógica, que contém as classes de design mais importantes e sua organização em pacotes e subsistemas, e a organização desses pacotes e subsistemas em camadas. Ela contém algumas realizações de caso de uso. É um subconjunto do modelo de design.
  • Visão de Implementação, que contém uma visão geral do modelo de implementação e sua organização em termos de módulos em pacotes e camadas. A alocação de pacotes e classes (da Visão Lógica) nos pacotes e módulos da Visão de Implementação também é descrita. Ela é um subconjunto do modelo de implementação.
  • Visão de Processos, que contém a descrição das tarefas (processo e threads) envolvidas, suas interações e configurações, e a alocação dos objetos e classes de design em tarefas. Essa visão só precisará ser usada se o sistema tiver um grau significativo de simultaneidade.
  • Visão de Implantação, que contém a descrição dos vários nós físicos da maior parte das configurações comuns de plataforma e a alocação das tarefas (da Visão de Processos) nos nós físicos. Essa visão só precisará ser usada se o sistema estiver distribuído. Ela é um subconjunto do modelo de implantação.

 Arquitetura de Software em Camadas

Contexto

Um sistema grande que requer decomposição.

Problema

Um sistema que deve resolver as questões em diferentes níveis de abstração.  Por exemplo: as questões de controle de hardware, as questões de serviços comuns e as questões específicas de domínio. Seria extremamente indesejável escrever componentes verticais que lidem com essas questões em todos os níveis. Uma mesma questão deveria ser resolvida (possivelmente de maneira inconsistente) várias vezes em diferentes componentes.

Força

  • As partes do sistema devem ser substituíveis.
  • As alterações efetuadas nos componentes não devem ser irregulares
  • Responsabilidades similares devem ser agrupadas juntas
  • Tamanho dos componentes: componentes complexos talvez precisem ser decompostos

Solução

Estruture os sistemas em grupos de componentes que formem camadas umas sobre as outras. Faça com que as camadas superiores utilizem os serviços somente das camadas abaixo (nunca das camadas acima). Tente não usar serviços que não sejam os da camada diretamente abaixo (não pule camadas, a menos que as camadas intermediárias somente adicionem componentes de acesso).

Abordagens Comuns

A divisão em camadas representa um agrupamento ordenado de funcionalidades, sendo que:
  1. a funcionalidade específica de aplicativo está localizada nas camadas superiores,
  2. a funcionalidade que abrange os domínios de aplicativos se encontra nas camadas intermediárias e
  3. a funcionalidade específica do ambiente de implantação está nas camadas inferiores.
O número e a composição das camadas dependem da complexidade do domínio do problema e do espaço para solução:
  1. Em geral, há apenas uma única camada específica de aplicativo.
  2. Nos domínios em que sistemas anteriores foram desenvolvidos ou sistemas de grande porte são compostos de sistemas interoperacionais menores, há uma grande necessidade de compartilhar as informações entre as equipes de design. Conseqüentemente, para maior clareza, é provável que a camada específica de negócios exista parcialmente e esteja estruturada em várias camadas.
  3. Os espaços para solução que são suportados por produtos de middleware e nos quais o software de sistema complexo desempenha um papel importante terão camadas inferiores bem desenvolvidas, talvez com várias camadas de middleware e software de sistema.

Exemplos

Camadas genéricas


Arquitetura de software - camadas genéricas
Arquitetura de Software – Camadas genérricas

Camadas de sistemas de negócios

Arquitetura de software - camadas de negócios
Arquitetura de software – camadas de negócios

 Quatro camadas

Arquitetura de software - quatro camadas
Arquitetura de software – quatro camadas
  • A camada superior, camada de aplicativo, contém serviços específicos de aplicativo.
  • A camada seguinte (camada específica de negócios) contém componentes específicos de negócios, usados em diversos aplicativos.
  • A camada de middleware contém componentes como construtores GUI, interfaces para sistemas de gerenciamento de banco de dados, serviços de sistemas operacionais que não dependem de plataforma e componentes OLE, como planilhas e editores de diagramas.
  • A camada inferior (camada de software de sistema) contém componentes como sistemas operacionais, bancos de dados, interfaces para hardware específico, etc.

Diretrizes da divisão


  • Visibilidade: Os subsistemas só podem depender de subsistemas na mesma camada e na camada inferior seguinte.
  • Volatilidade:
    • Nas camadas superiores, insira elementos que variam quando os requisitos de usuário são alterados.
    • Nas camadas inferiores, insira elementos que variam quando a plataforma de implementação (hardware, idioma, sistema operacional, banco de dados, etc.) é alterada.
    • Entre essas camadas, insira elementos que geralmente se aplicam a diversos tipos de sistemas e ambientes de implementação.
    • Acrescente camadas quando partições adicionais nessas categorias amplas ajudarem a organizar o modelo.
  • Generalidade: Elementos abstratos do modelo costumam ser inseridos em camadas inferiores no modelo. Se não forem específicos da implementação, ficarão geralmente próximos das camadas intermediárias.
  • Número de Camadas: (não gosto desta diretriz, apresento por constar na literatura) Para um sistema pequeno, três camadas são suficientes. Para um sistema complexo, cinco a sete camadas costumam ser suficientes. Para qualquer grau de complexidade, o uso de mais de dez camadas deve ser visto com suspeita, que deverá aumentar com o número de camadas. Algumas regras práticas são: de 0 a 10 classes – 0 camadas; de 10 a 50 classes – 2 camadas; de 25 a 150 classes – 3 camadas; de 100 a 1000 classes – 4 camadas

Padrões de particionamento

Nas camadas superiores do sistema, partições adicionais podem ajudar a organizar o modelo. As seguintes diretrizes para particionamento apresentam questões distintas a serem consideradas:
  • Organização do usuário: Os subsistemas podem ser organizados em linhas que refletem a organização da funcionalidade na organização de negócios
  • Áreas de competência e/ou habilidades: É possível organizar subsistemas de modo que particionem responsabilidades de partes do modelo entre grupos distintos da organização de desenvolvimento. Em geral reflete a necessidade de especialização de habilidades durante o desenvolvimento e o suporte da tecnologia de infra-estrutura complexa. Exemplos: o gerenciamento de distribuição e rede, o gerenciamento de banco de dados, o gerenciamento de comunicação, o controle de processos, etc.
  • Distribuição do sistema: Em qualquer uma das camadas do sistema, é possível particioná-las “horizontalmente” para refletir a distribuição física da funcionalidade. O particionamento para refletir a distribuição pode ajudar a visualizar a comunicação de rede que ocorrerá assim que o sistema for executado.
  • Áreas de sigilo: Alguns aplicativos, principalmente aqueles que exigem autorização de segurança especial para serem desenvolvidos e/ou suportados, requerem partições adicionais nas linhas de privilégio de acesso à segurança.
  • Áreas de variabilidade: A funcionalidade que tende a ser opcional e, portanto, liberada apenas em algumas variantes do sistema, deve ser organizada em subsistemas independentes que são desenvolvidos e apresentados sem depender da funcionalidade obrigatória do sistema.

Conclusões

Com estes direcionamentos fica claro de que aplicações, por mais simples que sejam, devem ser divididas por um conceito básico na análise orientada à objetos: divisão de responsabilidades.
Seguindo estas diretrizes tenho certeza que os projetos de software podem ser melhor organizados diminuindo complexidades, principalmente na manutenção de código e escalabilidade durante sua vida de utilização.