Archive for January, 2009

Evidence that opt out ads aren’t harmful

by Hang

A few months ago, I wrote about a better way of serving ads by replacing the ad with a donate button. A recent Wall Street Journal article reports that wikiHow also recently started doing opt out ads and their revenue dropped less than 1%. I wonder if they’ll also include a donate button?

January 29 2009

Please hold…

by Hang

I’ve had a lot of time to think about the usability of phone systems after been on hold for 45 minutes now (and that’s not hyperbole, I can see it right there on my skype window). Frankly, I’ve always been stunned by how abysmally awful most phone systems are designed. Let me list the ways…

  • You call me when you’re done with holding. Rather than have people sit around listening to call music, why not allow them to punch in my phone number and have you call me when you’re ready to talk to me?
  • Remember who I am. You call a number and it doesn’t know you from Adam. Caller ID exists, use it in an intelligent manner. If I called just 20 minutes ago and I told you my issue was with a notebook, not a cellphone. Shouldn’t you be able to use that to infer that my issue is STILL with a notebook? You told me 20 minutes ago to please listen carefully, some options have changed, I don’t need to hear it again.
  • Never ask me the same thing twice. If I told my address to the last person, don’t make me tell it again to the next person. If I told it to you last month, just ask to confirm it’s still the same, don’t make me repeat it. If I told it to the automated system, don’t again ask me to tell it to the human being.
  • Remove the cruft from the system. Pare down your voice prompts to the barest minimum possible. Don’t add a word that’s unnecessary. As a HCI person, it was hammered into us that users don’t read anything so be sparse with your dialogs. Well, users hate hearing stuff even more.
  • Give me feedback. Tell me what position I am in the queue and how long my expected wait time will be. Don’t leave me in the dark.
  • Provide me a text version of your phone tree. Don’t make me wait for all your options to be said out loud, put up your phone tree on a website in text format so I can skip through all the junk and get to where I want to go.

The general level of usability in phone systems is depressingly low and doesn’t seem to have gotten significantly better over the years which is a pity because they could be much less aggravating than they currently are.

January 27 2009

Make it right

by Hang

At some point in your professional career, you will make a mistake and you will do something that ends up causing serious inconvenience or harm to the people you are working for. In these circumstances, I see people default into one of two different attitude, make it right or make it go away.

Making it go away entails doing the least possible to get the person in front of you to stop complaining. Shift the blame, absolve responsibility, offer enough to restore the situation to the status quo.

Making it right entails doing enough that the person in front of you goes away satisfied and this is much more rarely seen.

The first step of making it right is owning up and it goes something like this:

You’re right, I’m sorry, I should have…

Each of these 3 components is essential. The “I should have” is important because it communicates to the other person that you understand the scope of the problem and what needs to be done to fix it. It allows both parties to come to an agreement over the extent of the grievance.

But too many people think that just owning up is enough to make it right. It’s not, owning up is cheap and just owning up by itself is merely an advanced form of making it go away. The next step is to remove the hurt.

You did something wrong, it’s not the end of the world but you did hurt someone. Merely restoring things back to the status quo does not remove the hurt. Instead, you need to transfer the hurt onto your shoulders and show that the consequences for your mistake hurt you more than it hurt them.

If your site had half an hour of downtime, don’t just give people half an hour of credit, give them 2 days of credit. If you make a mistake on your billing, don’t just refund the discrepancy, write off the entire section you billed them for. If you accidentally wipe all of their personal data from your servers, well, you’re pretty screwed, I have no idea what you should do.

The only way to remove the hurt is to show people that you’re equally as motivated as them for the hurt never to happen again. This is the only way you can restore trust in someone that you won’t be making the same mistake again.

This is great, you might be thinking. Making it right sounds like some noble, code of honor type shit which only an idiot would not want to follow. But making it right is also fucking hard as well. It requires an extraordinary level of effort to keep yourself at the standards that are imposed by making it right. I personally think that making it right is important enough to strive towards those standards but understand that it’s not something that can be undertaken lightly.

January 24 2009

My tips for face to face networking

by Hang

A friend of mine recently asked me to put down some of my thoughts on how to more effectively network. Being a natural introvert, networking is not something that’s come easily to me. But after putting some conscious effort into improving my skills, I’m at the point where people are usually quite surprised to discover that I’m an introvert by nature. I’m not an expert on networking by any stretch of the imagination but here’s some tips I’ve gathered over the years:

  • Networking is a technique, not an activity. For too many people, networking feels foreign and forced because they think of networking as a specific activity. The imagine a big group of people who come together to “do networking” and rightfully run away from this image in horror. Networking should never be an activity, it should always be a means to an end rather than an end of itself. You’re always networking in order to achieve something whether it’s to learn background knowledge about an industry, form a contact who you can collaborate with later or trying to recruit someone for a job. Networking is a way to achieve your goals which naturally leads to…
  • Know what you want out of networking. There’s a lot of different things you can get out of networking and there’s a different way of doing it for each goal. At different points in you’re life you will be looking out for different things and you need to adapt your approach to suit. I always keep a rough mental checklist at the back of my head for the types of stuff that I need. For example, a few months ago, I was really interested in swapping concepts and ideas in order to spark a burst of inspiration whereas now, I’m more interested in learning about how I can accelerate my development or opportunities to work with someone. Having that list allows you to direct the conversation to a more productive path.
  • Know your spiel. Your spiel is your way of communicating to other people about who you are. “These are the project I’m working on, this is what I think my job title is, these are some cool things I’ve done in the past, this is what I consider myself an expert on”. After some experience with this, you should be aiming to get the patter down so you can rattle it all off in a smooth fashion. Your spiel is important because it allows other people to know who you are. I’ve been at one time or another been known as “the social networking guy”, “the security guy”, “the identity guy”, “the startup guy” etc. Having an easily attached identity is important because it allows the other person to answer the most important question in their mind:
  • “What can this guy do for me?”. Boiled down, networking is two people coming together so they can both answer this question. Paradoxically, what I believe in is that the best way to answer this question is to flip it around and instead ask “What can I do for you?”*. All the best networkers I’ve ever met were marked by their incredible generosity and the feeling that they genuinely cared about you more than them and that’s what made them great networkings. As a result, I’ve adopted a position where the first question I try to answer when I meet someone is “What is their problem and how can I help them fix it?”. That being said, you only have a certain amount of energy and time and so choose the people you choose to help wisely.
  • Be genuine. People get the impression that networking is this smarmy, insincere post that you need to put on to get ahead. That may be how networking is portrayed in the movies but it couldn’t be further from the truth. Networking is only useful if it’s a genuine effort. You don’t have to enjoy it but you at least have to be sincere about it.
  • The road to the top will be long and hard. A lot of people start out thinking that with the right combination of tricks and diligence, they’ll soon be reaching the inner sanctums in which they will be networking with the true power brokers. Simple mathematics quickly dispels this notion, not everyone can be in the inner sanctum or it wouldn’t be inner anymore. The brutal truth is that you’re only useful to people to the extent that you can provide them value. Networking can help you parley your skills into opportunities but they won’t help a whit unless you do the hard work of developing those skills in the first place.
  • Honor your commitments. If you say you’ll look up something for them, do it. If you say you think you can introduce them to someone, do it. If you tell them you’ll email them, do it. If you don’t think something might be possible, don’t say it is. In any circle small enough to be worth networking into, your reputation will follow you wherever you go so make sure it’s sterling.
  • Always be on. For the serious schmoozers, networking isn’t just a tool, it’s a way of life and it’s integrated into everything they do. If they’re reading the newspaper, they’re thinking about how the news might help one of their friends. If they meet someone at a bar, they’re running their networking stack in the back of their brain. If they’re brushing their teeth… well, they’re probably just brushing their teeth, nobody is that extreme. But there’s a transition point you make from networking being a thing you do to a thing you are and jumping over that gap turns you into a different person. I’m hesitant to say that this is a necessary of even desirable transition but it’s an important one for anyone who’s gone through it.

I don’t put much credence when people say they’re not suited to networking or that it’s not important for them. I think especially for a lot of geeks, there is an almost defensive fear about conscientiously developing the social skills necessary for effective networking as if that diminished their technical credentials in some way. Networking is not some arcane activity or bizarre social ritual, it’s a natural part of human interaction which, like many others, can be greatly improved with some assiduous practice.

* There is a Chinese parable that Hell is to be seated at a giant banquet table filled with all manner of delicious food and yet be unable to taste any of it because each person at the table is equipped only with 6ft long chopsticks. Heaven is the exact same table and the exact same feast, yet everyone is enjoying themselves because they are feeding each other.

January 22 2009
January 22 2009

Big Science and little science

by Hang

This is an idea I’ve been chewing on for a while on how there seems to be two different modes of science which have a very hard time talking to each other because of their radically different approaches to problems. I’m going to call these two approaches big science and little science.

Big science is about wading into the thick of a big problem and working from a state of utter incomprehension, being satisifed with chewing off whatever nugget of comprehension they can take a hold of. They take hold of questions like “what is love” and grapple with it in it’s full complexity. Big science is like parachuting into the middle of the jungle, setting up base camp and gradually establishing contact with all the other little camps around you.

Little science is all about carving off a well definied, definite area of study and solving it. It asks questions like “How does Paxil bind with the serotonin receptors in the brain”. Little science is all about building the foundation, a solid ground of work on which other work can be based. The little science approach to colonisation is to bring in the bulldozers and clear and settle all the land directly adjacent to the settled land.

Big science and little science represent two fundamentally different ways of trying to understand the world and the approach of one can look bafflingly unscientific to the other. I can feel that frustration when I talk about my work to someone who does little science. My research thesis basically boils down to “How does design influence group behaviour in social software” but everything I talk about comes with the implicit caveat that it’s messy and there’s a lot more things going on than what I’m modelling. I’m not seeking to completely understand human behaviour, even if my work increased predictive power by 1%, I would view that as a major triumph.

Our tools and understanding about social psychology and design are primitive. That’s no excuse for not trying though.

January 22 2009

It’s not illegal unless you get caught

by Hang

There’s a popular misconception about the legal system which a lot of technical people fall under which regards the legal system as a set of laws and the role of lawyers and judges is to enforce those laws. Such a mental model is understandable as it maps well to what we’re used to in the world of computers. The laws are the source code, the legal system is the machine and the citizen is the user. Unfortunately, it’s not correct.

Unfortunately, a too strict interpretation of this model can lead to unfortunate misunderstandings of the law. In a practical sense, laws aren’t laws until they’re applied. That not all laws are applied consistently and universally is a feature of the system, not a bug.

Al Capone was prosecuted for tax evasion. Do you really think the tax evasion law was put into place to catch tax evaders? No, it was deliberately put in place as an overly broad law that is only ever enforced when no other charges can be brought.

How laws are enforced add’s a more nuanced and flexible layer to the legal system which allows it to adapt to the complexities of human society. The issue of enforcement is often ignored (usually to the arguer’s advantage) in legal discussions and it leads to a distorted and absurdist view of the legal system.

PS: I’ve just noticed that my last blog post was the 100th post on this blog. Go me!

January 19 2009

Inadvertant fixation

by Hang

When presenting an idea, especially to a wide audience which isn’t going to pay much attention, it’s certain doom if you make it sound to close to a similar but subtly different idea. The process most people go through when evaluating a new proposal is to first decide whether it’s novel and then decide whether it’s true. If you trigger their duplicate detector, then they’ll automatically pre-load their canned responses and switch off the thinking portion of their brain.

Sometimes, in order to avoid this trap, you have to deliberately alienate the reader. Rather than taking the most direct route to an idea, cast it in unfamiliar terms so that some struggle is needed to grasp it. If it’s completely unavoidable, confront the issue head on by saying that my idea X is not Y. However, this can often backfire by making the digression take over the thrust of the article.

For readers, try reversing the order of your filters. First decide whether something is true, then decide whether it’s novel. You might be able to catch some insight which other people have missed.

January 19 2009

Why social DRM is not corporate DRM

by Hang

Anil Dash asks a question in his blog post:

how are privacy settings on social networks different than DRM restrictions placed on media content files from companies? Is it because I’m not a corporation? Is it because the DRM technology is provided by Flickr or Facebook instead of by Apple’s iTunes or Microsoft’s WIndows Media? Is it because I only (theoretically) grant permissions to dozens or hundreds of people, instead of millions?

This intersects nicely with the work I’ve been doing on pinpointing why social design needs to be it’s own seperate specialty with it’s own rules and literature. Let me take a quick stab at answering his question:

  • We think differently about different social relationships. We literally use different parts of our brains to do different types of social reasoning. For individuals, we invoke a much deeper Theory of Mind construct that affects our behaviour. With DRM, we engage in the cost/benifit portion of our brain and basically treat the opposing party as if it were an impersonal force. With social relationships, we not only think about how our actions affect us, but also how they affect them. “What would Sally think of me if I did this?”, “What would Sally think I wanted if I did this?” etc.
  • Social mechanisms scale poorly. Different social mechanisms behave radically differently if you make the scale much larger or smaller. Part of why DRM fails at large scales is simply that it only takes one bad apple to “release” a piece of information before it is freed. That social networking data is relatively secure is an artifact of the small scale it operates on. If you take a look at when social networking suddenly goes “large scale”, Ashlee Dupree or Todd Palin for example, you can see that it’s even more ineffective at protecting media than traditional mechanisms.
  • You can punish those who misbehave with social media. Social media works because you can push enforcement into the social layer. If people misbehave, you can actually punish them in real life. As a result, the rules for good behaviour can be negotiated at the social level. With DRM, the social layer is so weak that you can’t do any real form of enforcement which is why media companies have tried using either technological layer (DRM), the formal layer (courts) or the societal layer (appeals to morality). I’m going to write about this in much more detail in an upcoming blog post.
  • Social Media is of limited utility. Let’s face it, the number of people who want to but can’t see your flickr photos is close enough to 0 that noone is going to bother to go to the effort of revealing it.
  • The dark side of DRM is visible, the dark side of social media is invisible. Piracy is something that now happens out in the open so we get a generally accurate picture of how it’s practised and what the extent of it is. Violations of privacy in social media still happens in a shadowy underground so we tend to ignore it out of ignorance. In my fieldwork on just how people use socia media in less than savory ways, it’s actually quite surprising just how prevalent and casual privacy violation can be yet it’s not talked about nearly as much.
In short, I think this really highlights the importance of context in discussions about social design. It’s not merely enough to look at the software and expect that functionality maps onto results in a clean manner. The software is only a small part of a much larger design.
January 15 2009

Evaluating Languages

by Hang

I suppose I should be writing more about the work that I’m actually doing since a) it’s the actual purpose of this blog and b) it’s far easier to write about. Today, I’ve been evaluating languages for this new project I’m working on which all I can talk about at this point is that it involves iPhones and a server. The iPhone portion obviously has to be written in Objective C (on which I’ll have more to talk about later).

Because I’m coding for myself, I have the luxury that my number 1 criteria for the language is that i enjoy coding in it and so I’ve narrowed the list down to a shortlist of contenders based on a number of criteria:

  • Strong and natural support for functional programming without getting in the way of actually getting work done. I’ve dabbled with functional programming on and off for a number of years and I think I’ve gotten my head sufficiently wrapped around the paradigm but I’ve yet to dive in with any serious gusto. This seems like a good project to make a serious push towards significant use of the functional paradigm
  • Abstractions for elegant horizontal scaling. Tying in with the functional aspect, the ability to at least do dumb scaling in the horizontal direction without significant rework would be a major win. I don’t know how successful this application will be and my opinion is still that thinking about scaling is a case of premature optimization but it seems plausible that properly engineered, this app should be naturally built to scale.
  • Rich library support. This is kind of a no brainer and one that’s unfortunately got nothing to do with the actual language itself. I’ve had to eliminate many beautiful, clever languages from the running because of this.
  • Good tool support. I’ve an unavowed IDE slut. Talk all you like about how you can configure emacs to give you blowjobs on demand in only 8000 lines of elisp, I’m just not smart enough to handle that sort of thing. I love my auto complete, i love my step through debugger and I love one button source control integration. You can talk all you like about how the standard library is so small that it can be memorized in a day, I’m 3 weeks into programming Obejective C and I *still* need to Google for the command to turn a NSString to a CString and vice versa.
  • Great documentation and tutorials. I happened to start working on Ruby on Rails during the great 2.0 upgrade and the mishmash of confusing 2 year old blog posts and scant API docs made it a major pain in an otherwise wonderful framework.
  • Interactive console. I’ve found the best way for me to get my head fully around a concept is to play with it a bit in an interactive console with some toy examples.

Based on these criteria, here’s my shortlist in order from most to least likely:

Python

Python is a language I’ve never touched although it’s always been one I’ve felt like I should know. From what I’ve seen of random code samples I’ve come across, it’s as nice as everyone keeps telling me it is and I doubt the learning curve will be that steep after having learnt Ruby. From what I’ve seen, Python supports functional programming just a wee bit better than Ruby does and the way it chooses to express it fits my style better. Like Ruby, it’s roots are in the hippie open source/linux world which means I have to deal with all the tireless ideological crap that comes along with it. Not a big deal but one to consider.

Ruby

One major advantage with Ruby is that I already know it so I can hit the ground running. Half of my current prototyping is done in Ruby already and the language attracts a lot of smart people which makes keeping up with it actually intellectually stimulating rather than overwhelming. It also seems to have the nicest testing facilities of all the languages and the most scarily powerful metaprogramming.

C#/F#

The other language I’ve been doing prototyping in, I have a lot of love for C# and it’s a beautifully designed language although from a completely different design philosophy for the Perl/Python/Ruby crowd. One major advantage of working with C# is that I get to work inside Visual Studio, my absolute most favourite IDE in the world. Static typing also gives me autocomplete that doesn’t suck and the corporate backing that C# has means it has absolutely staggeringly fabulous documentation. Since .NET 3.0, C# has apparently gotten some pretty nice functional support although I’m not sure how elegantly it integrates with the rest of the language. I’m curious to check out F# and leveraging the strengths of each language. I’ve downloaded the F# runtime a few times but have never worked up the incentive to learn the thing. It’s an interesting possibility.

JRuby/Groovy/Scala/Java

I keep on hearing Groovy and Scala are the next big thing for all the cool kids but I don’t even know what they are yet let alone what they’re good for. Still, it would be an interesting chance to learn. I dislike the wordiness of Java but the ability to use any JVM library is an intriguing possibility. I’ve also never worked on a project using multiple languages before and I’d like to see what that would be like.

Haskell

I have a special affinity towards Haskell as it’s the first programming language I’ve ever learnt and I became somewhat spoilt as a result of it. Still, I haven’t even scratched the surface of it and I’ve so far failed in my many attempts to grok how monads work. This blog post at Integer Overflow really sold me on the viability of Haskell as a serious albeit choice. Frankly, the ability to code search based on type signature is just so nifty that it’s pushing Haskell way up on the list. I would love working in the language but my only concern is whether it’s sufficiently flexible to adapt to the kind of work I want it to do.

Erlang

We worked with Erlang in a distributed systems class in undergrad and my impression of it then was that it was a beautiful idea marred by poor language design. The weird syntax and lack of first class functions in Erlang was a majorly baffling design decision and made programming ugly and painful. However, it’s an intruging choice based on it being designed from the ground up to scale.

Lisp

I can write some lisp and understand the rudiments of the language but Lisp nerds annoy me. I would love to code something in Lisp in theory but I very much have not yet found something in practice which I would want to code.

Over the next couple of days, I’m going to do a lot more reading and digesting of the various languages, mainly as an excuse to take a kind of “holiday” away from coding and I’ll be updating on the various things I’m learning. Now… onto Real World Haskell.

Copyright ©2009 BumblebeeLabs — Theme designed by Michael Amini