MAC 499 - Trabalho de Formatura Supervisionado

Emilio de Carmargo Francesquini
emilio@linux.ime.usp.br

Professor responsável: Carlos Eduardo Ferreira
cef@ime.usp.br

Professor supervisor: Marcelo Finger
mfinger@ime.usp.br

Novembro de 2002


Desenvolvimento do Projeto e o BCC


O desenvolvimento

O processo de desenvolvimento não foi muito diferente do processo convencional para a elaboração de um EP. O projeto não era um projeto muito grande, e havia apenas uma pessoa para sua implementação, desta forma, técnicas mais aprimoradas de engenharia de software não foram utilizadas. Estava tudo concentrado na cabeça de uma pessoa só, o que é justamente o contrário do que qualquer técnica de engenharia de software prega, porém neste caso não acredito que houvesse alguma outra forma de fazê-lo.

O prazo dado na proposta para a monografia foi bem razoável, de forma que todas as fases do projeto puderam ser entregues na data especificada no cronograma, ou com um mínimo de atraso. Em geral o prazo para o projeto foi muito bem estipulado porquê se conhecia todos os requisitos do sistema, e as funcionalidades do sistema como um todo estavam muito bem definidas (para as que não estavam eu tinha a liberdade de definí-las como bem entendesse). Creio que na maioria das vezes isso não seja verdade, o que pode ser o motivo de sermos (nós, pessoal de computação em geral) tão ruins em dar prazos..

Para o desenvolvimento do sistema foi necessário aprender muito mais fonética e estruturas de ortografia e escrita da língua portuguêsa do que eu havia antecipado (basta ver o número de referências bibliográficas a livros de fonética). Simplesmente parece muito fácil para nós pegar um texto qualquer escrito em português e lê-lo pronunciando corretamente cada uma das suas palavras. De tão automática e rotineira que esta tarefa é acabamos nos esquecendo do número de idiossincrasias e regras de leitura que tratamos automaticamente durante uma leitura. [7] Esse foi um ponto extremamente subestimado para a definição dos prazos e consequentemente para a implementação do sistema. Como pode-se ver na documentação do sistema, foi criado todo um conjunto ciência padrão para a lingua portugêsa. Para a definição deste simples (e incompleto) conjunto ciência foram utilizadas mais de 600 linhas de código, o que por si só (ignorando enventuais sobrecargas da linguagem de programação e estilo de código) já demonstra a sua complexidade. Ainda com todo este aparato de regras não fui capaz de criar uma regra de transcrição decente para a letra 'x'. Na verdade está é a única letra cuja transcrição não ficou razoável (rode o demo e veja por si só!).

As técnicas de transcrição fonética foram fortemente baseadas no pacote de transcrição fonética do Squeak [2] O Squeak é um ambiente de desenvolvimento Smalltalk de código fonte aberto e livre. Inicialmente o projeto iria ser desenvolvido em Smalltalk, e não em Java.O que ocorre e que por mais maravilhosa que tal linguagem seja, a sua fatia no mercado é muito pequena e pessoas que a conhecem são muito poucas. Isso por si só não era tão impeditivo para se utilizar Smalltalk e não Java, já que já estava prevista uma interface CORBA para o sistema. Java foi escolhido primeiramente para que mais pessoas pudessem dar suporte e manutenção ao sistema, hoje muito mais pessoas conhecem Java do que Smalltalk, mas o motivo principal foi a implementação de CORBA para o Squeak ainda estar em fase de desenvolvimento, e por se tratar de um projeto de código fonte livre e aberto não tinha muitos prazos para a conclusão. No momento da escrita desta monografia, o sistema CORBA para Squeak ainda não estava completo, o que prova que a escolha de Java foi melhor.

A migração do sistema para Java trouxe consigo vários problemas. Quem conhece Smalltalk sabe que é uma linguagem extremamente elegante e robusta, o que, em minha opinião, não ocorre com Java. Várias coisas que eram de implementação extramamente trivial em Smalltalk acabaram se tornando verdadeiras "torres de babel" em Java. Certas coisas que eram muito facilmente resolvidas com um simples bloco de código em Smalltalk, tiveram que ser resolvidas com "inner classes" em Java (que por si só são praticamente ilegíveis), ou mesmo com a criação de uma nova classe, aparentemente dispensáveis, com métodos que fora do contexto dos métodos que os chamavam eram mais obscuros ainda. Apesar de tais problemas o Java trouxe várias vantagens. O sistema como um todo pode ser implementado utilizando-se apenas o J2SE (1.4), sem o auxílio de pacotes ou módulos externos. Trouxe também a heterogeneidade que se buscava de início para a sua execução e implantação. Foi utilizado pesadamente o pacote de expressões regulares desta linguagem, que é de fato bem completo, apesar de alguns bugs, com os quais tive alguns probleminhas, mas que já estão corrigidos na versao mais nova do jdk.

Realmente foi muito mais complicado do que esperava fazer um sistema para "ler" palavras do português do que eu esperava, por motivos técnicos da linguagem de programação escolhida e por motivos intrínsecos à língua portuguesa.

Post Mortem

O processo de desenvolvimento foi tranqüilo. Muitos dos aspectos e dos problemas enfrentados já foram expostos e discutidos na seção anterior. O projeto final, apesar de completo, ainda tem funcionalidades que poderiam ser adicionadas. Tais funcionalidades foram sendo descobertas e vistas como muito interessantes durante o processo de desenvolvimento do sistema., porém se tais funcionalidades fossem ser implementadas o prazo seria certamente insuficiente. Cito exemplos de tais funcionalidades abaixo:

1. Editor e browser de conjuntos ciência.

 

O processo de edição de um conunto ciência da maneira como está hoje, é deverás entediante. Deve-se um .java e sair mexendo no código e compilar o sistema para alterar, excluir ou adicionar uma regra. Da maneira como o sistema foi feito, é uma tarefa bem simples, apesar de trabalhosa, fazer um tela por onde o usuário tem a possibilidade de editar um conjunto ciência.

2. Aproximador não linear de palavras

 

O aproximador implementado leva em conta a distância linear entre palavras para aproximar duas transcrições fonéticas. A distância linear de uma palavra a outra é definida pela soma do número de inserções, remoções e substituições necessárias para transformar uma palavra em outra. Isso apesar de interessante e funcionar (na verdade não muito bem, foi daí que surgiu a idéia de um aproximador não linear), não leva em conta que existem fonemas que são bem mais próximos uns dos outros. Exemplos disso ocorrem com os fonemas /o/ e /u/. Uma palavra da forma xyz/o/ está muito mais próxima fonéticamente de uma palavra xyz/u/ do que está de uma palavra da forma xyz/a/ ou xyz/r/, por exemplo. Na métrica linear utilizada essas diferenças de distância entre fonemas não são utilizadas, o que às vezes acaba resultando num resultado não muito bom.

Em suma, o sistema se comporta muito bem para encontrar a palavra mais próxima dentro do léxico, porém não é muito bom ,devido ao item 2 citado acima, para encontrar as palavras mais próximas.

O BCC

As disciplinas oferecidas durante o BCC foram de extrema importância para a implementação deste trabalho. Delas vale citar as seguintes: (cito estas pois acredito que foram as disciplinas que mais influênciaram no desenvolvimento deste projeto)

Disciplina Comentário
Introdução à Computação Pelos seus conceitos básicos
Princípios de Desenvolvimento de Algoritmos Por aprender a pensar algoritmicamente na solução de um problema
Álgebra I e II Por conceitos que a princípio são triviais, porém não são, como partição, classes de equivalência grupo e métricas de distância entre objetos de uma classe de equivalência
Laboratório de Programação I e II Por aprender a planejar um projeto com duração de mais de um fim de semana =). Acredito que este aspecto desta disciplina deva ser o foco principal do professor.
Estruturas de Dados Por seus conceitos fundamentais para a programação
Conceitos Fundamentais de Linguagens de Programação Por saber distinguir uma linguagem da outra, e perceber as vantagens e desvantagens de uma linguagem sobre a outra.
Algoritmos em Grafos Qualquer estrutura de dados mais complexa que se deseje montar de uma certa forma é um grafo. Desde lista ligada e árvores-B, até diagramas de dependência entre classes e objetos do sistema. Saber utilizá-los é essencial.
Álgebra Booleana e Aplicações Matéria indispensável para se aprender a pensar lógicamente.
Análise de Algoritmos Aqui aprendi a fazer algoritmos eficiêntes.
Língua Portuguesa Por sua íntima relação com este projeto.
Autômatos e Linguagens Formais Neste projeto foram utilizadas muitos dos conceitos que aparecem nesta máteria, como expressões regulares, linguagens livres de contexto, ....
Geometria Computacional Apesar da ligação não ser tão óbvia, esta matéria foi de muita valia. Todo o conceito de aproximação de palavras foi baseado em diagramas de Voronoi e distância entre pontos no espaço. A idéia central é de que a palavra é um ponto no diagrama de Voronoi e a melhor candidata do léxico para uma palara dada é a palavra que define a céluda que a palavra dada cai dentro deste diagrama.

As outras disciplinas como Tópicos de programação orientada a objetos, ou Sistemas Operacionais, ou Cálculo I, II e III para citar algumas foram de extrema importância para a minha formação, entretando apesar de utilizá-las no meu serviço diariamente, não tiveram grande influência neste trabalho como as citadas na tabela. Veja que digo, não foram de grande influência, porquê alguma influência, mesmo que indiretamente, tiveram na formação de como penso e programo.

A única disciplina no curso que eu vejo como dispensável é Noções de Probabilidade e Processos Estocásticos. Já temos Introdução a Probabilidade e Estatística I e II, metade desta disciplina é repeteco das outras, e a outra metade (os processos estocásticos em si) não tem relação com nada mais no curso. Hoje eu sei o que é uma cadeia de Markov, porém isto nao trouxe qualquer ganho a minha formação. Nunca vi lugar algum onde isso fosse necessário (estou falando estritamente de processos estocásticos, e não de probabilidade e estatísca). Se a matéria está na grade curricular deve ter algum motivo, aliás, gostaria até que alguém me explicasse. =)