Learning Multiple Platforms @ Coursera

SITE NAME
2017-05-08T18:30:00+00:00

I joined Coursera just over a year and a half ago as a new graduate software engineer. During this time, I’ve had the opportunity to work on three different platforms. I was hired as an iOS engineer, transitioned to Android to help fill out a shortage of Android engineers on our mobile team, and currently work as a backend engineer on the growth team. Learning a new platform can feel difficult at times, especially when going from a platform you’re proficient with to one you’re a complete beginner in. In this post, I’ll go over some of the challenges I personally encountered during these transitions and how we attempt to mitigate them here at Coursera.

Diving into Android

The first platform switch was from iOS to Android and it came early — roughly two months after joining the company. This was a transition that a few iOS engineers had already gone through and we had a strategy to make the initial ramp up easier. It starts with a week-long boot camp where we build toy projects using important Android concepts. The focus is on breadth rather than depth — most of the time is spent simply copying code from a book. This approach seems odd at first — how do you learn if you’re just copying code? But it ends up working quite well since you don’t fall into the trap of trying to learn the ins and outs of the platform prior to writing any code. Rather, you get comfortable with the IDE, the language and get a high-level overview of various Android concepts. It’s not comprehensive, but it’s enough such that when you start on a task, you have a basic idea of where to look.

While going to a bootcamp is a great way to cram a lot of information in a short amount of time, there are a few other strategies I found useful for quick ramp up on a new platform. Simple side project outside of work allow for greater freedom and expose you to details you might not encounter when jumping into an existing project. Things like setting up the initial project, making decisions on an architecture rather than being dropped into one, which libraries (if any) to use, and just the experience of building something start to finish. Pair programming for a short amount of time can also be immensely helpful. Being completely new to something, you often have a million questions ranging from fundamentals to trivialities. Pairing puts you in a position where you are encouraged to ask questions. While I don’t pair program a lot at Coursera, there were a few situations where it was very valuable. For example, going through my first android ticket and learning about TDD from an experienced Android developer.

Two Platforms One Architecture

An interesting thing we do here at Coursera is enforcing a common architecture for our iOS and Android projects. This drastically reduces the learning curve when switching platforms. You can learn more about the architecture here. Normally when diving into a new code base, there’s friction trying to figure out where things can be found or belong. A common architecture cuts down on this — something on Android is usually in a similar place on iOS. For instance, I know I should put business logic in an Interactor class and specify possible events on a page in an EventHandler interface. As a result, most of my time could be devoted to learning a new language and more importantly the platform specifics of Android. Language was probably the easiest thing to pick up (this is a recurring theme when switching platforms) whereas learning platform specifics seems like a life long journey.

The organization of simple feature on Android and iOS. Files, of course, don’t paint a complete picture but hopefully, this illustrates the similarities (highlighted with the same color). Note: our Android architecture has changed a lot since then, gone are the Impl classes.

A big plus of working on multiple platforms is being able to bring over ideas from one platform to another. For example, consider a performance tracking system first implemented on Android to measure page load time and later brought over to iOS. We built this feature to be easily interoperable with the Android architecture and because iOS is so similar, it was ported over quickly. The cost of investigating potential solutions and iterating on them was paid once on Android rather than having to do it for both platforms.

From Mobile to Backend

I stayed on Android for about ten months before switching to backend. Compared to the iOS to Android transition, which was still mobile to mobile, this had a much steeper learning curve. iOS and Android have similar patterns whereas backend required switching to an almost new mode of thinking. The biggest challenge was just getting familiar with the sheer number of pieces that our backend consists of and how they operate together. This can feel overwhelming at first but like with the bootcamp, it’s good to just start working on things. At first, there’s a lot of pattern matching — looking at how others solved similar problems and emulating it. We also have a few recurring groups at Coursera which are especially helpful for new backend developers — currently this includes a bookclub, a working group where we dive into a particular piece of our stack, and sessions where we learn about powerful Scala paradigms.

Though I primarily work on backend right now, I still contribute to mobile when the need arises. At first context switching between platforms can be tricky, especially if the work you’re doing on them is unrelated. Sometimes there are feelings of being a jack of all trades but a master of none. It’s difficult to keep up with multiple platforms at the same time so it helps to have one platform as your primary — the platform you are invested in continuously advancing your skills in. That being said, for certain situations working simultaneously on mobile and backend is extremely fluid. When adding support for free trials on Android, I already knew which API did what and how it worked. So when I encountered bugs while testing, it was usually clear if the bug stemmed from the backend or the app without requiring much investigation.

Retrospective

I’ve been at Coursera for about 20 months and looking back it’s been an amazing experience. As a new grad, you want to expose yourself to as much learning as possible. Being able to learn about and work on three different platforms is an incredible opportunity that I’m very grateful for. Last year, several mobile developers on my team decided to try frontend and backend development because it would allow us to have a greater impact on our team’s goals. We started book clubs, shared resources, and debugged things together. There was something wonderful about that experience — developers, both junior and senior, jumping into a new platform. It felt like an embodiment of the lifelong learning attitude that Coursera is all about.