Two years ago, I reflected on my experiences developing software from 2014-2016. This is a continuation to that post as I reflect on my learning progress from 2017-2018.
Since 2016, I’ve learned a lot more about software craftsmanship and had the opportunity to work with some talented individuals and teams. My learning progress can be attributed to two sources. The first source is through the six co-op work terms that are mandatory for our degree, which accumulates to two years of experience working in the industry. The guidance offered by mentors, osmosis of skills from interacting with colleagues, and code reviews are invaluable to personal growth, and I’m very grateful to those who took the time to teach me. The second source is from individual learning, such as reading software-related books, completing Coursera courses, and working on hobby projects.
It also goes without saying that there is still a lot more to learn; I’ve only scratched the surface of a deep basin of software knowledge. One of my goals for the next 5-10 years is to be able to read and actually understand parts of the C++ standard. I’d also like to become proficient working with concurrency models, such as multiprocessor computations, multithreading, and asynchronous execution. Some time down the road, I may even go back to school and get a Master’s degree related to machine learning or big data. Ironically, the more I learn, the more I realize how little I actually know. There’s the saying that imposter syndrome is common in this industry, and I would think that I’d fit in as part of that statistic.
Anyways, that’s the future. Let’s pick up where the previous post left off: right after my third internship at SMART Technologies in late 2016.
Starting in 2017, I was back in school seeking a fourth internship. This was perhaps the first time that I rigorously practiced algorithm problems and passionately skipped classes. Luckily, I had a number of interviews, including one from a Silicon Valley startup called OptumSoft. In hindsight, applying to this startup was not a rational decision: I had few of the skills outlined in its job description and my grades were less than mediocre (the job description said ‘candidates must have exception grades and excellent academic standing’). Its main product line involved compilers, of which I had only a surface understanding, and distributed systems, a concept I had never even heard of at that time. It’s also worth noting that the founder was a professor at Stanford University and also a billionaire whom our CS department was named after. AFAIK, the startup worked with some complex stuff.
Luckily, I completed the interview well and after accepting OptumSoft’s offer, I spent the rest of the term preparing for this upcoming opportunity. For fun, I also finished my childhood dream of building a keylogger. To learn C and practice working with Linux and GDB, I read K&R and implemented a web server that partially conforms to HTTP/1.1. I also read a little bit about distributed systems.
More than any term since or after, I felt a tremendous amount of imposter syndrome. The upcoming term would be the first time I intern in Silicon Valley, working with advanced technology and interacting with Stanford PhDs at a startup founded by a successful entrepreneur/billionaire– pretty much the stereotypical definition of innovation. This was very much outside of my league and comfort zone.
Among my six internships, the internship at OptumSoft was the most technically challenging one. It was my first time working with Fedora and command-line tools. There were also several proprietary tools to learn and the codebase was not easy. It’s intimidating when you do a backtrace on GDB and out pops a stack of 40+ functions. Luckily, my mentor was extremely supportive and offered lots of guidance. One inspirational sentence he said to me after I broke the build trying to optimize the processing order was something along the lines of: ‘Perhaps a genius hacker can solve this issue by hacking things together, but you and I aren’t geniuses. So let’s do this incrementally, one step at a time.’ Coming from a Stanford PhD, who had basically perfect grades throughout academia, this implied that it’s okay not to rush.
Unlike stories about other teams, everyone at OptumSoft was also humble and helpful! I was quite taken aback actually, that although each member was talented, nobody acted like an egoistic hothead. Even the founder was down to earth and I appreciate being assigned to work with him on a project.
During this time, I became interested in embedded software and began learning about the Raspberry Pi. After a month of hacking, I built a Wifi/Bluetooth-controlled car. After that, I deliberately decided to take a break from studying programming after work.
Coming back to school in September 2017, I sought an internship working with embedded systems, which turned out to be more challenging that I had thought because none of my past work experiences involved embedded systems. Nevertheless, I did manage to get an offer, but had to decline because the hiring manager kept pushing me to make a decision, as early as when half the interview cycle remained.
During this term, I also worked as an Undergraduate Research Assistant at our Image and Computing Lab to assist a PhD candidate, Thilan, with investigating the ICtCp colour space. Thilan introduced me to image processing and the various technological aspects of movie productions. It turns out that the supervising Professor, Zhou Wang, was a renowned leader in image quality assessment and cofounded a startup called SSIMWAVE. This turned out to be relevant during one of my interviews related to video compression and C++11 because the hiring manager was aware of SSIMWAVE and the professor’s work! That interview lasted for around 45mins and most of it was us discussing about what the manager’s team did and their tech stack.
At the end of the interview cycle, although I didn’t find a suitable embedded software position, I accepted the offer to work with video compression. Afterwards, a large part of my time was spent on learning about video compression and reading “The H.264 Advanced Video Compression Standard, 2nd Edition”. I also learned basic C++11 concepts, such as its smart pointers and move semantics. Like in previous terms, I continued my campaign of skipping classes but somehow, my average this term was the highest since coming to university!
2018 was a dramatic year. To summarize this year: things that shouldn’t have happened, happened; and things that should have happened didn’t happen. I also learned a lot more about software development this year. From January to April, I interned at Evertz, a company that built broadcasting systems, such as video encoders, splicers, and routers.
I worked with an implementation of the H.264 codec and gained experience developing in C, using ffmpeg, and resolving linker errors. Afterwards, I designed a test system to verify that our video encoders/decoders were working properly. It’s unfortunate that I didn’t get to work with C++11, as had been mentioned previously, but it was still a learning opportunity. During this term, I had more experience working in a cross-team role and collaborating with several other colleagues. One of my main takeaways from this term is that video compression is hard.
After work, I learned about Python’s data libraries, such as numpy, scipy, and scikit-learn, as well as took a Coursera course on machine learning. Then, I took another course on text mining and built a program that played music according to the text a user reads on their screen. It was a good exercise working with NLTK, scikit-learn, and gensim. Machine learning is making huge waves throughout the tech industry, with ripples appearing in other industries, but it’s really nothing more than glorified curve fitting (note: this statement was intended to be funny, it may not be factually correct, especially since I still don’t really know much about ML).
During this time, I also bought a lot of cryptocurrencies. As of today, December 31st, prices have fallen by more than half. As you can guess, I’m not a happy camper.
Having completed five internships at mostly small and medium-size tech companies (CIBC was large much but it wasn’t a tech company), I longed to work at a large one. The bigger the company’s reputation, the more I was attracted to it. After a stressful interview cycle, I landed a position at LinkedIn on a machine-learning infrastructure team. I would be heading back to the Bay Area. One reason this interview cycle was tough was because I prepared for both embedded development positions as well as general software development ones.
It was a relief to finally escape the stress of interviewing but once that was over, I had to deal with how far behind I was with coursework. On top of that, I began preparing for my upcoming internship by learning Kafka, Docker, a bit of Spark, and Java 8. Sadly, it would be later revealed that knowing the former three skills wouldn’t be relevant for the position. Out of curiosity, I also read parts of the curriculum for the distributed systems classes. I learned a lot during this term and was happy to be interning at LinkedIn soon, but, without doubt, this term was one of the most stressful ones I’ve had.
During every co-op term, I programmed after work. But this time would be different. Even before my plane touched down in San Jose, I made it a goal not to program after work unless it was absolutely necessary. Except for the first week, when I was brushing up on some Java 8 syntax, I committed to this goal. I spent a lot more free time reading about economics, psychology, trying out different restaurants, and hanging out with friends.
At LinkedIn, I worked on a framework team and designed a system for internal clients to inject plugins into the framework. There was a lot of emphasis on building a clean architecture and I appreciated the many design considerations that had to be made. In fact, there was so much emphasis on design that I actually had to write a design document, which needed to be approved, before implementing the program! My favourite corporate event was our weekly reading group, in which we read selected book chapters in advance and members from various teams shared their thoughts.
In addition to learning about how to design systems, I also learned more about generics and concurrency practices in Java, mostly because our codebase frequently used them. Overall, interning at LinkedIn was an educative experience.
Two years may not seem like a long time, but it’s almost half a university degree. In 2017, I learned more about software, built a couple hobby projects, worked as a Research Assistant, and interned at a great startup. In 2018, I continued to learn about software development and became more fluent in thinking about software designs and writing clean code. I made a lot of progress was made in the past two years but there still remains a lot more to learn. Steve Job’s quote, “Stay hungry, stay foolish”, is as applicable today as it was when he first said it in 2005.
There appears to be a positive correlation between my technical ability and my communication skills. I noticed that as I become more confident in my technical skills, I’m also becoming better at collaborating with colleagues and being more precise in my explanations or requests for feedback. This is probably because of (1) a greater understanding of a tech stack enables more expressive communication, and (2) since I’m more confident with my coding skills, I could focus the energy that would otherwise be spent on improving programming skills on building human relationships.
Looking back, I notice that it’s easier to work with and ask for help from people whom you’ve built a relationship with. Likewise, if the person you’re working with can’t stand your guts, don’t expect to get much done working with them, even if their manager had told them to help you (this comes from first-hand experience, some of which is truly outrageous! There are all kinds of people out there. All I can say is that dealing with them were…educative experiences). Building relationships is important, not only because it facilitates getting things done, but also because working with people you enjoy interacting with makes the work so much more enjoyable and fun. If you’re spending 8 hours a day in the office, might as well as spend it with people who enjoy interacting with.
Imposter syndrome, which has been with me since my first co-op term, now affects me less than it did two years ago. This decrease in imposter syndrome comes from several factors: gaining more technical knowledge, working with some talented teams, confronting challenging situations, and comparing myself to classmates. The old adage, “Fake it till you make it” proved helpful when dealing with imposter syndrome.
One important lesson I realized lately, which I’m trying to implement into my lifestyle, is that life is not a sprint; it’s a marathon. This may seem obvious when you read it, but when you’re in the heat of the moment dealing with a lot of stress, it’s so tempting to sprint, especially when you think everyone else is sprinting. Eventually, after years of sprinting, you become really stressful and tired, and realize that all the sprinting wasn’t even necessary to start with! I wish I had understood this principle a year ago, which would have made life so much more enjoyable and fun. Oh well, better now than never.
Anyways, I learned a lot during the past two years. Let’s see what happens in the next two years.