Você está na página 1de 15

1.

Fundamentos de Sistemas Computacionais

• Objetivos: Esta unidade curricular introduz os princípios de funcionamento de


um processador moderno e a sua arquitetura geral. A análise da tecnologia de
implementação física dos computadores (circuitos lógicos e de memória),
associada à explicação das formas elementares de representação de informação
em formato digital, permitirá aos estudantes identificar e descrever princípios
fundamentais da operação dos computadores, das linguagens de programação e
do desenvolvimento de ‘software’.

• Resultados: Após completarem a unidade curricular, os estudantes serão


capazes de:
o Descrever os principais subsistemas de um computador;
o Descrever e interpretar formatos numéricos básicos;
o Efetuar operações aritméticas em binário;
o Manipular expressões de álgebra de Boole;
o Definir e usar circuitos lógicos combinatórios e sequenciais simples;
o Explicar a funcionalidade de circuitos lógicos padrão;
o Explicar o modelo conceptual de funcionamento de memórias de estado
sólido;
o Explicar os princípios básicos da codificação de instruções e modos de
endereçamento (arquitetura do conjunto de instruções);
o Escrever programas simples em linguagem “assembly” com operações
aritméticas e booleanas, testes, e saltos.
o Descrever o funcionamento de uma unidade de processamento simples;
o Avaliar o desempenho de processadores em cenários simples.

• Programa:
o M1. Introdução: Elementos de sistemas computacionais modernos e as
suas áreas de aplicação. Caraterísticas básicas de organização,
desempenho e energia.
o M2. Representação de informação: Representação binária de números
inteiros. Operações aritméticas elementares. Códigos. Vírgula flutuante.
o M3. Circuitos combinatórios: Álgebra de Boole. Portas lógicas
elementares. Diagramas lógicos. Simulador lógico. Circuitos com
funções padrão.
o M4. Circuitos sequenciais: Elementos de memória; registos e contadores.
Máquinas de estados finitas.
o M5. Computadores: Linguagens de alto e baixo nível. Modelo concetual
da execução de um programa. Subsistemas: CPU, memória, periféricos.
o M6. Conjunto de instruções: Tipos de instruções, modos de
endereçamento, codificação.
o M7. Linguagem “assembly”: conceitos básicos de programação.
o M8. Implementação de controlo de fluxo (testes, saltos condicionais).
o M9. Unidade de processamento: Organização lógica de um CPU simples
(de ciclo único).
o M10. Desempenho: Equação básica. Benchmarks. Lei de Amdahl.

• Bibliografia: David A. Patterson e John Hennessy; Computer Organization and


Design RISC-V Edition: The Hardware Software Interface, Morgan Kaufmann,
2020. ISBN: 978-0128203316 (2nd edition)
2. Fundamentos da Programação

• Objetivos: A fluência no processo de desenvolvimento de software é um pré-


requisito essencial para o trabalho de Engenheiros Informáticos. Para usar
computadores na resolução eficaz de problemas, os estudantes devem ser
competentes em ler e escrever programas usando linguagens de programação de
alto nível. O objetivo global desta Unidade é dar ao estudante a capacidade de
criar algoritmos e de usar uma linguagem de programação para implementar,
testar e depurar algoritmos para resolver problemas simples. O estudante será
capaz de entender e usar os conceitos fundamentais de programação e a
abordagem funcional da programação, especificamente a programação "livre de
efeitos", onde as chamadas de função não têm efeitos colaterais e as variáveis
são imutáveis, e de contrastar esta abordagem com a abordagem imperativa.

• Resultados: No final da unidade curricular, espera-se que o estudante consiga


lidar com problemas de programação de baixa/média complexidade, utilizando
as abordagens ou paradigmas de programação imperativa ou funcional. Mais
especificamente, o estudante deverá ser capaz de:
o Projetar, implementar, testar e depurar um programa que use as
construções fundamentais de programação, cálculos básicos, estruturas
condicionais e iterativas padrão, entrada/saída simples, persistência
(ficheiros) e exceções.
o Entender a abstração de dados e usar tipos de dados simples ou
compostos.
o Entender a abstração procedimental e usar a definição de funções,
passagem de parâmetros, recursão.
o Escrever funções úteis que aceitem e devolvam outras funções.
o Implementar algoritmos básicos que evitem atribuir a um estado mutável
ou considerar igualdade de referências.
o Entender variáveis e escopo léxico num programa.
o Definir operações em coleções, incluindo operações que tomam funções
como argumentos (map, reduce/fold e filter) e listas em compreensão.
o Usar ferramentas de programação que ajudam a escrever, testar e
documentar programas em computador de acordo com as melhores
práticas de programação.
o Resolver problemas numéricos usando programas de computador.

• Programa:
o Introdução ao Pensamento Computacional, algoritmos e programação
com Python.
o Conceitos fundamentais de programação: tipos de dados simples;
variáveis, expressões e declarações; fluxo de programa, condicionais,
iteração; funções, passagem de parâmetros, recursão; ficheiros.
o Tipos de dados compostos: strings, tuplos, conjuntos, listas, dicionários.
o Programação livre de efeitos usando variáveis imutáveis e chamadas a
função sem efeitos colaterais.
o Funções de ordem superior: map, reduce/fold e filter.
o Compreensões em listas.
o Estratégias de resolução de problemas.
o Ferramentas de programação, teste e depuração.

• Bibliografia:
o Brad Miller; How to think like a computer scientist (Disponível
livremente em PDF e em HTML)
o Steven F. Lott; Building skills in Python
o Allen B. Downey; Think Python. ISBN: 978-1-449-33072-9
o David Mertz; Functional programming in Python. ISBN: 978-1-491-
92856-1
3. Laboratório de Desenho e Teste de Software

• Objetivos: Pretende-se, nesta unidade curricular, que os alunos desenvolvam


competências no desenho de aplicações usando o paradigma orientado a objetos.
Pretende-se que os estudantes que obtenham aprovação à unidade curricular,
consigam:
o Usar o Git como ferramenta de controlo de versões;
o Usar a linguagem Java como linguagem orientada a objetos;
o Desenhar testes unitários usando JUnit;
o Aplicar os princípios SOLID no desenho de aplicações e entender a sua
importância;
o Aplicar design patterns para resolver problemas no desenho de
aplicações;
o Identificar code smells em código orientado a objetos;
o Usar técnicas de refactoring para melhorar atributos não-funcionais e
resolver code smells;
o Aplicar o padrão arquitetural MVC no desenho de aplicações event-
driven;
o Patterns of Enterprise Applications

• Resultados:
o Saber desenvolver (desenhar, codificar, documentar, analisar, testar e
manter) programas orientados por objetos com Java e UML;
o Saber utilizar ferramentas de suporte às várias fases do desenvolvimento
e manutenção de programas;
o Ser capaz de conceber e desenhar software modular, flexível e fácil de
manter e evoluir;
o Ser capaz de reutilizar padrões e frameworks;
o Compreender a importância dos testes durante o desenvolvimento de
software.

• Programa:
o Uma breve introdução ao Git: repositórios locais, remotes, branches e
workflows;
o Gestão de dependências usando Gradle;
o A linguagem Java: Tipos, literais e variáveis; Estruturas de
controlo;Classes e objetos; Coleções; Tipos genéricos; Threads e
sincronização; Input e output; Interfaces gráficas usando Swing;
o Princípios da programação orientada a objetos: abstração de dados,
polimorfismo, herança e encapsulamento; utilização da composição em
vez de herança como mecanismo para atingir polimorfismo;
o Princípios SOLID: Single Responsibility, Open/Closed, Liskov
Substitution, Interface Segregation e Dependency Inversion;
o Testes unitários usando JUnit: Mocks e Stubs usando Mockito; Cobertura
e mutation-testing;
o Diagramas UML: diagramas de classes, sequência e comunicação;
o Code smells e técnicas de refactoring;
o Padrões de desenho: Factory-Method, Command, Composite, Observer,
Strategy, Abstract Factory, State, Adapter, Decorator e Singleton;
o Model-View-Controller como padrão de arquitetura;
o Patterns of Enterprise Architecture.

• Bibliografia:
o Bruce Eckel; Thinking in Java. ISBN: 0-13-027363-5 (4ª edição ou
superior)
o Russ Miles and Kim Hamilton; Learning UML 2.0. ISBN: 978-0-596-
00982-3
o Kent Beck; Test-driven development. ISBN: 978-0-32-114653-3
o Erich Gamma... [et al.]; Design patterns. ISBN: 0-201-63361-2
o Martin Fowler ; with contributions by kent Beck... [et al.]; Refactoring.
ISBN: 0-201-48567-2
o Robert C. Martin; Agile Software Development: Principles, Patterns and
Practices, Prentice-Hall, 2003. ISBN: 0-13-597444-5
o Joost Visser; Building Maintainable Software, O'Reilly, 2015. ISBN:
978-1-491-94434-9
4. Interação Pessoa Computador

• Objetivos: Os principais objetivos a atingir pelos estudantes são contactar com


praticar e experimentar, no contexto de software e sistemas interativos, os
seguintes tópicos:
o Fundações de Interação Humano Computador (HCI): Principais
conceitos de HCI e sua importância, incluindo a perceção humana e
processos de cognição, sistemas informáticos e seus mecanismos de
interação, assim como história resumida de HCI.
o Interação com o Utilizador (UI) e Design para a Experiência (UX):
metodologias de design de interação, nomeadamente Design Centrado no
Utilizador (UCD) e testes.
o Estudos de utilizadores: Como avaliar e validar projetos de UI e UX e
sua usabilidade.
o Interação multimodal: Como aplicar os temas apresentados para a
criação de interfaces multimodais utilizando novas tecnologias
interativas.

• Resultados: Os estudantes, no final da unidade curricular, devem ser capazes de


atingir os seguintes resultados de aprendizagem (RA):
o Analisar criticamente os sistemas/dispositivos existentes e a qualidade
das interações e experiências proporcionadas aos utilizadores.
o Aplicar UCD e outras metodologias para estudar desafios na área da
interação e propor, avaliar e aperfeiçoar soluções para os mesmos.
o Utilizar ferramentas apropriadas para criar e testar protótipos de UI/UX
em vários níveis de fidelidade/complexidade.
o Definir e realizar estudos com utilizadores, no contexto de UI/UX, e
avaliações de usabilidade.

• Programa:
o Fundamentos de IHC
▪ Importância da IHC
▪ Conceitos-base
• Perceção humana e processos cognitivos
• Sistemas computacionais e seus mecanismos de interação,
• Metodologias e padrões de UI/UX design
o Design Centrado no Utilizador
▪ Identificação de necessidades e definição de requisitos
▪ Ideação e desenho
▪ Prototipagem e Avaliação
▪ Iteração e refinamentos
o UI/UX aplicado
▪ Ferramentas para UI/UX Design
▪ Interação Multimodal
▪ Acessibilidade

• Bibliografia:
o Manuel J. Fonseca, Pedro Campos, Daniel Conçalves; ntrodução ao
Design de Interfaces, 2012. ISBN: 9789727227389
o Yvonne Rogers, Helen Sharp, Jennifer Preece; Interaction design. ISBN:
978-0-470-66576-3
o Alan Dix; Human-computer interaction. ISBN: 978-0-13-046109-4
o Alan Cooper, Robert Reimann, David Cronin; About Face 3: The
Essentials of Interaction Design, John Wiley & Sons, 2007. ISBN: 978-
0470084113
o Donald A. Norman; The design of everyday things. ISBN: 0-262-64037-
6
o Donald A. Norman; The Invisible computer. ISBN: 0-262-64041-4
o Jakob Nielsen; Designing web usability. ISBN: 1-56205-810-X
o Jeff Johnson; Designing With the mind in mind, Morgan Kaufmann,
2010. ISBN: 978-0123750303
o Giles Colborne; simple and usable, New Riders, 2010. ISBN: 978-
0321703545
o David Benyon; Designing interactive systems, Pearson, 2014. ISBN:
9781447920113
5. Laboratório de Bases de Dados e Aplicações Web

• Objetivos: A unidade curricular de LBAW tem como objetivo sedimentar as


matérias expostas nas unidades curriculares de bases de dados e linguagens e
tecnologias web. Esta unidade curricular oferece uma perspetiva prática sobre
duas áreas centrais da engenharia informática. Nesta unidade curricular
pretende-se dotar os estudantes da capacidade de projetar e desenvolver sistemas
de informação acessíveis através da web e suportados por sistemas de gestão de
bases de dados.

• Resultados: Ao completar esta unidade curricular, o estudante deve ser capaz de


projetar e implementar um sistema de informação baseado na web e suportado
por um sistema de gestão de base de dados. Em particular, o estudante deve ser
capaz de:
o Especificar os requisitos;
o Desenhar a arquitetura de informação, as interfaces com o utilizador, e os
fluxos de navegação;
o Desenhar o modelo conceptual de dados;
o Obter e validar o esquema lógico relacional da base de dados;
o Obter o esquema físico da base de dados e afinar o esquema lógico
relacional;
o Desenhar e implementar interrogações para acesso à base de dados em
SQL;
o Desenhar e implementar mecanismos para a manutenção da integridade
dos dados;
o Desenhar e especificar os recursos web para suportar a interação com o
utilizador e a lógica de negócio;
o Implementar os componentes web do sistema com recurso a tecnologias
web, baseadas no servidor e no cliente;
o Assegurar que as interfaces com o utilizador estão de acordo com as
normas e boas práticas de acessibilidade e usabilidade web.

• Programa:
o Softwares: Laravel, Git, PostgreSQL, Docker, PHP
o Desenvolvimento de uma aplicação web suportada por uma base de
dados: levantamento de requisitos, conceção, modelação, implementação
e documentação;
o Aprofundamento de conceitos e do desenvolvimento da arquitetura de
aplicações web. Utilização de linguagens de programação e frameworks
web, baseadas no cliente e no servidor;
o Projeto de bases de dados relacionais com recurso a linguagens de
modelação de dados (UML), à linguagem SQL, à utilização de índices de
desempenho e de pesquisa, e de extensões procedimentais à linguagem
SQL;
o Identificação e manutenção de regras de negócio: na interface; na lógica
de negócio e na base de dados (triggers); transações;
o Desenho de interação com o utilizador: arquitetura de informação,
usabilidade e acessibilidade web.

• Bibliografia:
o Ramakrishnan, Raghu; Database management systems. ISBN: 0-07-
116898-2
o Jeffrey D. Ullman, Jennifer Widom; A First course in database systems.
ISBN: 978-0-13-600-637-4
o Russ Miles and Kim Hamilton; Learning UML 2.0. ISBN: 978-0-596-
00982-3
o Michal Zalewski; The tangled Web. ISBN: 978-1-59327-388-0
o Nielsen, Jakob; Designing web usability. ISBN: 1-56205-810-X
6. Redes de Computadores

• Objetivos: Redes de Computadores (RCOM) é a unidade curricular que


introduz os estudantes no domínio de conhecimento das redes de comunicações.
Os conceitos fundamentais endereçados em RCOM incluem os seguintes: canais
de comunicação e controlo da ligação de dados, modelos de erro e atraso,
comunicações multi-acesso, encaminhamento, controlo de fluxo e controlo de
congestionamento. As principais tecnologias discutidas em RCOM são a
Ethernet comutada, a Wireless LAN 802.11, a Internet e a pilha de
comunicações TCP/IP. As implementações e projetos a desenvolver em RCOM
incluem um protocolo de ligação de dados com controlo de fluxo, uma aplicação
a funcionar em modo cliente, e a configuração e teste de redes Ethernet e IP.

• Resultados: Depois de ter frequentado RCOM o estudante deverá ser capaz de:
a) perceber e explicar os conceitos fundamentais das redes de comunicações; b)
escolher, comparar ou empregar as tecnologias de redes de comunicações atuais;
c) implementar, configurar e testar mecanismos e componentes essenciais de
uma rede de comunicações.

• Programa: Introdução às redes de computadores. Técnicas de transmissão de


dados. Controlo da ligação de dados. Modelos para análise de desempenho.
Controlo do acesso ao meio. LANs. A Internet. Encaminhamento. Controlo de
congestionamento. Aplicações.

• Bibliografia:

o Andrew S. Tanenbaum, David J. Wetherall; Computer Networks, 5/E,


Prentice Hall, 2011. ISBN: ISBN-10: 0132126958
o Dimitri Bertsekas, Robert Gallager; Data Networks, 2nd Edition,
Prentice-Hall International, 1992. ISBN: 0-13-200916-1
o Peterson, Larry L.; Computer Networks. ISBN: 978-0-12-374013-7
o Stevens, W. Richard; TCP/IP illustrated. ISBN: 0-201-63346-9
o Stallings, William; Data and Computer Communications. ISBN: 0-13-
243310-9
o James F. Kurose, Keith W. Ross; Computer Networking - a Top-Down
Approach, 5th Edition, Pearson, 2010. ISBN: 0-13-607967-9
7. Fundamentos de Segurança Informática

• Objetivos: Esta Unidade Curricular tem como objetivo fornecer aos estudantes
uma perspectiva integrada dos fundamentos da segurança informática; visa dotar
os estudantes de uma visão abrangente dos aspetos de segurança inerentes ao
desenvolvimento e operação de sistemas informáticos, contextualizando
problemas e soluções tecnológicas específicas para tecnologias abordadas em
outras Unidades Curriculares do Ciclo de Estudos.

• Resultados:
o Conhecer os princípios da construção de programas e sistemas
informáticos seguros.
o Aprender a pensar sobre sistemas informáticos como um atacante.
o Compreender como se identificam ameaças a um sistema informático e
como se avalia a sua relevância.
o Reconhecer limitações e justificar medidas de proteção de um sistema
informático.
o Explicar como diversos tipos de ataques funcionam na prática.

• Programa:
o 1) Princípios da segurança informática: confidencialidade, integridade,
disponibilidade; risco, ameaças, vulnerabilidades, vetores de ataque e
mecanismos de segurança.
o 2) Princípios da construção de sistemas seguros: princípios do privilégio
mínimo e isolamento; defesa em profundidade; segurança por
construção.
o 3) Conceitos básicos de criptografia: criptografia simétrica e de chave
pública; cifras e autenticação; assinaturas digitais; gestão de chaves; PKI.
o 4) Controlo de acessos: conceitos fundamentais; modelos para controlo
de fluxos de dados; mecanismos de segurança ao nível do sistema
operativo.
o 5) Introdução à programação defensiva: validação de inputs; ataques
comuns; buffer overflows; race conditions; atualizações de segurança.
o 6) Tópicos de segurança de redes: ataques e proteção ao nível da rede;
ataques por Denial of Service (DoS) e Distributed Denial of Service
(DDoS).
o 7) Segurança Web: modelo de segurança; gestão de sessões;
autenticação; vulnerabilidades comuns.

• Bibliografia:
o Goodrich, M., & Tamassia, R.; Introduction to Computer Security,
Pearson, 2011. ISBN: 978-0321512949
o Matt Bishop; Computer Security: Art and Science, 2nd Edition, Addison-
Wesley Professional, 2018. ISBN: 978-0321712332
8. Programação Funcional e em Lógica

• Objetivos:
o Os paradigmas de Programação Funcional e de Programação em Lógica
apresentam abordagens declarativas e baseadas em processos formais de
raciocínio à programação, mais apropriada para a resolução de alguns
tipos de problemas.
o Objetivos: Adquirir familiaridade com os paradigmas da Programação
Funcional e da Programação em Lógica. Desenvolver as capacidades de
raciocínio abstrato e de representação de problemas de forma declarativa.

• Resultados: No final da UC, os estudantes deverão ser capazes de:


o Usar tipos pré-definidos e algébricos de Haskell para representar valores
de um domínio específico
o Definir transformações genéricas sobre estruturas de dados indutivas
(por exemplo: árvores) como funções polimórficas em Haskell
o Decompor problemas de programação em funções puras em Haskell
operando sobre tipos de dados estruturados
o Provar correção de programas em Haskell usando definições com
equações e indução
o Representar factos e relações como programas em Prolog
o Compreender o modelo de execução de programas em Prolog
o Modelar problemas de pesquisa como programas lógicos e queries em
Prolog

• Programa:
o Programação em Lógica (6-7 semanas)
▪ Lógica proposicional e de predicados. Cláusulas de Horn. Factos
e regras. Termos de Herbrand. Unificação.
▪ Linguagem Prolog. Modelo de execução. Resolução SLD.
Negação por falha.
▪ Bases de factos e relações. Programação com recursão e
estruturas.
▪ Aritmética. Predicados extra-lógicos e de controlo.
▪ Exemplos de programação: procura, jogos, manipulação
simbólica.
o Programação Funcional (6 semanas)
▪ Expressões, avaliação e valores. Tipos pré-definidos. Definições
usando equações.
▪ Polimorfismo paramétrico e “bounded”. Classes de tipos
fundamentais.
▪ Expressões lambda. Aplicação parcial e “currying”. Funções de
ordem superior do prelúdio-padrão.
▪ Definição de tipos algébricos; encaixe de padrões e definições
recursivas.
▪ Exemplos de programação: árvores equilibradas; árvores
sintáticas;layout de texto; visualização e jogos.
▪ Programação com I/O.
▪ Provas de correção de programas usando definições por equações
e indução.

• Bibliografia:
o Simon Thompson; Haskell the craft of functional programming. ISBN:
0- 201-34275-8
o Graham Hutton; Programming in Haskell, Cambridge University Press,
2016. ISBN: 978-1316626221
o Leon Sterling; The Art of Prolog. ISBN: 0-262-69163-9
o Bryan O'Sullivan, Don Stewart, and John Goerzen; Real World Haskell,
O'Reilly Media, 2008. ISBN: 9780596514983
o Richard Bird; Introduction to Functional Programming using Haskell,
Pearson, 1998. ISBN: 978-0-13-484346-9
o Ivan Bratko; Prolog programming for artificial intelligence. ISBN: 0-
201-40375-7

Você também pode gostar