![]() |
||||||||||||||||||||||||||||||||||||||||||||||
Trabalho de Formatura Fernando Augusto
de Carvalho Supervisor: Flávio Soares
Corrêa da Silva
Introdução O objetivo desta monografia é descrever parte da minha experiência de trabalho na empresa Touch Tecnologia e Informática, como estagiário durante o período de setembro de 2004 até a data de conclusão deste documento. Nas atividades realizadas no estágio, muitos sistemas estão envolvidos, assim como diversas tecnologias são utilizadas. Portanto para melhor descrever minha experiência, optei por focar em um sistema específico, o BaseLineSystem (ou BLS), que engloba a maioria do conteúdo aprendido. Pretendo descrever os aspectos técnicos abordados, e relacioná-los com o conteúdo do curso de Bacharelado em Ciência da Computação do Instituto de Matemática da Universidade de São Paulo (IME-USP) [1]. Uma parte subjetiva também será apresentada, relatando minhas experiências pessoais durante este período.
Primeira Parte A Empresa
A Touch Tecnologia e Informática é uma empresa recente, e foi fundada para desenvolver sistemas para o grupo Diagnósticos da América. A Diagnósticos da América é a maior empresa de medicina diagnóstica da América Latina. Em constante crescimento, diversos laboratórios e hospitais integram o grupo: Delboni Auriemo, Lavoisier, Club DA, Bronstein, Lâmina e Santa Casa - Estes, atuam em 11 cidades, nos estados de São Paulo, Rio de Janeiro, Paraná e Minas Gerais. Estruturada em 148 unidades e três Núcleos Técnicos Operacionais, atende 15 mil clientes por dia e processa, diariamente, com precisão, segurança e agilidade, cerca de 80 mil exames de análises clínicas. [2] Este sucesso e crescimento constante faz com que a Touch Tecnologia esteja cada vez mais presente, e seja cada vez mais necessária no processo de automação dos procedimentos do Diagnósticos da América. Diversos alunos do IME trabalham ou já passaram pela Touch, que a cada dia mostra mais maturidade e excelência na formação de profissionais da área de computação e engenharia de software. O Projeto: Motivação Ao final do ano de 2004, a gerência de configuração da Touch Tecnologia estava em reformulação para adequação um novo processo de desenvolvimento baseado no RUP [3]. Algumas ferramentas de mercado, como o CVS [4] e o Cruisecontrol [5], começavam a tomar parte na implantação deste novo processo. Entretanto, existiam algumas atividades que não possuíam ferramentas para facilitar sua execução. Dentre essas atividades, existe o controle das bibliotecas utilizadas pelos sistemas em desenvolvimento e o controle de suas dependências (versões de bibliotecas utilizadas e sistemas dependentes). O controle dos sistemas e de suas dependências é fundamental para um processo de desenvolvimento estável e planejado, além de permitir uma estrutura de sistema mais clara e consistente. Este controle poderia ser facilitado através de uma ferramenta capaz de automatizar e auxiliar essas atividades. Como no mercado não havia qualquer opção de ferramenta que se adequasse às necessidades da empresa, a Touch optou por desenvolver uma ferramenta interna, o BLS. Tecnologias O BaseLineSystem é um projeto que foi idealizado e desenvolvido inteiramente pela Touch Tecnologia. Logo nas primeiras versões do documento de visão, era evidente que este sistema deveria ser altamente flexível, adaptável e extensível. Isto tanto no ponto de vista do projeto como sistema, quanto para o processo de desenvolvimento e testes. E de fato, esta necessidade se mostra cada vez mais evidente com o seu uso diário, onde novos "casos de uso" surgem constantemente. A linguagem de programação utilizada foi a linguagem Java
(versão 1.4) [6], e as tecnologias utilizadas
foram: Tecnologias e Ferramentas utilizadas
Tecnologias desenvolvidas
Background Para entender o BaseLineSystem, devemos antes conhecer alguns detalhes do processo de desenvolvimento de um sistema. O CVS O Concurrent Versions System é o repositório dos arquivos fonte de um projeto, associado a um sistema de controle de versão. É ele quem gerencia as múltiplas versões de uma mesma unidade de informação (como por exemplo, uma classe ou arquivo de configuração), que pode ser trabalhada por diversas pessoas. Mudanças nestes documentos são identificadas com o incremento de um número, e com uma associação à pessoa responsável pela mudança. Versões de um sistema Uma versão de um sistema seria como uma "foto" dele em um dado instante. Versões diferentes distinguem sistemas diferentes seja por causa das funcionalidades, da interface ou qualquer coisa que torne necessária esta distinção. Normalmente quando se conclui uma primeira ou nova etapa do desenvolvimento e obtém-se um sistema estável com novas ou diferentes características, é comum definir uma nova versão. Após a implantação de uma versão de um sistema,
normalmente inicia-se um esforço de criação de uma
nova versão deste sistema, na qual funcionalidades serão
incluídas, erros corrigidos, e alterações significativas
de arquitetura podem ser feito. Branchs de desenvolvimento e baselines Um mesmo sistema pode ser objeto de vários projetos, notadamente nos casos de manutenção e desenvolvimento de novas versões. Projeto 1: desenvolvimento da versão 1 do Sistema X O CVS permite que você isole mudanças em uma linha de desenvolvimento separada, conhecida como branch. Quando se altera um arquivo em um branch, esta mudança não ocorre no branch principal ou em outros branches. Mais tarde você pode mover mudanças de um branch para outro. Na figura acima, chamamos a linha de desenvolvimento de cima de branch
HEAD. É nela que acontece o desenvolvimento do Sistema X. Quando o branch 01 tiver completado alguma versão de correção, podemos copiá-las ao branch HEAD e utilizá-las no desenvolvimento da versão 2. A este processo damos o nome de merge. Denominamos baseline uma versão fechada em um branch. Dependências Dentro de um projeto de desenvolvimento de um sistema de grande porte,
há atividades que não são de desenvolvimento de software;
são de naturezas diversas como: aquisição de componentes
(hardware, software), preparação de infra-estrutura, normalização
de informações e parametrização, treinamento
e etc. Projeto 1: desenvolvimento do Sistema A; depende dos Projetos 1.1, 1.2,
1.3 e 1.4 Quando um projeto depende de um sistema, ele depende de algum versão (baseline) deste sistema, em algum branch. O BaseLineSystem O BLS foi projetado para gerenciar as dependências dos sistemas e auxiliar o processo de desenvolvimento de um projeto. Todos os sistemas seriam cadastrados juntamente com suas dependências. Para cada baseline gerada, seria enviado o arquivo binário desta baseline. O BLS seria então capaz de gerar um arquivo contendo todas as dependências de um certo projeto. Gerentes de configuração poderiam gerenciar as dependências de um branch em desenvolvimento até o fechamento de uma baseline. Em sua primeira versão, o BLS assumia que uma baseline fazia parte da história do sistema, e portanto que nunca poderiam ser alteradas ou removidas após criadas. Como veremos adiante, apesar de parecer teoricamente correto, isto não funcionou na prática. O BLS hoje é bem mais flexível, e permite que baselines tenham suas informações (dependências, por exemplo) alteradas ou removidas. Vejamos agora alguma das funcionalidades e características do BLS: Tipos de dependências e o grafo de dependência As dependências são tratadas de forma diferente no desenvolvimento de um projeto, conforme a sua natureza. Por exemplo, um sistema pode depender de uma biblioteca apenas para realizar testes, ou então apenas para o processo de compilação. O BLS distingue cinco tipos de dependência entre sistemas: 1) Associação: Uma dependência de associação
indica um sistema necessário ao funcionamento do projeto. As dependências são cadastradas em um branch de desenvolvimento. Quando uma baseline é fechada, ela possui as mesmas dependências que o branch possuía naquele momento. Futuras alterações nas dependências do branch não alteram as dependências das baselines pertencentes a ele. A representação interna da estrutura destes relacionamentos é um grafo orientado, onde um nó pode ser tanto uma baseline quanto um branch. Cada aresta possui um tipo de dependência e é orientada do nó dependente ao nó dependido.
O padrão Visitor O padrão comportamental de design Visitor foi utilizado na na implementação do pacote comum de grafos da Touch Tecnologia. Este padrão permite representar uma operação a ser realizada sobre elementos de uma estrutura de objetos, e permite definir novas operações sem alterar as classes dos elementos em que ele opera. As interfaces de NoVisitor e ArcoVisitor são responsáveis pelo controle de uma busca no grafo de dependências. Devem determinar se a busca está concluída ou não. Qualquer efeito colateral à visita é permitida, com exceção a mudanças na estrutura de arcos e nós do grafo, a fins de garantir consistência da busca. Por exemplo, para implementar a verificação por inconsistência circular extendemos a interface NoVisitor na classe VerificadorInconistenciaCircular. Seu construtor recebe o nó de partida, no caso um BaselineBean. À partir dele, visitamos cada uma de suas dependências (novos nós), e a cada uma verificamos se ela depende do nó inicial. Se depender, isto significa que partimos de um nó e alcançamos alguém que depende dele, ou seja, foi encontrada uma inconsistência de dependência circular. Em cada visita também é guardado um registro das visitas, para mostrar ao usuário o caminho que gera esta inconsistência circular. Consequências: Alguns dos benefícios do padrão Visitor são:
O Arquivo de dependências
A geração de um arquivo de dependências permite que o ambiente de desenvolvimento de um projeto esteja sempre atualizado. O arquivo é organizado conforme a categorização das dependências, e é gerado conforme as necessidades. É possível gerar arquivos escolhendo os tipos de dependências a serem baixadas, assim como a quantidade de níveis a se buscar no grafo de dependências. A verificação por inconsistências Quando adicionamos uma dependência a um branch ou baseline, podemos estar gerando inconsistências no grafo de dependências dos sistemas. Isto significaria que um ou mais sistemas teriam suas dependências cadastradas de maneira ilegal, levando a um cenário incorreto de desenvolvimento. O BLS não permite adições que geram inconsistências, e possui mecanismos de busca no grafo de dependências para detectá-las. Esta figura faz parte do cenário de testes para adição e remoção de baselines. Os sistemas são representados por letras, e em sua linha de desenvolvimento marcamos com uma bolinha a representação de uma baseline. As setas em preto indicam dependência de qualquer tipo, já existentes no cenário de cada teste. Os testes realizados são numerados, e atuam sobre as classes de negócio responsáveis pelo gerenciamento de dependências da seguinte maneira: [1] Adição Inconsistente: Esta adição
tornaria o sistema A inconsistente. Por um caminho no grafo, podemos sair
da primeira baseline do sistema A e voltar nela mesma. Uma baseline não
pode depender dela mesma. [5] Adição Não-inconsistente: A
adição da dependência [5] não deixa nenhum
sistema inconsistente, e portanto é uma adição que
pode ser feita.
Atividades Realizadas Treinamento e outros Projetos Até estar apto a trabalhar no BLS, passei por diversas atividades na empresa, onde cada vez mais fui agregando conhecimento sobre as tecnologias utilizadas e processos de desenvolvimento como um todo. Nos primeiros meses, participei do programa de treinamento de estagiários da Touch Tecnologia e concomitantemente participei do desenvolvimento de um sistema que a Touch desenvolve para a empresa NuttyBavarian. Durante este período, aprendi muito sobre os processos que envolvem o desenvolvimento de um projeto, tais como documentação (casos de uso, visão, requisitos, diagramas de classe e sequência), cronogramas, implementação, testes, padrões de design, configurações de ambientes, implantação de sistemas. Após esta etapa, fui alocado para projetos que envolviam problemas
como centralização de imagens de exames especializados,
monitoramento das funções de um servidor Weblogic, testes
de carga para web, novos requisitos para os sites www.delboniauriemo.com.br
e www.lavoisier.com.br, dentre outros. BLS novos requisitos Contexto: Até então o BLS havia
acabado de fechar a sua primeira versão de desenvolvimento, porém
nunca havia sido utilizado. Sua documentação impecável
e clareza de código fizeram com que ele fosse escolhido para servir
de sistema-modelo para os métodos de desenvolvimento da empresa.
No entanto, ao tentar utilizá-lo na prática, diversos novos
requisitos surgiram prontamente. Seus desenvolvedores originais já
estavam alocados em outros projetos, e não podiam atender tais
requisitos. . As alterações e implementações de novos requisitos do BLS envolviam seguir certos passos de desenvolvimento. Cada passagem pelo diagrama acima é uma iteração no processo, mas nem sempre a ordem foi respeitada. Muitas vezes os detalhes de implementação, por exemplo, faziam necessárias as alterações nos diagramas UML. Outras vezes, a necessidade de que a nova versão do sistema entrasse logo em produção faziam com que a documentação fosse deixada para mais tarde. Na prática, muitas vezes não é possível respeitar a teoria do modelo ideal de desenvolvimento. Problema: Permitir a adição de binários de sistemas externos após fechamento de baselines. Este problema surgiu quando percebemos que, ao cadastrar um sistema externo, nem sempre tinhamos o arquivo pronto em mãos. Era necessário poder alterar uma baseline para incluir ou alterar o arquivo dela a qualquer momento. Este problema, apesar de simples, exigiu o aprendizado de todo o funcionamento do sistema. O aprendizado incluiu configurações do ambiente de desenvolvimento, de produção e de testes. Ainda, aprender os detalhes de implementação na camada web, de negócio e particularidade do framework de testes, aprimorar o conhecimento de componentes como Struts, Ant, Hibernate, dentre outros. Para a implementação em particular, foi necessário aprofundar o conhecimento sobre os mecanismos de Stream de Arquivos, Servlets, e o sistema de transação de arquivos e como ele atua sobre o FileSystem. Problema: Possibilitar a alteração de nomes de baselines. Como o BLS se apoiava no conceito de que baselines são imutáveis, era impossível alterar qualquer informação de uma baseline. O sistema estava muito rigoroso! O processo de cadastro não estava flexível, e um erro ou desatenção ao cadastrar dados no BLS não parecia ser muito tolerado. O banco de dados ficaria"sujo" com tais erros. Este novo requisito permitiria ao gerente de configuração mudar, por exemplo, o nome de uma baseline juntamente com seu arquivo, e portanto assim ajustá-la conforme a necessidade. Esta iteração foi a mais simples de todas. Problema: Possibilitar remoção de baseline/branch/sistema. Conforme o BLS foi sendo utilizado, fazia-se necessário o desenvolvimento da remoção da baselines, ou branchs ou sistemas. Isto porque, como em qualquer sistema de cadastro, erros acontecem, e mudanças imprevistas surgem. Este problema já saía da trivialidade, e aqui os conceitos utilizados na implementação batiam de frente com os novos requisitos. Um sistema possui um ou mais branchs. Cada branch possui zero ou mais baselines. Para apagar uma baseline, bastava que ninguém dependesse dela. Para apagar um branch, bastava que ninguém dependesse de nenhuma baseline deste branch. E por fim, para apagar um sistema, era necessário que ninguém dependesse de nenhuma baseline de nenhum de seus branchs. Pro exemplo, esta etapa envolveu adaptar o sistema de transação sobre arquivos. Se estamos apagando um sistema, e estamos apagando a terceira baseline dele e ocorre um erro. Como voltar atrás se já apagamos o arquivo? Particularidades do próprio FileSystem também dificultaram esta tarefa. No que diz respeito a entidades, os mecanismos do Hibernate juntamente com o uso do XDoclet e Ant facilitaram muito a tarefa de implementação. Problema: O sistema deve ser capaz de gerar o arquivo de dependências trazendo todas as dependências de primeiro nível, e podendo ignorar certos tipos de dependências dos demais níveis. Para poder começar a utilizar o BLS ainda faltava mais uma alteração. O arquivo de dependências não diferenciava tipos de dependências. Como faríamos para dividir as dependências em sua pasta correta no workspace? Ainda, nem sempre precisávamos de todos os niveis de dependência, ou então precisávamos só de alguns tipos de dependência. Nesta iteração foi implementado uma maneira mais flexível na obtenção do arquivo de dependências de um projeto, com filtros de níveis na árvore de dependências e filtros para tipos de dependência. Problema: O sistema deve ser capaz de adicionar ou remover dependência de baseline (novas inconsistências) O BLS estava finalmente em uso. Mas ainda, havia um ponto que poderia fazer dele uma ferramenta mais ágil. Permitir poderes plenos a quem fosse o gerente de configuração projeto, e portanto, poder adicionar ou remover dependências a baselines. Esta iteração foi a maior e mais trabalhosa de todas. Novas dependências em baselines exigiram novas verificações por inconsistências, novas maneiras de percorrer o grafo. Na apresentação, novos maneiras de mostrar inconsistências e novas telas tiveram de ser implementadas. (Ver ítem "Verificação por inconsistências")
Segunda Parte Objetivos, Desafios e Frustrações Tudo começou quando eu cursava Engenharia Mecânica e tive uma aula de programação. Eu simplesmente adorei aquela matéria, e percebi que eu gostava muito de computação. Quando entrei na USP eu comecei a trabalhar com alguns amigos, desenvolvendo pequenos sistemas e jogos para a Internet. A satisfação de ver seu próprio trabalho sendo utilizado e reconhecido é muito grande. Percebi que eu gostava de desenvolver sistemas. Algumas decepções me ensinaram valiosas lições sobre o mercado. Quando entrei na Touch, me deparei com o novo mundo e uma nova visão de todo o processo de desenvolvimento de sistemas. A vontade de aprender novas tecnologias mais poderosas e robustas, os novos conceitos e tudo mais envolvido tomaram conta de mim. É muito bom poder dizer que hoje eu gosto muito do que faço. Meu objetivo é seguir neste ramo indefinidamente. Só depois do estágio, meu curso no IME, até então levado com certa indiferença começou a fazer muito mais sentido, e as matérias começaram a se mostrar mais úteis na vida prática. Mas a carga horária acabou ficando um tanto quanto pesada. Por um lado é muito bom poder estudar matérias na faculdade que te dão uma boa base formal para o trabalho, mas ao mesmo tempo, é muito ruim você não ter tempo para se dedicar totalmente a nenhum dos dois. Uma frustração é não ter dado tanta atenção ao curso antes. O desafio foi correr atrás do prejuízo e conseguir conciliar as duas atividades. Lista das disciplinas cursadas no BCC mais relevantes para o estágio
Interação com membros da equipe que tenham agido como mentores do trabalho Em todo o processo, sempre tive o apoio de toda a equipe da Touch. Mas os grandes mentores de meu trabalho foram o Rodrigo Couto e Paulo Tamaki, que estavam sempre prontos a sanar qualquer possível dúvida e me ensinar o que fosse necessário. Foram eles os primeiros desenvolvedores, e "pais" do BLS. Diferenças notadas entre a forma de cooperação com colegas do BCC nas tarefas em grupo das disciplinas e a forma de trabalho conjunto na empresa Em matéria de cooperação posso dizer que não há muita diferença na maneira de realizar uma tarefa com colegas do BCC e na empresa. Talvez porque muitas pessoas da empresa sejam também do BCC. Observações sobre a aplicação de conceitos estudados nos cursos no contexto prático de aplicações reais Fica muito destacado para mim a importância do pensamento formal que aprendemos a ter no curso, com a aplicação real encontradas na empresa. Por exemplo, uma boa implementação vai gerar menos esforços de correções, maior facilidade de manutenção e muitas vezes, melhor desempenho do algoritmo. Se o aluno fosse continuar atuando na área em que exerceu o estágio, que passos tomaria para aprimorar os conhecimentos técnicos/metodológicos/comerciais/científicos/etc relevantes para esta atividade? Pretendo sim continuar atuando nesta área em que exerci o estágio. Para aprimorar o conhecimentos, acho importante a realização de cursos profissionalizantes, a leitura constante de literatura relacionada, e estar constantemente atualizado com informações de novas tecnologias e métodos de desenvolvimento.
Referências [1] Instituto de Matemática e Estatística
da USP [2] Diagnósticos da América [3] Rational Unified Process [4] CVS [5] Cruisecontrol [6] Java 2 Platform, Enterprise Edition (J2EE) [7] The Apache Struts Web Application Framework [8] The Apache Ant Project [9] XML / XSL [10] JUnit [11] Jakarta Tomcat [12] Design Patterns - Elements of Reusable Object-Oriented Software
Agradecimentos Gostaria de agradecer primeiramente aos meus pais por sempre me apoiarem e acreditarem em mim. Aos meus irmãos e toda minha família. Aos meus colegas de BCC, que foram ótimos companheiros nesta jornada. Aos colegas da Touch, em especial Rodrigo Couto e Paulo Tamaki pela orientação. Ao meu chefe Ricardo Auriemo. Ao meu Tricolor querido do coração, que me trouxe tanta alegria este ano. E abraços especiais aos amigos Marcão, Dzik, Sergio, Té, Telles, Rogério, Varas, Dubs e outros todos que me ajudaram nos momentos de descontração (esse ano foi puxado!). Ao time de futebol e handebol do IME. Aos amigos Pedro, Maitê e Karen. E por fim, a todos do Intersítios. Obrigado. sf |
||||||||||||||||||||||||||||||||||||||||||||||
![]() |