KISS - Keep it simple, stupid!

KISS – O Retorno!

postado por Marcus Vinicius em 02/07/2009 11:57:14
Não há tags para este post

Eai galera!

Nos ultimos dias enfrentamos turbulências na realização da mudança do nosso servidor, cache do WP, e outras azias aleatórias .

O KISS ficou zuadão, mas agora (de acordo com o Bodão) está rodando normalmente:

Hj eu botei um sistema de cache de macho nele… agora eh cache de banco de dados, e nao cache de pagina completa… a separacao de contexto conteudo estatico e conteudo gerado por consultas eh bem mais interessante, gasta menos espaco em disco, menos processamento, e tudo acaba realmente ficando mais rapido…

Bom… sendo assim, gostariamos de deixar aqui nossas sinceras desculpas pelos transtornos =D

[]’ss

Topo

Sem comentários

Ajudando a melhorar a qualidade do PHP

postado por Fabrício Ferracioli em 17/06/2009 09:23:41
Tags: ,

Vocês já devem ter percebido através dos posts do blog que damos grande importância para os testes de software. As razões para isso são diversas, mas certamente a principal está relacionada a confiabilidade.

Nossa linguagem de programação preferida, o PHP, sempre sofreu diversos ataques com relação a esse aspecto, normalmente comparado a outras linguagens de programação como Java, Python, Ruby e até C++. Não que ele seja uma linguagem imaculada, mas não é limitado ou ruim como muitos dizem por ai.
Se vocês acompanham o desenvolvimento da linguagem, devem saber que a versão 5.3 está quase saindo do forno, e vem com várias promessas bastante promissoras.

Uma delas, que acredito que seja uma das melhores iniciativas desse release, é o PHP Quality Assurance. O PHP QA é uma iniciativa de um grupo de desenvolvedores que deseja ajudar o grupo principal de desenvolvimento do PHP, melhorando a qualidade da linguagem. Entre as estratégias e objetivos, temos diversas iniciativas associadas a testes automatizados, análise e reporting de bugs.

Só que uma das partes mais interessantes ainda não foi mencionada. Se você se preocupa com a qualidade da sua linguagem de programação preferida e gostaria de ajudar ela a melhorar, agora você tem mais uma maneira de fazer isso! Você quer saber como?
Agora você pode escrever testes para o PHP!
E não é só isso! Agora você também pode acompanhar o andamento dos testes existentes e o code coverage para cada versão. Outro modo de ajudar é testanto a compilação dos Release Candidates atuais.

Não conheço nenhuma iniciativa semelhante por parte de outras linguagens de programação, alguém sabe de alguma?
Essa talvez seja uma das grandes vantagens do PHP com relação a outras linguagens de programação, o tamanho da comunidade e a abertura dada para que ela possa contribuir.
Agora ninguém tem desculpa pra não ajudar o PHP a se tornar uma linguagem de programação cada vez melhor. E quando vocês ouvirem que ele é uma linguagem não confiável, já sabem aonde recorrer para provarem o contrário.
Good coding!

Topo

2 Comentários

3 benefícios da Automação de Testes

postado por João José Pedrini em 28/04/2009 04:43:48
Não há tags para este post

Recentemente encontrei um site muito interessante de desenvolvimento de testes automatizados, o site dispõe de diversos assuntos importantíssimos para quem quer aprender e se aperfeiçoar em desenvolvimento de teste. Lendo alguns textos, fiquei com vontade de comentar aqui o “Goals of Test Automation”. O capítulo enumera 6 grandes objetivos para se ter sucesso no desenvolvimento de testes unitários e testes de aceitação, não explicando como alcançá-los.

Tive a idéia de escrever aqui uma releitura do texto utilizando os 3 primeiros grandes objetivos como motivações, benefícios que os testes podem trazer para o projeto. A idéia é plantar uma semente naqueles que ainda não acreditam nos testes, tentar mostrar que, quando bem implantado, os testes são valiosos.

1- Melhoria da qualidade

Antes de falar sobre como o teste pode ajudar na melhoria da qualidade, temos que entender o que significa qualidade de software. O autor foi muito feliz quando dividiu o definição de qualidade em dois tópicos: o software foi desenvolvido corretamente? desenvolvemos o software certo?

Quando desenvolvemos testes, buscamos sempre pensar em qual o comportamento que nosso código deverá ter em diversas situações.  Se conseguirmos escolher corretamente as situações que correspondem o que o cliente precisa e reproduzirmos estas situações nos testes automatizados, teremos certeza que os comportamentos serão atendidos e que estamos no caminho certo. As ferramentas de testes de aceitação são ótimas para atingirmos este objetivo.

Desenvolvendo que é realmente necessário, devemos garantir que o software realize corretamente os comportamentos. Nosso código deve estar livre de qualquer Bug. Testes unitários são ótimos para encontrar Bugs e prevenir que eles retornem. Quando um teste falha, a suíte nos indica precisamente o local que ocorreu o erro, nos dando informações valiosíssimas para concertamos o problema. Isto em questões de segundos.

As vezes, o Bug é descoberto quando o sistema está em produção, nestes casos o estrago provavelmente já deve ter ocorrido. Mas a automação ainda pode ser útil, temos a possibilidade de criar a reprodução do problema com um teste (Regression Test) e, assim prevenir,que o Bug retorne em futuras modificações.

Vale comentar que desenvolver teste é como desenvolver código, da mesma maneira que podemos cometer alguns enganos na programação de uma função, os testes também sofrem este problema. A diferença é que sem testes, o tempo e custo para encontrar estes enganos seriam muito maior.

2- Entendimento do Sistema

Quem estuda metodologia ágil deve conhecer o manifesto que prega, entre outros,  “código funcionando mais que documentação”. É com esta filosofia que digo: Uma suíte de testes é ‘n’ vezes mais valiosa para o entendimento que qualquer documentação.

O primeiro benefício é que os testes não ficam “desatualizados”, eles correspondem fielmente o que o código realiza. A documentação de um sistema é um custo para o projeto que, quando o prazo está curto, o sistema está com bug e o orçamento está no fim, a primeira atitude dos desenvolvedores é cortar esse peso. Uma documentação desatualizada é pior que não ter documentação. Testes e código não mentem, eles são, até certo ponto, exatos.

Temos que lembrar também que testes são códigos, e nós somos autores de códigos. Nós sabemos ler e escrever código, não documentação. Isto leva àquela velha história de comunicação, onde um desenvolvedor, ao escrever a documentação, não consegue expressar o que o código reproduz e escreve algo que não condiz com o sistema, seu colega, como muitos analfabetos funcionais, não interpreta corretamente o que o primeiro escreveu e entende algo totalmente diferente que realmente o código está fazendo. Resumindo, uma grande piada, que para o cliente é de extremo mal gosto.

3- Redução de Riscos

Uma das grandes vantagem dos testes é a criação de uma rede de proteção. Esta rede te dá liberdade para evoluir o sistema sem medo de ser feliz. Já comentei sobre desenvolvimento confiante aqui no blog. Com uma rede de proteção podemos nos prevenir de bugs já conhecidos, mexer em códigos legados e adicionar novas funcionalidades sem medo, pois sabemos que tudo que fazemos, temos os testes para verificar se estragamos algo. É isto que chamamos de Risco Calculado.

Os outros 3 grandes objetivos citado pela fonte diz mais a respeito dos testes em si, algo que deixarei para comentar em uma outra oportunidade. Meu foco foi trazer para vocês os que os testes podem fazer pelo sistema, os benefícios que recebemos quando desenvolvemos testes automatizados de forma correta. Fica o convite a todos para lerem o texto original, tenho certeza que não se arrependerão.

Topo

Sem comentários

Apresentação introdutória sobre PHP e CakePHP

postado por Fabrício Ferracioli em 22/04/2009 13:13:37

Na última sexta-feira, 17/04, participei como palestrante de uma das etapas do processo seletivo da Empresa Júnior de Computação (Cop-Jr) da Universidade Estadual de Londrina (UEL).
Para quem quiser ir direto para os downloads, use a âncora.

Durante três dias foram abordados os assuntos:

Fui o palestrante do último dia, falando sobre PHP e CakePHP. Visto que o grupo de inscritos era em sua maioria do primeiro ano do curso de Ciência da Computação, o conteúdo dos slides é bem introdutório. Procurei focar em conceitos e boas práticas, já que eles ainda vão aprender a programar.
Como exemplo, desenvolvi o blog do tutorial do CakePHP, onde é possível mostrar vários conceitos para quem está começando. Logo depois disso o Lucas acabou com minha apresentação, mostrando o Scaffolding….
Assim não vale, os caras tem que sofrer pelo menos um pouco!

Espero que eles tenham aproveitado e aprendido, e peço para quem tiver sugestões enviar nos comentários.
E sejam bem vindos, novos padeiros!

A apresentação está no formato odp, pra quem não tiver o OpenOffice, segue o link para download.
Apresentação processo seletivo da Cop-Jr
Blog desenvolvido em PHP puro e CakePHP

Topo

Sem comentários

jshash – Implementando um Hash em JavaScript

postado por Gabriel Gilini em 21/04/2009 03:42:14
Tags: ,

Recentemente escrevi algum código javascript que realizava algumas requisições, e a fim de não buscar informações redundantes, armazenava um cache desses dados que chegavam. Simplificadamente, algo como:

var cache = {};
 
function buscaEProcessaDados(id){
	var dados;
	if(!cache[id]){
		// faz a requisição e retorna dados
		cache[id] = dados;
	}
	// Processa
}

E estava funcionando tudo bem. Mas pensando bem, isso não está muito seguro. Vamos supor que outro script na página execute o seguinte código:

Object.prototype.foo = function(){alert('te peguei!')};

e eu quisesse buscar algum dado que tenha id = foo.

buscaEProcessaDados('foo'); // :(

Mesmo não havendo nenhum dado armazenado na propriedade 'foo' daquele objeto cache que foi criado vazio mais acima, o teste

!!cache[id] //-> true

será interpretado como true, já que o JavaScript encontrará essa propriedade ao subir a cadeia de prototypes (escreverei sobre isso em breve) em busca de algo com nome 'foo'.

A maneira que encontrei para resolver este problema foi implementar um hash simples, com métodos de put, get e remove. O objeto que conterá as propriedades fica inacessível para código fora do objeto construído e as chaves são concatenadas a uma string gerada a partir do timestamp no momento da instanciação.

function Hash(){
    var _hash = {};
    var pre = '__' + (new Date()).getTime() + '__';
 
    function put(key, value){
        _hash[pre + key] = value;
        return this;
    }
 
    function get(key){
        return _hash[pre + key];
    }
 
    function remove(key){
        delete _hash[pre + key];
    }
 
    return {
        'put': put,
        'get': get,
        'remove': remove
    }
}

Utilizando o Hash, nosso código anterior fica assim:

var cache = new Hash();
 
function buscaEProcessaDados(id){
	var dados,
cached = cache.get(id);
	if(!cached){
		// faz a requisição e retorna dados
		cache.put(id, dados);
	}
	// Processa
}

e mesmo que a propriedade 'foo' esteja sendo herdada do Object.prototype, podemos ficar seguros que ela não interferirá em nossa hash:

typeof cache.foo == 'function' &&
typeof cache.get('foo') == 'undefined'; //-> true

É claro que esta Hash é bem primitiva e muitos métodos ainda podem ser implementados. Ainda assim ela funciona perfeitamente para propósitos simples como o demonstrado acima.

Como de costume, o código está hospedado no GitHub, e o download pode ser feito aqui.

Topo

Sem comentários

Plugin Manager – Gerenciando os plugins de sua aplicação de forma ágil

postado por Marcus Vinicius em 06/04/2009 15:38:16

Já tinha visto muitas vezes o João José reclamando que não tinha um gerenciador de plugins feito o do rails… Inclusive, havia até postado aqui no KISS uma idéia que tinha encontrado no blog @TheKeyBoard

A idéia é bem interessante, porém existe apenas um repositório centralizado, que o próprio desenvolvedor mantém.

A partir disso, surgiram nossas primeiras divagações:

  • Por que nao possibilitar que cada usuário possa manter seu próprio repositório?
  • Podíamos possibilitar a criação de um script de instalação/desinstalação?
  • E se existisse um jeito de especificar as dependencias, e elas serem automaticamente resolvidas?
  • Pouts! Mas se eu não quizer manter um repositório só pra poder guardar um link pra um plugin?

Assim surgiu o Plugin Manager, que ainda está em fase de implementação… Mas creio eu que está completo o suficiente para ser usado, testado, e também para que novas idéias surjam, não só nossas, mas de todos aqueles que se interessarem pelo projeto.

Botando pra Quebrar

Dentro da pasta APP/plugins/ execute:

git clone git://github.com/lucius/plugin_manager.git

pronto!

cake/console/cake -app SUA_APLICACAO plugin

Agora é só seguir as instruções

Plugin Manager em funcionamento

É sempre bom lembrar que o projeto está hospedado no github e que qualquer pessoa que deseja fazer modificações pode ficar a vontade para tal…

Topo

3 Comentários

WordDefinator e a criatividade na computação

postado por Fabrício Ferracioli em 13/03/2009 15:50:11

Trabalhos de faculdade normalmente são aquela coisa acadêmica, com embasamento em situações comuns e já documentadas e não muito desafiadores. Tudo bem diferente do “mundo empresarial”. Mas, como vale nota todo mundo acaba fazendo. Quando se tem a oportunidade e liberdade de escolher o que deseja fazer num trabalho de faculdade vemos idéias interessante surgirem de mentes sedentas por liberdade. Acredito que esse exercício de criatividade também é muito importante na formação acadêmica, mesmo na ciência da computação, que apesar de ser uma ciência exata necessita de criatividade, principalmente porque deveríamos ser guiados a uma formação para resolução de problemas.

Uma das oportunidades que tive durante o último ano foi na disciplina de Linguagens de Programação, onde deveríamos implementar qualquer coisa numa linguagem a nossa escolha. Sobre a linguagem escolhida deveriamos também apresentar nossas conclusões acerca do projeto da linguagem. A aplicação desenvolvida pelo grupo em que estava, chamada WordDefinator (by Organizações Tabajara), é um script em Javascript que ao ser acionado, com tecla F8, ignora palavras comuns e transforma as outras em links. Ao clicar numa delas será aberto um frame com a definição da palavra, sendo possível escolher como fonte a wikipedia (pt, en), dicionário michaelis e, se a palavra for da língua inglesa, será possível procurar sua definição no dictionary. Para desativar a aplicação e ter o site com seu conteúdo original, basta apertar ESC.
Não era uma aplicação incrível, mas foi interessante notar a reação das pessoas a esse trabalho e aos outros apresentados pelas outras equipes. Um dos grupos fez até um browser utilizando Qt 4. Todos que perguntavam realmente tinham interesse no assunto, ou tinham visto algo que se aplicava a situações que elas passavam.

Não era esse o final pretendido para esse post, mas esse exemplo só confirma o que o Ricardo postou essa semana sobre educação em seu blog. Também na computação, criatividade é tão importante quanto saber programar ou descobrir a complexidade de um algoritmo de ordenação. E vocês, tem a mesma opinião?

Obs.: Como o Lucas reclamou enquanto eu estava escrevendo o post, ele também fazia parte do grupo que implementou o WordDefinator, e ele diz que foi o que “mais implementou”…

Topo

1 Comentário


souÁgil