Bugs and Accidental Branding

The team I’m on recently released a new product. We’ll call it ShinyNewThing. Several weeks of work and discussion and a soft roll-out to some beta users and we were feeling pretty good about ourselves. People were excited about ShinyNewThing.

Oh, sure, testing had revealed an issue early on, but that was clearly an invalid test, the product would never work like that in the wild, right?

Of course it would.

ShinyNewThing only works on root domains and a lot of people want to put it on subdomains. In retrospect, we’re left asking why we ever assumed they wouldn’t in the first place. In fact, noticing the “bug” (as people were still calling it at the time) was kind of embarrassing.

So the team looked into it and started work on fixing it and included it in our weekly status report. Item six of six, tucked in right at the bottom:

ShinyNewThing for Subdomains

And it hit me.

By labeling it that, we had accidentally created a new product. Retroactively we had eliminated our mistake.

If we’re working on ShinyNewThing for Subdomains now, clearly ShinyNewThing was never meant for subdomains. We didn’t make an assumption, we simply followed a business decision.  That that business decision never happened doesn’t matter.

It’s an example of the importance of branding.  Nevermind that we’ll never actually use this name publicly, that we’ll own up to it as a bug caught while the product was in beta, and that it’s not intended as a brand.  It’s pretty clear that we could hide behind this name if we wanted and no one would be the wiser.

On Hockey Jersey Numbers

Anyone who follows the DetroitHockey.Net Twitter account has probably seen me rant about jersey numbers more than once.  Jersey numbers (in all sports, but especially hockey) are interesting to me – to the point that I once created a database of historical player jersey numbers (the now-defunct HockeySweaterNumbers.com).

Today I was cataloging some hockey cards I hadn’t put away yet and I started mentally ranting about the #6 jersey worn by Bobby Ryan of the Ottawa Senators.  Ryan’s “actual” number is #9 but when he arrived in Ottawa it was taken so he flipped it and went with #6, a number not traditionally worn by forwards.  If I were him, I’d have gone with #90 (which is what both Mike Modano and Stephen Weiss did when they came to the Detroit Red Wings, where their usual #9 is retired) or back to the #54 he wore as a rookie (and has worn internationally for Team USA).

I’m a little bit of a stickler for those traditional numbers.  Not militantly, otherwise I’d say no goalie should wear anything other than #1 or #30.  I actually wrote that bias into my FHLSite software (which runs the fantasy leagues on DetroitHockey.Net) as a function that determines what number a traded (or drafted) player should wear on his new team.

At the start of each season, every player’s current number in the NHL is pulled into FHLSite as that player’s “default” number.  This is actually one of the biggest flaws in the system, as it assumes that every player is wearing his preferred number in the NHL but we’ve seen that’s not true with Ryan (similarly, Brad Richards will wear #17 with the Red Wings next season because the #19 he prefers is retired [and the #91 he has worn when #19 wasn’t available may as well be]).

When a player joins a team, the first check is to see if that default number is already available.  If it is, no additional work is needed, the player gets that number.

If there is a player with that number, the second check is to see if it’s actually that player’s default number.  If it’s not, the new player will get his default number and the old player will get a new number (maybe even his default number, as it may have become available since that player joined the team).  This was the case in real life, for example, when Brian Rafalski joined the Red Wings and took #28 from Tomas Kopecky.

If the player can’t get his default number for whatever reason (as was the case with Ryan, Modano, and Weiss), there are three branches based on if the default number is single- or double-digit or if the player is a goalie.

Goalie numbers are weird in hockey.  In the days when teams only carried a single goaltender, the goalie almost always wore #1.  When backups started joining rosters, the backup was often assigned #30.  Then #35 started coming into use, then #31, then #29, then all sorts of numbers.  Because of this, if a goalie’s default number can’t be used, the function will attempt the #30, #31, #35, and #1 (in that order) to find a new number for a goalie.  A goalie like Andrei Vasilevskiy of the Tampa Bay Lighting, who wears (the ridiculous) #88, isn’t going to be forced to take a traditional number if his default number is available, but the search for a new number will start with traditional numbers if it needs to.

For skaters with double-digit numbers, the first attempt is to try the reverse of the number (such as what Richards has done in the past, taking #91 when #19 wasn’t an option).  The second pass takes the first digit of the number and swaps out the second digit for a zero (as when Jordin Tootoo joined the New Jersey Devils and had to give up his usual [and since-regained] #22 for #20).  The third pass only takes place if the first digit and second digit match, checking to see if that single digit is available (so a player wearing #44 would switch to #4 if neither #44 nor #40 were options).

Skaters with single-digit numbers have similar options in reverse.  The first check is to append the single digit to itself (as Jeff Carter did when he went from wearing #7 with the Columbus Blue Jackets to wearing #77 with the Los Angeles Kings).  The second is to try appending a zero to the digit (as Vincent Lecavalier did when he switched from #4 with the Lightning to #40 with the Philadelphia Flyers).

After all that, even if we found a number there’s still a sanity check to pass.  As I mentioned, traditionally only goalies wear #1, #30, #31, and #35.  Only defensemen wear #2, #3, #4 (forward Jean Beliveau of the Montreal Canadiens is a famous exception, and Lecavalier wore it in his honor), #5, and #6.  Forwards don’t have any numbers restricted to them but #8, #9, #10, and #12 are pretty rare among defensemen so I counted those.  That means that if our logic landed us with a restricted number (that isn’t the player’s default number), we toss it out and keep moving.

At this point, we can just try to get something close to the preferred number for skaters.  We start at the default number and move one digit away in each direction until we find an open number.  This is actually a way that Richards could have arrived at #17, as this method would have started at #19 and tried #20, #18, and #21 (all taken) before landing on #17 (available).  The restricted numbers are honored here, as well, so if a skater’s default number is #28 on a team where #26, #27, #28, and #29 are taken, he’ll be assigned the open #25 rather than the open #30 or #31.

For goalies the search is simpler.  Since we’ve already tried the default number and the traditional goalie numbers, we start over at #30 (which is overkill because we already know #30, #31, and #35 are taken) and increment by one until we find an open number.  Goalie numbers in the 30s are commonplace now so while #32 or #37 (for example) aren’t as traditional, they’re not uncommon and are acceptable in my eyes.

As I mentioned, the big flaw is that it assumes that the number a player is currently wearing in the NHL is is actual number.  Using this logic, Richards could get traded to a team where #17 is taken but #19 is available and he’d end up wearing #71.  Or Ryan could get #66 instead of #9.  It also doesn’t account for any historical number use, such as Ryan wearing #54 in other cases where he’s been able to wear #9.  That said, it pretty much represents how I think hockey jersey numbers should work.

On Salary Requirements

A friend of mine who’s actively looking for a job pinged me yesterday morning looking for advice on what salary to request.  My friend’s requested salary was a required field on the application form.  I don’t like this, and I said as much via Twitter.

Another friend called me out on that, so allow me to explain a bit further.

I’m a firm believer in the hiring process being a two-way street.  It’s as much an opportunity for a company to vet an applicant as it is for the applicant to confirm that he or she actually wants to work at that company.  By naming a dollar amount up front, the applicant is forced to do so without any of the information that would be gathered during the interview process.

All jobs are not created equal.  Maybe I’ll take less money from your company because you’ve got some really cool technology I want to work with or you’re closer to my house or there’s a good restaurant across the street.  Maybe I want more from you than I would someone else because you have an open office plan or you give less time off or I’m going to have an awful commute to get to the office.

I will say that this doesn’t account for job postings that include a salary range, which would seemingly be the company stating up front what they’re willing to offer, without knowing anything about the candidate.  In my friend’s case, there was no range given.  That means they were asking “You know nothing about the job, you know nothing about how much we’re offering, what’s your price?”

That said, I don’t really think companies should bother with a salary range.  I can go on Glassdoor and see what the range I can expect to get for a given job is.  So can the company.  Both sides should know what to expect without spelling it out ahead of time.  I think that the interview process is a valuable enough learning experience that I’m willing to take the chance on getting a lower-than-expected offer if I apply somewhere and it turns out we’re not on the same page.

Maybe some people – and some companies – aren’t willing to take that chance.  That’s a mistake.

On Social Media Terminology

I’ve got a high school reunion coming up, which means I’ve been added to a group for it on Facebook, which has immediately been followed by a small avalanche of friend requests from people I haven’t spoken to in years. It got me thinking about the different terminology that social media sites use.

On LinkedIn, the people you know are “connections.”  It’s an unassuming word that makes a lot of sense to me.  You know that person, they know you, there is some kind of undefined connection between the two of you.

On Google+, they don’t even label these connections.  You place people in circles, which you then get to label yourself.  Maybe you have a “People I Hate” circle for some reason.  Maybe you have a “Family” circle.  Google+ is agnostic to your labels.

Twitter is my favorite.  As a broadcast medium, on Twitter you simply have “followers.”  Maybe they’re friends, maybe they’re family, maybe you don’t even know them.  The only connection is that they follow you (you don’t even have to be following them back).

But Facebook sticks with “friends” as their label.  Maybe it’s borne out of their initial battle for social media supremacy with MySpace (“The Place for Friends”), I don’t know.  And while Facebook includes the ability to group your connections, even people in a “People I Hate” group are still labeled as friends.

Maybe it’s a small thing.  I follow tons of people I don’t know on Twitter.  I’ve got connections with recruiters I’ve never actually met on LinkedIn.  Facebook?  Almost entirely people I’m actually friends with (plus a couple people who used to be friends).

Talking About the Weather

I was staring in anger at my car thermometer this morning when I had a little bit of a revelation.

You think about the weather and, in general, people understand concepts.  Hot and cold.  Dry and wet.  We’ve attached numbers to them and we know what they mean but only because we’ve made this association between the number and experience.

Okay, nothing groundbreaking but as I was staring at this “-9” in my dashboard, I got to doing the math.

We generally consider 70 degrees to be a pretty nice temperature.  Maybe 75.  Whatever.

And freezing is, of course, pretty cold.  Kinda miserable.

Today we are just as far from freezing as 70 is, only in the opposite damn direction.

I’m cold just thinking about it.

Building a Custom Hockey Puck Display Case

A couple years ago when I has having my basement finished I set aside an area for displaying some of my hockey memorabilia.  Actually, it was more an area so that I could start collecting the things I always said I would, as I’d kind of held off on collecting much due to space constraints.

I’d wanted to start collecting signed jerseys and sticks so I made sure to plan for those.  Along the way, though, I kind of lucked into some signed pucks that I had no plan for, so I came up with something.  I recently had to update that plan and realized I’d never written any of it down, so I figured I’d write about it here.

The problem I was looking at was that I had three pucks at the time and wanted to be able to add some more.  I also wanted the display to hang on a wall.  Most of the puck display cases available for purchase fit twenty or more pucks.  The smaller ones are built to sit on a tabletop.  I couldn’t find one that was quite what I wanted.

A mock up of how three hockey pucks fit in my hockey puck display case.
A mock up of how three hockey pucks fit in my hockey puck display case.

So I built one, starting with pretty standard 11″ x 14″ shadowbox.  The shadowbox is a little over an inch deep on the inside with a black frame and a black fabric backing.

That inch deep is important, as a hockey puck is 1″ thick and 3″ in diameter.  That also means that there’s room for three of them with a decent amount of space around them.  The pucks are positioned centered at 2 3/4″, 7″, and 11 1/4″ vertically.

Holding them in position are two 5/8″ wooden dowels, painted black and cut to about 7/8″ length.  The dowels are positioned 2 1/4″ apart, centered in the shadowbox, 1 13/32″ below the centerpoint of the puck they’re intended to hold.

The position of the dowels is what makes everything expandable.  When I got my fourth puck, I added a dowel 2 1/4″ to the left and right of the two existing center posts.  Instead of holding a puck in the center pair, I put one in the left pair and one in the right pair.  With the top and bottom rows untouched, my straight line of three pucks became a diamond of four.  Eventually the top and bottom row can be added to until the case displays six pucks.

I did make a mistake when I expanded the case to four pucks.  I cut the dowels much closer to an inch (probably measured one inch and took the line).  That mistake is one of the reasons I wanted to document this, so that next time I would know and not need to re-measure anything.  I don’t think the mistake is noticeable, though.

A photo of my hockey puck display case configured for four pucks.
A photo of my hockey puck display case configured for four pucks.

Update, 7/30/2016: I came back to build another one of these today and decided that a template for drilling holes would be nice.  It’s available for download here.

Problem Solving and Hockey Photography

I’ve written about applying development-like problem solving to realms outside my day job before and another interesting case of that came up for me this week.

I’ve been spending a lot of time over the last couple days at MSU’s Munn Arena for the annual MSU Pro Camp, where a bunch of former Spartans and affiliated players come back to East Lansing to get ready for their upcoming professional seasons.  It’s open to the public so I go on down and take photos for DetroitHockey.Net.

Once those photos are edited, I tag them with the player they’re of.  That’s easy when it’s someone like Justin Abdelkader or Drew Miller, who I’m familiar with, but a lot of these guys haven’t made the NHL yet or play in organizations I don’t see much.  Many wear visors so their faces are obscured.  They’re all wearing un-numbered MSU practice jerseys.  How do you tell who is who?

Some of those are still easy.  The NHL added numbers to the front of their helmets a couple years ago and there’s a guy in an Oilers helmet with #2 on it…  Well that’s Jeff Petry.  Boston #6 is Corey Potter.

Who’s this guy with a bunch of ads on his pants and helmet?  Oh, that must be Colton Fritter, who’s been playing in Europe where they have ads on their equipment.

The guy in New York Rangers pants but a helmet from the AHL’s Texas Stars?  Oh, Chris Mueller played for Texas last year and just signed with the Rangers as a free agent.

So it’s a matter of looking at the equipment and working through possible combinations.  At least until something really weird comes up.

So there’s a guy in Rockford IceHogs gear.  Okay, Jared Nightingale played for the IceHogs last season, no big deal.  Oh, wait, there are two guys in Rockford gear.  Nightingale is the only player listed as a participant who played there.  What’s happening here?

Well, sometimes non-Spartans tag along and they rarely get mentioned in the promotional material.  So while I thought equipment was enough, I didn’t know that Brett Skinner was there wearing the same gear as Nightingale.  Thankfully, Skinner is left-handed and Nightingale is a righty, so there’s an identifying trait there.

Hardly anything groundbreaking but I thought it was a fun kind of puzzle that I don’t get to try to solve very often.

Flashback to 1997

Earlier today, Amazon CTO Werner Vogels tweeted out an interesting look into Amazon’s past.

Now, there are lessons to learn from that letter and I don’t want to overshadow that, but there’s one line of nostalgia I just can’t get over.

Among the measures by which Amazon had improved in 1997, the following was listed:

We established long-term relationships with many important strategic partners, including America Online, Yahoo!, Excite, Netscape, GeoCities, AltaVista, @Home, and Prodigy.

That’s a lot of names of things that used to be huge, most of which no longer even exist.  I’ve got a soft spot for GeoCities, specifically, as the site that is now DetroitHockey.Net lived there for quite awhile and saw a ton of growth.

As I said, though, there are lessons to learn.  All of those companies were Amazon’s “long-term … important strategic partners.”  And Amazon outlasted nearly all of them (only Yahoo retains any kind of influence, though AOL limps along).

Thoughts on Children’s Stories

One of the things that being a parent has taught me is that children’s bedtime stories have some weird stuff in them.

Take Margaret Wise Brown’s classic, Goodnight Moon. The first half or so of the story is spent detailing the items that live in “the great green room” where a rabbit child is going to sleep. A telephone, a red balloon, a comb, a brush, a bowl full of mush, etc.

The second half is spent iterating through those items in a slightly different order, saying goodnight to them. There are some new things to say goodnight to, not mentioned in the first part, such as the closing, “Goodnight stars. Goodnight air. Goodnight noises everywhere.”

Tucked in the middle, though, is this:

Goodnight Nobody

“Goodnight nobody?” What the hell is that? May as well be saying to your child, “Good night, terrifying invisible creature in the corner, waiting for your parents to leave the room.”

Brown’s biggest crime may be in Big Red Barn, where she writes the following:

With some little puppy dogs,
all round and warm.
And they all lived together
in the big red barn.

Rhyming “warm” with “barn” is just all kinds of wrong.

It’s not like modern children’s stories get much better. Clemency Pearce’s The Silent Owl is – as you would expect – about on owl that refuses to speak. Successively, a fox, badger, bat, pair of mice, squirrel, rat and stag all try to get the owl to make a sound. In the end, the stag suggests the owl is mute (“or he doesn’t give a hoot”) before the owl breaks out numerous musical instruments to communicate, causing the furry woodland creatures to declare, “What a clever bird!”

The owl may, indeed, be mute. He clearly knows how to communicate, though. Instead, he rolls his eyes at the mice and ignores the “toothy tuts” of the squirrel. In fact, his reaction to stag asking for a sign that he’s okay is as follows:

They stared at Owl; he stared right back.
Who would be the first to crack?

It’s only after the stag “cracks” that the owl even attempts to communicate. He may be mute but he’s also a jerk, refusing to respond even to the person simply asking if he was okay.  Clever bird or just an asshole?

Jerk-ass protagonists, nightmare-inducing images… I may as well let the kid watch 24 with me.

On Problem Solving and Deck Repair

One of the things I love about my job – probably the thing I love most about it – is that it provides me interesting problems to solve.

Yes, I like writing code, and writing clean code probably prevents having to solve problems in the future, but the code itself is just a tool to solve a problem.  Over the Memorial Day weekend I spent some time working with a completely different set of tools to problem solve and it was a ton of fun.

Back in mid-November there was a pretty violent wind storm that came through our area.  Lots of trees and power lines down and we were among the many who lost power.  With a baby at home and no way to heat her food, we decided to evacuate for the night.

When we got back in the morning, I saw this on our deck.

A look at our damaged deck, with the railing broken, a post cap missing, and balusters strewn around.
A look at our damaged deck, with the railing broken, a post cap missing, and balusters strewn around.

We didn’t see what caused it but given that our neighbor’s trampoline went missing in the storm and debris from it was stretched across four yards, our working theory is that it got picked up, carried across one yard, slammed into our deck and snapped the railing, and then continued on.

A couple more looks at the damage, after a little bit of cleanup:

I managed to recover all of the balusters and the missing post cap was found cracked in half.  The screws holding in the missing side of the railing were sheared off, still stuck in the post.

Now, I’m extremely proud of this deck.  My dad, uncle, and I built it ourselves a few years ago and even though I can point out every tiny flaw in it, it’s something I look at and say “Holy crap, we made that.”  So it being damaged was unacceptable to me but I figured this was something that wouldn’t be hard to fix.  The pieces that were broken could be replaced, no big deal.  I figured I’d wait until Spring to take care of it in good weather.

Of course, it couldn’t be as easy as that.

Solution #1
Spring rolled around and I headed over to Home Depot to order another rail kit and post cap.  They managed to find my original order in their system and got the part numbers but it turned out that none of that is actually made anymore.  You can’t order those parts.  So that’s one option gone.

Solution #2
It was suggested that I just buy whatever rail kit came closest and live with the fact that it wouldn’t match perfectly.  As I said, I’m proud of this deck, so that was unacceptable to me.

Solution #3
Similar to the above, it was suggested that I have a piece of wood milled to match the design of the existing composite railing, then paint it to match.  This was also rejected out of hand because there’s a reason we went with composite in the first place, we didn’t want anything we’d have to re-paint every couple years.

At this point, I went back to the two pieces of railing I had and started looking at them more closely to see what could be made of them.

Solution #4
Glue the two pieces back together.  Construction adhesive isn’t strong enough to hold up enough for it to actually be a functional railing, so this one was out.

Solution #5
The rail kit is hollow.  Run a piece of wood through that gap to provide strength and then glue it back together.  I still think if I knew more this would have been the right solution but I couldn’t find anything that fit that space properly and was still strong enough to hold.

Solution #6
Run a piece of metal through the hollow rail.  Unfortunately, the screws from the studs that the balusters are held in place by go into the hollow space, so filling that area with metal was out.

Solution #7
Is there some kind of concrete foam I can spray in that gap?  Something that will harden and give me the strength I’m looking for but can be sprayed in to work around the odd shape of the opening and the existing screws going into it?

At this point I’m clearly grasping at straws, walking up and down aisles at Lowe’s looking for something I can use when it hits me:

Solution #8
Epoxy.  I’d been thinking in terms of tools I had used before, like construction adhesive.  Where construction adhesive is too weak, this particular epoxy can (supposedly) handle 4400 PSI.

I ended up running a thin piece of wood through the gap in the rail and screwing the baluster studs into it, then slathering a ton of epoxy onto the rail at the point of the break and joining it back together.  After drying, it has no give.

With the epoxy having worked so well, I used a little more of it to piece the post cap back together.

The broken screws and bracket were easy enough to replace (though I had to spray paint them to match the existing ones a little more closely) and now everything is back together.

The crack is still visible and there’s a bit of a stain where excess epoxy got out but I’m thrilled with the result.  From more than a couple feet away, you can’t tell it was ever broken.

Of course, I’ll see it every time I walk past it, but at least now I’ll look at it with pride in having found an acceptable solution instead of disdain for having had to settle.