Many faces of programming

I developed software for various computing devices during my lifetime. When I started I had a certain goal, or end game… if you will. These days I see a vastly different person in the mirror compared to when I started, and that got me thinking, “I wonder how everyone else sees me?” Hi, I’m Cliff. You’re here because you write code and nobody else truly understands what you do. I’m here because I share your story. The following is an abbreviated history of where I started my career and where I currently am. It attempts to capture how the people in my life view me and how those views evolved over the years.


As a software guy I have always been misunderstood. It’s hard to describe, in words, where the disconnect is. Take the following exchange as an example:

So my wife says, “Go to the supermarket and get me a gallon of milk and if they have eggs get 6.” When I came back she was furious with me asking, “why did you buy 6 gallons of milk??!!!”

I replied, “Because they had eggs!”

The problem exists in the different vantage points the people in my life have. In the beginning of my career I was all about backend work. It was mostly legacy AS/400 but then I got into SQL with DB2 and… well, here’s a decorated description:

(Disclaimer: The author has shamelessly linked to artwork from various corners of the internet to make a point. Any similarities with what you find here and real life scenarios is purely coincidental…)


The DB2 SQL Database Programmer

What my mother thinks I do

What the Starbucks barista listening to my conference call thinks I do

What I think I do

What my clients think I do

What I actually do







I eventually moved into General desktop client/server programming. I felt the need to convey my career change to loved ones but I truly don’t think they understood where I was headed.

The General Desktop Programmer

What my grandparents think I do

What my uncle thinks I do










What my wife thinks I do



What my neighbor thinks I do

What I actually do

Eventually I moved into more modern technologies landing my first job working for a major dotcom company. I got my first Blackberry, then my first iPhone along with other cool mobile computing toys.

The Mobile Developer

What my older daughter thinks I do

What my younger daughter thinks I do

What my best friend thinks I do

What I think I do

What I actually do


…and finally I came to understand that not only do different vantage points color my perceived reality, also my choice of programming language has a huge impact on how I attack problems. The next illustration explains how various programming languages would shape ones overall college career.

Programming Languages in College


How to Suck At Programming #739

Quickly create a patch for a single file edit using “svn diff” and then review the word wrapped command line noticing you forgot the file redirect operator “>” in the command so let’s put it in the first blank spot your eyes detect after the word “diff”…

svn diff my/complicated/path/to/the
/single/file.m > my-last-minute.patch


svn diff > my/complicated/path/to/the
/single/file.m > my-last-minute.patch

#Songsincode – It was fun while it lasted

Activity seems to have slowed significantly on the #songsincode trend on Twitter. It’s just as well since we all have day jobs and need a lot less distraction. I posted a few of my own. For those of you that didn’t figure them all out here’s the expanded list:

Take out the paper and the trash! Or you don’t get no spendin’ cash!
-(double) get {return getpaper && trash == taken_out ? spending_cash : nil} #songsincode

Stayin’ alive, staying alive! Ah-ah-ah-ah…
it=new Thread(go); try{it.start();} catch(InterruptedException e) {it.start(); out.println(”ah-ah-ah-ah” + it.isAlive());} #songsincode

Stayin’ alive, staying alive! Ah-ah-ah-ah…
foreverTask = new Thread(this); while(foreverTask.isAlive()) {System.out.println(”ah… ah… ah… ah…”);} #songsincode

Everybody dance now! Let the rythm take control, let the rythm move you
everybody.each { Date()); } rhythm.take(new Control()); rhythm.move(you); #songsincode

Whitney Houston: If I should stay,
I would only be in your way.
So I’ll go, but I know
I’ll think of you ev’ry step of the way.

if(i.shouldStay()) yourWay.contains(i); else { i.go(); for(eachStep : theWay) i.know(i.hasThoughtsOfYou); } #songsincode

Kriss Kross: some of them try to rhyme but they can’t rhyme like this 4x
4.times{ someOfThem.each { them -> assertFalse this.rhyme.compareTo(them.tryToRhyme()) : “can’t be done”} } #songsincode

Seal: I compare you to a kiss from the rose on the grey. Ooh, the more I get of you the stranger I feel… yeah!
[@”you” caseInsensativeCompare:@”a kiss from a rose on the grey”]; while([self get:@”you”]) {NSAssert([self feelStranger]);} #songsincode

Notorious B.I.G. If you got a gun up in your waist please don’t shoot up the place
Cause I see some ladies tonight who should be havin my baby

if(you.gunUpInYoWaist()) {please {shootUpthePlace(NO)} } else { ladies.each{ i.see it.canBeHavingMyBaby() } } #songsincode

Michael Jackson: C’mon with the force don’t stop! Don’t stop ’til you get enough!
MJ RIP: while(true) { if(you.getEnough()) break; else keepOnWith(THE_FORCE) } #songsincode

Bobby Brown: Every little step I take, you will be there every little step I make, we’ll be together…
2.times{ [1..99].step {assert you.willBeThere() && me.isTogetherWith(you)} } #songsincode

R. Kelly: I believe I can fly
I believe I can touch the sky
I think about it every night and day

thinkAboutIt = {i.setBelief({ assert i.canFly() && i.canTouch(getSky())})} nightsAndDays.each { thinkAboutIt() } #songsincode

How To Suck At Programming #392: Type your password into your AIM window

You’re on AIM blast. You’re having fun with your buddies, talking tech and shooting the breeze. You pack up to leave work early and run some errands. Just before signing off you can’t resist cracking one more dumb joke. “…and that’s why Budweiser employees don’t use Java!”, goes your reply to one of your AIM buddies. That triggers one more round of discussion about Hibernate, Anheisuer Busch, and the stock market. Yes, those are three topics that are totally unrelated but you don’t care. You tied them together in your twisted programmer humor-logic and made “a funny”. Good for you! Glancing at the clock in your Windows taskbar you notice you’re already ten minutes late! Windows Key+L locks your machine and you storm out of the building.

Arriving home after running back and forth across town to pick up odd items for your daughter’s 5th grade project, you have a chuckle at Judge Judy as she embarasses the plantiff just before awarding her the maximum amount of $5,000. That loosely reminds you of the last couple of tasks you neglected to finish before running home for the day. After firing up RDC (Remote Desktop Connection) on your Mac, you’re quickly greeted by the Windows desktop log in dialog to which your fingers instinctively dance over the letters spelling out your password. (This is, of course, the same password that you use for all of your online banking, bill payment, blogs, Twitter, and Facebook accounts.) A breif pause and the AIM outgoing message chimes. “That was unexpected!”, you mumble quietly in your skull. Your brain slowly pieces together the chain of events and colors the truth behind the chime. You weren’t sitting at your desk even though the Windows screen fooled your brain into believing you were. You were working remotely using RDC, a nifty program that can actually cache your log in password saving you the 8-12 characters that you’re too lazy to type if you don’t have to. You muscle memory just exposed your one-size-fits-all password to all of your buddies on the AIM blast that you never signed out of. Good job. You just saved over 8 key presses at the expense of the 80,000+ it will take to reset all of your accounts, explain the finger fumble to the blast group and more.

So if you wanna suck at programming, type your password into your IM window. Not only will you expose your darker secret Flickr account to all, you will have a lifetime of sleepless nights wondering “did I ever reset my other other email account?”

How To Suck At Programming #473 Thief in the night

It’s 11pm. I’ve pretended to weight train in the basement for about an hour. My wife’s out of town. The kids have had dinner and are off to bed. I’ve killed twenty minutes or so fooling with YouTube and misc web articles and I’m now off in a development zone. The world disappears around me. Nothing exists except for the keyboard the Mac touch pad and my IDE.

Out of the blue my “Spidey Senses” grab hold of me to alert of an in-home intruder but it’s waay too late! Sneaking up from behind, I turn around to learn that the intruder is already on top of me. My heart drops, muscles lock. My internals drowned with adrenaline, I wanna leap up to defend myself but that would be unnecessary. This intruder is less than my shoulder height when sitting. Besides, my frozen, fatigued muscles leave me helpless in my seat while my brain trails to keep up with the action.

The body is way ahead of the brain as it already sees its death from the would-be 3 1/2 foot assailant. The internal organs have already moved from shock to shit stains while my grey matter performs what feels like a SQL Server deep index algorithm in the foreground. Using all the random pictures that my single threaded mental process could gather, I try to piece together pixel by pixel inside the unknown silhouette. I begin to feel a sense of familiarity with the figure. Still my body is stuck in fight or flight mode. Two mickey mouse circular shapes load up first as my linear search answers a series of sequential questions. “Mickey Mouse? No! Jerry, from Tom and Jerry? Not at 11pm! Chucky Cheese? Uh-uh!” Now its been 2 seconds that feel like 8 hours and my brain is convinced it knows the invader while my left arm is ready to throw a punch at the soon-to-be victim. “…Must …continue round 12 of Pictionary!” urges the sponge in my head. “Must… swing with full force”, my body fights back in disagreement.

As second three ticks away I’m finally able to defrag enough raw material in my skull to make out the picture of my 5 year old daughter who is now witnessing Daddy have a seizure. I fight to rescind the attack order from my left arm and replace with a hug order given to both arms. It’s too late. The damage is done. What could have been a warm greeting from daughter to Daddy has turned into the trail of tears as the adorable nighttime hoodlum weeps and informs she needs to go potty. Of course my under reaction to her presence disappoints as she obviously wanted to square up in a death match. I send her crying to the toilet while a sea of angry relief washes over me. If you wanna suck at programming have kids. Not only will you miss the opportunity to fix the double screen-drawing bug that will take the better part of the following day, but you’ll have lots of fun explaining… from the emergency room… to your spouse why your youngest child asked, no begged for an uppercut to the jaw.

(No children were harmed during or prior-to the writing of this post. However the author reserves the right to jab, kick, stab, and/or shoot random figures that suddenly appear within arm’s reach after 10pm regardless of age, height, stature, gender, or religious background.)

If you don’t know, now you know

While ingesting text written by John I-Didn’t-know-you-had-a-cool-blog Flinchbaugh I choked on some good ideas. It’s typical that I’ll be back-slapped by a site which is kinda interesting and spend a good hour or two treating the hypertext like that home made stuffing that the wife cooks in November. You know how you try to cram as much down the ol’ food pipe before the sensory receptor thingies in your stomach lining are aware of the assault? That’s how I blow through a weblog skimming over the flow, the choice of font, browsing the categories. It’s common that during the cram, certain not-so-soft things… turkey bones, cloves from the ham, apple stems because you blindly shovel random entrees on your plate without regard for what’s adornment or what’s edible… are consumed during the process. These items deserve special attention but are mixed with the thing you are shoveling into your system with the end result being an abrupt halt in the progress of consumption. (Am I talking turkey or techie? It must be close to Thanksgiving…) You naturally pull out the thing blocking your airway and examine it. Let’s look at this together.

Starting with the layout, when John first showed me his site I was like, wow… that looks like plain text. After I left the office and brought it up again after hours, I got it. It’s brilliant! Mind you, If you’re not a developer and you’re just looking for something to read you might not agree. But c’mon! Javadoc style posts? a comment section that follow Java syntax? I love it! That’s not the bigger piece I choked on. Various references to gimp only made it part way into the air pipe triggering the gag reflex. I just started trying to use Gimp even though my graphics tool of choice remains Xara. I’m looking at gimp because it’s cross platform. I’m now in a position where I constantly switch between Linux, OSX, and WinXP and depending on the time of day or flavor of the cheddar I may find the need to edit an image. I don’t wanna haff to think about my OS, which features are available, or launch a VM to get the job done. (On Mac I normally launch Parallels to run Xara, a task that’s now taking much longer than it takes to perform the actual edit.)

John mentions making an NFS mountable. I’d been having trouble mounting my Linux box from my Mac using MacFusion maybe I should look at mounting differently? Using a different protocol? (Can Mac easily mount an NFS share?) As much as I dabble in Linux, NFS is one of those things I never dealt with. I always used either Samba or SSH.

Lot’s of other gems on Too bad I hadn’t known about it sooner. I guess I never thought to click the link in your comments.

SSH tunnels and remote port forwarding

If you want you can skip the beginning blurb and go right to the recipe.

Every so often you face a tough problem then someone sayz to yuh, “Cliff, have you tried ssh tunnels?” (well that’s what hey would say to you if you were me, and if you were me you would have a habit of making easy problems way tougher than they need to be while you make tough problems easy.) That’s what happened to me a loooong time ago… like around last month. The I was chattin’ with the VP of technology about all things Maven and mobile related explaining how clever we were with our solution to on device testing when he suggested we try ssh tunneling. I read an article that day and got excited because it looked soo easy. Then I made a promise to our mobile dev team that I would prototype it over the weeken. Then I quietly forgot about it. Today the question came up again and I was like, “Oh crap! I never did try prototyping a solution to that problem!” I gave it a good hour of effort before getting stuck. It’s really not that difficult, and after leaving for the day, coming home and attacking it fresh I found that I only had one minor problem… I didn’t read the docs completely. (That’s how it goes when I see something cool. I jump in head first and complain because I always miss something simple and fundamental.) Silly babbling aside I present you the how to on what to do to get to your CPU thru EC2…
(or any other public remote web host)

1 Remote server running a flavor of ssh. (In my example I assume openSSH as it’s prevalent across many Linux distros.)
1 local computer that you desire to access also running a flavor of ssh (I’m using OS X in my example.)
2 Eggs slightly beaten whites removed.

1. Combine one additional parameter with the default sshd_config file under our server’s /etc/ssh folder. Use vi, nano, kate, gedit or a fancy command like the following.
sudo echo ” GatewayPorts yes” >> /etc/ssh/sshd_config
[For best results supply password when using the above crazy command.] The parameter name is GatewayPorts and the value should be yes to allow clients other than the server itself to tunnel into your local machine.

2. Execute one sshd restart command to allow the new parameter to be considered on the server. Eg.
sudo /etc/sshd restart

3. Add -R [remote port]:localhost:[local port] to 1 1/2 cup of ssh command typing slow to avoid error. The remote port is the port number you wish to tunnel through on the remote machine while the local port is the port you want all traffic to be directed to on the local machine. Eg.
ssh me@myremotehost -R 80:localhost:9002
This can be used to forward all web server requests to a server app running on the crappy Compaq that you used to execute the ssh command.

That’s it! The net result would be a service running on your desktop/laptop/MacBook in your garage appearing as if was running on the public remote web host. So then you point your browser to http://myremotehost and your home equipment gets all the traffic. The secret is the “GatewayPorts yes” property that must be set in the remote host’s /etc/ssh/sshd_config file. That secret value bypasses all common sense security allowing anybody on the internet to peek into your home located machine and access the pictures of you and the kids looking burnt up at Daytona Beach, FL.

Now why would you want to do that? There are all sorts of possibilities that arise when you start playing with tunnels. First off, they run through the security of secure shell, a robust tool that I’ve only begun to understand the capabilities of. (It seems like ssh can do everything from being a secure channel, to enabling sFTP, to being a mountable file system allowing Windows explorer like file browsing, to recording those 10:30am episodes of Judge Judy while you’re at work. Yes, ssh can do that too.) Tunnels work both ways, remote forwarding and local forwarding. If you were behind a firewall that allowed connections to remote ssh hosts but blocked some other port/protocol you could sidestep by doing something similar to the above but substituting the ‘-R’ with a ‘-L’ for a local forward. Then all the traffic sent to the machine you run the ssh command from would be forwarded to the remote host. It’s so simple! Setting up a tunnel is a matter of specifying the port you want to forward from and the port you want to forward to! Use your imagination, and happy port forwarding!

How To Suck At Programming- Put a mandatory reboot at the end of your install script

You have created the slickest software this side of the east coast! People will literally chew through the concrete enclosing the office that houses your cubicle just to get their hands on your latest release. You’ve managed to find a niche that nobody else had even considered. You will become an instant success. Now all that stands between you and the yacht you’re sure to be cruising is the loading of your software on an end user’s machine. You’ve got low level hooks into every facet of the host operating system. That’s what makes your software a killer. Explorer shell integration, low level kernel ties that catch signals on disk writes, the works. A reboot is necessary to activate all of the bells and whistles so at the conclusion of your install sequence you trigger not an optional, not even an ignorable, but a mandatory reboot enforced by a modal dialog box. No time to consult the user, you’ve gotta get your binaries out there so you can sip Pina Colada on your way to Cancoon. The user will understand right? After all everybody reboots all the time! Plus with ubiquity of the Windows operating system it’s almost an oddity to not hear individual computers constantly restarting and playing the Windows startup theme in a busy office.

Never mind the critical and possible unrecoverable work that may be in progress as your installer runs on the desktop of an unbeknownst user. Forget about adding a cancel button so that the save button on an Excel spreadsheet trapped behind your installer’s modality may be clicked. Give no warning about the soon to come power cycling because it’s O.K. In fact it’s so ok that ok is what you put on the only responsive screen widget at the tail end of your installer. The install has completed… square an ok button center of the screen. How about that conclusion message? Pick the best wording to enlighten your users, “You computer has been updated with my killer application which is way more important than the thousands of lives you were campaigning to save with your silly little editorial in the background. Don’t bother trying to drag this dialog out of the way as I have taken liberty to dominate your entire workstation with my insistent dialog. Click the only responsive rectangular button in the middle of the screen to trigger an immediate shutdown and restart rendering the thirty other open windows meaningless and obsolete. Thank you for installing my product and please take the time to fill out my survey which will automatically launch in your browser once your machine regains consciousness.”

So if you wanna appear as arrogant S.O.B. developer, totally screw up somebody’s day, change the tide of the upcoming election, and ultimately suck as a software engineer put a reboot at the end of your install script. The remainder of your installer’s good work will only last a minute but the loss of productivity and pain of unrecoverable work will last a lifetime.