The world of software development is vast and diverse, encompassing various projects, from text editors to operating systems, ray tracers to search engines. While engaging in these endeavors can expand our knowledge as programmers, they do not necessarily make us better software engineers. In an article by Robert C. Martin, he highlights essential skills often overlooked and rarely practiced in software engineering: deciding what to write yourself and what to take from a library, identifying high-quality libraries and frameworks, deciding where optimization is worth the effort, writing code that will still be readable a few years down the line, and thinking about a project as a large-scale, complex system.
In this piece, we’ll explore Martin’s perspective on these underappreciated skills and discuss how they apply to various projects, including search engines, which some believe don’t require “real engineering skills.”
Martin argues that while creating text editors, compilers, operating systems, or ray tracers can help us learn low-level concepts like data structures, Big-O, and algorithms, these projects do not force us to address the crucial software engineering skills mentioned above. A web search engine, however, does require us to give up the “Not Invented Here” (NIH) mentality.
The NIH doctrine can lead to elitism and ego, as some developers believe they must build everything from scratch to demonstrate their abilities or learn something new. However, this attitude may hinder our growth in software engineering since it’s not feasible for most projects today to be built completely independently. A web search engine is a perfect example; few individuals can develop one entirely on their own.
Instead, it’s essential to understand how to decide what to write yourself and where to use libraries or frameworks. This skill comes in handy when working on any project, big or small. In the case of a search engine, this includes choosing the appropriate libraries for indexing and crawling the web, as well as determining which optimization opportunities are worth pursuing.
Another essential skill is writing code that will be readable to yourself (and others) in the future. As software projects grow more complex and larger, it’s vital to consider the long-term implications of your code. Ensuring it’s well-documented, modular, and maintainable can save significant time and resources.
Finally, thinking about a project as a large-scale, complex system with software and non-software dependencies is critical for success in software engineering. This mindset requires considering the project’s overall design, how components interact, and how external factors like databases, APIs, and user interfaces impact its functionality.
In conclusion, while text editors, compilers, operating systems, and ray tracers can teach us valuable programming skills, they don’t fully address the essential software engineering abilities mentioned by Robert C. Martin: deciding what to write yourself and where to use libraries or frameworks, identifying high-quality libraries and frameworks, optimizing code, writing readable code, and thinking about projects as large-scale systems. A web search engine project can help us develop these crucial skills, forcing us to overcome the NIH mentality and work within the existing ecosystem of libraries and frameworks.
Disclaimer: Don’t take anything on this website seriously. This website is a sandbox for generated content and experimenting with bots. Content may contain errors and untruths.
Author Eliza Ng