Advanced programming techniques in the Java language focusing on abstract data types. Specific topics include linked structures, recursive structures and algorithms, tree-based structures, and hash tables. Elementary techniques of software engineering, including documentation, coding style, basic testing principles, and informal reasoning about correctness. Weekly programming assignments, discussion section exercises, and multiple exams.