For Carl’s Memorial

Carl in his basement apartment surrounded by his drawings and hugging Puff: one of his long lived cats. Carl was a good friend for most of my adult life. During the many years I lived in Edmonton I spent a lot of time with Carl. It’s rather odd that I have so few pictures of him. I have been an avid amateur photographer since I was eight but I only have half-a-dozen pictures of Carl. I held off “developing” this image because of the reflection in Puff’s eyes. Now I see this informal imperfection as a reflection, (pun intended), of Carl’s haphazard fun filled way of life.

Carl in his basement apartment surrounded by his drawings and hugging Puff: one of his long-lived cats. Carl was a good friend for most of my adult life. During the many years I lived in Edmonton I spent a lot of time with Carl. It’s rather odd that I have so few pictures of him. I have been an avid amateur photographer since I was eight but I only have half-a-dozen pictures of Carl. I held off “developing” this image because of the reflection in Puff’s eyes. Now I see this informal imperfection as a reflection, (pun intended), of Carl’s haphazard fun-filled way of life.

A memorial celebration for the life of Carl Sullivan was held today, June 20, 2015,  in Calgary. I was unable to attend but I sent this little note. The world is a little gloomier without Carl. 

1969 was a memorable year for many reasons but two “events” stand out for me. It was the year of Apollo 11, the epochal first moon landing. If humans still exist a thousand years from now the first moon landing will still be remembered and lauded. Of less historical, but greater personal interest, 1969 was also the year I met Carl B. Sullivan.

Apollo marked a high water mark for western civilization; we have been steadily degenerating ever since. Similarly, Carl, for me, marked a high friendship mark. No event of the last forty-six years holds a candle to Apollo 11 and no post Carl friend holds a candle to Carl.

I know Carl would enjoy being bonded with Apollo 11. He enjoyed the “weird.” His own weird, the weird of others, the world’s weird. Carl liked to cast himself as a sage and wizard. He was certainly a sage of the absurd and a wizard of fun.

I have many fond memories of visiting Carl after another exquisitely self-crafted dismaying day only to have Carl wave his wizard’s wand and make my gloom bloom. This is an exceedingly rare talent and frankly we were blessed to fall under his spell.

I know Carl was ambivalent about the prospects of an afterlife. His appetite for the absurd did not extend to religion. I am harsher; I expect utter oblivion, but if I am wrong and find myself cast into Hell for a lifetime of misdemeanors, I’ll find Carl, (he had his own Hell worthy misdemeanors),  and Carl being Carl, will turn Hell into an eternal party!

Goodbye old friend you will never know how much we all miss you.

Copulation, Cooking and Cleaning

A refreshing blogosphere development is something called the “manosphere.” The manosphere is a mangy collection of young male bloggers that have had it with man hating feminism. I’m an old boomer fart, not exactly the manosphere demographic, but I see their point. I remember when rational1 feminists set their sights on “equal pay for equal work.” I fully supported pay equity and, when you correct for actual hours worked, that battle has been won in oppressive western cultures.2 But, as every married man knows, what women ask for is seldom what they really want.

Equity was never the goal of radical feminists! Radical feminists are nasty menstruating socialists. Their perfect world looks a lot like an old-fashioned new-man communist utopia: a utopia that was rudely rejected for all sorts of Gulag’ey reasons. Sadly, radical feminists don’t take rejection gracefully. Once a month their bitter frustrations manifest as malignant misandry. Yeah, “femnazis” are real and they’re everywhere! Femnazicism rears its ugly bull dyke head in repressive campus speech codes, phony palimony suits, bogus rape claims, “fat acceptance” campaigns, and tiresome PMS laced whining about how hard it is to find a real man. Well ladies, I am going to let you in on a little guy secret; it’s much harder to find a real woman!

What I am about to say will strike manospherians, and real men everywhere, as obvious but we can no longer count on men being men. There are a lot of misguided white knights and whipped manginas out there so grab your sanitary napkins and brace for reality.

In pre-pussy-boy days, men looked for, fought over, and highly valued “three C” women.

What the hell is a “three C” woman? A three C woman understands men. She has intuitively, or intellectually, grasped that human males are simple short-lived creatures that are biologically programmed to seek three things from woman: copulation, cooking and cleaning – the three Cs.

You can determine a man’s age by how he sorts his three Cs. When we’re young copulation is our absolute number one priority. Given a choice between copulation, cooking and cleaning we’ll always pick copulation. When we’re older, more settled, and our frantic need for copulation subsides, given a choice of fine cuisine or fine ass, we may choose the former. Finally, in our limp dotage, when Viagra no longer works, gently wiping the dribble off our chins, (cleaning), after a fine meal, (cooking), is greatly appreciated. Ladies if the three Cs are graciously on tap we’ll happily put up with any amount of lady-shit. It sounds simple because it is!3

Bang us, feed us, and cleanup afterwards, without nagging resentment, and we will love, cherish, protect, work, and die for you! And, here’s the good news; you don’t have to be a Victoria Secret maximum babe to pull this off. In purely economic terms any comely young woman who masters the three Cs is literally worth her weight in gold!4 At current gold prices one woman weight is about $2,300.000 US. Amortized over a fifty year marriage that works out to around $45,000 per year. Guys, just try paying for hookers, gourmet takeout, and maid services for a measly $45,000 a year. When you throw love into the deal the quality three C woman is the biggest bargain out there. So ladies, if you really want a real man, master your three Cs and you’ll have your pick of them.


  1. Rational feminist was not oxymoronic when the movement started.
  2. Not such much in Clitoridectomy happy nonwestern societies.
  3. Male maintenance requires some real work. Men expect to put in long hours looking after the women in their lives and they expect women to reciprocate. Unfortunately modern feminism labels such reciprocation “oppression.”
  4. I am assuming a normal female weight of less than sixty-five kilograms. Obese land fe-whales are not worth their weight in gold.

Social Security Numbers are Broken beyond Repair

Imagine that you are buying a new set of wheels with cash. Being a cash transaction there is no need to negotiate loans or check credit; you have the money in your wallet. Usually vendors are delighted when handed a thick wad of bills but we are living in unusual, no depraved, times. Before the dealer takes your wad you will probably be asked for your Social Security Number. WTF you think! It’s a cash transaction; why must government stick its inept grasping tentacles in your business?

Of course if you are financing a set of wheels, applying for a mortgage, negotiating a rental, submitting a job application, or buying a fricking big screen TV, you will be asked, over and over again, for your Social Security Number. Why are so many tiresome busybodies obsessing over nine measly, easily forged, digits? Well cowboys and girls, the Social Security Number has morphed into a general purpose personal tracking identifier. Busybodies covet this number because once they have it they can:

  1. Check your credit history.
  2. See if you have ever been in prison.
  3. Determine if you owe money.
  4. Track your movements from one state or city to another.

And god knows what else!

When Social Security was setup in the 1930s paranoid right wingers darkly warned that Social Security Numbers (SSNs) would be used to track people and ultimately infringe their freedoms. Silly ancient right wingers: who really cares that they were completely right about SSNs? Only criminals, and evil people with things to hide, care about the widespread abuse of Social Security Numbers. If you believe this moronic twaddle please leave your Social Security Number in a comment on this blog. You can trust me! I would never abuse your number.

Now if you’re a big government guy or gal you will loudly assert that it’s perfectly acceptable for the government to maintain some identifier that links you to your Social Security account. On this I agree, some identifier is required, but Social Security Numbers are probably the worst possible way to do this. The ideal Social Security “Number” would:

  1. Unambiguously link you to your Social Security Account.
  2. Be impossible to counterfeit or fake.
  3. Be useless for any other purpose.

The idiotic nine digit scheme used for Social Security Numbers completely fails all three of these tests.

Let’s start with unambiguous linking. News flash: your Social Security Number does not uniquely identify you. There are many reasons for SSN duplicates with identity theft being the leading cause. Is it fair to blame SSN numbers for criminal abuse? Yes you dumb fucks! Identity systems must operate on the bedrock principle that people are liars, cheats, and disgusting defecating naked apes. Always assume the worst of your fellow apes; you will still be disappointed. Good identifier schemes make it impossible to generate duplicates regardless of how thoroughly evil or incompetent people are. Social Security Numbers naively assume we are good people. This is asking for it.

How hard is it to counterfeit or fake Social Security Numbers? It’s so damn easy you can go to this website and push a button. While it’s unlikely that nine random digits will form a valid SSN it’s clearly not rocket science to concoct plausible SSNs. Good identifier keys are unavoidably unique. There are many high quality unique key algorithms. SSNs are crappy keys; any database professional that advocated their use would be fired on the spot.

As for being useless for other purposes: here the failure is so complete, so total, and so absolute, that it’s hard to attribute it to mere government stupidity. I don’t blame the paranoid for thinking it was a clumsy backdoor scheme to label citizens for other purposes. Heh, even the official government Social Security Page brags that your SSN has “come to be used as a nearly universal identifier.” Anyone that contests this is an idiot. Every two-bit database out there has an SSN column in it. Many SSNs are still completely unencrypted; they’re begging software professionals like me to get into the identity theft business. Keep that in mind the next time some outfit asks for your SSN.

When you make a VISA, MasterCard or Apple Pay purchase with a “chipped card” a onetime transaction code is generated and mixed with your credit card number.1 This allows the central authority, VISA and MasterCard in this case, to verify your credit without creating a permanent number that is forever tied to your name. This scheme is vastly more secure than SSNs but falls short of high quality cryptographic key schemes used in systems like Bitcoin. The QR code on this blog is a Bitcoin address with money in it. Try and steal my Bitcoin bitches! The point is there are sound ways of creating account links that do not invite abuse and tracking. So why the hell are we are still tolerating static, insecure, come and get it identity thieves, broken beyond repair, Social Security Numbers?


  1. One of the consequences of chipping credit cards is that it is no longer necessary to display the number on the card. You only need the number to interact with non-chipped devices. Eventually people will figure this out and start asking for credit cards that do not display the number. I see a great advertising campaign in the future. “You can get our numberless smart card or their numbered dumb fuck card. What’s it going to be?”

An Honest Resume Personal Statement

While updating an online version of my resume a nagging web page advised me to include a personal statement: apparently the personal statement is my chance to stand out, make that all important first impression, and firmly affix my lips to succulent corporate ass.

Being programmer oriented the web page suggested I write about my first computer. This is just conniving HR speak for, “How old you?” HR cannot directly ask so they’ll probe circuitously. Sorry gals, (HR is a female ghetto), I’m on to you. I am excellent actor and liar. I can play your little game but I am no longer interested. Still your little page made we wonder what my personal statement would be like if I was telling the truth and not spinning like a millisecond pulsar. I think it would look something like this:


I want to solve problems: not create them. You would be surprised how many software organizations cannot tell the difference.

Ask yourself:

  1. Does your organization think the orthodox application of trendy project management “methodologies”1 like agile is a substitute for real insight and work?
  2. Do you bind yourself in SOX inspired straitjackets and wonder why programmer morale and productivity has plummeted?
  3. Do you have an antiquated remote work policy and insist staff show up for periodic management brow beatings and pointless brain numbing meetings?
  4. Are you wedded to standard software tools merely because they are standard?
  5. Are you afraid of iconoclastic viewpoints and meekly seek a lowest common denominator consensus?
  6. Finally, do you follow industry trends or set them?

Perhaps my bad attitude shocks you.

“Who would hire this guy?” you ask.

It’s a fair question. I’ve had my fill of “Software Theater.” I will no longer act like I agree with bad ideas just to get along. From now on I am going to tell people what I really think, not what they yearn to hear.

To work with me your organization must be:

  1. Located somewhere I want to live to or have an enlightened 21st century remote work policy.

I am tired of wasting my life in humdrum hellholes because that’s where an employer is located. This is inexcusable for 21st century software developers. If you haven’t figured out how to manage geographically dispersed remote workers your organization is hidebound, myopic and doomed!

  1. Have a positive attitude about novel approaches to problems and encourage programmer autonomy.

I have often solved problems with nonstandard tools and techniques only to be told to do it again using a standard tool. Sometimes this makes sense but usually it’s motivated by pure organizational fear.

“Oh my God we won’t be able to find someone to support this!”

Or even worse, “We’ll have to learn something new!”

Companies make a big show about “thinking outside the box” while huddling like bed wetting cowards in the corner of one.

  1. Accept the simple fact that work is small part of life and stop trying to manage employees outside of the workplace.

It’s amazing what some companies think they can get away with! Would you believe asking recruits for Facebook and Twitter passwords? Don’t try this with me; I might punch you! Most companies know that asking for passwords crosses all sorts of inappropriate boundaries but even more enlightened organizations often have a “velvet fist” social media policy that basically tells employees not to involve the company in their personal jackassery. This is a reasonable request but it’s usually seen as bullying. Most will shut up: not me! Freedom of speech is fundamental and absolute. Companies that try to silence employees should be ashamed of themselves.

If you’re still reading and think, I like the cut of this guy’s jib. We have enough kowtowing eunuchs on payroll: a few ballsy shitheads may spruce this joint up. I’d suggest you look over my attached resume, peruse my public GitHub repositories, read my blog, browse my extensive photos, and check out what I’m reading. You’ll get a pretty accurate sense of who I am, what turns my crank, how I approach problems, and how I deal with difficulties. Unspoken social conventions demand that we suppress ourselves to work. I will no longer do this. I am what I am; I do what do; I will not change for you.


  1. I loathe the word “methodologies.” The correct word is “methods.” Wanton syllable inflation is a reliable bullshit tell.

Mauna Kea Morons on the March

Thirty Meter Telescope

Thirty Meter Telescope

There are two types of stories about major astronomical observatories. There are stories about new discoveries and observation technologies and then there are stories about how batshit crazy people are! Lately a rash of batshit crazy has broken out over the construction of the Thirty Meter Telescope on Mauna Kea. The ignorant press is casting the story as another tale of wanton destruction of sacred pristine aboriginal environments by “big astronomy.” On most days I ignore the moron maelstrom but I’m in bad mood today. I couldn’t resist venting on The Register. The following is a slightly edited version of my contribution to the conversation bitches!

Trigger Warning: searing contempt for tools and fools!

You are making way too much sense. As a long-standing amateur astronomer and aficionado of major observatories I can state with absolute certainty that if you want to preserve the environment around a mountain one of the best ways to do it is to place a major observatory on it. Large telescopes require large dark zones. If people would turn their damn lights off at night development in dark zones might be permissible but as you are well aware people will not turn their fucking lights off and will look at you like you’ve just beamed down from starship Looney Tunes if you try to tell them that light pollution is a real thing. The only way to insure a dark environment is to restrict development and, as you point out, that limits how much money certain cretins can extract. What’s happening on Mauna Kea happened before on Mount Graham in Arizona. So called environmentalists fought for decades to block the Large Binocular Telescope because it might stress some squirrels. Well the scope got built and the squirrels are doing just fine and will continue to thrive because their habitat will not be sodomized by condo developers and other invasive lower life forms.

Mixed in with all this phony eco-warrior nonsense is even more phony religious nonsense. I realize it is horribly judgmental and privileged white male of me to say that sky fairies of all types, even “protected class” aboriginal brown people sky fairies, are complete and utter rubbish! Jesus did not rise from the dead, Mohammed did not ascend to heaven, and Pele is not stomping around on Mauna Kea regardless of what native Hawaiians believe. If this offends you demonstrate why your sky fairy is any less imaginary than The Flying Spaghetti Monster. “Belief” is a bullshit word. It will be a pathetic day if the construction of a major 21st century observatory is stopped to placate scientific illiterates and religious primitives.

What hobbies do you have? Have you learned anything useful from them?

This is my first “cross-posted” entry. I composed this on Quora. I was asked to answer the title question and I did. I probably won’t do this very often. Still, a little experimenting is fun.

Answer by John Baker:

The short answer is many and yes. The longer answer is pretty much everything I do, that matters to me, is a hobby of some form or other. Some of my major hobbies are:

1.      Amateur Astronomy
2.      Photography
3.      Blogging
4.      Recreational Programming.

Amateur Astronomy has been a lifelong pursuit. I was hooked as a child looking at Venus’s crescent through a small refractor in the badlands of Utah. It’s hard to relate how much I have learned from Amateur Astronomy or how much it has influenced my life but it is a lot and heavily.  My decision to study science in school and later university were outgrowths of this passion. I have traveled all over the world to view eclipses, see spectacular comets, and tour major observatories. Even today the best possible night for me is to stand alone under clear extremely dark high altitude skies and soak in the gentle light of the Milky Way.

Photography is also a lifelong hobby. I shot my first roll of film on a cheap fixed focus camera when I was eight. I blow hot and cold on my hobbies. Sometimes they utterly dominate my every waking hour. Other times they lie dormant, ignored, waiting for me to pick them up again. Photography is such a hobby. Over the decades it has taught me a lot of chemistry: I started picture taking in the “chemical” era. Nowadays I’ve absorbed a wide variety of photography related software skills. I’ve also learned a lot of history. Studying early photographers and how they created some of their iconic images is fascinating.

Blogging is relatively new hobby. I started with the idea that it would be good “composition practice,” a way to learn about web site maintenance, and finally a safe way to vent without serving time for assaulting imbeciles. It has met all these expectations and more. It’s presumptuous for bloggers to describe themselves as writers but you do acquire a greater understanding of what writers do. That old joke about being a drunk with a writing problem is not far from the mark.

As for recreational programming: despite going into work day after day,  year after year, and staring at screens of, please stab my eyes out, “work code.” I still muster the energy to work at home on software projects using unconventional programming languages and tools. Many professional peers have poked fun at my eccentric tastes and others have told me I was wasting my time. The joke has been on them. Many that cast these aspersions are no longer employed while my current job is a direct consequence of knowing things the convention bound do not.

I have learned many specific things from my hobbies but the single best thing I’ve learned is simple intellectual integrity. Nobody is going to do your hobby for you. Paying others to take up your hobbies makes no sense. Cheating on a hobby is crazy. You have to do the work by yourself; you have to learn by yourself; you have to think for yourself! Hobbies refine our individuality; I’d recommend more hobbies for everyone.

What hobbies do you have? Have you learned anything useful from them?

Dark Energy Entities

I’ve been having fun on a new social media site called Quora. Quora operates on the StackOverFlow principle. People pose questions and others answer. The act of asking of sincere questions, even silly ones, seems to take the wind out of troll sails. Political sites quickly degenerate into primate poo tossing contests. I enjoy pitching poo with the best of them but I demand wit, verve and humor with my insults. Sadly, these qualities are the first to go when vicious trolls tear into partisan believers of any persuasion. Honest political conversations have never been easy. I remember screeching, mostly left-wing, university harridans shouting down heretics forty years ago. I’m sure they would have burned them at the stake if the option had been available. Still there is something about the question that makes people put down their torches and give a heretic a break.

A good question and answer session is like a connect-the-dots cartoon. For example Javed Qadrud-Din observed when responding to the question:

Hypothetically, if there is intelligent alien life, with the knowledge and means to traverse space and travel to Earth, what would be their reasons for not making contact?

That aliens might be billions of years ahead of us and

we would be unable to recognize the evidence of their existence, and such evidence would instead appear to us as aspects of the nature of reality itself.

I thought about this and responded:

Your observation that some alien intelligences could be billions of years ahead of us and may, “appear as part of nature,” made we wonder what might qualify as a manifestation of such beings. It goes without saying that super advanced beings with real immortal ambitions will be somewhat bummed with mere matter. If our, admittedly primitive physical theories hold up, it looks like in the very long run, e.g. 10100 or more years, all matter will decay and space will expand into an unimaginably vast void with a temperature indistinguishable from absolute zero. All matter and energy based sentience will be snuffed out: everything, absolutely everything dies. What’s left in such a universe? Only Dark Energy survives and prospers. Cosmologists have noted that we appear to live in a Dark Energy dominated universe and the domination started fairly recently, within the last two billion years or so. If intelligent life evolved somewhere in the cosmos six or seven billion years ago that would be plenty of time to advance to the point that such beings could insert themselves into the only durable part of our universe: space itself. So perhaps the accelerating expansion of space is the “part of nature” that gives away the presence of such highly evolved beings.

We may be living in a Dark Energy Entity Cosmoscene. It’s unlikely that beings able to alter the entire observable universe are going to make contact with pitiful little poo throwing naked apes.

Cutting the Stinking Tauntaun and other Adventures in Software Archeology

The other day a software project that I had spent a year on was “put on the shelf.”  A year of effort was unceremoniously flushed down the software sewer.  A number of colleagues asked me, “How do you feel about this?” Would you believe relieved?

This is not false bravado or stupid sunny optimism. I am not naïve. I know this failure will hurt me. In modern corporations the parties that launch failures, usually management, seldom take the blame. Blame, like groundwater, sinks to the lowest levels. In software circles it pools on the coding grunts doing the real work. It’s never said, but always implied, that software failures are the exclusive result of programmer flaws.  If only we had worked harder and put in those sixty or eighty hour weeks for months at a time; if only we were a higher level of coding wizard that could crank out thousands of error free lines of code per hour, like the entirely fictional software geniuses on TV, things might have been different.

Indulging hypotheticals is like arguing with young Earth creationists about the distance of galaxies.

“Given the absolute constancy of the speed of light how is it possible to see the Andromeda galaxy, something we know is over two million light years away, in a six thousand-year old universe?”

The inevitable reply to this young Earth killing query is always something to the effect that God could have made the universe with light en route.  God could have also made farts smell like Chanel #5 but sadly he[1] did not.  Similarly, God has also failed to staff corporations with legions of Spock level programmers ready and willing to satisfy whatever au courant notion sets up brain-keeping in management skulls.  The Andromeda galaxy is millions of light years away, we don’t live on a six-thousand year old Earth, and software is not created by magic.  Projects work or flounder for very real reasons. I was not surprised by the termination of this project. I was surprised that it took so long to give up on something that was never going to work out as expected.

Working with bad legacy code always reminds me of the scene in The Empire Strikes Back when Han Solo rescues Luke on the ice world by cutting open his fallen Tauntaun with a light saber. When the Tauntaun’s guts spill out Solo says, “I thought they smelled bad on the outside.” Legacy code may look pretty bad on the outside, just wait until you cut into it. Only then do you release the full foul forceful stench.

The project, let’s call it the Stinking Tauntaun Project, was an exercise in legacy system reformation. Our task was adding major new features to a hoary old system written in a programming language that resembles hieroglyphics. I know and regularly use half a dozen programming languages. With rare exceptions programming languages are more alike than different. From the time of Turing we have known that all programming languages are essentially the same.  You can always implement one language in another; all programming systems exploit this fundamental equivalence. It’s theoretically possible to compile SQL into JavaScript and run the resulting code on an eight bit interpreter written in ancient Batch I just wouldn’t recommend you start a SOX compliant software project to create such insanity. This goes double if only one programmer in your organization knows ancient Batch!  The Stinking Tauntaun Project wasn’t this crazy but there were clear signs that we were setting out on what has been accurately described as a Death March.

Avoiding Death Marches, or finding ways to shift blame for them, is an essential survival skill for young corporate programmers. It’s not an exaggeration to say that a lot of modern software is built on the naiveté of the young. When you first learn to program you are seduced by its overpowering rationality. Here is a world founded on logic, mathematics and real engineering constraints. Things work, and don’t work, for non-bullshit reasons! There aren’t any pointless arguments with ideological metrosexual pinheads about “privilege” or “gender.” Programs don’t give a crap about the skin color of the programmer or whether their mother was an abusive bull dyke. After a few years of inhaling rarefied logic fumes young programmers often make the gigantic and catastrophic mistake that the greater naked ape society in which they live also works on bullshit free principles. It’s at this delicate stage when you can drive the young programmer hard. There’s an old saying that salesmen like money and engineers like work so in most companies the salesmen get the money and the engineers get the work. As the great sage Homer Simpson would say, “It’s funny because it’s true!”

Death Marches shatter the naïve. Gaining a greater understanding of the nasty world we live in always does a naked ape good but there’s a cost; your career will suffer and you will suffer: enlightenment is proportional to pain! The school of hard knocks is a real thing and unlike that party school that you boozed through no one graduates alive. I’d strongly recommend a few Death Marches for every working programmer. To paraphrase Tolstoy, “All successful software projects are alike; every unsuccessful project fails in its own way!” You may consider what follows my modest contribution to the vast, comprehensively ignored, literature of software Death Marches.

Code Smell #1: A large mass of poorly written test free legacy code that does something important.

“Refactoring” is a word that I love to mock but the refactoring literature showcases an astonishingly precise term: “code smell.” Code smells are exactly what you expect. Something about the code stinks. The Stinking Tauntaun code base didn’t just stink, it reeked like diuretic dog shit on choleric vomit. This was well-known throughout the company.  My general advice to young programmers that catch a whiff of rotting code is simple: flee, run, abort, get out of Dodge! Do not spill your precious bodily fluids cleaning up the messes of others.

When recruited a number of experienced hieroglyphic programmers asked me the pointed question, “How do you deal with giant stinking piles of legacy doo-doo?” Maybe it wasn’t quite phrased like that but the intention was clear. They were telling me that they were dealing with a seething mass of half-baked crappy code that somehow, despite its manifold flaws, was useful to the organization and couldn’t be put out of its well deserved misery.

I honestly answered. “Systems that have survived for many years, despite their problems and flaws, meet a need. You have to respect that.” I still believe this!  Every day I boot up ancient command shells that look pretty much like they did thirty years ago.  Why do I use these old tools? It’s simple; they do key tasks very efficiently. I try new tools all the time. I spent a few months playing with PowerShell.  It’s a very slick modern shell but it has one big problem. It takes far longer to load than ancient DOS or Bash shells. When I want to execute a few simple commands I find the few extra seconds it takes to get a PowerShell up and running highly annoying. Why should I wait when I don’t need the wonderful new features of PowerShell?  The Stinking Tauntaun System also met user needs and, just like I am horrified by the clunky ill-conceived incoherence of old shells, Stinking Tauntaun users held their noses and used the good bits of what’s overall a bad system.

Code Smell #2: No fully automatic version controlled test suite.

There is a tale, possibly apocryphal, from the dawn of programming that goes something like this: a young programmer of the ENIAC generation was having a bad day. He was trying to get some program running and was getting frustrated “re-wiring.” Our young programmer was experiencing one of the first “debugging” sessions back when real insects came into play. In a moment of life searing insight our young programmer realized that from now on most of his time would be consumed hunting down errors in faulty programs.  The tale goes dark here. I’ve often wondered what happened to the young programmer. Did he have a happy life or did he, like Sisyphus, push that damn program up the hill only to have it crash down again, and again, until management cried stop!

Debugging is a necessary evil. If you program — you debug. It’s impossible to eliminate debugging but at least you can approach it intelligently, and to this day, the only successful method for controlling program errors is the fully automatic version controlled ever-expanding test suite. Systems with such suites actually improve with time. Systems without such suites always degenerate and take down a few naïve programmers as they decay. The Stinking Tauntaun System lacked an automatic test suite. The Stinking Tauntaun System lacked a non-automatic test suite. The Stinking Tauntaun had no useful test cases what so ever! Testing The Stinking Tauntaun was more painful than dealing with its code. The primary tester had nightmares about The Stinking Tauntaun.

withouttests

My Power-Point-less illustration of Quality over Time for a system that lacks a fully automatic ever expanding version controlled test suite. Systems without well designed test rigs are almost without exception complete crap. Unless someone is paying you huge bucks it’s best to start sending out resumes when asked to fix such systems. You can ruin your health stirring your yummy ice cream into the shit but it’s almost certain the final mixture will taste more like shit than ice cream.

It’s the 21st century people! In ENIAC days you could overlook missing automatic test suites. Nowadays missing automatic test suites is a damning indictment of the organization that tolerates such heinous crimes against programming humanity!

Code Smell #3: Only one programmer is able to work with legacy code.

When I was hired there were a few hieroglyphic programmers on staff. No single programmer was saddled with the accumulated mistakes of prior decades. We could divide and deal with the pain. During this happy time our work was support oriented. We we’re not undertaking large projects. Then an inevitable bout of corporate reorganization occurred, followed by terminations and a stream of defectors fleeing the new order.  Eventually only one hieroglyphic programmer remained: moi!  Most programmers would have joined the exodus and not taken on the sins of other fathers but as I have already pointed out I am a software whore and proud of it.  Still even software sluts must avoid ending up like the, “there can be only one,” Highlander. Most of those sword duels ended rather badly as I recall.

Code Smell #4: Massive routines with far-ranging name scope.

With noxious fumes already cutting off our air supply we should have stopped in our tracks but we soldiered on because The Stinking Tauntaun System did something important and alternatives were not readily available. The corporation recognized this and started a number of parallel projects to explore New Stinking Tautaun’s.  I wasn’t lucky enough to work on any of the parallel projects. I had to get in the stall and shovel the Tauntaun manure.

We weren’t entirely clueless when we started Stinking Tauntaun work.  We recognized the precarious hieroglyphic programmer resource constraint and tried to divide the work into units that alleviated it. We decided to implement part of the new features in another programming language and call the new module from the old system. The hope was this would divide the work and possibly create something that might be used outside The Stinking Tauntaun System. This part of the project went reasonably well. The new module is entirely new code and works very well. Unfortunately, it was a small part of the greater effort of bolting new features into The Stinking Tauntaun System.

Stinking Tauntaun code is magisterial in its monolithic madness. The hieroglyphic programming language is famous for its concise coding style yet the main routine in the Stinking Tauntaun System is close to 10,000 lines long!  I had never seen hieroglyphic language routines of such length. I’ve only seen comparable programs a few times in my battle scared career. As a summer student I marveled at a 20,000 line, single routine, FORTRAN program.  At first I thought it was the output of some cross compiler but no, some insane, bat shit crazy government drone, (I was working for a government agency in western Canada), had coded it by hand — on freaking punch cards no less! Such stunning ineptitude is rare: most programmers have a passing acquaintance with modular design and know enough to reconsider things when code gets out of hand. We all have different thresholds for judging out-of-hand-ness, for me it’s any routine that’s longer than sixty lines: including the damn comments.

A 10,000 line routine is a monumental red flag but The Stinking Tautaun’s length was not the biggest problem. There is this thing programmer’s call “scope.”  Scope marks out name boundaries. It sets limits on where names have meaning or value. Ideally name scope is limited to the smallest feasible extent. You really don’t want global names! You absolutely don’t want global names like “X,” or “i,” or “T,” cavorting in your code! Most of the cryptic names in the Stinking Tauntaun System had far-ranging scope. Vast scopes make it difficult to safely make local changes. This makes it risky, dangerous and time-consuming to change code.  Large scopes also increase the burden on testers. If tiny changes have far-ranging consequences you have to retest large parts of the system every time you tweak it. All of this sucks up time and drains the pure bodily fluids of IT staff.

Code Smell #5: Basic assumptions about what is possible quickly prove wrong.

It was looking dark. Timid souls would have run but we plowed on. Our naïve hope rested on the theory that we could change a few touch points in The Stinking Tauntaun’s code base and then get out of Dodge before the dark kludge forest closed in. My first estimate of how many routines I would have to touch was around twenty. Two months into the project I had already altered over a hundred with no end in sight. The small orthogonal change we hoped to make was not possible because The Stinking Tauntaun System did not sensibly do one thing in one place. It did sort of the same thing in many places. You couldn’t make a small change and have things sensibly flow throughout the system.  I worked to isolate and modularize the mess but I should have just waved my hands and spent my days on LinkedIn looking for another job.

Code Smell #6: A development culture steeped in counterproductive ceremony.

On top of all these screeching sirens yelling stop there were other impediments. I work in a SOX saturated environment. Readers of my blog know that I consider SOX to be one of the biggest time-wasting piles of DC idiocies ever pushed on American companies. Like many “government solutions” SOX did not drain the intended swamp but forever saddled us with inane time-wasting ceremony and utterly stupid levels of micromanagement. Is Active Directory management really a concern of freaking government? Somehow it’s become one!  One of my favorite consequences of SOX is the religious ordering of development environments and the sacraments for promoting code changes. During the long bruising Stinking Tauntaun project many releases boiled down to me making changes to one file! Pushing a new version to test should have been a simple file copy.

Of course it couldn’t be that simple. Numerous “tickets” had to be approved. Another branch of IT, that was even more stressed and suffered higher levels of turnover than ours, was dragged in to execute a single trivial file copy. In many cases more bytes were generated by all this pointless time-wasting ceremony than I had changed in that single file. Of course all this took time, and as hard as I looked for a useless-time-wasting-bullshit category in our web-based hours tracking system, I couldn’t find one. There’s a management mantra: you can only improve what you measure.  Funny how companies never measure the bullshit.

In retrospect we should have junked The Stinking Tauntaun System or opted for a radical rewrite. It’s ironic but something like this is what’s going to happen. If I was young I would be bitter but I cashed in on this project. In my consulting days I was always on the lookout for Stinking Tauntauns: they were freaking gold mines for those of us that have acquired a taste for the bracing putrid fumes of rotting code.

[1] If you are the type of person that gets your panties in a knot about the gender of hypothetical supreme beings please go away.

JOD Update: Version 0.9.97*

JOD LogoIn the last year much has changed in the J world.

  1. There are new official J 8.0x builds for all supported platforms.
  2. The QT based IDE JDE has matured and is in widespread use.
  3. The column oriented J database JD is drawing new users to J and enticing J veterans to reconsider how we use databases.
  4. There is a small group of J system builders experimenting with additions, extensions and revisions of core J source code.

In short, there are have been enough changes to revisit and update JOD.

JOD version 0.9.97*1 is the first JOD update in many years that mocks the god of software compatibility. In particular:

  1. The syntax of the jodhelp verb has changed.
  2. The jodsource addon no longer uses a zip file to distribute JOD dump files.
  3. JOD online help will no longer be supported or updated.
  4. Volume size is no longer checked before creating new JOD dictionaries.
  5. There is a new version of jod.pdf.

jodhelp changes (#1, #3 and #5)

jodhelp has always been a kludge. In programmer speak a kludge is some half-baked facility added to a system after more essential features have stabilized. The original versions of jodhelp pointed at my rough notes. It was all the “documentation” I needed! Then others stared using JOD which resulted in an “evolved” online version of my notes. I originally thought that hosting my notes online would simultaneously serve user needs and cut the amount of time I spent maintaining documentation. In retrospect this wasn’t even wrong!

I used Google Documents to host my notes. If you’ve ever wondered why completely free Google Documents hasn’t obliterated expensive Microsoft Word or hoary old excellent \LaTeX I invite you to maintain a set of long-duration-documents with Google Documents. During jodhelp‘s online lifetime the basic internal format of Google Documents changed in a screw-your-old-documents upgrade which forced me to spend days repairing broken hyper-links and reformatting. I was not amused; you still get what you pay for!

I originally choose Google Documents because of its alleged global accessibility. Sadly, Google Documents is now often blocked by corporate and national firewalls. Even when it isn’t blocked it renders like a dog peeing on a fire hydrant. All these problems forced me to rewrite JOD documentation with a completely reliable tool: good old-fashioned \LaTeX. The result of my labors, jod.pdf, is now distributed by the joddocument addon and is easily browsed with jodhelp.

After jod.pdf‘s appearance another irritant surfaced: synchronizing jod.pdf and the online version. I tried using pandoc and markdown to generate both the online and PDF versions from the same source files but jod.pdf is too complex for not-to-fancy portable approaches. I was faced with a choice, lower my jod.pdf standards, or get rid of something I never really liked. I opted to drown a child and abandon online help. I don’t expect a lot of mourners at the funeral.

Using the new version of jodhelp requires installing the addon joddocument and configuring a J PDF reader. It’s also good idea to define a JQT PF key to pop up JOD help with a keystroke. To configure a J PDF reader edit the configuration file:

 ~config/base.cfg

this file is directly available from the JQT Edit\Configure menu. base.cfg defines a number of operating system dependent utilities. Make changes to the systems you use, save your changes, and restart J. The following example shows my Win64 system settings.

 case. 'Win' do.
   BoxForm=: 1
   Browser=: 'c:/Program Files (x86)/Google/Chrome/Application/chrome.exe'
   Browser_nox=: ''
   EPSReader=: 'c:/program files/ghostgum/gsview/gsview64.exe'
   PDFReader=: 'c:/uap/sumatra/SumatraPDF.exe'
   XDiff=: 'c:/uap/WinMerge-2.14.0-exe/winmergeu.exe'
   Editor=: 'c:/uap/notepad++/notepad++.exe %f'
   Editor_nox=: '' 

I use SumatraPDF to read PDF files on Windows. It’s a fast, lightweight, program that efficiently renders jod.pdf. Good PDF readers are available for all commonly used platforms.

To define JQT PK keys edit the configuration file:2

 ~config/userkeys.cfg
 

This file is also directly available from Edit\Configure menu. My JOD specific PF keys are:

 F3;1;Require JOD;require 'general/jod'
 Shift+F3;1;JOD Help;jodhelp 0
 F6;1;Dev Dicts;od cut 'joddev jod utils' [ 3 od ''
 Shift+F6;1;Fit Dev Dicts;od cut 'jodfit joddev jod utils' [ 3 od ''
 Ctrl+Shift+F6;1;Test Dev Dicts;od cut 'jodtest joddev jod utils' [ 3 od ''
 

Pressing Shift+F3 executes jodhelp 0 which pops up JOD help.

jodsource changes (#2)

The jodsource addon is a collection of JOD dump scripts. Dump scripts are serialized versions of binary JOD dictionaries. When executed they merge objects into the current JOD put dictionary. I use them primarily to move dictionaries around but they have other uses as well. Prior to this version I distributed the three main JOD development dump scripts, joddev, jod, and utils in one compressed zip file to reduce the size of JAL downloads.

The distributed script jodsourcesetup.ijs used the zfiles addon to extract these scripts and rebuild JOD development dictionaries. This worked on 32 bit Windows systems but failed elsewhere. J now runs on 32/64 bit Windows, Mac, Linux, IOS and Android systems. To better support all these variants I eliminated the zfiles dependency and pruned the JOD development dictionaries. The result is a more portable and smaller jodsource addon.

Bye bye volume sizing (#4)

Early versions of JOD ran in the now bygone era of floppy disks. It was possible to create many JOD dictionaries on a single standard 800 kilobyte 3.5 inch floppy. Compared to modern porcine-ware JOD, which many J’ers consider a huge system, is lithe and lean. In floppy days it was important to check if there was enough space on a floppy before creating another huge 48K empty JOD dictionary. This is a bit ridiculous today! If you don’t have 48K free on whatever device you are running you have far more serious problems than not being able to create JOD dictionaries.

Volume sizing code remained in JOD for years until it started giving me problems. Returning the size of very large network volumes can be time-consuming and there are serious portability issues. Every operating system calls different facilities to return volume sizes. Even worse, security settings on corporate networks and cloud architectures sometimes refuse to divulge national secrets like free byte counts.

To eliminate all these headaches this version of JOD no longer checks volume size when the FREESPACE noun is zero. To restore the previous behavior you have to edit the file

 ~addons/general/jod.ijs`

and change the line FREESPACE=:0 to whatever byte count you want. Alternatively, you could NGAF3 and just assume you have 48K free on your terabyte size volumes.

Still to come

You may have surmised from JOD’s version number that the system is still not feature complete.  The JOD manual lists a few words that I am planning to implement. I only develop JOD when I need something or I am bored out of my mind at work and need a break. Such intermittent motivators seldom insure project completion but I have found a new reason to finish JOD. To list a book on Goodreads or Amazon you need an ISBN number.  The hardcopy version of the JOD manual is a sort-of-published book. To complete the publishing process I need an ISBN. If I am going to bother with such formalities I might as well complete the system the manual describes. So there you have it a new software development motivator: vanity.


  1. The version number is *‘ed because you are always a point release from done!
  2. userkeys.cfg is only available for J 8.03 systems.
  3. Not Give a F%&k!

Mahin and Carl

On the very memorable date of New Year’s Eve my wife’s mother Mahin died. From now on the dropping ball will remind us of her. Mahin had a long and honorable life. She was loved by children, grandchildren, and in-laws. She was the calm matriarch in the storm of her family. I meet her late in life after marrying her daughter Mali. Mahin was almost eighty then and still living on her own. She liked me and regretted having a son-in-law that she couldn’t talk to.  In the 1980s Mahin followed her children out of the chaos of Khomeini’s revolutionary Iran. She settled in Canada in her late sixties taking on a new country, a foreign language and a new way of life. It would have been a big change for a young person but for someone of Mahin’s age it was almost heroic. She got on, adjusted, learned enough English to function, but not enough to properly talk to son-in-laws, and enjoyed life. She never manifested a trace of bitterness or self-pity. She was a strong woman.

-

Mahin standing beside a reflecting pool in Iran. This picture was taken long before I met her. My wife was still a school girl in Tehran.

 

In her later years Mahin suffered from dementia. Her children took turns helping her out. We were the last to look after her. She lived with us for nearly two years. Mahin and I similar tastes for the absurd. We both enjoyed the idiotic television show Wipeout. Being knocked on your ass works equally well in English and Farsi. We’d laugh at people plunging into gigantic vats of goo.  Dementia slowly ate away at Mahin’s mind. Eventually she required twenty-four care and her daughters placed her in a nursing home in Toronto. They agonized over putting her in a home and did what they could to make her life comfortable. Mali stayed with her sister Sedi in Toronto five months last year to look after Mahin. She went to the nursing home every day to feed her, give her baths, do her laundry and talk to her. Dementia claimed Mahin’s English. Nursing home staff could not talk to her or understand her. Mali and her sisters were very fortunate to find a sitter that spoke Farsi. Hiring nursing home sitters is more common than you would think. Many of the residents in Mahin’s home had sitters.

Mahin died surrounded by children, grandchildren, her sitter, and nursing home staff.  Home staff told my wife and her sisters that everyone loved Mahin. I am sure they tell many families something similar but having known Mahin I don’t doubt their sincerity.  Mahin was a sweet dignified lady to her last breath.

A week before Mahin died I learned from my ex-wife that Carl, an old mutual friend, was in a Calgary hospice and not expected to live out the month. I’m not a particularly friendly person. Oh, I’m pleasant enough and can, when motivated, skillfully navigate social milieus. If you work with me you might even think I am your friend. I’m not! I’m reluctant to form deep friendships. Entering my sixties I can count my real friends on my fingers. Carl was the best friend I ever had. For nearly twenty years, from high school, until the birth of my daughter, Carl was a happy presence in my life.

Carl was a happy presence in the lives of everyone that got to know him and could tolerate his manifold eccentricities. He was everyone’s crazy uncle and he relished the role. Since leaving western Canada I moved out of Carl’s orbit. We’d trade the odd letter, email, and in recent years, Facebook posts. On the few times that I passed through Calgary I’d always look him up. We’d fall right back into old days blithering. Hearing that he was dying of the nasty form of prostate cancer was a jolt.

Mali petitioned me to call him right away. “You better call before it’s too late.”

I was reluctant because I don’t know what to say to the dying. I missed saying goodbye to my paternal grandfather and I botched my last conversation with my mother. Christopher Hitchens recounts some of the awkward conversations he had with friends and colleagues while dying of cancer in his last book Mortality. Many avoided the sword overhead while others swung it callously. Hitchens didn’t know what to feel. None of their goodbyes really helped.

I called Carl more for myself than him. Carl took a few moments to recall who I was. He was understandably more depressed than I had ever heard him. He was also vague and struggling to respond. Pain medications dull more than pain. I asked if family and friends were about. We aren’t comfortable with people dying alone which is strange because no matter how many friends and family members surround us we all die alone. The only hint of the old Carl that came out our chat was when he referred to Nazar: a very old friend that we both enjoyed making fun of.  Before hanging up I told Carl I would check in on him later but later never came. He died less than two weeks later.

Care to guess what really happened?

Carl in his card counting days. He actually cashed in retirement savings to play Black-Jack in Vegas. He was a very good friend but not exactly your financial go to guy.

 

Death is the most serious thing that will ever happen to us. It forecloses on what’s next. We simply cease! There is no childish heaven or burning hell. We are not reincarnated and we don’t see ghosts or talk to the dead. If you think or believe otherwise you are simply wrong. I won’t argue with you. I am tired of your irrational objections, your contemptible myths, and your weakness in the face of oblivion. The human machine wears out and breaks down. We don’t imagine afterlives for our cars so why do we indulge such fantasies for ourselves. As much as I would like to see Mahin, Carl, my mother, or anyone of the hundred billion people who have already died, again I won’t and neither will you!