APSC 100 FAQs - CPEN
Below are frequently asked questions and answers relating to the CPEN program.
General
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 why. |
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 side. |
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 313. |
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 discussion. |
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!
Career
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.