Managing 'Bob' For Fun and Profit

(This post originally appeared as part of the 2009 PHP Advent Calendar)

The interaction between technical people and the project sponsor has common patterns regardless of your employment model. Project sponsors — whether consulting or freelance clients, key stake holders within your organization, or potential users from some vaguely-defined demographic — all have similar needs and issues. I’m going to collectively call these peeople Bob from now on, because “clients, key stake holders, and end users” is very wordy, and pixels are expensive. Also, it helps to put a human face on a role. (Three quarters of the way through a project, it might help to put a human face, specifically Bob’s, on your dart board.)

Technical people tend to think first and foremost of the technical parts of a project. That seems like an obvious truism, right? If they thought first and foremost of the color of the packaging, or the training users will need, or how best to market the end result, they probably would have gravitated toward a different career.

Effectively managing Bob is a key task that directly leads to project success. Sometimes the relationship has obviously adversarial aspects, such as in a fixed-price contract where both sides are likely to disagree over what is within the project scope, but even the friendliest relationship has the same basic conflict between the technical staff and Bob. The sponsor wants more, and wants it on time. The technical staff needs to restrain their enthusiasm, so that a cross between those wants and the constraints of reality is produced.

Regardless of whether Bob is your employer or client, you need the same basic elements to control the process: an upfront plan (recorded in some way), a way of recording all changes, an agreement on who has the authority to make changes, and the power to update the original plan’s time estimates in the event of change.

Overall project success or failure is only sometimes closely tied to technical factors. Right off the bat, you need to think about who decides if the project was a success, and regardless of whether that determination is made based on measurable, objective factors or more commonly just the person paying the bill’s gut reaction, it probably is not made on the basis of a technical evaluation.

The determination is made by Bob. Bob rarely has the knowledge to judge a project on its technical merits, and even more rarely cares. He has his own internal set of criteria, only some of which you have the knowledge to understand, and even fewer of which you care about, and many of them will go unstated until it is too late, unless you are very good at extracting information from uncooperative subjects without the use of pliers or waterboarding.

I’m not saying you should deliver poor quality code. Non-technical people certainly notice the side effects of good code. Even if Bob would not recognize it if a bus — plastered with beautifully-tested code implementing a cool new design pattern that was only invented tomorrow — ran him down in the street, he notices the results. Bob notices uptime, how long seemingly minor change requests take to implement, consistency in the UI, crashes, revenue, and conversion rates. He will notice the symptoms of bad code, even if he does not have the knowledge to diagnose the root cause, or the vocabulary to request the cure.

My point is that technical aspects are only a small part of overall project success. Extracting real, actionable requirements from Bob, setting realistic expectations, and either meeting those original expectations or keeping the project on track as things change is a big part of success. Manage new information, new feature requests, and change requests while either coming in on time or resetting Bob’s expectations in advance. This keeps him informed about what impact his requests, dreams, maternal attachment issues, and crazy ideas he read in this week’s issue of IT Trends For Steam Engine Manufacturers are having on the project.

If your project is to be a success, you need to effectively and proactively manage Bob. You need to keep him happy, which probably means making good overall progress, but specifically making some visible progress in parts of the project he does understand. You need to deny some of his change requests so that the project reaches completion. You need to accept some of his change requests so that he feels that the power dynamic is correct, but you need to either have allowed the right amount of padding in anticipation of change, or make sure that Bob is aware what effect the request has on the timeline.

One of the best and worst things about software is that it is infinitely malleable. If you don’t like change, perhaps steam engine manufacturing would be a better career for you. Change will happen, both in the industry around you, and within your own projects. Trying to deny all change is counter-productive, but an inability to say “no” to any change requests is a recipe for insanity.

So first up, presenting a best-case time estimate to Bob is worthless. Unless a task is really small and well-defined, new information will come to hand, or Bob will have time to read that all his competitors are going towards mauve for databases and your best case will not happen. Tend more towards Scotty from Star Trek’s approach to estimation. He claims everything is probably impossible, definitely impossible in the time available, and then delivers it on time anyway. In other words, add some padding, so that rather than satisfactory delivery being an unlikely event that only happens in rare instances when planets align and Kirk stops chasing green women earlier than expected, it becomes the norm.

If you have some padding in the initial estimate, you can afford to react to new information and good ideas in ways that will make the end product. Most importantly, you’ll be able to deal with the reality that in anything with more than ten lines of code, or more than zero people involved, something is bound to go wrong.

The usual gag about quitting your day job to do freelance or consulting work is “I fired my meddling, egomaniacal, narcissistic boss and now have fifty meddling, egomaniacal, narcissistic bosses.” But, counter-intuitively, internal stakeholders are often harder to manage than external clients. External clients are much more likely to be tied to some form of written contracts, written design documents, and a formal agreement on who has the right to make decisions. Internal projects are rarely as formal. It may be hard for a lowly programmer to say “no” to conflicting requests from vice presidents of many different areas within the company.

Assuming you take on external projects in a mostly sane way, it should be fairly easy to say “Why yes Bob, your perfectly reasonable request to add a previously unmentioned Parseltongue translation layer two weeks before launch can be done, but it will add 3 weeks and $10,000,” and get real commitment on whether the change is really wanted and — perhaps more importantly — written sign-off on the effects. It may be very hard to say “no,” and it may be fairly hard to convincingly say “you should listen to me when I say you don’t want that,” but it can be easy to put a dollar value on a request and let the person who has to pay for it make the decision that you favor.

While an external Bob may well turn out to metaphorically (or medically) have multiple personalities, if your internal Bob is an amalgam of your engineering boss, his boss, the head of marketing, some guy from sales — who may or may not actually be important but needs two lines on a business card for his title — you can guarantee multiple personalities.

You need to know who has the authority to make decisions on conflicting requirements. On an external project, this is usually fairly straightforward. When you determined who had the authority to sign the contract, you probably found out who has final say. On an internal project, if you have difficulty pushing back against more senior people in other departments, you need to make sure that your boss is on your side and will do the pushing back on your behalf. Immediately flag conflicting requests or anything that will affect completion time.

You are going to be held to a plan and a schedule, even if they are just in Bob’s head. It is in your best interests to have them recorded, so that you can hold Bob to the plan, which will help you stay on schedule.

Regardless of the model, your goal is not to give people what they asked for; it is to deliver what they want.

PHP !== Java

(This post originally appeared as part of the 2008 PHP Advent calendar)

Java has its place. Maybe it has many places. I’m OK with it being on your phone, in your refrigerator, and on my bank’s web site. I’m even OK with it making another play to be in browser applets. However, I’d really prefer if you kept it out of my PHP. I am seeing more and more PHP written as though it was Java with dollar signs. I think this is misguided.

PHP has its own pragmatic beauty. It does not try to check off enterprise buzzwords or be all things to all people. It does not try to be pure, driven down an organized roadmap, or marketed by a single owner. But it does get stuff done. Written well, it can be brief without being terse, and tidy without being restrictive. In its normal form, it will just work without significant planning and without consuming significant resources.

Using a spoken or computer language effectively is not just a matter of learning your language’s syntax and vocabulary. It is also about learning the quirks and idioms unique to that language, and using it in normal ways so that others don’t have to work to hard to understand you.

Translating the French Il pleut des cordes literally into English as It is raining ropes is nonsense. Literally translating the equivalent English Idiom It is raining cats and dogs into most other languages probably also results in nonsense. Potentially syntactically correct nonsense, potentially decipherable nonsense, but nothing that will flow naturally in conversation with a native speaker.

Translating Java literally into PHP gets similar results.

Here is a Java implementation of the singleton pattern:

public class Singleton
  private static Singleton myObject;

  private Singleton()
     // Providing a constructor to eliminate default public one.

  public static Singleton getInstance()
    if (myObject == null) {
    myObject = new MyObject();

    return myObject;

  public Object clone() throws CloneNotSupportedException
    throw new CloneNotSupportedException();

In case you are not familiar with it, the singleton pattern is a general solution to many situations where you want only one instance of a particular class. Examples might include a database connection, a logger, or many user interface components.

Scatter a few dollar signs and make a few minor changes, and you get a valid PHP implementation:

class Singleton
  private static $myObject;

  private function Singleton()
    // Providing a constructor to eliminate default public one.

  public static function getInstance()
    if (! isset(Singleton::$myObject) )
      Singleton::$myObject = new MyObject();

    return Singleton::$myObject;

  private function __clone()

A native PHP speaker is much more likely to implement the same pattern as follows:

global $myObject;

if (!isset($myObject)) {
  $myObject = new MyObject();

Unfortunately, choosing this example might divert attention from the point I am trying to make. Global variables elicit a knee-jerk reaction in many people for a number of reasons, many of them good. In reality, more elaborate implementations of the singleton pattern deserve most of the same criticisms. Singletons are the object-oriented implementation of global variables.

PHP has always taken well-understood things from other languages. Why create new function names if people already know the names of the underlying C functions? Why not copy Java’s object system that many people already grasp? Why not offer Perl inventions that people find useful? But, the broth that this mix of ingredients creates has a unique flavor. It is not C, nor Java, nor Perl, and trying to program as if it is will probably leave you both missing the appeal of PHP and frustrated at the differences.

Like putting a hippo in a tutu, or a ballerina in a swamp, trying to force a language to be something it is not looks silly, works poorly, and gets leeches in your slippers.

OK, maybe I lied about the leeches.

A Marvellous, Amazing, Exciting Ink Shopping Experience

At least I expect that is what HP has prepared for me. Hewlett Packard keep giving me this annoying nag popup window urging me to install a “simple, smart utility” that “uses the Internet to help you find, compare and repurchase genuine HP supplies” for my specific printer.

HP Printer Ink Shopping

At first glance that does not sound very exciting, but look it is 4.9MB. 4.9MB! – It must be some sort of interactive, fully immersive 3D shopping experience that would put the old to shame. To require a 4.9MB download, plus an internet connection, I bet they have figured out a way to let you be hundreds of kilometres away and yet still sniff the ink and get paper cuts from paper specially selected for “your specific printer”. I’ll bet you can virtually bathe in Vivera ink and feel it squish between your toes.

I can hardly wait to try it, but I think I am going to try putting it off for a few days longer, so that anticipation will help me to truly savour the experience. Besides, I am a bit busy today, and figure I really should wait until I have half a day to properly devote to the delicious, invigorating ink repurchasing extravaganza that awaits me.

Jim Mirkalami Update 2: Small Claims Court $10000

When I got Jim’s initial threat, I naturally treated it with the seriousness it deserved. After careful consultation with my army of high priced lawyers, I replied:

Thanks for your interest in my blog.

Unfortunately, I get so much fan mail that I cannot respond to all of it personally, but rest assured that I do read and appreciate all of it.


Luke Welling.

I am kind of flattered that he thinks this blog is important enough to waste $75 filing a Small Claims Court Complaint in Ontario.

I am pretty sure emailing me a blurry PDF does not count as serving me with the document, but what I know about Canadian law would fill a very short book. I guess I will need to read up on it one evening. I am still not sure any amount of reading will find a Canadian law matching the complaint “Un-authorized[sic] publication of my personal name (un-konwingly[sic] at first knowingley[sic] and willingly after) cuasing[sic] seriouse[sic] damage to my reputation”.

I do hope he is also suing the schizophrenic, voice hearing brother for the initial unauthorized use of his name. If me using it once is worth $10000 worth of reputation, then the brother plastering it all over the internet must be getting a huge bill.

When I am served properly, I guess I will have to reply. Until then, here is the blurry PDF of the complaint. It looks real enough to me, but I suspect the court might have more luck communicating with me if he included a country in my address.

Jim Mirkalami Update: Legal Threats

I got email today from somebody claiming to be Jim Mirkalami threatening legal action. I say “claiming to be” because the last person claiming to be Jim, later claimed that they were his brother Bryan or Seyed B. Mirkalami and claimed that Jim “does not know what is going on on the net, he is not an internet savey[sic] type person.”

The original of the Bryan or Seyed B. Mirkalami post may have been taken down by, so you might have to look to a cache.

Anyway, here is the email in full. Unless somebody can point me to a law making it an offense to publish a name without authorization I am not going to lose sleep over it. I have looked back and my post on Jim Mirkalami does not seem defamatory.

Subject: Un-authorized publication of my name

Mr. Welling

My name is Jim Mirkalami and it has come to my attention that my name has been published within your website/s and blogs, without my authorization.

I hereby request from you to immediately remove any and all references made to this name and refrain from such publications in the future without my authorization.

Your immediate attention to this matter is greatly appreciated.

I will have no option but to commence legal action in an effort to protect my name, if my request is denied. I will be doing so a week today on Monday
April 7th, 2008.

Thank you
Jim Mirkalami

Well funded web2.0 one day, blurry clip art the next.

Here is a postscript to a failed and forgotten Web2.0 venture.

The summary for a story about botnets was decorated with blurry clipart that seemed familiar to me.
From March 21, 2008

Talk about “rooster one day, feather duster the next”. The the logo from is now relegated to blurry clipart status. Although as I said back then, that venture elected to skip over the rooster stage, and take a more “turkey one day, feather duster the next” trajectory.

Sweeping Bad Press Under The Rug Using Junk Blog Comments

I noticed an interesting comment on this blog while deleting comment spam a few days ago.

1. Jim Mirkalami Says:
February 6th, 2008 at 6:25 pm

I have been a frequent visitor of this blog for some time now, so I thought it would be a good idea to leave you with my thanks.

Jim Mirkalami

It has that “almost certainly spam but hard to be dead sure” feel to it that a lot of spam comments have. Strangely although it is an optional field, he gives as his website. This seemed even stranger when you note he seems to have his own website ( unless there are two single fathers of two with that name in Ontario.

It seems like a pretty uncommon name, so I google for him. The first few links are news stories alleging questionable ethics in Canadian Auctions for jewelry and Persian rugs. Curiouser and curiouser.

Of course, I am only guessing that it is an uncommon name. It could be the equivalent of Smith in the middle east. It certainly seems fairly popular in among Toronto rug merchants.

Here is my theory.

I’d be upset if the first google result for my (fairly uncommon) name led to a page that started “No charges laid …”.

Knowing a little about SEO and the way google ranks pages, I think you could fairly quickly bury those stories by commenting on a lot of blogs. It would be harder if the story was all over major media. Not many blogs have a pagerank that can compete with CNN or the NYT (pagerank 9), but Google ranks local media about on par with a popular blog. There are no shortage of blogs with a pagerank around 5 or 6. Google only gives 7.

The comments appear to be somewhat targeted. They seem to appear on blogs (but not always posts) that mention the word ‘auction’ or the word ‘Canada’. There are automated comment spam tools that will find suitable blogs for you, or in a little more time you could do it by hand from any of the blog search engines. A few days later he commented on another post of mine that does contain the word auction (because it is about ebay).

The text of that comment is

Jim Mirkalami Says:
February 8th, 2008 at 3:13 pm

I have been visiting this site a lot lately, so i thought it is a good idea to show my appreciation with a comment.

Jim Mirkalami

PS: I am a single dad! 😉

Other ones you will see around the place are:

Tammy kingston, on February 5th, 2008 at 5:18 pm Said:

Jim Mirkalami, the very globally highly regarded auctioneer, is a peaceful man single father of two beautiful children. He is also a regular reader of this blog. Great job you ppl!

Aslan, on February 7th, 2008 at 10:06 pm Said:

He is a kind and very loving man.

I don’t know who Tammy is. I get no useful search results for “Tammy Mirkalami”, but I am guessing she is from Kingston (which is near Toronto). I am guessing the Aslan above is more likely to be Aslan Mirkalami (owner of than a lion king from Narnia.

Does this variety of reputation management work? Sure does. A few days later, and at least the top 10 pages of search results for his name are all blogs. The negative press is presumably still indexed, but has dropped way down the list where only a dedicated searcher will find it. He many have overplayed his hand though, as the first result at the moment is a blogger calling him a spammer.

So here are some morals to this story.

  • If you are going to have dissatisfied customers, make sure you have few enough that only local media cover the allegations.
  • Commenting furiously on blogs will give you Google results that effectively act as noise
  • Try to tailor the comments to the blogs a little. It would not take much more time, and would make the effort invisible.

Oh, and surely you already knew that whenever you buy anything (including rugs and jewelery) valuations from the seller are worth only slightly more than the paper your blog is written on.

You Used PHP to Write That?! – Uh yeah.

I have gotten pretty good at staying out of language flame wars recently. Usually, when some wide eyed neophyte wipes a trickle of Kool-Aid from their chin and says “Ruby is sooooo much better than PHP”, I just say “uhuh”. I can’t be bothered opening a can of Terry Chay on them and I don’t really see the point. I can’t even usually be bothered saying “uhuh, that is why Twitter is the only A-list Web2.0 site built with Ruby and it is down all the time.”

Every now and again though, I just can’t help taking the bait.

You used PHP to write WHAT?! by Kenneth Hess on grates. PHP programmers in general are pragmatic. It is not generally a language chosen by purists and zealots who latch onto one tool and claim it to be perfect in every way, and appropriate for every task. There are plenty of people with deep PHP knowledge who could have written an insightful article fitting into the CIO series’ theme that no one language is right for all applications.

Pap annoys me more when it appears in something claiming to be mainstream media than when it appears in some loser’s blog. Traditional media, while possibly doomed, does employ editors and generally attempts to check facts.

Well, sometimes they check facts. Ignoring the subjective parts that are merely the authors opinion, this article has so many simple factual inaccuracies that it is laughable. I assume the author does not have a great deal of experience with PHP.

Given he claims you can port an application from one database to another with minimal effort by running find and replace to swap mysql_query() with mssql_query() it seems likely that he has never written a non-trivial application in any language. So his major claim that PHP does not scale is presumably based on conversations he had with the fairies that live at the bottom of his garden.

Maybe it is just that Java fanboys push my buttons more than Ruby fanboys. Maybe it is just that damning with faint praise is more annoying than overt attacks. Barack Obama is “articulate“. Australia is “lovely” and reminds Bill Bryson of Iowa in 1958. PHP is good for “Creating an intranet site”. Come on!

Actually, it is might not not even be the factual inaccuracies and unsupported assertions that irritated me most. When I hear “enterprise” used as an adjective and not a punchline I involuntarily clench and it is there five times on one page.

Postscript: A couple of days later, Terry Chay could not resist opening a can of Terry Chay on them.