From UBC Wiki
Jump to navigation Jump to search

Below are frequently asked questions and answers relating to the CPEN program.


What is Computer Engineering?

Computer Engineering is a discipline that is focused on developing computing systems. The goal of the program is to develop in students an ability to design complete systems that include hardware and software elements. Computer Engineers focus not just on how computers work but how to integrate them into larger systems.

The Computer Engineering Program begins in the second year of undergraduate studies, after completing the required first year engineering courses. Students will graduate with a Bachelor of Applied Science in Computer Engineering. Students in the Computer Engineering Program may choose their electives to focus on computer hardware design or the design of software-intensive computer systems.

What are examples of the typical types of work or tasks that someone in Computer Engineering does?

From the get-go, the Computer Engineering program strikes a balance between concepts and hands-on experience.

In CPEN 211, by the end of the course, students typically implement their own microprocessor (on an FPGA board) that can run a subset of ARM assembly language. In CPEN 221, students work on several mini-projects that may involve processing audio files or working with large graphs that represent social networks or a game that utilizes some AI. They also learn some of the key ideas that help us develop compilers for programming languages.

In CPEN 291, which is the Computer Systems Design Studio, students will work on projects that involve hardware and software design. The projects often to relate to robotics and controlling a small autonomous vehicle.

How does Computer Engineering differ from Computer Science and Electrical Engineering? And what is Software Engineering?

Computer Engineering programs evolved from Electrical Engineering programs. The focus has been on the construction of systems that can perform computation. Clearly, hardware was the prominent concern in the early years of the discipline but most programs have evolved to provide a balance between the hardware and the software side of building computational devices and systems. But the goal is to prepare students that can build computing systems --and not only applications-- at different levels of the system hierarchy.

There is a some overlap between Electrical Engineering and Computer Engineering and this overlap is typically related to the design of digital circuits and systems. Electrical Engineering is more broadly concerned with electronic devices, electrical motors and machines, generation and transmission of electricity, communications, signal processing, and control of such systems. A computer engineer should understand how a transistor works and how it plays a role in digital circuits but questions related to improving the behaviour of the electronics is mostly an electrical engineering activity.

Computer Science programs evolved from Mathematics programs as it became necessary to express computation and develop algorithms as opposed to obtaining closed-form solutions for problems. In that sense, one could argue that the core of Computer Science as a discipline is about computation as an abstraction, not necessarily about computing systems. However, in the early days of computing, the design of programming languages to express computation and the development of algorithms to solve problems was drove the discipline and those ideas became foundational to programs. But, for such ideas to be useful and to justify economic activity, one had to realize computing systems and the programming tools to actually carry out information management and computation. And a big chunk of such work is really “engineering”. For example, there is much engineering that goes into the design and implementation of, say, operating systems and compilers.

Software Engineering is the discipline that covers the entire span of software development: from the gathering of requirements to specification, implementation, testing, deployment and maintenance. It also requires project management and risk assessment. No one expects a software engineer to build hardware, but the overlap with what CS programs emphasize may also be small depending on which CS programs one compares with. For example, a Software Engineer -- in practice -- may need to know about the properties of a data structure and be able to choose a data structure to use in a particular project but rarely would such a person design a new data structure or (gasp!) prove correctness of algorithms and data structures.

The following (somewhat imperfect) analogy is often helpful: Software Engineering is about driving from A to B (building the application). One follows the rules of the road and drive safely but one is not expected to build the car (the hardware). Similarly, most drivers may not optimize the route they take from A to B (the algorithm) and follow what may be likely be the easiest/obvious route. Route optimization matters only when a chosen route takes "too long." (Don Knuth, in 1974, said “Premature optimization is the root of all evil.” and this is quite true.)

There are simply more roles today that involve only software implementation and these require software engineers. A lot of the software today can be built without a serious understanding of either the hardware or novel algorithm design. The rapid growth in economic activity around software has led to the need for people to “program” and one lives with defects in software. In areas where software quality really matters (avionics, etc.), companies prefer people that take a robust approach to engineering software (and this is not simply a choice of process because one can build robust software with one of several processes). It is not a stretch to imagine that if software quality were not an issue, one may not need a degree in computing at all to write programs that one can sell. This is indeed the case with many apps on the iOS store or on Google Play.

If one wanted someone to build a compiler or an operating system, they would look for someone who understands computer architecture as well as software design principles. The same skills may be required to build critical (computing) components of a car or a UAV.

Setting aside the broader issues and looking at the two UBC programs that deal with computing, here is what the core requirements look like (leaving out some first-year requirements).

Computer Engineering Computer Science Comments
APSC 160 CPSC 110 -
MATH 220 CPSC 121 Both courses are

intended to lay the

foundation for

rigorous reasoning

about algorithms.

CPSC 121 also mashes

up some digital logic

as a cursory nod to

hardware, and I have

not understood yet


CPEN 211 - There is no exact CS

equivalent to this

course which touches

on digital design and

microcomputers. CPSC

213 touches on some

aspects but that is

mostly on the

systems software


CPEN 221 CPSC 210 Both deal with

Software Construction

and use Java. I know

that I push for more

in CPEN 221 as a way

to introduce students

to many aspects of

Computer Systems.

CPSC 221 CPSC 221 Both programs require

the same introductory

data structures &

algorithms course.

CPEN students have

taken MATH 220 and

CPEN 221 to get here;

CPSC students have

taken CPSC 121 and

CPSC 210.

CPSC 261 CPSC 213 These look like

identical courses (on

Computing Systems),

but CPSC 261 has a

different starting

point relative to

CPSC 213 because CPEN

students have done

more by virtue of

completing CPEN 211.

CPSC 261 covers

almost half of CPSC


CPEN 331 CPSC 313 Of the two,

surprisingly CPEN 331

is closer to what

would be an OS course

in most CS

departments. This is

because of how much

CPSC 261 covers.

CPEN 311 - There is no

equivalent to a

digital systems

design course in CS.

- CPSC 320 A 2nd course in

algorithm design is

required by CS

programs. This has to

do with the

philosophical roots

of CS programs. This

course is an elective

for CPEN students but

most students

complete this course.

CPEN 321* CPSC 310 Introduction to

Software Engineering

is required of CS

students and is an

elective that almost

all CPEN students

take these days. The

* is to indicate that

CPEN 321 is not a

course required in

the program but is

relevant to the


Beyond these, there are five technical courses that are required in Computer Engineering:

Course (s) Description
ELEC 201 Introductory circuit analysis and

electronics that enables an

understanding of the tiny devices

that help us build computers.

ELEC 221 Signals & Systems help us

understand the world of

continuous signals to some

extent. This is a modeling and

algorithms equivalent when

inputs are continuous, and the

basis for many application areas

such as robotics, computer

vision, advanced graphics and

(advanced) statistical learning.

Project Courses CPEN 291, CPEN 391, CPEN 491 add

significant design experiences

and teamwork in each year

because large, complex systems

are never built in isolation.

Student Experience

What are the unique student experiences in Computer Engineering?

University is about more than just lectures, labs, and late-night study sessions. During your time at UBC, you will have many opportunities to meet people from all over the world and experience new things. You can build a solar car with friends, visit Silicon Valley on a field trip with other students and influence your learning environment by participating in student societies and clubs.

Here is a list of Engineering clubs and society that host amazing events throughout the school year!


How does Co-op work with the program?

Undergraduates can apply for the Engineering Co-op Program at the beginning of their 2nd year of their Engineering degree. The year-round program entails one spring and one fall work term as well as three summer work term. Participation in the program will require an extra year of study for undergraduates to finish their B.A.Sc.

More information on the Engineering Co-op Program is available on the website here.