Leituras essenciais de ficção científica

November 4th, 2009 § 3

Eu comecei a ler ficção científica há mais de 20 anos atrás, quando ainda estava entre a primeira e terceira série. Meu primeiro livro de ficção científica, se a minha memória não me engana, foi o tradicional Vinte Mil Léguas Submarinas, de Jules Verne–provavelmente o mesmo livro que motivou em milhões de outras pessoas a mesma paixão pelo futuro, ciência e aventura, mesmo sendo um livro “ultrapassado” em muitos sentidos.

Nos anos seguintes, li praticamente tudo que havia na biblioteca da escola e na biblioteca pública de Belo Horizonte no gênero. Isaac Asimov, Robert A. Heinlein, Arthur C. Clarke, George Orwell, Ray Bradbury, Philip K. Dick, H. G. Well, Ursula K. Le Guin, Alfred Bester, Frederik Pohl, Roger Zelazny, Kurt Vonnegut, Stanislaw Lem, David Brin, Joel Haldeman, Clifford Simak, Orson Scott Card, Frank Herbert, Harlan Elisson e dezenas de outros foram meus companheiros em muitas viagens ao redor do Universo e mais.

Eu ainda sou “jovem” o suficiente para dizer que a maioria desses livros já era comparativamente datada quando os li. Em uma época em que computadores e celulares estavam começando a revolucionar o mundo, máquinas movidas a válvulas e circuitos elétricos enormes, naves espaciais sem displays ou HUDs, robôs com circuitos puramente mecânicos e nenhuma manipulação genética já estavam se tornando anacrônicos. Nada isso, é claro, impedia que esses livros proporcionassem horas de diversão e essa nostalgia de coisas futuras que é tão comum ao gênero.

Mas, essa mesma nostalgia, essa saudade das épocas inocentes lendo os mestres e imaginando um futuro talvez muito mais brilhante do que a realidade que chegou deixou muitos fãs do gênero com um gosto meio amargo na boca–lembranças de uma era aparentemente melhor em que a ficção científica era mais pura, mais instigadora e muito mais voltada para o futuro do que é agora.

Talvez parte disso seja verdade. Talvez o passo da mudança tecnológica hoje seja tão forte que é difícil intuir, de um ano para o outro, o que pode realmente acontecer e colocar isso no papel sem o risco de que uma estória já esteja ultrapassada quando for impressa e lida. Talvez também, a decepção de uma idade de exploração que nunca se materializou e que a cada dia se torna mais distante e complicada tenha tirado um pouco o brilho do que antes era uma porta para um futuro em que utopias seriam tão comuns quanto golpes políticos o são hoje.

Mas, talvez, isso seja somente uma falta em perceber o que está acontecendo de interessante no campo hoje e como isso reflete o momento que vivemos, em que a ficção científica se torna mais introspectiva e procura ver as mudanças grandes e pequenas que estão acontecendo no dia-a-dia e como essas mudanças afetam o que fazemos e pensamos e queremos para o futuro–em outras palavras, continuando a fazer o que o gênero sempre mas com um escopo diferente.

O que segue abaixo é uma pequena lista do que considero leituras essenciais na área atualmente. Não é, nem de longe, uma lista compreensiva. Ao contrário, reflete um pouco do meu bias em ficção científica e o que já li–e por isso, para muitos não será realmente essencial. Mas acho que representa um bom corte do campo atualmente e, para quem deseja se aventurar em mundos novos e explorar o que realmente significa ser humano e evoluir, esses livros são uma boa porta de entrada.

Alguns critérios para a lista:

  1. Em sua maioria, os livros foram escritos no máximo há vinte anos, preferencialmente nos últimos dez para trazer à tona o que está sendo feito de bom ultimamente.
  2. Quase nenhum é de algum dos grandes mestres citados acima. Primeiro, porque a maioria deles já morreu. Segundo, porque procurei evitar a produção recente dos que continuam na ativa.
  3. Procurei balancear futurismo com imediatismo.
  4. A maior parte dos trabalhos aqui ganhou os grandes prêmios do gênero mas eu não referencio nenhum dos mesmos.
  5. Como já havia prometido para algumas pessoas também uma lista do que acho interessante no gênero, a lista também indica fortes preferências pessoais.

Mesmo assim, espero que seja de valia. As descrições dos livros evitam ao máximo spoilers mas possuem um pouco da minha visão do que faz o livro é interessante e essencial e por isso podem relevar mais do que devem às vezes. Sinta-se à vontade, portanto, para ignorar as descrições e simplesmente procurar pelos mesmos na Internet.

The Culture — Iain M. Banks

The Culture é uma série de livros por Iain M. Banks sobre uma sociedade utópica pós-escassez, semi-anarquista de várias raças humanóides governadas por inteligências artificias extremamente avançadas. A Cultura, a sociedade título da série, evoluiu em um hiper-poder galático há 9 mil anos e os livros são centrados nos dilemas que a mesma enfrenta em suas relações com poderes similares e com sociedades menos evoluídas. De fato, essencialmente todos os livros tratam não da Cultura em si, mas das interfaces que a mesma tem com o resto da galáxia, especialmente na forma de seus agentes de Contato ou de Circunstâncias Especiais que, respectivamente, são seu serviço diplomática e seu serviço secreto.

Banks prestou à ficção científica um serviço similar ao que Stephen R. Donaldson prestou à fantasia em suas obras. Antes de Banks, a space opera era considerada um sub-gênero menor e de pouco interesse, frívolo até. Com seus livros, Banks mostrou que mesmo a space opera podia explorar idéias enormes e situações intrincadas mantendo ao mesmo tempo a leveza e descompromisso face à hard science fiction. Brincando com estrutura e estilo, os livros sobre a Cultura variam de poético a detetivesco, de entediado a humorístico. Em alguns casos, ele usa justamente o estilo oposto ao esperado para criar, com bastante sucesso, um efeito maior em uma cena–por exemplo, usando descrições prosaicas para cenas grandiosas no espaço e poesia em cenas de destruição em massa.

O pouco que vou dizer não descreve quase nada sobre o que Banks consegue fazer, infelizmente. É preciso ler um dos livros da série para entender a riqueza de situações e caracteres que ele consegue colocar em suas estórias. O brilhantismo, entretanto, fica transparente em enredos como o de The State of the Art, uma coleção de estórias curtas em que a estória título, de mesmo nome do livro, é sobre uma visita que a Cultura fez à Terra nos anos setenta para decidir se deveria ou não interferir em seu desenvolvimento–o tema, como disse acima, da maioria das situações mostradas nos livros. É quase impossível não se encantar com a conclusão da estória e não desejar por um momento que a mesma tivesse acontecido de forma diferente, tal o realismo que Banks consegue incutir no texto. E como não gostar de estórias que tem passagens como a abaixo (para contexto, Arbitrary é uma das naves da Cultura, que é essencialmente uma Mente, uma das AI super-avançadas que controlam a sociedade, auto-suficiente e cabeça real da missão):

‘Also while I’d been away, the ship had sent a request on a postcard to the BBC’s World Service, asking for ‘Mr David Bowie’s “Space Oddity” for the good ship Arbitrary and all who sail in her.’ (This from a machine that could have swamped Earth’s entire electro-magnetic spectrum with whatever the hell it wanted from somewhere beyond Betelgeuse.) It didn’t get the request played. The ship thought this was hilarious.’

Para usar o proverbial exemplo, se eu tivesse que escolher uma série de ficção científica para levar para um ilha deserta, seria esta. Banks é um dos poucos autores cuja releitura consegue permanecer pura com a primeira vez. Seus finais são geralmente surpreendentes e nenhum dos livros é similar ao outro. Em resumo, vale a pena cada centavo gasto nos livros.

A Deepness in the Sky & A Fire Upon the Deep — Vernor Vinge

A Fire Upon the Deep é um livro que me pegou de surpresa duas vezes em seu início. O começo do livro é bastante promissor e oferece a perspectiva de uma space opera clássica, com extremo futurismo e conceitos amplos. Isso já foi uma boa surpresa já que eu não conhecia o autor. Quando o livro se move para um background quase medieval, é possível sentir uma ponta de dúvida por conta da possibilidade que o livro se torne mais um em que a Terceira Lei de Clarke impere. Essa dúvida dura momentos somente até que fica claro que sim, os habitantes do planeta medieval são alienígenas, mas que estão também entre os mais bem pensados e realmente estranhos alienígenas a dar o ar da graça em ficção científica. Essa é a segunda surpresa.

A partir daí o escopo do livro vai crescendo até quase não caber dentro de suas páginas. É quase como se Vinge estivesse deliberadamente tentando fazer o intelecto do leitor explodir diante da sua capacidade de oferecer cenários incrivelmente detalhados e prováveis de um futuro cabível e ao mesmo tempo completamente diferente do que podemos imaginar. De uma Usenet inter-galáctica a zonas de pensamento, tudo é novo e tudo é épico.

Vinge é conhecido no meio científico por dar o primeiro tratamento sólido e popularizar o conceito da Singularidade Tecnológica, um crescimento exponencial da tecnologia em que se chega a um ponto em que é impossível especular sobre as conseqüências ou capacidades além desse ponto. Como Vinge mesmo coloca:

Within thirty years, we will have the technological means to create superhuman intelligence. Shortly after, the human era will be ended.

Como predição tecnológica, isso não se concretizou ainda–e talvez nunca se concretize–mas os conceitos por trás da mesma deram origem a um sem número de especulações e pesquisas e, é claro, estórias de ficção científica das quais Vinge foi um dos primeiros exploradores.

Obviamente, dado que é impossível prever o que acontece depois da Singularidade, estórias que lidam com a mesma sempre acontecem no contexto de pós-humanos, ou seja, humanos que sobraram após a chegada da Singularidade, como é o caso de A Fire Upon the Deep.

A Deepness in the Sky, por outro lado, é uma espécie de prequel para A Fire Upon the Deep. Possui um personagem em comum e um conjunto de temas similar, mas é mais introspectivo, lidando com um cenário de primeiro contato entre uma civilização alienígena e duas facções humanas. O livro começa, também, com uma das mais famosas aberturas do gênero.

The manhunt extended across more than one hundred light-years and eight centuries.

A exemplo do livro anterior, A Deepness in the Sky é recheado de conceitos enormes e reflexões profundas sobre a natureza humana. De fato, o livro explora a tecnologia tanto como uma ferramenta de liberdade com uma ferramenta de controle e escravização, indo, entretanto, muito além de uma simples polarização dessa discussão.

Independentemente desses temas, porém, os dois livros de Vinge estão gravados na minha mente simplesmente pelo incrível sense of wonder que os dois me produziram. Eu consigo me lembrar distintamente de certas passagens e conversas nos livros que causaram essa sensação e que permanecem entre as melhores coisas que já li.

Glasshouse & Halting State — Charles Stross

Stross pode ser considerado, em muitos aspectos, um herdeiro de Vinge no sentido em que suas estórias geralmente são vistas pelo prisma da Singularidade Tecnológica. E de fato, seus livros com essa temática lembram muito os trabalhos de Vinge mencionados acima. Ironicamente, o último trabalho de Vinge poderia muito bem ser considerado como sendo da mesma linha da segunda temática que Stross trabalha, que são as transformações imediatas em nosso mundo pelo que já está acontecendo em crescimento tecnológico. Glasshouse e Halting State são exemplos desses dois temas.

O primeiro explora a evolução de uma sociedade pós-humana espalhada pela galáxia usando wormholes tanto para transporte como para duplicação de matéria, o que permite essencialmente transporte instantâneo para qualquer lugar, dando origem a polities, ou estados independentes com regras extremamente diversas entre si, e existência indefinida, já que a tecnologia de duplicação de matéria permite backups constantes de consciência e transferência de corpos. Nesse meio, está Robin, um orto-humano que remove parte de suas memórias em uma tentativa de se livrar das consequências de acontecimentos traumáticos que viveu em guerras passadas. Ao se ver como alvo de assassinato por razões que desconhece, ele decide se juntar a um experimento para recriar os séculos 20 e 21, cuja estória foi perdida em uma “Idade das Trevas”. O experimento, entretanto, não é de longe o que parece e Robin, agora transmutado em um corpo feminimo, precisa entender o que está acontecendo antes que seja tarde para ela e para os demais integrantes da experiência.

Apesar do enredo aparentemente prosaico, Stross consegue colocar em uma curto quantidade de páginas, reflexões e metáforas para a transformação tecnológica que estamos vivendo, brincando com temas que vão desde protocolos e formatos de dados abertos como forma de preservação de cultura e história até o upload de consciência, tornando a estória não só cativante com um exercício completo em futurologia, impressionante e atual.

Halting State, por outro lado, já é tão próximo do nosso presente quanto se pode desejar em uma obra de ficção científica. O livro começa com um roubo em um jogo MMORPG, muito similar ao atual World of Warcraft, executado por um bando de orcs e um dragão. A investigação do que aconteceu, tratada simultaneamente pela polícia especializada em cybercrimes e pela seguradora, desdobra-se momento a momento em algo mais profundo e potencialmente relacionado a espionagem e contra-inteligência. No meio disso, Stross joga com conceitos que vão desde computação pervasiva e economias virtuais, passando por jogos como forma de instrumentação comportamental e cyberwarfare.

Como nos demais trabalhos de Stross, o futuro é tão imediata que as coisas que ele apresenta em seus livros tendem a acontecer rapidamente na vida real, dando razão a Alan Kay que disse que a melhor maneira de prever o futuro é inventá-lo. Stross é um mestre em entender o que está acontecendo agora e extrapolar isso para os próximos dois ou três anos. Seus livros, com isso, correm rapidamente o risco de ficarem datados mas servem com uma boa balização para o que faz a ficção científica ser grandiosa.

RGB Mars, Science in the Capital & The Years of Rice and Salt — Kim Stanley Robinson

Kim Stanley Robison é, para mim, o legítimo herdeiro de Frank Herbert. Seus trabalhos possuem o mesmo escopo colossal e multi-generacional e o mesmo enfoque ecológico e espiritualizado de Herbert. Seja falando sobre a terraformação de Marte ou tratando de história alternativa, Robinson consegue maravilhar o leitor com a profundidade de sua narrativa e a beleza e poesia de seu estilo.

RGB Mars (Red, Green e Blue Mars), mais conhecido como a Trilogia Marciana, é, para mim, a melhor obra de todos os tempos sobre o planeta vermelho. O livro acompanha o processo de terraformação de Marte ao longo de mais de duzentos anos, começando com a chegada de um grupo de colonos internacionais e terminando com a emancipação completa e virtual finalização do processo de colonização do planeta.

Os duzentos anos acompanhados no livro são uma estória de amizades, intrigas, derrotas, triunfos, amores, ódios, política, ecologia, ciência, pesquisa, economia, psicologia, guerra interplanetária e escala de esforço que deixam o leitor estarrecido pelo detalhe e intimamente envolvido com cada aspecto da vida dos centenas de personagens que Robinson introduz e acompanha, muitos dos quais ao longo de toda a existência dos mesmos. Além do fator humano, existe também a presença constante do próprio planeta, demostrada em uma poesia cujo lirismo não fica nada a dever ao que um Keats faria se estivesse escrevendo prosa.

Algumas passagens do livro são tão introspectivas que o leitor se sente como se realmente estivesse na pele dos personagens. Outros são tão amplas e afastadas que é como se o leitor estivesse vendo tudo de uma perspectiva de centenas de anos depois, quando tudo o que aconteceu quase se tornou lenda e mito. Essa variação faz da obra um épico em todos os aspectos da palavra.

The Years of Rice and Salt é uma extensão dessa capacidade que Robinson demonstra na Trilogia Marciana. O livro é baseado em uma premissa simples: o que aconteceria se a Peste Negra houvesse exterminado 99% da Europa, efetivamente finalizando essa civilização. O que se segue é uma exploração de quase 700 anos da história de um mundo em que China, Islã e Índia disputam a primazia do poder científico e político mundial, em que Budismo e Islamismo são as principais religiões e em que nunca houve uma civilização ocidental propriamente dita.

Robinson utiliza um recurso fascinante para contar a estória, usando o Budismo como foco ao reencarnar os mesmos personagens vez após outra para mostrar a evolução histórica. Sete ou outro personagens, cujas iniciais sempre são as mesmas mas que mudam de nome, sexo e posição social a cada vez que reentram na estória, são usados para refletir sobre cada aspecto do que seria diferente sem a civilização européia no mundo. O resultado é brilhante e igualmente lírico. Um das minhas passagens favoritas, que demonstra esse lirismo, é:

“Here are the miracle signs you want,” he would say in a loud voice, “that you cry through the night and get up at dawn, asking that in the absence of what you ask for, your day gets dark, your neck thin as a spindle, that what you give away is all you own, that you sacrifice belongings, sleep, health, your head, that you often sit down in a fire like aloes wood, and often go out to meet a blade like a battered helmet. When acts of helplessness become habitual, those are the signs. You run back and forth listening for unusual events, peering into the faces of travelers. Why are you looking at me like a madman? I have lost a friend. Please forgive me. Searching like that does not fail. There will come a rider who holds you close. You faint and gibber. The uninitiated say he’s faking. How could they know? Water washes over a beached fish. Blessed is that intelligence into whose heart’s ear from heaven the sound of ‘come hither’ is coming. The defiled ear hears not that sound—only the deserving gets his desserts. Defile not your eye with human cheek and mole, for that emperor of eternal life is coming; and if it has become defiled, wash it with tears, for the cure comes from those tears. A caravan of sugar has arrived from Egypt; the sound of a footfall and bell is coming. Ha, be silent, for to complete the ode our speaking king is coming.”

Science in the Capital, também uma trilogia, é uma interrogação moderna sobre o problema do aquecimento global. Robinson combina Budismo a essa indagação e o resultado, mais uma vez, é um livro profundamente espiritualizado e complemente científico sobre as incertezas e conseqüências da atuação humana sobre a Terra. O escopo não é tão épico como dos livros anteriores, mas demonstra um conforto, uma comfiness para com o leitor que torna a leitura incrivelmente imediata e poética.

Flashforward, Rollback & Calculating God — Robert J. Sawyer

Sawyer, ao contrário dos autores anteriores, raramente vai atrás do épico. Seus livros geralmente são down-to-earth sem a exploração extrema demonstrada por vários outros autores. Isso não desmerece, de forma alguma, seu trabalho. Ao contrário, suas explorações sobre o significado do que é ser humano e da interseção de ciência e religião sempre dão bons resultados, com estórias agradáveis e significativas.

Flashforward, recentemente transformado em uma série de TV pela ABC, começa com um experimento no LHC em Genebra para tentar produzir o Bóson de Higgs. O experimento falha em seu propósito primário mas produz um efeito colateral único e profundo: a raça humana inteira perde consciência por 137 segundos e cada indivíduo experimenta nesse período seu futuro de 21 anos à frente em primeira pessoa. O livro segue então os vários protagonistas enquanto eles tentam entender o que aconteceu, continuar com suas vidas face a tragédias pessoais durante o evento (resultantes geralmente do descontrole de aparelhos e veículo sobre controle humano), e descobrir se o futuro previsto é realmente válido. Os temas de predestinação, livre arbítrio e realidade são amplamente explorados.

Rollback, por sua vez, é centrado em Sarah Halifax, uma astrônoma que decodificou a primeira transmissão alienígena para a Terra 38 anos antes do começo da estória. Quando uma segunda mensagem chega, Sarah, agora com 87 anos, recebe a tarefa de entendê-la também. Um bilionário, detentor de um processo de rejuvenescimento conhecido como rollback oferece o tratamento a Sarah e seu marido para que ela tenha tempo de trabalhar na decodificação sem preocupar-se com sua possível e iminente morte. O procedimento, entretanto, tem sucesso somente para Don, o marido, falhando completamente para ela. A estória lida então com o trabalho continuado de Sarah e as mudanças experimentadas pelo seu marido e as conseqüências para a relação dos dois.

Calculating God, finalmente, começa quando um alienígena pousa em frente a um museu canadense. Ao invés de pedir para falar com as autoridades locais ou qualquer coisa similar, ele deseja ver um paleontologista. Seu objetivo? Obter mais informações que possam demonstrar os meios pelos quais Deus atua no universo. Brilhante em seus questionamentos e uma exploração honesta de religião e da racionalidade, o livro é um dos melhores trabalhos de Sawyer.

É fácil perceber que Sawyer não procura os efeitos e escopo colossais dos outros autores citados até o momento. Mesmo assim, suas obras são relevantes e um exemplo do melhor que a ficção científica pode oferecer hoje em dia.

Blindsight & Rifters Trilogy — Petter Watts

Peter Watts poderia facilmente ser considerado insano pelo tipo de estórias que escreve. Um biologista marinho por profissão, Watts geralmente lida com evolução e genética em seus livros mas de uma maneira capaz de induzir pesadelos mesmo nos leitores mais resistentes.

Blindsight, por exemplo, é essencialmente uma estória de primeiro contato que começa com centenas de micro-satélites queimando ao redor da Terra e tirando um instantâneo do planeta. Quando a origem dos satélites e localizada, uma nave humana é enviada para tentar contato e entender o que aconteceu. O detalhe: a nave é capitaneada por um vampiro, contém um contigente de zumbis pós-humanos como equipe militar e o especialista em contato é um adulto que sofreu uma hemisferectomia para curar sua epilepsia e como resultado é incapaz de se relacionar propriamente com a raça humana. Os conceitos básicos do livro lidam com identidade, cognição, consciência e inteligência e o problema do Quarto Chinês é proeminente nessa exploração.

A trilogia Rifters é igualmente insana, sendo caracterizada por um vírus diferente de qualquer coisa que já se viu na face da Terra, baseado em mecanismos de reprodução e propagação que o tornam impossível de ser detectado ou curado e um conjunto de seres humanos modificados para trabalho direto em profundidades abissais em um futuro bizarro onde países são corporações e política é economia.

Watts é provavelmente o autor que mais me causou uma boa e positiva dor de cabeça com seus livros, forçando uma visão nova e estranha do que o mundo pode ser. Isso o coloca acima de quase qualquer outro autor que está escrevendo hoje e torna seus livros leitura obrigatória para qualquer amante do gênero. E de quebra, todos os quatro estão disponíveis gratuitamente em seu site.

Camouflage & The Accidental Time Machine — Joe Haldeman

Haldeman é o único dos autores referidos anteriormente como clássicos que eu incluo nessa lista por continuar a publicar novidades relevantes para a ficção científica atual.

Camouflage conta a estória de dois seres imortais, presente na Terra a milhões de anos, cuja memória do próprio passado é quase inexistente e a busca dos mesmos para descobrir suas origens através de um misterioso artefato encontrado em uma fossa submarina. O livro é rápido e primoroso em seu desenvolvimento dos personagens e da apresentação de inteligências estranhas à Terra fazendo o seu caminho entre humanos insuspeitos rumos ao seu destino. Se passando em um futuro próximo, com breves incursões ao passado para explicar detalhes da trajetória dos dois seres, o livro conseguiu me manter preso do começo ao fim.

The Accidental Time Machine é um homenagem cheia de humor e bem embasada cientificamente de todas estórias de viagem do tempo que já foram escritas. Quando um assistente de pesquisa do MIT chamado Matthew Fuller inventa sem querer uma máquina de viajar no tempo e descobre que ela somente vai para o futuro, ele se vê jogado para longe de sua época e envolvido cada vez mais em situações que não pode controlar. A leitura é rápida–o livro é quase uma noveleta–mas demonstra o talento de Haldeman em criar situações críveis com pouco esforço.

Eifelheim — Michael Flynn

Eifelheim é simplesmente a melhor estória de primeiro contato que já li. O livro segue as estórias alternantes de dois grupos de pessoas: um historiador da matemática, Tom Schwoerin, que no tempo presente tenta entender porque uma cidade alemã chamada Eifelheim literalmente desapareceu do mapa, com sua esposa física e seu outro amigo historiador; e os habitantes da própria cidade, prestes a ser dizimada pela Peste Negra no século quatorze (fato que não é responsável pelo seu desaparecimento), encabeçada pelo personagem principal do livro, o pastor Dietrich, um homem educado vivendo em um exílio auto-imposto na cidadezinha como um líder religioso.

No meio da estória estão os, a princípio, misteriosos Krenken, que são confundidos com viajantes de uma terra distante e depois se provam muito mais do que isso. A estória intercalada se move pela pesquisa de Tom e seu progressivo entendimento do que está acontecendo (com interlúdios formados pelo desenvolvimento de uma teoria unificada da física por sua esposa), e pela vida comum de uma vila medieval ricamente representada pelo autor, lidando com os visitantes da única maneira que podem entender, mas, ainda assim, com uma sobriedade de pensamento, mostrada principalmente por Dietrich, que é por si só uma visão bem mais interessante da cultura medieval.

O resultado é uma estória belíssima e deliciosa, com um dos mais comoventes finais do gênero. Com ela, Flynn se prova um dos grandes nomes da hard science fiction da atualidade. Uma citação do livro, para completa a descrição:

I know where the path to the stars lies. The gate opened once, a long time ago; and a few wayward travelers suffered a lonely death. Then it closed. But before it did, two creatures reached across an unimaginable gulf and touched. They didn’t flee and they didn’t fight, and because they did not, they left the gate open, just a crack.

Cryptonomicon & The Baroque Cycle — Neal Stephenson

Dizer que Neal Stephenson é brilhante é a mesma coisa que dizer que o sol é uma estrela. Sua obra é ampla e modificou tanto o gênero com criou novos sub-gêneros. Qualquer de seus livros é muito mais do que uma estória de ficção científica ou história alternativa, mas também serve com uma densa exploração cultural e conceitual seja da nossa própria sociedade, do nosso passado ou dos nossos possíveis futuros.

Eu poderia citar Snow Crash e The Diamond Age como exemplo disso mas ambas já receberam suficiente atenção em essencialmente qualquer outra lista do gênero. E, para falar a verdade, eu considero Cryptonomicon seu melhor trabalho.

Cryptonomicon segue essencialmente duas estórias paralelas: as aventuras de um soldado na Segunda Guerra Mundial e um grupo de decifradores de código em Bletchley Park e seus descendentes nos tempos atuais enquanto eles empregam criptografia, telecomunicações e tecnologia em geral para construir um haven eletrônico no Sultanato de Kinakuta para facilitar o uso anônimo de Internet banking para, por trás das cenas, ajudar populações que estão sendo alvo de genocídio. O resultado é uma estória extremamente convoluta, extensa e de enorme escopo e incrivelmente satisfatória sobre o que esses dois grupos fazem em sua participação em eventos históricos e não tão históricos.

The Baroque Cycle, por sua vez, é uma espécie de continuação do trabalho mas se passando alguns séculos antes e acompanhando os ancestrais de vários personagens do livro anterior. Enorme, épico e também merecedor de uma leitura cuidadosa.

Lazy of Mazes, Ventus & Permanence — Karl Schroeder

Karl Schroeder compartilha muitos dos seus temas com Charles Stross, embora seu enfoque seja muito mais da relação psicológica do ser humano com a tecnologia. Para isso ele explora nano-tecnologia, terraformação e, especialmente, realidade aumentada com uma forma de expansão do conhecimento interno do ser humano. Os três livros mencionados acima se passam essencialmente no mesmo universo, embora sem muita consistência entre si.

Ventus combina nano-tecnologia com uma semi-fantasia é algo que poucos autores conseguem fazer. Schroeder não só consegue a proeza, mas cria um mundo referescantemente inovador que se desvia completamente dos estereótipos no gênero. É nesse trabalho que Schroeder introduz o conceito de thalience, que hoje descreve a capacidade auto-organizadora de redes finamente distribuídas embora no livro seja mais relacionada à capacidade de sistemas artificiais de criarem sua própria concepção do mundo adquirindo, por extensão, consciência de si mesmos.

Lazy of Mazes, como mencionado, se passa no mesmo universo de Ventus, embora não seja uma prequel. É uma space opera futurística/pós-Singularidade no melhor estilo possível. Como nos demais livros de Schroeder, a trama é complexa o suficiente para impossibilitar uma descrição simplificada, mas essencialmente é a estória de amigos que perdem tudo o que tem e precisam embarcar em uma jornada para tentar recuperar o que perderam, se envolvendo com um mundo muito maior do que imaginavam existir. Misture isso com um cenário trans-humanista e você tem possibilidades além do que se vê no dia-a-dia da ficção científica.

Permanence, por outro lado, é uma exploração do relacionamento da humanidade com outras espécies inteligentes e capazes de viagens estelares. Schroeder lida com questões como: O que é consciência? Isso é um conceito humano ou será comum a qualquer ser inteligente? Seja como for, seremos capazes de reconhecê-lo em outras espécies? E assim por diante. Embora também seja uma estória de bildungsroman, o livro consegue unir à space opera essas indagações mais profundas.

Pandora’s Star & Judas Unchained — Peter F. Hamilton

Peter F. Hamilton é outro autor capaz de impressionar com suas sagas que se estendem ao longo de dezenas de mundo, décadas de tempo e lidam com dúzias de personagens. Os dois livros acima constituem uma único estória que começa em 2380 quando, após 300 anos de colonização via wormholes, a humanidade se defronta com um mistério celestial: um par de estrelas que desapareceu e supostamente foi envolvido em uma esfera de Dyson. O desaparecimento foi tão súbito que só pode indicar que a tecnologia possuída pelos responsáveis é superior ao que a humanidade possui. E uma pergunta fica então implícita: a esfera foi construída para proteger ou conter alguma coisa? A única opção é construir uma nave e enviá-la para investigar o local.

Ao mesmo tempo, um grupo de humanos de uma organização underground conhecida como Guardians of Selfhood quer provar que a humanidade está sendo dominada por dentro por entidades alienígenas cuja nave caiu em um dos distantes planetas da confederação. O grupo é declarado terrorista e começa a sofrer perseguição ao longo da estória.

Obviamente, as duas tramas vão se aproximando gradualmente à medida que as descobertas feitas no planeta investigado começam a se relacionar com os eventos mostrados pelo grupo terrorista. O resultado é uma estória ampla e satisfatória que lida com os grandes temas já mencionados aqui: identidade, singularidades tecnológicas, pós-escassez, intervencionismo e mais.

Os livros acima, representam, é claro, apenas uma mínima fração do que está sendo produzido atualmente. Eu poderia continuar citando várias menções honrosas que completam a lista como:

  • End of World Blues — Jon Courtenay Grimwood
  • Darwin’s Radio & Darwin’s Children — Greg Bear
  • The Uplift Saga — David Brin
  • Incandescence — Greg Egan
  • Spin & Axis — Robert Charles Wilson
  • The Yiddish Policemen’s Union — Michael Chabon
  • Doomsday Book — Connie Willis
  • Hyperion — Dan Simmons
  • E centenas de outros…

Espero que a lista tenha sido de utilidade para alguém. Sintam-se, claro, à vontade para acrescentar outros nomes nos comentários.

O gap arquitetural

November 3rd, 2009 § 0

Desde que comecei a trabalhar com uma forma ou outra de metodologias ágeis, um dos assuntos que sempre me causou reflexão foi a questão de como lidar com arquitetura em um ambiente ágil. Obviamente, eu não sou o único que se questiona sobre isso: a discussão em torno de Big Design Up Front é tão velha quando a própria indústria. Existe uma polarização imensa sobre o assunto e é bem raro encontrar alguém que tenha desenvolvido alguma idéia que se encaixe no meio do caminho.

De fato, proponentes de metodologias ágeis geralmente gravitam em torno do que se comumente denomina design emergente, ou seja, a criação e concepção de conceitos arquiteturais–especialmente os não funcionais–ao longo do processo de amadurecimento da própria solução.

Duas coisas me levaram a repensar sobre o assunto nos últimos dias.

A primeira foi participar de uma palestra dada por ninguém menos do que Fred Brooks. Brooks é um dos autores mais influentes sobre a questão de arquitetura e design e eu sempre tive uma concordância forte com seus pontos de vista, especialmente no que tangem à necessidade de centralização de arquitetura como fonte de integridade conceitual em uma solução. O Mítico Homem-Mês toca profundamente nesse questão–de fato o livro pode ser considerado uma coleção de ensaios em torno desse tema–e Brooks sempre volta-se para essa necessidade de design arquitetural prévio para garantir soluções sólidas.

A segunda coisa que me levou a pensar sobre o assunto foi um tweet de Brian Foote, reportando da OOPSLA:

When we extol the benefits of architecture emerging in agile, we are really saying developers are better architects than Architects. #oopsla

Foote, conhecido pelo seu trabalho com Joseph Yoder, Big Ball of Mud, em que descreve a estruturação impensada de sistemas resultando em algo impossível de manter e impossível de se confiar, está correto em sua avaliação.

É claro que, nesse ponto, muita gente deve estar pensando que eu sou um elitista, que, de uma forma ou outra, considero arquitetos melhores do que desenvolvedores. Meu cargo atual pode até dar a entender isso–sou um gerente de arquitetura e engenharia de software na empresa onde trabalho–mas esse não é caso.

De fato, se eu tivesse hoje que me descrever em um currículo, eu teria bastante dificuldade de me conceituar em uma categoria qualquer. Eu poderia colocar que sou um desenvolvedor, já que faço isso. Também poderia colocar que sou um arquiteto, igualmente válido para o que faço. Poderia recorrer aos tradicionais programador ou analista de sistemas. A verdade é que sou tudo isso.

Para mim, um arquiteto não é alguém que atingiu um estado de santificação tal que pode abandonar os conturbados e lamacentos meandros da programação e recolher-se em sua torre de marfim para dispensar sua sabedoria sobre as massas menos iluminadas. Antes, tenho certeza de que a maioria dos meus colegas que se descrevem como arquitetos concordariam que arquitetura é mais uma questão de atuação e experiência do que de grau ou de talento nato. Eu não trabalharia com um desenvolvedor que não fosse capaz de responder por sua arquitetura e também não trabalharia com um arquiteto incapaz de codificar um algoritmo qualquer. Tentar extrair uma coisa da outra seria uma violação das premissas.

Voltando ao ponto, é justamente aí que entra a figura que Brooks descreve, o arquiteto-chefe que, por experiência, treinamento e sensibilidade adquiridos na prática, é capaz de guiar um sistema à integridade conceitual necessária para o seu bom desenvolvimento.

O que resolve, finalmente, para mim, a questão de emergência em metodologias ágeis. Eu acredito que, sim, deve haver arquitetura propriamente dita em qualquer projeto, mesmo os que subscrevem a metodologias ágeis e acho que isso nunca esteve fora da visão dos criadores das mesmas. Antes, essa é uma visão equivocada do que deve ou não emergir dentro das mesmas, que é a solução em si.

Arquitetura, por definição, é algo que precisa ser feito antes até um certo ponto, mesmo que depois sofra as mudanças necessárias por sua própria evolução gradual. Ela não pode ser estática–exceto em circunstâncias especiais que normalmente quase nenhum desenvolvedor encontrará ao longo de sua carreira–mas também não pode ser completamente ad hoc já que isso seria pouco mais do que pensar apenas no que está imediatamente adiante, sem se preocupar com os temas maiores que podem afetar o trabalho.

Em última instância, a arquitetura então não é necessariamente emergente: a solução o é. E por solução aqui, eu entendo o conjunto completo representado pelo produto, sua arquitetura, seu desenvolvimento e sua transição em produção. A responsabilidade de um arquiteto é traduzir o backlog, ou seja qual for seu equivalente, em temas conceituais que possuem integridade em conjunto e que levam a um desenvolvimento das características do software a seu tempo e com as suas necessidades atendidas.

Esse é um gap que fica claro na maior parte da discussão sobre arquitetura e metodologias ágeis e que precisa ser tratado mais freqüentemente pela literatura e seus proponentes.

Para finalizar, essa é apenas uma visão rápida do que tenho pensado nos últimos tempos sobre o assunto. Espero ter deixado minha visão um pouco mais clara do que estava em discussões passadas aqui no blog. Como sempre, comentários e discussões adicionais são sempre bem-vindos.

Corporate Speak: Endereçável

October 29th, 2009 § 2

en•de•re•çá•vel
adjetivo
1. Algo que pode ser endereçado
2. Aquilo que foi ou será endereçado

— Dicionário Corporativo, Superfície Reflexiva

en•de•re•ça•do
adjetivo
Tratado; corrigido; mitigado; repassado; contornado; delegado; ignorado

— Dicionário Corporativo, Superfície Reflexiva

en•de•re•çar
verbo transitivo
1. Tratar; corrigir; mitigar; repassar; contornar; delegar; ignorar
2. Ato de tornar algo endereçável
3. (corruptela do inglês to address) Começar a pensar ou lidar com algo

— Dicionário Corporativo, Superfície Reflexiva

Sinergia Arquitetural

October 27th, 2009 § 3

syn•er•gy |ˈsinərjē|
noun
the interaction or cooperation of two or more organizations, substances, or other agents to produce a combined effect greater than the sum of their separate effects

— Apple’s Mac OS X Dictionary

A definição acima não é muito padrão mas expressa bem o conceito em que a palavra é entendida hoje em dia. Sinergia vem do grego sunergos, que literalmente significa trabalhar em conjunto.

Em inglês, a palavra data de cerca de 1650, e tinha um sentido bastante medicinal, podendo indicar tanto a ação cooperativa entre dois ou mais músculos do corpo para a realização de um esforço ou a ação combinada de medicamentos ou drogas para criar um estímulo maior no paciente.

O Wikitionary define sinergia também com o “comportamento de um sistema que não pode ser previsto pelo comportamento de suas partes”, o que é uma definição bastante interessante e diversa do sentido necessariamente positivo que a palavra ganhou nas últimas décadas.

De fato, sinergia hoje em dia é considerada uma buzzword, uma palavra sem significado para indicar a vontade de que algum esforço conjunto qualquer resulte em mais lucro, para qualquer valor de lucro, do que um esforço individual das partes envolvidas–a palavra-chave na mudança de definição aqui sendo “vontade” versus o efeito real.

No meu trabalho com arquitetura de software, entretanto, sinergia é algo que faz sentido naturalmente no desenho de sistemas. De fato, sistemas de sistemas tender a exibir isso de uma forma quase que óbvio já que não é possível desenhar os mesmos de outra forma. Não é sem motivo que a página na Wikipedia que explica o conceito usa sinergismo, uma variação de sinergia para explicar a motivação primária desse objetivo. O Unix é um exemplo bem óbvio disso e algumas pessoas chegam a se referir a isso como o Tao do Unix pelo fato de que as peças se encaixam com tal perfeição que é impossível pensar em trabalhar de outra forma.

Sistemas de sistemas fazem sentido em praticamente qualquer situação em que a complexidade das partes individuais torne o sistema final potencialmente (e exponencialmente) difícil de ser descrito de maneira consistente.

Essa é uma das razões, inclusive, pela qual as pessoas se decepcionam tanto com frameworks como Rails ou Django quando precisam de expandir aplicações já existentes para níveis maiores de complementaridade ou escalabilidade. Frameworks fechados simplesmente não exibem esse tipo de sinergia integral necessária para garantir que os princípios aplicáveis em aplicações menores sejam os mesmos de aplicações maiores. O resultado é que, essencialmente, todos esses princípios são violados à medida que o sistema precisa crescer resultando em um entendimento completamente diferente do que se desejava a princípio. Funciona, mas sem elegância ou beleza.

A despeito do significado amortecido, uma reflexão cuidadosa sobre sinergia e sua aplicabilidade ao desenho de sistemas faria bem a qualquer desenvolvedor ou arquiteto de sistemas. Sapir-Whorf sendo fraca ou não, um entendimento real é impossível se o vocabulário natural é desprezado.

Balanço cultural de setembro

October 26th, 2009 § 0

Setembro melhorou um pouco em relação a agosto mas ainda estou bem aquém do que gostaria. O resultado do mês foi o seguinte:

  • 2 livros
  • 1 filme

Nos livros, comecei o mês lendo Thunderer, do Felix Gilman. O nome e a capa do livro mais blurbs mal escritos me deixaram meio ressabiado mas as resenhas geralmente positivas e as duas indicações a prêmios do gênero finalmente me convenceram a dar uma chance à estória.

Esse primeiro trabalho de Gilman me lembrou fortemente os livros do China Miéville, que estão entre os meus favoritos do New Weird (e de fantasia em geral, na verdade). De uma certa forma, parece que Gilman leu os livros de Miéville e decidiu que consegui escrever algo similar. E para crédito do autor, acho que ele conseguiu uma boa variação sobre o mesmo tema.

Essencialmente, a estória é sobre um peregrino, Arjun, que chega na enorme e multi-facetada cidade de Ararat em busca de uma divindade perdida por sua ordem de músicos e cantores. Arjun, estranho aos costumes da cidade, já chega em meio a um evento significativo: a transmutação de um navio pertencente a uma das casas que dominam a região perto do porto da cidade–cujo nome é o mesmo do título do livro–em uma fortaleza voadora usando os poderes deixados pela esteira de uma divindade que há muito não visitava a metrópole. O responsável por isso é um cientista chamado Holbach que está convencido poder controlar os sinais e símbolos que regem os poderes sobrenaturais da cidade. Como tudo em Ararat, entretanto, cidade de milhares de deuses, a passagem desse deus muda mais do que somente o navio e Arjun logo se vê envolvido na conseqüência desses eventos.

Como é fácil perceber, Gilman realmente bebeu na mesma fonte que Miéville e sua estória segue muitos dos passados traçados por esse último em Perdido Street Station. Arjun é muito parecido com Yagharek e Holbach com Isaac Dan der Grimnebulin. Os dois primeiros estão a procura de algo que perderam e os outros dois em busca de quebrar as barreiras da magia por meio de uma incipiente ciência taumatúrgica. Todos, movidos por suas necessidades, trazem às suas respectivas vidas mais do que conseguem controlar e precisam lidar com o que não previam para tentar restaurar uma aparência de ordem em seus mundos. E, da mesma forma, os sucessos nessa empresa são parciais e insatisfatórios.

Com isso não quero dizer também que Gilman plagiou descaradamente Miéville. Ararat, como New Crobuzon, é uma cidade-personagem mas Ararat é muito mais complexa do que a cidade imaginada por Miéville. De fato, como fica logo aparente, Ararat é muito mais expressiva: suas ruas resistem mapeamento e mudam de momento a momento, é possível passar semanas tentando atravessar certas áreas da cidade sem sucesso, há uma montanha ao longe que nunca pode ser alcançada e infinitas versões passadas e futuras da cidade convivem em planos que podem ser alcançados por uso de passagens entre as vielas e casas.

O resultado disso tudo é um livro que não fica nada a dever dos outros do gênero e que acrescenta originalidade ao que já existe. Um pequena falha que é a multidão de personagens que não é plenamente desenvolvida marca um pouco o livro mas não chega a atrapalhar tanto. Uma seqüência para o livro também já existe e está na minha fila.

O segundo livro que li no mês foi The Last Theorem, uma colaboração entre Arthur C. Clarke e Frederik Pohl, dois dos maiores mestres da era de ouro da ficção científica. O livro foi a última coisa que Clarke fez. Essencialmente, ele forneceu notas sobre uma estória que posteriormente foi escrita por Pohl.

O livro conta a estória de um jovem matemático nascido no Sri Lanka que consegue encontrar uma prova rápida, de apenas cinco páginas, para o último teorema de Fermat. A estória segue toda a sua vida, da infância até sua velhice dentro do backdrop da ignorância da Terra em relação a uma frota alienígena que está a caminho para erradicar os humanos sob ordens de uma civilização galáctica maior. As duas estórias se encontram quase que por acaso mais para o meio do livro.

A estória é interessante, e Pohl continua escrevendo bem, mas achei que as premissas eram um pouco fracas demais. A resolução da ameaça é um deus ex machina que me deixou bastante frustrado. Foi bem divertido acompanhar a vida de Ranjit Subramanian e as noções irônicas de Pohl sobre as civilizações galácticas ao redor da Terra mas o livro nunca passa muito disso. Destaque para discussões sobre razão, vida e inteligência mas nem essas compensam a fraqueza do livro.

Nos filmes, o único que assisti foi The Ugly Truth, comédia romântica com Gerard Butler (de 300) e Katherine Heigl (the Grey’s Anatomy). Divertido nas situações mas absolutamente imbecil na realização do todo. O final é óbvio desde o primeiro segundo do filme e não compensa as horas gastas. O que não fazemos pelas esposas. :)

No próximo mês, talvez algo mais consistente.

The Anubis Gates

October 23rd, 2009 § 1

Terminei de ler esses dias The Anubis Gates, uma fantasia de viagem ao tempo, deus egípcios e mágica por Tim Powers. O livro é de 1983 e estava na minha lista de leituras há um bom tempo por figurar em virtualmente todas as listas de clássicos de fantasia modernos–inclusive, tendo sido ganhador do Philip K. Dick Award do ano em que foi publicado.

Com esse pedigree, eu esperava muito do livro e não fiquei desapontado. Ao contrário, o livro fornece uma leitura deliciosa nos moldes das melhores fantasias urbanas dos últimos anos. Tim Powers consegue um balanço quase perfeito entre o que geralmente se esperaria de romances capa e escada–com pitadas generosas de magia jogadas no meio–e a mecânica de viagens do tempo que geralmente está mais presente em obras de ficção científica.

A estória começa quando uma cabal de mágicos tenta trazer os deuses egípcios de volta ao poder para derrotar o pode inglês no Egito e retornar à época glorioso em que a magica ainda funcionava bem sem destruir seus usuários. Uma tentativa de trazer Anubis à vida falha e resulta em uma série de fendas no tempo que permitem, anos depois, que um milionário os use para fazer viagens no tempo. Esse milionário organiza uma viagem à Londres de 1810 e contrata um professor–Brendan Doyle, o protagonista do livro–para guiar o grupo e fornecer comentários sobre a vida de Samuel Taylor Coleridge, o poeta romântico cuja palestra é o objetivo da viagem.

Obviamente, os interesses dos dois grupos se cruzam quando a viagem do grupo chama a atenção dos mágicos e o resultado é que Doyle fica preso na Londres do século 19 sem condições de retornar ao seu tempo. Forçado a mendigar e perseguido por grupos diversos–nem tudo é o que parece e há mais interesses em jogo do que somente uma mera viagem do tempo, Doyle tem que sobreviver a vários ataques e entender o mistério que cerca tudo. Isso inclui as aparições de um misterioso lobisomem capaz de trocar corpos e que possui também um interesse velado no que está acontecendo.

O resultado desse enredo aparentemente desconexo é uma série de aventuras e desventuras em que Doyle se vê jogado entre as figuras da época e precisa negociar seu caminho em meio a um mundo que ele conhece dos livros mas que é bem diferente em sua realidade. O livro consegue combinar muito bem as situações da época e os eventos bizarros que múltiplas viagens do tempo propiciam para resolver os nós que a estória levanta–ao contrário da maioria dos livros de viagem no tempo, por exemplo, Doyle quase nunca se dá bem com seu conhecimento e precisa usar sua inteligência muito mais que sua erudição e aprender com o que acontece.

Um dos pequenos problemas do livro é que, por conta do amplo número de personagens e situações, algumas coisas são resolvidas de repente, sem muito aviso e deixando um pouco de dúvida na cabeça do leitor. Mesmo assim, isso não acontece o suficiente para deixar uma marca da estória.

No geral, o livro atendeu plenamente suas expectativas e recomendo fortemente para quem gosta desse tipo de fantasia.

Fred Brooks sobre colaboração

October 22nd, 2009 § 2

Ontem, cortesia da Caelum, tive oportunidade de ver Fred Brooks falar sobre desenvolvimento, arquitetura de sistemas e colaboração entre times.

O evento, lançamento da tradução brasileira de seu trabalho mais famoso–O Mítico Homem-Mês–contou com várias outras palestras e uma sessão de Q&A com Brooks mas, infelizmente, só pude participar dos quarenta ou cinqüenta minutos que ele passou discorrendo sobre o assunto. Mesmo assim, foi muito bom ver o velho professor–ele está com quase 80 anos atualmente–falando sobre assuntos que eram relevantes em 1975, quando o livro foi impresso pela primeira vez, e que ainda são relevantes hoje, quase 40 anos depois.

O Mítico Homem-Mês é um livro que qualquer pessoa que desenvolve ou gerencia algum processo de desenvolvimento de software deveria ler. Apesar da ironia do próprio Brooks ao dizer que seu livro é como uma Bíblia de Engenharia de Software, porque “todo mundo lê mas ninguém faz nada sobre o assunto”, o livro permanece uma influência seminal entre todos os trabalhos que foram feitos no campo nos últimos 30 anos, especialmente entre os responsáveis por grande parte das metodologias de desenvolvimento que são usadas atualmente.

Um dos pontos interessantes da palestra–e algo que que só tem um conhecimento superficial do livro não notaria–é que Brooks possui uma visão particular de desenvolvimento que vai muito contra o que se fala hoje em termos de desenvolvimento “ágil”. Um dos exemplos engraçados disso foi quando um dos participantes, ao final da palestra, perguntou o que ele pensava sobre o papel da arquitetura e design colaborativos dentro de um time ágil–um time de Scrum, digamos. Brooks declarou enfaticamente, em resposta à insistência do participante, que, sem um arquiteto-chefe, nada que fosse feito teria a consistência–a integridade conceitual, por assim dizer–necessária para o bom desenvolvimento do software.

Falando sobre colaboração, Brooks apontou o papel do trabalho solo de grandes artistas e realizadores como essencial para a criação de obras duradouras. Mesmo no contexto de colaboração, ele diz, as maiores equipes raramente passam de uma colaboração complementar entre duas pessoas. Mais do que isso resulta em difusão da integridade conceitual da obra em face a desafios maiores.

Inclusive, comparando com o modelo de colaboração de projetos de código livre ou aberto, Brooks aponta o fato de que, nesses projetos, os construtores e clientes geralmente são os mesmos e isso torna o desenvolvimento algo completamente diferente. Há integridade conceitual, sim, não do sistema como um todo mas de suas partes. Isso pode realmente ser comprovado de maneira fácil do desenvolvimento dos grandes projetos como o Linux onde uma pessoa retém a visão intelectual mais profunda do desenvolvimento e onde as partes são íntegras entre si por via de convenções–style sheets de desenvolvimento, como Brooks denomina o processo.

Em suma, a visão de Brooks é refrescante em tempos em que metodologias ágeis estão em voga em uma compreensão real do que elas representam. É bom ver alguém que pensou exaustivamente sobre o assunto–e que está pronto para lançar mais um livro sobre suas reflexões ao longo dos anos–mostrar o que realmente importa no desenvolvimento. Raros são os times e empresas que possuem maturidade para ver as coisas dessa forma.

Minha única tristeza na participação do evento foi não ter podido pedir a Brooks para autografar meu exemplar–que repousa em Belo Horizonte à espera de uma mudança futura para São Paulo.

District 9

October 20th, 2009 § 2

Ontem consegui finalmente tirar um tempo para ir ao cinema e assistir District 9.

O filme era um dos mais esperados lançamentos do ano–tanto em ficção científica como no meio mainstream–e, pessoalmente, evitei ler praticamente qualquer coisa sobre o mesmo para ter uma visão mais pura sobre a obra, especialmente considerando os paralelos óbvios com o apartheid.

Sou um pouco suspeito para dizer, considerando minha relação com ficção científica, mas acho que o filme chega muito próximo de um clássico nos moldes de Blade Runner e Soylent Green, principalmente pela qualidade visceral da sua narrativa–com perdão do trocadilho. De uma forma bem prática, o filme consegue evitar os problemas que Sunshine apresentou, misturando uma narrativa essencialmente ficcional com um objetivo secundário de pregar uma mensagem específica.

Isso não significa, é claro, que District 9 não tenha seu embasamento em um problema ou mensagem específica. Como mencionei anterior, a questão do apartheid está lá e é bem óbvia. Mesmo assim, acho que acaba sendo algo no fundo, motivado pelas experiência do direitor e ofuscado, com boa razão, pela visão mais primária de comportamento humano face ao desconhecido (ao mesmo tempo em que apresenta a reação face ao incômodo).

District 9 não é, também, isento de falhas. Há uma dualidade inerente entre a necessidade de ser íntimo, evidenciada pelo formato de documentário no começo, e a necessidade de impressionar, mostrada a partir do meio do filme por cenas de perseguição e o milieu comum de filmes de ação. Mesmo assim, acho que o filme apresenta um bom balanço e consegue divertir ao mesmo tempo que motiva questões mais profundas.

O tempo vai dizer quão bem District 9 sobrevive como indagação da natureza humana. A despeito das vísceras e explosões, o filme é bem uma reflexão do nosso tempo e isso pode persistir. Espero que não tenhamos seqüências–não há nada para adicionar.

O princípio da caridade

October 20th, 2009 § 0

Da Wikipedia, o Princípio da Caridade:

In philosophy and rhetoric, the principle of charity requires interpreting a speaker’s statements to be rational and, in the case of any argument, considering its best, strongest possible interpretation. In its narrowest sense, the goal of this methodological principle is to avoid attributing irrationality, logical fallacies or falsehoods to the others’ statements, when a coherent, rational interpretation of the statements is available.

Esse é um princípio pelo qual tenho tentado (ênfase em tentado) viver desde que me entendo por uma pessoa capaz de discurso em qualquer nível. Esse mesmo princípio é o que me motiva geralmente a fazer o papel de Advogado do Diabo mesmo quando a outra pessoa está defendo algo em que eu acredito usando argumentos falaciosos, seja por deliberação ou não–tentando, de qualquer forma, chegar em um ponto comum onde não há necessariamente concordância mas pelo menos entendimento.

Infelizmente–e eu sei que faço isso provavelmente mais vezes do que eu gostaria de admitir–nós sempre trazemos nossas asserções para a mesa e quase nunca estamos dispostos a aceitar isso.

Enfim, algo para tentar colocar mais em prática no dia-a-dia.

Treetop: Implementando Brainfuck

October 1st, 2009 § 1

Introdução

Continuando a série sobre Treetop, é hora de brincar um pouco mais com todos os conceitos envolvidos e implementar uma linguagem Turing-complete.

Para não complicar as coisas, vamos usar uma linguagem bem simples, que demonstre os conceitos e não fique presa em detalhes de sintaxes. Brainfuck, apesar do nome, é uma boa escolha. Extremamente minimalista–possui somente oito comandos usando oito símbolos–permite uma implementação rápida e ao mesmo tempo permite brincar com os vários conceitos que estamos vendo. Tudo bem, eu admito que ela é um Turing tarpit mas serve com uma base interessante para esse artigo.

Brainfuck consiste em oito comandos, como mencionado acima, que manipulam um espaço de células de memória. Um ponteiro de instrução é definido para a primeira instrução e os comandos manipulam esse ponteiro para executar as várias instruções. Como cada comando é um simples símbolo, a ambigüidade da gramática é nula. Qualquer outro símbolo dentro do programa é ignorado e pode ser usado como uma comentário.

Os comandos da linguagem são:

  • >, incrementa o ponteiro de dados;
  • <, decrementa o ponteiro de dados;
  • +, incrementa o byte apontado pelo ponteiro de dados;
  • -, decrementa o byte apontado pelo ponteiro de dados;
  • ., escreve o valor do byte apontado pelo ponteiro de dados;
  • ., lê um byte e armazena no endereço apontado pelo ponteiro de dados;
  • [, se o byte no endereço atual do ponteiro de dados é zero, pula para frente até o próximo comando ];
  • ], se o byte no endereço atual do ponteiro de dados não é zero, pula para trás até o próximo comando [.

Reconhecendo a linguagem

Vamos olhar então como ficaria a gramática da linguagem:

grammar Brainfuck

  rule program
    instruction*
  end
  
  rule instruction
    loop / 
    simple /
    comment
  end
  
  rule loop
    '[' instructions:instruction* ']‘
  end
  
  rule simple
    ‘>’ /
    ‘<' /
    '+' /
    '-' /
    ',' / 
    '.'
  end
  
  rule comment
    [^\[\]><+-,.]
  end
  
end

A descrição da gramática é simples:

  • Um programa é uma série de zero ou mais instruções;
  • Uma instruções pode ser composta--ou seja, um loop, denotado pelos comandos [ e ]--, uma instrução simples, ou um comentário (que é qualquer caractere que não seja uma instrução);
  • Dentro de um loop, podem existir zero ou mais instruções.

Podemos ver que a gramática funciona executando comandos como abaixo:

>> require "rubygems"
=> false
>> require "treetop"
=> true
>> require "brainfuck"
=> true
>> p = BrainfuckParser.new
=> #
>> p.parse("><+-[]")
=> SyntaxNode offset=0, "><+-[]":
  SyntaxNode offset=0, ">"
  SyntaxNode offset=1, "<"
  SyntaxNode offset=2, "+"
  SyntaxNode offset=3, "-"
  SyntaxNode+Loop0 offset=4, "[]":
    SyntaxNode offset=4, "["
    SyntaxNode offset=5, ""
    SyntaxNode offset=5, "]"

Note que os comentários também são marcados por nós sintáticos, já que estamos processando os mesmos. Obviamente, quando da interpretação do programa, precisaremos eliminá-los.

Criando uma árvore sintática

A partir da gramática, o nosso objetivo é criar uma árvore manipulável, eliminando comentários, agrupando instruções de loop e preparando um ambiente para a execução em si.

Podemos usar a mesma técnica que usamos nos artigos anteriores.

Primeiro, definimos uma representação sintática. O arquivo brainfuck_ast.rb ficaria assim inicialmente:

class Program
  
  attr_reader :instructions
  
  def initialize(instructions)
    @instructions = instructions
  end
  
end

class Instruction
  
  attr_reader :command
  
  def initialize(command)
    @command = command
  end
  
end

class Loop
  
  attr_reader :instructions
  
  def initialize(instructions)
    @instructions = instructions
  end
  
end

Efetivamente, precisamos somente de três tipos de nós: o programa em si, para servir como um container inicial do ambiente, instruções simples e loops.

A seguir precisamos reconhecer isso em nossa gramática. Mostrando a gramática adaptada em um único passo, teríamos algo assim:

grammar Brainfuck

  rule program
    instruction* <ProgramPredicate>
  end
  
  rule instruction
    loop / 
    simple /
    comment
  end
  
  rule loop
    '[' instructions:instruction* ']' <LoopPredicate>
  end
  
  rule simple
    '>' <InstructionPredicate> /
    '<' <InstructionPredicate> /
    '+' <InstructionPredicate> /
    '-' <InstructionPredicate> /
    ',' <InstructionPredicate> / 
    '.' <InstructionPredicate>
  end
  
  rule comment
    [^\[\]><+-,.] <CommentPredicate>
  end
  
end

E finalmente, o arquivo contendo as extensões, brainfuck_ext.rb, ficaria assim:

module Common
  
  def build_elements(elements)
    elements.
      select { |element| element.respond_to?(:build) }.
      collect { |element| element.build }
  end
  
end

module ProgramPredicate
  
  include Common
  
  def build
    Program.new(build_elements(elements))
  end
  
end

module LoopPredicate
  
  include Common
  
  def build
    Loop.new(build_elements(instructions.elements))
  end
  
end

module InstructionPredicate
  
  def build
    Instruction.new(text_value)
  end
  
end

module CommentPredicate
  
end

No código acima, primeiro definimos um módulo comum que pode ser incluído em outros e possui um método que seleciona instruções que podem ser utilizadas. Depois definimos módulos para o que precisamos processar. E finalmente ignoramos os comentários.

Interpretando

Agora precisamos converter o código acima em um interpretador. A implementação é trivial e vamos acompanhá-la passo a passo, escrevendo o arquivo brainfuck_int.rb, que conterá o interpretador:

class BrainfuckInterpreter
  
  def initialize(commands)
    @ast = BrainfuckParser.new.parse(commands).build
  end
    
end

Esse método inicializa o interpretador recebendo uma série de comandos na forma de uma string e construindo uma árvore sintática final da mesma.

O próximo passo é começar a execução em si. Um interpretador Brainfuck deve inicialmente alocar um espaço de memória para execução e inicializar o ponteiro de instruções. Em seguida, deve seguir de instrução em instrução, rodando o comando em questão. O método que faz isso é o seguinte:

class BrainfuckInterpreter
  
  def initialize(commands)
    @ast = BrainfuckParser.new.parse(commands).build
  end
    
  def execute
    @addresses = [0] * 3000
    @pointer = 0
    execute_ast_node(@ast)
  end
    
end

Esse método inicializa o espaço de instruções e o ponteiro e em seguida chama a execução de um nó da árvore. Embora esse nó sempre seja um nó do tipo Program, o método está preparado para executar qualquer instrução.

Na seqüência, está a implementação do método execute_ast_node:

class BrainfuckInterpreter
  
  def initialize(commands)
    @ast = BrainfuckParser.new.parse(commands).build
  end
    
  def execute
    @addresses = [0] * 3000
    @pointer = 0
    execute_ast_node(@ast)
  end
  
  protected
  
  def execute_ast_node(ast)
    send("execute_" + ast.class.name.downcase, ast)
  end
    
end

O método é simplesmente um dispatch para o método apropriado para lidar com o tipo de nó em si.

O nó program é o que possui a implementação mais simples. Com o mesmo representa somente uma lista de instruções, a execução consiste em nada mais do que rodar essa lista, pedindo a execução de cada nó filho. A implementação fica, então, como mostrado abaixo:

class BrainfuckInterpreter
  
  def initialize(commands)
    @ast = BrainfuckParser.new.parse(commands).build
  end
    
  def execute
    @addresses = [0] * 3000
    @pointer = 0
    execute_ast_node(@ast)
  end
  
  protected
  
  def execute_ast_node(ast)
    send("execute_" + ast.class.name.downcase, ast)
  end
  
  def execute_program(ast)
    ast.instructions.each { |instruction| execute_ast_node(instruction) }
  end
    
end

A implementação dos nós instruction é igualmente simples:

class BrainfuckInterpreter
  
  def initialize(commands)
    @ast = BrainfuckParser.new.parse(commands).build
  end
    
  def execute
    @addresses = [0] * 3000
    @pointer = 0
    execute_ast_node(@ast)
  end
  
  protected
  
  def execute_ast_node(ast)
    send("execute_" + ast.class.name.downcase, ast)
  end
  
  def execute_program(ast)
    ast.instructions.each { |instruction| execute_ast_node(instruction) }
  end
  
  def execute_instruction(ast)
    case ast.command
    when '>'
      @pointer += 1
    when '<'
      @pointer -= 1      
    when '+'
      @addresses[@pointer] += 1
    when '-'
      @addresses[@pointer] -= 1      
    when ','
      @addresses[@pointer] = STDIN.getc
    when '.'
      STDOUT.print @addresses[@pointer].chr
    end
  end
    
end

Para cada instrução, executamos a instrução correspondente. As duas primeiras simplesmente movem o ponteiro de instrução--não estamos aqui, executando qualquer tipo de testes para evitar instruções inválidas. A duas instruções seguintes não movem o ponteiro de dados e simplesmente manipulam o dado que está no endereço especificado. Finalmente, as demais instruções lêem um byte da entrada padrão para o endereço atual ou emitem o byte atual para a saída padrão.

Finalmente, temos a implementação de um loop que também é trivial:

class BrainfuckInterpreter
  
  def initialize(commands)
    @ast = BrainfuckParser.new.parse(commands).build
  end
    
  def execute
    @addresses = [0] * 3000
    @pointer = 0
    execute_ast_node(@ast)
  end
  
  protected
  
  def execute_ast_node(ast)
    send("execute_" + ast.class.name.downcase, ast)
  end
  
  def execute_program(ast)
    ast.instructions.each { |instruction| execute_ast_node(instruction) }
  end
  
  def execute_instruction(ast)
    case ast.command
    when '>'
      @pointer += 1
    when '<'
      @pointer -= 1      
    when '+'
      @addresses[@pointer] += 1
    when '-'
      @addresses[@pointer] -= 1      
    when ','
      @addresses[@pointer] = STDIN.getc
    when '.'
      STDOUT.print @addresses[@pointer].chr
    end
  end
  
  def execute_loop(ast)
    while @addresses[@pointer] != 0
      ast.instructions.each { |instruction| execute_ast_node(instruction) }
    end
  end
  
    
end

A implementação simplesmente verifica se o endereço atual contém um valor nulo e caso contrário continua a execução das instruções aninhadas. Isso é o mesmo que pular para frente a para trás nos operadores [ e ].

Para completar o quadro e facilitar a execução, podemos incluir métodos auxiliares:

class BrainfuckInterpreter
  
  def initialize(commands)
    @ast = BrainfuckParser.new.parse(commands).build
  end
    
  def execute
    @addresses = [0] * 3000
    @pointer = 0
    execute_ast_node(@ast)
  end
  
  def self.run(commands)
    BrainfuckInterpreter.new(commands).execute
  end

  def self.run_file(file)
    BrainfuckInterpreter.new(File.readlines(file).join).execute
  end
  
  
  protected
  
  def execute_ast_node(ast)
    send("execute_" + ast.class.name.downcase, ast)
  end
  
  def execute_program(ast)
    ast.instructions.each { |instruction| execute_ast_node(instruction) }
  end
  
  def execute_instruction(ast)
    case ast.command
    when '>'
      @pointer += 1
    when '<'
      @pointer -= 1      
    when '+'
      @addresses[@pointer] += 1
    when '-'
      @addresses[@pointer] -= 1      
    when ','
      @addresses[@pointer] = STDIN.getc
    when '.'
      STDOUT.print @addresses[@pointer].chr
    end
  end
  
  def execute_loop(ast)
    while @addresses[@pointer] != 0
      ast.instructions.each { |instruction| execute_ast_node(instruction) }
    end
  end
    
end

E com isso, podemos testar um programa. Abra um novo arquivo chamado brainfuck_test.rb e introduza o seguinte código:

require "rubygems"
require "treetop"
require "brainfuck"
require "brainfuckext"
require "brainfuckast"
require "brainfuck_int"

code = <<-EOF +++ +++ +++ + initialize counter (cell #0) to 10 [ use loop to set the next four cells to 70/100/30/10 > +++ +++ + add 7 to cell #1 > +++ +++ +++ + add 10 to cell #2 > +++ add 3 to cell #3 > + add 1 to cell #4 <<< < - decrement counter (cell #0) ]
>++ . print 'H' >+. print 'e' +++ +++ +. print 'l' . print 'l' +++ . print 'o' >++ . print ' ' <<+ +++ +++ +++ +++ ++. print 'W' >. print 'o' +++ . print 'r' --- --- . print 'l' --- --- --. print 'd' >+. print '!' >. print '\n' EOF

BrainfuckInterpreter.run(code)

O código está "comentado" (lembre-se que comandos não reconhecidos são ignorados). Se você rodar o programa agora, obterá o resultado desejado:

~$ ruby brainfuck_test.rb 
Hello World!

Pronto! Você agora possui um interpretador funcional--embora seriamente lento e incrivelmente complexo de se programar--de uma linguagem computacionalmente completa, capaz de realizar qualquer tarefa que você deseje executar.

Um outro teste interessante é rodar o código que imprime a canção 99 bottles of beer on the wall, cuja versão em Brainfuck é um pesadelo. Você verá que, embora lento, o código consegue imprimir as linhas com relativa facilidade.

Comparando a velocidade de uma versão Ruby e uma versão Brainfuck da canção temos os resultados (Ruby 1.9; iMac 2.8Ghz recente rodando Snow Leopard):

~$ time 99.bf
  real  0m0.679s
  user  0m0.586s
  sys   0m0.045s
  
~$ time 99.rb
  real  0m0.016s
  user  0m0.006s
  sys   0m0.006s

Digamos que imprimir caracteres um a um não é uma forma eficiente de se trabalhar. Obviamente, double dispatching também não é uma técnica boa em todos os casos e vai adicionar um certo overhead em troca de flexibilidade. Mas, mesmo removendo o tempo de carga do Ruby, não haveria tantas melhoras no programa.

Conclusão

Como esse artigo vimos como fazer a cadeia completa de implementação, incluindo a implementação de um interpretador funcional. Mesmo que a implementação seja bem simples, as lições são as mesmas para qualquer outra linguagem e o limite está mais na sintaxe e semântica do que nas técnicas em si. Um exercício para o leitor é implementar um otimizador para Brainfuck que agrupe instruções iguais e efetue as operações em uma única passagem. Aqui, é claro, cabe uma aviso: implementações de linguagens generalizadas de programação obviamente precisam de muito mais do que isso para funcionar bem. O Treetop oferece uma conveniência quando velocidade máxima de execução não é o desejado e sim velocidade de implementação.

Com isso encerramos essa série sobre Treetop. Eventualmente, é possível que eu escreva um artigo sobre a implementação de uma linguagem menos minimalista, mas no momento não há tempo para isso. Espero que o tempo gasto lendo esses artigos tenha sido proveitoso.

Nota: Para ver a série completa, siga a categoria Treetop deste blog.