Building Physical Things

Part of why I love software development is that I get to make things.  Through my efforts, something new has been created.  It’s a pretty awesome feeling.

As much as I love it, there’s something even better about building physical things.  Even something as simple as an Ikea bookcase.

Ikea "Hemnes" bookshelf box
Ikea “Hemnes” bookcase box

You start with a box.  It’s relatively small and clean and self-contained, but it really isn’t anything useful.  And the first thing you do is destroy it.

An unboxed Ikea "Hemnes" bookcase
An unboxed Ikea “Hemnes” bookcase

That neat and tidy box becomes a bunch of parts spread all over the floor.  It’s a mess.  It’s not useful and it’s even worse than the box because it’s in the way.  But the mess is also potential, as each of those parts has a place.

A partially-assembled Ikea "Hemnes" bookcase.
A partially-assembled Ikea “Hemnes” bookcase.

Then you get to work, and things start to come together.  The pile of parts gets smaller and smaller, fitting together with each other.  Your project starts to look recognizable, like, perhaps, a bookcase.

A completed Ikea "Hemnes" bookcase.
A completed Ikea “Hemnes” bookcase.

Then it’s done.  Your pile of parts is gone and in its place is a piece of furniture.

Working in software, there are no parts, really.  No matter how many pieces your project may be in, none of them are physical.  You can’t spread it across the floor and piece it together like a puzzle.  I wouldn’t trade my job, but sometimes it’s nice to solve a problem that’s a little more tangible.

On “Guaranteed Installation Windows” and Comcast

Seemingly everyone has a Comcast horror story.  No one likes the company and people who use their services do so begrudgingly.

Except for me.

Oh, sure, I know they’re ridiculously overpriced but I recognize that they can get away with that.  I don’t expect them to charge less than market value out of the goodness of their hearts.  They’re a business; they want to make as much money as possible.  Aside from the price, though, they’d been pretty good to me.  Seemingly I was the only customer they treated well.

Until last weekend.

I just bought a new house and Saturday was my big moving day.  I spent most of the day lugging around furniture.  Mattresses and a pool table.  The big stuff.  Heavy stuff.  By 4:00 PM, I was behind schedule and tired and ornery but I had a “guaranteed installation window” from 4:00 PM to 6:00 PM – set up using Comcast’s “Movers Edge” system – so I adjusted my schedule to make sure things were ready for the technician.

I made sure my TVs and the cable boxes I was bringing from my old apartment were all out and accessible.  My cable modem was plugged in and ready to go.  And I kept moving a little bit but for the most part I waited.

And waited.

And at 6:10 PM, I Tweeted this:

At 6:47 PM I got a phone call from the technician telling me that he would be unable to do the installation that day because he didn’t have any equipment for me.  Two things were wrong here.  First, as I mentioned, I brought my own equipment.  Second, apparently this lack of available equipment was not evident until 45 minutes after my appointment was supposed to happen.

So I told him that I had the equipment already, brought over from my previous residence.  He was first surprised, then told me that I needed new equipment for their X1 platform.  I told him that I already had the X1 equipment.

At this point, he paused for a moment, then asked me if I’d tried hooking any of it up.  I had not, so he told me to give that a shot as service to the house was already showing as active.

So an hour after the technician was supposed to have been there, I found myself doing the install myself.  The TVs worked just fine.  He called back as I was getting the modem set up.  After I had it plugged in, he sent it a signal.  It worked too.  Happily, he pronounced everything complete and asked me to text him the address from which my equipment came, then disconnected.

The next day I got a response from @comcastcares apologizing for the late appointment arrival.  After I explained that it wasn’t a late arrival, it was that he didn’t show at all and I basically did the install myself, they gave me a $20 credit.

Frankly, my time is worth more than that.

Now, the experience isn’t going to get me to switch, and Comcast knows that, which is why they can get away with this.  They’ll continue to take my money (minus a token $20) happily.  They’ll put up with public shaming in the form of this post as long as I pay my monthly bill.

So I don’t expect to change anything.  I’m not trying to change anything.  I’m just putting this out there as one more Comcast horror story.

Thoughts on The Force Awakens

Like any self-respecting nerd, I have capital-t Thoughts on The Force Awakens.  I didn’t see it on opening night but I did make it before the weekend was out.  I’m sure my thoughts aren’t anything new but I want to get them out of my head so they’re coming out here.

It should go without saying but there will be spoilers ahead.  Sorry, no getting around that.

I should also state off the bat that I loved the movie.  I’m going to focus on things that could come across as complaints but I feel like they’re nit-picks more than anything.  The Force Awakens was beautifully put together.  Well-acted, visually-stunning, with an incredible John Williams score.

That said…

I came away from the film feeling like it was a “darker and edgier” remake of A New Hope.  Orphan from a desert planet meets an unexpected older mentor, finds that s/he is force-sensitive, sees said mentor struck down by a dark Jedi in a black suit and mask, then barely escapes as a planet-destroying superweapon is wiped out by a rag-tag fleet.

But wait!  It’s gender-bent!  And the mentor is killed by his own son!  And the superweapon is even bigger!  And people actually get stabbed/sliced/etc. by lightsabers!  It’s like they took the Battlestar Galactica playbook and applied it to Star Wars.

It’s awesome.  It’s larger in scope than Episode IV.  But I think it’s impossible not to make those comparisons.

Additionally I have an issue with the balance of power between Rey and Finn.  Rey is a complete badass.  Pilot, mechanic, handy with a blaster and, apparently, extremely strong with the Force. Finn…  Well, comparatively, he’s okay, I guess.

I’ve seen a lot of stuff calling Rey a Mary Sue (or other worse, misogynistic things) but I actually have no problem with her character.  I just wish we saw more of what makes Finn tick.  This is a guy who deserted the First Order because it was The Right Thing to Do.  Who picked up a lightsaber because it was the only weapon available and he needed to fight.  Who used that lightsaber – with no training – to fight the closest thing to the personification of evil that he’s ever seen.

That’s badass, too, but seems overshadowed by just how incredible Rey is.  Not saying anything should be taken from Rey, I just would have liked more backstory for Finn.

That said, I imagine backstory for both characters will be prevalent in future films.

On the Dark Side, we have Kylo Ren.  Clearly this is a heavily-conflicted character.  It’s impossible not to compare him to Anakin Skywalker (which, as he basically worships Darth Vader, is pretty much the point).  I think he could actually be more of a bad guy than Vader as Anakin was pretty much tricked into joining the Dark Side.  Han Solo tells his son that he’s been tricked, but I think Ben chose of his own free will to become Kylo Ren.  We may learn otherwise in future films – redemption arcs are big in this series – but it seems to me that Ben didn’t want the power of the Dark Side for any noble purpose like Anakin, he just wanted power.

Seeing him without his helmet adds to that, I think.  He’s not a deformed half-man confined to a suit like Vader.  He’s a human who chooses the suit.  He can take it off.  He just doesn’t want to.

Speaking of the Dark Side…  As Rey embraces the force in her battle with Kylo Ren, it sure seems like she’s putting a lot of hate and vengeance into it.  We know those lead to the Dark Side.  I wonder if anything will come of that.

If the new trilogy is darker and edgier, it wouldn’t be too much of a stretch for Rey to turn to the Dark Side, with her conversion showing Ben just what a horrible thing the Dark Side is and pushing him back to the Light Side.

Google Works in Mysterious Ways

I was in a pairing session with one of my teammates earlier today and we stumbled into an interesting little bit of inspiration.

Working in Javascript, we were thinking about splitting some values while iterating through an array but that didn’t really feel like the right answer.  Looking for some kind of better solution, my teammate Googled “split” looking for documentation and similar examples.

I immediately laughed because a Google Maps search result was included, which was completely outside the context of what we were searching for (though a valid search result for the simple query we entered).  As I explained why I was laughing, though, something hit us:

That gut feeling was right.  We didn’t want to split anything.  We wanted to apply a map to it.

I guess Google gave us our answer.

Full Stack Engineer vs. Web Developer

When I started my professional career at Michigan State University’s Division of University Relations, I was a web developer.  I wrote PHP and ASP and JavaScript and HTML and sliced up images in Photoshop and designed MySQL databases.  I had to do a little bit of server management.  I also trained clients in how to use the systems I built for them but that’s beside the point right now.

When I made the jump to TechSmith Corporation I retained the title of web developer.  I wrote ASP and JavaScript and HTML and didn’t slice up as many images but did work with MSSQL databases.  I had to do a little bit of server management.  I also wrote VB6 apps.

Over the years at TechSmith the ASP and VB6 (mostly) gave way to C# but that wasn’t the only change.  Somewhere along the line I became a software engineer.

I can’t speak for the industry as a whole but at TSC there was an impression that web devs weren’t “real developers” compared to the software engineers working on the company’s desktop products.  So everyone became software engineers and everyone was equal, even if the job didn’t change at all.

Fast forward to several years ago and the term “full-stack engineer” starts being thrown around.  A full-stack engineer being someone who writes back-end code and front end code and maybe does some image manipulation and can do some server management…  And I fail to see how this isn’t what we used to call a web developer.

As an industry, did we create a new title just to get the word “engineer” into it?  “No, I’m not one of those slacker web developers.  I’m a full-stack engineer.”  I get that the term became famous when Facebook was (supposedly) only hiring full-stack devs but why give it that name when “web developer” already meant that.

For a long time, even after my title at TechSmith changed, I defined myself as a web developer.  One of my mentors called me out on it and I couldn’t explain why I clung to that label.  Maybe it’s because, the way I see it, “web developer” is just less of a mouthful than “full-stack engineer” and more accurate than “software engineer.”

If there’s supposed to be a difference between web developer and full-stack engineer, I don’t see it.

I should say that I don’t actually have a problem with the full-stack engineer title.  Web development has evolved.  There are fewer gaps between web development and mobile development than there were a decade ago, for example.  I just see web developer and full-stack engineer as the same thing and think it’s jarring to see the titles used as if they’re not.

The Tools We Choose

So a little while ago I was thinking about Ricky Robinett‘s blog post about using Twilio to get notified about World Series ticket deals.  Specifically, I was questioning the use of Twilio to drive the notifications.

Personally, I prefer my notifications via email.  To the point that I look at that post and think, “Come on, he only got his notifications via SMS because he works at Twilio.”  I mean, why involve an API when PHP can send email pretty much out of the box?

Then I look back at my own posts.  My recent bit on how I’m using Trello to help track my finances.  And all the other ways I’ve used Trello.  And I’m sensing a theme here.

We use the tools that we know.  That shouldn’t be a surprise.  What hit me is just how much I’ve stayed inside the Trello ecosystem, at least with regards to things that are worth writing about.

So I’m going to get out of my comfort zone a bit and rewrite my financial tracking tool to make use of Twilio.  I’ve been saying that I wanted to play with Twilio for awhile now but I had an opportunity to do so and chose to shoehorn Trello in instead, since it was what I was more familiar with.

I’ll write about the Twilio implementation when I get around to it.

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).