sexta-feira, 5 de junho de 2009

Engenharia de Software

A ES é toda uma área do conhecimento da computação. A intenção é conseguir especificar, desenvolver e manter software com a melhor relação de custo e qualidade possível com todas as técnicas que temos disponíveis, se focando em aspectos práticos. Por isso ela engloba todas estas partes do software:
- Requisitos;
- Design;
- Implementação;
- Testes;
- Manutenção;
- Gerência de configuração;
- Gerência de engenharia;
- Processos de engenharia;
- Ferramentas e métodos de engenharia;
- Qualidade;

Para nos ajudar a entender tudo isso, vamos começar com a definição de ciclo de vida do produto (software). A idéia destes modelos é detalhar como deve ser o passo a passo do desenvolvimento do software até que se tenha o produto final.

No processo em Cascata temos um processo linear, na base de muitos processos de ciclo de vida ainda hoje. Completa-se a engenharia de requisitos para só depois fazer o design do software. E só depois deste é que se inicia a implementação e os testes. Depois se testa o sistema e finalmente se entra na etapa de manutenção do software. Costuma funcionar melhor para equipes tecnicamente mais fracas e minimiza o tempo de planejamento. Porém é mais inflexível e só produz um software realmente no final do processo.

O modelo em espiral tenta dar maior importância a duas partes deste ciclo: a análise de risco e a prototipagem. Procura-se definir e especificar partes menores, produzindo protótipos e cada iteração pode voltar a qualquer etapa (mais comum de se voltar ao desenvolvimento ou especificação) e gerar outro protótipo até que se chegue ao final do produto. E este acaba sendo um modelo complexo de se planejar e utilizar, mas pode-se diminuir muito o risco dos projetos. Uma variação parecida é a Prototipagem Evolucionária, que também faz ciclos de protótipos, mas não chega a fazer um planejamento geral porque se planeja apenas versões curtas, o que é muito útil quando os requisitos ainda não estão bem definidos, mas tem a desvantagem de que é impossível de prever quanto tempo ou quantas iterações serão necessárias até o final do projeto.

Entre outros modelos utilizados estão: Codificação e Correção, Staged Delivery, Evolutionary Delivery, Design-to-Schedule, Design-to-Tools e Off-the-Shelf.

Quanto as metodologias de desenvolvimento, também temos diversas delas para escolher. O RUP (Rational Unified Process) foi criado por uma empresa adquirida pela IBM e virou IRUP (IBM RUP). Eles fornecem técnicas de desenvolvimento de software visando o aumento de produtividade. Ele faz uso da Orientação a Objetos e da linguagem UML para definir e ilustrar os seus processos. Ele divide o processo em quatro fases essenciais:
Concepção: ênfase no escopo do sistema;
Elaboração: ênfase na arquitetura;
Construção: ênfase no desenvolvimento;
Transição: ênfase na implantação.
É um modelo considerado pesado, mas que é muito útil com um grande número de pessoas na equipe, no caso de projetos muito grandes. Mas é suficientemente simples para que possamos trabalhar com ele em processos menores.

De qualquer forma, muitas metodologias surgiram exatamente por esta razão, com o nome de métodos ágeis. Eles procuravam uma forma de se conseguir um resultado semelhante sem gerar tantos documentos durante o processo e procuram minimizar o risco com curtos períodos de desenvolvimento. No início a "programação extrema" causou muito reboliço com suas idéias de programação em pares e projeto contínuo e hoje em dia sofre críticas mesmo daqueles que acreditam nas metodologias ágeis, como depender de desenvolvedores muito bem preparados, falta de estrutura e documentação, requerer uma mudança cultural muito grande, etc. Mais recentemente a metodologia ágil que mais ouço falar é a Scrum que procura percorrer todo o processo de desenvolvimento de software em "sprints" curtos, geralmente de 15-30 dias, gerando versões funcionais de software regularmente.

Basicamente, no Scrum se faz um planejamento geral que gera a lista completa de requisitos de software (o que é chamado de "product backlog"). Então se faz reuniões periódicas chamadas de "Sprint Planning Meetings" onde se acorda o escopo do próximo "sprint", montando o "sprint backlog". Diariamente durante o sprint, se faz uma reunião rápida para verificar se o andamento do sprint está comprometido (Daily Scrum). No final do sprint, se faz uma apresentação as "clientes" da versão, mostrando as funcionalidades implementadas e as anomalias que foram encontradas, para atualizarem o "product backlog" e se prepararem para o novo "sprint". Também deve ser realizada uma reunião de "Sprint Restrospective" para darem feedback sobre o processo e melhorarem o que for possível para o próximo "sprint". Devem, então, acontecer tantos "sprints" quanto forem necessários para que o produto seja dado como concluído.

Ultimamente tenho começado a acreditar que esta metodologia funciona muito bem com o tipo de estrutura que temos aqui na empresa que trabalho e estou estudando mais a respeito para utilizarmos o que for possível/benéfico.

quarta-feira, 3 de junho de 2009

Redes de Computadores

Quando dois ou mais computadores trocam serviços, se tem uma rede de computadores. Pode ser impressoras, dados, mensagens (de texto instantâneas ou emails), etc. A internet já é uma rede com muitos serviços disponíveis e por isso, é tão útil nos dias de hoje. A idéia deste post é comentar algumas destas teorias de redes.

Topologias
A topologia da rede define por onde esta troca de informações acontece e por isso, vou descrever um pouco destas topologias para podermos compreender melhor como estas redes funcionam.

Uma topologia em barramento é quando todos os computadores estão ligados ao mesmo barramento, que já não é muito utilizada nos dias de hoje, já que era feita com cabos coaxiais, ligando um computador ao outro com um único cabo e utilizando o "T" para fazer a extensão para o próximo computador. E as redes em árvore são essencialmente uma série de redes de barramento, fazendo uma máquina conversar com outras duas.

Quando os computadores estão ligados em anel, um computador só conversa com o seu vizinho diretamente. Então quando ele quer falar com outra máquina ele envia a mensagem e o vizinho passa para o próximo até que ou a mensagem chegue ao seu destino ou retorne ao computador que a enviou (que então tira a mensagem do círculo).

As topologias em estrela, hoje em dia, são as mais comuns. Tem um centralizador da rede (hub, switch) e todos os computadores da rede ligados a ele, funcionando para pequenas redes, já que estes centralizadores raramente possuem muitas portas. Mesmo assim, é um dos tipos mais comuns de redes atualmente.

Por fim, a topologia híbrida que é também muito utilizada hoje em dia. Cada ambiente seleciona a rede que é mais adequada para ele e conversa com outras redes de topologias diferentes.

Ligação ao Meio
Além das topologias, ainda há mais uma forma de se classificar estas ligações.

Ponto a ponto é uma forma de ligar dois equipamentos. Serve para as topologias de anel (ligando um computador ao outro), estrela (ligando um computador ao centralizador) e é bem mais simples de implementar porque não possui os problemas de múltiplas reflexões nem de transmissões simultâneas.

No caso da ligação multiponto, há algumas precauções que deve-se tomar com reflexões e ter a certeza de qual computador está tentando falar com ele. Pode-se utilizar este tipo de ligação em qualquer uma das topologias.

Meios de Transmissão
Agora vamos falar dos cabos e outros meios onde esta informação pode trafegar. É parte vital da montagem de uma boa rede a definição de qual meio de transmissão será utilizado.

O cabo de par trançado foi criado para se tentar diminuir o ruído e manter as propriedades elétricas do meio. Ele tem esse nome porque é composto por dois pares de cabos de cobre trançados um no outro. Em baixas frequências ele apresenta uma boa resistência a ruídos, porém em altas frequências o cabo coaxial é melhor.

Como acabamos de dizer, o cabo coaxial é mais resistente a ruídos, independentemente do tamanho do cabo, mas é mais caro. Ele é feito com dois condutores, um interno e um externo, separados por um dielétrico e possuindo uma camada isolante circundando o condutor externo.

Já as fibras óticas, ainda mais caras, são imunes a ruídos eletromagnéticos e permitem um isolamento completo entre o transmissor e o receptor. Sua transmissão é realizada por um sinal de luz codificado que trafega dentro do domínio de frequência infravermelho.

Fora isso temos os meios de transmissão wireless. Ou que não precisam de cabos. Ondas de rádio são utilizadas para longo alcance, mas podem ser bloqueadas por obstáculos físicos nestas frequências, ou em frequências mais baixas podem atravessar paredes, mas não ficam com um alcance muito grande. De qualquer forma, para o curto alcance, geralmente se utiliza as ondas milimétricas ou infravermelhas (utilizadas em controles remotos, por exemplo). Neste caso elas não atravessam objetos sólidos, o que é uma vantagem para este tipo de equipamento. E por fim, temos a transmissão por microondas, que foi muito utilizada para transmissões de longo alcance antes da fibra ótica e ainda hoje em tecnologias de celulares, possuem a desvantagem de precisar de muitos repetidores.

Transmissão e Banda Passante
Agora podemos conversar sobre como a transmissão dos dados será realizada. A origem primeiro gera a informação, depois monta uma tabela de símbolos e monta um pacote com os dados que será transmitido. Depois é feita a transmissão deste pacote da origem ao destino seguindo a topologia certa e no destino se faz a decodificação desta informação e se recria a informação. Para determinar a banda passante de uma rede é necessário saber com que frequência o sinal pode ocilar da origem até o destino, pelo ruído que pode ser gerado no canal, pela atenuação e pelos ecos. Em um meio sem ruído, o máximo que pode ser transmitido de dados com uma frequência de "X" Hz é 2 "X", porque você pode mandar um bit na subida e outro na decida da oscilação do sinal. Por isso, duas fórmulas bastante comuns na ausência de ruído:

C = 2 W baunds.

Se não forem apenas dois níveis de tensão (alto e baixo) transmitidos, na verdade a fórmula passa a poder transportar log2(L) bits, onde L é a quantidade de níveis de tensão, transformando a fórmula em:

C = 2 W log2(L) bps (se L = 2, log2(2) = 1 e ficamos exatamente com a fórmula anterior).

Para aqueles que não se lembram, uma regrinha fácil para o cálculo do logarítimo é com 2 elevado a "X" é igual a L. Quanto é "X"? Além disso os sinais vão sofrendo atenuação com a distância da origem (a fibra ótica permite uma atenuação menor que 1dB por km), por isso há um limite de uso diferente para cada tipo de cabeamento/meio de trasmissão e o ruído é geralmente medido em decibéis. Se quisermos levar em consideração o sinal sobre o ruído, podemos dividir a fórmula acima por:

C = ( 2 W log2(L) ) / (1 + S/R) (onde S = Sinal e R = Ruído, ambos em potência ou decibéis)

Assim é possível se determinar com mais precisão a banda passante máxima.

Protocolos de Rede

O modelo ISO/OSI é um bom modelo de arquitetura de redes que deve ser seguido nos projetos de protocolos de redes, com o objetivo de permitir a troca de informações entre computadores de fabricantes distintos. Para reduzir a complexidade, o modelo dividiu a arquitetura em camadas, sendo que há uma hierarquia entre elas. Cada camada fornece serviços para a camada superior e usa serviços da camada inferior. São elas:

- Aplicação -
Aplicação (fornecer aos processos de uma aplicação os meios para utilizar os meios de comunicação disponiveis)
Apresentação (realizar as conversões necessárias para que a comunicação seja realizada)
Sessão (estruturar os circuitos fornecidos pela camada de transporte para fazer o controle do token ou do diálogo - ver que estão se entendendo ou voltar até o último ponto de onde iniciaram)
Transporte (definir um meio confiável fim-a-fim de transmissão, garantir que os pacotes sejam interpretados na ordem correta e que cheguem do outro lado corretamente)
Rede (trata dos problemas de roteamento e chaveamento de pacotes)
Enlace (transforma um meio de comunicação não confiável em confiável, colocando a informação em quadros com redundância para detecção de erros, por exemplo)
Físico (define como representar os bits no meio físico, se a comunicação será half-duplex ou duplex, como a conexão será estabelecida e desfeita)
- meio físico -

Já a arquitetura TCP/IP é muito semelhante a esta, mas possui menos camadas definidas.

- Aplicação -
Aplicação (soma das camadas de sessão, apresentação e aplicação, tem como exemplos: http, dns, ftp, telnet)
Transporte (exemplos: TCP e UDP)
Rede (exemplos: IP)
Intra-Rede (corresponde as camadas físico e enlace, com exemplos: ethernet, slip, PPP)
- meio físico -

Montando a Rede

Agora que temos todo estes conhecimentos sobre redes podemos determinar qual a rede que precisamos para nossa aplicação. Podendo escolher como será feita a ligação dos computadores, quais protocolos utilizar, determinar a banda que será conquistada com a rede. Mais do que isso, talvez se quiser saber o quanto divide a banda ao se utilizar hubs ou switches, mas isto poderá ser matéria de um outro post...

terça-feira, 2 de junho de 2009

Comunicação de Dados

As teorias filosóficas a respeito da comunicação em geral avançaram muito desde a primeira, que dizia que tudo o que se precisava era um emissor (o falante) e um receptor (o ouvinte). Porque se entendeu que nem sempre o que é dito ao ouvinte é compreendido, aceito ou entendido.

Os componentes da comunicação são: o emissor, o receptor, a mensagem, o canal de propagação, o meio de comunicação, a resposta (feedback) e o ambiente onde o processo comunicativo se realiza. No caso das redes de computadores, também temos todas estas variáveis. Mas nem todas elas são tão importantes assim para os computadores.

Para facilitar esta comunicação foram criados diversos protocolos diferentes (TCP e UDP, por exemplo). Eles cuidavam do que deveria ter a mensagem e a resposta para que houvesse comunicação.

O meio, o canal e o ambiente de comunicação também variam bastante. Do cabo coaxial até a fibra ótica existem diversas opções de onde trafegarão os dados. Inclusive rede elétrica nos dias de hoje. Podemos trocar informações através de cabos seriais ou seguindo o padrão ethernet. São inúmeras opções.

Mas no caso dos computadores, algumas teorias adicionais básicas foram criadas para simplificar e possibilitar a comunicação. Foram criadas regras básicas para os protocolos/meios serem comunicações de dados aceitáveis.

Temos três fatores básicos para que uma comunicação de dados seja eficiente: entrega (quem fala consegue falar com todos e apenas os que deseja falar), confiabilidade (precisa chegar do outro lado) e o tempo de atraso tem que ser aceitável e pré-definido.

Além disso, temos uma variável importante que precisava ser levada em consideração: o sentido da comunicação e o tipo de conexão.

No sentido, se definiu a comunicação simplex (só um fala e o outro escuta), duplex (um fala e o outro escuta, mas podem revesar quem fala ou escuta) e a full duplex (ambos podem falar e escutar ao mesmo tempo).

Já no tipo de conexão, temos comunicações ponto a ponto (de uma máquina a outra apenas, com um cabo direto, por exemplo) e multi-ponto (onde as máquinas compartilham um único link).

segunda-feira, 1 de junho de 2009

Gerenciamento de Projetos

A sigla que vou falar desta vez é PMI (Project Management Institute). Eles criaram um excelente manual sobre gerenciamento de projetos e a primeira coisa que eles fazem é exatamente definir o que são os projetos. Projetos são temporários, envolvem o desenvolvimento de algo único e realizado em etapas.

Hoje em dia, muitas empresas trabalham desta forma, considerando cada produto novo é um projeto. Seja um prédio, um remédio, um celular, uma televisão, um computador, um software, praticamente qualquer coisa. E durante o desenvolvimento, há uma concorrência de prioridades que variam entre: escopo, tempo, risco e qualidade. Além de uma possibilidade de expectativas e necessidades diferentes para todos que esperam o desenvolvimento de determinado projeto. Por isso, o gerenciamento de projetos é uma atividade que tem o dever de analisar os requisitos e trabalhar com as demandas, expectativas e necessidades dos clientes daquele projeto.

Para ajudar nesta tarefa, o PMBOK dividiu os conhecimentos necessários para uma boa gestão de projetos em nove áreas diferentes. São elas:
1-) Integração (desenvolvimento, execução e controle do planejamento do projeto como um todo);
2-) Escopo (iniciação, planejamento, detalhamento e verificação de escopo, além de controle de mudanças nele);
3-) Tempo (definição, sequenciamento e estimativa de duração das atividades além de desenvolvimento e controle do cronograma);
4-) Custo (planejamento dos recursos e estimativa, orçamento e controle de custos);
5-) Qualidade (planejamento, controle e garantia da qualidade);
6-) Recursos Humanos (planejamento organizacional, montagem e desenvolvimento da equipe);
7-) Comunicações (planejamento das comunicações, distribuição das informações, relato de desempenho e encerramento administrativo);
8-) Riscos (planejamento e identificação dos riscos, análise qualitativa e quantitativa dos riscos, desenvolvimento de respostas, controle e monitoração dos riscos);
9-) Aquisições (planejamento e preparação das aquisições, obtenção de propostas e seleção de fornecedores, administração e encerramento de contratos);

Eu devo escrever com mais detalhes de cada uma destas áreas no futuro próximo. Já que como eu disse, atualmente estou estudando muito processos para mudarmos os processos de desenvolvimento de software e a gestão de projetos tem muita relação com isso.