Saturday, January 28, 2012

How meta can you go?

I'm staring at a configuration dialog. While playing with the connection string for the past hour or so, I've learned the subtleties of how the server expects the parameters to be set in order to finally, dear Lord, let me into the database when connected to the production VPN. The trick, I've found, is to set my connection password to be the same as my user account, but leave the authentication credentials section blank, because otherwise the operating system's access control will prevent the impersonation of my account with no possible intervention allowed on my behalf. It so happens if I leave it blank I may instead enter my credentials di-rect-ly, "doing it live", and things seem to just magically work. So it goes.

I'm staring at a command prompt. I've tried uploading the tgz's four times so far, realizing on the third that if I batch them up into groups of three I no longer get timeout errors or corruption. A few hours back I was getting errors because I misconfigured the SSL certificate on the server. (Who knew you had to paste the public key twice, verbatim, into where St. Apache would be looking for it?) A hoop jumped througheth, another wall hit. With 3AM fast approaching, salvation seems imminent if I simply rate limit the upload script. I'll just throw a sleep(rand(15)) into it at just the right place, making it more human than any AI, really, and this should go swimmingly enough for St. Nagios to pick up the slack forthwith, or at least punt the ball to the Operations Team where it becomes Not My Problem.

I'm staring at a web page. Clearly the boxes are not lined up properly (albeit blurrily as my coffee is wearing off and my eyes are weakening, as I approach my mid-thirties in the web-game.) I've found that if I change the width: parameter for this particular div in this particular CSS class on this particular page in this particular browser, it seems to render appropriately. But *minor chord* Internet Explorer 7 renders it "without layout" and Safari, just to call into question determinism itself, moves it to the bottom of the page, blinking. (But who cares about Safari anyway?) If I abandon the Holy Box Model and indulge myself in the old circa-1999 TABLE with CELLPADDING and CELLSPACING technique, voilĂ , my retina sighs as the box clicks snugly into place. But, TABLE is a faux pas, and my ego will not let me check in such blasphemy else I would further defer my coronation as a Post-iPhone Designer five years hence. So instead, I de-dust the page-inflated, hyper-designed glossy CSS books (written for other, right-brainers) and try to decode what the heck is going on, mentally carving off the coats of historical disease-paint that yield the behavior of the ancient browsers still being mis-double-clicked within The Enterprise. Defeated, I Google "browser hacks" and in five minutes have my Pyrrhic victory.

As software engineers, our minds are filled with enormous amounts of meaningless fact-bits about how to make computer things work. This is the tempered Hammer we use to bend the bits to our will. We fight these battles every day, earning our layers of scar tissue and the right to mock the "bartenders" of the Genius Bar. It is painful, and wrong. (The battles, not the mocking.) We learn the behavior and tricks necessary to get by, often skating past true understanding in order to level-up, ever closer to the elusive Product Launch. In other words, we want to get to the next rush, the next high. Sometimes, these decisions bite us in the ass, but this isn't nearly as common as it should be. (And for this we give thanks to our more disciplined forefathers who provided us sturdy digital shoulders to stand on.) As @dave_revell puts it, "The more I push code through static analysis, the more I'm amazed that computers boot at all." And so it goes. But this human tendency to unintentionally tighten the digital boots (we invented!) to stomp us in the face forevermore is not really the point of this post, since even when we do find CSS-zen, we may be even a bigger fool for spending the time doing so.

The greatest trick a software engineer ever played is convincing himself he was working on an important problem. When dancing with the tiger, fiddling with connection strings, we get an amazing, exhilarating rush when, thank God almighty, we finally Get The Damn Thing To Work. It is truly glorious, as we see our monstrosity come to life in the manner we originally intended only a few short hours (days? weeks?) ago. And, since our fortunes are decided at the speed of light, once the tide has turned, victory is swift and decisive indeed. (At least for now.) But then, like the blistering pinpricks of the morning sun after a night of drunken escapades, realization hits us on the other side asking: "what was I doing, again?"

The endorphins that flow from clearing a technical hurdle are opiates that impede truly critical thinking. These opiates are released anytime we run a program and see it do what we expect, refresh a web page and have it load correctly, see our UI tweak yield improvements in metrics, or watch a log and see stack traces vanish. I have found this observation to be sobering and perhaps even perscriptive in helping me decide on how go about my day. I'd like to think I'm a recovering addict who has, through sheer will and introspection, finally sobered up. For the rest of you, this is an intervention.

The title of this post is, "How meta can you go?" What I mean by this is, how many layers of abstraction can you reflect above what you are doing before you are looking into the void and can say nothing else that puts fire in your belly? If the number of layers is many, good for you -- you are on the right track. If it is shallow, perhaps you should re-evaluate what you are doing with your mind, yourself, and your life. Perhaps I am cynical in thinking that surely some layer will terminate in the void, with you realizing the pipeline you sit on terminates at /dev/null. But that is neither here nor there, the point remains that mentally moving through such abstractions can provide real clarity for you as a engineer and human and is a healthy mental exercise.

An example is in order. In all of my tales above, of which I hope you can relate to at least one, I am trying to decipher the internal magic that is occurring inside the stubborn metal box that, currently, is preventing me from becoming its master. What do I mean by "going meta?" It's simple: during such struggles, ask: "Why?"

Why are you fighting with connection strings? The answer can certainly be reasonable: "It is because I would like to get this database to talk to that computer program." Fine. It could also be unreasonable: "It is because I would like to take a look at the data myself." Maybe fine, but maybe not: is there any other way to accomplish your goal that will work more easily? Often there is, and it may be escaping you because you are unconsciously tightening the tourniquet to inject the opiate of Getting The Damn Thing To Work.

This concept on its own is not revolutionary, but lets keep unwinding the thread. Why are you trying to get that database to talk to that computer program? "Because I would like it to render this web page." Why are does it need to render the web page? "Because if it renders the web page then people will see the data correctly." Why does this matter? "Because people, having seen the data, will make appropriate decisions about what to do next." Why does this matter?

As you move up the chain, you will find yourself transitioning out of the realm of engineering and into the realm of mind, philosophy, and, for some of you, religion. Your own value system comes into play here. Here are some examples of how you might respond to your inner Socrates:

"It matters because if things work correctly I will be paid next month. That matters because it will allow me to keep my family healthy and safe. That matters because ... "

"Since I work in ecommerce, it matters because if decision makers make good decisions, their businesses will run more efficiently and they will have more income. This matters because I know the businesses we work with are honest, hard working people and would benefit greatly from such income. And that matters because ... "

"Since I work in the military, it matters because if decision makers make good decisions, people on the battlefield will be safer and our military objectives will be met with less loss of life. That matters because our military objectives are to bring peace to so-and-so, and that matters because ..."

Now, depending on your own philosophical views or religious views you may find yourself at a "peak" where it is no longer possible to explain why something matters. If you're an atheist, like I am, you may find that in fact you conclude that your actions don't "matter" above a certain level of abstraction, since, "in the long run, we are all dead." Or, you may feel that it does matter because of the rewards that await you in the afterlife. But, this is also not the point of the post. The point of this post is learning to regularly walk the path you take to this peak.

Along the climb, you may find yourself facing some uncomfortable truths. You may, for example, realize that the specific micro-task you are doing is not really providing progress towards a goal. You may be chasing the endorphins.

You may find that the micro-task is valid, but the higher level task you are working on today or this week is short-sighted or over-engineered, full of "interesting problems" without real purpose.

You might find that the task you are working on this week is truly interesting and provides real value to the project. But you might find that the project itself is not very meaningful. You might even be forced to realize what you are working on is unappealing, wrong, or maybe even, for a few of you, evil.

But let's say it is not evil and it is meaningful, you may realize that it will actually have no practical impact due to the particular strategy being taken. Or you may realize that it is flawed due to the people involved in the project. Or you may simply just realize that your time is better spent doing something else, despite the good intentions, since there is such a low likelihood of success.

And so you'll continue upwards you find yourself at a point where you must make the leap from "justifiable" to "unjustifiable" in your actions.

Of course, just because something is unjustifiable doesn't mean you shouldn't do it. History itself can arguably be described as "stories of people who did, according to their contemporaries or to us today, unjustifiable things" (for better or worse.) But, my view is that the farther you had to go to find your crossover into the unjustifiable, the less likely you're simply chasing those local endorphins that are poisons to clear thinking and happiness. If you manage to be content with your answers sans those eternal questions about the purpose of life itself, you should be sleeping well as your questions put you in good company.

Sadly, many people will not get this far: they may find they are caught up in the process of chasing opiates by clearing arbitrary hurdles: be they technical, financial, or cultural. There's nothing wrong with being a dreamer, a tinkerer, or a capitalist. We are all all of these things at some point or another. We make mistakes, we learn, and we understand the world better as we do. But often such mistakes are unnecessary since we are chasing the opiate of the Now at the cost of true happiness and accomplishment. Being aware of your awareness is a wonderful thing. Remember the chains you may have set yourself in can be easily broken out of once you see them as such.