Category Archives: How-Tos

How To Be Recruited By Google

My pal Jeff Barr of Amazon posted on his personal blog about how he was interviewed by Google and continues to get pinged by their recruiters after he already gave them a polite "no thanks". He asks whether their recruiters shouldn’t maybe have way of looking up candidates in some sort of database — you know, maybe like a search engine?

I don’t think I’ve blogged about this yet, but I interviewed at Google from late 2005 through early 2006. The experience was pretty strange. Google kept me on the hook for five full months, having me in repeatedly for meetings with people who had no idea why they were talking to me or what to ask me, putting me in front of middle managers who would theoretically be my superiors but who had far less experience than me, handing me off from one recruiter to another, and never getting back to me when they promised to.

In one of the interviews, a very young Google product manager spent a good hour and a half pumping me for information on developer relations and platform evangelism. The questions he asked suggested to me that he wasn’t interested in hiring me at all; it seemed like he was getting me to verbally convey to him the essence of what developer relations people do so they could go off and re-invent the discipline themselves. Maybe the plan was to reduce it to a few hundred lines of Python, I’m not sure.

So anyway, after months of interviews, epic games of phone tag and myriad unexplained delays, the recruiter du jour promised me that a job offer was imminent. I called her to say "don’t bother". I wound up going to work for Yahoo! because I was inspired by what they wanted to do and they gave me everything I wanted without making me feel like a recent parolee. The amount of time that elapsed between my interview and my first day of work at Yahoo! was approximately a week and a half.

There are a lot of things that Yahoo! that still needs to get ironed out. Retaining talented hires is a big one, as it is for any company (coincidentally, my wife’s last day at Yahoo! is next week). But swooping in and snagging me as quickly as they did was one of the things that Yahoo! definitely did right.

How to run a technology community

This has come up with several of the companies I’ve been advising over the past few months, so I thought I’d lay out a few of my rules and tips for how to manage a public technical support forum and build a technical community. My thoughts in this area come from twenty years of managing online communities from kitchen table hobby BBSes to tiny startups, to eBay and Yahoo! technical developer communities, to the half-dozen consulting customers I am working with today.

To my mind, the most important rule is that there should be one person in your organization who is responsible for the health of your community. We call this role the "community manager". It doesn’t have to be a full-time job, particularly if you’re a startup or an open-source project, but once your community starts numbering in the thousands of active users, it’s time to start thinking about hiring or outsourcing the management of your community.

The community manager is responsible for the health of the community. This means taking whatever steps are necessary to grow the community, making sure that the community is in alignment with the goals of the business or project, and helping to put out fires when they occur. It also entails the compilation and dissemination of metrics pertaining to the community’s health. Ideally, the community manager shares these metrics with the entire company (and, in some cases, with the community itself). The old business adage "you make what you measure" is at work here — if you are serious about building a community around your product or company and you aren’t sharing your community metrics with your entire team on a regular basis, you only have yourself to blame if the community turns out to be tepid.

The community manager’s report should contain metrics as well as anecdotal information about what’s going on in the forums. If three people post about the same bug in the forums on the same day and nobody from your engineering organization responds, it’s the community manager’s job to escalate that until the problem is resolved.

These days, the community manager is the voice of the company in the community. She’s typically used to convey announcements and news in a way that a spokesperson or public relations person might have done in the past. Here is where an English major with technical chops comes in handy.

Everybody on your team should participate in your community. (At the same time, it’s important that you have one and only one community manager — if everybody’s in charge, then nobody’s in charge.) At some companies I’ve worked at, people had to go through all kinds of hurdles to get permission to post to the forums. This is small-minded; it suggests that you mistrust or have not adequately trained your team. If you have an online forum, then everybody should be encouraged to post to it, particularly people who work for you.

There are a bunch of tactical things to making a community forum work. When we developed an XML-based message board product back in 1999, people thought it was this crazy exotic thing and we had to explain the benefits of XML for customization and syndication over and over again. Today RSSified message boards are de rigeur. They’re the only way I can keep up with the literally hundreds of things I need to read each day. No technology community should be without it. Use the standard RSS icon, make sure your forum home page and each individual topic page has RSS autodiscovery meta tags, and make sure they work in the most popular feed readers (which at the moment happen to be Bloglines, My Yahoo!, Google Reader, NewsGator Online, and Netvibes).

Search engine optimization isn’t something that should be applied only to your marketing web site, it should apply to your community too. At the very least, if the topic of a discussion doesn’t appear in the page title (and preferably in the URL too), dump your community software and get something better.

If you’re a commercial software vendor, make sure that no question in the forum goes unresponded to for more than a day or so. (Your community manager can help with this, although it’s ideal if you have an automated way of doing this.) If paid support happens to be a part of your business model, you may not want to respond that quickly in your forums, which is fine — instead, make it easy for people who post questions in your forums to get priority paid support as an alternative to waiting around for an answer in the community, and manage your community’s expectations regarding the way you expect community-based support to work.

Give recognition to your contributors — they’re helping to build your platform, in many cases free of charge. Some companies resort to special programs (like the Microsoft MVP program) to recognize prominent community contributors, which is fine, but I much prefer engaging in conversations and building relationships with members of the community as a way to incent and recognize them (just saying "thanks for posting that" goes a long way). In many ways, creating a formal recognition program for people is actually easier than having these conversations (since you only have to do the heavy lifting once), which is, I think, why companies gravitate to it. But having conversations is the real money shot here, and if you’re not making time to have these conversations you’re missing out on tons of valuable information.

Your community manager can help engage with prominent contributors, but this should also be something that everybody in your organization should feel empowered to do.

How to Name Your Developer Site

There is only one acceptable way to name a web site intended for developers and I’m going to tell you what it is. Give your developer web site tertiary DNS name of "developer". So if your consumer site is mysite.com, your developer site should be developer.mysite.com. Simple.

Do not call your developer site mysite.com/developer or developers.mysite.com. People will not know how to find it.

Do not under any circumstances call your developer site something like SuperFunNewDevZone.mysite.com. No matter how clever the English majors on your team are, you should not permit them to give your developer site a DNS name that developers will find difficult to remember.

It’s always driven me crazy that I can’t quote off the top of my head
what Amazon.com’s developer web site URL is. (There’s absolutely nothing at
developer.amazon.com; for that matter, developer.google.com doesn’t work either.)

There’s nothing at developer.salesforce.com, but at least developer.salesforce.com
redirects to a sensible page. Adobe does the same thing. But the problem with a redirect is that it doesn’t reinforce in my mind what the URL of the site is; after the redirect takes place I’m confronted with something like http://mysite.com/super/fun/devzone/ instead of http://developer.mysite.com.

The URL is part of the interface of your site; it should have good usability characteristics. This seems like it would be basic and easy to fix, but I’m surprised nearly every day about how often people try to re-invent the wheel without looking at what’s out there and what works today. All these rough patches waste the one resource that developers can never make more of, which is time.

MySQL Gotchas for .NET Developers

I think I’ve mentioned a few times on the blog that I’ve been using the combination of .NET 2.0 and MySQL for Approver.com. I made this choice after very careful consideration. I spent about a month looking at Postgresql and MySQL earlier this year and came to the conclusion that either one is a good choice for Windows developers today; MySQL edged out Postgresql mainly because of the strength of its developer ecosystem.

Yet when I tell people in Silicon Valley that I’m using C# and MySQL together, they look at me like I just stepped off a flying saucer. I am here to say that using MySQL is 110% righteous on Windows and you don’t have to sacrifice much of anything (including GUI tools, which were one of my big requirements) to use it.

I am going to do more to evangelize the .NET and MySQL combination because it’s worked so well for us to date. To start, I’m going to describe two gotchas I’ve run into while developing Approver.com. Neither of these are things that I’d consider to be major problems, although they did require a bit of research and testing to figure out.

1. Date values. MySQL has a concept of a date that equals zero, but something in the .NET stack (ADO.NET? System.DateTime?) does not. So, the workaround is to always set your DateTime fields to default to ’0001-01-01 00:00:00′ instead of the normal MySQL default, which is ’0000-00-00 00:00:00′.

2. Unsigned integers. This one bit me over the weekend when I was trying to create a table that stores IP addresses for a <mumble mumble> we’re planning to release soon. The 1.07 version of the ADO.NET provider for MySQL (which is, by the way, provided by and officially supported by MySQL AB under the name "MySQL Connector .NET") has a bug where it barfs on unsigned integers. There are two workarounds for this: treat the column as a signed integer (System.Int32), or upgrade to 1.08 of MySQL Connector, which handles unsigned integers correctly. (The signed integer workaround won’t work for the use case of storing an IP address, so I upgraded to 1.08.)

I also tried MySQL Connector 5.0 beta when investigating this problem and discarded it because it broke a lot of other stuff in my app — notably, the 5.0 beta forces you to check for null values for all nullable fields in a DataReader, which I think is a mistake, particularly since it’s different than the behavior in the 1.07 connector and from most other ADO.NET providers I’ve used. Is this nullability check some new .NET 2.0 thing that is there because there are nullable types in the framework now? Hmmph. Anyway.

The MySQL ADO.NET provider is open source, by the way (just like the rest of MySQL), so if you ever wanted to see what a soup-to-nuts ADO.NET provider looks like, you can download the source and pry at it to your heart’s content.

Update: In the comments,
Reggie points out that the SQL Server and Oracle ADO.NET providers
exhibit the null assignment behavior with DataReaders as well, so the MySQL folks changed their
provider’s behavior to mimic what the other guys do. Throwing an error when assigning a null value still seems
unnecessary to me since the DataReader should just know what to do when
assigning a null field to a String, but I’m sure someone will be along at some point to let me know why this behavior is sensible and correct, even though it’s really awkward for developers.

Also: I mentioned that the change from sensible handling of null types to strict handling didn’t start with the 5.0 provider; it was introduced in 1.08 (as I discovered yesterday when my application started throwing up after encountering unexpected nulls). Not a huge deal, though, since I have my own object-relational mapping tool that I use specifically for situations like this.

Open Shortcuts for Yahoo! Search

Today we launched a new feature of Yahoo! Search called Open Shortcuts. This lets you do certain types of searches quickly. It’s also customizable. For instance, to search eBay from the Yahoo! search page:

  1. Go to search.yahoo.com (or any convenient Yahoo! search box)
  2. In the search box, type !ebay shoes
  3. You’ll be taken to eBay where you’ll see search results for all the lovely shoes that are available on eBay

You can also define your own shortcuts in the search box. I made my own shortcut to search the Yahoo! Developer Network site by following these steps:

  1. Go to http://search.yahoo.com/osc/create
  2.  

  3. In the ‘name’ box, enter the name of the shortcut (in this case, ‘dev‘)
  4.  

  5. In the ‘URL’ box, enter:

  http://search.yahoo.com/search?vs=developer.yahoo.net&va=%s

The "%s" is a special character that specifies that you should replace this with whatever you entered in the search box.

To save the shortcut, click on the Set button.

Now when you go to any Y! search box you can enter !dev javascript (or whatever) and you’re taken to search results for ‘javascript’ on the Yahoo! Developer Network site.

Remember that this works from any Yahoo! search box, including the search boxes you find at the top of nearly every Yahoo! page, as well as the Yahoo! search box in Firefox, etc.

I’m pretty sure you have to be logged in to Yahoo! for this to work.

There is also a shortcut for creating shortcuts, it’s the ‘set’ command. I used this to create a search shortcut for MSDN (Microsoft’s developer site):

!set msdn http://msdn.microsoft.com/msdn-online/shared/components/mscomsearch30.aspx?qu=%s

(That should be all entered in the box as one entry; it looks like it’s going to word-wrap on this page.)

Continue reading

Contextual Search Madness

I added Y!Q contextual search to the blog, as you can see below. (Clicking on the soothing purple and yellow link gives you a dynamic HTML pop-up; it won’t take you away from this page, so click to your heart’s content to see how it works.)

This was not difficult to add to Typepad. The instructions here will help you get started. The only Typepad/Movable Type-specific information you need to know is:

     
  1. The JavaScript link should be included on the main template, the individual template, the category template, and the date-based template (if you use them; I don’t).
  2.  

  3. The hidden control that provides context (by passing a blurb of text to the Y! search engine) behaves well if you pass it the "entry excerpt" of your blog post. In the Movable Type templating language, the tag looks like this:

    <input type="hidden" name="context" value="<$MTEntryExcerpt$>" />

I would be remiss if I did not mention that there is also a contextual search API for developers who want to integrate contextual search in other contexts.

How To Evangelize Your New XML Features

Dear Bill,

Loved the big news today about how Office 12 will have an XML file format. But you blew it on the sound bite, my friend. Here’s how you described the benefits of XML last month:

Last month, Microsoft Chairman Bill Gates said that Office
12 would make it easier for workers to "focus, prioritize and
apply their expertise, visualize and understand key data, and
reduce the amount of time they spend dealing with the
complexity of an information-rich environment."

WRONG, WRONG, WRONG. If you describe the benefits of Office that way again I will kick you in the trousers. There is nothing about that quote that makes me want to buy Office. Any version. Even Word 2.0. Blah, blah, blah. (This story which went into more detail doesn’t do much better.)

If somebody wants to quote you on the benefits of the XML file format in Office 12, you want to say something like this:

XML is about openness and interoperability. The XML file format in Office 12 will make it easy for third parties to create a new generation of productivity applications that will make it even easier to interoperate with Office applications. For example, you’ll be able to easily import and export to and from Office documents from any software on any platform, use Office as the front end to your content management system of choice, easily transform any Office document for publishing on the Web, and so on. But the most exciting part of the new format is the fact that we don’t yet know what cool things third parties are going to do with it. That’s the benefit of being open.

Maybe this is a little verbose for the mainstream press, but this is the kind of crap that gets customers excited, my man. Free evangelism advice from me to you, no charge. Next one I’m invoicing you for, though, that’s just my policy.

P.S. Please find the people within your organization who thought it would be a good idea to create an ad campaign likening your customers to dinosaurs and kick them in the trousers. That’s right, the front side of their trousers. Kisses!

How Not To Sell Me Crap

So many sales droids keep making the same mistakes, I thought I’d put together a handy primer on how not to sell crap to me.

Imagine that the sales process is a game and you have to score 100 points to win. When you win, I buy your crap. Now, at least 50 of those points comes from "having a good product". Another 25 of those points come from "being easy to work with" which includes having a non-ridiculous price point for whatever it is you’re selling.

The final 25 points come from your company’s track record — have you ever done this before or are you making it up as you go along? A little thing that marketers like to call "success stories" is key here, as well as metrics (numbers, whatever) that demonstrate some kind of return on investment. (I realize that "ROI" is a hackneyed business droid cliche; if you like, we can rephrase it by saying "can my crap make more money if it starts using your crap?" If the answer is yes, then congratulations, we are more than 25% of the way there.)

Now, none of these things can be materially influenced by a conversation with a sales person. You cannot convince me that your crap product is not a crap product in a phone conversation. You cannot invent customer references or stellar features. The best a sales person can hope to do is inform me about the company’s products, track record, and services. (I should pause to mention here that I’m really not "anti-sales" — I’ve actually done many sales and sales-ish jobs over the years, starting when I had my own paper route when I was 12 — but I’m really cognizant of what happens when sales people don’t do their jobs right.)

So, some tips:

1) Do not cunningly divine my telephone number, call me, interrupt my work, and give me your sales pitch. I’m very easy to reach by email and that is the way you should be reaching me if you are not a friend or co-worker. Just because you have my business card does not mean you should call first. Email first, and call if I ask you to. Better yet, wait for me to call you. If you unexpectedly reach me by phone, you’ve already lost about 15 points before you’ve even uttered a word.

2) A kickass demo is worth a whole legion of sales droids. Give me a kickass demo and you’ve gone a long way toward racking up those 50 points for having a kickass product.

3) Do not whine when I tell you that the crap you’re selling is too expensive for us. I work for a deeply strange company whose return-on-investment calculations are of paramount importance; at the same time, the calculations themselves are radically different than the average Silicon Valley company. We are willing to pay the big bucks for the right product at the right time, but our definition of "big bucks" may be different than yours, and it may be on a very different timeline. But ultimately, my company is very cheap and very conservative about who it will do business with. Know this before you start and you will be much happier.

4) Do not attempt to go over my head to my boss or my boss’ boss when I shoot down your sales pitch. My boss and my boss’ boss are experienced professionals, but they know much less about how I do my job than I do. Hence, if you bug these guys, they will laugh at you, then forward the voice mail on to me, where I will laugh at you harder and deduct 25 more points from your score.

5) There is no such thing as a "hard sell". The concept of the "hard sell" is a manifestation of your frustration at not being able to get through to me. It says nothing to me other than "this salesperson does not have the emotional maturity necessary to work with me." I don’t have to put up with it. Get a better product, communicate about it better, or hand me off to someone on your team who can communicate your product’s benefits more effectively. (Preferably you’ll have that person contact me via email.)

6) The customer is always right. Still. Duh.

I realize that a lot of this is going to come off as arrogant. Sorry, but that’s the breaks. I’m really not that hard to do business with if you have some crap that I need. So if you want to sell me your crap, then it’s better you get this information up front than in the kind of nasty post-mortem message I just left on some hapless sales droid’s voice mail.

Credit Card Madness

Excellent story in the New York Times about how credit card companies can charge you pretty much whatever they want after you’ve racked up a balance, thereby punishing their best customers (the ones who carry a balance). I mention this because some of the horror stories were similar to what happened to us after we went a little nuts getting our house set up the year we got married. (We’re making good progress and will likely pay off all our cards early next year, but the rate on one of our cards was hiked up to 25.9% — loan shark rates, really.)

We found this calculator useful when we got serious about paying down our credit card bills last year. It lets you plug in the balances on all your cards and gives you a strategy for paying off the high-interest cards first; you can tell it to calculate a payment plan over a fixed time period (like twelve months) or tell it to calculate a plan based on a fixed payment amount you can afford each month.

The PBS investigative series Frontline will cover this issue on Nov. 23 (next Tuesday night).