Support site hell

  1. Go to Microsoft’s support page regarding VisualStudio 2013 Update 3
  2. Look for a link to download VisualStudio 2013 Update 3
  3. In lieu of finding said link, find a link “Download the latest Visual Studio 2013 update package now”
  4. Click that link
  5. Find yourself looking at the download page for VisualStudio 2013 Update 4
  6. Pray to the higher power of one’s choice that someone else managed to grab Update 3 and stash it somewhere
  7. Rejoice bemusedly when that proves to be the case
  8. Continue on with the rabbiting away in the Cube Farm unphased because this obviates crawling through Microsoft’s support site’s labyrinth of automated page generation hell with URLs that are impossible to game. This is the best possible outcome one can expect and is the harbinger of a good day.

Victory

After several iterations of arguing the denials of my request for lxml to be installed as a Python egg, my web host finally acquiesced.

I think I’m going to print this out and get it framed:

Hello,

I apologize for the delay. We were able to install this for you:

xxxxxxx@xxxxxxxx.net [~/lxml-3.3.5]# CFLAGS=”-O0″ easy_install –install-dir=/xxxxx/xxxxxxx/xxxxx/xxxxxxx/python2.6/site-packages lxml
Searching for lxml
Reading http://pypi.python.org/simple/lxml/
Best match: lxml 3.3.5
Downloading https://pypi.python.org/packages/source/l/lxml/lxml-3.3.5.tar.gz#md5=88c75f4c73fc8f59c9ebb17495044f2f
Processing lxml-3.3.5.tar.gz
Running lxml-3.3.5/setup.py -q bdist_egg –dist-dir /tmp/easy_install-qdMwRH/lxml-3.3.5/egg-dist-tmp-bZ_ZZT
Building lxml version 3.3.5.
Building without Cython.
Using build configuration of libxslt 1.1.26
Building against libxml2/libxslt in the following directory: /usr/lib64
/usr/lib64/python2.6/distutils/dist.py:266: UserWarning: Unknown distribution option: ‘bugtrack_url’
warnings.warn(msg)
Adding lxml 3.3.5 to easy-install.pth file

Installed /xxxxx/xxxxxxx/xxxxx/xxxxxxx/python2.6/site-packages/lxml-3.3.5-py2.6-linux-x86_64.egg
Processing dependencies for lxml
Finished processing dependencies for lxml
———————————————-

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.

FML

Literally reaching to unplug the network jack on my laptop so I can put it in my bag so I can leave so that I can attend a hockey game this evening and someone comes by the cube and says “Oh thank god, someone from CM is here! I need help with a production issue.”

The problem is poorly explained, I ask for clarification. Dude runs back to his phone and continues with his conversation. I’m trying to figure out WTF is going on. And now I’m holding so that he can finish his phone call so that I can figure out WTF he wants, which, to the best of my understanding, is something they’ve ad hoc‘ed all through testing and QA so there is no way in hell we’ve set up a control for this in the configuration application.

So…Friday night, no hockey, stuck at work, and just waiting for the chance to jump in.

Hooray.

Things are looking gravy again

Wednesday and Thursday were depressing days at work. All of the gains from last week crumbled into a crapular pit of despair on Wednesday afternoon.

And then I decided to rewrite an entire module from the ground up. This is different than refactoring in that I don’t have the time to make improvements, I’m only trying to fix references and get around whatever undocumented crufty magic lies in .sln, .csproj, and .wixproj files. Love IDEs until I don’t I guess.

So today was the grand test, and, the answer is yes. So now the remaining trick is to cobble together something that can be referenced by consumers without breaking consumers that don’t reference the new stuff. Additional fun factor: both versions use the same file names and namespaces.

FML!

But I believe we are finally out of unknown unknowns now. From here it is plumbing.

Wix is ruining my life

On the one hand, yay, job security!

On the other hand, holy hell! Probably more a factor of how we initially wrote the code, but the upgrade path has been abysmal going from v3.0 to v3.6. Just today I had to rewrite almost three years of custom actions just to get the damn things to compile. All of this to try to prove that it is running wix 3.0 compiled custom actions in a wix 3.6 msi that is causing all of the big explosions.

This explains why we are almost two years behind. Very much hoping the next upgrade cycle is not so ass bitey.

Passive pony request

EA: Do we want to use this value? Isn’t it excessive? Shouldn’t we be given a UI to change this value on a per client basis?

Dev: The value isn’t excessive. Some progress was made but we still need a long timeout.

EA: But if we need to change this value, we don’t have a UI to do that. Besides, isn’t it excessive? I thought we got this down to less than a minute.

CM: That value is a system value and should not be futzed with on a per install basis.

Dev: We still need a longer value. Progress has been made, but we aren’t in a position to support a shorter timeout.

EA: Okay. I’ll schedule a meeting to discuss why we need an interface to manage that value then.

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.

Not clairvoyant yet

Another in a series of passive-aggressive comments aimed at various co-workers.

I still haven’t perfected my clairvoyance skill set. Please keep this in mind when handing off tasks that only you have worked on. This will expedite task completion to levels hopefully everyone involved finds acceptable.