Skip to content

Where Are You Thinking?

December 8, 2013

Yes, that is exactly what I mean — Where, not what.   This article seeks to get you thinking about your thinking.  The goal is to give you a simple conceptual tool to aid you in focusing your thinking so you and your team can be more efficient and productive in doing software engineering.

Remember a time when you were so wrapped up in some small aspect of a software design or implementation that you completely missed something really big and important?  Once realized, the typical response is “Doh!  How could I have missed something so obvious?”  The old adage “I couldn’t see the forest, for the trees” applies here.  Or, I couldn’t see the big picture since I was completely absorbed in some small part of it.  Given the complexity of software, this is not surprising.  But it does take time.  Especially if you did a bunch of design or implementation without considering the missing information, and then have to do it over again to account for what you missed.  And when a team collectively does this, much, much more time is consumed.

So, here is the “thinking about thinking” technique that can prevent you from “not seeing the forest, for the trees”.  There three “Levels of Thinking” that one can productively use in all phases of software development.

  • Concept Level
  • Interface Level
  • Implementation Level

And these 3 levels are in a hierarchy, as shown above.  Very briefly, Concept Level thinking results in black boxes, their definitions, plus their interrelations.  Interface Level thinking results in complete terse descriptions the capabilities a black box offers the outside world.  And Implementation Level thinking focuses on the grubby details of the code that implements the capabilities of a black box and its interfaces.   Keep it simple.

In all the tasks you do in software engineering, you get to choose which level of thinking you are going to use in each particular task.  I hope you are starting to think about your own thinking, here.  Note that you may rely on habit or unconsciously seek to work within your “comfort zone”, and thus not consciously choose the level of thinking that you use.  And for most software developers the Implementation Level of thinking is the most habitual and/or comfortable.

So what happens when we are doing Implementation Level Thinking without having done sufficient thinking about the concept we are trying to implement?  Or without sufficient thinking about the interface(s) our implementation must satisfy?  What happens is that it takes more time — Maybe a little — Maybe a lot.  And when other people are involved even more time is spent, as a multiplier effect kicks in.  Some of this is avoidable.

So asking yourself “Where are you thinking?” from time to time can have a good payoff.  You have to be honest.  Are you doing a lot of Implementation Level thinking in a Requirements meeting?  Or (even more of a time sink) has the entire conversation of a Requirements meeting left the Concept level where it belongs and landed in the Implementation Level?  Having Levels of Thinking as part of the “Team Vocabulary” can save a lot of time and keep meetings (requirements, design, etc.) on track.  “Wait a minute!  Where are we thinking?” can turn this situation around and refocus a Requirements meeting on Requirements and Constraints, rather than upon the Solutions and Implementation Details that Implementation Level thinking focuses upon.

When you are implementing code and things get difficult, do you need to bubble up and do some more work at the Interface Level or Concept Level before proceeding with the code?  Learn to often ask “Where am I thinking?” and “Where do I need to be thinking to get a solid solution”.  As an individual, that can keep you on track.  One thing that stands out to me is how much easier and faster everything gets when I clearly understand the concept(s) I’m dealing with.

Also learn how to navigate between the 3 Levels of Thinking.  For example, when doing the detailed design of a WCF Data Contract, learn to make a mental bookmark and bubble up to the Concept Level and take a look at things from that higher level perspective from time to time.  Bubbling up to higher Levels of Thinking is generalizing or holistic thinking.  One of its great advantages is that the high level perspective allows you to better see the synergistic opportunities in a system, that make the whole greater than the sum of its parts.  Synergy can lead to significant increases in productivity.  On the other hand, reductionist thinking drills downward, ultimately to the Implementation Level.

Once you learn to use this technique (and it may take some practice), you will find yourself able to look at your work from different perspectives at will, effortlessly navigating between the various Levels of Thinking.  You will save significant time by reducing the amount of time you spend doing rework.  And occasionally you will see synergistic situations that save lots, and lots of time and make things much easier.

Now you have a useful tool to aid you in thinking about your thinking in day to day software development.  I’ve found it invaluable since I read about it in 2007 in a book or article by Martin Fowler.  When I first read it, it really rang true, solidifying an intuition I’ve had for years. Thanks so much, Martin!  I would include a proper citation but I’ve lost the source.  Thankfully I’ve not lost the valuable idea.

George Stevens
Creative Commons License

dotnetsilverlightprism blog by George Stevens is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. Based on a work at

Leave a Comment

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: