Software developers, programmers, engineers — whatever title you’d like to give to the creators of code and architects of systems — all follow a similar methodology when it comes to putting their brains to work.
The act of creating things is a process and sometimes this process is not taught explicitly. Here are a few ways to train up your brain up to think like an engineer.
Look for Patterns
The world is full of patterns. From the way things are shaped to the behaviors we experience and exhibit.
Patterns are the things that make our world function the way it currently does. Patterns take input, processes it, and produce a correlating output. When the input remains the same but the process is different, the output may produce different results.
When you actively search for patterns, you can make deductions on future events, behaviors and potential expected outcomes. This knowledge can be applied to the software you’re building and help you design better systems.
A piece of software is essentially one big programmatic flow chart. The effectiveness of the flow chart — its ability to help someone navigate through each point — depends on how well everything is organized. The ability to identify this relies on your ability to recognize patterns.
So — look for patterns. Get good at seeing them and you’ll start to see the world as one big machine that can be deconstructed and rebuilt to produce the expected outcome.
Efficiency Over Ease
The easy path in programming doesn’t always equate to the most effective path. This can come in the form of
if else statements and loops vs. looking at the problem for what it is and determining if there are alternative ways to abstract, modularize, compartmentalize and potentially automate an idea.
These things require time upfront but they can save time you in the long run. As an effective engineer, you’re looking to invest your time in something that will pay dividends.
This is different from over-abstraction. Over-abstraction is the act of paying upfront for an architectural decision that results in more work than the promised return over time. The decision is often made with a far-future path in mind, with no concrete trajectory of events or requirements to lead to that outcome.
Over-abstraction can sometimes disguise itself as future efficiency. True efficiency is experienced when it’s created and enjoyed at a nearby date.
There’s No Right or Wrong — Just Specifications
A quote that’s stuck with me since I first heard it was from the series Westworld. I don’t remember what they were discussing but it played out something like this:
Elsie: Does that make this a glass-half-full or half-empty-type situation?
Bernard: We’re engineers. It means the glass has been manufactured to the wrong specifications.
Engineers, by definition and profession, create solutions. Each solution has its own unique set of requirements and specifications. Your task as an effective engineer is to uncover the real specification.
This is because marketing, your boss, operations and everyone that wants something from you may not know how to talk to you or communicate the correct specifications. What they tell you and what they actually mean may be mismatched.
It’s like going to the hairdressers, asking for short hair, then coming out feeling like they’ve shaved your entire head. Your idea of short may not actually be the hairdresser’s technical understanding of short. Neither of you is wrong — but you’ve had a miscommunication of requirements.
To be an effective engineer, you need to understand that not everyone will speak the same dialect when it comes to communicating requirements. It’s your job to ensure that you’re both on the same page.
Create What You See
An engineer’s task is to translate the world into a form that’s accessible by others. The task of translation can go through different perspectives and lenses, resulting in a version that’s far from what reality requires.
The most effective engineers don’t tend to overthink this reality. They take it for what it is. Transformation only occurs when ideas on improvement come into play, but that’s a different discussion. Overthinking often leads to over-abstraction or complications.
Not everything needs to be created from scratch but an effective engineer will understand how the inner workings of a library, framework, or package work. They don’t implement things blindly and don’t always jump to creating something from scratch, unless it obviously needs to be done.
The creation process is a balancing act between reusing what others have done and building something new. Sometimes, the solution — the most effective and the one that satisfies time, budget and human resource constraints best — is to melt two ideas.
Divide and Conquer
Effective engineers can see the big picture, abstracting a machine down to the working cogs.
A divide and conquer mode of thinking means breaking a big problem into smaller parts, until it becomes easily solvable.
When faced with an issue, an effective engineer approaches the problem calmly, solving the pain points by breaking the task down. In a team, these problems are distributed among the team, with a clear understanding of expected output. The output links each part together to build a bigger whole.
The ability to recognize patterns is applied. Efficiency is balanced. Requirements are properly uncovered for the true set of specifications.
The efficiency of an engineer depends on their ability to implement and create something out of nothing. Sometimes they’re given sand to play with. Sometimes they’re given bricks and stones. Whatever the situation and environment, an efficient engineer is able to step back, figure out the space they’re given and deal with it accordingly.
There’s more to programming than just code. It’s a series of soft skills, resulting in the recognition and analysis of patterns while experimenting with processes to generate a specific set of outputs.