2017 Year in Review
This has been a whirlwind year! I completed my final set of coursework towards my PhD and was admitted to PhD candidacy with distinction! Gwen and I celebrated our 1 year wedding anniversary, and had several other significant personal milestones. I presented several projects at regional and international academic conferences, and submitted my second publication on a super-cool new memory management technique. I interned on the Mobility and Networking team at Microsoft Research, and finally I am set to start as an Infrastructure Engineer at Stripe next week.
I started a PhD in 2015 for two reasons: primarily for the opportunity to do research in the systems and programming languages (PL) area of computer science, but also to fill in gaps in my computer science background that come from being largely self-taught.
I wanted to summarize some of the high-level takeaways I got out of core courses I took in 2017:
Many problems in computer science can be framed as problems where you the are searching for a node or path in a (possibly infinite) graph. If you can be creative about how you think about your problem, there are lots of existing tools and techniques that can be applied, from SAT solvers to planners.
Additionally, joint probability distributions are important, but expensive to compute and re-compute.
There is more to security than block ciphers, and while I feel a lot of privacy research is vital, a lot of it isn’t really interesting to me. Routing attacks and zero-knowledge based protocols are super neat.
The first semester that I got to grad school I read the IronFleet paper – it was incredibly exciting to read about formally verified distributed systems, and I’ve wanted to learn more since. Logic is the foundation that programming languages and formal verification in particular is built on.
I’ve worked on building systems and distributed systems in industry, but this summer was the first time I have really been able to dig into the literature around testing and building distributed systems.
The big question we were focusing on this summer is “how do you efficiently test distributed systems, and how do you know how effective your tests are?”
My internship at Microsoft Research this summer was challenging. Not
only was this a new area for me research-wise, but I haven’t used
Microsoft products in about 10 years. Microsoft Windows and C# are
drastically different than the last time I used them, and C# is now
based around task-based asynchronous programming (TAP). Similar to
Promise, a C#
Task along with the
language keywords is a way to write sequential code that may block in
a way that is efficient to execute.
Not only are these tools very different from what I’m used to, the
debugging techniques that I am used to on Linux straight up don’t work
on Windows. There is so much information I’m used to being able to
access on Linux through
/proc and standard Linux utilities (like
strace), that don’t have good analogs on Windows.
Finally, there were practical aspects around building distributed systems that I had to research and learn in a Microsoft environment, like “what RPC framework should I use”. We ended up using Bond/gRPC, but if I were to do it again even just 6 months later would probably just use protocol buffers with gRPC.
At the end of the day I learned a ton, but coming up to speed on so many fronts at once was stressful and meant that I didn’t make as much forward progress on the research aspects of the project as I wanted.
I am very excited to start at Stripe next week!
On the technology front, it looks like I will be back on a Mac laptop. It will be interesting to figure out the debugging analogs to what I’m used to.