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?
:)