All posts by chris

Understanding the Problem

In recent weeks I have come across a number of readings and videos, which brought forward something that, in hindsight, had been nagging me for a very long time. Unfortunately I cannot provide a list of said material, because it has all happened subconsciously and only just “erupted” a few minutes before I started writing this.

The subject in question is the relevance of understanding a given problem for determining a solution. This sounds totally obvious if not even a bit silly, I admit. How would anyone be able to work on a problem that is not understood? But it becomes less silly if we re-phrase things a little bit.

So far the wording implied a somewhat binary view: Either the problem is understood or not. But in reality very little is truly binary. So instead we could say that the level of understanding of a problem is the primary driver for the outcome of the attempt to solve it. Admittedly, this still sounds pretty obvious.

The next stage in dissecting would be to say that a problem needs to be understood well enough to find a sufficient solution. And here it starts getting interesting, since we basically have an equation with two variables.

The first is about being “sufficient”. Because of resource constraints most problems will be approached with the aim to apply only a “just good enough” solution. In my profession (software engineering) this usually means a quick fix rather than a clean approach with refactoring and all the other good stuff.

What I personally consider more impactful, though, is the “well enough”. Most people I have met so far, do happily go for the first explanation of a problem and consider it a sufficient basis for determining how it should be approached. But in many cases this means only that the symptom has been identified correctly. Neither has the direct cause for the symptom been found, nor the root cause. I see several reasons why people jump onto the “obvious” reason so eagerly rather than to dig in.

  • Different layers: Like in medicine the symptom, the direct cause, the indirect cause(s), and the root cause can be in different “hemispheres”. In business this could be customer churn, caused by bad customer support, caused by a missing link in a process, caused by misalignment of two separate organizational units, caused by personal animosity between their bosses.
  • Motivation and personal objectives: Unless people have a mind that genuinely strives for perfectionism, they will factor in their personal objectives to determine how much energy to put into something. And in most cases this simply means to invest as little effort as possible.
  • Importance not considered high enough: While the personal objectives point above is, at its core, about a selfish decision to optimize personal gain, this is about a perceived objective lack of importance. If I genuinely believe that something is more or less irrelevant, why would I bother (irrespective of personal gain)?
  • Happiness to have found anything: This is basically about impulse control. Rather than exert self-control and think about whether or not there might be other and/or additional aspects, people simply jump onto the first thing that comes their way.
  • Lack of knowledge: The difference to the happiness point is purely the motivation. While the result is the same, the reason here is sheer necessity, since people do not know enough on the subject. So they are just glad to have come up with something at all.

When you follow the line of argument, you will have the fundamental reason why larger organizations so often struggle to even solve the simplest challenges in a proper way. Instead you will mostly see a myriad of changes that are applied, at best, with local optimization in mind. The latter, unfortunately, means that you are almost always moving further away from a global optimum. What good is it for a company if one department improves the financial bottom line of the current quarter at the expense of disgruntled customers that spread the word?

What Kind of Job is Right for You?

I recently came by an interesting article that examined a certain personality aspect and what it means for choice of job. That aspect was the desire to make your own rules in the workplace vs. enjoying to optimize something given. Obviously someone who does not like to work under imposed rules will be better off by starting their own business rather than joining a large organization. So far, so good.

There is, in my view, an additional “angle” to this. Looking deeper into the optimization of existing rules, processes, policies, etc. there are two conceptually different levels to do it. The first is gradual improvement, and I suspect this is what most people think of. It basically means that you do your job and once you have enough experience and the appropriate mindset, you start seeing opportunities where things can be done better.

But where it really starts to get interesting is when we talk about radical changes. A current example is the switch of large parts of the software industry to a subscription-based licensing model. This has implications for an enormous variety of aspects (and their KPIs for that matter). A few examples would be

  • Sales: Strategy, staff training
  • Finance: Treasury, reporting, investor relations
  • R&D: Release planning, product quality
  • Legal: Contracts (number, variance, …)

The problem with the examples above, is that it is a purely functional view. The latter, by definition, creates challenges for processes that cross functional boundaries. And I daresay that most core processes are not confined to a single department these days.

So, coming back to job types, what do I do if I have a really fundamental understanding of the situation and its challenges as well as great ideas how to handle things, but do not like corporate politics? I am certain that those three factors (truly understand the problem, have a sound solution, no politics) are a fairly typical combination.

The reason lies in what kind of jobs people with a certain personality typically choose. The people who are interested in deeply understanding things are usually more on the reserved, and often introverted, side of the spectrum. Also, they typically hate office politics and just want to do a great job on the “content level”.

Coming to a (preliminary?) conclusion this means that in most organizations people have three options and they come down to the old “love it, change it, or leave it”. I can accept office politics as a by-product of a really interesting job and learn to live with them. Most people, I guess, will stay silent and just do their job but more or less quit internally. And a few brave souls will look out for something new.

My Problem with Conventional Wisdom

More and more I have realized over the last few years that I have a really big problem with many positions that are considered “conventional wisdom” or best-practice. And this goes for a wide variety of topics: software development (which I consider my main competency), technology as a whole, management, career planning, strategy, etc.

In the areas where I have developed a high level of expertise it has been clear for the longest time, because there I could easily see what conventional wisdom usually is: An oversimplified version of the true matter, that anybody can talk about assertively after having spent one or two hours with it. It is a bit like at university when after a 90 minute lecture some people really think they now understand what normalization in the context of the relational data model means.

But in reality the conventional wisdom is usually the lowest common denominator, and that only for a specific context. If you understand this and take it as a starting point for a real discussion, that is fine. But never fool yourself and think you have understood the topic. Unfortunately, this is a somewhat unpopular position and many people are offended by the mere suggestion that something is more complex than they thought so far.

What makes this a problem is when you combine it with another conventional wisdom: “Any decision is better than no decision.” Really? I think it is downright stupid. Of course, one should avoid what is called analysis paralysis and define a threshold for when a decision needs to be made. But all too often it is just an excuse to make a decision without having the slightest clue what its consequences are. Or to quote Herodotus (484-452 BC): “Quidquid agis prudenter agas et respice finem” – whatever you do, do it wisely and consider the end.

Back to the actual topic: Assuming that conventional wisdom comes into being roughly the same way for all subjects, this also means that you should stop accepting it for things you don’t know much about. Think of it as a news clip-version of something really complex. It is probably not completely wrong, but certainly an extremely limited version of the true matter. If you want to understand things, you need to dig deeper.

When looking at this from a strategic point of view, conventional wisdom in many cases means the same as commodity. If you are a product company (and that includes software) going for what everybody else does, will not help. Rather, you should spend some time thinking what you want to do really well. Believe me, it is not convincing when you interview four vendors and they all tell you more or less the same. All you know after such talks is that none of them really has a grasp of the business they are in.

Conventional wisdom will allow you to play it safe in terms of office politics, but not in terms of market success. Is that what you want?

Performance and Thread Count

I have seen many mails and forum posts, which sort-of imply that increasing the number of threads working on a task will speed things up overall. This is a dangerous path to follow in many cases, because it has the major drawback of adding overhead.

In some cases there is a range where the increase of parallelism indeed improves the situation. But that is only because of very particular performance characteristics. Basically what needs to fit is the ration of in-system execution time vs. wait time for other systems. And the critical “side” condition for the other systems is that there is no resource congestion/conflict there: I.e. if you decide to add more load (by increasing the number of threads on your side) to an external database that is already maxed out, how do you expect your code to run faster?

Lastly, there is neither a one-size-fits-all number of threads to recommend, nor can one always say that adding threads will make things better at all. The opposite can happen quite easily and it always needs proper testing with full load. Putting the latter onto the system is harder than most people think, unfortunately. But the benefit will very often be a profoundly improved understanding about the application and especially its TRUE bottlenecks. Parallelism will almost always yield results very different from a single-threaded execution (e.g. when run from your IDE).

Let me close by saying that in a surprisingly high number of scenarios, and again there is a number of pre-conditions associated, a single-threaded execution will give the highest performance (which we have not defined as a term at all here, by the way). This is because the overhead mentioned at the beginning kicks in. If you manage to have your code run such that you reduce or even eliminate cache misses on the CPU, you can see improvements by a factor of 10,000+ (and that is really not percent but a factor). But in general the effort to achieve that outweighs the usefulness; unless we talk about things like high-frequency trading of course.