||Weekly Class Schedule
||Mon 16:00 - 16:50, Wed 14:00 - 15:50, AF1.26
||It is a prerequisite to
||Office Hours / Room / Phone
||This course introduces fundamental principles and techniques of software development, i.e., how to write software that is safe from bugs, easy to understand, and ready for change. Topics include static checking; specifications; mutability and immutability; testing; debugging; abstract data types; recursion; design patterns for object-oriented programming; concurrent programming and functional programming with immutable data and higher-order functions.
||1. Rob Miller, et al. (2013) Software Construction - Lecture Notes, MIT (http://web.mit.edu/6.031/www/fa18/) 2. Barbara Liskov, John Guttag (2001) Program Development in Java: Abstraction, Specification, and Object-Oriented Design, Addison-Wesley, ISBN 0-201-65768-6
||After successful completion of the course, the student will be able to:
- Write code that is safe from bugs, easy to understand, and ready for change.
- Understand key software engineering ideas, including interfaces, specifications, invariants, abstract data types, design patterns, and testing.
- Apply software engineering ideas to design, implement, and test a small- to medium-scale software system.
- Understand general programming-language concepts such as static typing, exceptions, access control, interfaces, and equality, and ability to use Java as a particular example language with those concepts.
- Use modern programming tools (e.g. Eclipse, JUnit) and modern programming technologies (e.g. I/O, regular expressions, threads).
||Class lecturing and discussions with examples. Active laboratory sessions for engaged learning and continuous feedback on progress. Home assignments for analyzing the obtained knowledge in the classes.
||Static Checking: Static Typing, Snapshot Diagrams, Properties of Good Software
||Code Review: Style Standards, Code Smells, Global Variables, Coherent Methods
||Testing: Choosing Test Cases, Blackbox and Whitebox Testing, Coverage, Regression Testing
||Specifications: Preconditions and Postconditions, Tests for Specifications, Exceptions
||Designing Specifications: Deterministic and Underdetermined, Declarative and Operational
||Mutability and Immutability: Mutable Objects, Aliasing, Immutability
||Avoiding Debugging: Assertions, Incremental Development, Modularity and Encapsulation
||Abstract Data Types: Abstruction, Designing Abstract Types, Representation Independence
||Abstract Functions and Invariants: Interfaces, Invariants, Abstract Functions
||Interfaces and Enumerations: Interfaces, Subtypes, Generic Interfaces, Enumerations
||Debugging: Finding Bug Using the Scientific Method, Fixing the Bug
||Recursion: Decomposition, Helper Methods, Recursive Problems and Data, Mutual Recursions
||Equality: Equivalence Relation, Equality of Mutable and Immutable Objects
||Recursive Data Types: Writing a Program with ADTs