Fundamentals are the building blocks for engineering excellence
A friend asked me recently if there's any reason for him to brush up on his datastructures and algorithms, considering that he's never used them in his day-to-day as an technical lead at a local digital organization.
I find similar questions and comments fairly frequently on the engineering subreddit, and scattered around stack overflow. Comments about having once taken an algorithms class, never to have used it. Or having once memorized the runtime complexities of common sorting operations, long forgotten.
It's true. You don't need to know these things to get a job as a web or software developer. You don't need to be able to find optimal solutions to Leetcode challenges to be able to create a React app, and you don't need to be able to calculate runtime complexities to launch a startup.
But there are reasons your organization might want to start raising the bar for engineering fundamentals, and there are also reasons why individuals themselves would want to get ahead of the curve.
The reality is that the examples I gave above don't require deep engineering. Leveraging frameworks is a great way to focus on productivity, which is often the edge required in the competitive market of startups and digital agencies. If the company has clients willing to pay, that might be the only metric the company cares about in terms of whether the product is good enough. At least for at that particular moment in time.
Nothing lasts forever, and digital moves fast. Organizations and markets change and must change in order to survive. Engineering fundamentals contributes to how an organization is to be able to handle technical changes over time.
Change opens a window to risk: what happens when clients demand products to be better? Faster? What happens when engineers are introduced to new pieces of technology? What happens if your best developers leave? What happens if the team needs to triple in size?
A baseline of engineering excellence can mitigate against these risks, and this starts with engineering fundamentals: having an understanding of what makes code performant and at what cost. Software engineers use fundamentals for the communication of scope and contraints when discussing solutions, and these details enables design validation before code is even written. Imaging how much time is saved by identifying early on exactly where the bottlenecks will be.
An engineering team with with strong engineering fundamentals are able to communicate effectively in technical designs, code reviews, and group discussions. They can more effectively weigh different solutions, and can more effectively "right-size" a solution. They can more easily adapt to new technologies and languages, and hiring is less risky when the technical interview process prioritizes fundamentals over specifics.
If fundamentals are valued in the organization, the entire organization department grows more cohesive and robust because of it. Members can switch teams more easily and more frequently. Pivoting a product to a new market or purpose will be easier to accomplish.
Taking a more personal approach to engineering fundamentals: as an engineer, you will likely outlast your current position. New jobs will likely not care about the domain knowledge or context of your previous job, but will care about your fundamentals, your ability to break down and justify a solution, and how quickly you can jump into a new stack.
Being able to defend a solution to a particular problem using runtime complexity is often simply be the easiest and most straight-forward answer, and conciseness is a quality that every professional should want to improve on :)
Hiring for Fundamentals
If you are looking to improve your hiring process, I definitely can recommend the following books. They provide an excellent overview of how to achieve a desireable, challenging, and even fun technical interview.
Brushing up on Fundamentals
If you're looking to brush up on your fundamentals, I can highly recommend Interview Cake. Once you're caught up on datastructures and time/space complexities, you'll be able to use that knowledge to more effectively tackle programming challenges.