Monday, June 29, 2015

Half-glassing it

Executive overview for folks who don't work in software:  There's a stage in an application's life known as the "Beta."  It has nothing to do with fish--not enough "T"s, for starters.  Basically, it means that the developers--or at least their managers--think that the code is reliable and useful enough to let outsiders look at it.  "Beta" used to come in two flavours:
  • Limited Beta, wherein hand-picked outsiders were allowed access to the application.  (Read:  Friends/relatives/ex-coworkers were nagged into taking it out for a drive.)
  • Open Beta, wherein any interested party had access to the app. with no guarantees that it wouldn't crash their computers and/or eat their pets.  (Yay, Slashdotters!)
In later years, hybrids of those models have evolved.  Remember when you revived your high school sucking-up-to-the-cool-kids skills to score a GMail/Ello invitation?  Yeah, that's one of those hybrids.

Anyhoo.  I'm the developer for an app. scheduled to go into an invitation-only Beta phase within a few weeks.  I'm stiffening my spine by re-reading Eric Ries's The Lean Startup for, like, the 2nd or 3rd time (I forget which).  Because, by my usual standards, the code (and infrastructure) quite honestly suck.  But by "lean" startup standards, that's absolutely OK.  In fact, it's considered optimal.

The "lean" methodology takes its cue from the "lean" manufacturing processes that were all the rage a couple decades ago.  And while my view of management-by-fad is not significantly different from my view of kings and queens of centuries past (or not so past) who kept pet astrologers, "lean" management at least admits that it's a calculated--yea, even disciplined--response to certain types of uncertainty.

According to "lean" doctrine, the holy grail of the startup is the "MVP," or "Minimum Viable Product."  Interestingly, MVPs can originate from established companies (that haven't ossified to the point of knowing nothing beyond milking the existing product-line or desperately scrabbling for a hold on the trailer-hitch of the the latest-greatest bandwagon).  The central idea is that you focus your efforts on the single thing that scratches an itch no one else has been able to reach...at least for your target demographic.  Sure, not everyone itches in the same place--heck, some folks really only need a vigorous massage, when it comes right down to it.  But the early adopters will give you the revenue and insights you need to go mainstream.

The problem is that MVPs are UGH-lee.  Features that should be no-brainers are missing.  And features are vastly outnumbered by bugs.  Performance is slow...assuming the whole thing doesn't crash altogether.  Error-logging is practically non-existent.   Cut corners and hard-coded "special cases" are the norm rather than the exception.  Customisation?  That's done by directly editing the database.  And automated build-processes?  Puh-leeze--getting a new version out the door would make Rube Goldberg weep tears of blood.

That's excruciating to the software developers who have to hold their noses, grit their teeth, and shove the dewy-eyed Beta version out into the cold, cruel world.  There's no post-release euphoria, because the pre-release sprint is merely the warm-up for the iron-keyboard marathon of whack-a-mole bug-fixing and the unholy offspring of Tetris and Calvinball that determines the next set of features.

Example:  One of the enthusiastic early adopters wants this one extra feature that will put them eighteen months ahead of their closest competition.  And--get this!--they're willing to pay for it.  Woo-hoo!  Problem is, their pet feature so whacked-out that it will change the overall architecture of the app.  Worse, absolutely no one else has asked for anything close to this.  Ever.  So...do you shut up and take their money?  Or do you focus your already-overstretched resources on making the app. more appealing to the mainstream?  That sort of thing.  Fun times.  And just another day in Beta-land.  Ah, the sexy glamour of software development...

But subjecting my code (yet again) to the rigours of the Real World(TM) makes me realise that, at some point in its life, code exists in a quantum state.  There's the optimism (i.e. glass half full) that it will be "good enough" to add value for its early adopters...and have enough time/resources to evolve for a wider ecosystem.  There's also the cringing awareness (i.e. glass half empty) of just how much duct tape tenuously holds together too few features...that all have your name (and reputation) on them.

Typically, that "quantum" state isn't long-lived.  Which is a mercy, because it's rather uncomfortable.  If I were Schroedinger's cat, I'd be gnawing my way out of the box by now.

Thursday, June 25, 2015

Debt and currency in the "favour economy"

I owed a former colleague a couple of favours--one of them definitely outsized--dating from more than a decade back.  Fortunately, (most) favours don't accrue interest, but when the opportunity came this week to pay one of them back, I was more than pleased. 

Alas, "repayment" involved the squirmy discomfort of having to give a thumbs-down review of an interviewee.  (I don't like to see anyone stay unemployed, but...daaaaaaaang...)  Worse, I'm almost certain that the review was ignored as soon as it was out of my mouth.  Which means that a few months (weeks?) hence I'll have to put on my "adult professional" hat and keep the "Neenerneener--told you so!" to myself.

That's when I realised how different "paying it back" can be from "paying it forward."  Namely, there's significantly more leeway with the latter.  Often the timing and even the coin itself are left to the debtor.  That's more than likely why paying it back feels so much more legitimate.

Don't get me wrong--I'm thrilled to (finally!) scratch one off the accounts.  I'm never comfortable with debt, monetary or otherwise.  Besides, having something to offer can be pretty darned validating.  Pretty much any tight-knit community (business, recreational, or otherwise), runs on trust--on which the exchange of favours is of course predicated. 

But I suppose the whole uncomfortable experience provides an extra incentive to up my game on the "paying it forward" half of the equation, right? 

Tuesday, June 23, 2015

What's wrong with this picture?


Okay, so it’s a dirty little secret that an application’s Admin. pages might not be as polished or as bullet-proofed or as well-documented as those made for the general population.  Why?  Because Admins are assumed to be more familiar with the interface from day-to-day usage.  But seriously, this is just phoned in.  "1 to 32" characters when a minimum of 3 different types is required?  Bad opensrs.net!

Wednesday, June 17, 2015

The second-best thing #navelgazing

In the past, I've joked that programmers actually work for the fifteen-minute high we get after squishing a software gremlin.  That's a teeeeeeensy bit of an exaggeration.  The sober truth is that we work to pay the bills, pay for our toys AND for the fifteen minute high we get after squishing a software gremlin.  Because gremlin-squishing is The Best, yo.

There's a secondary high, though.  It's the resigned feeling we programmers get about having to add tedious "plumbing"-type code to the current project, which is subsequently countermanded by the euphoria that comes from cracking open the pertinent file, class, function, stored procedure or what-have-you and realising that we had already thought of that particular situation or edge-case*.  Woo-hoo!  No tedious plumbing after all**.

I really could have used Programmer High #1 today [grumblegrumblegrumble...jQuery UI...grumblegrumblegrumble], but I'm perfectly happy to settle for Programmer High #2. 

- - - - -

* Because we don't necessarily remember writing that code (even if it was, like, two weeks ago), we pat ourself on the back for our future-proofing prescience.  The more likely explanation, however, is that there was nothing particularly interesting in our social media feeds at that point, so we just got stuck in and took care of it just because we were already in The Zone by that point.  Which makes a perfectly good excuse to check our social media feeds now, because we're ahead of the game, right?

** In software, there's something called "technical debt," which translates to short-cuts, kludges, and shameless rationalisation (e.g. "We'll never have enough traffic to worry about performance bottlenecks.") that come back to bite.  Typically at the least convenient time.  As with public debt, it largely originates from wishful thinking at the top and/or the inability/unwillingness at the bottom to say "Nope.  That's never going to work under the current budget and deadline."

Monday, June 15, 2015

One thing (a rant)

This will likely come off as whining, but one thing about being self-employed that's taken some getting-used-to is taxes.  Not the actual check-writing part so much*.  Just the fact that I have to go through all the rigamarole more than once a year now.  And, sadly, I'm even pretty diligent about record-keeping, so it's not like it's a desperate, chaotic scramble to pull all the info. together.

But even irritation over busywork pales in comparison to the hypocrisy of our (nominally) elected (so-called) leaders.  I'd take politicians rather more seriously if they'd stop pretending that they're geared for any business smaller than a global giga-corporation.

Sure, if you employ other people, regular filings are pretty much required to keep everything on the up-and-up.  Fair enough.  Heck, I would object much less to even quarterly filings if they didn't expect psychic powers.  Having to compute quarterly revenues/expenses fifteen to sixteen days before the quarter is even over is what burns my bacon. 

The point is that a freelancer doesn't get to the point of being able to hire other people without slack.  Slack is somewhat easier to come by without having to drop everything for inane paperwork four times a year, spank you very much.

So, yeah.  Politicians--if you can spare time from your punishing treadmill of ribbon-cutting and baby-kissing and back-slapping and deal-making and poll-watching--howsabout you wrap your brains around the simple notion that businesses generally start small?

Garage small.

Spare bedroom small.

Dorm room small.

Look.  I know you want to take credit for the next Irving or Radian6 or Clarity or whatever.  But it's more likely to happen if I'm not wasting hours of my otherwise billable time with redundant paperwork.  And especially not when Freddy and Ottawa are taking their cut of my revenue before it's even in the bank.

You say you want a business-oriented environment and jobs, Jobs, JOBS.  I say put up or shut up.  Get just a teeeeensy bit real (for once) about what it's like here in solopreneur land.  You want to do one thing to bootstrap the next big thing?  Let solopreneurs file once a year on April 30th and let them take care of business the other ~364.242 days of the year.  Then maybe--just maybe--I might not roll my eyes at your platitudes and bandwagon-jumping quite so much, m'kay?

- - - - -

* Although the cost of banking is another (cough!) "privilege" (cough!) of being in business for yourself that no one warns you about.   Going by the price, the paperstock of business cheques is made exclusively from wood culled from ancient elven forests before being artisanally hand-pulped by craftspeople whose oral history does not even know of a time before they were wood-pulpers.  Then the printing-plate for each cheque is hand-engraved by printers selectively bred from the direct descendants both Johannes Gutenberg and Aldus Manutius before being inked with Soviet-stockpiled 1970s-vintage IBM Selectric typewriter ribbons reconstituted by unicorn tears.  (Sadly, that's the most rational explanation I have for the cost differential.)

Wednesday, June 10, 2015

A (wrong) turn of phrase

Today, I was about an hour ahead of schedule for a meeting.  I normally can't make enough excuses to visit Moncton's Cafe C'est la Vie, so it's not like I was constantly checking my watch.  I'd packed both a tablet loaded with books as well as a treeware one, but instead I ended up mostly ignoring both in favour of the raver conversation going down a few tables away.

The tribulations (or "pain-points," in Marketingese) of being a rave-going millennial actually spawned a business idea.  Mind you, it's not the kind that's going to make me dump everything to start hacking out code and recruiting co-founders who grok sales and CSS and mobile and the problem domain, respectively.  But it's one that's at least worth exercising my Google-fu.  Just not tonight--it's already late and, besides, the current client always takes priority.

But the experience made me question the wisdom of the English cliché, "the idea came to me."  Maybe I'm the anomaly here, but generally I have to go to the idea.  I just know that this is not an insight I would have had chez fivechimera. 'Nuff said.

Monday, June 8, 2015

Another thought on diversity

A couple months ago, I was both amused and encouraged by the example of camaraderie among people who can be notorious for their religious wars factionalism. 

Today I had occasion to muse upon diversity again, albeit from a different angle.

I'm working on the database of an application that will--if all pans out--eventually be available to professionals in Canada and the United States (at a minimum).  The superficial view is that we can get by with just an English-language version.  At least during an invitation-only beta.  In the long run, however, French and Spanish will have to be added.

If my Gentle Reader is not a programmer, the only thing that s/he needs to understand is that there are three significant classes of numbers in data design (and programming for it):
  • One
  • Zero
  • Any number greater than one
As Three Dog Night famously pointed out, one is the loneliest number.  But it's also (by far) the simplest to wrap our brains (and code) around.  For example:  Currently, we each only have one height, one weight, one age.  Easy-peasy, right?

If a programmer is creating a table,  s/he can get away with a spreadsheet-like model.  For instance, each customer would have their data on a single row:  Account ID, First Name, Last Name, Middle Initial, Current Balance, and so on. 

Zero complicates matters.  For instance, I had a chequing account years before my driver's license.  Which sometimes made it awkward at the counter, at least in the U.S., because that magic rectangle of plastic was somehow a talisman against the cheque bouncing.  (In essence, one driver's license number was expected, but it was just plausible that zero was an acceptable number.)  Usually the clerk and I worked something out that involved my University ID and my Social Security card.  To some extent, that prepared me for the limbo between the time Dennis & I pulled up stakes for Canada and the time we obtained our Social Insurance Numbers (which things like utilities, banks, etc. expect to set up accounts).  Again, it was just possible that zero was an acceptable number, but extra hoop-jumping (and sometimes expense) was involved.

To the programmer, it means some extra brain-work.  One has to remember to set database tables to accept no (a.k.a. NULL) values.  One also has to remember to allow "None of the above"-type options in drop-down boxes.  Also to give "none" or NULL a pass when validating data passing in or out of the database.  Extra brain-work, naturally, translates to extra time, and of course extra expense.

For numbers over one, though?  Hoo-boy...that's a whole different ball-game.  Let's circle back (in management-speak) to the language thing.  For this particular application, we can set up each client to have a preferred language.  But--particularly among those who speak French and/or Spanish--it's more than likely that a client will be fluent in more than one language.

If we were still storing client info. in a spreadsheet, we'd simply have a "Preferred Language" column and another titled something like "Second Language."  In most cases, that column would just be wasted space.  And wait a minute:  What about people who are fluent in more than two languages?  Case in point:  One of my step-in-laws speaks six languages.  (He's originally from the Netherlands and now lives in the U.S., which pretty much guarantees four languages.) 

That's the point where a programmer trades in the spreadsheet for something called a relational database.  The database replaces the single table of clients with three:  One for basic client info.  (all that "one" stuff like name, age, balance, etc.), one small one that merely lists the supported languages, and another table that links clients and languages.  The beauty of that arrangement is threefold:
  1. There's no wasted space from that unused "Second Language" column.  Which may not seem like a big deal for a few hundred records, but when you scale into the tens of thousands and millions really adds up.
  2. The solution is infinitely scalable--it can accommodate the linguistic xenophobe as well as the Babel Fish with no hacks required.
  3. (Bonus) The data stays cleaner.  If the "Preferred Language" and "Second Language" are text fields, then someone will inevitably misspell language names.  That just corrupts the data.  In the relational model, the third (i.e. "association") table links clients and languages by their ID numbers.  Which not only takes up less hard drive space (numbers are cheaper to store than sets of letters), but makes it much, muuuuuch harder to screw things up.
Of course, it adds a level of complexity to the way the code interacts with the database.  But here's the thing:  In my dozen-plus years of coding, I've found that 1-to-1 relationships between data are the exception rather than the norm.  In the end, it's easier (meaning less painful and expensive) to bake in diversity from the get-go than try to hack it in after the fact.

And, as it turns out, that's not the worst metaphor for coping with the world, either.   Just sayin'.

Friday, June 5, 2015

Frivolous Friday, 2015.06.05: Good-Bad vs. Bad-Bad

While the sun and breeze permits, I'm inching along on the upstairs painting project.  Meanwhile, Dennis has the somewhat more messy job of replacing the downstairs carpet with materials that don't actually date back to Disco.   (On the plus side, he has the luxury of power tools and a distinct lack of cats trying to sneak into his lap while he uses them.)  Last year, my motivation was to avoid another winter of having my soul bleached by white on both sides of the walls.  This year, we're both hoping to re-boot the October tradition of hosting a "Carve Pumpkins and Watch Army of Darkness" party--which would effectively double as the housewarming party we never had after we landed.

Army of Darkess, (a.k.a. AoD), being the third installment of the Sam Raimi / Bruce Campbell Evil Dead trilogy, is merely the main course of the party.  Historically, the challenge has been to find different "side dishes"  for it each year.  I say "challenge," because it's not always easy to find horror movies that manage to exist in that quantum state of being both Bad and Good at the same time.

Horror is easy to do badly, but the problem is that even when it's done splendidly, it's eventually riffed-on and ripped-off until the meme becomes stale.  (Although Mel Brooks's--ahem!--"homage" to Hitchcock's Psycho in High Anxiety was sublimely sick and brilliant at the same time.)  But that's pretty much academic anyway--pairing AoD with Hitchcock would be like washing down Kraft Mac 'n Cheese with vintage Grand Cru Bordeaux.  So that basically rules out reasonably nuanced, well-plotted stuff like The Gift, The Sixth Sense, or Ju-on. (I'd lump George C. Scott's The Changeling into that class, except that its biggest horror was the nepotism that cast Trish Van Devere as the love interest.  You'd think that a husband-wife team would have on-screen chemistry.  You'd be wrong.)

Then again, pure Jason/Freddie/Chucky slash doesn't fit the bill either.  If I want shallow, trashy, Shakespeare's- off-his-meds-again schtick, I'll dig up the Cliff Notes for Titus Andronicus, kthxbi.

The classics might be a viable bet--although guests my age likely suffer from a uniquely generational affliction of vision that superimposes the silhouettes of two robot heads flanking a human head over the bottom center of any black and white horror movie screen.  Mostly, though, you really can go home again when Boris Karloff, Bela Lugosi, Lon Chaney, Jr., and Claude Raines are keeping the torches lit just for you.

Still, going straight for MST3K won't steer away from the overall theme of the day.  The safer bet, however, is to pair cheeseball with more cheeseball.  Yet even there, some discretion is required.  It's basically because cheeseball comes in about three different flavours:
  • Cheeseball that knows it's cheeseball and just rolls with it.  Army of Darkness falls squarely into this category.  Snappy dialogue delivered with tongue firmly lodged in cheek.  Why burn calories suspending disbelief for a whole 90 minutes when the entire cast clearly isn't taking it seriously either?  See also Big Trouble in Little China.  Ditto Shawn of the Dead.
  • Cheeseball that refuses to acknowledge its artery-clogging goodness--and thus ruins the whole taste.  No organic, gluten-free artisanal cracker in the world would make this kind of movie respectable, yet an entire studio is trying to convince us that caviar is really nuclear orange.  Into this category I'd lump Re-animator and the steaming $40M mess that Francis Ford Coppola made of Dracula.  Or even a (cough!) "classic" like the silent Phantom of the Opera, whose bizzaro dominance-and-submission subtext made it the 50 Shades of 1925.
  • Cheeseball that is inadvertently, hilariously bad to the point of being watchable.  (Admittedly, this cheeseball pairs best with alcohol.) Forget Star Trek, Kingdom of the Spiders gave William Shatner most of the A-grade B-list street cred. he has today.  And I broke my two-glass wine limit the night we took Mega Shark vs. Giant Octopus out for a swim.  (Which was probably why the shark vs. airliner thing was so darned funny.  At the time, anyway.)  Beware of the Blob is probably a solid candidate, but Mom had the great, good taste to turn the channel when it was on TV back in the 70s.  And strangely enough, I don't think it'll be on Netflix or even DVD anytime soon.  (Fortunately, there may be more hope for C.H.U.D.)
But as much time as it takes to track down appropriate sides to AoD, there's still time needed to actually screen them before we inflict them on our guests.  Because Cthulu knows we learned our lesson the hard way with Bubba Ho-Tep.  Never again.  [shudder]

Monday, June 1, 2015

Truth in metaphor

So after about a year and change, I've become serious about that whole sit-to-stand work-style.  True to form, hardware constraints threw up a few #firstworldproblems roadblocks.  But the office is back together in a friendlier configuration than before, and despite having to give up a monitor, I consider it a net win.

As before, the style takes some getting-used-to.  Unsurprisingly, I've been toggling between my soles and my backside all day.  That I remember from before.  What I didn't remember--or perhaps didn't appreciate the first time--is how standing takes the edge off my concentration. 

I suppose that if I worked at a job that primarily required standing (guard, chef, etc.), it might well be the sitting part that would feel slightly off-kilter.  See, at any given time, we have a fixed pool of processing power from which to draw.  And even your body responding to non-default sets of stimuli has to tap into that pool.  That includes the muscles which now have to work in different configurations to maintain balance in front of a keyboard and screen.

Granted, I've known for years that trying to read anything technical while on the Stairmaster is less than pointless (because the only thing that's absorbed is my sweat into the pages).  But this was a bit of a revelation. 

In time, my brain and lower body will come to terms as this begins to feel more "natural."  In the meantime, however, I'll have extra appreciate the abilities of those who are praised for being able to "think on their feet."