Overview
The archived course outline is available on the course outline website.
Description
CS 346: Application Development
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.
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 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.