What I Learned as a Software Engineer

Sunnyvale, May 07, 2022

Understand the problem before trying to solve it.

No matter how pressing a task is or how easy a problem seems, always make sure you clarify all the requirements, collect enough data and make thorough analysis before you work on your solutions. Oftentimes we see newbie programmers diligently engaged in voodoo programming, experienced engineers fervently pitching their theories before any investigation, and talented people working on sound solutions to the wrong problems. These people may have a speculative motive to reach a goal through some shortcut, or they may have more passion for exhibiting their calibre than knowing what’s actually going on. As a result, sometimes they produce crack cures that fail in the long run, or, more often than not, just run into fiascos immediately.

There is a single version of truth, but could be multiple valid perspectives.

Everyone’s knowledge about the objective world is just an approximate model. As human beings, we have to save mental energy by building simplified concepts and narratives to interpret what we observe. Even established scientific theories are based on limited samples in the experiments and thus have a bias. Inevitably, every theory has its limitation, but on the other hand, each tends to have its own virtue. For example, Newtonian mechanics is still widely used in practice due to its simplicity, even though we know it does not universally hold true. Likewise, in everyday life, we may easily overlook other opinions and perspectives when we already have a theory in mind. Sometimes our understanding might be sound enough, but listening to different voices is always beneficial since it helps us to spot our blindspots and step out of the local optimum.

Stick to the problem rather than your solution.

As an engineer, we are both scientists and artists. When we look into a problem, we are doing an evidence-based scientific research. And when we work on a solution, we are creating some art that balances costs and benefits, pros and cons. One mistake we might make is obstinately holding on to the solution, the design and the plan we have, ignoring new data, new circumstances and new requirements. Instead, we should adapt to the changing situation, since we, as problem solvers, are flexible, while the problem itself isn’t. I had quite a few experiences in the past where I had to dramatically change my original proposal half way through my projects in order to overcome some unforeseen hindrances and to lower the risks of late delivery. They were undesirable at first thought, but turned out to be wise decisions in retrospect.

Trade-offs are ubiquitous in software engineering.

Nature does not allow us to obtain too many good things at the same time. Just as with every other decision we make in life, software design decisions are full of trade-offs. In real-time computation, we trade accuracy/optimality for latency and memory. In storage engines, we trade write performance for read performance. In distributed systems, we trade consistency for availability. Examples can go on and on. Thus in everyday software engineering, no choice is absolutely right or wrong. Every tech decision has its pros and cons and deserves some debate.

Software is more like gardening than construction.

I got this idea from the book The Pragmatic Programmer. We tend to think of software development as building construction, but it is actually more organic and flexible than that. Unlike buildings, software is up to change at any point and is seldom a faithful materialization of the original design.

Plan ahead, but embrace unprepared situations.

Just as many other things in life, it takes deliberate planning and preparations to succeed in engineering projects. In order to move forward smoothly, we always need to look ahead and take upfront actions accordingly.

Never let a good crisis go to waste.

Seek to understand people, not to judge them.

As software engineers, we don’t just work with code with machines, but also work with people. If you want to get better at predicting and influencing people, you need to take one step further than just judging them as right or wrong. Human beings have the attribution bias, meaning we have a tendency to attribute others’ behaviors to their personal dispositions, although we would attribute the same behavior of our own to objective situations. This bias comes with many downsides. First, we would be less empathetic than we could be, as we tend to interpret others’ mishaps as the result of their own mistakes. Second, we would fail to take lessons from others’ experiences and miss the educational values. Last but not least, we would develop a biased mental model for predicting people’s behaviors in the long run, leading to inadvisable decisions. So instead of making a judgement, stand in others’ shoes and reason about their behaviors in their situations.

Never try to influence others by showing them they are wrong.

If you want to persuade someone by winning a vigorous debate, or change their minds by pointing out their mistakes, please think twice. Human beings, as self-serving animals, don’t work in that way. We are such dumb creatures that we selectively ignore our own faults, find evidence to support our standpoints, and demonize those who make us feel bad about ourselves. Of course, that doesn’t mean everyone is insane and that striving for open-mindedness is a wild goose chase. My point is that such psychological bias is pervasive among ordinary people and should be taken into account for effective communications. To better communicate, start a conversation by showing consent and appreciation, and then insinuate your idea by letting people feel it belongs to their own thoughts. For more soft skill techniques, I recommend the classic book How to Win Friends and Influence People.

Leadership is more than power and mandates.

First of all, I’ve never been a leader or manager myself and never learned about leadership before. But as an individual contributor, I’ve observed both good and bad examples of leadership in different organizations, so I’d like to share my two cents here.



Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Devin Z

Devin Z

认识世界,改造世界 (Seek truth and solve problems)