Cargo cult, eXtreme go horse e afins

Depois de alguns anos escrevendo código, e também, observando códigos de outras pessoas, meus códigos antigos e código legado percebi alguns comportamentos e padrões entre o aptidão e/ou tempo de experiência X design do código das pessoas.

Investigando esses padrões, consegui entender melhor os “porquês” da incidência, em projetos grandes e bem financiados, de fenômenos como Cargo cult, eXtreme go horse, programação orientada a gambiarra e afins.

Contextualizando – Cargo Cult, descrito por Steven C. McConnell no livro Code Complete, é o fenômeno cultural observado em tribos indígenas/aborígenes, durante a segunda guerra mundial, que envolviam impactos entre duas civilizações, sendo uma moderna em aspectos tecnológicos e outra primitiva. Durante a guerra, soldados americanos necessitavam pousar em ilhas desertas para recarregar combustíveis ou armar mísseis, entretanto muitas dessas ilhas visitadas eram habitadas por esses povos. Ao ocorrer o choque das civilizações, os primitivos imaginavam que os soldados, com todo seu aparato, fossem deuses. Depois da partida da civilização moderna, os indígenas costumavam fazer rituais em determinados períodos do ano com o intuito de invocar os supostos deuses soldados, mudando assim o comportamento cultural/religioso do local.

Ao trazemos esse conceito para computação temos situações clássicas que vivemos no nosso dia a dia, talvez a mais popular seja : Ao perguntar a um desenvolvedor/gerente/engenheiro: – Para que serve esse pedaço de código? Ele te responde: – Não sei, mas não mexe aí! Pode parar de funcionar! Em outras palavras o desenvolvedor possui um tipo de ritual para realizar determinadas tarefas, como inserir código legado, bibliotecas, classes que não necessariamente são úteis para a implementação do mesmo, acarretando a incompreensão sobre o sistema de forma geral.

Para falar de eXtreme go horse temos que esquecer de qualquer boa prática, Scrum, Kanbam, Pair Programming ou qualquer coisa que lembre engenharia de software, isto é, se focar em escrever código e vencer o prazo. Infelizmente é uma realidade triste do mercado, que muitas vezes pode indicar falta de comprometimento do time e falta de alinhamento de interesses entre equipe/empresa ou má gestão do líder.

A verdade é que o caminho para esses cenários(caóticos) são convergentes podendo ser resumidos em falta de maturidade da parte do líder ou desenvolvedor, insegurança, pressão, contratos com prazos irreais, falta de comprometimento da equipe, etc. Muitas vezes esses motivos também podem acarretar um efeito dominó, piorando a situação exponencialmente.

Claro, podemos determinar inúmeras hipóteses para a solução do problema de desenvolvimento de software, entretanto, é fato que a solução está bem longe de determinar metologias rígidas ou mudar conceitos das mesmas. Temos que ir além, precisamos mudar conceitos, quebrar paradigmas, criar um time com determinação e com aptidão, mensurar e explorar potenciais, trabalhar com dificuldades, amadurecer a equipe e acima de tudo cair na real.

#TGIF – Computação nas nuvens atrapalha?? #Humor

O BdB abordou nos últimos posts alguns assuntos relacionados com computação nas nuvens (aqui e aqui)! E para fechar esta semana com uma pitada de humor, vamos ver como a Computação Nas Nuvens também pode atrapalhar a vida de alguns! 😛

Agora você já pode acompanhar as novidades do BdB pelo Facebook, acesse e curta nossa página.

Testes de sistemas na nuvem

Recentemente participei do IV EBTS,  no qual participei como palestrante e com certeza, o tema mais falado neste evento foi cloud computing. Inclusive o palestrante mais aguardado do evento Profº Silvio Meira falou sobre este assunto e alertou que todos se preocupassem em se atualizar sobre o assunto na área de testes. Neste evento participei de um minicurso sobre Cloud Computing e o ministrante e meu amigo Elias Queiroga ,  abriu minha mente para essa área e me deixou bastante empolgado com os desafios que quero compartilhar com vocês.

Antes de falarmos sobre testes em sistemas na nuvem, precisamos entender alguns conceitos básicos sobre a mesma, e a primeira delas são os tipos de cloud que existem hoje e os principais tipo são IaaS (Infra-estrutura como serviço), PaaS (Plataforma com serviço) e SaaS (Software como serviço).

No IaaS utilizamos puramente a infra do servidor para a nossa necessidade, como exemplo armazenamento ou memória e processamento. Já no PaaS utlizamos alguma plataforma configurada no servidor, podemos citar diversos exemplos como Google App Engine, Windows Azure, etc. Por último temos o SaaS que simplesmente é o software em si que usamos na nuvem e não faltam exemplos como Google Docs, iCloud, Microsoft SharePoint Online, etc.

Algumas das características mais importantes na computação em nuvem são: segurança, performance, disponibilidade e escalabilidade. Notem que estas características não são tão triviais de serem testadas e precisam do suporte de ferramentas específicas, muitas delas até a infra-estrutura de hardware precisa ser investida para viabilizar os testes de alguns sistemas na nuvem.

Figura 01
Figura 01

Um exemplo claro que podemos dar de como testar um sistema na cloud é utilizando ferramentas como JMeter que simula o múltiplo acesso a um serviço na cloud. Como isso funciona ? A aplicação quando instalada e configurada para rodar numa única máquina, abre várias threads para acessar o sistema alvo de teste e validar a sua capacidade de atender as requisições (Figura 1). Caso o sistema falhe antes de atender a quantidade de requisições previamente definida, ai os desenvolvedores do sistema tem que prover alguma solução e provavelmente será a replicação do sistema internamente na nuvem e a inserção de um balanceador para direcionar as requisições para cada instância da aplicação, como mostra a figura 2.

Figura 02
Figura 02

E quando o sistema em teste tem como requisito uma capacidade de atender à uma quantidade de requisições maior do que a nossa máquina de teste é capaz de gerar ? Ai vem o caso no qual precisamos inverstir na infra-estrutura de hardware do nosso ambiente de teste para viabilizar a validação desse sistema na nuvem. Nesse caso podemos colocar mais máquinas no nosso ambiente de teste e configurar o Jmeter para gerenciar a geração de requisições paralelas por estas novas máquinas, com isso aumentamos a capacidade do nosso ambiente de teste para testar o sistema na nuvem. A figura 3 mostra uma máquina “chefe” que gerencia as requisições que são feitas por cada máquina “escrava”, e cada uma dessas máquinas por sua vez abre várias threads para gerar requisições ao sistema na nuvem.

Figura 03
Figura 03

Esse é apenas um exemplo de uma das características de um sistema na nuvem pode ser testada, existem diversas outras ferramentas com diferentes propósitos para validade esses sistemas. Para saber mais sobre computação na nuvem visite este site developerworks da IBM  e para se aprofundar em teste para computação na nuvem, este tópico sobre cloud testing na wiki é bastante relevante .