The mind of a computer scientist operates in a superposition of three distinct modes: the scientist, the engineer, and the hacker.
These modes, when combined, enable computer scientists to approach problems uniquely, setting them apart from other fields. This way of thinking is not inherently flawless or even superior to others, but it brings a unique blend of skills that makes us computer scientists thrive in certain types of challenges.
When I say “thinking modes,” I’m not talking about personality types or other pseudo-scientific nonsense. Experienced computer scientists can seamlessly switch between and combine these different thinking modes. These are just tools for framing the same problems from different perspectives and getting the most out of them.
This is how it works.
The scientist mindset compels you to question all your assumptions. It’s what drives you to search for the underlying reasons behind things, to keep peeling the layers of understanding, to keep asking why until there’s no further answer.
There are multiple ways to embody the scientist mindset.
It can be expressed by asking why and striving for a comprehensive understanding. It involves clearly stating assumptions and remaining impartial when judging solutions. It entails being cognizant of your biases and conducting experiments to validate or refute them.
The scientist mindset extends beyond just researchers. While the nature of research clearly requires a scientific approach, every computer scientist possesses a part of the scientist's essence. When faced with a problem, we formulate hypotheses and design experiments to confirm or disprove them. It enables an unbiased pursuit of truth and a determination to uncover the underlying facts.
The engineering mindset revolves around comprehending the functionality of things and ensuring their functionality. It involves solving problems with practicality, using the available tools without being overwhelmed by unnecessary complexity.
Additionally, the engineering mindset prioritizes safety and acknowledges potential edge cases when designing solutions. It recognizes that unforeseen contingencies will arise despite thorough planning and must be addressed at the moment. Hence, some flexibility and adaptability should be built in to handle unforeseen circumstances.
Furthermore, engineering embodies the concept of trade-offs. It entails striking a balance between achieving perfection and accomplishing things. This mindset enables one to understand the concessions necessary to achieve a solution now instead of aiming for the ideal solution that will never come.
The hacker mindset is all about problem-solving. It involves unraveling and resolving problems for the sake and joy of finding a solution beyond any practical or theoretical considerations.
This mindset seeks to comprehend the inner workings of things and determine how to address and overcome issues because it brings enjoyment rather than it must be done. The hacker's mindset is not limited to hacking computer networks or bypassing online security, as typically associated with the traditional meaning of “hacker”. Instead, it is about relishing in challenges and complex problems simply for the satisfaction of solving them.
Being a hacker is about proving yourself your capability to conquer a difficult challenge. It pushes you to maximize the performance of algorithms, discover the most optimal approach to designing a data structure, or identify the cleverest method of implementing a feature because it is fun.
If the scientist embodies thoughtfulness, and the engineer embraces pragmatism, then the hacker exudes playfulness.
Every computer scientist I know embodies a combination of these three thinking modes. But not in a fixed, choose-your-character-type kind of way. It is not a matter of assigning percentages to each skill to build a perfect problem-solver. Instead, these diverse mindsets are all used together at all times, in opposition to and complementing each other.
When confronted with a complex challenge, computer scientists simultaneously draw upon their inner scientists, engineers, and hackers. Although all of us may lean more towards one persona or the other, any successful computer scientist must be capable of invoking any of these three roles when required.
To computer science undergrads reading this, I advise embracing and nurturing these three mindsets. Avoid confining yourself to a single mindset and restricting your potential. Embrace the fact that you contain multitudes. It only makes you stronger.
This is a very elegant way to describe this juxtaposition of roles. While I have definitely embodied all thee of these for years, I have found over the last 5-10 years I have added a fourth mind/role to the mix which I think everyone in this field should nurture/grow as well (including students). I call this one the “reviewer”. I look at what I am producing from the viewpoint of someone who has not seen it before and must review / maintain it. It is this mode that inspires good comments, documentation, commit messages, and breaking that clever/optimized spaghetti function up into something easier to digest. The advantages are clear for work on a team, but often I find that the the eventual beneficiary is future me when/if I have to return to some area down the line (e.g. fix a bug or work on an improvement). Perhaps this is only an aspect of the Engineer, but I find it helpful to explicitly shift into this particular mind.
I like this distinction of mindsets. Although when I read the “hacker” characteristics, I see they all fall under scientist and engineering, too. As someone who trained as a scientist but did research that falls closer to engineering, I think all the hacker characteristics are essential to both science and engineering.
But still, I like the distinction into these three separate categories, nomenclature notwithstanding