quarta-feira, 29 de setembro de 2010

Como funcionam os projetos de software

Os projetos de software nem sempre atingem os seus objetivos. Para mostrar como estes projetos funcionam, existe um exemplo bem humorado que é usado há muito tempo:

01 - Como o cliente descreveu a sua necessidade:
02 - Como o analista de requisitos entendeu:
03 - O que o gerente de conta vendeu para o cliente:
04 - Como o analista especificou:
05 - O que o programador construiu:
06 - O que a equipe de testes recebeu:
07 - Como o projeto foi documentado:
08 - Qual é o plano de recuperação de desastre:
09 - Como o marketing anunciou:
10 - O que a operação instalou:
11 - Como é suportado:
12 - Quando foi entregue:
13 - Quanto foi cobrado do cliente:
14 - O que o cliente realmente queria:

Veja mais exemplos em: http://www.projectcartoon.com

terça-feira, 14 de setembro de 2010

Como programadores matam dragões e salvam princesas

Vejam um texto divertido sobre programadores e suas características, que circula pela web (eu não sei qual é a origem dele):


Java - Chega, encontra o dragão, desenvolve um framework para aniquilamento de dragões em múltiplas camadas, escreve vários artigos sobre o framework, mas não mata o dragão.

.NET - Chega, olha a ideia do Javanês e a copia. Tenta matar o dragão, mas é comido pelo réptil.

C - Chega, olha para o dragão com olhar de desprezo, puxa seu canivete, degola o dragão, encontra a princesa, mas a ignora para ver os últimos checkins no cvs do kernel do Linux.

C++ - Cria um canivete básico e vai juntando funcionalidades até ter uma espada complexa que apenas ele consegue entender. Mata o dragão, mas trava no meio da ponte por causa dos memory leaks.

COBOL - Chega, olha o dragão, pensa que ta velho demais para conseguir matar um bicho daquele tamanho e pegar a princesa e, então, vai embora.

Pascal - Se prepara durante 10 anos para criar um sistema de aniquilamento de dragão... Chegando lá, descobre que o programa só aceita lagartixas como entrada.

VB - Monta uma arma de destruição de dragões a partir de vários componentes, parte pro pau pra cima do dragão e, na hora H, descobre que a espada só funciona durante noites chuvosas...

PL/SQL - Coleta dados de outros matadores de dragão, cria tabelas com N relacionamentos, complexidade ternária, dados em 3 dimensões, OLAP e demora 15 anos para processar a informação. Enquanto isso a princesa virou lésbica.

Ruby - Chega com uma baita fama, falando que é o melhor faz tudo, quando vai enfrentar o dragão mostra um videozinho dele matando um dragão... O dragão come ele de tédio.

Smalltalk - Chega, analisa o dragão e a princesa, vira as costas e vai embora, pois eles são muito inferiores.

shell - Cria uma arma poderosa para matar os dragões, mas, na hora H, não se lembra como usá-la.

shell(2) - O cara chega ao dragão com um script de 2 linhas que mata, corta, estripa, empala, pica em pedacinhos e empalha o bicho, mas na hora que ele roda o script, aumenta, engorda, enfurece e coloca álcool no fogo do dragão.

Assembly - Acha que ta fazendo o mais certo e enxuto, porém troca um A por D, mata a princesa e transa com o dragão.

Fortran - Chega, desenvolve uma solução com 45000 linhas de código, mata o dragão, vai ao encontro da princesa... Mas esta o chama de tiozinho e sai correndo atrás do programador Java que era elegante e ficou rico.

Fox Pro - Desenvolve um sistema para matar o dragão, por fora é bonitinho e funciona, mas por dentro está tudo remendado, quando ele vai executar o aniquilador de dragões lembra que se esqueceu de indexar os DBFs.

Analista de Processos - Chega ao dragão com duas toneladas de documentação desenvolvida sobre o processo de se matar um dragão genérico, desenvolve um fluxograma super complexo para libertar a princesa e se casar com ela, convence o dragão que aquilo vai ser bom pra ele e que não será doloroso. Ao executar o processo ele estima o esforço e o tamanho do estrago que isso vai causar, pede a assinatura do papa, do Buda e do Raul Seixas para o plano e, então, compra 2 bombas nucleares, 45 canhões, 1 porta aviões, contrata 300 homens armados até os dentes, quando na verdade necessitaria apenas da espada que estava na sua mão o tempo todo.

Clipper - Monta uma rotina que carrega um array de codeblocks para insultar o dragão, cantar a princesa, carregar a espada para memória, moer o dragão, limpar a sujeira, lascar leite condensado com morangos na princesa gostosa, transar com a princesa, tomar banho, ligar o carro, colocar gasolina e voltar pra casa. Na hora de rodar recebe um "Bound Error: Array Access" e o dragão o come com farinha.

Perl - Chega, olha o dragão de cima a baixo, monta um programinha mixuruca com três linhas, mas com uma puta expressão regular (que ninguém entende, nem o cara que fez) que simplesmente oblitera o dragão e as roupas da princesa, deixando-a no jeito pro programador terminar o serviço. Mas aí, ele vai fazer outra coisa e a princesa fica a ver navios...

HTML - Monta um monte de telinha bonitinha, cheia de gifs animadas, música, botõezinhos, applets que mostram uma foto sobre um lago espelhado, applets que colocam cobrinhas atrás do cursor do mouse e flashes lindíssimos que em teoria iriam deixar tanto o dragão quanto a princesa maravilhados e assim poderia escolher quem ele vai matar e quem vai resgatar. Na hora de rodar, a página demora tanto a entrar e o Internet Explorer trava tantas vezes que mata o dragão e a princesa de tédio e velhice. Nesse meio tempo, a princesa já tinha descoberto que o programador HTML (eles gostam de se chamar de "Uebidizzzaiguinersss") era gay e que estava de olho mesmo era no dragão. Nooofffaaa!!!

sexta-feira, 3 de setembro de 2010

Classificação dos testes de software

Na fase de construção dos softwares, os testes podem ter classificações diferentes, dependendo do enfoque que se pretende dar. Eles podem ser classificados quanto ao Nível, o Tipo e a Técnica. Veja abaixo mais detalhes de cada classificação:

Classificação quanto ao Nível do teste

  • Teste Unitário

Testa apenas o componente (ou a menor unidade de software) que o desenvolvedor construiu. Exemplo de ferramenta para auxiliar nos testes: JUnit.

  • Teste de Integração

Testa as integrações entre os diversos componentes construídos.

Normalmente, o Teste Unitário e o Teste de Integração são realizados pela própria equipe de desenvolvimento.

  • Teste de Sistema

Verifica a boa execução dos componentes do aplicativo inteiro, incluindo as interfaces com outras aplicações.

Geralmente é realizado pela equipe de testes funcionais.

  • Teste de Aceitação

Verifica se o sistema atende aos requisitos do usuário, conforme especificado. Exemplo de ferramenta para automação: Selenium.

Normalmente é realizado pela equipe de projeto do sistema. A partir deste teste é gerada a "Versão 1.0" do sistema.

Classificação quanto ao Tipo do teste

  • Teste Funcional

São testes que verificam a operação correta do sistema em relação a sua especificação.

Geralmente é realizado pela equipe de testes.

  • Teste Não Funcional

É realizado por uma equipe de testes mais especializada, porém, com foco em aspectos não funcionais como: desempenho, carga, estresse, usabilidade, segurança, etc. É feito em cima da versão 1.0 do sistema.

O teste de desempenho busca extrair informações sobre o desempenho do sistema em cenários normais de uso; o teste de carga busca extrair informações sobre o volume de usuários, transações, etc. que o sistema suporta; o teste de estresse busca extrair informações sobre quando o sistema não suporta a carga aplicada, sendo muito importante para saber estruturar e dimensionar a arquitetura do sistema e prover informações para escalar o sistema; o de usabilidade procura verificar se a interface de usuário é fácil de aprender e utilizar; o teste de segurança visa verificar se o software é seguro em garantir o sigilo dos dados armazenados e processados.

Exemplo de ferramenta para testes não funcionais: JMeter.

Classificação quanto à Técnica de teste

  • Testes Caixa Preta

Estes testes buscam verificar se as saídas do sistema estão coerentes com as entradas, sem se preocupar como elas são tratadas internamente. As principais técnicas são:

Partição de equivalência;
Análise de Valores Limites;
Derivados de especificação;
Baseado em estado-transição.

  • Testes Caixa Branca

Estes testes, chamados também de Testes Estruturais, se preocupam em avaliar aspectos internos do sistema. Para isso, utilizam técnicas de inspeção de código tais como: teste de condição, teste de fluxo de dados, teste de ciclos, teste de caminhos lógicos, códigos nunca executados.

Existem várias ferramentas para ajudar a aplicar estas técnicas de testes: FindBugs, PMD, Lapse, etc.