Contents

Hard Problems

Ever wonder how some of today’s hardest problems are solved? I do all the time, well at least in the software realm.

Problems like operating systems, complex distributed systems, modern programming languages, advanced machine learning, browsers, etc.

Each problem sounds impossible. And although they aren’t impossible, they are hard!

Lets talk about how those problems get solved.

Composition

Operating systems can break down into a kernel, drivers and a few other (also complex!) problems to solve.

A Kernel can be broken down to:

  • Memory management
  • Process/thread management
  • Interfacing with device drivers
  • Handling multiple CPUs
  • etc.

And each of the problems above can themselves be broken down into even smaller problems.

At the very base of the tree, there are problems that are small, easy and solvable.

In other words, solving hard problems is about:

  • Breaking them down into a tree of smaller problems
  • Solving the problems bottom up
  • Possibly restructuring the tree as you go, adding more problems, removing others, etc

Hard problems have massive trees

Lets talk about browser engines. Those are the programs in your browser that know how to render HTML and CSS - they know how to run JavaScript, they expose many APIs for web applications to consume. They are one of the most complex pieces of software out there.

To help demonstrate how massive the browser problem tree is, there are over 52,000 web platform tests, and about 2 Million sub tests (I got those numbers from this article). Web platform tests are a cross-browser test suite that modern browser engines are expected to pass.

So how does Google, Mozilla and Apple pass all those tests? Time and lots of effort.

Most problems you and I face are hard, but not massive

You are likely not building a new operating system or browser engine but that doesn’t mean you can’t take the same approach with the problems you are solving.

Next time you are tackling a problem that seems complex, try creating its problem tree. Try not to solve any nodes until you complete the tree. It’s an enlightening process and turns seemingly unsolvable problems into a set of small, easy, solvable problems that you can knock out.