The Daily Parker

Politics, Weather, Photography, and the Dog

How's your week going?

It's just past 9am on Monday and already I'm reduced to this kind of blog post. Tomorrow I may have some more time to read these things:

  • Cranky Flier analyzes Malaysia Airlines' struggles.
  • Microsoft is building subsea fibre cables between the U.S. and Europe and Asia.
  • TPM explains exactly what Jade Helm 15 really is.
  • Missed Microsoft Ignite this year? Here's the Channel 9 page.
  • We're starting to set up JetBrains TeamCity to handle our continuous integration needs. Explain, however, why the user manual is all video? Guys. Seriously. I haven't got time for this.
  • So now that Illinois actually has to pay the pensions we promised to pay, what now? (Hello, 9% income tax?)

Four-hour design review session is imminent. I may post later today...or I may lock myself in my office and stare at the wall.

Things on Chicago Streets

First, a not-so-smart car:

I'm not sure what amused me more, the disproportionate tow truck or that the Smart Car driver parked in a rush-hour tow zone long enough for Streets & Sanitation to remove him.

Then, for everyone who takes his dog to work, there's this food truck:

I didn't pick anything up for Parker yet. ($2.50 per biscuit? Did I read that right?) But if it comes back, maybe.

He is serious, and don't call him Shirley

I had a mind-numbing email exchange with a large corporate IT department today.

One of our best customers has a problem: no one has been able to use our software since Friday. We’ve been troubleshooting this problem. But we haven’t been able to fully investigate the issue, despite tremendous effort. We think we've uncovered the main issue preventing us from fixing the main issue.

We couldn't connect to either their production or user-acceptance test (UAT) Web services from inside our office because (we thought) their IP whitelist (a list of Internet addresses allowed to connect to them) didn't have our office on it. We got in touch with one of their developers—let’s call him "Bugs"—and requested the change. He responded that he had forwarded the request to his network team and we should expect whitelisting in 2-3 weeks.

I responded that I would be happy to get anyone else at his company involved to see about resolving this matter more quickly. Anyone, for example, like the division president who happened to be visiting Chicago this week. Or the vice-president whose users couldn't connect. Bugs, in turn, set up a call with their network team for the next morning, India time. So on our 9:30pm call last night (8am for them), we got sufficient firepower from inside their organization to get whitelisted wiki-wiki.

This morning (US time), we again attempted to run our tests against their UAT environment, and again could not connect. We could, however, connect to their Production environment. So their network guys did something, we just couldn't tell what. At least we can start trying to reproduce the production issue.

I sent another email to Bugs: “We can reach Production but not UAT. We are able to hit {production URL}, but not able to hit {UAT URL}. We’re seeing an error message that there is no endpoint listening at {UAT URL}. Is UAT offline or in an unstable state?”

Bugs sent back a message from his network guys showing a screen shot of their whitelist. Sure enough, the network guys did their jobs; we were whitelisted to both environments.

I responded, “OK, but we still can’t connect to {UAT URL}. Is it possible the UAT environment is offline?”

Bugs chewed on his carrot for a moment and responded, “We have stopped the UAT environment.”

O___O

So now I’m weighing responses. I have “Would you please start the UAT environment?” as my opening sentence, but I’m stuck on how to proceed. Options include:

  1. “We anticipate a higher likelihood of successfully testing against it if it’s running."
  2. "Ah, so this is a PEBCAK problem after all. Please address the issue between your chair and keyboard and try the operation again."
  3. "Now you're just fucking with me."
  4. "I don't know who you are. I don't know what you want. If you're looking for ransom, I can tell you I don't have money but what I do have are a very particular set of skills. Skills I have acquired over a very long career. Skills that make me a nightmare for people like you. If you let my UAT environment go now, that will be the end of it. I will not look for you, I will not pursue you. But if you don't, I will look for you, I will find you and I will kill you."

At some point I just expect him to respond with, "A møøse bit my sister once," but I'm also fairly certain he has no demonstrable sense of humor.

Ah, an email just came in from his supervisor's supervisor. Apparently they're restarting the UAT environment. I will now resume my labors.

Update: Once we finally connected to the UAT environment, we got back an error message, clearly indicating that their environment is misconfigured. Not that we were suspicious of Bugs' insistence that nothing at all has changed on their end, but once we got this particular error message, we forwarded the details to his team with the suggestion that they check their logs too. It's just past 2am IST so we expect that nothing much will happen until later tonight.

Exceptionally high WTF-to-LOC ratio

(Note: The developer in question does not work for my company.)

I'm looking at some code in one of the products I'm responsible for, and I just came across this.

// ReSharper disable once RedundantAssignment
Tuple<List<SomeChartData>, string> objReportdata = null;

Let's review the WTFs:

  1. The developer didn't understand ReSharper's admonition that the "= null" is completely useless, so he disabled the warning.
  2. The Tuple is actually the return value of the method. It doesn't even need to be declared as a variable; it can simply be returned to the caller.
  3. Why are we using a Tuple in the first place?
  4. Oh; the string part of the Tuple is the title of the chart. This is a code smell, but I haven't analyzed it deeply enough yet to figure out how to clean it up.
  5. Wait, so why a Tuple? Why don't we simply have a first-class data transfer object that has everything one needs for a chart?
  6. OK, so even with a Tuple, why are we declaring it with a List instead of an IEnumerable or ICollection? What business is it of the calling method what concrete object we use to return chart data?
  7. Despite repeated directions to read our sodding code standards document, he named the variable—which is useless, remember—with a forbidden Hungarian prefix and used what I'm going to call for the moment "humping camel case." I don't know what that camel is really doing, but I'm pretty sure "data" should be capitalized.

The entire method of 40 lines had too many WTFs in it so I simply had ReSharper re-write it for me. It's now 20 lines, avoids the second of two doubly-nested foreach loops, and uses named constants instead of magic numbers. And it still stinks.

</rant>

How Spirit is hurting air travel writ large

New Republic's John Paul Rollert explains:

That a flight on Spirit will occasionally cost you less than $40 highlights for its defenders the airline’s essential promise: bargain basement ticket prices. “Offering our low fares requires doing some things that some people complain about,” [Spirit’s CEO, Ben] Baldanza wrote in an email to the Dallas Morning News last April, after the paper ran a story about the egregious number of complaints his company receives. “[H]owever, these reduce costs which gives our customers the lowest fares in the industry.” The contention is not unreasonable, it's merely disingenuous. Baldanza would have us believe that the frustration with Spirit is simply a matter of obtuse passengers confusing the constraints of a low-cost carrier with a wanton unwillingness to afford First Class frills. Most people, however, don’t expect artisanal mustard at McDonald's or concierge service at Save-a-Lot. The discontent is not a consequence of failing to meet ridiculous expectations, but flouting those that are entirely reasonable.

Success breeds admirers. In December, Delta announced that it was introducing five categories of service, including its answer to Spirit’s Bare Fare: Basic Economy. In addition to its precarious grammar, Basic Economy does not allow passengers to pick their seats, change their itineraries, or fly standby. The move is merely the most recent evidence that Spirit has become a trendsetter—arguably, the trendsetter—in the American airlines industry. But what trend is it exactly? Baldanza has repeatedly affirmed that Spirit is refining the art of offering affordable airfare, an effort which he qualifies as nothing less than an essentially democratic endeavor. He has a point, insofar that we live in a world where social mobility and simple mobility increasingly go hand-in-hand. Yet other low-cost carriers have long provided models of budget air travel without engendering nearly the angst of Spirit.

This seems like a familiar story. I mean that literally: didn't someone else run almost the same story a few months back?

Out in the wild

The Inner Drive Extensible Architecture (IDEA) is now on NuGet.org. This means anyone, anywhere can download it and install it into their own .NET project.

I'll publish the Inner Drive Azure Tools at some point after I figure out a cool acronym.

This was actually forced on me by a new requirement to share the code with overseas partners. They would be unable to use the software I wrote for work if I hadn't done this.

Conducting intro programming classes

...sort of. But that's not important right now. I'm just spiking some articles to read later:

OK, time for a vendor phone call...

Surfacing

One of the biggest perks of being a CTO is that I get to roll out really fun initiatives every so often. Our CEO has a Microsoft Surface 2, and he's had such success with it that we decided to make it our official laptop replacement.

I made one moderately-annoying error in rolling out Surface Pro 3 tablets to seven people who were waiting for laptops: I failed to give the less-technical users guidance on how to set up user accounts. We're fixing it, but we still have some confusion around the idea that multiple authentication providers can use the same account name. Think about it: Microsoft and Google will both allow you to set up accounts with a gmail.com email address, and even let you use that address as the user name; but they're separate accounts, and Microsoft has no way of knowing if you've changed your Google password. But users who always set up the same account name and password (please do not do this! Get a password manager instead) get into the habit of logging in to things the same way, and don't have the mental model of the difference between a username-password combination and an actual authenticated identity.

Despite the hiccup rolling them out, they've been a success. They have about a quarter the mass of a laptop but most of the power. For most users, who rarely create 50 MB presentations and who have never tried to debug a 50,000-line MVC application, even the entry-level Surface Pro 3 is more power than they'll ever use.

After having mine a little more than a week, I have to say it's my favorite tablet so far. First, it runs Windows 8 (and in July I'm upgrading to Windows 10). So it behaves exactly like my laptop. In fact, since I use my Microsoft ID to log into both my main laptop and my Surface, all my preferences and settings are synchronized (including WiFi passwords, I was surprised to discover), making it even easier to switch between them.

Second, the keyboard and stylus work better than I was expecting. I have an ASUS 700 with a keyboard attachment that I never use, principally because the keyboard, which functions as an extension battery, weighs almost as much as the tablet. But the Surface keyboard is light and makes sense as a cover. The stylus also gives me more control over routine point-and-click tasks than I've been able to achieve on my ASUS. I'm still not as proficient with it as I am with an ordinary mouse, but I'm getting there. I'd probably like it even more if I were a graphic artist.

I've got a couple of annoyances with the device, but nothing that's a deal-breaker. I may catalog them later. For now, I'm pretty satisfied with the thing, and I'm even happier that it lets me leave my laptop at my office most of the time. If only it could drive a pair of 24-inch monitors through DVI...then I could actually develop software on it.

Maxis closing up shop

Under the status update "...it's as though millions of llamas suddenly cried out and were suddenly silenced," one of my Facebook friends posted this sad news:

Maxis—the developer of SimCity, and a studio I’m comfortable calling one of the most influential of all time—is closing shop. The news was confirmed by designer Guillaume Pierre over Twitter.

“Well it was a fun 12 years,” wrote Pierre, “but it's time to turn off the lights and put the key under the door.”

Founded by Will Wright and Jeff Braun in 1987 to work on SimCity, Maxis’s Emeryville, Calif.-based studio took the simulation genre in every possible direction and every imaginable scale,from the whole SimEarth to tiny SimAnts. There were flubs—SimCopter and The Streets of SimCity come to mind—but in 2000, Wright and Maxis would create the best-selling PC game of all time: The Sims.

This doesn't mean the end of SimCity, but it may not be the best thing that ever happened to one of my favorite computer games. Of course, I haven't really played it in a while...

On to the Kindle

Business lunch, business dinner, 8:30am call, 1:30pm call—and right now, six minutes to click "Send to Kindle:"

Time to get some water, plug in my Fitbit, and prep for my 1:30 call.