Segunda-feira, Novembro 16, 2009

A Habilidade da Lentidão

Na outra semana estivemos no mo kwoon com um colega novo, aprendendo os primeiros mistérios do kung fu.

Este novo colega, julguei, se enquadrou facilmente no grupo dos afobados; sempre seu discurso o convidava a dar "exemplos" do golpeamentos, e cada um deles mais e mais próximo do corpo da pessoa com quem estava conversando. Assim é a ansiedade de quem conhece a arte marcial através de romances e obras audio-visuais.

Em um determinado momento, discutindo os princípios do ving tsun, este novo colega levantou uma questão sobre a eficácia de um posicionamento defensivo: por mais que o outro esteja posicionado adequadamente, eu posso desarmá-lo sendo bem rápido, não posso?

A objeção padrão a esse tipo de hipótese é simples: e se o outro for tão rápido quanto você? Há diversos caminhos interessantes de discussão que iniciam com essa resposta.

Nesse dia, porém, me sentido inspirado para falar sobre a minha experiência pessoal. Isso acontece às vezes durante a aula e eu me dou a liberdade de falar porque, sendo um igual, me parece inspirador para os mais novos ouvir sobre as minhas dificuldades e realizações.

Elaborando o meu relato, eis o que eu tenho a dizer sobre o assunto.

É claro o poder de agir em alta velocidade é útil e desejável. Mas a percepção de que este poder é o grande poder, ou mesmo o verdadeiro poder, é enganosa. Em particular, os modos de viver e produzir em nossa sociedade constróem um excesso de valor sobre este poder em particular; além do grande apelo dramático de certos filmes.

Quando eu comecei a treinar artes marciais logo se tornou evidente uma quantidade enorme de tensão no meu corpo. Esta tensão habitava, porém, um corpo vazio do impulso de agir -- o período de treinamento mais particularmente focalizado em "golpear" parecia quase totalmente inútil.

Mas, como inevitável, em um determinado momento a tensão encontrou seu caminho e se tornou então evidente a ansiedade por agir que estava contendo. É ainda verdade que passo boa parte do meu tempo resolvendo uma ansiedade por agir. Essa ansiedade não resolvida se resolve em impulsos de ação -- de súbito, uma vontade de ler, de súbito, uma vontade de falar, de súbito, uma vontade de produzir, de súbito, uma vontade de não fazer nada.

Se você está convencido de que esse modo de ser é razoável, então o poder de agir e completar ações em alta velocidade parecerá o ideal da vida. Afinal, se um determinado surto de ação dura pouco, é preciso fazer muito com esse pouco. Assim, quem vive de ansiedades em ansiedades realiza pouco, porque não se pode fazer muito em pouco tempo.

Estrategicamente, podemos enxergar nessa pessoa a empresa que se vê presa na teia do time to market. Essa empresa está sempre se "reajustando" ao "mercado", mudando de rumo de acordo com suas "tendências", se "alinhando" com cliente. A cada momento suas prioridares são reavaliadas e alguma outra coisa se torna prioridade máxima.

Esta empresa nunca realizará as atividades com prioridade não-máxima, nunca realizará os projetos de médio a longo prazo. Ela está cheia da ansiedade por obter os resultados cuja possibilidade só passou a enxergar hoje. Está sempre correndo atrás de algum prejuízo.

Ela não compreende que a possibilidade que se realiza hoje está amadurecendo desde a tempo passado. Se ela vê hoje as condições de formação da possibilidade futura, poderá agir para obter os resultados do futuro. O indivíduo que se interessa por uma atividade hoje, se trabalhar com paciência, poderá realizar as grandes coisas que exigem muitos dias de atenção.

Assim, enquanto é sempre possível resolver as crises e se adequar às mutações através da habilidade da rapidez, é também sempre possível resolver as crises e se adequar às mutações através da habilidade da lentidão. Atuar com lentidão exige -- permite! -- atuar com antecipação. Para atuar com antecipação, é preciso ser lento; para atuar com antecipação, é preciso acompanhar com cuidado as correntes das mutações; não se precipitar.

Não é fácil atuar com lentidão, o que pode não parecer intuitivo. Quando o indivíduo experimenta exercícios simples, como andar a um passo com metade da velocidade do seu passo normal, ele compreende rapidamente que a ansiedade é uma propriedade fundamental do seu corpo -- não obstante a quantidade que ocorre em um e em outro.

Mesmo a alta velocidade corporal exige o lento acomodamento da mente à situação; quando a mente é um turbilhão, não é possível agir em alta velocidade sob controle; citando um belo anime, quando um guerreiro usa suas armas fora de controle, ele pode cortar algo que não deseja cortar, ou mesmo cortar aquilo que ele deve defender.

Se tornou, então, foco do meu treinamento em artes marciais a habilidade de agir lentamente, com eficiência. Pelas razões expostas acima, agir lentamente com eficiência não é uma contradição. É um objetivo necessário a quem acumula tensão e ansiedade; provavelmente seria diferente para disposições pessoais diferentes.

Sexta-feira, Novembro 13, 2009

As sombras do Ambiente de Programação C++

Estou realmente escrevendo sobre este assunto! É claro que, até reunir material suficiente para um livro maneiro, vai demorar muito tempo. Até lá espero encontrar alguma publicação legal que aceite artigos.

Minha motivação inicial para entender os mistérios do ambiente de programação C++ foi estudar a ABI do C++, que seria necessário implementar no sistema operacional C++.

Existem outros aspectos interessantes desse ambiente, porém, que são pouco focalizados pelas obras educativas sobre a linguagem.

Um deles é o relacionamento entre o mundo restrito da norma ISO C e o mundo maior do sistema. C fala a você sobre unidades de tradução e estabelece regras mínimas sobre como múltiplas unidades de tradução podem compor um programa válido. Ao redor da linguagem, porém, existe o problema de processar cada uma dessas unidades e produzir de fato um negócio único equivalente a este programa. Existirão então diversos blocos intermediários, os "objetos compilados", e existirá um componente ligador. A norma C não descreve este ligador, apenas impõe seus requisitos.

Outro é o modo como os mecanismo de linguagem e do sistema são usados na prática como mecanismos de abstração, e como os projetos de engenharia fazem uso desses mecanismos para lidar com problemas reais de configuração. O ambiente como um todo provê diversas maneiras de abstrair certos trechos de código; desde a seleção de arquivos a compilar, onde um arquivo pode conter a listagem para o sistema A enquanto outro contém a listagem para o sistema B; até a composição de bibliotecas dinâmicas no momento da carga na memória, onde o programa usa a versão A da biblioteca no sistema A, e a versão B da biblioteca no sistema B.

Para lidar com toda essa parafernália sistêmica ao redor do C são imprescindíveis ferramentas que operam fora da linguagem, dirigindo todas as ferramentas de forma conveniente. O projeto de middleware de televisão digital da TQTVD tem, por exemplo, aproximadamente mil unidades de tradução individuais a processar. Certamente o programador não deve chamar as ferramentas uma vez para cada um desses arquivos, sob pena de tornar o dia de trabalho um desperdício de horas absurdo. Existem portanto ferramentas para apoiar essa tarefa que, apesar de não fazer parte da definição da linguagem ou do compilador, são absolutamente imprescindíveis para se trabalhar com ela.

Tudo isso implica que a expertise no desenvolvimento de sistemas em C++ envolve diversas outras habilidades e técnicas individuais, fora aquelas envolvendo a expressão de programas em C++. Essas outras habilidades e técnicas se tornam tão mais importantes quanto o projeto pressione o programador para fora da abstração de um sistema para o mundo concreto das diversas máquinas.

Sob outro ângulo, posso comparar as listas de componentes teórica e prática que compõe o pipeline de transformação de código-fonte. Teoricamente, o pipeline C é: pré-processador, compilador, ligador ou arquivador. Na prática do projeto onde estou envolvido é: configurador de build, ferramenta de build, compilador.

Uma lição que estou tirando de tudo isso é que os melhores pensamentos sobre a linguagem de programação ideal nunca resultariam em um excelente sistema construído se essa linguagem não for implementada em ferramentas adequadas, que suportem um ciclo de desenvolvimento extremamente conveniente. O esquema de compilação separada do C oferece bons mecanismos de abstração, sem dúvida, mas torna o tempo de compilação uma infinitude de "começa e termina" processos.

Em contra-partida, opiniões sobre características de linguagem de programação do tipo "viagem na maionese" ou "impossível" parecem refletir o fato de que, até então, ninguém soube produzir uma ferramenta que a implementasse. O mecanismo de "export" do C++ por exemplo foi considerado um fracasso; agora que as técnicas de LTO e serialização de ASTs de programas estão se tornando mais difundidas, talvez com mais cinco ou dez anos "export" seja trivial.

Quinta-feira, Novembro 12, 2009

MIT OpenCourseWare

Estou cursando Introdução à Ciência da Computação no MIT todos os dias de manhã, indo para o trabalho!

Para quem não sabe, em 2002 o MIT lançou o projeto OpenCourseWare para publicar material didático dos seus cursos online sob uma licença do Creative Commons.

Alguns cursos do MIT agora têm vídeos das palestras disponíveis como parte do OCW. Dá pra assistir perfeitamente no meu telefone de manhã.

Segunda-feira, Novembro 09, 2009

Baixar MP3 e bandalhas no trânsito

Hoje de manhã presenciei uma peripécia no trânsito que finalmente me iluminou sobre a razão porque eu parei de baixar mp3 na Internet.

Estávamos seguindo pelo aterro até a Presidente Antônio Carlos e havia um trânsito razoável. Parados do lado daquele monumento de guerra, antes do MAM, vimos um e outro carro passando pela pista interna que tem ali na frente do monumento -- uma pista para um carro que começava um pouco antes e terminava a uns cem metros de onde estávamos.

Discutimos um pouco a validade daquela peripécia, porque o sujeito não ia ganhar muito tempo com aquilo, e eu pensei que não valia a pena ganhar tão pouco tempo com um truque daqueles.

Depois, pensei por que não valia a pena; afinal, ganharia-se um tempo zero, certo? Desconsiderando o problema do primeiro eu da classe média.

Me ocorreu então que tipo de pressa levaria uma pessoa a se desviar da rota normal para tentar economizar tempo. Pensei: espero que esse sujeito esteja economizando um tempo útil, porque de outro modo ele está se aborrecendo à toa. Então me ocorreu um processo de ansiedade que levaria um motorista a procurar rotas "espertas" para chegar mais cedo onde quer que seja.

Então eu entendi porque eu mesmo nunca faria aquilo: porque um processo de ansiedade tem em geral dois futuros, a satisfação ou a supressão; e satisfazer a uma ansiedade é o mesmo que alimentá-la.

Esta é a razão porque eu não uso mais programas de baixar mp3, nem tenho um instalado no meu sistema. Quando você tem gosto por música e descobre os navegadores de mp3 surge uma ansiedade -- a ansiedade de ter tudo. O mundo se transforma de um local onde você não pode ouvir tudo que existe, porque precisa transformar recursos em CDs, para um mundo onde você pode ter tudo, em troca de algum tempo de pesquisa e espera. Os baixadores de mp3 são pessoas que se vangloriam por pegar álbuns inteiros, como se baixar músicas individuais fosse indigno e revelasse a condição de ouve-por-modinha ao invés de um apreciador verdadeiro. Os programas passam 24h por dia ligados obtendo as coletâneas mais obscuras encontráveis, entupindo o HD, e o indivíduo faz ALT+TAB frequentemente para observar as barras de progressão de download.

Quando eu percebi essa ansiedade, cortei o hábito.

Terça-feira, Novembro 03, 2009

Java vs. C#, uma perspectiva estranha

Você pode achar o que quiser na disputa entre Java e C#, mas onde na documentação da Microsoft você vai encontrar uma afirmação tão direta, sincera e esclarecedora?

"Prior to Java 2 Standard Edition, JDK 1.4, the AWT focus subsystem was inadequate."

http://java.sun.com/javase/6/docs/api/java/awt/doc-files/FocusSpec.html

Quinta-feira, Outubro 29, 2009

bug bizarro no RVCT 2.2

Descobrimos um bug bizarro no RVCT 2.2 onde a compilação de uma chamada a um operador de conversão do std::auto_ptr gera as seguintes instruções:

1. push into stack from register
2. unconditionally jump to (1)

Alguém já viu isso?

Segunda-feira, Outubro 19, 2009

Dell, meu CD arranhou, e agora?

Está chegando o segundo teste do atendimento ao cliente da Dell. Não posso mais dizer suporte ao cliente porque o meu contrato de suporte expirou, certo?

Pois bem, o CD do Windows XP que acompanhava a minha primeira máquina Dell arranhou. E adivinha? O Windows XP naquela máquina não inicia mais.

O que eu quero é bem simples: uma cópia nova deste CD. Posso até mesmo fazer o download, se eles quiserem economizar a mídia e a entrega. Mas será que a Dell vai se prontificar a substituir esse CD?