This course covers techniques that scale to programming large software systems with teams of programmers. The techniques are explained in the context of the specification, implementation, testing and maintenance of software systems. The course utilises the Java programming language and covers programming concepts such as data abstraction, procedural abstraction, unit testing, class hierarchies and polymorphism, exception handling, file I/O, and graphical user interfaces.