Introducing concepts and techniques for collaborative development of
large and complex software systems for industrial applications, including
Java, functional programming, software development lifecycle, best
practices in software development as code testing, versioning and design
Knowledge and understanding
Students should be able to understand the relationships between
different product development approaches, software development
practices and the ability of making changes in a product. They should have a clear
idea about how good practices help in developing software systems and
improving their quality.
Applied knowledge and understanding
Students should learn how to use and adopt good software development
practices. They should be able to perform test-driven development,
refactoring and continuous integration. The students also should learn
functional programming techniques and be able to write Java programs
that solve practical, real world problems using object-oriented design
techniques and data parallel functional programming.
Students should be able to recognize bad code, to identify possible
refactoring moves and to analyze a test suite.
Students should be able to effectively communicate their design
decisions on production code and test code.
Students must demonstrate that they are comfortable with good software
development practices. They should demonstrate to understand the basis
of Agile Software Development and continuous integration. They should demonstrate a good understanding on functional
programming, writing parallel functional programs in Java and be able to
analyze sequential and parallel time complexity in small program
Previous experience with software development and being comfortable
with the use of an IDE (or a text editor) and version control systems (like
git) are preferable but not mandatory.
● Functional programming: The elements of a functional system: objects,
functions and functional forms. Programming examples. Expressive
power. Parallel execution considerations.
● Fundamental Java: variables, expressions, control structures, arrays,
objects, classes, instance variables, methods, initialization, constructors,
inheritance, access control, abstraction, polymorphism, interfaces,
exceptions, threads, packages, collections, generics, modules.
● Functional programming in Java: the main elements introduced by the
language: method references, lambdas, default methods, streams and
optionals. Behavior parametrization. Functional interfaces. Lazy
evaluation considerations. Composition. Mutables.
● Java Streams: Main features. Creation, filtering, extraction, grouping,
mapping, partition and reducing patterns. Streams vs. Collections.
Numeric streams specializations. Performance considerations. Default
and custom parallel streams. Split iterators. Comparison of parallel
streams with the fork/join framework.
● Agile Software Development and Scrum
● Technical excellence
● Test Driven Development
● Object-oriented design principles
● Test automation
● Development collaboration techniques
● Continuous Integration
Lectures are expected to be very interactive, with a mix of frontal
lectures and hands-on sessions to immediately put into practice the
notions, concepts and techniques presented. Hands-on session will
include software development exercises and working in pairs on code
“katas”. Exercise solutions and “katas” will be discussed after the hands-on sessions. Similar activities may be left has homework and discussed
during the next lecture.
The exam will consist in a project to be completed in a group of 2/4
students, using the development practices seen during the lectures
Hands-on sessions require a laptop.
● Java IDE or text editor, with a preference to the former (we suggest
IntelliJ Idea Community)
● Java Development Kit
● Git version control system
● Java 8 Lambdas, Functional programming for the masses, Richard Warburton, O’Reilly, 2014.
● Beginning Java 9 Fundamentals, Kishory Sharan, Apress, 2017.
● Java Language Features with Modules, Streams, Threads, I/O, and Lambda Expressions, Kishory Sharan, Apress, 2018.
● Test-Driven Development: By Example, Kent Beck, Addison-Wesley Professional, 2002
● Refactoring: Improving the Design of Existing Code, Martin Fowler, Addison-Wesley Professional, 1999
Other suggested books
● Growing Object-Oriented Software, Guided by Tests, Steve Freeman and Nat Price, Addison-Wesley Professional, 2009
● Continuous Integration: Improving Software Quality and Reducing Risk, Paul Duvall, Steve Matyas, and Andrew Glover, Addison-Wesley Professional, 2007