Skip navigation

Over the past couple of weeks, I have been on the lookout for an internship/full time position. I am taking a break from my PhD and have been looking out for a job. My effort into preparation went primarily into being able to demonstrate my ability as someone who could understand and build systems that scale. I dont mean applications. I mean systems. I am yet to really accept an offer and work at any of these places. So, at this point I have little to show that these jobs really were as systemsy as they claimed to be. Nevertheless, I have not found much content on the Internet that says much about how one can develop a good understanding of building computer systems. One would think that this is a must-have skill in the era of the Internet and Big Data.

Here are some pointers that have helped me find these jobs. These are in order of priority. I have also written how these skills are different from those expected from application developers AFAIK.

1)CS Fundamentals

A good systems Engineer is expected to have a good understanding of Operating Systems, Networks and Concurrency. Any interview is bound to test you on all these aspects in some way or the other.

2) Understanding moving components

There is a strong need to understand the moving components of a system. For example, an Internet company will expect that a systems engineer know atleast all of the following in reasonable depth. For example, an Internet company will require that you have a strong understanding of DNS, CDN, Web Caches (at all possible points- ISP, http, disk, db), Proxies, Reverse Proxies, Containers, Data Centres at least.

3) Concurrency 

This really is at the heart of what your job involves. You should be able to write concurrent code and see race conditions with reasonable ease. Locks, Semaphores, Mutex, Threads, Processes, IPC, Thread Communications, Message Queues, Notifications, Serializing Access, Immutable Data Structures, Copy on Write are must knows. If you do not touch on each one of these topics at some point in the interview, the position is probably not very systemsy.

4)Breadth Coverage

One of the crucial differences between a systems position and app development is the breadth of knowledge that a systems person is expected to have. For example, app developers can go years without knowing anything about computer security. Systems Programmers can’t. If you are looking for systems positions, odds are that you want a job that tests your versatility.

5) Scalability is not a marketing term

Understanding how systems scale requires the following – differentiating CPU bound and IO bound processes, spotting bottlenecks. Identifying schemes that help you replicate on centralize seamlessly. Sharding work/data cleverly. Being able to play block & tackle with all choices at hand.

6) Writing code fluently

The regular algorithms/data structures thing. I have deprioritized this only because it is axiomatic. No rocket Science.  Learn how some of the concurrent data structures in java collections\. Think of ways to implement them and not just use them.

7) Technology

It pays (sometimes) if you are a HN addict.

How to easily acquire all these skills

There is actually a way to do this. Read academic papers published by top Systems teams in the world. Srihari Srinivasan has a fantastic blog of providing insights into some of the best systems papers out there at Systems We Make. Reading systems research papers can teach some you the Do’s and Don’t s of Architecting Systems elegantly.

If you have read all the papers in this page, you are set to take most interviews concerning systems.

About these ads

3 Comments

  1. Nice article. Unfortunately, very few people see systems engineering as an all encompassing domain. You are more likely to find a job doing a part of what you have mentioned like DB scaling engineer, CDN and distributed resources engineer or an uptime engineer (responsible for data center maintenance). Unless, you were to join a startup :) There you get to do all these and more.

    • Thanks Ritesh. What you are saying is largely true. Some of the larger firms do have “Site Reliability Engineers”. But these positions are generally pretty sought after by people already working in the organization. So unless you have a ton of experience as a Systems person already, it is hard to get prioritized over these folks who already have a reasonable understanding of the moving components specific to their organization. So, yep, realistically the organization either needs to be pretty small / have a fully externally managed infrastructure presence. Those that have dedicated data centers are not realistic at my level of experience/education.

  2. Startups (the right kind) will give you opportunity to indulge your systems engineering love and more. You just have to be prepared to stick with them and grow as needs arise. For instance: the people here http://research.google.com/ probably didn’t know the groundbreaking systems work they’ll do over the next dozen years when they joined a fledgeling “web search portal” in the late 90s.


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

%d bloggers like this: