Flippant Pixel

Empathy and Software Sales

Empathy is one of the most important aspects of maintaining a good relationship with a customer. It is also one of the most difficult and emotionally exhausting. Last week, one of my customers sent me this email:

Adam, WE GOT THIS ERROR IN OUR PROD ENV

I rescheduled appointments and spent more than six hours over the next two days investigating. The fault, in the end, lay with the DBA, who mistook one of his servers for another. What’s more important, however is that we acted as though the problem was our own. We advised them on how to mitigate the crisis, find the cause, and ensure that our integration fails more gracefully should it fail again.

On an unrelated note, January was a decent month for me. I helped close a $75k deal with a Fortune 500 company. I’m looking forward to deploying our solution with them over the next month.

How to Buy Big Software

Woe is last month. Numbers go up and down, but this time, they went down about 70%. I’m not about to blame that on the economy. I’ve done some hard thinking and I have some ideas about what happened.

The first half of my problem was that I gambled a bit too much on the pre-sales side. I focused my efforts on risky opportunities that didn’t pan out. It’s not like I didn’t see it coming, either. Most of the account managers at my company are realists and will let me know when they forsee insurmountable obstacles. For example, when our legal department said this number of servers require licensing and the customer’s legal department said a different number, the whole thing blew up and we lost. The account manager gave me a month’s warning on that.

But that’s what sales is all about. You take a gamble. You win some. You lose some. Some of my accounts were bad picks, but some were good investments in relationships with account managers I’d never worked with before. Regardless of whether their deals came in, they will remember me the next time around. That’s especially important now that there’s a lot of new, emerging talent at my company.

What really hurt was the area that was supposed to be safe: integration consulting. I had a slew of terrible customers lately, and I didn’t expect that at all. I do my best to help them, but if we could call a time-out and pretend for a second that I was some kind of sage oracle, this is what I’d say:

  1. Don’t ambush us. If you wait until your renewal is due to get started on the integration only to voice concerns about expected vs observed behavior as leverage for a discount, you’re putting the emphasis of our conversations on bargaining rather than fixing problems. My company bargains hard. You’ll lose and I won’t get to mark you live until the next renewal date comes around when you pull the same stunt again.
  2. Read the contract. For example, if our data provider forbids you from hosting our software in a foreign country and that’s what you’re trying to do, it’s going to be really hard for us to go live.
  3. Get a project manager. Our software isn’t actually very complicated. It’s usually administrative issues or a general lack of momentum that keeps a project from going live. Having a dedicated project manager on either end who will make everyone’s lives miserable increases the chance of going live by about 50%. Having project managers on both ends virtually guarantees success. I do a little bit of project management as a consultant, but it’s hard for one person to play both good and bad cop.
  4. Take a hard look at your developer. Is this person competent? Again, our software isn’t very complicated, but if the answer is no, you’d save a lot of time and money by paying for professional services. Incompetence is especially abundant amongst .NET developers who never worked outside of Visual Studio. One just sent me a link to their localhost today.

My numbers affect my bonus, but that’s not what bothers me. The bonus is a pittance anyway, even when I max it out. My numbers reflect on how well I’m doing my job. I’ll need to turn this next month around in a big way. If I can’t, I’ll need to figure out a way to cut back on the time I give to bad customers.

In other news, I got another demo system up and running on Monday. I used jQuery to do it, too. Yay, jQuery!

Where's Waldo?

The last twelve months drew a scant five visitors a day to Flippant Pixel—remarkable considering the number of posts I’ve made over that time (zero) but pathetic in the blogging world. Nevertheless, I will make some attempt to redouble my efforts, starting with an explaination of how I went from being a web application developer doing client work and blogging about web services taking over the world to an overworked sales engineer who, until now, had no time for blogging.

About the time of my last post I moved from one side of the country to the other. My last boss and I maintained a good working relationship and he graciously paid me to continue working remotely while I got settled in my new environment and looked for a new job.

As soon as I landed, I was inundated with recruiters. That may not be unusual for this town, but bear in mind that looking for a job in my hometown had been a gruelling process. Recruiters there heavily favored the employer over recruits. Only after multiple interviews and testing at their offices was I allowed near their clients, only to learn at the end that they would take their cut from my wages.

By contrast, this new market was mind-bogglingly skewed in the opposite direction. Even a year after removing my résumé from Monster, I’m still getting about two calls a week asking if I’m happy with my job. So, after surveying the market and batting away hungry recruiters for about a month, I had a handful of decent leads falling into roughly three categories:

  1. Uninspired corporations developing painfully slow Java applications for government contracts, shady pharmaceutical operations, etc.
  2. Barefooted open source shops doing the familiar client work thing.
  3. A single multinational corporation interested in purchasing my soul in exchange for the opportunity to do software sales engineering and project management.

For better or for worse, I opted for door number three. I was immediately catapulted into a sales office where the coffee is for closers. In the old world: $40,000 summer-long client projects. In the new world: $250,000 per quarter in new sales and integration consulting.

The coachman from Pinocchio

A bad day at the office

As of a week ago, I’m conducting an experiment in time management wherein I leave the office by six o’clock. I have a few extra moments to reflect a bit more on the world of web services and the last year of sales engineering, so stay tuned.

On a completely unrelated note: I switched my doohicky from Blogspot to Tumblr. It took me about five minutes, four of which were spent remembering my password. I don’t understand why anyone would ever go to the trouble of maintaining their own blog software. But I repeat myself.

The Awesomest JavaScript Framework

jQuery makes life worth living. By comparison, YUI’s AJAX tools are frustratingly neolithic. Here’s how you write an AJAX call with jQuery:

$.ajax({
type: "GET",
url: "gimme.php",
data: "gift=some_sugar&giver=baby"
dataType: "script"
})

In this example, the results of gimme.php are evaluated as javascript. jQuery’s ajax method is much more sophisticated than this example demonstrates, but it only gets as complicated as it absolutely has to be.

Overall, jQuery is not as thorough as Prototype, but it’s much much lighter. jQuery weighs in at 20kb to Prototype’s 93kb. That doesn’t affect download speed much, but it does affect browser performance. And while jQuery has no indexOf function, it’s clever enough to come with an iterator for both arrays and objects. Awesome!

Searching Arrays in JavaScript

JavaScript doesn’t have an array search function, so I write my own:

function arraySearch(needle, haystack)
{
for( var i = 0; i {
if( haystack[i] == needle )
{
return i;
}
}
return -1;
}

I don’t like to write the same function twice. No coder should. I would use Prototype’s indexOf function, but the project I’m working on is built on YUI. I am not happy.

On Mephisto

I’m writing this blog with Mephisto. I discovered it when I was reading up on JavaScript libraries and frameworks. You can’t research JavaScript these days without stumbling on Prototype and script.aculo.us, and you can’t do that without stumbling on developers like Tobie Langel and Thomas Fuchs, both of whom use Mephisto. These are smart people, but I think they’re taking a step in the wrong direction. Let me explain why.

Mephisto will assume your entire domain. It uses CGI, mod_rewrite and absolute paths in such a way as to make it nearly impossible to run the thing from a subdirectory. It also expects you to give it three databases. Apps of this scale typically use table prefixes, allowing them to share one database with the site’s other components.

Mephisto is built on Rails, which isn’t ready for shared hosting environments. Even as I write this I’m getting intermittent Rails application failed to start properly errors. My neighbor’s blog on the same host has similar problems. When this host isn’t swatting indiscriminately at our processes, it suffers from significant latency problems.

Mephisto ignores the Rails philosophy of convention over configuration. In my case, I had to make changes to .htaccess, .rb, .cgi and .fcgi files scattered over three directories to get it to work right. Even with proper documentation (which it doesn’t have) deployment requires an experienced *nix-head armed with a lot of patience.

My point is not to malign Mephisto’s developers. They made a remarkable, sophisticated and original piece of software that deserves its praise. Most of the shortcomings I mentioned are a natural part of the project’s adolescence. In the long run, I think Mephisto will be the winner over its peers WordPress and Typo. I’m not criticizing Ruby on Rails, either. Anyone who still thinks this is just a 37Signals fad is wrong.

My point is, why bother? Freeware or not, the market is losing interest in another generation of software that requires installation, configuration, and upgrade, only to be replaced by something completely different. If the market isn’t interested, the whole exercise becomes academic. Competitive software resides on its developers’ servers. Why bother with an email client when you can use Gmail or Yahoo? Why bother with iPhoto when you can use Flickr? Do you see where I’m going with this? Why bother with Mephisto when you can use Blogger? That’s what the software-as-a-service revolution is about: let the developer worry about the upgrade path. Yes, there’s a serious proliferation of internet-based accounts, but that’s a far more manageable problem than the existing paradigm of overripe software.

I stopped writing this article in Mephisto and threw it in the trash. I moved it to Blogger and went back to my old PHP host. I’m using SimplePie to pipe it through an Atom feed, which plays nicely with all the other widgets I’m making here. I don’t have to worry about upgrades. I don’t even have to worry about the host. Laziness truly is the mother of invention.