The Importance of Second Order Thinking in Software Development

Image by @kaboompics from Pexels

Do you find yourself stuck in endless rewrites? Does your job mainly consist of migrating code from one framework to another? Do you feel like your team just keeps reinventing the wheel? You might be suffering from a lack of second-order thinking.

What is second-order thinking?

To quote TechTello,

Second order thinking is a necessity to think beyond what we know, things we haven’t thought about by applying divergent information and forming new associations and connections.

As software engineers, we often find ourselves caught up in solving the immediate problem that we fail to think about the future implications.

Let us take a concrete example

Say you decided to use an open-source mapping library for your project. You chose this mapping library because the website was appealing, and it seemed easy to use.

One year later, your application is tightly entwined with this mapping library. The library has not been updated for a year and there are security vulnerabilities that need to be updated. The original creators and maintainers are nowhere to be found. Clustering, a crucial requirement now, is not supported by the library and would require you to rewrite significant portions of the library to support it. Your team’s reliance on the mapping library has made it so that no one on your team knows how the library works.

Does this sound familiar?

The reason why we practice second-order thinking is to prevent ourselves from making decisions that give us positive short-term consequences while creating long-term negative consequences.

Will second-order thinking prevent this from happening every time? No. But the problem here is the lack of awareness of the long-term implications of your decision.

Second-order thinking requires us to think beyond our original requirements and constraints. It is time-consuming and requires juggling unknowns and ambiguity. It often requires us to think about topics that are not our direct responsibilities.

Does using the mapping library still save time in the long-term if support is dropped? How does adding this library impact the extensibility of the platform? In what way does this impact security? How does this additional logic impact the ramp-up speed of other engineers? Are there better solutions out there that may provide better long-term outlooks?

You don’t need to have the answers yourself, but I encourage you to be proactive in pulling in people who do have the specializations to help answer these questions.

Second-order thinking may not prevent future rewrites, but it can alleviate a lot of future pain. Ultimately, it will help you create a better product down the road.




Senior Software Engineer in Seattle, Washington

Love podcasts or audiobooks? Learn on the go with our new app.

Recommended from Medium

What is the factory design pattern?

Opening Doors With Unreal Engine

Bluehost review

All about algorithms and functions

Data Quality Roadmap. Part I

Conversation with A DevOps/OpsDev Engineer — Part II

Deep Linking example: Sainsbury’s SmartShop

The GIANT CAP approach to coding for journalists.

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
James Chuang

James Chuang

Senior Software Engineer in Seattle, Washington

More from Medium

Oracle’s Unsustainable Business Practice

Introducing the Core Process for Developing Software

Getting a right software at right time is key challenges for every system architects and growing…

Dependency Inversion Principle 101