segunda-feira, 20 de novembro de 2006

Literate Commenting

Literate programming is a programming methodology that combines a programming language with a documentation language, making programs more robust, more portable, and more easily maintained than programs written only in a high-level language.
Donald E. Knuth

Literate Programming é uma idéia genial. Se você é programador e gosta da arte de programar, sugiro que leia o livro ou que vá direto à fonte.


Por volta de 1995, quando eu estava lendo o livro, tive muita vontade de experimentar a metodologia. Mais ou menos na mesma época eu estava ouvindo o disco Aqualung do Jethro Tull. Na capa do disco havia um texto, meio que um poema, que me interessou--talvez porque eu não tenha conseguido entendê-lo. Algumas palavras do texto chamaram a minha atenção, não por sua relação com o texto em si, mas por sua relação com o meu trabalho como programador. Daí me veio a idéia de tentar usar o texto como comentários de um programa. O programa não precisaria fazer muito sentido, mas precisaria ser compilável e "casar" o mais perfeitamente possível com os comentários.


Até que o exercício não foi muito difícil. Depois da primeira versão, corrigi alguns poucos bugs e, modéstia às favas, fiquei bastante satisfeito com o resultado. Cheguei até a pensar em mandá-lo para o Knuth como sugestão para ele usá-lo como exemplo em algum novo livro seu, mas desisti. Possivelmente ele diria que isto está mais para Literate Commenting que para Literate Programming.


De qualquer modo, eis o resultado do meu esforço. Ah! Estou aberto para receber críticas e sugestões. As modificações incorporadas em futuras versões do programa terão suas fontes devidamente citadas. :-)

#include <cassert>

typedef int (*Entity)();

int Man()
{
// 1. In the beginning Man created God;
// and in the image of Man
// created he him.

    Entity God = Man;

// 2. And Man gave unto God a multitude of
// names, that he might be Lord of all
// the earth when it was suited to Man

    Entity &Lord = God;
    Entity &Jeovah = God;
    Entity &Alah = God;
    Entity &Rah = God;

    static bool suited = true;

    if (suited)
        suited = false;
    else
        return 0;

// 3. And on the seven millionth
// day Man rested and did lean
// heavily on his God and saw that
// it was good.

    for (unsigned day=0; day != 7000000; ++day);

    assert(God != 0);

// 4. And Man formed Aqualung of
// the dust of the ground, and a
// host of others likened unto his kind.

    char *Aqualung = new char[1024];

    char *host[10];

    for (int i=0; i < 10; ++i)
        host[i] = new char[1024];

// 5. And these lesser men were cast into the
// void; And some were burned, and some were
// put apart from their kind.

    void *lesser[10];

    for (int i=0; i < 10; ++i) {
        if ((i % 2) == 0)
            delete[] host[i];
        else
            lesser[i] = static_cast(host[i]);
    }

// 6. And Man became the God that he had
// created and with his miracles did
// rule over all the earth.

    God();

// 7. But as all these things
// came to pass, the Spirit that did
// cause man to create his God
// lived on within all men: even
// within Aqualung.

    char *Spirit = "main";

    Aqualung = "main";

// 8. And man saw it not.

    bool saw = false;

// 9. But for Christ's sake he'd
// better start looking.

    assert(saw);
}

main()
{
    Man();
}

sábado, 18 de novembro de 2006

Scott Adams, filósofo

Há um bom tempo eu sou fã das tirinhas do Dilbert. Pra quem não sabe, sai uma nova a cada dia. Eu as leio religiosamente desde que cadastrei o site no meu blogroll. Vira e mexe aparece uma que me pega desprevenido e me tira do peito aquela gargalhada pra "disopilá o figo".

Há alguns dias eu descobri que o Scott Adams, autor das tirinhas, também tem um blog. É uma delícia ler o que ele escreve. Além de um estilo leve e irônico que me lembra muito o do Douglas Adams, autor do clássico satírico The Hitchhiker's Guide to the Galaxy, o que o Scott escreve tem "sustança". Já li dele coisas importantes sobre religião, filosofia e democracia, mas também coisas mais leves sobre hipnotismo e gripe.

No post de hoje ele escreve sobre brevidade filosófica, quer dizer, aquelas frases curtas que têm a capacidade de condensar uma grande idéia ou de encerrar uma discussão interminável. Nos comentários alguns leitores sugeriram outras frases interessantes. Segue minha tentativa de traduzir algumas das que mais gostei.
  • Sobre a guerra entre cristãos e muçulmanos que estamos presenciando desde o 9/11, ele diz que são "aqueles que acreditam que um cara caminhou sobre as águas contra aqueles que pensam que um cavalo pode voar".
  • O comediante Larry Miller descreveu a estratégia dos EUA na guerra contra o Iraque assim: "seguir dirigindo até que eles atirem na gente".
  • "A vida é uma doença terminal transmitida sexualmente."
  • "Há 10 tipos de pessoas no mundo: aqueles que sabem binário e aqueles que não sabem."
  • "Quando você chegar ao final da jornada, dê um nó e enforque-se."
  • "Para aqueles que insistem em dizer que você tem que adquirir um gosto por alguma coisa eu digo que você pode adquirir gosto por merda, mas pra que você ia querer fazer isso?"
  • "Não leve a vida tão a sério. Você não vai sair vivo dela."
  • "Well-rounded people are pointless." (Ótima, mas intraduzível.)
  • "O dinheiro só tem valor se você o gasta."
  • "Don't Panic." (Não podia faltar.)
  • "Guerras religiosas são brigas de vida ou morte pra decidir quem tem o melhor amigo imaginário."
  • Mahatma Gandhi, quando perguntado sobre o que achava da civilização ocidental: "Seria uma ótima idéia."
A que eu mais gostei foi a que a mãe do Einstein disse pra ele no filme Young Einstein. Depois de explodir o telhado da casa em que morava, o jovem Einstein resolve explicar a teoria da relatividade pra sua mãe. Depois de ouvir a longa explicação, a mãe olha pro filho e diz: "em outras palavras 'tudo o que sobe tem que descer'".

Gostei porque me lembrou o que minha mãe me disse no verão de 1984/1985 quando, tendo terminado o meu primeiro ano de faculdade em ciência da computação, tentei explicar pra ela a beleza da tecnologia por trás dos computadores e da matemática por trás da programação: "mas se esse negócio não faz nada sozinho, se você tem que 'programar', então qual é a vantagem?". Acho que até hoje não consegui esclarecer esse ponto pra ela.

sexta-feira, 17 de novembro de 2006

A Boa e a Má Procrastinação

(Tradução para o português do ensaio original Good and Bad Procrastination, de Paul Graham.)

Dezembro de 2005

As pessoas mais impressionantes que eu conheço são todas terríveis procrastinadoras. Será possível que a procrastinação possa não ser sempre ruim?

A maioria dos que escrevem sobre procrastinação, escrevem sobre como curá-la. Mas, estritamente falando, isso é impossível. Há um número infinito de coisas que você pode fazer. Seja no que for que você esteja trabalhando, você estará deixando de trabalhar no resto. Então, a questão não é como evitar a procrastinação, mas como procrastinar bem.

Há três variantes da procrastinação, dependendo do que você faz ao invés de trabalhar em algo: você pode trabalhar (a) em nada, (b) em algo menos importante ou (c) em algo mais importante. Eu acredito que este último tipo seja a boa procrastinação.

É como aquele "cientista distraído" que se esquece de se barbear, de comer, e até mesmo de olhar pra onde está indo enquanto pensa num problema interessante. Sua mente se desliga deste mundo porque está trabalhando duro em outro.

É nesse sentido que as pessoas mais impressionantes que eu conheço são todas procrastinadoras. Elas são procrastinadoras do tipo C: deixam de fazer as pequenas coisas pra trabalhar nas coisas importantes.

O que são essas "pequenas coisas"? São aqueles trabalhos que não têm nenhuma chance de serem mencionados em seu obituário. É difícil dizer qual virá a ser sua obra prima (será sua magnum opus sobre a arquitetura dos templos sumérios ou o romance policial que você escreveu usando um pseudônimo?), mas há toda uma classe de tarefas que você pode seguramente descartar: barbear-se, lavar a roupa, limpar a casa, escrever notinhas de agradecimento--qualquer coisa que possa ser chamada de afazer.

A boa procrastinação é a que evita os afazeres para poder realizar trabalho de verdade.

Boa em um sentido, pelo menos. As pessoas que esperam que você cumpra com seus afazeres não vão pensar que ela seja boa. Mas provavelmente você tenha mesmo que incomodá-las se quiser realmente fazer alguma coisa. Mesmo as pessoas mais gentis, quando querem realizar algum trabalho, tornam-se um tanto rudes quando precisam evitar os afazeres.

Alguns afazeres, como responder cartas, desaparecem se você os ignorar (desaparecendo também com os amigos, talvez). Outros, como cortar grama ou preencher o formulário do imposto de renda, só se complicam quando são adiados. Em princípio, não deveria dar certo adiar o segundo tipo de afazeres. Você vai acabar tendo que fazê-los de qualquer jeito algum dia. Por que, então, não fazê-los agora?

A razão que faz valer a pena postergar mesmo estes afazeres é que o trabalho de verdade precisa de duas coisas que os afazeres não precisam: longas horas de dedicação ininterrupta e a disposição certa. Se você ficar inspirado por um projeto, pode ser vantajoso adiar tudo o que você supostamente deveria fazer nos próximos dias pra trabalhar nele. É, estes afazeres podem lhe custar mais caro quando você finalmente puder fazê-los. Mas se você conseguir realizar trabalho de verdade durante estes dias, o resultado final terá maior valor.

De fato, a diferença pode ser mais em espécie que em grau. Pode haver tipos de trabalho que só possam ser realizados em longos e ininterruptos estirões, quando a inspiração chega, ao invés de em curtas tarefas cronogramadas. Empiricamente, parece que é assim. Quando eu penso nas pessoas que conheço que realizaram grandes coisas, eu não consigo imaginá-las organizadamente riscando itens das suas listas de afazeres. Eu as imagino escondendo-se para trabalhar em alguma nova idéia.

Por outro lado, forçar alguém a cumprir seus afazeres de maneira síncrona acaba limitando sua produtividade. O custo de uma interrupção não é apenas o tempo que ela dura, mas é que ela quebra o tempo dois dois lados pela metade. Você provavelmente só precisa interromper alguém umas duas vezes por dia pra que ela seja incapaz de trabalhar em qualquer problema difícil.

Eu pensei um bocado sobre por que as empresas startups são mais produtivas bem no início, quando consistem apenas nos sócios trabalhando num apartamento. A principal razão pode ser que não haja ninguém para interrompê-los ainda. Em teoria, é bom quando os sócios fundadores finalmente conseguem bastante dinheiro para poderem contratar empregados para fazer parte do trabalho pra eles. Mas pode ser melhor estar sobrecarregado do que super-interrompido. Depois que você dilui a startup com empregados assalariados---procrastinadores tipo B---toda a empresa começa a funcionar no ritmo deles. Eles são dirigidos por interrupções e logo você também acaba sendo.

Os afazeres são tão efetivos no assassinato de grandes projetos que muitas pessoas os utilizam exatamente pra isso. Alguém que tenha decidido escrever um romance, por exemplo, subtamente descobre que a casa precisa de uma faxina. Aqueles que não conseguem escrever seus romances não o fazem porque passaram dias e dias sentados em frente a uma folha de papel em branco sem conseguir escrever nada. Eles o fazem porque ficaram alimentando o gato, saindo para comprar alguma coisa pro apartamento, tomando café com um amigo, lendo email. "Eu não tenho tempo pra trabalhar", eles dizem. E não têm mesmo; fizeram de tudo pra não ter.

(Há também outra variante em que a pessoa não tem lugar pra trabalhar. A cura é visitar os locais onde pessoas famosas trabalharam e ver o quão inadequados eles eram.)

Eu mesmo já usei estas duas desculpas mais de uma vez. Aprendi um monte de truques pra me fazer trabalhar nos últimos 20 anos, mas até hoje não consigo vencer consistentemente. Alguns dias eu consigo realizar trabalho de verdade. Outros dias são gastos com afazeres. E eu sei que é quase sempre minha culpa: eu deixo os afazeres gastarem o meu dia pra não ter que enfrentar algum problema difícil.

A forma mais perigosa de procrastinação é a do tipo B que não é reconhecida como tal, porque ela não se parece com procrastinação. Afinal, você está "fazendo coisas". Só que as coisas erradas.

Todo conselho sobre procrastinação que se concentra em riscar coisas da sua lista de afazeres é não apenas incompleto mas positivamente enganoso se não considera a possibilidade de que a própria lista seja uma forma de procrastinação do tipo B. De fato, possibilidade é uma palavra muito fraca. Quase toda lista é uma forma de procrastinação do tipo B. A menos que você esteja trabalhando nas coisas mais importantes em que você poderia estar, você está procrastinando no tipo B, independentemente do quanto você esteja realizando.

Em seu famoso ensaio You and Your Research (que eu recomendo para todos os que têm ambição, não importa no que estejam trabalhando), Richard Hamming sugere que você se faça três perguntas:

  1. Quais são os problemas mais importantes na minha área?
  2. Estou trabalhando em algum deles?
  3. Por que não?

Hamming trabalhava nos Bell Labs quando começou a perguntar essas coisas. Em princípio, qualquer empregado dos Bell Labs deveria ser capaz de trabalhar nos problemas mais importantes da sua área. Talvez nem todos possam causar uma marca igualmente dramática no mundo; não sei; mas sejam quais forem as suas capacidades, sempre existem projetos que podem esticá-las. Deste modo, o exercício de Hamming pode ser generalizado da seguinte forma:

Qual é a melhor coisa em que você poderia estar trabalhando e por que não está?

A maioria das pessoas se intimida com esta questão. Eu próprio me intimido; vejo-a ali na página e rapidamente sigo pra próxima sentença. Hamming costumava circular perguntando essas coisas para seus colegas, o que não o fazia uma pessoa muito popular. Mas esta é uma questão que qualquer pessoa ambiciosa deveria se fazer.

O problema é que você pode fisgar um peixe muito grande com essa isca. Pra realizar bons trabalhos você precisa fazer mais do que encontrar bons projetos. Depois de encontrá-los você tem que conseguir trabalhar neles e isso pode ser difícil. Quanto maior o problema mais difícil é conseguir efetivamente trabalhar nele.

É claro, a principal razão que faz alguém achar difícil trabalhar num problema específico é que elas não o apreciam. Especialmente quando você é jovem, você frequentemente se encontra trabalhando em coisas de que você realmente não gosta--porque elas parecem impressionantes, por exemplo, ou porque alguém o mandou trabalhar nelas. A maioria dos estudantes de graduação ficam presos trabalhando em grandes problemas de que eles realmente não gostam, o que explica porque os cursos de graduação são sinônimos de procrastinação.

Mas mesmo quando você gosta daquilo em que está trabalhando, é mais fácil concentrar-se nos pequenos problemas que nos grandes. Por que? Por que é tão difícil trabalhar nos grandes problemas? Uma razão é que você pode não obter nenhuma recompensa no futuro próximo. Se você trabalha em algo que pode terminar em um dia ou dois você espera uma boa sensação de realização a curto prazo. Se a recompensa futura é distante e eventual, ela parece menos real.

Ironicamente, outra razão que leva as pessoas a não trabalharem nos grandes projetos é o medo de perder tempo. E se elas falharem? Então, todo o tempo que elas investiram terá sido em vão. (Na verdade, ele provavelmente não terá sido em vão porque o trabalho em projetos difíceis quase sempre leva à algum lugar.)

Mas o problema com os grandes projetos não pode ser apenas que eles não prometem recompensas imediatas e que podem fazê-lo perder seu tempo. Se fosse só isso eles não seriam piores que visitar o cunhado. Há mais que isso. Grandes projetos são amedrontadores. Há uma dor quase física em enfrentá-los. É como ter um aspirador de pó grudado na sua imaginação. Todas as suas idéias iniciais são imediatamente sugadas e você não tem mais nenhuma e o aspirador continua a sugar.

Você não pode encarar um grande problema diretamente nos olhos. Você deve aproximar-se dele com olhar oblíquo. Mas ajuste o ângulo depois: você precisa enfrentar o grande problema de modo suficientemente direto pra poder receber parte da excitação que ele irradia, mas não tanto que o medo o paralise. Você pode apertar o ângulo depois de começar, assim como um barco a vela pode velejar mais perto do vento depois de pegar velocidade.

Se você quer trabalhar em grandes coisas, parece que você precisa enganar-se a si mesmo para fazê-lo. Você precisa trabalhar em pequenas coisas que possam crescer e se transformar em grandes coisas ou trabalhar em coisas sucessivamente maiores ou repartir a carga moral com colaboradores. Não é um sinal de fraqueza depender desses truques. As obras mais importantes foram feitas assim.

Quando eu falo com pessoas que conseguiram trabalhar em grandes coisas, descubro que todas elas descumpriam seus afazeres e todas se sentiam culpadas por isso. Eu não acho que elas devam se sentir culpadas. Há mais a fazer do que qualquer um poderia. Assim, alguém realizando o melhor trabalho possível vai inevitavelmente deixar um monte de afazeres por fazer. Parece-me um erro se sentir mal por isso.

Eu acho que a maneira de "resolver" o problema da procrastinação é deixar o prazer puxá-lo ao invés de fazer uma lista de afazeres empurrá-lo. Trabalhe num projeto ambicioso de que você realmente goste e veleje tão perto do vento quanto possível e você deixará as coisas certas por fazer.

Meus agradecimentos a Trevor Blackwell, Jessica Livingston e Robert Morris por lerem versões preliminares deste ensaio.

© 2005 Paul Graham