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.
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.
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.
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.
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.