2024-06-22
Um documentário sobre o Dijkstra, chamado Discipline in Thought, me impressionou com uma ideia em particular. O Dijkstra diz que uma vantagem de escrever com caneta no papel em vez de usar processadores de texto digitais é que não podemos editar: só podemos escrever frases uma vez que já as tenhamos bem pensado. Claro que ele é contra o método iterativo, tão difundido no mundo anglo-saxônico, em que não nos preocupamos em fazer certo da primeira vez, mas apenas fazemos uma tentativa, observamos seus problemas, os corrigimos, gerando uma nova tentativa, e assim por diante até chegar no resultado que queremos. O Dijkstra advoga pela programação baseada em métodos formais (ver seu livro Discipline of Programming), onde o objetivo é justamente fazer tudo certo de primeira. Ele compara os dois métodos a Mozart e Beethoven, respectivamente.
Me pergunto então: qual dos métodos é melhor, o método Beethoven (iterativo) ou o método Mozart (fazer certo na primeira vez)?
Me proponho aqui a usar o método de Descartes para investigar a questão.
O método de Descartes consiste em: (1) dividir cada dificuldade encontrada em quantas parcelas forem necessárias, para que se possa analisar as parcelas; (2) pensar antes nas coisas mais simples para então montá-las em coisas compostas e mais complexas; (3) sempre enumerar ou listar o mais completamente possível, sem deixar faltar nada.
Olhando para a pergunta anterior fica claro o que devo fazer, segundo os três pilares do método cartesiano: devo separar a pergunta em seus elementos básicos, enumerando todos eles. Fazendo isto, fico com os três conceitos de “método melhor”, “método Mozart” e “método Beethoven”. Cada um desses conceitos deverá ser, recursivamente, analisado para chegar-se a uma maneira de decidir a questão.
O que quero dizer por método melhor? Aplicando novamente a maneira cartesiana de pensar, devo dividir essa ideia em seus aspectos, tomando cuidado em enumerar todos aqueles em que consigo pensar. Um método é melhor que outro dependendo da tarefa que se pretende realizar com um deles, e também dependendo dos critérios de performance na realização dessa tarefa que foram decididos pelo realizador, segundo seu propósito. Um método é melhor que outro, além disso, dependendo do contexto em que é aplicado.
No que o primeiro desses aspectos, a tarefa ou objetivo, influencia nossa avaliação da bondade (por falta de palavra melhor) de um método? Ora, um método pode ser mais adaptado que outro à tarefa, segundo um critério como a rapidez com que cumpre o objetivo. Por exemplo, digamos que nossa tarefa seja encontrar os dois dígitos mais significativos do produto de 4312 por 3997, e digamos que isso precisa ser realizado somente “de cabeça” ou com caneta e papel, sem artifícios mecânicos ou eletrônicos. O leitor que se lembrar do colégio e se por a calcular esse produto perceberá que, seguindo o algoritmo de multiplicação com papel e caneta que todos sabemos, só se chega à resposta que queremos no fim do cálculo, pois o algoritmo calcula primeiro o último dígito do resultado, depois o penúltimo, depois o antepenúltimo e assim por diante. Outros algoritmos de multiplicação são então mais adequados à tarefa de encontrar os primeiros dois dígitos da resposta, que são 1 e 7, se prezamos pela rapidez.
Não precisamos prezar apenas pela rapidez, é claro: um método pode ser julgado mais adequado a uma tarefa do que outro método segundo seu uso de quaisquer recursos além do tempo. Estes podem ser o espaço no papel, a memória do computador, o dinheiro que a execução do método nos custa, etc. Além disso, há critérios sobre a qualidade do resultado final, independentemente do processo que se usa para chegar nele.
O contexto também é importante. Acima eu falei em multiplicações de cabeça e com papel, mas a mesma tarefa (encontrar os dois dígitos mais significativos de um produto relativamente pequeno) pode ser-nos dada em um contexto em que temos acesso a máquinas. Isso mudaria totalmente as considerações. Estando garantido que qualquer calculadora ou computador é capaz de realizar o tal cálculo completo em frações de segundo, não precisamos escolher algoritmos que deem os primeiros dígitos primeiro: vamos tê-los todos, isso não importa. O importante torna-se decidir qual é o jeito mais rápido de aceder a uma calculadora, estando de frente a um computador. Isso será diferente segundo o sistema operacional da máquina, segundo os conhecimentos que temos do software instalado nela, segundo nossa habilidade com computadores e assim por diante.
E o método Mozart, o que é? Eu o caracterizei por “fazer certo de primeira” e “bem pensar a frase antes de escrevê-la”. A última dessas características poderia me levar a pensar que aquele que segue este método não apenas não publica um trabalho que não está pronto: ele sequer o transmite para o papel, sequer o permite sair da sua mente. E assim eu teria a impressão de que o método Mozart é quase inaplicável, porque seria o mesmo que tudo fazer “de cabeça”. Toda criança que vai à escola sabe quão mais difícil é fazer um cálculo aritmético de cabeça do que usar as ferramentas externas de pensamento: lápis e papel. E Feynman já nos disse que a caneta e o caderno não meramente facilitam a física teórica, eles a tornam possível. Então não posso me deixar levar por essa primeira interpretação do método Mozart.
Uma segunda ideia, que talvez faça mais justiça ao que Dijkstra tinha em mente, é a de que o seguidor do método Mozart separa claramente os conceitos de “compor” e “escrever uma partitura”. Enquanto o primeiro é a atividade na qual ele se concentra, o segundo é o mero ato físico de escrever a música no papel. Assim é também na programação: programar não é escrever código, é criar algoritmos e estruturas de dados. Um escritor de romances que segue do método Mozart separa plenamente as atividades envolvidas: ele concentra seu tempo em inventar personalidades, conflitos e ganchos, em estruturar seus capítulos e parágrafos, em escolher cuidadosamente o tom de cada frase; só depois de tudo isso, escreve.
O método Mozart, então, divide qualquer ato em duas partes: a fase de planejamento, que deve ocupar quase todo o nosso tempo, e a fase de execução, que deve ser trivial uma vez que o planejamento está bem feito. Além disso, este método nos proíbe de editar um trabalho executado. Afinal, se precisasse de edições não seria um trabalho finalizado e não deveria ter sido executado em primeiro lugar.
O método Beethoven, ou método iterativo, é simplesmente o contrário do método Mozart: consiste em não tentar acertar de primeira, mas simplesmente produzir algo, e consertá-lo repetidamente até que fique bom. Esse método consiste então na repetição de uma sequência de dois movimentos: a execução, que vem primeiro, e o conserto, que vem depois. Quantas vezes eles se repetem? Quantas forem necessárias.
O compositor que segue o método Beethoven escreve a partitura, a toca, faz modificações, toca de novo, e continua colando modificações à sua criação até chegar a uma melodia harmoniosa. O escritor de romances que segue o método Beethoven (como Stephen King) escreve, volta no dia seguinte com outros olhos para ler o que escreveu na véspera e fazer modificações, e assim por diante até ficar satisfeito com suas palavras. O programador que segue o método Beethoven escreve um código, o roda em casos particulares, tenta entender a sua execução passo a passo nesses casos, procura bugs, conserta-os, escreve testes de sanidade, e assim por diante até chegar em algo em que confie ou que ao menos aparente funcionar.
O método Beethoven nunca termina, mas apenas refina cada vez mais o produto. Quem segue este método não entrega um produto finalizado, mas uma versão mais ou menos boa deste segundo que tenha iterado mais ou menos vezes o método.
Se um método é melhor que outro segundo o objetivo de quem o aplica e segundo o contexto, então devo identificar para quais objetivos e sob quais contextos o método Beethoven é melhor que o método Mozart, e vice-versa.
Primeiramente, o contexto: os dois métodos são claramente pensados para a criação, a produção de algo: não se pode aplicar um método desses a uma atividade não-criativa. Isso refina a lista de contextos possíveis. Lembro-me de passagem do ditado que diz: é errando que se aprende. A sabedoria popular sugere então que o método Beethoven é particularmente aplicável ao aprendizado e à inovação, a situações em que não sabemos totalmente com o que estamos lidando: à exploração de novas ideias. Se cremos no ditado, o método Beethoven é então mais adequado que o método Mozart em atividades realmente criativas, enquanto o método Mozart ainda pode ser mais adequado para a produção de algo que entendemos perfeitamente bem.
Vejamos então qual método é melhor segundo nosso objetivo ou tarefa. Como já exposto, podemos aplicar critérios de uso de recursos diversos (como o tempo ou a memória do computador ou o dinheiro) para decidir se um método é mais aplicável que outro a uma determinada tarefa. Outros critérios possíveis são a qualidade e a confiabilidade do resultado final.
Consideremos, para começar, o uso de tempo, ou seja, a rapidez com que cada método entrega resultados. O método Beethoven entrega um resultado diferente a cada iteração, com resultados posteriores sendo, via de regra, melhores que resultados anteriores. O método Mozart entrega um único resultado, que deve ser perfeitamente adequado aos propósitos da tarefa. Além disso, o método Beethoven já começa com a execução, enquanto o método Mozart relega a execução ao último passo. Isso quer dizer que o método Beethoven deve entregar resultados mais rápido que o método Mozart, desde que o custo de tempo de um execução seja pequeno, e também pequeno seja o número de iterações necessárias.
Ponderando o uso de outros recursos, por exemplo o dinheiro, chegamos a uma generalização da consideração anterior: o método Mozart pode ser mais adequado se as iterações do método Beethoven custam caro, seja em dinheiro, em tempo, em espaço, ou qualquer outro recurso.
Finalmente, pensemos critérios sobre o resultado final, em vez de critérios sobre o processo de obtê-lo. Por exemplo, qual dos dois métodos produz software mais confiável, música mais harmoniosa, romances mais interessantes, independentemente de quão demorado ou caro é o processo de produção? Acredito que a balança tende em favor do método Mozart. Aplicado ao desenvolvimento de software, ele leva à verificação formal, única forma conhecida de produzir software sem bugs; aplicado à música e aos romances, eu não tenho exemplos suficientes para concluir qualquer coisa.
O método Beethoven ganhou proeminência com sua aplicação bem-sucedida numa indústria em que ele é estrangeiro, a aeroespacial. A SpaceX, diferentemente de todas as outras companhias fabricantes de foguetes, que seguem o método Mozart, é uma seguidora do método Beethoven. Foi iterativamente que construíram seus primeiros foguetes; com o capital vindo dos lançamentos iniciais iteraram para a construção de foguetes reutilizáveis, que inicialmente quase sempre explodiam na tentativa de pouso. Em certo momento tiveram seu primeiro sucesso, mas continuaram tendo falhas. Finalmente, hoje, a taxa de sucesso nos pousos de foguetes é alta, e a empresa já tem boosters reutilizados mais de 10 vezes (informação a verificar). Estão agora aplicando o método iterativo, aparentemente com sucesso, para desenvolver a Starship, novo modelo de foguete projetado para viagens interplanetárias.
Na indústria aeroespacial é uma escolha estranha aplicar o método Beethoven por duas razões: os altíssimos investimentos financeiros envolvidos, de centenas de milhões, que desincentivam a tomada de riscos, e os requerimentos de segurança dos astronautas. É caro e perigoso desenvolver foguetes que explodem, sem contar que é publicidade ruim. Mas como o objetivo é inovar (criando foguetes reutilizáveis, e criando Starships), faz sentido aplicar o método Beethoven.
Os dois métodos são aplicáveis a atividades criativas.
O método Beethoven é mais adequado que o método Mozart para a exploração de ideias desconhecidas ou a criação de algo que não entendemos perfeitamente. Mas para que ele seja realmente adequado, é preciso que o custo de execução seja pequeno, em termos de tempo, espaço, dinheiro etc. Caso contrário, só o método Mozart será eficiente em custos.
O método Mozart, por outro lado, entrega resultados de maior qualidade. Ele é adequado, então, quando nos importamos com a qualidade do produto final mais do que com o custo de sua produção.