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

  1. O que é POG
  2. Histórico
  3. Requisitos
  4. Princípios
  5. Técnicas
  6. 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

Paga Gregorio

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!

Tux POG Jedi

WTF / WTH / QPE

  • Sabe aquele código que você sabe que funciona, mas que, pra você, parece magia negra?

                        "/ .*?<  ".replaceAll("","").trim();
                    
wat

É 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

ATENÇÃO

POG is comming

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")
Warnings

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
Run you fools!

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!
Map com parâmetros é mochila de criança!

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
Robô do Spielvan

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
Robô do Spielvan

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

Magníficas oportunidades!