Good Software is not just about algorithms

If you weren’t familiar with software development and you saw one of Google’s billboards or their “aptitude test”, you might think great sofware is all about writing great, complex algorithms. But good software is about much more than that – its ultimately about solving problems and saving people time. If you write great algorithms but can’t hide them behind a user interface that mere mortals can understand, then you don’t have great software.

Google’s core product is their search engine. This happens to be a piece of software that has a very complicated algorithmic component, but a very simple user interface. Because of that, it is an ideal problem for PhDs to work on. These PhDs are smart. They can apply tremendous engineering vigor to the algorithms they work on. But, when it comes to making software “easy to use”, your PhD degree probably won’t help you much. Making software easy is about understanding your customer and being able to relate to real people’s problems. Its not about teaching the customer how your algorithm works. Its about allowing the user to use the computer naturally, and then applying your algorithm transparently underneath.

And in some of Google’s products, this lack of understanding really shows. For example, their AdWords product is downright abysmal to use. Any business person trying to understand the nuances and complexities of this techno-driven software will recognize that this is software built by geeks for geeks, with little understanding of their target customer.

My case in point today is their adwords campaign daily budget. To the end user, this should be a simple thing. “After I’ve spent $50, stop displaying my ads today”. Simple, right? Not with adwords. Long before you ever reach your $50 limit (in fact, you may have spent only $0.05 of that limit!) you’ll start getting warnings about your ads being “on hold” or “in trial” and your daily limit potentially being “wrong”. It will ask that you please reset it to the “recommended value”, but the recommended value may be $17,000!! After having played with it long enough, I think I understand why these exist. But, if it were good software, I wouldn’t have to. This is a clear case where the user is getting exposed to the wierd stuff going on to make the algorithm work.

Another example is their “status” of an ad. As the user, I know of two statuses – enabled and disabled. I can even think that google might put a new status like “stopped” (due to underperformance or failure to comply with advertising guidelines). But Google gives statuses like “in trial” and “on hold”, and provides no explanation or statistics to support why its been auto-classified into these unexpected statuses. As the end user, you are left to read through scanty documentation and try to understand what the engine is doing at a low level. Within seconds of creating a few of my keywords, google moved them into the “In trial” status. I guess In-trial means I wrote a “low quality” ad. But the ad looks perfectly fine to me. What is low quality about it? I’ve still never figured out how an ad that was never run went into “in trial” status.

Another problem for google is the way you pick your prices. Unlike Overture, Google requires that you pick a price for your keywords first, and then click submit, Google analyzes them, and then finally notifies you what position your ad will be displayed in (and also estimates how many clicks you will get each day for the keyword). This setup is okay, but it forces the user into a trial-and-error retry loop, constantly trying one value, then going “back” and trying another. Wouldn’t you rather have an interface that allowed you to get this done with one setting? I’d like to just see a list- to be the #1 ad, you need to spend 10cents, to be the number 2 ad, you need to spend 8 cents, etc etc. I can definitely see how an algorithmic-thinker may have thought this was actually a good interface, despite its obvious flaws.

To their credit, Google has made significant improvements over the past couple of years to the user interface. Originally, it was just as complicated and obtuse, yet didn’t contain any help! Now, at least it has help, and tries to tell you why their product isn’t working. Now the only problem is that the application is so complicated that reading the help doesn’t even help. Or maybe I’m just too dense.

So, for the time being, I think Google will remain great at solving highly techie problems. The search engine works well, because it needs so little user interface. Likewise, GMail will fare well, because its an application used more heavily by engineers than any other profession (the engineers don’t have to relate to customers- just their own understanding of their own email usage goes a long way). But Google is going to have a hard time transitioning into main-stream email or business applications. These applications require a much better understanding of how to simplify problems for end users. And this is one thing that Google has not demonstrated an ability to do yet.

The point of this blog entry is not to bash Google. There are thousands of whacky interfaces out there. The point is that great software has to have an element of understanding your customer’s needs, and also understanding how to hide algorithmic complexity from end users. Algorithms are fun for us software folks to talk about, but it really sucks when they are exposed to the end user.

Part Time Company Incubation

Even though I’m mostly an amateur, a lot of colleagues that are considering starting companies ask me for help and advice. I try to do the best I can, and I try to refer them to the professionals rather than count on me too much!

But one thing which comes up a lot is that someone is working on XYZ Widget idea, and they are working on it in their spare time. I’ve even done this myself. They’ll have some great idea that they are very excited about, but they just don’t have the confidence or security or timing to be able to quit their real jobs.

In my limited experience, I’ve never seen this work. It doesn’t work for me personally (I’ve tried!). Maybe you can find a few ideas that are interesting and explore them some, but if you really want to develop those ideas into something real, you have to do it full time. Competition changes quickly. If you aren’t working 100% on fostering your idea, then your competition will pass you by.

Recently, one colleague was very excited about a new startup idea. He and a couple of partners were getting really serious. He was going to quit his job, and in the meantime, take some simple job (like a car salesman or something) just to cover the expenses. He was already planning on taking about $250K in loans to start the business and expected it would be about 6 months before he could start seeing the company produce revenue. The plan was good – except for the part time job part. If you are taking loans or getting investments already, why not take an extra $3K per month (or whatever is appropriate) so that you can pay your mortgage during the incubation period? Overall, this would represent less than $20K, and yet it would reduce stress, free him to concentrate only on the company, and also be more stable. He agreed, and is making good progress on that route now.

Whenever I hear of a company that has part-time management, its a major red flag. It tells everyone (customers, partners, investors) that the leadership of the company isn’t 100% confident that the idea will succeed. And a lot of time, it just comes down to putting it in your head that you will succeed. Keeping your old job as a crutch just never works.

Some others agree this is a bad idea:

Anyway, if you are going for it – really go for it. Take an extra $20-$50K in loans to do it right. You may lose in the end, but you were already taking that risk anyway. I think this really is a case of nothing ventured nothing gained.

But I’m no expert!

How you can tell Barry Bonds is on steroids

Barry Bonds complains a lot about how the media is always hounding him. I do feel sorry for him in this regard – he just wants a little space, and when he asks for it, the press calls him a jerk and hounds him more. OK – I guess thats the price of being such a celebrity.

But, much of the hounding is related to the public suspicion that he is using steroids. Major League Baseball doesn’t test their players, and for some reason which I cannot understand, thinks that they don’t need to. So, how can we possibly know?

Well, if Barry is so upset about being *accused* of being on steroids, why doesn’t he just submit voluntarily to being tested? I know its not required by MLB, but that is not to say tha the can’t do it on his own. If he is not using steroids, which he claims, then the test should be easy and conclusive. All of his troubles will go away.

But, he hasn’t done that. Why not? Concerned about privacy? He already has no privacy! At least if he did this (and cleared his name), he’d be a hero to baseball and make the press disappear. There is only one reason I can think of why he hasn’t done this – and thats because he probably is using steroids…

My prediction is that he’s weening off them now. Part of his lengthened injury report is to heal his knee injury (which, coincidentally, is similar to common side effects of using steroids!), but part could also be to retrain after getting off the juice.

One last note for the lawyers – I really make no claim that he is using steroids or not. Just trying to point out that it would be very easy for him to prove that he isn’t. And he hasn’t done that. And that looks pretty damning.

Google Toolbar AutoLinks

Today Walt Mossberg weighed in on Google’s Autolink feature. He agrees it is a bad idea. (See my earlier post)

Overall, I think the feature is just bad. It opens the door to other utilities modifying content, such that the end user can no longer determine whether he is seeing the original publisher’s information or not. Further, with so many content providers needing to fund their content through online advertising, it can easily break the model for everyone.

Google claims they want to “help users”. We all agree that end-user benefits are worth fighting for. But, if we undermine the needs of the publishers such that they can no longer provide content, then have we helped end users? Obviously not.

Possible solution:

There is already an ability for content publishers to instruct Google’s robot to not index a page. This is done by the publisher adding a tag in their content which looks like:

We could do the same for toolbars with a new meta tag.

This way, for pages which are generic web pages, Google and others can markup the text and provide “end user benefit”. But for pages that are from a publisher that needs to avoid markup, the publisher can use this tag.

An alternative would be to make it opt-in instead of opt-out, but I suspect that toolbar writers would agree that this is a non starter, because there is so much content out there that wouldn’t be updated for allowing markup.

Overall, I’m not really a big fan of this comprimise either. When we view a web page, its nice to know where the content comes from. Having markup/autolink being done from all sorts of tools is going to muddy the waters. It also makes it so that two people viewing the same page may not see the same content!

Lets just continue to banish all products that try to do this. The end user benefit is minimal.

Search engine loyalty

This article makes a very good point. Users aren’t very loyal to a particular search engine.

I think its good overall. Consumers are getting enough choice that they can go elsewhere. This presents tremendous opportunities for other companies and startups to build things that can be very influential – despite the encumbents owning the market today.

I wonder what the market will look like in 2 years?

Grand Theft Legal

The Grand Theft Auto game is again being accused of being the cause that led to murder. This time, the accusation is from Fayette, Alabama, and the accusor is the families of victims shot by the accused Devin Thompson. Thompson is accused of killing 3 police officers. The family members bringing the suit certainly have some tear-jerking stories. They say they want to punish the companies that made this murder happen by selling this kid a video game.

Don’t believe a word of it, this is about money.

The lawsuit is against Sony, Wal-Mart, Gamestop, and Take-Two Interactive Software (in other words, anyone who has money). If the plaintiffs really cared about changing the world and making it a better place, why are they in civil court trying to collect money? They should be petitioning for laws to change, or working to make stricter age-limit controls, or working to help parents be aware of video game violence.

But no, these people don’t really care about making the world a better place. They pretend to be “punishing” the wrongdoers. But the monetary damages which would come from this case will NOT be significant enough to punish Sony or WalMart. So its not about punishment. If its not about punishment, what is it about? Its about making a buck for the victims.

To the victims: Look, we live in a dangerous place. This event was a tragedy, there is no doubt about it. But a bad guy killed 3 men. These brave men were guys who put their lives on the line every day. And unfortunately, on this day, the bad guy got them. It sucks, and I’m sure your lives will never be the same. But taking it to civil court isn’t the answer. Spend your time trying to change the laws that made this possible. Spend your time raising parental awareness. Spend your time boycotting the companies that built this game until they change their policies. Why aren’t you doing that? Too much work? I bet there aren’t any lawyers volunteering to help with that for free. Naw, the lawyers definitely only care about the green.

The reality is that these kinds of frivolous lawsuits are already built into the cost of making a computer game today. The makers of the game knew all too well that some money grubber like this would be coming after them eventually. As such, they built it into the cost of the video game. They’ve made $2B in sales on the game, so I bet they have quite a bit of room to accomodate this lawsuit. So you aren’t punishing these companies. Instead, you are part of the system which is taxing every American consumer. We’re paying a higher cost for goods because the manufacturers know that they’re going to have to pay you off. They already had earmarked the money for you to take.

To the victims I probably sound callous and cold. But there is nothing we can do to help soothe your suffering. If you really believe in your cause, then help others by getting our laws changed. That would be progress. Instead, it looks like you are just cashing in your lottery ticket.

And to the lawyers in this case, I guess this is where you guys are playing your own version of “Grand Theft Auto”. Only, for some reason, “Grand Theft Legal” isn’t against the law. How whacked is that.


I’m a C# fan. Its been on my list for a while to finally install mono on my Linux machine (running redhat 9).

For the initial download, I picked up the following packages (I know, if I were 3 years younger I’d pick up the sources and compile them myself!)

  • Mono core – mono-core-1.0.6-1.ximian.6.1.i386.rpm (4.75MB)
  • Mono development – mono-devel-1.0.6-1.ximian.6.1.i386.rpm (857KB)
  • Mono Web Dev tools – xsp-1.0.6-1.ximian.6.1.i386.rpm (141KB)
  • Mono Apache module – mod_mono-1.0.6-1.ximian.6.1.i386.rpm (13KB)
  • Mono Web Services/Form support -mono-web-1.0.6-1.ximian.6.1.i386.rpm (994KB)
  • Mono data – mono-data-1.0.6-1.ximian.6.1.i386.rpm (826KB)
  • libicu international lib – libicu-2.6.2-1.rh90.dag.i386.rpm (4.57MB)Overall, pretty cool. If this works, thats about 1/2th the size of the regular .NET framework.

    Writing My First Application
    OK – so lets see if I can’t create my first mono application. Shall it be “hello world”? Lets try something a little more original (but not much)…. Keep in mind that I don’t run X on my linux box. So I’m compiling this from the command line. In my first attempt, I tried to write C# by hand. But, as anyone who has used C# will tell you, the code pretty much writes itself. Turns out, even though I have written plenty of C#, I can’t write a program that compiles without help. OK, so instead I created the following code via Microsoft’s visual studio. Took about 2 minutes to write:

    using System;
    namespace helloworld
    /// Summary description for Class1.
    class Class1
    /// The main entry point for the application.
    static void Main(string[] args)
    Console.WriteLine("does this work?");
    DateTime start = DateTime.Now;
    for (int i=0; i

    Compiling turns out to be very easy, just use:

    mcs mike.cs

    Mono compiles the source and creates “mike.exe” for you. Its a little wierd to see “.exe” files on linux, but I can deal with that.
    To run the compiled executable, you now type:

    mono mike.exe

    And viola, I can see that it takes about 187ms to count to 100million on my linux machine. (The linux machine is a 1.0GHz AMD Duron).
    Comparing the same program on windows (without the debugger, of course) takes 140ms. My windows machine, however, is a 2.8GHz Pentium 4. Quite a bit faster.
    So Mono looks very promising so far! The next step is to get the Mono IDE installed. Trying to write C# code without an IDE is just not a very fun experience. In order to that, I need to get X up and running again on this box.

  • mt-blacklist installed

    You may have read my earlier posts when I turned off comments on my blog. The reason for doing so was because I was only getting spammed, and it was just taking too much time for me to try to clean up. So, bye-bye comments.

    Well, to help lift the spirits of the crushed spammers, I’ve turned comments and trackbacks on again. This time, with MT-blacklist protection!

    I’m still running an ancient version of movable type. Not because I’m cheap, but because I spend too much time on system administration, and I just don’t want to take the time to upgrade.

    MT-blacklist was pretty easy to install. Copy 5 scripts into your movable-type installation, and you are ready to go. I then accessed the blacklist script page, downloaded their rules for obliterating comment spam, and viola, I was up and running. I actually had a few errors on my first try to run it, but it was only due to incompatibilities to changes I had made myself to the movable type sources. I reverted those changes and all works great. You ask it to find the spam in your blog, and it does (so far with 100% accuracy!), and then it deletes them all for you and fixes up your blog.

    So, if you’ve got movable type 2.6, get this mt-blacklist!

    3 easy steps for effortless documentation of C#

    If you write C#, and you haven’t yet turned on the documentation features, you really should. Prior to C#, every team I ever worked on said, “yes, yes, we should do a better job at documentation.” But this task always fell too low on the priority list. Some developers did it, most did not, and all of the documentation fell out of date.

    C# helps you write it yourself in 3 easy steps.

    1. Make it a COMPILER ERROR if a method doesn’t have documentation.
      You really need to turn this on. Its very easy to keep your documentation up to date as you write the code. The quick compiler error reminds you, and you never miss a function anymore. If you wait, you’ll never do it, because retrofitting N methods takes too long!! Do this early. To do this in visual studio, right-click on the Project, go to Configuration Properties -> Build -> Treat Warnings As Errors. Set it to true.

    2. Enable generation of the XML documentation file as you build
      This step takes no work! Just right-click on your project and select Configuration Properties -> Build -> XML Documentation File. Set it to “docs.xml” (or whatever works for you).

    3. Use NDoc
      NDoc is a very easy to use, free utility which converts your code markup into actual documentation that looks just like MSDN. See the NDoc user guide documentation for an example, or their developer docs. Just download, install, and point it at your project and “docs.xml” file, and it will generate the docs in about 10 seconds.

    Thats it.

    If you’ve been programming for any length of time, you probably have some skepticism about the practicality of documentation in large software projects. But check out these 3 easy steps – I guarantee you’ll be impressed!