In some ways, 2019 has been a pivotal year in my growth. I’ve started to gain a better understanding of my interests, strengths, and weaknesses. Originally, the title of this post was “2019 Retrospective”, but this topic turned out to be too broad. Therefore, I decided to narrow it down to what I have learned in 2019. This year for me felt more about breadth than depth of knowledge. But thinking back on it now, this “breadth” was in more focused areas.

In 2018, I spent the better part of my time learning the fundamentals. This meant reading software engineering books that topped nearly all recommendation lists, including: The Mythical Man-Month and The Pragmatic Programmer. I finished most of Stanford’s algorithms course1. And finally, I started Structure and Interpretation of Computer Programs (SICP).

Below, I will enumerate what I learned and worked on. I want to keep in mind, that when I say learned, I mean it is something that I actively decided to become better at. Perhaps it is more fitting to change the title to “Things I Worked To Get Better At”. This is less flashy and attention-grabbing, so permit me to have this little cookie! I will do my best to keep this in chronological order (starting from January), but this is not guaranteed.

◆ SICP/Programming Languages

The first 3rd to half of this year was spent working through SICP. I had previously started it the year before, and multiple times before that. I made a resolution to finish it this year. And I did!2 This includes working through all the exercises as well as watching all the video lectures. It was a mind-expanding book and so very well worth the time commitment.

The first two chapters were the most difficult to start, as someone who had no prior knowledge of Lisp syntax and a very beginner understanding of functional programming. The last two chapters were definitely the highlights, in particular the metacircular evaluator was a blast to work on.

SICP showed me beauty in programming. This ineffable quality that we see in art, I began to see it and appreciate it in code. Those quotes3 and jokes I read about regarding Lisp started making some sense. I’ve gained considerable interest in programming languages and programming language design. One of my projects for 2020 is to write a Scheme interpreter and compiler!

I also wrote my first Brainfuck interpreter. It is simple and basic, but it was very enjoyable to write. I was introduced to BF back during my Recurse Center days by @WAptekar and was both intrigued and mystified.

◆ Unix/Linux

Ever since I started using vim as my daily driver, getting comfortable working within the terminal has been one of my biggest objectives. I had started to get familiar with most of the GNU tools such as sed, find, grep, etc. However, most of my work was on a Mac and I found it lacking when it came to these utilities.

With that in mind, I finally got myself an older model Thinkpad and installed Arch Linux on it. This has been a wonderful learning experience. Arch has a minimal and simple philosophy. Every tool that I took for granted on my Mac I had to manually install. Luckily, the package manager is fantastic with many many up-to-date packages. This also means that I can be conscious about what is actually living on my computer.

I’ve started to understand the filesystem hierarchy, the Linux device model, and began to poke around within the kernel. I enjoyed working through OSTEP during RC (shoutout to the OS group!) and found that helpful in understanding how Linux works. The more I dig deeper into Linux, the more I realize there is still so much more to learn.

◆ Systems/Infrastructure/Automation

Half-way through 2018, I started to gain an appreciation for system design. I gravitated towards it and would read countless blog posts and books on proper system design. I believe, coming from medicine, my mind is naturally wired to think in systems.

In order to put more effort into understanding systems, I got myself a small VPS from Digital Ocean and began using it to host small projects and to connect these interlocking pieces. I took this a step further and bought a Raspberry Pi with the intent of hooking it up to the internet and using it as a simple server. I wrote about this in a previous blog post.

Wherever system design is mentioned, automation is the next natural subject. And so I learned Ansible to automate my manual work. I find myself thinking about how I can automate any repetitive task. Currently, I use Ansible for my dotfiles. There is still so much more to learn in this area, and I believe I will spend the most amount of my time invested here in 2020.

Things I want to learn in 2020

For the most part, the three topics listed above will be my focus areas of 2020. If 2019 was about finally finding my interest “depths”, 2020 will be about putting more effort into increasing my depth of knowledge in these areas. And finally, I want to put more effort into writing more. I have found that writing tends to put my thoughts through a strainer, clarifying them.

  1. I highly recommend this course. Tim Roughgarden is a phenomenal instructor. You can find my notes here↩︎

  2. “Lisp is worth learning for the profound enlightenment experience you will have when you finally get it; that experience will make you a better programmer for the rest of your days, even if you never actually use Lisp itself a lot.” -ESR ↩︎

  3. You can find all my notes and solutions to SICP here: ↩︎