Course Info
Description 
Introduction to full-stack application design and development. Students will work in project teams to design and build complete, working applications and services using standard tools. Topics include best-practices in design, development, testing, and deployment.
Units 
0.5
The course outline is also published on outline.uwaterloo.ca.
Prerequisites
This course is restricted to Computer Science students, and you must have successfully completed CS 246 Object-Oriented Programming before taking this course. You should be able to:
- Design, code and debug small C++ programs using standard tools. e.g. GCC and GDB.
 - Write effective unit tests for these programs. e.g. checking for a range of invalid conditions.
 - Demonstrate programming proficiency in C++, which includes:
- understanding of fundamental OO concepts. e.g. abstraction, encapsulation
 - using classes, objects, method overloading, and single inheritance; polymorphism
 - understanding how to use assertions, and
 - knowing how to manage exceptions.
 
 
You must be enrolled in one of these programs: H-BBA & BCS Double Degree, H-Computer Science (BCS), H-Computer Science (BMath), JH-Computer Science (BCS), JH-Computer Science (BMath), H-Computing & Financial Management, H-Data Science (BCS), or H-Software Engineering.
Course Progression
CS 346 is designed as a direct successor to CS 246, and an informal pre-cursor to CS 446. It is also one of the courses that can be applied towards the Software Engineering specialization.
Learning Objectives
This course includes a mix of lectures, demos and project activities. The course project is a significant element of the course. On successful completion of the course, students will be able to:
- Work effectively as a member of a software development team.
 - Use an iterative process to manage the design, development and testing of software projects.
 - Design and develop different styles of application software in Kotlin, with appropriate architectural choices.
 - Include online and offline capabilities in your application, leveraging local and remote storage.
 - Design services that can provide remote capabilities to your application.
 - Produce automated tests as an essential part of the development process.
 - Apply debugging and profiling techniques as required during development.