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:
|