A arte da Programação Orientada à Gambiarra
Como garantir que o inferno seja uma amostra grátis do seu trabalho!
Para quem não me conhece:
- Josenaldo de Oliveira Matos Filho
- Jugleaders no UaiJUG - http://uaijug.com.br
- Há mais de 10 anos é transformando cafeína em código fonte
- Viciado em vícios viciantes: café, livros, jogos, podcast, música, filmes...
Agenda
O que é POG
Histórico
Requisitos
Princípios
Técnicas
Gambi Design Patterns
É só fazer do jeito que eu to falando que entregamos na data correta.
Diretor TI POG sobre projeto com tempo recorde!
O que é POG?
Paradigma de desenvolvimento de software no qual se utiliza um improviso planejado temporário permanente na resolução de um problema.
Tende a gerar mais problemas do que resolve.
Emprego garantido!
A culpa é do Hardware!
Desenvolvedor de software sobre POG
Histórico da POG
A primeira POG da história foi criada pelo Paga Gregório XIII
- Nosso calendário: 365 dias
- Translação da Terra: 365,25
- Problema: 6 Horas a mais por ano!
- Resolução: um dia a mais a cada 4 anos!
29 de Fevereiro – Dia Internacional da POG
O Papa é POG
Engenheiros do Hawaii sobre POG
Requisitos para se usar POG
- Pessoas não qualificadas se intrometendo no desenvolvimento
- Equipe apática
- Profissionais superestimados
- Prazos absurdamente suicidas
- Aproximação do fim do expediente, férias, feriado ou fim de semana
java.lang.NullPointerException
Java sobre POG
Requisitos para se usar POG
- Churrascos!
- Sistemas originalmente mal projetados
- Aparecimento caótico de requisitos
- Processo Go Horse!
- Ausência de café
Eu fiz somente o que foi especificado!
Analista, especialista no processo Go Horse
Princípios da POG
Enjambração Criativística
Use o código do sistema financeiro para criar o sistema de EAD.
Reflexão Reprodutória
Cópie o código da biblioteca XYZ. Ninguém vai notar.
Redireção Tangencial
A culpa não é minha!
Se compilou é porque funciona!
Você, ao fazer POG
Princípios da POG
Insistimento Determinante
Compila de novo que dessa vez vai dar certo.
Onisciência Finita
Não precisa fazer curso. Usa o que você já sabe.
Imperativo Funcional
O importante é funcionar!
Esta é a solução ótima, não temos tempo para isso. Faça a solução boa! O ótimo é inimigo do bom.
Líder de Projeto sobre POG
Princípios da POG
Proatividade Egocêntrica
Vamos fazer do meu jeito!
Devaneio Entusiasmado
Lady Murphy? Balela! Faz desse jeito que nada vai dar errado.
Foco Morcegativo
Depois eu faço isso!
É fácil, não vejo dificuldade em fazer isso!
Gerente sem-noção definindo prazo junto com o POGgramador
Princípios da POG
Documentação Espartana
Comentários são para amadores!
Economia Linear
Menos linhas é sempre melhor!
Criptocodagem
1337 h4x0r5 dud3 lol
Reza e cruza os dedos que vai funcionar!
POG Pai de Santo falando para um POGramador menos experimente...
Princípios
Abstração Ignorancial
Esqueça o tratamento de erros. Depois cuidamos disso.
Criatividade Diversificativa
Se alguém já usou uma solução, faça diferente.
Simplicidade Indolente
Se tá funcionando sem isso, pra que colocar?
Vai programando aí que eu vou ver o que o cliente quer
Gerente sem-noção sobre POG
Técnicas de POG
The ninja POG!
Zipomatic Versioning
Precisa guardar versões?
- Use arquivos ZIP!
- NomeDoProjeto_data.zip
- Pasta de zips compartilhada
- Funciona e não dá dor de cabeça
NUNCA USE
- Ferramentas de versionamento
- SVN é coisa do diabo
- Git nem o diabo quer
Na minha máquina funcionou
POGramador sobre POG
Incremental Patching Debug
A versão atual parou?
- Pegue o zip com a versão antiga
- Começa tudo de novo
- Substituição de arquivos é suficiente
NUNCA USE
- Depuração
- Versionamento
- Testes automatizados
- Revisão de código
Limpa o histórico e o cache e dá um [Control + F5] que funciona
Resposta padrão do Webmaster sobre POG
My Precious
Querem alterar seu código?
- Não permita!
- Ninguém pode entender seu brilhantismo nato
- Só você mexe no seu código
- Só você entende seu código
- Imperativo Funcional!
NUNCA USE
- Programação em par
- Revisão de código
- Código compartilhado
- Versionamento distribuído ou centralizado
Ontem tava funcionando!
POGramador dando uma descupa sobre POG
Psychoding
Não sabe como fazer algo?
- Abra sua mente espiritual (seu navegador)
- Acesse o nirvana do conhecimento (Google)
- Deixe-se vagar pelas espirais da consciência coletiva (fórunse StackOverFlow)
- Seja inundado pela inspiração divina (copia o que achar)
- Não procure entender a solução
NUNCA FAÇA
- Estudar
- Participar de comunidades
- Aprender novas tecnologias
- Coding dojo
- Hackathon
- Ler
Não me interessa se é restrição da ferramenta, dá um jeito e coloca isso funcionando até amanhã!
Gerente de Projeto mostrando como se lidera a equipe a criar uma POG
Gambi Design Patterns
May the POG be with you!
WTF / WTH / QPE
- Sabe aquele código que você sabe que funciona, mas que, pra você, parece magia negra?
"/ .*?< ".replaceAll("","").trim();
É só colocar um IF!!
Gerente sem-noção sugerindo a solução técnica
RCP Pattern ( Reuse by Copy-and-Paste )
- Copie o máximo de código que puder: Princípio da Reflexão Reprodutória
- A baixa adaptabilidade e difícil manutenção tornam o programa mais estável
- Se precisar alterar, copie e cole de novo!
Tive que arrumar direto no banco - daí funcionou! Se o problema "voltar", nos ligue novamente.
POGger sobre O Poder da Fé.
Hardcoded data
- Um dos padrões mais usados na indústria
- Não coloque dados em arquivos e bancos de dados
- Dados devem ficar diretamente no código
- É muito mais performático
//Xunxa o nome da impressora no código. Quem quer escolher impressora?
infoImpressao = ImpressaoUtils.getInfoImpressao(codigoRelatorio, "PADRAO");
É só gerar tudo de novo, provavelmente deu erro na especificação.
POGgramador com sua desculpa POG para o problema
FORCEPS
- Por algum motivo nefasto, uma variável não recebe o valor que deveria ter. O que fazer?
- Vai deixar esse pedaço de sucata pré-positrônica comandar sua vida?
/* Variável é inicializada */
String valor = "123";
/* ... lógica do programa ... */
/* Dentro de um método que utiliza a variável 'valor' */
if (valor != "123") {
valor = "123";
processaValor(valor);
}
O código tá certo, deve ser problema na massa de dados.
POGgramador Experiente, com várias certificações em POG
Ostrich Syndrome Skill
- O que os olhos não veem, o coração não sente
- IGNORE qualquer Warning do compilador e da IDE
- Isso é frescura deles
- De preferência, use o @SuppressWarnings("all")
Terminei, só falta testar.
POGgramador, às 18h00, com a mochila nas costas, falando pro chefe
Nonsense Flag/Nonsense Naming
- Pra que quebrar a cabeça para usar nomes óbvios? Isso é uma falha de segurança!
- Ignore qualquer convenção existente!
- Use nomes que não revelem o propósito do identificador
- Nomes perfeitamente aceitáveis como identificadores
teste1, temp2, a, b, x
jaTrocouDeAba, botaoClicado, foiAtualizado, passouPorAqui
numeroMagico, naoAchou, temErro
anterior5, atual5, anteriorDoAnterior5
É só reiniciar que funciona!
POGgramador logo de manhã com copo de café na mão
Commented Code Implementation / Comments Forever
- O programa está dando problema?
- Comenta que resolve! Aplique o Insistimento Determinante!
- A partir desse momento, o comentário vira parte do código
- Se alguém mexer, para tudo
Bom, deixa estourar a bomba lá, aí quando vierem me pentelhar aqui eu vejo o que faço...
POGgramador para outro POGgramador, só esperando o problema voltar
Reinvented Square Wheel Helper
- Se não lembra de como usar um recurso da linguagem, faça você mesmo!
if (number.equals("1")) {
return 1;
} else if (number.equals("2")) {
return 2;
} else if (number.equals("3")) {
return 3;
} else if (number.equals("4")) {
return 4;
} else if (number.equals(“5")) {
return 5;
} else if (...) {
...
}else if (number.equals(“10000000")) {
return 10000000;
}
Hmmm.. que estranho... Não era para acontecer isso...
Programador fazendo uma demonstração do software
You Shall Not Pass
- Capture e trate TODO tipo de problema que ocorrer
Que lixo que fizeram!!! Olha isso!!
POGgramador falando sobre o código de outro POGgramador
Perfectness Execution / BulletProof
- Garanta que qualquer operação complexa sempre execute com sucesso!
- O sistema não deve apresentar erros
try {
if (alterar(valor1, valor2)) {
return new Mensagem("Operação concluída com sucesso!");
} else {
return new Mensagem("Operação concluída com sucesso!");
}
} catch (Throwable e) {
return new Mensagem("Operação concluída com sucesso!");
}
...ah!!! Isto é um erro comum do Windows!
POGramador tentando ganhar tempo para corrigir seu código
Exception Success
- Use exceções para o controle de fluxo do POGrama!
public static void somar(int a, int b) {
System.out.println(a + b);
throw new RuntimeException("Operação realizada com sucesso!");
}
if (!request.getSession(true).getAttribute("TipoUsuario").toString().equals("1")) {
throw new Exception(
"Acesso negado:"
+ " somente usuários com perfil de "
+ "administrador podem ter acesso a esta página.");
}
Quando eu cheguei já tava assim!!!
Gambizeiro querendo tirar o seu da reta!
String Sushiman
- Ao invés de criar parâmetros, passe uma ou poucas strings!
- Crie quantas regras forem necessárias sobre essas strings!
public Tabela montaTabela(String linguicao){
String[] colunas = linguicao.split("|");
for(String coluna : colunas){
String[] campos = coluna.split(",");
// POGuices com os valores
}
}
Quando eu testei, funcionou!
POGramador demonstrando as gambiarras para seu Gerente Sem Noçao
Sleeper / Human Factor
- Se a ação é rápida demais para o usuário perceber, coloque um atraso!
public class MedidorDePOGresso implements Runnable {
public void run() {
while (true) {
// Realiza um processamento rápido aqui...
try {
// ... atrasa propositalmente aqui
Thread.sleep(1000);
} catch (InterruptedException exc) {
}
progress.setValue(blablabla.getPorcentagem());
}
}
}
Até ontém quando eu mexi estava tudo funcionando!
Resposta do POGramador ao ser questionado sobre a pane geral no sistema
Black Cat in a Dark Room
- Precisa usar vários parâmetros para um método?
- Use um MAP!
- Muito usado em PHP e em Java
- É o capiroto em forma de design pattern!
Tem bug, mas não é no código!!
Estagiário justificando os erros no programa para o gerente
Mega Zord
- Criar várias funções torna o programa mais lento.
- Crie uma única função guerreira que receberá todos os parâmetros e fará todas as funcionalidades possíveis
Claro que dá pra alterar essa configuração. É só mexer no código!
POGramador propondo uma POG ao gerente
Thunder Mega Zord
- A fusão entre um Megazord e um Gato preto em Quarto Escuro cria um Thunder Megazord
O Senhor já tentou reiniciar seu computador? Caso sim vou pedir que desligue seu modem e religue novamente...
Atendente da CTBC ou Velox utilizando técnicas de TelePOG
Thunder Mega Zord
/**
* Processa
*
* @param parametros
* @return
* @throws Throwable
*/
public static Object[] processar(Map parametros) throws Throwable {
// Aí é aquilo, mermão...
// ...
// ...
return processado;
}
Internet Explorer 7 ? Atualiza pro 8 que funciona
POGramador com esperança de que o sistema ainda irá funcionar
Controller Confusion
- Elimine o M do padrão MVC e coloque tudo no Controler
- Padrão VCC – “View/Controller Confusion”
- Os POGramadores mais avançados são capazes de ignorar o V e ficar apenas com o CCC –Chaotic Controller Confusion
Não se preocupe, nenhum sistema "entra redondo". O importante agora é entrar em produção, depois consertamos os erros!
Gerente sem noção tentando acalmar desenvolvedor sobre projeto MOG com prazo estourado.
No More Layers
- Frameworks e camadas são coisas para fracos
- Faça tudo diretamente na tela!
- Muito utilizado em .Net, Delphi e VB 6
- Também é bastante utilizado em PHP
- Uma variedade do CCC, mas com tudo feito na Tela
Deu erro...comenta!
Alunos descobrindo como fazer POG, na faculdade.
DB is our God
- Também conhecido como In DB we trust.
- Padrão gambi arquitetural em que TUDO é no banco de dados:
- Dados
- Arquivos
- Imagens
- Lógica de negócio
- Tratamento de erros
- Geração de HTML
É só um botão, o que pode dar errado?
Gerente sem-noção sobre nova funcionalidade
Conclusões Opinativas Completamente Irrelevantes
- POG é uma arte dominada por poucos
- Quanto mais experiente, menos POGramador
- Quanto mais conhecimento, menor a capacidade de POGagem
- Quanto mais disciplinado, menor a atração sobre POGs
Vou realizar os testes em produção
POGramador corajoso arrancando suspiros das mocinhas inocentes
Materiais que imitam ou se inspiram nesta apresentação
Contatos
- Email: josenaldo@gmail.com
- Skype: josenaldo.matos
- Twitter: @josenaldomatos
Mais uma pérola de sabedoria sobre POG
POGramador enfadado de aplicar a Reflexão Reprodutória.
Vida longa e próspera, jovens gafanhotos