Laboratory for innovative software

Code 652AA
Credits 6

Learning outcomes

Practical development of software requires an understanding of successful methods for bridging the gap between a problem to be solved and a working reliable software system. This course will train the student to develop large software systems working in real projects by exploiting the techniques and the skills acquired in the fundamental courses of the curriculum.
The main novelty of the course is the attempt to balance traditional lectures and experimental activities with technical meetings with software architects of innovative software enterprises. During the course students will face and deal with the up-to-date issues of software design, implementation and testing of real projects. In this way students will also learn how to inspect actively software solutions.
Each time the course is offered the design and implementation of a new innovative software artifact will be addressed, however the main underlying theme will always be building reliable code. To this purpose the course experiments modern techniques for making software more robust. These techniques include, but are not limited to:
- Ad hoc static code analyses and tools.
- Model checkers.
- Code verification.
- Machine learning techniques applied to code analysis.
- Undefined behavior detectors.
- Testing frameworks.
- Language-based security frameworks.
By the end of this class, students will have developed skills in three distinct competency areas
Reliable coding:
Writing code that is well organized at a high level; exploiting the best programming language features appropriately and avoiding troublesome ones; applying sophisticated idioms to structure code elegantly; using innovative toolkits to check program properties including automatable unit tests in the code base; preventing security attacks.
Design:
Analyzing problems to understand what the tricky aspects are; identifying key design issues, and analyzing their tradeoffs; selecting features for a minimal viable product.
Professionalism:
Constructing and delivering presentation of the deployed software; collaborating with team members; making constructive critiques.