Learning Notes - How necessary are the programming fundamentals?

So it's 2:00 am, I've lost sleep and I decided to write my weekly notes. Then Bruno Rocha's article pops up.

Some Context

I've been having thoughts of and I'm actively working towards solidifying my CS background. The more I speak to people about this, the more exciting it sounds. This article came right in time.

It trys to answer three frustration most engineers with a less rigid CS background ask when faced with algorithms and CS fundamentals at job interviews.

  • The questions don't reflect what the person will actually do in their job.
  • The questions are not indicative of the person's skill in the role being interviewed for. (the job is often for a specific platform, but the questions are almost always completely unrelated to it)
  • The questions, in general, are pointless. Why does an iOS developer need to know how sorting functions work?

These questions are genuine and I've asked them at some points (last week). But I've seen it in a different light after reading Bruno's article. These are my learnings...

1. You'll eventually do more composition work

Details of music theory will only become relevant when the person starts wanting to compose their own songs.

The kind of work you do changes as your career grows. I've experienced this firsthand while working on avocado. Building an interface in react is different from building a design system or library for building interfaces.

2. You'll be a better programmer

Music theory has also an implicit application, which is that people who learn music theory become better musicians in general... Another implicit benefit of music theory is that it applies to every instrument. All they need to learn is how the instrument is played...

The author draws from music theory to explain the importance of learning the basics. This resonated a lot, basically because I have a decent music theory and also because I know musicians with little or no knowledge of music theory.

These are exactly the benefits that learning CS Fundamentals provide you in everyday programming. Even though you're not "composing your own algorithms", your knowledge of how computer science works provides a serious boost to your programming ability in general. The difference between music and programming is what exactly is "boosted": While a musician that knows the theory will be better at designing and understanding music, a programmer who knows the theory will be better at designing and understanding systems. A person who doesn't know programming theory is perfectly capable of creating a good product from the user point of view, but it's likely that they will be severely hindered from a system design point of view.

3. You'll approach problems differently

One thing I've come to dislike about knowing only Javascript and web development is that it limits me. It limits my thinking, my approaches to problems, and tools for solving them. I want to be able to pick a tool because it's the most appropriate for a problem, not because it's the only thing I know.

It's important to understand however what it's meant by system design in this case; We are not talking about concepts like clean code and SOLID, but how correct your code is from a design, performance, and resource management point of view. Note that correctly doesn't mean "this code must use this ultra-fast obscure algorithm a Russian man published in 1970, otherwise it's wrong", it simply means that the code you're writing makes sense from an engineering standpoint. I'm gonna say it again: Stop thinking that the fundamentals are only about coding obscure algorithms!

4. You'll be better at solving more novel problems

While in regular companies you are likely to be hired to perform a very specific role as a specialist, larger companies like Google are almost always focused on engineering T-shapedness and generalism... even though I work primarily with iOS, there were many cases where I task I was doing involved checking code that was outside of iOS, like a relevant piece of Android code, the functionality of a C++ library, or even writing a new data pipeline inside our backend

while a regular company is trying to solve a small-scale problem that has likely been done before, top-tier companies have to deal with enormous problems that nobody has ever faced, which often requires them to be masters in multiple platforms. It's not interesting for a company like Google to hire someone who dedicated their life to understand all about UIKit in iOS... their problem is not that they don't know which UIKit APIs to use, is that the APIs they need don't exist at all

Last words

Go read more articles from Bruno! and thanks for reading too.