Final Thoughts on UBC’s BCS Program

If you stumbled onto this page looking for information about UBC’s BCS program I recommend starting at my first post here.

One and a half years have passed since I last wrote an update on the BCS program. Two and a half years since starting the program. With graduation imminent I figured it was time to give my final update on what I have been doing and my thoughts on the overall quality of the program.

Since my last update, I did 3 four-month internships. I mostly did backend web-development in NodeJS, Rails, and Python. A lot of the work I ended up doing straddled the line between development and dev-ops, with significant portions of each internship focusing on performance, scalability, and infrastructure improvements.

These internships offered me excellent opportunities to work on important projects, with both real business impacts and lots of interesting technical challenges. Many of my colleagues had other internships that were every bit as good. Internships are really one of the strongest parts of the program and I highly recommend focusing significant effort on preparing for them (personal projects and interview prep).

School alone would not have prepared me for this work. If you want to have the chance to really dive in to interesting projects on your internships you need to prepare yourself outside of school.

After a year of having proper weekends and remembering what it was like to get paid rather than give all my money to UBC, I was back at school for my final two terms. First term I loaded myself up with courses. Five 300 level CS courses and a technical writing class which is a BCS requirement (a completely stupid one…). All of this while preparing for technical interviews and beginning to apply for jobs. The whole term was exhausting and stressful. For most of the term I don’t think I had a single day off with most weekends spend working on assignments.

Second term started just as bad. While I only had 4 classes, I was determined to get a job lined up as fast as possible so I spent a lot of the first few weeks interviewing/prepping. It paid off because I now have an exciting job lined up for when I graduate. However, even with the pressure of finding a job gone, 4 upper year courses continued to have me working most weekends.

Final thoughts on the program:

If you want to finish the BCS program in the “standard” 5 terms the last few terms will be very intensive. If you can get most of your bridging modules done in the first 2 terms while you have fewer intense CS courses things won’t be quite as bad. If your last 2 terms are full schedules of mostly 300 and 400 level CS or other tough disciplines expect 7 day weeks to be the standard.

You can get an internship/full-time position at most of the “top” big employers (Google, Facebook, Microsoft etc.) with this degree. However, the courses you take won’t prepare you for the interviews. You need to put ~10 hours a week into preparing for programming interviews for at least a few months ahead of these interviews. If you are aiming to get a “top” internship for your second summer you should begin preparing a full year before. Hiring starts around 8 months before the internships begin.

Local startups (and to a lesser extent startups in other Canadian cities) hire lots of UBC students. They will generally care more about practical knowledge with the languages and frameworks they use. For web development JavaScript is a must know. Ruby on Rails and NodeJS are both very common for backend work. For mobile development iOS is a good choice, although there are Android positions if that is your preference. Make demoable apps that you can link to in your resume and show off to interviewers. Being able to link to a simple app that you published in the app store puts you ahead of 95% of applicants.

The most important aspect in course quality is the professor. Generally the professors in the CS department are good, but there are a few to avoid. With the fast BCS schedule you likely won’t be able to get to every 300/400 level class you want. You won’t have a choice of best professors for most upper year courses.

My bridging module was statistics and I am very happy with that choice. The classes are far from easy but in my experience the statistics professors are great and the courses are well structured.

Overall I am very happy with the BCS program. I feel like the classes have provided me with a solid basis in computer science fundamentals. The advanced classes are really interesting and get you digging deep into specific areas in computer science and building non-trivial programs.

From a career perspective, I’ve been even happier. Within a year of starting the program I had an internship that I enjoyed. Finding a new graduate position was reasonable (although still very stressful). After my first degree I searched for months with few interviews until finally I took a job that didn’t even require my degree. For this degree most of the stress came from keeping my standards very high, rather than from inability to find any related job.

Probably the best part of the program is the people you will meet. BCS students come from a fairly wide range of backgrounds and differ in many ways. However, BCS students are almost always mature, hard-working, and humble. These qualities really stand out against the average first degree CS student.

How did I do with my Summer Goals?

Here are the results for my Summer OKR’s.

Objective: Maintain strong academic achievement (0.875)

Key Results:

  • 9X% in CPSC 213 (1)

  • 9X% in CPSC 221 (1)

  • 9X% in CPSC 310 (0.5)

  • 8X% in CPSC 320 (1)

Part way through most of these courses I was sure I wasn’t going to make any of these goals. Luckily for me, summer classes seem to be marked a little more leniently and I ended up doing very well.

Objective: Personal enrichment and learning (0.58)

Key Results:

  • Make major improvements to my Android app: SS Log (0)

  • Create a MEAN (MongoDB, Express, AngularJS, node.js) stack web application (0.5)

  • Read 5 books (not for a class) (1)

  • Average one blog post a week (0.5)

  • Apply for an average of 5 jobs a week until I get one (1)

  • Do something “interesting” once a week (0.5)

My score for this category was a little low, and that’s even with my slightly charitable 0.5 score for creating a MEAN stack application. I did absolutely nothing for my Android app, largely because an injury pushed me towards other forms of exercise so I had no personal reasons to improve an app I wasn’t using. This may change in the future if I get back to lifting. I never made an entire MEAN stack application but I’ve done enough on various projects that I gave myself 0.5.

I finished reading two books, Gödel, Escher, Bach: An Eternal Golden Braid and The Pragmatic Programmerthe first of which I highly recommend. I then read almost all of Isaac Asimov’s Foundation series which may be my favourite science fiction series. I wrote a bit less than half as many blog posts as my goal, so I rounded that up to 0.5.

I applied to exactly 15 jobs over the 3 weeks before I got my job. My last key result was poorly designed (which I knew from the beginning) but I wanted something to push me towards enjoying summer a little more. I did okay on that front, with something I would categorize as “interesting” on about half of the weeks.

Objective: Improve health and fitness (0.56)

Key Results:

  • Average four 20+ minute fitness sessions a week (1)

  • Walk 8,000 steps at least 5 days per week (0.9)

  • Bike 30 minutes a week (0.1)

  • Average 7:45 of sleep a night (0.25)

While injuries from earlier in the year changed the type of exercise I did, I was quite good at exercising frequently. There was only on week that I didn’t walk 8,000 steps 5 days of the week. I barely used my bike though. Only 4 times the entire summer. Basically, the reason is that it never made sense to bike over other options. Almost everything I did was either on campus, which is too close to warrant biking in my opinion, or far from campus, where the distance to bike is too much in my opinion.

I wasn’t really sure what to give myself for the sleeping score. My basis fitness watch gives me automatic weekly sleep reports. The problem is that I just don’t think it works probably every night. Once a week or so it records phantom “wake-ups” where it insists that I was awake for an hour or two in the middle of the night when I have zero memory of that. The sleep reports put my average around 7 hours. They are probably a little on the low end but I am still going to give myself a fairly low score.

Overall (0.66)

I probably won’t be doing new OKRs for this term. I am doing a co-op work term where I will be setting some work specific OKRs, and for personal goals I need to rethink how I set the key results.

Thoughts on UBC’s BCS Program (after 3 terms)

I’ve done this after each term so if you stumbled on this one first I would recommend starting at the first post here.

I’ve not been looking forward to writing this. Two of my four summer classes were frustrating and stressful. In general my summer was busy, stressful, and exhausting. This will be a quick update.

Don’t take 4 intense classes during the summer while also TAing, especially if you are going to be applying for co-op jobs. Like me, you could have easily taken one of them in your next study term without really losing anything.

In the first summer term I took 310: “Introduction to Software Engineering” and 221 “Basic Algorithms and Data Structures”. 221 is a great course and our instructor was excellent. The material was presented really well and if you are into core CS topics it is a great introduction.

310 was not as good. The material presented in the lectures was artificial and generally not clear. I feel like a better use of time would be to read a software design practices book yourself than to sit through those lectures. The group project where you build a website in teams of 4 had the potential to be a really great learning experience but it fell a little flat. We were forced to use Google Web Toolkit which was absolutely not the right tool for what we were doing and beyond that is just not well documented and there are few resources available. It also works fairly differently than most web frameworks and hides important details so the skills aren’t even very transferable to more reasonable frameworks. If you can, take this course outside of summer when they usually let you use other web frameworks.

In the second summer term I took 213: “Introduction to Computer Systems” and 320: “Intermediate Algorithm Design and Analysis”. 213 was generally a very good course. About half of it focuses on how C and Java code gets compiled down to a machine language that your CPU can actually run. I really enjoyed learning about this and I felt it makes you a better programmer to have this understanding. The second part deals with different aspects of how a CPU and connected components work. Once again, this knowledge is really good to know, even if you mostly program in languages that extract away most of the machine level stuff from you.

320 was probably one of the worst course experience I had at UBC. I should say that thanks to some scaling it was actually my best mark of the summer, and that in the end I learnt a lot, but very little of what I learnt came from lectures or course materials provided by my instructor. Lecture were more confusing than helpful. Expectations for quizzes and assignments were rarely clear. Ultimately I got a lot out of it, only because I feared doing poorly so I spent a lot of time studying the concepts from various textbooks and watching lectures from similar courses at schools like Stanford and MIT online.

Applying for co-op jobs at the start of the summer took a lot of time. I applied for quite a few jobs before I heard anything back. Ultimately I ended up getting a really awesome job at a company full of smart motivated people. In general, people in the BCS program seemed to do pretty well in finding jobs although there was enormous variance. Having some sort of demoable project that you could show employers seemed to be the most important thing to getting a job. Good grades may have helped but were nowhere near enough.

Ultimately with an excellent internship starting and courses lined up that look quite interesting I am feeling good about my choice to do BCS. It’s a program that forces you to learn a lot yourself in order to do well in co-ops, but absolutely gives you the chance, within a year or two of starting, to be doing interesting work in an exciting tech company.

Updated Thoughts on UBC’s Bachelor of Computer Science Program (after two terms)

If you are thinking about applying to the program and looking for my full thoughts, I would recommend reading my first part here as this will build on what I wrote there.

As I said in part one, my main goal with the B.C.S. program was to learn “algorithms, data structures, design patterns, and to improve my mathematics and statistics”.  My goal with the program was not to learn specific languages, frameworks, or technologies. On that front, I have mostly sought to teach myself on the side, as CS courses here, quite rightly, do not focus on teaching the latest frameworks or technologies.

Now that I am two terms ( 8 months ) in and I am applying for co-op jobs I have to say that I am a little disappointed in the progress I have made on these topics through the courses I have taken. Algorithms and data structures have only been touched on in a limited way in the basic CS courses. 110 talks a little about trees, recursion, and search but fails ( due to the focus of the course being on software construction ) to discuss these topics above a superficial level. 210 discusses a few of the basic data structures, but does not go into the type of detail that allows someone to reason through their uses in the types of problems asked in technical interviews.

It is a little better for design patterns, with 210 covering some of the core ones, although I wish the course had a project to implement one or two of them. On the math and stats side I probably have learnt the most of any of these topics. This term I took Math 221, which was a good course that provides a good introduction to linear algebra and Stat 302, which is a great introduction to probability.

Overall my opinion on the program hasn’t changed much. I still highly recommend taking CPSC 110 on Coursera before starting the program, and then challenging the final in the first week of class. The fact of that matter is that the pre-requisite structure for computer science courses just doesn’t work well for B.C.S. On the standard timetable of the program you will start applying for co-op jobs with only some java knowledge, maybe python, some software development practices, and only a few very basic projects without putting significant time in on top of your classes. Co-op still has a very high placement rate, so you will likely get a job, but if you are like me and want to aim a little higher, having your school hold you back over arbitrary pre-requisites is a little annoying.

So far instructors in my computer science courses have been well above what I expected based on my experience from my first degree, and I hear largely good things about professors that teach the upper year courses.

While there has been a lot of good and bad I am still very hopeful and even somewhat excited about the rest of the program. The classes I am doing this summer are finally starting to bite into the core Computer Science topics that I have been wanting to get to from day one. In the first summer term I will do another software engineering course that will hopefully culminate in an interesting project, and my first course on algorithms and data structures. In the second term I will do a computer hardware course and hopefully the next level of algorithms and data structures (if they can find someone to teach the course).

You can now read part three here.

Summer Goals

For last term’s goals click here.

My goals last term went pretty well so I am going to aim high again.

Objective: Maintain strong academic achievement

Key Results:

  • 9X% in CPSC 213

  • 9X% in CPSC 221

  • 9X% in CPSC 310

  • 8X% in CPSC 320


Objective: Personal enrichment and learning

Key Results:

  • Make major improvements to my Android app: SS Log

  • Create a MEAN (MongoDB, Express, AngularJS, node.js) stack web application

  • Read 5 books (not for a class)

  • Average one blog post a week

  • Apply for an average of 5 jobs a week until I get on

  • Do something “interesting” once a week

The last one requires a bit of an explanation. It is very easy to want to spend any free time watching Netflix, but there are so many things to see and do in Vancouver during the summer that I really want to try to make sure I am not constantly doing that. Examples of what would count is a challenging hike, or visiting somewhere I have never been before.


Objective: Improve health and fitness

Key Results:

  • Average four 20+ minute fitness sessions a week

  • Walk 8,000 steps at least 5 days per week

  • Bike 30 minutes a week

  • Average 7:45 of sleep a night

Scoring my 2014 Winter/Spring Goals

About 4 months ago I posted a bunch of goals for the term on my blog. I wanted these goals to be public to keep me accountable. So, now that the term is over I am going to score how well I achieved them.

Objective: Maintain strong academic achievement   ( 0.875 )

Key Results:

  • 8X% in STAT 302     ( 1.0 )

  • 9X% in MATH 221    ( 1.0 )

  • 9X% in CPSC 210   ( 1.0 )

  • 8X% in COMM 486a   ( 0.5 )

So, not all my marks are actually in yet, so I will have to update this when I get the last but I will provide scores based off my pre-final mark and my estimate for how well I did on the final. In this case, I am giving myself a 1 if I reached my goal, and 0.5 if I am within 5%.

Objective: Gain experience through personal projects and self-direct learning ( 0.5375 )

Key Results:

  • Complete two non-trivial Android apps   ( 0.5 )

  • Successfully complete two hackathon events ( 0.4 )

  • Complete one Udacity data science course   ( 1 )

  • Average one blog post a week  ( 0.25 )

I developed, and published, one Android app. I ended up switching my focus after that to learning more about web development, an area I wasn’t as familiar with so I never made a second app. One of the hackathons I wanted to complete never happened, and the other had a topic I wasn’t super interested in. I did end up organizing my own little hackathon with some friends, which somewhat fell apart but I still spent three solid days working hard on web development so I am going to mostly count that.

Objective: Improve health and fitness    ( 0.57 )

Key Results:

  • Average four 20+ minute fitness sessions a week   ( 0.8 )

  • Walk 5km+ every day    ( 0.9 )

  • Deadlift 220lbs, Squat 190lbs, Benchpress 180lbs   0 )

I average four sessions a week for about the first half of the term, but certain bio-mechanical issues got in the way of continued success. However, over the last month or so I have been working really hard on physio to hopefully overcome some of those issues so I am still giving myself a decent rating. I only missed my 5km target 8 times over the 4 months, about half of the times was due to intense rain or snow, and most of the others were health related if I remember correctly. Because of my health issues I basically stopped doing all of those lifts so I have to give myself 0. I don’t know what I am currently capable of but it is probably less than that.

My overall score: 0.67

While that score is in the “sweet spot” for OKR’s, I can’t help but feel a little disappointed that I didn’t do better. Hopefully better health will help me with health and fitness goals for my next set of goals.

I’ll post my goals for the summer term in the next few days.

My thoughts on UBC’s Bachelor of Computer Science program (after one term)

There is very little information about the BCS program on the web so I figured I would add my thoughts.

I entered the program with a good grasp of basic Python, and a decent grasp of basic Java. Most introductory computer science basics like recursion, a few algorithms, logic, and the core of how a computer works were somewhat familiar to me. What I wanted to get out of the program was a much stronger basis in algorithms, data structures, design patterns, and to improve my mathematics and statistics.

I’ll start with what I don’t like about the program. UBC’s Computer Science courses have a very strict pre-requisite structure. You must take 110 (a design course) before 210 which then opens up most other courses. Because of this, if you enter the program with an introductory knowledge of Computer Science, which is increasingly easy to gain through free online courses these days, the entire first two terms of Computer Science courses are fairly simple. They will still take up a decent amount of time though. If you are doing a normal 4 year degree, this is not a huge issue as you have a lot of non-CS courses you need to take, but if you are in BCS then this makes it very difficult to take enough relevant classes to retain full-time status.

Because of this I am stuck taking a less than full-time course load even with a filler course that I most likely won’t get credit for. UBC is holding me back from a number of courses that I feel quite confident I could complete with little issue. Because of this, I will enter their co-op program with fewer CS courses than I could have done and I will be less competitive than if they allowed me to take a few other courses.

Another slight downside is that you gain few marketable skills in the first two courses, especially in comparison to something like a programming bootcamp. The intro course uses a programming language that most people in industry have never heard of, Racket, and after that you mostly use Java. While Java is widely used, if you look at the average job description for entry level positions in software development, you are going to notice a lot of languages and technologies that UBC will never teach you. The CS courses you do take will give you a good grounding from which to learn these technologies though. You just really need to take time to learn some of these yourself and to develop a few personal projects to show employers.

Even with what I said above, I do like the program. I just wish I could speed through the first year a little faster. UBC’s Computer Science department is quite teaching focused compared to other departments at UBC. The courses are fairly well structured, especially if you like partially flipped classrooms, and the instructors definitely care about your success. Between TA’s and Professors there is easy access to someone if you are having issues with a course concept.

The BCS community is also a nice asset. You will meet a lot of awesome students with similar goals that will make your time at UBC a lot better. The program coordinator is helpful and happy to talk to you and provide advice. You also have access to events, such as hackathons, game jams, and tech-talks, that help teach you some of the “hot/new” technologies that your CS classes don’t teach you. The school appears to have a good reputation with all the big tech companies as well as Vancouver’s mid-size and small tech companies.

I am excited to get to the upper level courses, to start co-op, and to really dig into some interesting personal projects. I’ll make a new update when I am further into the program, but if you want to read the thoughts of someone who graduated, check out this Quora answer.

I’ve since updated my thoughts after finishing another term which you can read here.

Personal Goals

I have never found New Year’s resolutions particularly useful. The “standard” ones like “go to the gym” and “eat healthy” are worthy goals but lack specificity and clear quantifiable sub-goals. But all the talk of setting personal goals around this time of the year usually pushes me towards setting a few of my own, even if I am a few weeks late to the resolution game.

I came upon a video of a workshop by Google’s Rick Klau, How Google sets goals: OKRs, and immediately started to like the idea of using something similar to Google’s internal goal system, OKRs, as my own personal system for setting goals. Basically the system breaks down to having a small number of objectives that can be broad like the “standard” resolutions. Each of these objectives then has roughly four key results that are quantifiable. You set a period of time for the goals, in my case this academic term, and then at the end of that period you give a score between 0 and 1 for each key result and then average the score.

What I really like about this system is that it is designed so that you set goals such that it will be very difficult to attain 1 on each. You want to aim high and then hopefully attain roughly 70% of those lofty goals. Another important aspect for Google is that everyone’s OKRs are public (within the company) so that anyone can see what their co-workers are focusing on.

To give readers an idea what this looks like, and to make myself publicly accountable for my goals, below is a draft version of my OKR with a few omissions. I made the grade goals slightly less specific for posting on here but otherwise everything is exactly as written. I’ll make another post at the end of the term tallying up my score.

Objective: Maintain strong academic achievement

Key Results:

  • 8X% in STAT 302

  • 9X% in MATH 221

  • 9X% in CPSC 210

  • 8X% in COMM 486a


Objective: Gain experience through personal projects and self-direct learning

Key Results:

  • Complete two non-trivial Android apps

  • Successfully complete two hackathon events

  • Complete one Udacity data science course

  • Average one blog post a week


Objective: Improve health and fitness

Key Results:

  • Average four 20+ minute fitness sessions a week

  • Walk 5km+ every day

  • Deadlift 220lbs, Squat 190lbs, Benchpress 180lbs

  • Placeholder (waiting to figure out a baseline for another measurable health goal)