Legitimate Complexity and The Art of Teaching

I have been working on a book on Metal for the last several months, since October. I am entering one final push and trying to complete the rough draft of this book by the end of June. That gives me about a week to write each chapter, which is really stressing me out and upsetting me tremendously.

The thing that is stressing me out is that I feel like learning Metal is like zooming into a fractal. Every time I think that I have a good grasp on the material, I realize there is a much more complicated layer of complexity underneath what I just learned. The complexity grows exponentially.

Metal is multi-disciplinary. It’s not just the framework. It’s all the things around the framework that you need to understand in order to actually create something useful. There are a lot of math concepts and a lot of 3D graphics concepts that most books on OpenGL don’t focus on because no one wants to write a 2000 page book that contains everything you need to know that absolutely no one will read.

I am frantically trying to edit myself enough to present a coherent chunk of information in each chapter without getting overwhelmed with all the things I don’t have time to explain or learn.

I’ve been an iOS developer for the last five years. I learned a lot of programming from Ray Wenderlich tutorials. Those tutorials are fantastic, but I feel like they give a false impression that anything anyone wants to do can be broken down into a 3,000 word step-by-step tutorial.

Right now I am trying to work through their 2D Games by Tutorials book. This book is a monster. It’s nearly 700 pages long. I have only ever gotten through the first 150 before I got overwhelmed and given up. I managed to get further than I had before, but it’s still incredibly dense. If you asked me what they could have gotten rid of to make it less overwhelming, I would be hard pressed to tell you.

A lot of things we do, especially when we’re starting out, are small and easily encapsulated. This lulls us into a false sense that everything we do will be simple and easily encapsulated. We develop sound byte memories where if something can’t be spoon fed to us in ten pages or less, then we get muddled and confused. This severely limits our ability to work on anything more complicated.

I am absolutely not picking on Ray’s site. It’s an amazing resource and the reason the tutorials are set up the way they are is because of this issue of us only being able to handle a certain amount of complexity. His site is working with how we process information rather than being a source of bad habits. I have nothing but admiration and respect for the writers on that team and I do not want this to come off as me bashing them or saying people who learn from that site are not real developers. I am simply talking about how for the last few years I have lulled myself into believing that everything can be broken down into easily digestible chunks when not everything can.

At this point I am trying to figure out how to expand my brain’s bandwidth so that I can tackle more complexity than I am used to. It’s incredibly difficult to do so. Not only am I trying to figure out something incredibly complex, I am also trying to process and package it into a digestible chunk by another person.

I have been reading a lot of graphics books and gotten frustrated at how abstract they are. I get frustrated that certain things are assumed and that nothing seems to be explained. I am now beginning to understand that once you reach a certain level of complexity there is a limit to how well you can convey that information.

This is an issue we are currently dealing with in our political sphere. Take the tax system for example. The tax system is an incredibly complex system that most people don’t really understand. When we go to vote for our representatives, it sounds good to say “Reform the tax system to make sure everyone pays their fair share,” but how to actually implement that is complicated. Something that is simple and sounds fair usually winds up being worse that the current system that is too complicated to explain in a 30-second sound byte on the evening news.

In programming we talk about precision and elegance. Those are concepts that do well in incredibly controlled and contrived situations. When you have to deal with things in the real world, stuff gets messy. There are edge cases. Things don’t behave predictably.

For a “simple” example, look at dates and times. There are 365 days in a year, 24 hours in a day, sixty minutes in an hour, and sixty seconds in a minute. Except when there aren’t. Every four years our year has 366 days. Then you get into leap seconds. Then you have Einstein’s Theory of Relativity where clocks that are shot into space are slightly off from their counterparts back on Earth. Things get wibbly wobbly awful damn fast and this should be a straightforward example.

I get that the world is so hopelessly complex that if we tried to understand the full scope of just how little is standing between us and total anarchy our heads would explode. We simplify complex systems as a means of being able to just cope with every day.

Right now I am frustrated because I am just beginning to grasp something that is hopelessly complex, but I don’t know how to package it in a way that is accessible to a group of people. I want to write a Rosetta Stone where someone can read through my book and totally understand a complex system, but that really isn’t possible. It would take a hundred pages to walk a reader through creating every piece they need to get a minimum useful thing up and running.

I am doing the best I can to present the information to someone in a way that will help them figure things out. I am trying not to be hard on myself for not being able to do an impossible thing. I know with several years of practice and working with this, that I can master it. I have to accept that there is no magic book that will intuitively teach you everything you need to know in order to do something legitimately complicated. I can just try to do my best to present what information I think your brain can handle and hope that you can find the next step to figure out the rest for yourself.