-
Algoritmia e Estruturas de Dados
Apresentação
Esta UC surge no 2º semestre do 1º ano, na continuação do trabalho iniciado em Fundamentos de Programação (FP). Em FP, os alunos deram os primeiros passos na programação e preocuparam-se principalmente em produzir programas correctos. Agora, em Algoritmia e Estruturas de Dados, irão continuar a produzir programas correctos mas com preocupações de desempenho, a nível de tempo de execução e consumo de memória.
Esta é uma UC fundamental no currículo de um Engenheiro Informático, que na sua vida profissional encontrará inúmeras situações em que terá que resolver problemas causados por fraco desempenho das aplicações e que exigem um conhecimento sólido dos princípios subjacentes aos principais algoritmos e estruturas de dados.
Não obstante a aprendizagem de conceitos e técnicas de algoritmia e estruturas de dados, os alunos trabalham outras competências fundamentais. Nomeadamente, o espírito crítico e a capacidade de avaliar várias alternativas para resolver os problemas.
Docentes: Pedro Alves, Bruno Cipriano, Duarte Neves, Rodrigo Correia, Wellington Oliveira.
Projetos
-
Rock in DEISI
Desenvolver uma aplicação de linhas de comando em Java que permite realizar queries relativamente sofisticadas sobre uma base de dados real contendo informações sobre músicas e artistas dos últimos 100 anos, obtidas de repositórios públicos.
A base de dados é representada em ficheiros CSV e os alunos devem implementar estruturas de dados em memória para responder às queries eficientemente.
Programa
- funções recursivas, algoritmos recursivos
- tipos de dados complexos
- eficiência e optimização (algorítmica e não-algorítmica)
- complexidade de algoritmos
- algoritmos de pesquisa
- algoritmos de ordenação – bubble sort, selection sort, merge sort, quick sort
- tipos de dados abstractos – pilhas e filas
- listas ligadas
- árvores binárias, árvores ordenadas, árvores AVL
- hashtables
Objetivos
O objectivo desta unidade curricular é introduzir os conceitos fundamentais de algoritmos e das estruturas de dados básicas, numa perspetiva de resolver problemas complexos de uma forma eficiente. O aluno deverá ser capaz de analisar e avaliar a eficiência de um algoritmo sem necessidade de o implementar ou testar. Deverá ser igualmente capaz de aplicar a estrutura de dados mais eficaz e eficiente para resolver um determinado problema.
Concretamente, o aluno deverá conseguir criar programas em Java cuja eficiência seja um critério significativo de sucesso (ex: pesquisa, ordenação).
|
-
Engenharia de Software
Apresentação
A Engenharia de Software ensina o desenho, escrita de código e testes, e manutenção de programas que têm um propósito de resolver problemas complexos com soluções eficientes e seguras. Todas as unidades curriculares anteriores tem um maior foco na sintaxe e técnicas de programação enquanto nesta unidade curricular os alunos aprendem as técnicas de de desenhar e desenvolver software de uma forma eficiente, legível, modular e escalável.
Esta unidade curricular é essencial para desenvolver as capacidades de desenho e programação que os alunos vão enfrentar no mercado de trabalho.
Docentes: José Cascais Brás, Pedro Perdigão, Rui Santos.
Programa
- CP1. Introdução à Engenharia de Software;
- CP2. Modelos e processos desenvolvimento de software;
- Modelos Clássicos: Cascata (contexto histórico)
- Modelos Ágeis: Agile (framework de Scrum)
- CP3. Modelação de sistemas;
- Análise de requisitos
- Diagrama de domínio
- Diagrama de conceitos
- Casos de uso
- CP4. Desenho da arquitectura;
- Análise
- Desenho
- Avaliação
- Evolução
- CP5. Desenho e implementação;
- Padrões UML
- Princípios de desenvolvimento orientado a objectos: S.O.L.I.D, KISS, entre outros.
- CP6. Verificação e validação;
- Conhecer os diferentes tipos de testes
- Aplicação de testes unitários
- CP7. Segurança e Confiabilidade
- CP8. Integração Contínua
- Vantagens
- Ferramentas e tecnologias
Objetivos
OA1. Compreender os métodos, técnicas e ferramentas para o completo desenvolvimento de um sistema de software, desde a sua conceção até à sua entrega e manutenção.
OA2. Saber planear, gerir, avaliar e garantir a qualidade do desenvolvimento de projetos de software utilizando os princípios da Engenharia de Software.
|
-
Fundamentos de Programação
Apresentação
Esta é uma disciplina fundamental na formação de qualquer profissional da área de Informática pois introduz os conceitos básicos da programação, sobre os quais assentarão muitas disciplinas subsequentes como Linguagens de Programação I e II, Algoritmia e Estruturas de Dados, Programação Web, Computação Móvel, etc. Mais do que aprender uma linguagem de programação, o aluno aprende a pensar como um programador, analisando problemas e desenhando algoritmos que os resolvam recorrendo a fluxogramas e a programas escritos em Kotlin, uma linguagem promissora que combina as melhores características das linguagens modernas mais populares (Java, Python, etc.)
Dado ser o primeiro contacto de muitos alunos com o tópico da Programação, reveste-se de uma importância especial na aquisição de conhecimentos primordiais mas também na sua motivação. Mais do que aprender a programar, os alunos aprendem a gostar de programar.
Docentes: Pedro Alves, Brena Lima, Bruno Saraiva, Lucio Studer, Rodrigo Correia, Wellington Oliveira.
Projetos
-
Jogo das Tendas
Desenvolver uma grelha 2D que simule o terreno do jogo, com árvores distribuídas aleatoriamente. Permitir que o jogador coloque tendas junto às árvores, assegurando que cada tenda esteja ligada apenas a uma árvore.
Implementar regras para assegurar que as tendas não se toquem, nem mesmo na diagonal, e criar uma interface de linha de comando para a interação do jogador com o jogo.
-
Batalha Naval
Desenvolver uma grelha 2D que simule a arena do jogo, com navios e marcadores de jogadas anteriores.
Criar uma interface de linha de comando para a interação do jogador com o jogo.
Programa
- Introdução à programação
- Algoritmos, fluxogramas, pseudo-código
- Sintaxe e semântica das linguagens
- Elementos da sintaxe, estrutura de um programa
- Declarações e atribuições
- Tipos primitivos
- Expressões aritméticas, expressões lógicas
- Entradas e saídas de dados
- Selecção
- Repetição
- Funções
- Arrays uni-dimensionais e bi-dimensionais
- Tratamento de erros
- Leitura e escrita de ficheiros
- Boas práticas de programação imperativa
Objetivos
O objectivo desta unidade curricular é fornecer aos futuros profissionais na área da informática as bases para que possam iniciar (de um modo disciplinado) a actividade de programação.
O aluno começa por desenvolver a capacidade de raciocínio algorítmico recorrendo a fluxogramas.
O aluno deverá ser capaz de traduzir esses fluxogramas numa linguagem de programação imperativa. Concretamente, o aluno deverá conhecer a sintaxe básica de Kotlin que lhe permitam criar programas simples de linha de comando.
Finalmente, o aluno deve conseguir analisar e avaliar programas feitos por outras pessoas (colegas, professores, etc.).
|
-
Linguagens de Programação I
Apresentação
Docentes: Pedro Alves, Bruno Cipriano, Duarte Neves.
Projetos
-
DEISI Chess
Criação um jogo de Xadrez!
Na primeira parte deste projeto os alunos são desafiados a criar a lógica por trás deste jogo, sendo que vão começar apenas a jogar com Reis.
Na segunda parte vão ser incorporadas as outras peças de maneira a completar este jogo.
-
DEISI Jungle
Desenvolver em Java uma aplicação gráfica (desktop) para um jogo de tabuleiro com animais, que envolve estratégia e movimentação baseada em características animais e alimentares
O jogo suporta até 4 jogadores, cada um iniciando com um animal diferente, e inclui elementos como alimentação e energia, influenciando a dinâmica do jogo.
Programa
Objetivos
|
-
Linguagens de Programação II
Apresentação
Esta UC é o culminar de um caminho iniciado em Fundamentos de Programação e aprofundado em Algoritmia e Estruturas de Dados, solidificando os conhecimentos de programação. Com um foco no desenvolvimento e manutenção de programas de elevada complexidade, o paradigma imperativo deixa de ser suficiente e são abordados os paradigmas orientado a objectos e funcional. São igualmente abordados conceitos adjacentes à fase de implementação, como o controlo de versões, os testes unitários e funcionais, a cobertura de código e outras métricas de qualidade. Esta é uma UC fundamental na formação de qualquer profissional da área de Informática, pois fornece um conjunto de conhecimentos e ferramentas que serão essenciais nos projectos empresariais em que estes alunos virão a estar inseridos.
Docentes: Pedro Alves, Bruno Cipriano, Duarte Neves.
Projetos
-
DEISI Chess
Criação um jogo de Xadrez!
Na primeira parte deste projeto os alunos são desafiados a criar a lógica por trás deste jogo, sendo que vão começar apenas a jogar com Reis.
Na segunda parte vão ser incorporadas as outras peças de maneira a completar este jogo.
-
DEISI Jungle
Desenvolver em Java uma aplicação gráfica (desktop) para um jogo de tabuleiro com animais, que envolve estratégia e movimentação baseada em características animais e alimentares
O jogo suporta até 4 jogadores, cada um iniciando com um animal diferente, e inclui elementos como alimentação e energia, influenciando a dinâmica do jogo.
Programa
- Paradigmas de programação
- Imperativo, funcional, orientado a objetos
- Conceitos de programação por objectos
- Entidades, Atributos, Acções
- Classe vs Objecto, Principio do encapsulamento
- Herança, polimorfismo, parametrização por herança, composição
- UML
- Java orientado a objectos
- Classes, objectos, variáveis
- Construtores, métodos
- Visibilidade, Exceptions
- Estruturas de dados: Arrays, Lists, Maps
- Herança, classes abstractas
- Input/Output
- Testes unitários
- Controlo de versões
- Padrões de desenho
- Factory, Singleton, Observer/Observable, Composite
- Conceitos de programação funcional em Kotlin
- Funções puras, lambdas, funções de primeira ordem, iteração interna, operações com listas
- Boas práticas de programação multi-paradigma
Objetivos
Esta UC tem como objetivo apresentar uma visão multi-paradigma da programação. São analisados e comparados os 3 paradigmas mais populares: imperativo, orientado a objectos e funcional. Os alunos revêm conceitos da programação imperativa e adquirem conceitos fundamentais da programação orientada a objetos (herança, encapsulamento, polimorfismo, etc.) e da programação funcional (lambdas, funções de 1a ordem, etc.) de forma a que consigam aplicá-los em projetos de desenvolvimento de software complexo usando linguagens de programação modernas multi-paradigma (Java, C#, Python, Kotlin, JavaScript).
Ao longo do semestre, os alunos são consciencializados para a necessidade de redução de custos de manutenção através de melhorias na qualidade do software produzido e aplicação de boas práticas tirando partido das vantagens específicas de cada paradigma. São igualmente expostos a ferramentas essenciais no desenvolvimento moderno de software, como controlo de versões e testes unitários.
Todos estes conceitos são aplicados num projeto de elevada complexidade, multi-paradigma e multi-linguagem que atinge em média as 2500 LOC. O projeto tem que ser desenvolvido em Git e ter uma cobertura elevada de testes unitários. Mais do que as capacidades técnicas, os alunos trabalham a gestão de tempo, o rigor e a resiliência, a capacidade analítica e espírito crítico, a criatividade e o trabalho em equipa.
|
-
Programação Web
Apresentação
Esta Unidade Curricular pretende dar formação na área da programação Web em geral, e em particular no desenvolvimento de aplicações Web back-end e front-end, providenciando uma visão global do desenvolvimento moderno para a Web. No front-end, são introduzidos conceitos de estruturação, estilização e interação de conteúdos através das linguagens HTML, CSS e JavaScript, in. No back-end, é ensinado o desenvolvimento de aplicações empresariais seguindo o padrão de desenho model-view-control, recorrendo à linguagem Python e a Web framework django. Pretende-se estimular a criatividade e imaginação no desenvolvimento de aplicações inovadoras que sejam eficientes, escaláveis e fáceis de modificar por um lado, e que ofereçam uma boa experiência para o utilizador. Esta é uma UC fundamental para qualquer profissional da área da informática, pois fornece um conjunto de conhecimentos e ferramentas que serão essenciais em projetos empresariais em que virão a estar inseridos.
Docentes: Lucio Studer, Pedro Perdigão, Rui Santos.
Programa
A Web e seus paradigmas
– Funcionamento da Internet e da Web: arquitetura e protocolos IP e HTTP
– Tecnologias, paradigmas e padrões de desenho da Web
Python para desenvolvimento Web
– Sintaxe, operadores, controlo de fluxos e tipos de dados
– Funções e módulos
– Gestão de ficheiros e pastas
– Classes
Django web framework para Back-end
– Web frameworks
– Arquitetura MVT
– Urls, views e templates
– Linguagem template
– Modelação de base de dados, ORM
– Formulários
– Autenticação
– Implantação na cloud
HTML e CSS para desenho de páginas Web
– HTML e seus elementos
– Formulários para envio de dados
– HTML5 e elementos semânticos
– CSS e seus seletores, para estilização de conteúdos
– Propriedades CSS
– Design responsivo e layouts dinâmicos
– Efeitos e animações CSS
– Bootstrap
JavaScript para programação Front-end
– Programação Orientada a Eventos
– Manipulação do DOM
– JSON e APIs
– Single Page Applications
Objetivos
- Entender o funcionamento da Internet e da Web.
- Compreender os princípios da programação Web e seus principais padrões de desenho.
- Aplicar estes conceitos, usando várias tecnologias (HTML, CSS, JavaScript, Python and Django¿).
- Arquitetar aplicações eficientes, de fácil manutenção, que corram na Web.
- Avaliar as diferentes estratégias de desenho, sabendo escolher a abordagem que mais se adequa ao contexto.
- Ser capaz de construir e implantar na cloud aplicações Web complexas e criativas, totalmente funcionais (full stack).
|
|
-
Sistemas de Informação na Nuvem
Apresentação
Esta Unidade Curricular tem como objetivo uma introdução à computação em nuvem, numa perspectiva de um iniciante que não possui nenhuma experiência anterior com o tópico.
A ideia é ajudar a criar Junior Cloud Architects, o que significa crias as competências para implementar ou adotar a tecnologia Cloud, entender o que é exatamente e quais opções existem quando se pensa em implantações em nuvem.
Esta UC abrange uma ampla variedade de áreas de tópicos de computação em nuvem, fornecendo uma base sólida de entendimento. Esta unidade curricular cria também um ambiente de entendimento da teoria e das formas práticas dos diferentes modelos de serviços de Cloud Computing: Infraestrutura como Serviço (IaaS), Plataforma como Serviço (PaaS) e Software como Serviço (SaaS), fornecendo exemplos e diferenças entre cada .
Docentes: Rui Ribeiro, Luis A. Gomes, Rui Santos.
Programa
Aulas teóricas:
- Visão geral: história, mercado, tendências
- Revisão de arquiteturas distribuídas: SOA, orientado a eventos Componentes e Serviços
- O que é uma nuvem? Privado, público, híbrido
- Tecnologias, modelos de negócios, principais fornecedores de serviços nacionais e internacionais
- IaaS
- BaaS
- PaaS
- SaaS
- outras
Agenda Prática:
- 1º Trabalho – IaaS e PaaS
- AWS EC2 – Implante e execute o servidor ubuntu
- Docker PaaS – AWS Beanstalk
- Heroku – implantação de 2 aplicativos, cada um por serviço
- 2º Trabalho – SaaS e BaaS
- Trello Board
- AWS BaaS
- Firebase (armazenar dados e média)
Cada trabalho tem um planeamento prático de 6 aulas
Objetivos
- Entenda por que as empresas estão migrando para serviços em nuvem para apoiar seus negócios
- Quais são os modelos de negócios
- Quais são os principais provedores de serviços
- Principais conceitos da arquitetura em nuvem
- Recursos práticos para criar e implantar um serviço em nuvem
|
-
Sistemas Móveis Empresariais
Apresentação
Esta unidade curricular enquadra o impacto de negócio da mobilidade empresarial, bem como garantir os fundamentos de conhecimento de desenvolvimento de aplicações móveis.
Esta UC tem assim uma importância extrema para o ciclo de estudos, tendo em conta que alia o papel técnico, com o de gestão tecnológica, perfeitamente enquadrado nos objetivos do ciclo de estudos.
Docentes: Rui Ribeiro, Rui Santos.
Programa
Esta unidade curricular pretende capacitar os alunos para alcançar know-how e competências de:
¿ Compreender por que as empresas precisam de um ambiente móvel
¿ Componentes de arquitetura existem para computação móvel
¿ Noções básicas sobre negócios móveis
¿ Conhecimento das várias áreas móveis: de aplicativos para redes
¿ O que um usuário pode obter em um aplicativo para dispositivos móveis?
As classes de laboratório têm a seguinte estrutura:
A) Aplicativos móveis híbridos na Web
¿ Conceitos e Ambiente de Desenvolvimento
¿ conclusão do código do projeto
¿ Novo desenvolvimento de aplicativos
B) Aplicativos móveis nativos
¿ Conceitos e Ambiente de Desenvolvimento
¿ conclusão do código do projeto
¿ Novo desenvolvimento de aplicativos
Objetivos
Esta unidade curricular procura dotar os alunos com competências e conhecimentos de:
¿ Perceção da razão pelas quais as empresas necessitam de ambientes móveis
¿ Quais as arquitecturas disponíveis no Mercado
¿ Compreensão de Negócio Mobile
¿ Conhecimento das diferentes camadas móveis: das aplicações às redes
¿ O que os utilizadores podem obter das aplicações móveis
Na componente prática procura-se garantir que o aluno tem as bases essenciais para desenvolver aplicações móveis.
|