Programador Cego

O Ângelo Beck tem 27 anos e é um exemplo inspirador de superação: ele é um programador cego. Pare para pensar no que estas duas palavras juntas significam: programador cego.

  • O programador passa horas de seu dia em frente ao computador, lendo, digitando e testando códigos. Os códigos começam simples mas rapidamente ficam complexos à medida que o programa cresce. É fácil se perder em meio ao código, é preciso constantemente reler algum trecho ou pular rapidamente para a definição de uma função, ver quais são seus argumentos, analisar seus algoritmos. O programador consegue reter em sua cabeça parte do funcionamento de um programa, mas os detalhes só são conhecidos com a leitura e análise do código.
  • O cego não enxerga.

E como alguém que não enxerga pode programar códigos?

Para usar o computador, um cego precisa de um leitor de tela. Este leitor é um programa que dita, usando uma voz robótica, tudo o que está escrito na tela. É como se tivesse alguém ao seu lado lendo em voz alta tudo o que aparece no monitor.

Um dia, por curiosidade, instalei um destes leitores para ter uma idéia de como era usar o computador sem enxergar. Fechei os olhos e tentei escrever um texto e ler alguns e-mails. Eu fiquei deprimido. Demorava MUITO tempo para conseguir fazer coisas muito simples, e a voz digital rapidamente se tornou cansativa por sempre usar o mesmo tom. Um monólogo no escuro. Deu medo.

Um programador cego tem que esperar que o leitor dite a linha atual (cheia de pontuação como $ @ ; ! =) para saber onde está o cursor. Se quiser saber o que tem na linha anterior, ele move o cursor para cima e espera que a linha seja ditada. E assim, uma linha de cada vez, ele vai se achando em que parte do código ele está.

Quem já brincou com o editor de textos do UNIX (ed), sabe como é tenebroso enxergar somente uma linha por vez. A falta de contexto te deixa completamente perdido.

Quer sentir o quão difícil é saber em que parte do código você está, sem ter contexto?

  • Abra o código de um programa seu, que você conheça bem.
  • Peça para alguém ao seu lado te ajudar, essa pessoa será seu leitor de tela.
  • Feche os olhos e NÃO ABRA MAIS.
  • Peça para essa pessoa escolher uma linha qualquer, dentro de uma função/método qualquer.
  • Agora a pessoa vai te ditar esta linha. Somente ditar, ela não pode dar nenhuma outra dica.
  • Responda: Qual o nome da função/método?
  • Não tem como saber? Então peça para a pessoa ditar a linha anterior.
  • Ou quem sabe a próxima linha.
  • Mas qual era mesmo a primeira linha que foi ditada? Poderia repetir?

E aí você percebe como é difícil ler um código sem contexto. Imagine analisar, editar, testar, depurar…

Por falar nisso, há algum cego que lê o blog? Deixe um comentário contando suas experiências! As Funções ZZ já são usadas por cegos há algum tempo.

Por curiosidade acabei de acessar o blog no lynx e os caras do WordPress estão de parabéns, pois o blog é muito acessível, com o texto do artigo já no início, sem poluição.

Por favor, leia os dois e-mails seguintes com muita atenção. O Ângelo conta um pouco de sua história e explica como ele faz para tornar menos impossível a tarefa de programar sem enxergar. O primeiro e-mail tem alguns trechos que cortei, o segundo está na íntegra (e muito bem escrito).

Atualização em 18 de outubro de 2008: O Ângelo conta que também dá aulas de PHP. Que tal convidá-lo para falar sobre programação em sua empresa? Tenho certeza que os funcionários ficarão bem motivados ao ver do que esse cara é capaz. Se quiser entrar em contato com ele, escreva para angelobeck (a) floripa com br.

_________________________________________________________________________

De: Ângelo Beck
Para: Aurélio Marinho Jargas
Data: 11 de setembro de 2008

Olá Aurélio,

Ainda não fazem dois anos que eu comecei a trabalhar com php. Estou construindo um gerenciador de conteúdos e é claro que eu preciso de um conversor de textos para html.

[...]

Estou com 27 anos. Fazem uns três anos que eu me tornei completamente cego e por isto decidi me voltar para a programação. Estou tendo que aprender tudo sozinho mesmo. E o mais chato é que não é fácil editar códigos. Eu inventei alguns truques para facilitar a minha vida, mas aproveitar o código dos outros nem sempre é possível e por isto acabei fazendo tudo a partir do zero.

[...]

Li teu livro sobre as expressões regulares e lhe dou os parabéns. Muito bom mesmo. E só não vou adquiri-lo pois não enxergo material impresso… então fico com o que está publicado na web.

[...]

Bem… obrigado pela atenção,

Ângelo Beck

_________________________________________________________________________

De: Ângelo Beck
Para: Aurélio Marinho Jargas
Data: 12 de setembro de 2008

Olá Aurélio,

Indentação atrapalha, comentários ajudam

A respeito dos truques de programação, o principal deles é a forma de formatar e comentar os blocos de comandos.

Indentar o texto, colocando espaços ou tabulações no início da linha gera um efeito visual interessante, mas completamente inútil quando não enxergamos. Além do mais, quando não utilizamos mouse, estes espaços e tabulações apenas atrapalham a movimentação, que deve ser feita pelo teclado.

Então, para que eu não me perca entre inúmeros blocos de comandos, que devem ser abertos e fechados, utilizo o seguinte método:

Primeiro, um bloco “{” sempre se inicia em uma nova linha, e após o início do bloco vem um comentário que descreve o conteúdo do bloco.

Ao final do bloco, seu fechamento “}” é feito também em uma nova linha seguido do mesmo comentário da abertura.

Fica mais ou menos assim:

  if ($carro)
  { // possui carro
  print $carro
  } // possui carro
  else
  { // não possui carro
  print 'O carro sumiu!';
  } // não possui carro

Parece besta, mas em alguns trechos do código acabam por haver inúmeros blocos aninhados, e esta forma de comentá-los se torna extremamente eficiente:

Aqui vai um pequeno script como exemplo e logo abaixo seu código

array_sub_search

Retorna a chave primária de um array cuja chave secundária previamente conhecida contenha o valor pesquisado.

$key = array_sub_search ($find-me, $array, $secundary_key);

Exemplo:

<?php
$array[1]['fruta'] = 'banana';
$array[1]['salada'] = 'manga';
$array[2]['fruta'] = 'manga';
$array[2]['salada'] = 'alface';
$key = array_sub_search ('manga', $array, 'fruta');

// retorna 2, pois em 1 manga não é fruta
?>

Código de array_sub_search():

<?php
// *** Ecolabore Engine - Copyright 2008 Angelo Beck ***

function array_sub_search ($value, $array, $sub)
{ // array_sub_search
if (is_array ($array))
{ // is array
foreach ($array as $key => $item)
{ // find loop
if ($item[$sub] == $value)
{ // key found
$found = $key;
break;
} // key found
} // find loop
} // is array
return ($found);
} // array sub search
?>

Com tantos blocos aninhados seria muito fácil de se perder. Desta forma, ao correr para um trecho qualquer do código e ouvir o comentário dos blocos, podemos saber exatamente onde estamos. Como a leitura é feita linha por linha, imagine reduzir a sua janela para apenas uma linha de altura! Será impossível de reconhecer em que lugar do código estamos, não é? Por isto que colocar comentários e suprimir a indentação é tão útil!

Bem… é claro que eu não documentei tão detalhadamente todo o meu sistema. Mas pelo menos as funções eu fiz questão de documentar para poder utilizá-las adequadamente no futuro.

Dar nomes úteis para os caracteres

Outro truque é exigir que o leitor de telas, o sintetizador de voz que “fala” o que está escrito, pronuncie algumas palavras especiais ao encontrar certos caracteres ou strings.

Por exemplo, { e } devem ser ditos como “início do bloco” e “fim do bloco”, já que normalmente são utilizados para delimitar blocos de comandos.

  • // = “nota”. Poderia dizer “comentário”, porém, “nota” é mais curto para se pronunciar!
  • ' = “As”, também por ser mais curto do que “apóstrofo”.
  • " = “nulo”, já que normalmente representa uma string vazia.
  • $ = “var”, já que é utilizado para indicar uma variável.
  • ; = “fim”, para indicar um fim de instrução (exigido pelo php)
  • ! = “not”, já que é utilizado como negação – exemplo != ou if(!$carro)

Para ficar mais confortável de se ouvir, também fiz as seguintes exigências:

  • elseif = elz if
  • else = elz
  • [ = colchete
  • ] = fecha colchete
  • ( = parêntese
  • ) = fecha parêntese

A seguinte linha:

elseif ($carro != '')
{ // presente
print $carro;
} // presente

normalmente seria pronunciado assim:

elssêif abrir parênteses cifrão carro exclamação igual apóstrofo apóstrofo fechar parênteses
abrir chavetas barra barra presente
print cifrão carro ponto e vírgula
fechar chavetas barra barra presente

agora é pronunciado assim:

elz if parêntese var carro not igual nulo fecha parêntese
início do bloco nota presente
print var carro fim
fim do bloco nota presente

É meio esquisito “ler” o que se vê, mas com o tempo a gente se acostuma e, de tanto ouvir, var carro fim é o mesmo que $carro;

No fim não deixa de ser organizado e elegante também.

Blocos sempre iniciam em uma nova linha

Quando passamos o cursor de uma linha para a outra, o sintetizador passa a ler a nova linha. Nem sempre temos tempo de ouvir uma linha inteira para saber que no final haverá um início de bloco “{”. Por isto a decisão de que qualquer bloco deve ser iniciado em uma nova linha.

Agora imagina o saco que é ler um código escrito por quem enxerga, onde blocos são abertos e fechados no fim das linhas… Ou pior:

  { else }

Mas isto é o fim!

Código HTML: Organização das tags

Também no html eu utilizo a mesma regra: tags que iniciam em uma nova linha, são fechadas em uma nova linha. Também podem ser abertas e fechadas na mesma linha.

Desta forma,

<html>
<head>
<title>Olá</title>
</head>
<body>
<center>
<h1>Bem vindo</h1>
<p><b><i>Obrigado por ter nos visitado</i></b></p>
</center>
</body>
</html>

Isto aí é válido.

Mas isto não:

<html><head>
<title>
olá
</title></head>
<body><center>
<h1>Bem vindo
</h1></center></body></html>

HTML: Dicas de pronúncia

Um truque também para o html é exigir a seguinte pronúncia:

  • < = “menor” (ao invés de “menor que”)
  • > = “maior” (ao invés de “maior que”)
  • </ = “fecha”
  • <!– = “comentário”
  • –> = “fim do comentário”

CSS: Pode usar a mesma pronúncia do PHP

Com folhas de estilo css eu nem me incomodo, pois utilizo as mesmas regras de pronúncia do php:

h1.principal {
color:#880000;
}

é dito como:

hagá um ponto principal início do bloco
color dois pontos cardinal oitocentos e oitenta mil fim
fim do bloco

Curiosidades

Bem… acho que é isto.

Espero ter alguma coisa mais concreta para mostrar em breve.

Por curiosidade,

  • :-) = “risos”
  • ;-) = “piscadela”
  • vc = você
  • Angelo = Ângelo (e não Angêlo)
  • microsoft = maicrossóft (e não microzôft)
  • Rudolf Steiner = Rúdolf Stáiner (e não Rudôlf Steinêr)
  • Google = Gúgol (e não gô-ôgle)
  • skype = Scáipe (e não skipe)

e mais umas correçõezinhas assim.

Diferenças ao escrever um texto e um programa

Quando leio ou escrevo um texto (não um script) desativo a pronuncia da pontuação, parênteses, colchetes, etc. e também desativo o “eco” do teclado. De forma que eu não ouço o que eu digito. Apenas após a escrita eu repasso o texto para “ouvir” se algo está errado. Também, quando alguém coloca algo entre parênteses, na maioria das vezes eu não sei que eles existem.

Já quando estou programando, ativo o eco do teclado para ter certeza de que não vai faltar nem um colchete… e mesmo assim normalmente fica faltando uma aspa não fechada ou coisas deste tipo! Também ativo a leitura da pontuação, já que $cidade .= $país; não são duas frases mal escritas.

Até,

Ângelo Beck

E você leitor(a), qual era mesmo aquela sua desculpa para não programar?
:)

— EOF —

Gostou desse texto? Aqui tem mais.