Você está na página 1de 6

Técnicas de Programação 2

Plano de Ensino (2022.1)

Rodrigo Bonifácio
6 de junho de 2022

1 Objetivos da disciplina
O objetivo desta disciplina é explorar técnicas de programação que objetivam
(a) garantir o desenho modular de um software e (b) melhorar a corretude do
sistema via suite de testes automatizados e o uso de contratos de software. A
ementa da disciplina abrange:

• Design modular de software.


• Métodos de programação e documentação.
• Testes sistemáticos.
• Restrições de Software (Pré-Condições, Pós-Condições e Invariantes).

2 Metodologia
A disciplina será conduzida utilizando uma abordagem que combina Aprendiza-
gem Baseada em Problemas (70%) com as estratégias inspiradas no conceito de
Sala de Aula Invertida [Tawfik and Lilly, 2015] (30%). Os objetivos de apren-
dizagem da disciplina serão alcançados a partir de cenários de evolução de um
compilador para a linguagem Oberon [N.Wirth, 1990, van den Brand, 2015,
Basten et al., 2015], cuja implementação iniciou no semestre 2020/1. Os alunos
serão organizados em grupos de cinco alunos (totalizando aproximadamente 10
grupos).
A arquitetura do compilador Oberon é organizado em termos de cinco módulos
principais:

(M1) Parser: Módulo que transforma um código fonte Oberon em uma parse
tree.
(M2) Type Checking: Módulo que verifica se todas as construções da linguagem
estão sendo usadas de forma correta em relação às definições de tipos.

1
(M3) Interpreter: Módulo que avalia um programa Oberon sem a necessidade
de compilação para uma linguagem de mais baixo nı́vel.
(M4) Control Flow Graph: Módulo que gera um grafo de fluxo de controle
para programas Oberon. Tais grafos são comumente usados para analisar
programas, como verificar se todo caminho em uma função leva a um
return.
(M5) Code Generation: Módulo que gera um programa na linguagem C a partir
de um programa Oberon. Esse programa em C pode então ser compilado
e executado diretamente pelo SO.

Os cenários de evolução do compilador Oberon serão organizados em sprints


de desenvolvimento de aproximadamentre três a quatro semanas. No inı́cio
de cada sprint, será disponibilizada no repositório do projeto a atribuição das
tarefas que ficarão sob responsabilidade de cada grupo.
Na primeira semana de cada sprint, cada grupo deve realizar uma análise
de impacto para identificar quais módulos serão afetados durante a realização
da tarefa. Na segunda semana de cada sprint, os alunos devem discutir com o
professor um possı́vel desenho da solução que irá desenvolver; enquanto que, na
terceira semana de cada sprint, espera-se que cada grupo implemente a tarefa
especı́fica (levando em consideração aspectos de qualidade como modularidade
e cobertura de testes).
Teremos encontros semanais com cada grupo, com 20 a 30 minutos de
duração. A princı́pio, esses encontros serão realizados nos horários das aulas,
mas podem ser agendados horários alternativos em comum acordo entre alu-
nos e professor. Nesses encontros, os alunos podem apresentar soluções e tirar
dúvidas com o professor. Adicionalmente, o professor pode apresentar sugestões
sobre como resolver cada tarefa.
Além dos encontros semanais, algumas aulas expositivas serão conduzidas,
em particular nas primeiras semanas do curso, com o intuito de apresentar a
arquitetura atual do compilador Oberon. Complementaremos a comunicação
utilizando recursos como Microsoft Teams, revisão de código via o mecanismo
de pull-requests do GitHub e quadros Kanban (também integrados ao GitHub).
O projeto de evolução do compilador Oberon vai exercitar os principais con-
ceitos previstos na disciplina, incluindo noções de decomposição de um sistema
em módulos bem como a importância da escrita de testes automatizados. Tal
projeto também vai permitir que os alunos se familiarizem com a linguagem de
programação Scala, que combina caracterı́sticas de linguagens funcionais (como
funções de alta ordem e casamento de padrões) com caracterı́sticas de lingua-
gens orientadas a objetos (incluindo classes, herança, polimorfismo por subtipo
e composição via mixins).
Observação: Não é objetivo do curso explorar em detalhes a teoria de com-
piladores, mas alguns conceitos sobre construção de interpretadores e compila-
dores serão apresentados de forma superficial. Por exemplo, utilizaremos um
gerador de parser no nosso projeto (ANTLR), que traduz uma especificação de
uma gramática em componentes de software que implementam a análise léxica

2
e a análise sintática de programas em Oberon. Detalhes da teoria relacionada à
construção desses componentes não serão explorados (existe uma disciplina que
cobre esses aspectos). De forma semelhante, implementaremos um módulo de
verificação de tipos, sem explorar em detalhes a teoria sobre sistemas de tipos
(algo que pode ser explorado durante todo um semestre em uma disciplina de
pós-graduação).
Adicionalmente, serão explorados Exercı́cios em Estilos de Programação. A
terceira e quarta semanas de Agosto serão reservadas para que o professor apre-
sente alguns estilos de programação descritos no livro Exercises in Programming
Style [Lopes, 2014]. Neste livro, a autora (Profa. Crista Lopes) apresenta um
conjunto de estilos de programação para resolver um mesmo problema (word
counting) de acordo com diferentes estratégias, agrupadas em nove categorias.
O professor da disciplina vai apresentar quatro ou cinco estilos de programação,
e cada grupo deve explorar um estilo de programação diferente. A atribuição
de um estilo a cada grupo será realizada de forma aleatória. Espera-se que uma
vı́deo aula de 20 a 30 minutos seja preparada para o estilo explorado por cada
grupo.

3 Avaliação
A média final vai ser computada pela Eq. (1)

7 × P1 + 3 × P2
MF = (1)
10
onde P1 é a média das notas atribuı́das a cada cenário de evolução e P2
corresponde à média atribuı́da às atividades relacionadas ao conteúdo sobre
Exercı́cios em Estilos de Programação.

4 Horário de Atendimento
Conforme mencionado, teremos encontros semanais de 20 a 30 minutos entre
o professor e cada um dos grupos. Esses encontros serão realizados de forma
presencial, em sala de aula. Encontros adicionais precisam ser agendadas com
o professor, observando os seguintes horários de atendimento:

• terça-feira das 16:00 às 17:00

• quinta-feira das 16:00 às 17:00

5 Plano de Aulas
O conteúdo previsto para a disciplina vai ser explorado ao longo de todo o semes-
tre. Ou seja, aspectos sobre decomposição de software em módulos; qualidade

3
de software e testes automatizados; e desenho centrado em contratos serão exer-
citados em cada uma das sprints da implementação do compilador Oberon. Em
cada sprint, cada grupo deve contribuir com uma tarefa especı́fica, obedecendo
às decisões arquiteturais e restrições de implementação, implementando con-
tratos e testes unitários e avaliando a qualidade do software (usando inclusive
análise de cobertura de testes).
As aulas ao longo do semestre serão de acompanhamento de projeto, com
encontros semanais de 20 a 30 minutos e colaboração via ferramentas de comu-
nicação (Teams) e repositórios de software (GitHub). Aulas expositivas sobre
Exercı́cios em Estilos de Programação estão previstas para o mês de Agosto

6 Bibliografia
Serão usados artigos cientı́ficos, relatórios técnicos e textos em “literatura cin-
zenta” disponı́veis na Internet. Tal material vai ser selecionado e disponibilizado
pelo professor ao longo do semestre, no ambiente Microsoft Teams. Algumas
notas de aula no formato de slides também serão disponibilizados pelo profes-
sor. Recomenda-se a aquisição do livro “Cristina Videira Lopes. Exercises in
Programming Style. Chapman - Hall/CRC, 2014. ISBN 1482227371”.

7 Bibliografia Complementar
A seguinte lista de livros apresenta um conjunto de técnicas, práticas e reco-
mendações de desenvolvimento que são essenciais para quem tem interesse em
melhorar as habilidades de programação. Algumas dessas técnicas serão discu-
tidas no nosso curso.

• Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides. Design
Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley
Longman Publishing Co., Inc., USA, 1995. ISBN 0201633612
• Refactoring: Improving the Design of Existing Code. Addison-Wesley
Longman Publishing Co., Inc., USA, 1999. ISBN 0201485672
• Beck. Test Driven Development: By Example. Addison-Wesley Longman
Publishing Co., Inc., USA, 2002. ISBN 0321146530
• Andrew Hunt and David Thomas. The Pragmatic Programmer: From
Journeyman to Master. Addison-Wesley Longman Publishing Co., Inc.,
USA, 2000. ISBN 020161622X
• Robert C. Martin. Clean Code: A Handbook of Agile Software Crafts-
manship. Prentice Hall PTR, USA, 1 edition, 2008. ISBN 0132350882

Sobre programação em Scala, uma boa referência é o livro “Martin Odersky,


Lex Spoon, and Bill Venners. Programming in Scala: Updated for Scala 2.12. Ar-
tima Incorporation, Sunnyvale, CA, USA, 1st edition, 2016. ISBN 0981531687”,

4
cuja primeira edição está disponı́vel gratuitamente online. Algumas referências
sobre programação funcional são:

• Antony J. T. Davie. An Introduction to Functional Programming Systems


Using Haskell. Cambridge University Press, USA, 1992. ISBN 0521258308
• Richard Bird and Philip Wadler. An Introduction to Functional Pro-
gramming. Prentice Hall International (UK) Ltd., GBR, 1988. ISBN
0134841891

• Graham Hutton. Programming in Haskell. Cambridge University Press,


USA, 2nd edition, 2016. ISBN 1316626229

Referências
Refactoring: Improving the Design of Existing Code. Addison-Wesley Longman
Publishing Co., Inc., USA, 1999. ISBN 0201485672.
Bas Basten, Jeroen van den Bos, Mark Hills, Paul Klint, Arnold Lan-
kamp, Bert Lisser, Atze van der Ploeg, Tijs van der Storm, and
Jurgen Vinju. Modular language implementation in rascal – experi-
ence report. Science of Computer Programming, 114:7 – 19, 2015.
ISSN 0167-6423. doi: https://doi.org/10.1016/j.scico.2015.11.003. URL
http://www.sciencedirect.com/science/article/pii/S0167642315003524.
LDTA (Language Descriptions, Tools, and Applications) Tool Challenge.
Beck. Test Driven Development: By Example. Addison-Wesley Longman Pu-
blishing Co., Inc., USA, 2002. ISBN 0321146530.
Richard Bird and Philip Wadler. An Introduction to Functional Programming.
Prentice Hall International (UK) Ltd., GBR, 1988. ISBN 0134841891.
Antony J. T. Davie. An Introduction to Functional Programming Systems Using
Haskell. Cambridge University Press, USA, 1992. ISBN 0521258308.
Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides. Design Pat-
terns: Elements of Reusable Object-Oriented Software. Addison-Wesley Long-
man Publishing Co., Inc., USA, 1995. ISBN 0201633612.
Andrew Hunt and David Thomas. The Pragmatic Programmer: From Journey-
man to Master. Addison-Wesley Longman Publishing Co., Inc., USA, 2000.
ISBN 020161622X.
Graham Hutton. Programming in Haskell. Cambridge University Press, USA,
2nd edition, 2016. ISBN 1316626229.

Cristina Videira Lopes. Exercises in Programming Style. Chapman - Hall/CRC,


2014. ISBN 1482227371.

5
Robert C. Martin. Clean Code: A Handbook of Agile Software Craftsmanship.
Prentice Hall PTR, USA, 1 edition, 2008. ISBN 0132350882.
N.Wirth. The programming language oberon, 1990. URL
https://people.inf.ethz.ch/wirth/Oberon/Oberon.Report.pdf.

Martin Odersky, Lex Spoon, and Bill Venners. Programming in Scala: Updated
for Scala 2.12. Artima Incorporation, Sunnyvale, CA, USA, 1st edition, 2016.
ISBN 0981531687.
Andrew A Tawfik and Christopher Lilly. Using a flipped classroom approach
to support problem-based learning. Technology, Knowledge and Learning, 20
(3):299–315, 2015.
Mark van den Brand. Introduction—the ldta tool challenge. Sci-
ence of Computer Programming, 114:1 – 6, 2015. ISSN 0167-
6423. doi: https://doi.org/10.1016/j.scico.2015.10.015. URL
http://www.sciencedirect.com/science/article/pii/S0167642315003184.
LDTA (Language Descriptions, Tools, and Applications) Tool Challenge.

Você também pode gostar