Meu trabalho de formatura é baseado no estágio realizado no IPT.
1. A empresa
1.1. IPT
O Instituto de Pesquisas Tecnológicas do Estado de São Paulo - IPT - tem por objetivo atender à demanda de ciência e tecnologia nas diversas áreas da Engenharia em que atua. Seu trabalho tem sido relevante para o setor produtivo nacional e na elaboração e execução de políticas públicas. É significativa sua contribuição na formação de equipes aptas a desenvolver pesquisas em tecnologia.1.2. DQ - Divisão de Química
A Divisão de Química (DQ) do IPT conta com uma equipe experiente e laboratórios bem equipados e tem como finalidade apoiar o parque industrial brasileiro. Nessa Divisão são desenvolvidos estudos e projetos em processos químicos orgânicos, poliméricos e inorgânicos. Sua equipe está capacitada em várias das operações unitárias da engenharia química, tais como secagem, filtração, destilação, cristalização, microencapsulação e a operação de reatores químicos. Realiza, ainda, estudos de viabilidade técnico-econômica, modelagem e simulação matemática, além de automação e controle de processos químicos e bio(tecno)lógicos. A DQ executa ensaios e análises em diversos tipos de materiais com a finalidade de caracterizá-los e verificar o atendimento às especificações. Também elabora pareceres técnicos, realiza consultorias e assessoria técnica e oferece cursos informativos ou de especialização e seminários para empresas.1.3. AB - Agrupamento de Biotecnologia
O Agrupamento de Biotecnologia (AB) da Divisão de Química do IPT foi criado em 1975 com o objetivo de desenvolver processos de tratamento biológico de resíduos e efluentes, domésticos e industriais, além de estudar a fermentação alcoólica. Em pouco tempo, outros assuntos passaram a ser tratados pelo grupo, que hoje atua em áreas como:2. O estágio- Plásticos biodegradáveis (polihidroxialcanoatos) a partir de açúcares, óleos e resíduos;
- Microbiologia industrial, fazendo isolamento, seleção, manutenção, biologia molecular, genética clássica de microorganismos;
- Modelagem matemática, simulação, otimização e controle de bioprocessos;
- Agropecuária, desenvolvendo processos de produção de inoculantes agrícolas, bioinseticidas, vacinas veterinárias e parasiticidas;
- Projeto e desenvolvimento de instalações biotecnológicas industriais alimentícias;
- Ambiental, no aproveitamento e tratamento de resíduos recalcitrantes e medidas da capacidade de transferência de oxigênio de equipamentos.
2.1. Treinamento e pesquisa iniciais
A etapa de treinamento foi bastante curta. Envolveu uma simples familiarização com o ambiente e com a programação para Win32, utilizando o Windows SDK. Como auxílio para o aprendizado, utilizei alguns livros introdutórios de programação para Windows e material recolhido na Internet.2.2. A equipe de trabalhoA linguagem C++ foi aprendida ao longo do desenvolvimento, conforme a necessidade. Novamente, a pesquisa na Internet foi minha principal fonte de informação.
Pesquisei a possibilidade de utilização da biblioteca de classes Microsoft Foundation Classes (MFC). Optei por não utilizá-la: por sua grande complexidade, exigiria bom treinamento dos programadores envolvidos no desenvolvimento e na posterior reutilização dos elementos do software.
A experiência em Ciência da Computação da equipe do Agrupamento de Biotecnologia é muito reduzida. Assim, para que eu pudesse receber melhor orientação, grande parte do trabalho foi desenvolvido em outro agrupamento: o de Sistemas de Controle, Divisão de Mecânica e Eletricidade.2.3. O ambiente de trabalhoMesmo assim, não tive contato direto com profissionais da área de Computação. Os engenheiros e pesquisadores dos dois agrupamentos possuem experiência na área por utilizá-la em suas atividades. Assim, a orientação que recebi de meus colegas e superiores foi muito pequena, e direcionada à solução de problemas práticos.
O projeto foi codificado do zero, a partir das especificações e da interação com os futuros usuários. Além disso, a equipe de desenvolvimento desse projeto foi composta apenas por mim, principalmente por razões administrativas.
Por todas essas razões, praticamente não houve trabalho em equipe, nem integração com outros funcionários. Isso fez muita falta, e foi um dos pontos negativos do estágio.
O IPT demonstrou ser uma ótima empresa para a realização de um estágio. A carga horária exigida foi de apenas 40 horas mensais; além disso, o horário é extremamente flexível, e por trabalhar sozinho no projeto pude montar meu horário de acordo apenas com as obrigações da faculdade.2.4. Metas e prazosTudo isso permitiu que eu realizasse um ano e meio de estágio sem prejudicar as atividades na faculdade.
Este foi o primeiro projeto que desenvolvi fora do Ime. Como eu era o único membro da equipe, tive grande dificuldade em estabelecer metas e prazos para a conclusão do trabalho, principalmente no início.3. O problemaO desenvolvimento em C++ apresentou por muito tempo rendimento inferior ao que seria obtido com outras linguagens orientadas a objeto, como Java (com a qual eu possuía mais familiaridade). Assim, muitas vezes subestimei a duração das etapas, sendo excessivamente otimista com os prazos.
Como meus superiores não são da área de computação, foi complicado e frustrante explicar os problemas que eu enfrentei, e o atrasos no projeto provocados por esses problemas. Muitas vezes precisei preparar "versões de apresentação" do sistema, pois não faria sentido apresentar código.
3.1. Motivação
A atividade de pesquisa muitas vezes envolve a realização de experimentos e posterior análise dos dados obtidos. Diversos fatores podem introduzir ruídos no comportamento desses dados, dificultando sua análise: imprecisão nas medições, impossibilidade de controlar todas as variáveis envolvidas, variáveis com comportamento imprevisível ou mesmo erro nas medições.3.2. Uma primeira soluçãoAssim, os dados experimentais devem ser "filtrados" para a atenuação ou eliminação desse ruído antes de serem utilizados. Se o comportamento do fenômeno puder ser modelado facilmente, pode-se empregar algum tipo de método matemático para o ajuste dos dados. Por exemplo, um comportamento linear pode facilmente ser visualizado e ajustado por uma interpolação linear.
Mas muitas vezes o fenômeno envolve modelos bastante complexos. Até mesmo um modelo simples pode apresentar dificuldades em termos de algoritmo. Pode ser preciso utilizar informações além dos dados de entrada (por exemplo, um eventual defeito em um sensor), para decidir se um determinado ponto deve ser considerado na interpolação ou se deve ser descartado. O tratamento de tais informações exigiria um sistema de grande complexidade.
Assim, optou-se por fornecer ao pesquisador uma ferramenta computacional para auxiliar o ajuste de pontos experimentais. Tal software forneceria formas de visualização e análise dos dados, além de mecanismos de manipulação desses dados. Ao pesquisador caberia a interpretação dos resultados, utilizando seus conhecimentos sobre o fenômeno e sobre o experimento para manipular os dados de entrada e assim obter dados ajustados.
Para realizar essa tarefa, a Divisão de Química do Ipt utilizou por muitos anos um programa chamado Lissage. Esse programa cumpre essa funcionalidade, mas apresenta diversas características bastante inconvenientes.3.3. ObjetivoEle foi desenvolvido há mais de dez anos, em ambiente DOS - o que dificulta sua integração com outras ferramentas utilizadas (normalmente no ambiente Windows). Os elementos de texto estão em francês, e sua interface foi muito mal desenhada, não possuindo praticidade ou facilidade no uso. Apresenta também alguns comportamentos indesejados e defeitos de programação. Esses problemas não podem ser corrigidos, pois seu código fonte não está mais disponível.
Meu estágio teve como objetivo o desenvolvimento de um software capaz de substituir o Lissage, apresentando capacidades funcionais equivalentes e corrigindo seus problemas.4. O software Emerson
4.1. Especificação baseada no Lissage
O software deve ter como entrada um conjunto de pontos experimentais, representando normalmente funções temporais. Esses pontos serão armazenados na memória e exibidos em um gráfico. Com o auxílio do mouse ou do teclado, o usuário poderá manipular esses pontos, alterando seus valores. Também deve ser possível o acréscimo de pontos extras a esse conjunto, bem como a remoção de pontos experimentais. Os pontos originais devem ser sempre armazenados e apresentados, e deve haver a possibilidade de seus valores serem restaurados.4.2. Especificação informalNa mesma representação gráfica, deve ser apresentada uma curva interpolada calculada a partir desses pontos. Essa curva será atualizada a partir dos pontos exibidos. Deve ser possível exibir funções calculadas a partir da curva interpolada, como sua derivada e velocidade específica.
O programa também deve fornecer meios de gravar uma amostra dos pontos das curvas exibidas em um arquivo, sob a forma de uma tabela.
Grande parte da especificação foi definida informalmente, através de conversas com os usuários do Lissage. Grande parte das requisições só foram expostas após uma primeira versão do programa ser apresentada. Um ponto interessante a ser notado é que algumas das requisições foram conflitantes entre os usuários.4.3. AmbienteUm ponto falho foi a ausência de especificações técnicas sobre os algoritmos de interpolação.
A proposta inicial era desenvolver o sistema utilizando a linguagem C, interagindo diretamente com a API do Win32. A principal razão da escolha dessa linguagem para esse projeto foi a familiaridade do pessoal do agrupamento com seu uso. Mas optei por gradualmente utilizar elementos da linguagem C++ para facilitar o desenho e a organização do código. Ao longo do desenvolvimento, as porções do código escritas utilizando o paradigma da linguagem C foram substituídas por código orientado a objetos.4.4. O nomeO ambiente escolhido para o desenvolvimento do software foi o Microsoft Visual C++ 5.0; essa escolha foi motivada por sua integração à plataforma alvo e por sua disponibilidade.
Eu batizei esse software de Emerson, em homenagem ao poeta americano Ralph Waldo Emerson (1803-1882). Um dos primeiros programas de exemplo para Win32 que eu executei fazia a exibição na tela de um poema de Emerson. Eu procurava um nome para o projeto, e assim o batizei provisoriamente de Emerson.4.5. Modelagem
O ambiente de desenvolvimento escolhido não fornece muitas facilidades em relação à construção de aplicações sem o auxílio do MFC. Assim, toda a estrutura do código foi organizada praticamente do zero.4.6. Algoritmos de interpolaçãoA principal dificuldade nesse sistema foi a criação de um modelo de classes para o armazenamento e a manipulação dos dados experimentais e das curvas interpoladas e derivadas.
Foi desenvolvida uma interface para generalizar a criação e utilização de funções matemáticas e algoritmos de interpolação, para que novos algoritmos pudessem ser facilmente incorporados ao sistema. Modelei uma estrutura de classes para a representação de polinômios e polinomiais. Polinomiais são curvas formadas por um conjunto de polinômios, cada um responsável por parte de seu domínio; as curvas interpoladas são polinomiais, na maior parte dos casos.4.7. Saída gráficaImplementei e acrescentei ao sistema o algoritmo de Spline cúbica. Esse algoritmo gera um conjunto de pontos da curva interpolada. Com a utilização de uma representação de polinômios como objetos, e com o recurso de sobrecarga de operadores da linguagem, pude adaptar esse algoritmo para a geração da polinomial correspondente à curva. Isso permitiu separar a geração de pontos do algoritmo de geração da curva, o que além de aumentar a eficiência do conjunto possibilitou a obtenção da derivada da curva analiticamente.
Também adaptei ao sistema o algoritmo de interpolação B-Spline. Este foi um dos maiores desafios no sistema, e mostrou que o curso do BCC foi uma ótima preparação. A eficiência estava comprometida por uma função recursiva de cálculo de pesos (utilizados pelo algoritmo na geração dos pontos da curva). Essa função era praticamente uma transcrição em código da correspondente definição matemática, e apresentava diversas redundâncias e cálculos repetitivos.
Muitas das operações desnecessárias foram eliminadas através de técnicas de programação dinâmica: utilizei uma matriz para armazenar valores calculados e retornados pela função, evitando que operações custosas fossem duplicadas. Em seguida, procurei analisar as características do processo de preenchimento dessa matriz, e notei que essa função recursiva poderia ser substituída por uma função iterativa capaz de gerar os mesmos valores com uma quantidade menor de operações. Essa simplificação permitiu uma análise mais refinada do algoritmo, e a matriz pôde ser substituída por um simples vetor, pois os valores de uma determinada iteração eram utilizados apenas na iteração seguinte. O algoritmo modificado apresentou desempenho satisfatório para as dimensões usuais da entrada, e foi integrado ao sistema.
Apesar de pesquisar bastante, não pude localizar referências ao algoritmo de interpolação utilizado pelo Lissage; assim, sua funcionalidade ainda não foi totalmente replicada.
Toda a saída gráfica foi encapsulada numa estrutura de classes, o que permitiu separar a parte gráfica da funcionalidade do sistema. Posteriormente, isso possibilitou a adaptação do sistema para a utilização de uma biblioteca de interface gráfica para C++. A utilização dessa biblioteca se mostrou necessária muito tempo depois, durante a implementação dos elementos de interface com o usuário.5. Resultados
Com a conclusão do meu estágio, no final desse ano, apresentei uma versão funcional do sistema. Essa última versão possui toda a funcionalidade básica exigida, e fornece boa parte das facilidades requisitadas. Por falta de tempo, outras facilidades não foram implementadas: um sistema de zoom para o gráfico e um sistema de gravação e recuperação do documento de trabalho.6. BCCFoi feita uma verificação dos resultados do programa em comparação com os resultados do Lissage, a partir de dados previamente calculados. Os resultados se mostraram inferiores aos obtidos com o Lissage. Foi o que eu esperava, de certa forma, pois o Emerson utiliza algoritmos diferentes dos utilizados no Lissage.
Futuramente, pretende-se acrescentar ao sistema o algoritmo de interpolação utilizado pelo Lissage, para que este seja totalmente substituído.
Por ter trabalhado praticamente sozinho, e pela natureza de pesquisa do projeto, meu trabalho envolveu diversas áreas bastante diferentes. Em termos gerais, acredito ter aproveitado mais da metade das disciplinas que estudei no BCC.7. ReferênciasAcho que muitas vezes os alunos se frustram com o curso por não encontrarem aplicação prática direta para as disciplinas. No caso de Computação é um pouco mais complicado: por exemplo, alguém que diz que a teoria de Autômatos não tem aplicação prática com certeza trabalha ou já trabalhou com um compilador. Minha opinião, antes de fazer esse estágio, era de que as matérias mais teóricas são muito importantes para a formação dos alunos, muitas vezes simplesmente por ensinarem a pensar.
Essa opinião se fortaleceu ao longo desse estágio. Não sei se poderia ter feito todo esse trabalho sem essa preparação.
A disciplina de Programação Orientada a Objetos foi essencial. Acredito que esse projeto poderia ter sido desenvolvido fora desse paradigma, mas com certeza não apresentaria os mesmos resultados e a mesma qualidade.
As disciplinas introdutórias e as matérias de programação foram muito importantes, pois meu trabalho envolveu principalmente escrever código. Mesmo algumas matérias que não envolvem diretamente programação foram importantes, por apresentarem (nos EPs) diversas maneiras de transformar um problema abstrato em código.
Engenharia de Software deveria ter ajudado, mas não ajudou: as dificuldades que senti não foram reduzidas pela matéria. Acredito que este é um caso onde um pouco de experiência é essencial para a compreensão e aplicação da teoria. Acabei aprendendo no estágio parte do que deveria ter aprendido no curso.
A implementação dos polinômios e algoritmos de interpolação foi uma das mais gratificantes, pois envolveu diversas matérias: Cálculo, Análise de Algoritmos, Conceitos de Linguagens de Programação e Álgebra. Geometria Computacional foi muito importante na manipulação e exibição das curvas e pontos.
IPT: http://www.ipt.br/^ZWin32, MFC, Windows SDK: http://msdn.microsoft.com/.
C++: diversas referências disponíveis online.
Numerical Recipes: http://www.nr.com/.
Algoritmo B-Spline: provém do trabalho de Keith Vertanen (vertankd@cda.mrs.umn.edu), disponível na Internet (http://www.simtel.net/) e licenciado para o domínio público.
Ralph Waldo Emerson: http://www.rwe.org/.