Q/A

  • Is there anything more dreary than making a slide deck?
    A: Yes, having to sit through a slide deck.
  • How much of the drudgery associated with putting together a slide deck is dreading the presentation that one has to give based on that deck?
    A: I’ll bet it’s a lot!
  • Why are some people so hostile to the notion of version control?
    A: [I have no good answer for this]
  • Is this what I was expected to be doing as a software development engineer?
    A: Definitely not
  • Is PowerPoint the devil?
    A: Easy joke. Everyone has already done this before
  • Are you wasting time instead of writing your presentation deck?
    A: Obviously…

I told you so

Coworker: Can you help me fix this?
Me: If you remove something from the solution you need to tell the installer solution to not look for it any more.
[a minute passes]
Me: Oh, you’re probably aware of this, but if you remove that you need to coordinate this with all of the downstream consumers.
Coworker: We’re the only one who is using that
Me: [with trepidation] well…okay then. Just being careful.
Coworker: Thanks!
[a few minutes pass]
Coworker: Why are all the integration builds failing?! Help!

This is my job 68% of the time.

Macification

So I’ve stopped using my mac laptop to remote to the work-provided workstation sitting under my desk—mostly because the corporate proxy has become too painful to work around without using a domain-sanctioned machine on the LAN. Having grown into my poweruser self while mostly using *nix/Mac, this leaves a lot to be desired.

Here’s a list of things that make the experience a bit more uniform across platforms:

  • Colibri: a somewhat adequate standin for Quicksilver
  • GVim: the same damn editor on every damn platform. So very good.
  • Cygwin: I haven’t gone much beyond the shell, but that’s the primary reason for grabbing it. Not the most intuitive thing to get running but worth the time. Powershell just doesn’t cut it.
  • Spotify: Not a Mac-specific thing but having the same audio player on all platforms makes me fezzy.
  • Firefox: for all the same reasons as Spotify. Besides, using the integrated sync function my history, bookmarks, and keywords follow me around. Also…I’ve been Firefox since it was Netscape 6 alpha releases. I’ve tried quitting for the new hotness several times but always come back. Must have add ons:
    • AdBlock: Because the WWW is so much nicer without the clutter.
    • FlashBlock: Autoplaying Flash is the second worst thing the WWW has ever sprung on us. Control when you see Flash content!
    • It’s All Text: HTML textbox elements can dump to a gvim buffer where you get all the vimmy goodness and then dump back to the HTML textbox with a simple 😡
    • LastPass: The one password manager to rule them all. Go premium and you get it on your mobile device too.
  • Thunderbird: Same mail client across all platforms is nice. Currently trying to set up a robust set of filters + well trained SpamAssassin to make webmail a useful alternative but until then, nice to have a client to do stuff for me.
  • Console2: My crutch for when Cygwin proves difficult. A wrapper for the native cmd.exe that, with creative use of DOSKEY commands in the launch script can map okay with bash. It isn’t bash though.
  • Virtual Box: The same VM tool across platforms is nice. VMware Fusion is hard to give up though.
  • WinMerge: A decent diff/merge tool. Integrates nicely with TortoiseSVN. TortoiseSVN is one app with no useful analog in the mac universe and this always makes me sad.
  • mRemote: Better than mstsc, not as good as Microsoft’s Remote Desktop Connection for Mac tool + Quicksilver. It serves two functions however: (1) saved connection information for dozens of servers (2) detachable tabs.
  • Python: The world’s best scripting language. Period. YMMV.

All of this to say, I’m certain there are better Windows-specific tools for handling all of the above tasks. They are probably even more functional, hip, and speedy. These are the tools that have made my own transition to a Windows workstation smoother. Not only that, but I’m still keeping my Mac/*nix workstations outside of my job so uniformity in environment is key.

The primary reason for publishing this? I’m getting a new workstation in the next month or so at work and so want to inventory all of the crap I’m going to have to reinstall once the transition happens. The funny thing? The workstation they are replacing is more than adequate for my daily needs in every way except one—it isn’t portable. I sort of wish I could trade them my aging MacBook for the workstation under my desk. It would make a great *nix tower at home! I believe it is also Hackintosh-able.

Reply All

Is this an effective and efficient way to ensure robust communication? Or is it a facile way of demonstrating how busy one is?

Because, seriously, the two in the example I’m working off can take their “I’m doing FOO know. You should do BAR”, “I’m almost done with BAR, you should be able to start BAZ” minutia off-list any time you’d like. My inbox thanks you.

Why outsourcing doesn’t work so well

Oh my! So here’s my fun, work-related rant of the day.

So nearly three years ago I was tasked with solving the problem of how we could install the same application on a windows box multiple times in such a way that we could isolate customer data. In short, each customer gets its own installation of the application operating in its own sandbox on the machine.

Microsoft, in their infinite wisdom, have crafted a whole installation management service. It can manage component registration, set up services, set up web sites, toss out a few registry entries, and track all of it in a little black book somewhere. It can use the information in this little black book to manage patches, upgrades, and uninstalls. All these things are really nice to have. It just seems like a really nice, awesome thing to have amiright? And it would be, except for the implementation, which sucks the guy up the street’s turds.

Long story.

Anyway, by going down this road, Microsoft also precluded the ability to install the same damn code on the same damn machine multiple times. There are many ways around this, most of which entail writing your own installer wrapper. There is also the concept of the instance transform.

See, MSIs are basically bundled, self-contained databases. The idea behind an instance transform is to run a process against an MSI to insert unique values or installation-specific pieces. Presto! Now we can install multiple instances of the same software on the same machine.

Now most times this is done, there is a specific set of values one is looking to poke into the MSI. Not in our case. For one, it’s not a task that is easily automated at build time. Also, it is “messy” in ways that management does not like. God forbid I use something with a dot MST file extension instead of dot MSI. Someone somewhere decreed that the only thing we can use to install an application on a machine is an MSI because, well, just because. So I was tasked with writing a set of generic slots that could be filled with information at install time. And Microsoft doesn’t support this nearly as well.

To recap then. I was tasked with, and developed a solution for installing the same application multiple times on the same machine in such a way as each application was unique and ran in its own space. Further, this had to be flexible enough to support arbitrary information which is only known at deployment time. Ostensibly this was so that we could shave a few dollars off our bottom line by supporting multiple customers on a single machine.

Turns out—and it took three years for this to come to light—the folks that use my work aren’t using it to trace a customer’s installation across versions over time. They’re using this to install multiple releases of the same product on the same machine and expecting this to just work. That it has to some degree so far has kind of been a happy accident.

Another fun initiative that $EMPLOYER has pursued is to break MSI patch/upgrade behavior by forcing the complete uninstall of a previous install before running a new installation. Because we can, we force all of our deployments though a Microsoft operating system management suite which allows us to add hooks to do stuff around installations. Because I’ve been successful in lobbying, we’re getting rid of this in favor of leveraging Microsoft’s built-in patch/upgrade installation functionality.

This will break the hell out of whatever it is the folks who are improperly using my transform work. Which is what I spent today discovering. The level of awesome I am currently enjoying is inexpressible. For three years I’ve been laboring under one set of assumptions while the production deployment of my labor has been orthogonal to those assumptions. More to the point, for three years I’ve been working from an improperly defined requirements set.

Three years.

And now we’re so far down the rabbit hole it’s likely that we’ll not fix things but just try bandaging what we have to get us through until the end of time. Because, after all, that’s three years of inertia. In corporate development environments that is an eternity and a functionally infinite force that is impossible to appreciably alter.

Three years.

Even more fun? This application was developed by our out-sourcing partner on a different continent. So instead of leveraging in-house developed and tested tools that allow us to facade an application’s services across releases, they came up with this bastardized foo-fah-er-y.

All of this, the stupid utilization, the inaccurate requirements documentation, the non-communication that the current paradigm doesn’t work well for their needs, all serve as anecdata about the true cost of outsourcing. See, because the only reason this all is coming to light is that we decided after three years that outsourcing development isn’t cost effective after all. Now we’re trying to unpack this monstrosity that we paid for and, in my case at least, we are well and truly fucked.

Three years.

My brain is asploded.

There comes a time…

When coding a largish application from the ground up there comes a time when things look bleak. This usually happens shortly after the application becomes too complex to hold the whole thing in your memory. Either the levels of abstraction get too disorienting or, if you’ve foregone abstraction, keeping all of the “meaningful indexes” straight feels daunting.

And then, perhaps a few hours of panic and toil later (if you’re lucky) it all kind of comes together. You’ve moved from running against test data and start running “live”. Not truly live, of course, unless you want to live dangerously but you get the point. If you’re unlucky it just bogs down into a horrible mess.

Today we are lucky. The thinger I’ve been pounding on for the past week and a half generates useful stuff. If I were a gambling man, I’d go ahead and make the changes to build something that other folks will see. But I’m not. So come Monday I’ll be rabbiting away at swotting up a production asset, doing some tweaking in the build system, and then releasing my WIX generator on the QA resources. This gets my team out of the game of slogging through an ever increasing number of modules when making across-the-board changes. New changes are as simple as writing a new IGenieJob.

It also forces strict standardization on a collection of installer products that have grown organically over the past three years. At the end of last year I managed to normalize a number of things. This is the final step to making this an automated, predictable, and easily troubleshot process for $COMPANY_NAME.

Not to mention, spinning up new installer projects just got a whole lot easier. Also, I get to check off one of my big 2012 annual review goals before it ever gets officially assigned to me. 🙂

A good way to end the week. I will possibly be quite intoxicated within the next five hours.

Personal growth

Oh hooray! It’s annual review time! The time of year where we have to scramble to find a few uninterrupted hours in our busy days to fill out online forms telling folks how we think we did in the past year. How well we’ve fulfilled arbitrary goals measured with arbitrary metrics that, while relevant twelve months ago, correspond with the actual tasks assigned through the last year about as well as any astrological projection might.

One might come away with the impression that I am not an enthusiastic participant in this time suck masquerading as a guide to personal and professional growth. That would be a superficial understanding of the depth of feeling I have toward this activity. As a true team player, I am fully cognizant of the value this provides to the HR department. Generating fodder for various charts and graphs and glossy documents is a vital contribution I can make toward their livelihood. I always anticipate the needs of those around me and prioritize accordingly.

Especially gratifying are the spaces for comments on goals dealing with metrics that are to be provided to me by others. More so than that are those cases when my own self evaluation is flagged as late due to my priorities being driven not by HR or myself, but by my direct supervisor who at one point stated “don’t worry about being late, we have other priorities” and then followed that up with “we really need to get those evaluations in” the next day. Oddly, this coincides with a nastygram we received from HR.

So it is with modest pride that I present this request for metrics for a goal common to everyone in the organization which I am a member of, an organization that ostensibly has a very high completion rate given the tenor of the nastygram, yet cannot find any record of. The upshot being, I am under the impression that a large number of self evaluations were completed with a complete disregard for incident rates over the last year’s releases, and time to resolution for each of this issues. As an insightful, vigilant team player with an eye to continual, iterative optimization, I would like to point out that the review process might actually be completely fabricated by a large number of participants. As a team player who not only points out potential pitfalls but also proposes solutions, I suggest that perhaps we stop subscribing to this nifty personal development web service and just have managers provide continual feedback to their reports as to their job performance. This serves the dual objectives of cost cutting and empowering local decision makers.

I look forward to having the opportunity to make continued contributions in the coming year and striving to make $EMPLOYER the best organization in the known universe.