Trabalhos práticos

  • Os trabalhos são realizados em grupos de, no máximo, 6 alunos da mesma turma.
  • Cada grupo deve enviar uma mensagem para nuno.flores@gmail.com até às 20 horas do dia 13/10/2005, indicando a constituição do grupo e uma lista de preferências, com pelo menos 5 hipóteses de trabalhos da lista indicada abaixo.
  • A lista de grupos e trabalhos atribuídos será posteriormente publicada.
  • O trabalho compreende a realização de uma pesquisa sobre o tema escolhido, a elaboração de um artigo de síntese, a preparação e realização de uma apresentação e a construção de uma página num wiki a indicar reunindo os dados do trabalho.
  • A primeira parte do trabalho, a entregar até 31/10/2005, consiste numa definição de objectivos e um memo indicando os tópicos a abordar no trabalho, máximo uma página A4.
  • A nota do trabalho será baseada no artigo, na apresentação e na páginas wiki, por ordem decrescente de importância.
  • As páginas wiki devem conter o objectivo do trabalho, a constituição do grupo, os links e referências consultadas, e os resultados produzidos (artigo de síntese e slides da apresentação).
  • O artigo de síntese não pode ter mais de 14 páginas A4, e deve seguir o modelo LNCS (ver LNCS Authors page).
  • Uma versão electrónica em formato PDF (preferido) ou Postcript deve ser colocada no wiki do grupo até uma data a indicar.
  • Uma cópia em papel deve ser colocada na caixa de correio do docente das aulas práticas respectivo, no piso 2 do edifício I nascente, até uma data a indicar.
  • As últimas aulas da disciplina serão utilizadas para a apresentação dos trabalhos, com a ajuda de computador e projector de vídeo, de acordo com um escalonamento a publicar.
  • Os suportes da apresentação (em formato PPT ou similar) devem ser colocados na página wiki do grupo antes da apresentação.
  • Cada grupo terá cerca de 15 minutos para a apresentação.
  • O aluno de cada grupo que fará a apresentação será escolhido pelos docentes no momento da apresentação.
  • O trabalho prático é obrigatório para todos os alunos, mesmo para os alunos dispensados de frequência às aulas teórico-práticas (caso de alunos militares e trabalhadores-estudantes).
  • Segue-se uma lista de temas propostos, agrupados por grandes áreas de Engenharia de Software.
  • Trabalhos relacionados com mais do que uma área são colocados na área considerada como a "principal" área desses trabalhos.

Especificação Formal

VDM++

VDM++ é uma linguagem de especificação formal baseada no VDM-SL e estendida com elementos do Smalltalk, para abarcar conceitos do paradigma de orientação por objectos. O VDM++ fornece uma larga variedade de elementos de construção que o utilizador pode usar para especificar formalmente um qualquer sistema orientado por objectos. Um especificação formal completa em VDM++, também denominada “modelo”, é composta por um conjunto de especificações de classes e uma outra, opcional, de um workspace. Pretende-se que este trabalho apresente a linguagem, os seus elementos, exemplos de especificação, aplicações e potencialidades.

Referências:

  • Dürr, E. and van Katwijk, J. 1992. VDM++: a formal specification language for object-oriented designs. In Proceedings of the Seventh international Conference on Technology of Object-Oriented Languages and Systems (Dortmund, Germany). G. Heeg, B. Magnusson, and B. Meyer, Eds. Prentice Hall International (UK) Ltd., Hertfordshire, UK, 63-77.

Spec#

Spec# é uma nova tentativa para o desenvolvimento de software de alta qualidade sem acréscimo de custos. O sistema Spec# é composto por : (1) uma linguagem de programação estendida do C#, para incluir tipos não nulos e verificação de excepções. Igualmente permite formalizar a definição de métodos através de pré e pós-condições e objectos invariantes; (2) um compilador que verifica as pré e pós-condições, assegura o conteúdo dos tipos não nulos e mantém a meta-informação sobre a formalização dos métodos para uso posterior por outras ferramentas e (3) um verificador estático de teoremas que automaticamente analiza as pré e pós-condições e prova a correcta (ou não) especificação do programa. Característica única do Spec# é a garantia da manutenção de invariantes em programas orientados por objectos na presença de callbacks, threads e relações inter-objectos. O objectivo deste trabalho é a apresentação sucinta deste sistema e seus constituíntes.

Referências:

OCL: Object Constraint Language

A linguagem OCL é usada em UML e permite definir restrições e pesquisas sobre modelos de objectos. Estas restrições são particularmente úteis pois permitem a um programador criar regras específicas que governam os aspectos de um determinado objecto, a um nível alto de abstracção. Como muitos projectos hoje em dia requerem regras únicas e complexas, escritas especificamente para o seu modelo de negócio, a OCL tem-se tornado uma faceta integral do desenvolvimento por objectos. Pretende-se com este trabalho, a análise e o estudo da OCL, seu propósito, sintaxe e aplicação e ferramentas de apoio conhecidas.

Referências:


Design

Modelação de Processos de Negócio

A modelação de processos de negócio é uma actividade importante na engenharia de requisitos de sistemas de software e sistemas de informação. A análise dos processos através dos quais a organização concretiza os seus objectivos de negócio, fluxo de informação e interacções entre entidades internas e externas leva a uma compreensão global do seu funcionamento. O objectivo deste trabalho é o de estudar e comparar formalismos para modelação de processos de negócio, tais como UML, BPML e BPEL.

Referências:

  • http://www.bpmi.org/ (referências a BPML).
  • http://www.ebpml.org/ (referências a BPEL4WS, WS-BPEL ou simplesmente BPEL).
  • Business Modeling with UML: Business Patterns at Work, Hans-Erik Eriksson, Magnus Penker, 2000 (existe na biblioteca da FEUP).

Programação Orientada por Aspectos

A programação orientada por aspectos (POA) é uma abordagem que tenta suprir algumas lacunas da programação orientada por objectos (POO). Estas lacunas comportam a captura de certas decisões de desenho e respectiva implementação, por interceptarem mais do que uma funcionalidade básica do sistema. Através da POA, estas decisões são possíveis de captura (naquilo a que se chamam aspectos), incluíndo o seu isolamento, composição e reutilização de código apropriados. O objectivo do trabalho é apresentar de forma sucinta a POA, seus paradigmas mais importantes e o estado actual da arte a nível de aplicações e tecnologias.

Referências:

  • “Aspect-Oriented Programming“,Gregor Kiczales, John Lamping, Anurag Mendhekar, Chris Maeda, Cristina Videira Lopes, Jean-Marc Loingtier, John Irwin. In proceedings of the European Conference on Object-Oriented Programming (ECOOP), Finland. Springer-Verlag LNCS 1241. June 1997.
  • http://eclipse.org/aspectj/

Refactoring: Técnicas de Redesenho de Software

A ideia de refactoring tem origem na tese de Bill Opdyke, 1992. “A refactoring is a change made to the internal structure of software to make it easier to understand and cheaper to modify without changing its observable behavior”. O processo de refactoring envolve a eliminação de duplicação, a simplificação de lógica complexa e clarificação de código, tornando-o mais fácil de entender. Exemplos: alterar nome de variável, dividir um método grande, alterar a assinatura de um método, instanciar um padrão de design, etc. Um tipo especial de refactorings é "Refactoring to patterns", uma abordagem nova de aplicação de patterns que combina a utilidade top-down dos design patterns com a descoberta bottom-up típica em desenvolvimento iterativo e refactoring contínuo.  O
objectivo deste trabalho é apresentar este conceito, a sua evolução e
presente estado, referindo as suas vantagens e desvantagens e a
problemática constante à volta deste tópico.

Referências:

Model-Driven Development

Model-driven programming é um paradigma de desenvolvimento de software que visa modelar todos os objectivos de um sistema através de manipulações apenas ao nível do seu modelo abstracto de alto-nível. Esta abordagem concentra-se em modelar primeiro o que se pretende que o sistema faça e só depois decidir como se irá fazer. Delega-se a responsabilidade de traduzir esta modelação do “quê” para o “como” para um sub-sistema, através de um processo generativo de código. O objectivo deste sub-sistema é gerar uma implementação concreta partindo de modelos declarativos. Pretende-se que este trabalho apresente este paradigma, o seu propósito e componentes mais relevantes e quais as aplicações e ferramentas de apoio ao desenvolvimento existentes.

Referências:

Arquitectura de Aplicações Empresariais

As Aplicações Empresariais, que podem ser designadas também por Aplicações sobre Sistemas de Informação, são aplicações que lidam com a visualização, manipulação e arquivo de grandes quantidades de dados (normalmente complexos) e o suporte e automação de processos de negócio com esses mesmos dados. Exemplos destes sistemas são sistemas de reservas, sistemas financeiros, sistemas de cadeias de fornecimento e muitos outros. Estes sistemas têm os seus próprios desafios e soluções e são diferentes de sistemas embebidos, sistemas de controlo, sistemas de telecomunicações e de aplicações de secretária. O objectivo deste trabalho é fazer um resumo das soluções de arquitectura para aplicações empresariais, tendo como base o trabalho de Martin Fowler.

Referências:


Processos

Unified Process

O Unified Process é um processo de desenvolvimento de software que assenta na elaboração de vários modelos que descrevem a arquitectura de um sistema, através de um processo iterativo e incremental, guiado por casos de utilização. O objectivo deste trabalho é descrever sucintamente de que se compõe este processo (actores, fases, modelos), seu propósito e implementações conhecidas (RUP, EUP, ...).

Referências:

Open Source Software Development

Software “open-source” é software no qual o código-fonte é distribuído ou está acessível via Internet sem custos ou limitações para quem o quiser usar, modificar ou mesmo re-distribuir. É um fenómeno que começou a crescer desde 1980, a partir de projectos como o BSD Unix e o Free Software Foundation GNU, ganhando grande aceleração a partir de 1990. Tal deve-se ao facto da Internet ter crescido paralelamente, possibilitando a colaboração entre programadores numa escala até então impossível. O objectivo deste trabalho é apresentar este conceito, a sua evolução e presente estado, referindo as suas vantagens e desvantagens e a problemática constante à volta deste tópico.

Referências

SCRUM

Scrum é um processo ágil que pode ser usado para gerir e controlar desenvolvimento de software e produtos usando práticas iterativas e incrementais. Ao englobar práticas existentes, incluindo Extreme Programming e RUP, Scrum alia os benefícios de desenvolvimento ágil com as vantagens de uma implementação simples. O objectivo deste trabalho é apresentar esta metodologia, arquitectura, vantagens e desvantagens e ferramentas de apoio conhecidas.

Referências:

Feature Driven Development

Feature Driven Development é um processo ágil de desenvolvimento de software que assenta na captura prévia das funcionalidades, a um nível de lógica de negócio, que trazem a maior valia aos actores (internos ou externos) de um sistema. Depois de elencadas todas estas funcionalidades (ou features) todo o desenvolvimento é planeado à volta destas, sendo o desenho e implementação feito independentemente para cada uma, e agregado interativamente na arquitectura geral, construíndo-a aos poucos e à medida que o desenvolvimento vai avançando. O objectivo deste trabalho é apresentar esta metodologia, arquitectura, vantagens e desvantagens e ferramentas de apoio conhecidas.

Referências:

Dynamic Systems Development Methodology

DSDM é uma metodologia ágil de desenvolvimento de software que, como outras, concentra-se em desenvolver rapidamente uma solução com qualidade. Após um estudo de viabilidade, o processo estuda o domínio de negócio onde se irá aplicar o processo e prossegue por três fases: análise funcional, desenho e implementação. Os princípios por detrás do DSDM incluem interacção com o cliente final, equipas autónomas de alta-produção, entregas de protótipos frequentes, testes intermédios, etc. Como qualquer outra metodologia ágil, enfatiza a alta qualidade e flexibilidade para a mudança brusca de requisitos. Pretende-se uma breve apresentação desta metodologia, filosofia, princípios, processos e aplicações conhecidas.

Referências:

CMMI

CMMI (Capability Maturity Model® Integration) é uma abordagem que visa a melhoria dos processos de desenvolvimento dentro de uma organização através do fornecimento dos elementos essênciais para os processos se tornarem eficientes. Pode ser usado para guiar o melhoramento do processo ao longo de um projecto, de um departamento ou de toda a organização. O CMMI ajuda na integração de funções organizacionais que se encontram separadas, estabelece prioridades e objectivos de melhoria, fornece linhas directrizes para o aumento da qualidade e consolida um ponto de referência para a aferição da qualidade de processos existentes. O objectivo deste trabalho é apresentar o CMMI, benefícios, modelos, fases de maturidade e exemplos de organizações certificadas.

Referências:

SPICE

SPICE é uma iniciativa a nível internacional para o desenvolvimento de uma norma internacional para a aferição do processo de desenvolvimento de software. O projecto tem três objectivos principais: (1) conceber e desenvolver uma proposta de norma para aferir a maturidade dos processos de desenvolvimento de software nas organizações; (2) conduzir experiências de aplicação da norma em ambientes industriais e (3) promover a introdução desta tecnologia de aferição para a industria de software a um nível global. Pretende-se que este trabalho apresente o projecto, intervenientes, a sua história, resultados e exemplos de aplicação.

Referências:


Verificação e Validação

xUnit: Testes unitários

Os testes unitários são programas escritos para testar classes e serem executados de forma automática. Tipicamente, um teste unitário envia uma mensagem concreta a um objecto de uma classe e verifica se ele responde da forma prevista. Os testes unitários são uma componente de engenharia de software muito importante que permitem a quem desenvolve software ganhar confiança sobre a qualidade do software que estão a produzir e ajudam também na compreensão de programas uma vez que documentam como os usar e os resultados que deles se esperam. A ferramenta mais popular para a escrita e execução de testes unitários é a framework de testes xUnit de Kent Beck, com implementações para inúmeras linguagens de programação, das quais se destacam a implementação inicial para Java (JUnit), .Net (NUnit) e para C++ (CppUnit), HttpUnit, etc, etc. O objectivo do trabalho seria apresentar de forma breve a xUnit e enumerar as suas diversas implementações que actualmente existem.

Referências:

Teste baseado em modelos

Neste tipo de teste, são gerados casos de teste do sistema mais ou menos automaticamente a partir de um modelo de um sistema (modelo UML, modelo UML enriquecido com OCL, modelo formal, etc.). A riqueza dos testes depende do detalhe do modelo. O objectivo do trabalho é apontar as várias técnicas existentes, ferramentas e casos de sucesso. Prova de correcção de algoritmos Um caso muito falado na comunicação social foi o caso da colocação de professores, em que a empresa que resolveu o problema (ATX Sodtware) fez uma demonstração formal de que o seu algoritmo estava correcto. Em geral, dado um problema a resolver especificado por pré e pós-condições, e um algoritmo ou programa que pretende resolver o problema, pretende-se provar que no final da execução do programa ou algoritmo as pós-condições são satisfeitas, supondo que no início da execução do algoritmo as pós-condições são satisfeitas. O objectivo do trabalho é expor sumariamente as técnicas existentes para efectuar este tipo de prova (normalmente baseados em trabalhos de Hoare e Dijkstra), o grau de automação que se consegue, e apontar casos de sucesso. Model-checking É uma técnica de verificação formal que se baseia na descrição de um sistema através de uma máquina de estados finita e na descrição de propriedades a que o sistema deve obedecer numa linguagem apropriada (normalmente lógica temporal), sendo automaticamente verificado se a máquina de estados finita satisfaz as propriedades indicados, apresentando, em caso negativo, exemplos de traços de execução que violam a propriedade. Esta técnica tem sido aplicada com sucesso nas indústrias de software, hardware e telecomunicações. O objectivo do trabalho é explicar a técnica, apontar ferramentas existentes (SPIN, etc.), e apresentar casos de sucesso.


Infraestruturas de Engenharia de Software

Sistemas de Controlo de Versões: CVS e SVN

O CVS (Concurrent Versions System) é um sistema de controlo de versões de documentos, um componente importante do Source Configuration Management (SCM). Com este sistema, pode-se manter o histórico de alterações a ficheiros de código-fonte e documentos. O seu propósito é similar a outros sistemas existentes como o RCS, PRCS e Aegis. O objectivo do projecto SVN (Subversion) é a construção de um sistema de controlo de versões que seja um substituto à altura do CVS para a comunidade “open-source”. O objectivo do trabalho é analisar e descrever cada uma destas abordagens e compara-las adequadamente sob os seus aspectos mais importantes e relevantes.

Referências:

Wikis: uma ferramenta para desenvolvimento de software

Os wikis demonstraram já que são bastante apelativas como ferramentas colaborativas para produção e edição de informação baseada na web. Usam uma linguagem de anotação bastante simples, um mecanismo muito simples mas poderoso de ligação dinâmica entre páginas baseado em convenções léxicas e suportam o conceito de páginas adaptativas. Devido às suas qualidades atractivas, os wikis são hoje largamente usados, especialmente na comunidade de software e estão a ser usados para diferentes fins e em diferentes campos de conhecimento. O objectivo deste trabalho é estudar de que forma os wikis estão a ser usados para apoiar o desenvolvimento de software.

Referências:

E-learning e o Ensino da Engenharia de Software

As ferramentas de e-Learning suportam e apoiam o leccionamento e aprendizagem de determinadas disciplinas, nas quais a Engenharia de Software se encontra incluída. Atendendo a que o ensino de disciplinas no âmbito da programação e da engenharia de software tem requisitos próprios, nomeadamente a disponibilização de materiais de ensino em diferentes formatos (código e modelos), pretende-se com este trabalho estudar e avaliar os requisitos específicos deste tipo de disciplinas e de que forma são suportados por ferramentas existentes.

Referências:


Gestão de Projectos

Código de Ética e Deontologia Profissional em Engenharia de Software

A Engenharia de Software abarca vários tipos de profissionais que
contribuem para o desenvolvimento de software em variados cenários
desde as software houses até aos ambientes empresariais diversos ; o
código desenvolvido constitui activo empresarial e faz sentido
equacionar a adopção de um código de ética que existe em profissões mais
maduras e que pode ( e deve) balizar a actividade professional; de
igual forma a portabilidade do software, em particular do software
desenvolvido à medida, levanta a necessidade de ser enquadrada a
deontologia professional a que deve ser submetido o criador de código. O
objectivo deste trabalho é apresentar estes conceitos, a sua evolução e
o presente estado.

Referências:

Normas de software

O desenvolvimento de software é um processo complexo que pode ser
apoiado por um conjunto de boas práticas consubstanciadas em normas ;
assuntos como documentação de testes de software, novas versões de
software, documentação a disponibilizar ao utilizador, métricas de
produtividade do software exemplificam áreas onde tem sido feito
esforço à escala internacional para a criação de normas genericamente
adoptáveis pela engenharia de software. O objectivo do trabalho é
analisar e descrever a problemática das normas no contexto do
desenvolvimento de software.

Referências:

Project Management Body of Knowledge

O Project Management Body of Knowledge (PMBOK) é uma colecção de processos e áreas de conhecimento consensualmente aceites como boas práticas da disciplina de gestão de projectos. Como norma internacional (IEEE Std 1490-1998) fornece os conceitos fundamentais sobre gestão de projectos, independentemente do tipo de projecto, seja ele de construção, software, engenharia, etc. O objectivo deste trabalho é apresentar estes conceitos, a sua evolução e o presente estado.

Referências:

Perfis, Papéis e Competências em Engenharia de Software

As Tecnologias de Informação e Comunicações configuram um dos mais
dinâmicos sectores da economia europeia. Este sector apresenta algum
deficit de mão-de-obra o que levou um consórcio de onze empresas (
exemplos NOKIA, CISCO, MICROSOFT, SIEMENS, ?) sob a égide da Comissão
Europeia a trabalhar com um determinado número de Universidades na
Europa para o estabelecimento de linhas de orientação para cursos que
vão ao encontro das necessidades do sector. O objectivo do trabalho é
analisar e documentar esta experiência.

Referências:

Certificação de produtos de software

A certificação de produtos (e componentes) de software é uma exigência crescente dos clientes desses produtos, mas tem também importantes dificuldades associadas (note-se que não estamos a falar da certificação de processos ou empresas, como acontece com o CMMI ou ISO 9000). Por exemplo, uma agência do governo federal americano certifica várias sistemas de voto electrónico, podendo cada estado escolher qualquer dos sistemas certificados. Normalmente pretende-se certificar um produto em relação a algum tipo de requisitos, especificações ou propósito. Duas das dificuldades associadas à certificação são a ambiguidade e parcialidade nas especificações, e a impossibilidade prática de provar que um produto de software cumpre as especificações. O objectivo do trabalho é apontar as normas aplicáveis à certificação de produtos de software, dificuldades, metodologias, contexto de aplicação, aspectos legais, etc.

Referências:

©2005 Ademar Aguiar