Complexity and Simplicity in Computer “Science”
A thought struck me the other day as I was considering the fundamental problem behind the coding industry. I just finished reading the book “Dreaming in Code” by Scott Rosenburg. The story tracks the progress of project “Chandler” over the course of 5 very bumpy years. It vividly shows the struggles of large scale projects — all the while exploring some of the potential solutions.
One of the most inherent issues is the solo coder. Over and over we reinvent the wheel, we tack extras features into a system long after we should be adding things. It’s as if the industry as a whole is learning how to cook, and at this point it means throwing as much stuff as we can into a pot and hoping it cooks properly. Every once in awhile we walk away with a master piece, but more often than not, we take a sip and say “That isn’t quite right, what if I added etc…..”
Where is the issue? I believe first and foremost we need to understand what complexity is. Complexity is when you see a whole idea and are left confused as to what the function of the individual components that make up the whole. If the individual component’s purpose is not immediately self-evident, we say it is complex.
There is another version of complexity, when individual component’s role is well understood, but conceptually what they come together to create is not necessarily self-evident, and thus is considered confusing and complex.
And yet in many industries we have advanced past complexity. What is the purpose of a car? It is a way to move quickly from point A to point B. What pieces make up a car? Wheels, engine, hood, seats , lights, mirrors , etc… The thing is, despite the complexity that makes up a car, the purpose of what a car is trying to accomplish is crystal clear.
If you cannot answer what you are trying to code, if you can’t say what your end result is aiming for, I am going to be as bold to say that you are doing it wrong. You are throwing more crap into the pot. Simplicity is king, more often than not we go above and beyond what we are capable of in a reasonable time line.
This leads to the next important question. What is simplicity? Simplicity is perfection, because the idea of what said thing does is immediately apparent. That is what we need to strive for. Many of you reading this will say: “Software is very complex , there is no way to have a large project that is not complex.”
Strive for it. Truly understand the purpose of every component of what you are trying to create. Be able to show what is being done. Have a crystal clear vision of what the end point is. Know before you throw away your time. Often times we throw ourselves into a mess before we can simplify it in our mind. There is too much trial and error, and not enough carefully planned forward implementation.
We are so far away from computer “science” because we act as if we are outside the law of inefficiency. Don’t strike out into the wild without knowing what you are getting yourself into. Have simple plans with simple goals. Simplicity is perfection.