Off-Topic: Método Científico vs Cargo Cult

2008 December 16, 13:51 h

Depois de vários anos percebo que um grande número de programadores simplesmente não entende o Método Científico. Atualmente discutimos bastante sobre agilidade, sobre como fazer testes, TDD é importante. Em “testes” existe algo que deveria ser óbvio mas parece que não é. Existe um passo que considero muito importante que é a experimentação.

Da mesma forma como muitos usam “falta de tempo” como desculpa para não fazer testes, a mesma desculpa é usada para não testar hipóteses via experimentação (a maioria sequer entende que deveria estar experimentando hipóteses). O que estou falando aqui é sobre criar provas de conceito, “pedaços” do que você quer desenvolver que potencialmente será jogado fora. O “jogar fora” é a parte que deixa os programadores (e os gerentes) arrepiados. “Mas isso é perda de tempo, trabalho jogado fora! Inaceitável!”. Esse pensamento faz as pessoas pensarem que toda linha de código escrito necessariamente precisa estar na aplicação.

Novamente, é o errôneo pensamento que precisamos acertar tudo da primeira vez, a cultura de que tentativa-e-erro é errado. Pois bem, estou aqui dizendo que errado é pensar que sempre vamos acertar da primeira vez. Na maioria dos casos vamos errar todas as primeiras vezes.

Cargo Cult

Depois da Segunda Guerra, tribos aborígenes religiosas do sul do Pacífico construíam réplicas de aviões e pistas de pouso militares na esperança de chamar novamente os “aviões-deuses” que lhes trouxeram tantas cargas maravilhosas durante a guerra . É exatamente o que a maioria dos programadores costumam fazer: como que num ritual incluem diversas estruturas de programação sem entender muito bem porque estão fazendo isso, apenas sabem que “deveriam”. São os programadores que tentam encaixar Design Patterns em lugares desnecessários, colocam comentários em código que por si só já é auto-explicativo. Recentemente são os tipos que praticamente se ajoelham perante “Dependency Injection” sem realmente entender porque. (fonte: Wikipedia)

Ser modista não é algo ruim como muitos pensam, o ruim é simplesmente aplicar as coisas (novas ou velhas) sem entender a razão. O que ensinam na escola hoje em dia? A principal função da educação deveria ser o raciocínio, mas numa cultura educacional baseada em decoreba, as pessoas simplesmente aceitam tudo que decoram e não sabem bem sequer porque decoraram, simplesmente que “alguém superior” disse que aquilo é verdade e, “portanto”, deve ser aplicado.

Lembram das discussões sobre porque certificações são nocivas? Este é um dos motivos. Para os que já são racionais, claro, não faz diferença nenhuma. Mas para uma grande massa de pessoas que não raciocinam, o resultado final é simplesmente cargo culting.

A maioria das pessoas lê tutoriais, alguns livros, assiste alguns workshops e já acham que estão aptos a executar a tarefa. Na maioria dos casos simplesmente executam o bom e velho “copy e paste” mental. Cospem na aplicação todos os códigos que aprenderam. Eu já vi quem escrevesse algo assim:

1
2
3
4
5
if ( a == b ) {
        return true;
} else {
        return false;
}

Nada de errado nisso, mas é incrível como muitos ficam surpresos quando dizemos que a linha seguinte faz a mesma coisa:

1
return (a == b);

Em si, esse pequeno código é inofensivo. Mas perceba a sutileza: o programador não sabe porque está fazendo isso. Apenas sabe que tem que fazer. Quer algo pior? Já vi (em diversas linguagens), programadores que fazem o seguinte:

1
2
3
4
5
6
7
8
9
10
11
$dbname="meu_banco";  
$chandle = mysql_connect("localhost", 'root', 'root') or die("Falhou");
$query1 = "select * from tabela";
$result = mysql_db_query($dbname, $query1) or die ("Falhou");
while ($row = mysql_fetch_row($result)) {
        $field = mysql_fetch_field($result, 1);
        if ( $field == 'foo' ) {
                echo "encontrei!";
                break;
        }
}

Esse é o típico What the F*ck!?

Novamente, um código que “executa”. Em algumas linguagens, esse seria um tipo de código que “compila”, sem problema nenhum. Porém, quem não entendeu o problema gravíssimo desse código, precisa retornar ao primeiro ano da faculdade.

Cegueira

“Repita uma mentira por tempo suficiente e logo ela se torna verdade.”

Existem muitos livros ruins, tutoriais ruins, professores ruins e toda corja de maus elementos que disseminam más práticas. Porém, a maior culpa é de quem se deixa enganar. Pessoas que simplesmente aceitam tudo que lhe dizem, sem o mínimo de ceticismo, são culpadas pela própria ignorância.

É exatamente porque até hoje temos horóscopos impressos nos jornais em vez de uma coluna científica: porque existem muito mais leitores interessados em se enganar do que em saber coisas chatíssimas, como a realidade.

Em tecnologia é a mesma coisa:

Todos tem centenas de idéias pré-concebidas como essas. Coisas que ouviram de alguém ou leram em algum lugar (normalmente de reputação duvidosa) e agora simplesmente passam a repetir estupidamente sem absolutamente nenhum argumento que sustente suas crenças. Ou melhor, essas pessoas acham que a fonte de onde tiraram isso (a tal fonte duvidosa) é base suficiente para continuar repetindo.

Em programação ou em qualquer outra área social: se você tem qualquer crença que não consegue argumentar (e sustentar o argumento), pesquise melhor. Se sua crença não se sustenta perante argumentos em contrário, jogue-as fora, pois não lhe servem de nada. Todo mundo se acha “mente aberta”, eu discordo, a maioria é bastante fechada. Se duvida disso, repense em tudo que acredita e argumente-se contra você mesmo. Se fizer direito vai notar que a maioria das coisas em que acredita simplesmente não tem fundamento.

Método Científico

Uma pessoa cuidadosa precisa praticar o básico do método científico diariamente. Nosso dia-a-dia é uma sequência de tomadas de decisões, algumas pequenas, outras enormes. Decisões nunca devem ser tomadas por base em idéias pré-concebidas. É onde acontecem os erros.

Não quer dizer que a intuição não deva ser usada. Porém, intuição é uma conclusão rápida baseada em experiência. Se suas experiências diárias foram metodicamente racionais por muito tempo, sua intuição tende a ser mais sólida. Mas se suas experiências diárias são baseadas em superstições, simpatias, pseudo-ciência, cargo culting e idéias pré-concebidas, sinto lhe dizer: sua intuição é uma droga.

Leia esta definição da Wikipedia. É extensa, completa e requer um bom tempo de reflexão. Porém, o que mais me interessa está resumido aqui.

Como todo bom processo, esse também é iterativo, ou seja, ela prevê um retorno de etapas para refinar o conhecimento.

Os passos são bem simples e podem ser executadas rapidamente ou podem ser mais demoradas e detalhadas. O importante é: de face a uma questão, execute esses passos pelo menos mentalmente. É o mínimo do mínimo para se tomar uma decisão educada.

Pessoas

A maioria das pessoas pode ser definida da seguinte forma:

Acho que tudo isso é mesmo consequência da falta de prática das pessoas em raciocinar. É um comportamento irracional, complicado demais, cheio de erros básicos mas que por alguma razão ninguém acha que está errado.

Lembro de um documentário do bom e velho Richard Dawkins onde ele fala sobre um cientista que passou anos estudando uma teoria (não lembro qual). Daí um outro jovem cientista o provou errado. Ele olhou para o jovem e disse algo como “muito obrigado”. Esse é o comportamento racional. É muito difícil provar alguma coisa como verdadeira, é mais simples provar que é falsa. Se alguém o provar falso, agradeça, isso está efetivamente evitando que você perca tempo futuro, o que é importantíssimo!

E sempre que entrar num novo projeto, não assuma que você sabe o que precisa fazer, ou mesmo que “precisa” saber o que fazer. Assuma que você não sabe! Crie hipóteses, discuta, experimente, ganhe segurança real e só então faça o que precisa ser feito. Não há nenhum problema nisso. O problema é assumir que você sabe o que vai fazer e depois de desperdiçar o tempo de todo mundo, finalmente ficar evidente que estava errado o tempo todo!

Não desperdice o tempo dos outros!

Referências:

Eu repito várias vezes que eu não sei o que é verdade. Respondo “não sei” toda vez que me fazem algum tipo de pergunta esperando uma resposta absoluta. “O Rails vai vingar?” Esqueçam esse tipo de pergunta: prever o futuro é difícil. Se alguém lhe dá uma previsão de futuro, ignore! É muito provável que ela não tem nenhuma idéia do que está falando.

Parte desse tipo de pergunta é o comportamento que falei acima de que as pessoas acham que precisam acertar sempre e não gostam de ser provadas erradas. Na pior das hipóteses, o caminho que você tomou para se provar errado lhe deu mais conhecimento e experiência. Isso é mais importante do que encontrar uma verdade.

Eu já falei sobre Razão em alguns outros posts como:

Conclusões

Meu objetivo neste post é tentar aprimorar a importância da experimentação. Eu não sei a verdade, qualquer um pode postar um comentário aqui com dezenas de argumentos em contrário. Essa pessoa estará perdendo o foco aqui (e certamente seus “argumentos” serão apenas citações de idéias pré-concebidas). É irrelevante tentar pegar detalhes no texto e demonstrar erros. O importante aqui é que o profissional precisa entender que idade, quantidade de anos numa área, certificações/carteiradas são completamente irrelevantes na hora de se resolver problemas. No final somos todos amadores e, como tal, precisamos voltar ao zero e rever nossas hipóteses.

Um exemplo prático: quando conversei com John Straw (YellowPages.com) em São Francisco, uma coisa que eles fizeram que nem toda equipe faz foi um extenso due diligence. Eles levaram 22 meses para criar o projeto original do YellowPages.com em Java. Resolveram parar por 4 meses, criar protótipos, provas de conceito, testar hipóteses (Qual framework usar, Rails, Django ou Seam? Qual arquitetura usar? SOA, EJBs, etc? Quanto tempo leva para a equipe se acostumar à nova tecnologia?) e só depois que ganharam segurança no que estavam fazendo, começaram a implementar de verdade. Daí foram apenas mais 4 meses para terminar. Entenderam? Os primeiros 4 meses não foram perda de tempo: foi um “seguro”, uma maneira dos 4 meses seguintes não se tornarem 20.

Como eu disse ano passado: “Seja Arrogante, mas mereça ser arrogante!”. Seja arrogante para si mesmo a ponto de questionar você mesmo e realmente ganhar! Você pode enganar os outros, mas enganar a si mesmo não tem muita vantagem. Não existe melhor inquisitor para você do que você mesmo. Se estiver errado, excelente! Um caminho errado a menos: procure outro e comece novamente.

Repetindo: não foi com idéias pré-concebidas que chegamos à Lua.

tags: off-topic principles science career

Comments

comentários deste blog disponibilizados por Disqus