Many years ago I was a consultant at a financial institution in Chicago that was making the move from mainframe technology to an object-oriented approach using C++. During a code review, I asked one of the developers why he chose a particular type of data structure and he replied that he looked at a colleague’s code and just copied her approach.

Following is the lesson I shared with him: every line of code you write involves tradeoffs. These can be tradeoffs of space and time (speed vs. memory), read performance vs. write performance, any number of factors. And the art of good software engineering is understanding what those tradeoffs are and choosing deliberately.