next_inactive up previous


Monografia de MAC499

André Gustavo Andrade
oberon@linux.ime.usp.br

9. Dezembro 2002
Versão 0.1

Resumo:

Esta monografia de MAC499 - Trabalho de Formatura Supervisionado visa descrever o trabalho desenvolvido por mim e pela minha orientadora para a construção de uma ferramenta gráfica para especificação de agentes móveis e Pi-Calculus.


Sumário

Introdução

Programas executados em sistemas paralelos ou distribuídos são claramente mais difíceis de ter seus comportamentos previstos devido aos mecanismos de composição inerentes aos mesmos. Agentes móveis e colaboradores, além de possuírem as dificuldades apresentadas por sistemas concorrentes, carregam ainda problemas relacionados ao fato deles próprios, e o ambiente no qual estão inseridos, poderem ser reconfigurados dinamicamente. Um agente móvel, por exemplo, não deve modificar, nos servidores, informações sobre as quais ele não tem permissão. Por outro lado, os servidores não devem obter ou executar informações privativas aos agentes, nem mesmo destruir ou replicar agentes sem autorização. Para que tais serviços, assim como outros também imprescidíveis ao bom funcionamento do sistema, sejam assegurados, eles devem ser especificados e verificados formalmente.

O desenvolvimento formal (ou semi-formal) de agentes móveis requer um fundamento matemático que dê suporte à especificação e verificação tanto dos agentes individuais quanto do sistema como um todo. Vários dos problemas inerentes a agentes móveis estão ainda por ser completamente resolvidos. Pi-calculus é uma teoria para agentes móveis onde os agentes são dotado de identidade própria, com capacidade de replicação. Nele, a mobilidade dos agentes é denotada pela passagem de nomes de canais de comunicação por canais, permitindo que os canais sejam renomeados em tempo de execução. Em termos semânticos, a idéia de mobilidade de pi-calculus é refletida nas mudanças da topologia do sistema. Os agentes são elementos independentes que podem se movimentar ao longo da execução, mas a comunicação entre os processos é feita ponto-a-ponto, fazendo com que cada processo conheça todos os outros para poder se comunicar.

Pi-calculus tem sido aplicado na especificação e verificação de protocolos de comunicação em redes de sistemas móveis e, como framework, na definição semântica de linguagens de programação que contemplam o conceito de mobilidade. Apesar de ser um cálculo de referência para agentes móveis e para outros cálculos que tratam mobilidade, os estudos sobre pi-calculus se concentram em aspectos teóricos relacionados à expressividade e relações de equivalência computáveis. Desta forma, grande parte das ferramentas desenvolvidas para pi-calculus são protótipos que visam a certificação de aspectos teóricos desenvolvidos, sem vislumbrar o usuário final que deseja especificar os seus problemas reais.

Objetivos

O projeto PiG - Pi-Calculus Gráfico tem como objetivo desenvolver um ambiente amigável para especificação e verificação de agentes móveis utilizando pi-calculus. Neste projeto, aspectos teóricos e práticos são explorados. Dentre os aspectos práticos deste projeto, propomos desenvolver um ambiente gráfico para o trabalho com pi-calculus, ou seja, um ambiente onde a entrada e a saída de dados possa ser feita graficamente, agilizando o trabalho do usuário da ferramenta, e ao mesmo tempo versátil o suficiente para permitir a fácil implementação de camadas de software capazes de transformar a entrada gráfica em outros tipos de linguagens úteis para a integração com outros softwares. O desenvolvimento destes editores texto e gráfico, bem como a construção de árvores abstratas sobre transições simbólicas a serem utilizadas na verificação formal dos agentes móveis descritos em pi-calculus serão explorados neste trabalho de iniciação científica.

O projeto em questão é interessante por vários motivos. Em primeiro lugar, é útil para o aprendizado de agentes móveis, que é uma área em ascenção, e em segundo lugar, por colocar em prática algumas técnicas vistas somente em teoria durante o curso.

Este ambiente amigável deve ser o mais configurável possível, para que a novas funcionalidades possam ser implementadas, de maneira que seja de grande utilidade para a comunidade científica.

Metodologia

Utilizamos o modelo de desenvolvimento espiral, desenvolvendo aos poucos e gerando subsistemas funcionais.

Dessa maneira, pudemos aos poucos implementar novas funcionalidades, refatoramentos e reestruturações no código.

De um modo geral meu trabalho foi sempre dividido em duas etapas: A primeira, de leitura de artigos e livros, sendo que esta etapa quase sempre era seguida do aprendizado de novas tecnologias.

A segunda parte era implementação, onde todos os conhecimentos apreendidos deveriam ser convertidas em algo funcional e integrado ao resto do software ja desenvolvido.

Ocasionalmente, após cada uma das partes maiores serem implementadas, fazíamos uma reunião onde minha orientadora me instruia quanto ao que fazer em seguida e validava o que já havia sido implementado.

Minha orientadora manteve a linha a seguir quanto ao conhecimento teórico, me deixando mais livre para estudar e utilizar a tecnologia que eu quisesse para o desenvolvimento.

Isso estimulou-me a pesquisar mais, porque toda a responsabilidade da escolha da tecnologia seria minha, bem como o impacto da mesma no tempo e qualidade de implementação.

Trabalhos Correlatos

Ferramentas de verificação formal geralmente possuem entrada de dados bastante simples, constituindo-se unicamente de texto puro. Assim, nossa abordagem é inovadora, havendo poucos trabalhos correlatos sendo desenvolvidos.

Nosso intuito de transformar a PiG em uma ferramenta de front-end para verificadores formais, é única até onde pude pesquisar.

Existem ferramentas com interfaces próprias, dentre as quais podemos citar:

Sistema Desenvolvido

Descrição

O projeto baseia-se em duas etapas distintas:

O desenvolvimento da BNF de uma linguagem capaz de lidar com toda a versatilidade dos operadores do pi-calculus.

A interface gráfica para exibição e entrada de dados.

da BNF

Esta parte é importante pelo seguinte motivo: A BNF desenvolvida deve ser capaz de não só de lidar com pi-calculus, mas também de gerar uma árvore sintática facilmente tratável pela camada do simulador e pelos layers de software responsáveis por transformá-la em uma linguagem inteligível aos outros softwares.

Além disso, toda a implementação deve ser modularizada para que a implantação desses layers seja uma tarefa fácil.

A documentação também faz parte dos quesitos importantes para esta fase do projeto, visto que aqui reside a parte aberta deste software. Qualquer programador deve ser capaz de gerar o layer adequado a transformar a árvore sintática passada em qualquer outra linguagem que lhe interesse.

Ocasionalmente, até mesmo poderia se pensar no desenvolvimento de um framework para esses layers.

Gráfica

A interface gráfica se constitui de duas partes básicas:

A parte de RAD consiste em botões representando partes do código algébrico, de forma que a construção de um agente passa a ser feita de forma muito mais simples através de cliques e não de uma sintaxe decorada, e portanto, menos sujeito a erros.

São botões ou itens do menu acionados pelo usuário a fim de disparar uma certa ação sobre o agente selecionado.

:

Janelas pedindo informações de texto, necessárias em alguma parte algorítmica do programa.

ída de Dados:

Já a saída de dados pode ser feita através de texto ou gráfico.

Por isso mesmo, para coordenar tal diversidade, é necessária a criação de uma IDE, onde tudo isso possa ser feito na mesma tela e de forma amigável ao usuário.

Arquitetura

Com o objetivo de atender aos requisitos citados bem como escalabilidade, a arquitetura da PiG se divide em algumas camadas:

Árvore Sintática:
É o coração da PiG. Toda especificação tem de atualizá-la ou construí-la.

Funcionalidades Básicas:
São implementadas diretamente na aplicação PiG, sendo indispensáveis ao seu funcionamento. Até o momento existem duas implementadas:
Analisador léxico-sintático:
Transforma as especificações na árvore sintática.

Analisador da árvore sintática:
A partir da árvore sintática, consegue imprimir em formato texto a especificação que esta árvore representa.

APIs:
Uma coleção de serviços básicos para que outros possam implementar componentes configuráveis para a PiG. Estes componentes são introduzidos na ferramenta em tempo de carregamento através de uma especificação XML.

Componentes Configuráveis:
Adicionam novas funcionalidades à PiG, podendo ser adicionados ou removidos apenas através da edição de um arquivo XML de configuração.

Assim, os componentes configuráveis se cadastram para receber notificações em caso de mudanças na árvore sintática, e também têm o poder de fazê-las. Veja a figura  1

Figura 1: Diagrama da arquitetura do sistema
\includegraphics{diag22.eps}

O sistema de componentes configuráveis descrito anteriormente, pode ser melhor compreendido olhando a figura  2

Figura: Diagrama de Configuração
\includegraphics{diag12.eps}

Até agora foram desenvolvidos dois componentes configuráveis para a PiG:

Atividades Realizadas

As principais atividades realizadas por nós foram as seguintes (listadas em ordem cronológica de desenvolvimento):
Estudo de Analisadores Léxicos:
Para que pudéssemos implementar qualquer ferramenta que lidasse com pi-calculus, seria necessário antes de mais nada que um programa fosse capaz de reconhecer, de alguma maneira, alguma linguagem na qual os processos seriam descritos, uma linguagem que representasse o pi-calculus.

Assim, fez-se necessário o aprendizado de como reconhecer essa linguagem. Inicialmente trabalhamos em sistemas mais simples para o aprendizado.

Estudo de Geradores Automáticos de Analisadores Léxicos:
Conforme minha pesquisa mostrou, produzir analisadores léxicos by hand pode ser excessivamente trabalhoso.

Isto motivou-me a estudar os geradores automáticos de analisadores léxicos. Como não havíamos ainda decidido a linguagem na qual faríamos nossa ferramenta, estudei tanto as linguagens de geradores para C quanto para java. Como ambas pareciam-se muito, isto não foi um problema.

Estudo de Analisadores Sintáticos:
Uma vez feita a análise sintática, que devolveria-nos uma sequência de tokens e atributos desses tokens, seria necessário analisá-los para montar a árvore sintática, que como vimos, veio a ser o coração de nossa ferramenta.

Por este motivo estudamos os analisadores sintáticos, e como montar alguns tipos.

Estudo de Geradores Automáticos de Analisadores Sintáticos:
Novamente, como é difícil montar um analisador sintático manualmente, optamos por utilizar uma ferramenta de geração automática. E novamente, como não havíamos ainda escolhido qual a linguagem de implementação, acabei estudando tanto alguns geradores para C como para java.

Estudo de Cálculo para Concorrência (CCS):
Uma vez que o Pi-Calculus pode ser considerado uma extensão do CCS, fazia-se necessário que eu estudasse este primeiro.

Alias, Milner (O pai do Pi-Calculus) em seu livro introdutório ao mesmo, dedica praticamente metade do livro a fundamentos introdutórios necessários a intelecção de Pi-Calculus, dentre eles o CCS.

Estudo de Lambda-Calculus
que decorreu naturalmente do estudo anterior, uma vez que era útil estudar como ocorria especificação formal em sistemas mais simples.

Estudo de Pi-Calculus:
seguiu-se naturalmente também, já que a PiG tinha de lidar com esse cálculo. Ocorreu que este período demorou muito mais do que o esperado por mim, uma vez que familiarizar-se com CCS e Pi-Calculus não foi muito fácil.

Com muita paciência de minha orientadora fui me sentindo seguro para assimilar a matéria, e passar a considerá-la uma base sólida para desenvolver o projeto.

Desenvolvimento de uma linguagem
que permitisse especificar os processos e operadores existentes na definição formal de Pi-Calculus feita por Milner. Novamente este não foi um trabalho trivial.

Além da linguagem em si, era necessário definir também uma estrutura de árvore versátil o suficiente para que pudessemos operar sobre ela em aplicações futuras as quais não sabiamos ainda o que seriam.

Um pouco mais que isso, era preciso tomar uma decisão sobre a topologia da árvore, se seria uma árvore qualquer ou se restringiríamos a árvore a uma árvore binária (o que foi feito).

Implementação de um protótipo em C
, uma vez que a linguagem e a árvore estavam definidas, restava saber se funcionaria como esperávamos que funcionasse. O protótipo (que seria o início da implementação) ficou pronto e funcionou a contento.

Porém, após o desenvolvimento desta etapa, percebemos que C não seria uma linguagem adequada por não satisfazer alguns requisitos definidos recentemente: A ferramenta deveria ser portável, escalável e massivamente gráfica, e interfaces gráficas em C não costumam ser fáceis ou portáveis.

Estudo de Java e Interfaces gráficas:
Optamos então por desenvolver nosso sistema em Java, mas isso significaria um novo custo em tempo: O custo de aprendizado dessa linguagem.

Felizmente, como já havia estudado os geradores automáticos também para java, portar a parte do sistema que já estava pronta foi fácil.

Posteriormente acabei percebendo que desenvolver através de um paradigma orientado a objetos foi uma das melhores decisões que tomamos no projeto, mas mais uma vez, houve um atraso.

Estudo de algumas representações gráficas de pi-calculus.
Isto era impressindível.Enquanto me familiarizava com Java, procurava estudar as representações gráficas descritas na bibliografia, para familiarizar-me com elas, sendo bastante atraído pela definição gráfica do Milner.

Um grande problema encontrado aqui foi que nenhuma das duas definições descrevia totalmente o Pi-Calculus, mas já eram esforços nesse sentido.

Estudo de Padrões de projeto,
que tornou-se um prioridade para mim, porque cada vez mais a PiG crescia de maneira aparentemente desordenada, e não demoraria muito para que eu perdesse completamente o controle sobre esse projeto.

A aplicação de padrões de projeto permitiu que eu resolvesse pequenos problemas de forma ordenada evitando muito tempo de depurações e correções.

Estudo de Padrões arquiteturais
que segue naturalmente à decisão anterior, para organizar a estrutura do programa como um todo.

Sem dúvida foi uma das mais úteis pesquisas que eu empreendi. Não só no projeto da PiG, que foi bastante facilitado por estes, mas na minha vida como programador e desenvolvedor de software.

Desenvolvimento de um protótipo em Java.
Ocorreu quando eu me senti apto a unir tudo o que havia estudado até então.

O protótipo era um simples interpretador, que fornecia a árvore sintática de uma sentença que o usuário entrasse expressa em nossa linguagem. A representação gráfica estava apenas no projeto.

Aos poucos fomos tentando incorporá-la no projeto, mas concluímos que talvez nosso tempo não fosse suficiente para fazê-lo. Assim, alguma medida de emergência deveria ser tomada.

Ou arriscaríamos o tempo desenvolvendo nossa interface gráfica, ou arriscaríamos o tempo no aprendizado de um framework (que como sabemos é realmente arriscado porque não se pode prever quanto tempo isso pode levar e se será bem sucedido) para depois podermos ganhar tempo quando um nível confortável de familiaridade fosse atingido.

Uma decisão de projeto deveria ser tomada. Optei então por usar um framework, e sem nenhuma dúvida foi este o momento mais delicado de todo o desenvolvimento.

Estudo do framework GEF.
Passei então a estudar o framework que escolhi para trabalhar. GEF é um framework disponibilizado pela Tigris, a mesma que produziu o ArgoUML (e inclusive é usado no mesmo), e por isso mesmo, confiável segundo julguei.

Infelizmente para meu desespero, a documentação era escassa (constituindo-se de um javadoc de uma versão anterior à disponibilizada e o source code da versão atual). Mas ainda assim era melhor do que muitas ferramentas.

Mas a dificuldade foi um pouco superior à estimada.

Implementação de Pi-Nets utilizando o GEF.
Aqui aconteceu de tudo o que o estudo jamais poderia ter previsto: Como o framework ainda não está na sua versão final, muitas das funções presentes na documentação ainda aguardam implementação.

Mas para descobrir detalhes como esses, era sempre necessário recorrer ao source code do framework. Foi um período de esforço contínuo.

Estudo do framework Log4j.
Motivado pelos constantes bugs devido às funções não implementadas do GEF, estudei este sistema de depuração persistente desenvolvido pelo projeto Jakarta.

Nesse tempo, me convenci de que a depuração persistente e o log constante constituem importantes ferramentas para ajudar o programador.

Essa pesquisa gerou um paper submetido para o PLoPIME2002 promovido pelo professor Fábio Kon.

Implementação de depuração e log na PiG.
Convencido, a implementação foi a parte fácil, uma vez que este framework estava muito bem documentado, e é de fácil aprendizado e utilização.

O problema era o número de classes do sistema. Naquela época eu ainda não conhecia tecnologias como AspectJ. Do contrário, teria aliado as duas tecnologias com grandes ganhos. Além disso, programação voltada a aspectos é um assunto bem recente no qual vale a pena investir.

Pretendo introduzir essa tecnologia nas versões futuras da PiG.

Implementação de um verificador de árvore sintática:
Nesta época, quase finalizando as Pi-Nets, estas ainda apresentavam alguns pequenos problemas de representação. Desta forma, era necessário depurar a árvore sintática que as estava gerando.

Ao mesmo tempo, eu estava pensando em remodelar a arquitetura do sistema, de maneira a introduzir componentes plugáveis e configuráveis na PiG.

Assim, a produção de um pequeno módulo como este era extremamente útil, porque além de me permitir depurar as Pi-Nets, permitiria-me utilizá-lo como cobaia para ser o primeiro componente plugável da PiG. Mas para isso era necessário mais estudo.

Estudo de Reflexão em Java:
pois para se plugar um componente, é necessário que o sistema seja capaz de carregar dinamicamente qualquer classe, o que só pode ser conseguido através de reflexão.

Estudo de XML
pois mesmo havendo reflexão, seria necessário conhecer o nome da classe a carregar de alguma forma. Mas já que era necessário implementar um mecanismo de configuração à nossa ferramenta, que ele fosse o mais genérico possível, e ao mesmo tempo abrangente o suficiente para conter todas as demais configurações que poderíamos pretender fazer no futuro.

Para resolver problemas como esse, a tecnologia de XML seria perfeita. Infelizmente, demandaria estudo tanto da estrutura de XML como de analisadores léxicos para a mesma em linguagem java.

Felizmente, o JDK1.4.1 já trazia um parser interno, na própria API disponibilizada pela SUN. E a documentação e tutoriais da SUN são impecáveis. Sorte minha.

Implementação de carregadores dinâmicos:
juntando XML e reflexão, acoplamos à PiG um sistema de carga dinâmica de funcionalidades. Este sistema me deixou particularmente orgulhoso, porque foi um grande passo para a modularidade e escalabilidade da PiG.

A partir deste momento, os desenvolvedores teriam de ter conhecimento apenas de uma pequena API disponibilizada por nossa ferramenta para montar seus componentes, bastanto depois editar o XML para acoplá-los à PiG.

Gastamos mais um tempo definindo o que seria essa API de interface, e desacoplando as Pi-Nets para torná-las também um componente plugável juntamente com o verificador de árvore sintática.

Desenvolvimento da representação ObanaNets.
Uma vez desenvolvido o módulo de Pi-Nets, viemos a constatar que esta representação não era tão clara quanto parecia nos artigos. Era adequada unicamente aos profissionais da área, com familiaridade com a mesma.

Queríamos algo mais didático e intuitivo. Foi assim que nasceu as ObanaNets. Elas tem por objetivo mostrar de maneira clara como são as expressões entradas na forma de Pi-Calculus, sendo uma nova representação.

Implementação de ObanaNets
que seria natural. Infelizmente o tempo foi curto, e esta atividade ainda está em andamento.

Este é o ponto onde estamos no momento. Ainda está em meus planos desenvolver um método de edição das ObanaNets, e possívelmente um pequeno simulador de comunicações monitorado, ou integrar esta ferramenta com algum simulador ou verificador formal já existente, consolidando nossa idéia original de que o PiG seja um front-end para os verificadores formais existentes e fechando assim o ciclo de pesquisas desenvolvido por mim durante a graduação.

Algumas atividades não foram listadas devido à sua repetitividade, como por exemplo testes, depuração e refatoramento do código.

Mesmo assim, houve um gasto considerável de tempo no aprendizado de técnicas de refatoramento.

Desafios e Frustrações

Em muitos momentos no decorrer do projeto ocorreram desafios, e (ainda bem) em muito poucos ocorreram frustrações, sendo as maiores relativas a tempo.

Sempre uma atividade, qualquer que seja ela parece levar o dobro do tempo previsto para fazê-la, qualquer que seja este tempo. A incapacidade de cumprir os prazos adequadamente gerou uma certa angústia.

Mas vamos às dificuldades:

Aprendizado de Pi-Calculus:
Pi-Calculus assim como Lambda-Calculus, possui muito poucos operadores com os quais se pode fazer tudo que está dentro do poder computacional desses cálculos. Como fazê-lo já é outra história. Assimilar o uso correto dos operadores demanda bastante tempo
Aprendizado de Java:
Uma linguagem muito versátil, com várias classes prontas para facilitar seu trabalho. Mas familiarizar-se com essas várias classes tendo tempo contado não é uma tarefa fácil.
Arquitetura do Sistema:
O projeto da arquitetura do sistema também foi um fator crítico, pois dele dependia toda a futura usabilidade do mesmo. Quando você tem de projetar a arquitetura enquanto se está programando, alguns erros de decisão podem ocorrer, e erros arquiteturais demandam muito tempo para serem corrigidos.
Representação Gráfica:
Não encontramos nenhum tipo de especificação gráfica que englobasse todas as funcionalidades do Pi-Calculus, ou fossem claras o suficientes para que nós as utilizassemos, embora muitas vezes isso só fosse percebido depois da implementação. O desenvolvimento de uma linguagem de especificação estava um pouco fora do escopo original do trabalho e tornou-se portanto uma dificuldade por onerar em tempo.
Recursos:
Passando a maior parte do tempo aqui no IME, como somos muitas vezes forçados por nossas atividades acadêmicas de graduação, o ideal seria trabalhar no IME. Infelizmente mesmo nos laboratórios as condições eram precárias: Ou faltavam administradores que configurassem os sistemas da forma necessária ao trabalho, ou poderío computacional às máquinas dos laboratórios. Isso dificultou bastante o desenvolvimento do sistema, porque a maior parte das mudanças de código feitas no IME eram às cegas e só seriam testadas horas depois.
Conciliar os estudos com as atividades de pesquisa:
Parecia sempre um paradoxo: Quando se queria fazer pesquisa, tínhamos de dedicar tempo aos estudos, trabalhos e provas. Quando nos desencumbíamos desses, voltava à pesquisa (atrasada, e descuidada por um tempo) necessitando um novo tempo de familiarização. Passava-se um tempo e as atividades de graduação já estavam acumulando-se novamente... Interrompe a pesquisa... E assim vai. Nunca havia tempo pra nada.

Disciplinas do BCC mais relevantes

Embora o principal interesse sejam as disciplinas do BCC, gostaria de denotar também que as disciplinas fora de área foram bastante importantes para o desenvolvimento deste projeto, e por este motivo, passo a listá-las também.

MAC 332 - Engenharia de Software:
O PiG começou de maneira bem discreta, de forma que nenhum planejamento foi necessário a princípio. Pouco a pouco foi crescendo a uma velocidade assustadora, e exigindo a aplicação cada vez mais agressiva dos conceitos aprendidos nesta disciplina.

O vício por testar, a estruturação do projeto, a avaliação de riscos, todos foram conceitos utilizados para o desenvolvimento do PiG.

MAC 316 - Conceitos de Linguagem:
Não podemos nos esquecer que este projeto é em última análise um mapeamento gráfico de um cálculo que envolve semântica.

Assim, todos os conceitos que se aplicam a uma linguagem aplicam-se aqui também. Basta dizer que, PiG utiliza-se de um analisador léxico, e um analisador sintático, e que seu núcleo é uma árvore sintática.

MAC 5715 - Tópicos Avançados em Programação Orientada a Objetos:
Aqui foram aprendidos conceitos importantes, como por exemplo, as vantagens de se utilizar padrões para a programação.

MAC 414 - Autômatos e Linguagens formais:
Muito útil no entendimento dos analisadores léxicos e sintáticos, bem como na preparação da BNF da linguagem que a PiG utiliza.

MAT 138 e MAT 213 (álgebra 1 e 2):
Estas disciplinas formam uma base sólida para o entendimento algébrico que pi-calculus exige.

MAC 328 - Algoritmos em Grafos:
Toda a estrutura gráfica da PiG baseia-se em grafos, mesmo porque, o framework GEF baseia-se inteiramente em grafos. Assim, muitos dos conceitos estudados nesta disciplinas refletiram em facilidades na implementação.

MAC 239 - Métodos Formais:
Matéria indispensável para o meu trabalho. Junto com as álgebras, é a introdução à verificação formal.

IPN 021 - Química das Radiações:
Apesar de não fazer parte oficialmente do BCC e ser fora de área, muitos dos trabalhos em Join Calculus (um parente muito próximo do Pi-Calculus) baseiam-se nos trabalhos a respeito de máquinas químicas abstratas. Mesmo porque, a química é excelente para estudar aspectos de concorrência e competição.

Esta é uma matéria que além de revermos estes conceitos, aprendemos muitos aspectos físicos curiosos, e temos vivências práticas interessantes (afinal estar a 5 metros de algo que pode te matar em 10 segundos, azul brilhante, faz vc repensar a vida...).

Além disso, o conselho de refatoramentos agressivos foram muito úteis. Eu acredito que estes refatoramentos foram justamente o que permitiram que o projeto evoluísse sem que eu tivesse de jogá-lo no lixo algumas vezes durante o caminho.

Também foi uma disciplina importante no sentido de alertar no custo em tempo (imprevisível) de se implementar ou usar um framework. Depois de passar por esta experiência na pele, eu posso dizer que o tempo pode não ser imprevisível (pode ser estimado pelo tamanho do código de framework), mas ele é bem grande.

Interação com membros da equipe

Nossa equipe era formada por apenas duas pessoas: minha orientadora e eu, sendo que ocasionalmente discutíamos nosso trabalho com os demais orientandos dela, e eles faziam o mesmo.

Essa interação permitiu que nós soubessemos sempre com o que cada um dos membros do nosso grupo de pesquisa estava trabalhando, e quando necessitávamos de alguma coisa que alguém já havia estudado, sabíamos a quem perguntar.

A intersecção entre nossas pesquisas nem sempre era grande, de forma que poucas vezes pudemos tirar benefícios disto para o trabalho de pesquisa, mas a contribuição para o aprendizado de novas teorias, ou abordagens diferentes para alguma teoria que já conhecíamos foi grande e deve ser ressaltado.

Algumas vezes os membros do grupo apresentavam seminários, o que nos forçava a estudar não só nosso tema de pesquisa, mas também uma forma didática de transmiti-lo aos outros. Assim, para aqueles que como eu pretendam seguir uma carreira acadêmica, foi uma atividade importante.

Aplicações práticas de conceitos estudados

Este projeto contribuiu para a assimilação de vários conceitos vistos somente em teoria no curso de computação, e alguns nem sequer abordados.

Começando por engenharia de software, pois um software dessa magnitude precisa ser bem documentado e definido, podendo ser usado portanto para refinar os conhecimentos que temos de especificação.

Também serão utilizados os conceitos de análise léxica e sintática em partes vista em autômatos e conceitos de linguagem durante a interpretação e montagem da árvore sintática dos processos.

Assim, este projeto me permitiu aprender a desenvolver com fluidez analisadores léxicos e sintáticos, que tem grande aplicação para a geração de linguagens de scripts, etc.

Uma vez que processos muito parecidos ocorrem dentro de compiladores e interpretadores (Sendo que o simulador não deixa de ser um interpretador) este projeto ajudará a compreender o funcionamento dos mesmos.

E ainda toda a teoria de pi-calculus que foge ao escopo da graduação, sendo uma área relativamente nova. Vários são os conceitos reunidos quando falamos em pi-calculus: Autômatos finitos, álgebras de processo, verificação formal dentre outros, complementando assim e constituindo um elo de ligação entre várias disciplinas aparentemente desconexas.

Com um pouco mais de estudo, poderei usar pi-calculus para a verificação formal de agentes móveis, o que me pode ser muito útil na verificação de protocolos que envolvam agentes móveis, uma área bastante em expansão nos últimos tempos.

Por fim e mais importante, programação gráfica e design de interface com usuário, que com toda certeza será usado em absolutamente todo o software desenvolvido ou projetado.

Passos para aprimorar o conhecimento técnico

Creio que algumas coisas poderiam ser feitas para aprimorar o conhecimento técnico envolvido nesta pesquisa:

E eu colocaria alguns itens que não podem ser considerados como aprimoramento técnico, mas como trabalhos futuros a desenvolver em nossa ferramenta:

Conclusões

Pela primeira vez em toda a graduação, tivemos de fazer um trabalho grande, e no meu caso, um software bem agigantado com especificações intrincadas. Além disso, havia prazos, havia relatórios a respeito do mesmo, documentação a ser feita e tudo isso em meio a outras muitas funções que tínhamos de desempenhar.

Não foi fácil, mas foi uma experiência gratificante. Primeiramente porque eu fiquei particularmente orgulhoso do meu trabalho e do meu desempenho. Em segundo lugar porque serviu para provar a mim mesmo que estou capacitado a trabalhar no mercado, a desenvolver softwares de grande porte, embora pretenda seguir a carreira acadêmica (e por isso a escolha de um tema para desenvolvimento ainda muito aberto a novas pesquisas).

Agora, olhando para tras, nem parece que foi tão difícil, e esse sentimento sempre motiva-nos a olhar pra frente e retomar um pouco da auto-estima perdida nesses quatro anos.

Saímos do colegial como os melhores da turma, entramos no vestibular mais difícil do país para logo a seguir sermos bombardeados com uma avalanche de notas ruins, trabalhos e todo o resto.

Não bastasse a diferença de ritmo e do nível de cobrança, ninguém se conhece. Em outras palavras, você está sozinho, desesperado e sem saber o que fazer. Não conhece os professores, a faculdade (que dirá a universidade...), muito menos a tutoria que existe e você só descobre isso no terceiro ano, quando não precisa mais.

O processo de se enturmar, superar as notas, os trabalhos, a falta de tempo, a correria, o desânimo, os: ``Isto é fácil, vocês já sabem'' tem o preço da auto-estima, que só começa a ser retomada novamente lá pelo quarto ano.

Quando você começa a fazer as fora de áreas você começa a perceber algo interessante: Muitas vezes você vai melhor do que as pessoas que fazem o curso do qual aquela disciplina faz parte. Até aí tudo bem. O estranho é que a nota nessas disciplinas muitas vezes acabam sendo a maior do histórico.

Em outras palavras: Será que eu consegui aprender mais em um semestre do que em quatro anos? Ou somos avaliados de maneira muito mais rigorosa do que todas as outras unidades?

Sinceramente tenho certeza que a segunda opção é verdadeira, só não estou certo da veracidade de primeira. Não sei até que ponto um aumento na exigência contribui para um aumento do aprendizado.

Diga-se de passagem, muitas matérias que eu cursei, me acostumei a decorar o conteúdo e colocá-lo de volta na prova porque não conseguia entender em tempo hábil para acompanhar o ritmo do curso, os professores pouco se importavam que isso estava acontecendo com a classe inteira e como resultado, dois dias depois da prova, nada mais restava. Foram conteúdos que eu só fui aprender quando estudava por conta própria em meu ritmo, num ritmo mais devagar.

Fica assim, uma crítica ao BCC.

Um fator extremamente importante foi que durante todo o curso, eu sempre estive envolvido em atividades extra faculdade. Isto permitiu que houvesse uma maior equilíbrio que muito me ajudou nos momentos difíceis do curso, embora muitas atividades (que pretendo retomar) tenham sido sacrificadas.

Outro comentário com relação ao curso que eu não poderia deixar de fazer: Aquela infeliz afirmação de que é necessário estudar duas horas por dia. Pode até ser realmente necessário. O questionamento é se isso é factível (aliás, um questionamento que deveria ser mais frequente entre o corpo docente), pois cursando 7 disciplinas, cada uma delas com 1 lista a cada duas semanas mais ou menos valendo nota, mais as provas (porque tínhamos uma a quase toda semana), mais os eps (que levam tempo para serem feitos), mais o tempo de condução, mais necessidades básicas (sono, comida...) é fácil fazer as contas e perceber a impossibilidade de se fazer isso.

Se a exigência é estudar duas horas por dia, ótimo. Propciem condições para que isso aconteça. Marquem semanas de provas, criem não eps, mas projetos que envolvam uma ou mais disciplinas, flexibilizem as listas de exercício, apresentações, seminários. É mais fácil jogar a culpa em alguém com afirmações generalistas do que mudar a estrutura do curso.

Voltando ao trabalho final, agora restringindo especificamente ao meu, foi a primeira vez que fui obrigado (e com isso tomando gosto por) a entrar em contato com um ambiente de pesquisa.

Muitas coisas não estão ainda definidas, você precisa criar coisas novas, discutir com pessoas que sabem mais que você, conversar bastante e ler mais ainda!

Enfim, preferi listar as características ruins do curso e que podem ser mudadas a listas as positivas, porque são incontáveis. Quando eu entrei no BCC eu achava que sabia programar. Hoje eu sei programar, mas não é o mais importante. Eu aprendi maturidade, responsabilidade, senso de dever, e acima de tudo: Pensar por conta própria.

Isto eu devo (e será uma dívida eterna) a todos aqueles nesse instituto com quem tive oportunidade de me relacionar. A essas pessoas, meu muito obrigado.

Agradecimentos

Por fim, gostaria de fazer alguns agradecimentos a pessoas, intituições e filosofias que muito me ajudaram no decorrer tanto do desenvolvimento deste trabalho quanto no curso.

Como agradecimentos são muito pessoais, resolvi utilizar-me da minha forma usual de escrever, não me importanto com a estilística acadêmica, e dando-me algumas liberdades de expressão.

Aos meus pais,
que muito me ajudaram e incentivaram e acima de tudo: aguentaram meu mau humor nesses quatro anos de estresse continuado.
Aos meus amigos,
sem os quais certamente não chegaria aqui. As conversas jogadas fora visando manter o nível de sanidade dentro do aceitável (se é que isso é possível) e discussões técnicas produtivas contribuíram muito para que estes e outros trabalhos fossem finalizados com sucesso. Dentre estes gostaria de destacar especialmente: Julio Cesar Avero, Rodrigo Moreira Barbosa, Ana Beatriz, Thiago Barcelos
A minha orientadora
Ana Cristina Viera de Melo, que além da supervisão técnica, foi minha conselheira durante todo o tempo em que trabalhamos juntos, tornando-se mais que uma orientadora uma amiga.
Alguns professores do IME
dentre os quais vale a pena destacar:
Zara:
Pela paciência conosco durante o primeiro ano, e pelas muitas ajudas durante os demais anos... Metade dos meus cursos de cálculo com certeza eu devo a ela.
Gubi:
Pelo apoio e constante disponibilidade a explicar tanto os assuntos técnicos quanto os não técnicos.
Leliane:
Também pelo constante apoio e troca de conhecimento, sendo uma pessoa sempre solícita e que muito me aconselha também.
Feofiloff:
Pela seriedade, e por representar pra mim um modelo do professor que eu gostaria de vir a ser quando vier a dar aulas (porque pretendo fazer isso).
TCB:
Uma filosofia de desenvolvimento de software que muito ajudou a mim e a outros companheiros, membros fundadores ou associados em muitas das atividades de programação aqui no IME, e continuará a nos ajudar muitas vezes no decorrer de nossas vidas.
Projeto Jakarta:
Que disponibiliza uma excelente documentação a respeito de seus projetos e o log4j, que é uma excelente ferramenta de depuração.
Tigris:
Que disponibiliza o GEF que muito trabalho poupou e ao mesmo tempo muito trabalho me deu... Uma relação eterna de amor e ódio, como toda relação saudável deve ser.

Algumas Telas da PiG

Figura: Tela 1
\includegraphics[scale=0.5]{tela1.eps}

Figura: Tela 2
\includegraphics[scale=0.5]{tela2.eps}

Bibliografia

About this document ...

Monografia de MAC499

This document was generated using the LaTeX2HTML translator Version 99.2beta6 (1.42)

Copyright © 1993, 1994, 1995, 1996, Nikos Drakos, Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999, Ross Moore, Mathematics Department, Macquarie University, Sydney.

The command line arguments were:
latex2html article.tex -split 0

The translation was initiated by Andre Gustavo Andrade on 2002-12-09


next_inactive up previous
Andre Gustavo Andrade 2002-12-09