Beat the Rest. Be the Best.

Guy has some new rules for revolutionaries. And as usual they’re hilarious as well as informative. How to drive your competition crazy. I have always welcomed competition. I don’t want to be a single player in a market. Sure, if I’m honest, then I do feel a twinge of sadness when I hear of one, but I feel a stronger urge to be better than the competition, as Guy quotes:

“The purpose of competition is not to beat someone down, but to bring out the best in every player.” Walter Wheeler

You don’t win sales by telling your customers how bad your competition is. You win by admitting their strengths but also acknowledging your own and not only making a compelling offering but also delivering on it.

Guy’s penultimate point, Turn the competition into allies I exercise in my day job. We turn away PC work to a selected few PC companies and in return we get their Mac work. Even one of the local Mac IT companies bring their customers Macs to us to get fixed. They offer a value-added solution (or maybe they just charge more than we do).

We’re not doing too bad in the other areas either. We have a small team of evangelists who push people our way. But again, evangelists are not important when you’re the only player in the market.

How to avoid being driven crazy?

  • Be the best. (Ask yourself?)
  • Be Patient. (Impatient people cut corners)
  • Love your work. (Enthusiasm is infectious)
  • Laugh at your mistakes. (Everyone else will)
  • Smile. (You’ve got 10 seconds to catch attention)

It’s a pretty tall order to be honest. I love it when my local user group talks positively about us. I hate rushing into things. I trust people to do their job (and one of the guys said to a friend he’d walk over hot coals for me….that sort of comment makes me feel proud and indebted to my employees). I laugh at my mistakes, but I’ll make sure the customer laughs louder and longer. And I greet everyone with a smile. 10 seconds after dealing with the most infuriating person on the planet (hmmmm, yes), I’m smiling again. Believe it or not, I can be quite charming.

I was meant to be at the pub tonight but stayed in to watch Memoirs of a Geisha with a friend. Great film but I was the only one awake by the end. I’m a big fan of Michelle Yeoh. I digress.

The essence of driving your competition crazy is grace.

Show some grace. Be classy. Be a sport. Acknowledge greatness. Try harder tomorrow. If you act petulantly, you encourage petulance.

Who wants to eat dog food?

There’s a difference between “eat your own dog food” and “be blindly stupid”. I never liked that term anyway. I’d rather “eat my own cooking”. Why does it have to be “dog food”?


The Scobleizer has an entry on his blg about how he’s a bad parent and a bad evangelist for Microsoft because his son has an iBook, an iPod and wears Apple T-shirts. Of course, Robert’s brother-in-law works for Apple on the Mac team. Patrick Scoble says his iPod is “cooler”.

This stink comes from Steve Ballmer claiming that his kids are not allowed to have iPods and are not permitted to use Google. Does Ballmer have net-nanny blocking the google URL? Does “google” rank up there with other rude words? How deep does the “don’t use competitors products” go?

Admittedly it’s different for the likes of us. We’re a small company with half a dozen product ideas in the pipeline. In most cases we’re not using a competing product because …well… we’re writing the ones we need. If there was a competing product, we’d use it! Probably.

When you’re a company the size of Microsoft with fingers in every pie and the pies have to be worth $100 million before you’ll even consider dipping in, then the stakes must be a lot higher. When you’re trying to get a foothold in “search”, then brainwashing everyone you meet into using your products must be important (I’m not sure I’d be the same with children). When you’re losing the portable music player market as badly as Microsoft is, then I guess you have to ensure that none of your hard-earned goes into bolstering the competition. I wonder if Ryoji Chubachi uses an iPod?

Now that would be funny.

How would you taste?

Wired has a great article today. It’s just a collection of quotes from Steve Jobs, the half-Syrian silicon Valley wunderkind who’s achieved more than most of us can hope to. Especially seeing as he was a millionaire before the age of 30. I’ve failed utterly on that one but let’s face it, if you’re going to pick a role model, you might as well pick one who will be HARD to beat.

My good friend PJ spent years working to get to draw Judge Dredd for 2000AD. It seemed an impossible mission. He toiled for years. And, eventually, he managed it. And I remember sitting in his little studio room when he said, “Now what?” (yes, I’m paraphrasing). He’s since got involved in all sorts of exciting stuff but it was one of those moments when I realised my own goals might not be lofty enough.

Suffice to say I have realigned my goals and they would now curl your toes. I have ambitions that tower over the landscape like a really tall, towery thing.

Anyway, back to The Steve.

I think Steve is not a bad role model. He’s aggressive, driven, determined. He’s shrewd, intelligent, capable of amazingly profound observations and also unafraid to call someone a bastard when they need to be called a bastard.

My favourite quotes:

Innovation has nothing to do with how many R and D dollars you have.

Nobody has tried to swallow us since I’ve been here. I think they are afraid how we would taste.

It is hard to think that a $2 billion company with 4,300-plus people couldn’t compete with six people in blue jeans.

Yeah, man! (Sorry, I went to see Henry Rollins on his Spoken Word tour on Tuesday night and it’s got me all fired up and ANGRY, not in a violent way…but in a change things way…)

So, Steve may not be an ideal role model, but he’s going to be one who’s hard to beat.

RubyCocoa – to_i and to_s

I’ve been using a lot of RubyCocoa over the past few days, and ran into a few issues that took a while to solve. Blindingly obvious with a bit of foresight, so I figured I’d write this short entry to provide that foresight (or hindsight) to anyone searching for a little help.

Generally, the methods you call on a RubyCocoa object will return a subclass of OSX::NSObject. You can use puts to print out the value of the object:

some_var = some_osx_nsobject.a_method
puts "a_method returned #{some_var}" # wrong
puts "a_method returned #{some_var} (#{some_var.inspect})" # right

Using the inspect method means you’ll be able to see what kind of object you’re being given. This bit me several times – I’d get an OSX::NSString instance, and when I used the first format above, it would print out its contents, leaving me to believe I had a String (of the Ruby variety). Of course, if I tried to do String type things with it, it would misbehave. Similarly for OSX::NSNumber and Fixnum.

I ended up needing to use to_s and to_i (and occasionally to_a) in order to spit out the right value. Be wary when using to_yaml: you’ll almost definitely have to use one of the to_* methods beforehand.

You can have 3% of your own company. Final Offer.

This evolved into a blog topic from an iChat we had this morning.

It also neatly fits into two posts by Guy Kawasaki ( The Art of Recruiting and a follow-on confusingly titled The Art of Recruiting. Both were written from an employer point of view but today he includes a riposte Nine Questions to Ask a Startup.

The bit that was interesting was the part about equity percentages. Most notable was that no-one who was in the company before the VC-supplied CEO has more than 3% according to this table.

Giving equity is like giving trust. It’s for when someone can’t be bought with money but you know you need them. If you don’t fall into this category then you shouldn’t expect equity. If you’re getting equity rather than the salary you think you deserve then you know one of two things:

  • The company may not have enough money to pay good salaries.
  • You’re a crucial part of the company.

Please note that only one of these need be true and you should really examine whether it’s #2 (no-matter how much you may like to think it is).

Employing someone is always a matter of trust. You’re paying them for their loyalty as well as their work. You’re going to be giving them passwords. Access to your premises. Access to your IT systems. Access to communications systems. Think – you’re a software startup. What are you giving out when you hire a coder and you give him access to your subversion repository? Sure, contracts will help you but unless you have cash to pay lawyers, it’s not going to be particulaly effective and once the code is out there, well, the cat is out of the bag along with your blazing business idea.

So, say you’ve gone through the efforts of staring your own company, you’ve got a VC backing you and you’re on your way to building a million dollar company. 3% of a million is only $30 000. Small change these days. So you want to be a BILLION dollar company which will pay out $30 million when you cash out. Heh heh. Of course, becoming a BILLION dollar company takes YEARS. There’s been a lot of mileage recently in the blogosphere about how “building to flip is building to flop”. That means, building a company hoping that GMY will buy you, is probably going to leave you penniless with some angry VCs. But we all know that, right?

My personal opinion on equity and working for hire?

  • Hire people for good old green if you can
  • Equity is something you give out when you’d trust someone with your passwords and keys
  • Be realistic when giving out equity. Don’t promise 3% of a Billion
  • Despite the fact Bubble 2.0 is building, don’t be tempted by geeks bearing gifts.
  • Once you invite the VCs and superstar programmers in, be happy with 3% of your own company especially if the company is still a million dollars in hock to a VC.

Probable software change

We’re getting a lot of blog spam. I’m not comfortable fiddling with b2evo’s somewhat mind-numbing PHP, so we’ll be switching blog software at some point in the near future. I’ll keep this blog here as a read-only historical blog so that links/trackbacks still work, but no further comments will be addable once I migrate.

Whatever we end up using as blog software will have anti-spam measures in it (and will be easier for me customise).

MacBook Pro arrives. Powerbook goes to deserving soul. So, a Review.

So it arrived.

I’d had some experience with the Core Duo Macs through a 1.83 GHz iMac which arrived in the office about a month ago. It was quick, but hardly portable which meant I didn’t get to snatch a play as often as I might like. I dallied with SheepShaver for a bit, curious about how it would run (it didn’t) and I just kind of ignored it. It was a machine – a very fast machine – but just a machine.

However. Yesterday my MacBook Pro arrived. 2.0 GHz of integer-crunching power.

I was using a 1.67 GHz Powerbook (the model just before the higher res models) and it sometimes felt a little sluggish around the edges. Sure, it could play DOOM 3 and all the latest games, but it still felt slow. I’ve owned a 1 GHz Powerbook, a 1.25 GHz Powerbook before it, so my upgrades have been incremental.

My old Powerbook went to one of the guys in the office, moving him from a 867MHz 12″ Powerbook (USB1, poor graphics), and he’s wiped out with the speed. Says some Final Cut renders are 8 times faster than his old powerbook.

I digress.

The screen is great. My old screen seems fuzzy in comparison and it’s also much much brighter. Wireless reception is easily 50% better. Still not as good as the gold standard (the iBook) but still massively improved. Battery life is much the same and I love the MagSafe. It’s not as loose as others might describe. It’s hard to believe but I haven’t tried this baby with any games. Most of my apps are Universal. The only exception might be VLC but I’m a bit narked that I have to buy a new copy of OmniGraffle as my old version won’t run under Rosetta and Apple didn’t bundle Graffle with the MacBook Pro. I did get Comic Life and OmniOutliner. Two apps which will get pretty much zero usage. Did I mention it’s a LOT slimmer than the previous 15″ Powerbook? Oh, and it has a built in video camera which is not as good as the external iSight camera I used to use. That’ll be the fixed aperture. Front Row works mostly. I can’t get to the movie trailer server. I guess everyone and their cousin is logging into it. Darn. It looked so cool and it used to work on the iMac during the first month. Not so now on either. Bleh. Not really a killer feature.

All is not gold however. I’m tracing some sort of bug where my screen is all messed up on waking from sleep. I don’t think it’s a hardware issue. I think it may be some holdover from my “migration” from the Powerbook. So I’ve nuke some preferences. See how it goes. When it goes futzy, a forced reboot is the only recovery. Frustrating in the extreme. But minor and most likely my own fault.

NSTableView (and HTML tables)

I remember when I first wrote a web page that had a table in it which contained more than just text. It didn’t work on the majority of our university’s web browsers (Mosaic was the most commonly used, although Netscape 2.0 could show the images just fine). Very soon thereafter, tables were being used for all sorts of stuff (and then became overused for layout, but that’s not what this post is about).

The good thing about an HTML table is that I can specify how many rows and columns I want, and what I want in each individual cell created by those rows and columns.

With my recent forays into Cocoa development, I’ve been trying to use NSTableView. NSTableView, on the surface, appears to be much like the original intent behind HTML tables. Make a table with X columns and Y rows and populate it thusly. And much like Mosaic, this will work fine and dandy when you populate with text.

I’ve been trying to add non-text objects in the cells, and having a lot of difficulty. Chief among my difficulties is understanding the paradigm that Apple has for its tables. You specify the number of columns as part of the NSTableView object, then tell the NSTableView what its data source is (another object which has some specific methods in it). That data source tells the NSTableView how many rows there are (which makes sense when you think about it – how will the interface know in advance how many records to display?).

However, what doesn’t seem to work well for me is in saying “Put object Z in column X/row Y” where Z is a non-text cell (the cases I’ve been trying are NSSegmentedCell and NSPopUpButtonCell). I look at example code, and no-one else seems to be programming this way, so I presume I’m going against the paradigm. Everyone else seems to return just pure data from their data source, and their view/controller code somehow knows how to transform that into the correct representation in the NSTable.

Part of this issue might come from the overlap between Interface Builder and my code. In IB, I can specify what type of data cell each column should have (I can do the same in XCode), and I can link my NSPopUpButtonCell to a menu that I’ve created in IB.

But I also think that part of the issue comes from a non-intuitive API for the NSTableView. It could be that I’m just used to HTML tables, and “real” GUI developers will be tutting over their lattés as they read this (if we have any real GUI dev readers). Still, I know I’ve never had this problem in other GUI paradigms either (e.g. Tk or Swing – although I don’t care to switch to either of those ;-)).