July 2007

Monthly Archive

There is this common notion of “intelligence” as a largely inherited talent that can be assessed in one hour interview.
Do you know your Intelligence Quotient (IQ)? I don’t.
In fact, I’m terrified by IQ tests.
You see, those tests may well find out that I’m an idiot, or at least, that I’m not that sharp.
No thanks, in this case I’d rather be a smart coward and influence my destiny in complete ignorance. After all, I can still be “imperfect” and yet make a difference in this world.

Edward de Bono, one of the leading business creativity experts, likes to describe intelligence as the horsepower of a car, our potential. The skill of thinking is then the skill of the driver. A poor driver on a powerful car can still be outperformed by a skilled driver on a humble car.
We may not all have the same IQ, but we can certainly learn to become skilled thinkers.
If I could only remember where I left my car keys ;-)

The irony is that highly intelligent people may fall in what Edward calls the intelligence trap: for example, they may be unwilling to take risks for fear of not being right all the time. Or they may be so good at supporting and “sell” their own point of view that they may never find a need for seeking potentially better alternatives. Ouch!
As the French philosopher Alain (Émile Chartier) once said:

Nothing is more dangerous than an idea when it’s the only one you have.

I recently found some evidence that IQ and creativity are different in the most unlikely of all places: the Big Brother House (BB8 UK).
Uh? Big Brother? Well, I confess. I usually don’t watch these programs, but this year I’m hooked. The best part is shown on Sunday evening, when a group of psychologists display the result of their weekly experiments on the contestants.

A few weeks ago, Big Brother called each housemate in the diary room and presented them with a simple task. Within one minute, they had to identify things you can and can’t do with a paper clip.
Each of the housemates came up with a bunch of ideas; it was certainly interesting to observe how the constraints of the environment and their condition greatly influenced the answers they gave.

But when 20-years old Brian entered the room, something unexpected happened.

Poorly educated, gullible, goofy and - by his own admission - not one of the brightest people around, Brian quickly identified a rather impressive number of ideas and easily outperformed all his housemates.

As the experts indicated, within the given time constraints, he gave proof of excellent:

  • Fluency: the number of meaningful ideas generated
  • Flexibility: the number of different categories of relevant responses
  • Originality: the statistical rarity of the responses
  • Elaboration: the amount of detail in the responses

In conclusion:

  • Don’t envy others for their intelligence, because you can be (at least) as creative and as they are.
  • Explore the world with a fresh perspective and you’ll soon see things others can’t see.

Along the way, you’ll pick up some serious thinking tools to help boosting your potential.
Like a blacksmith, I’m hand forging those tools for you.
The first one is almost ready, and I’ll hand it to you in my next post!

Add this post to: del.icio.us:IQ and Creativity in the Big Brother House digg:IQ and Creativity in the Big Brother House spurl:IQ and Creativity in the Big Brother House simpy:IQ and Creativity in the Big Brother House newsvine:IQ and Creativity in the Big Brother House blinklist:IQ and Creativity in the Big Brother House furl:IQ and Creativity in the Big Brother House reddit:IQ and Creativity in the Big Brother House Y!:IQ and Creativity in the Big Brother House google:IQ and Creativity in the Big Brother House technorati:IQ and Creativity in the Big Brother House stumbleupon:IQ and Creativity in the Big Brother House windowslive:IQ and Creativity in the Big Brother House
Currying is the process of transforming a function that takes multiple arguments into a function that takes one argument, where the remaining arguments have been specified by the curry. You can find a great explanation of it at Wes Dyer’s blog, but essentially in C# terms, when you have an anonymous delegate that takes n parameters, you can pass it to a currying method, lets call it Curry, specifying values for all the parameters bar the first one, and get back another anonymous delegate. This returned delegate will maintain the values passed to the Curry method by building a closure around them, so that when the method is eventually called, you only need to pass the single remaining parameter to it. Wes Dyer’s explanation makes extensive use of a C# 3.0 feature called Lambda expressions. C# 3.0 features are generally just syntactic sugar around structures that are easily constructed in C# 2.0, if a little more verbosely, which is good news for anyone that can’t make the change for a while. For me, dealing with something new like currying is difficult enough without trying to deal with lambda expressions at the same time, so the examples in this post will use C# 2.0-style anonymous delegates, rather than lambdas, for the bits about currying. You’ll still need a build of Orcas (I suggest this one) to play with the code below, but only because I used some automatic properties and list and object initializer syntax. I should also point out that the example below might not represent the best use for currying. Its fun to play with but at the moment its very much a cool hammer looking for a nail. Having said that, passing a delegate that takes multiple parameters as a predicate to a Lists Find method (which can only take a single parameter) works well as an example. With that said… Lets say we have a list of Person objects. The Person object look like this:
    class Person
    {
        public string Name
        {
            get;
            set;
        }

        public int Age
        {
            get;
            set;
        }

        public override string ToString()
        {
            return string.Format(“Name: {0}, Age: {1}”, Name, Age);
        }
    }
and the list is initialized like this:
    List<Person> people = new List<Person>
    {
        new Person(){Name=“Andrew”, Age=27},
        new Person(){Name=“Tony”, Age=32},
        new Person(){Name=“Gary”, Age=23},
    };
Now, if you wanted to use the Lists Find method to find all the people who were named Tony and aged 32 you could use the following code:

    Console.WriteLine(people.Find(delegate(Person person) { return person.Name == “Tony” && person.Age == 32; }));
Nothing crazy so far. If you now wanted to call the Find method twice within the same method, but with different Name and Age criteria, you could assign the anonymous delegate to a variable, and declare some variables outside the scope of the delegate. By referring to them inside the delegate, the compiler will generate a closure around them, making the values available at runtime. This would look like the following:
    string searchName = string.Empty;
    int searchAge = 0;
    Predicate<Person> findPersonPredicate =
        delegate(Person person)
        {
            return person.Name == searchName && person.Age == searchAge;
        };
    searchName = “Andrew”;
    searchAge = 27;
    Console.WriteLine(people.Find(findPersonPredicate));

    searchName = “Gary”;
    searchAge = 23;
    Console.WriteLine(people.Find(findPersonPredicate));
It would be cool if those temporary search variables weren’t needed, and this is where currying comes in, at least in this example. Lets say you wanted to specify those search values as parameters to a search function. We still need a delegate because we’re still going to use the Find method. The delegate, along with its type, might look like this:
    private delegate bool UncurriedPredicate(Person person, string searchName, int searchAge);
    UncurriedPredicate uncurriedPredicate = delegate(Person person, string searchName, int searchAge)
    {
        return person.Name == searchName && person.Age == searchAge;
    };
Of course, this can’t be passed as a predicate because it doesn’t match the Predicate<T> signature, which only takes a single parameter. We need to transform this into an anonymous delegate that takes only one parameter, a Person object, while specifying the other parameters. If we had a Curry method, we could do this:
    CurriedPredicateBuilder<Person> curriedPredicateBuilder = Curry(uncurriedPredicate);
    Console.WriteLine(people.Find(curriedPredicateBuilder(“Andrew”, 27)));
CurriedPredicateBuilder is a delegate type that looks like this:
    private delegate Predicate<T> CurriedPredicateBuilder<T>(string searchName, int searchAge);
That is, a function that accepts two parameters, a string and an int, and returns a Predicate<T>. This is why its called CurriedPredicateBuilder. Curry is a method that returns another method that we can use to build Predicate<T> delegates. Finally, the Curry method looks like this:
    private static CurriedPredicateBuilder<Person> Curry(UncurriedPredicate uncurriedPredicate)
    {
        return delegate(string searchName, int searchAge)
            {
                return delegate(Person person)
                    {
                        return uncurriedPredicate(person, searchName, searchAge);
                    };
            };
    }
I’ve hard coded the return type to be CurriedPredicateBuilder<Person> just for the moment, to make it easier to see what’s going on. This can all be made generic, which I’ll do later on. So what is going on? When Curry is called, the return value is a CurriedPredicateBuilder<Person> delegate that accepts two parameters, and returns another delegate. So its really a function that builds other functions, hence the name. This inner delegate matches the Predicate<T> signature, so it can be passed to the Find method. Internally it calls the original uncurriedPredicate that was passed to Curry, the arguments for which come from the closure that the compiler will have built around the outer delegate’s arguments. Confused? Good! You should be. The ultimate goal of all this is something called partial function application, where you can define and pass around functions that have n-1 of their parameters already specified. The two step process of currying a method and then calling the returned function to specify its first n-1 parameters can be combined into a single step using another method called Partial:
    private static Predicate<Person> Partial(UncurriedPredicate uncurriedPredicate, string searchName, int searchAge)
    {
        return delegate(Person person)
            {
                return uncurriedPredicate(person, searchName, searchAge);
            };
    }
And with a small bit of work, this can be modified to accept and return generic types.
    private static Func<A, D> Partial<A, B, C, D>(Func<A, B, C, D> f, B arg1, C arg2)
    {
        return delegate(A arg0)
            {
                return f(arg0, arg1, arg2);
            };
    }
We can now redefine our original uncurriedPredicate anonymous delegate to be of type Func<Person, string, int, bool>, and pass it to the Partial method, with the search parameters:
    Func<Person, string, int, bool> uncurriedPredicate = delegate(Person person, string searchName, int searchAge)
    {
        return person.Name == searchName && person.Age == searchAge;
    };
    Console.WriteLine(people.Find(new Predicate<Person>(Partial(uncurriedPredicate, “Andrew”, 27))));
Again, for anyone unfamiliar with C# 3.0, Func is a delegate type provided by the .NET framework to make it easier to work with lambda expressions. Func<A, B, C>, for example, represents a delegate that accepts two arguments, of type A and B respectively, and returns an object of type C. Now, before I get any comments (it could happen…) about living in the past, I realize list searches are much easier to do in C# 3.0 with query expressions. All of the above can be done something like this:
    var person = (from p in people
                  where p.Name == “Andrew” && p.Age == 27
                  select p).First();
but that doesn’t make the other way any less fun to play with:)
Add this post to: del.icio.us:Spicy anonymous delegates digg:Spicy anonymous delegates spurl:Spicy anonymous delegates simpy:Spicy anonymous delegates newsvine:Spicy anonymous delegates blinklist:Spicy anonymous delegates furl:Spicy anonymous delegates reddit:Spicy anonymous delegates Y!:Spicy anonymous delegates google:Spicy anonymous delegates technorati:Spicy anonymous delegates stumbleupon:Spicy anonymous delegates windowslive:Spicy anonymous delegates

The team at InnerWorkings is constantly trading interesting blogs, editorials, research, and other goodies that reflect our collective interests. More often than not, these recommendations are directly relevant to our world of software development, .NET releases, or new learning methods. Occasionally, we’ll share stuff that is innovative or just plain interesting in its own right.

Today, Claudio directed us all towards a little gem of a site called Education Revolution that was all of the above - relevant, newsworthy, interesting, and right down our alley. In particular, I’d point you towards the Manifesto, which I really enjoyed reading (several times). Item 22 in the manifesto strikes a chord with me:

Learning is more important than Education
Wait, didn’t we say at the top that education is everything? Yeah…sort of. Education is what happens to you, but learning is what you actually do. Learning is an active process that implies engagement. Ultimately learning, not education, is what’s useful. We’re here to revolutionize education and the best way we know to revolutionize it is to kill it off entirely. Replace it with a world in which people learn. All the time. In new and creative ways. And have a blast doing so.

EXACTLY! That’s what we’ve been preaching at InnerWorkings for several years. You don’t become a truly skilled developer by sitting at the back of a classroom passively absorbing programming concepts and theoretical knowledge like some sort of brain sponge. You must get “engaged”, apply your knowledge, and learn by doing. That’s why our product (shameless plug for the free trial) hustles developers into Visual Studio, sets real coding challenges, and asks them to learn by writing code and getting insight through direct feedback. The InnerWorkings code checking engine makes all that happen, but the underlying principle (on which we founded the company) is very clear: we want to transform how software developers learn; we want them to learn by doing.

Images, they imagine that by piling on the images they’ll entice me in the end

Of course there’s a place for contemplative study and reflection, but I think people spend way too long in this zone and often neglect the practical application of real skills. Not to beat the drum too loudly here, but I don’t believe that you become a great author just by reading the works of Samuel Beckett & James Joyce (spot the Irish bias). Certainly it’s necessary to read the greats and seek inspiration there, but in my experience the only way to become a better writer is to ‘pick up a pen’ and write. Experiment, join a creative writing group, submit work for review, blog plenty - whatever gets you writing will improve your skills.

To my mind, the same is true for writing code and building software; to be a skilled practitioner, you have to practice and hone your craft over the years. To quote an informed source at Education Revolution, “learning is what you actually do”. I couldn’t agree more.

Add this post to: del.icio.us:Random quote of the week:  digg:Random quote of the week:  spurl:Random quote of the week:  simpy:Random quote of the week:  newsvine:Random quote of the week:  blinklist:Random quote of the week:  furl:Random quote of the week:  reddit:Random quote of the week:  Y!:Random quote of the week:  google:Random quote of the week:  technorati:Random quote of the week:  stumbleupon:Random quote of the week:  windowslive:Random quote of the week:

Have you ever believed that you could never learn to be creative because inventive people are born with some special ability that ordinary people like you don’t posses?

A few years ago, I suggested to each member of my team to choose a nick name, an inspiring name that would break away from what has been chosen for them by their parents.
I didn’t have a particular reason; it was just for fun.

Alexander A co-worker (who later changed his mind and chose to be called Lone Ranger) initially opposed to the idea and argued that “you can’t wake up one day and decide to call yourself, say, Alexander the Great”.
Why not? – I replied.
I thanked him for the really great suggestion, as he had just found my new name!

Alexander was such a formidable icon.
He was an invincible fury who conquered most of the world known to the ancient Greeks.

But there is a different reason why I still use that name to this day.
It is a powerful reminder that you should never be afraid to question the rules and revisit your assumptions, particularly when others say “it can’t be done”.

Add this post to: del.icio.us:My name is Alexander digg:My name is Alexander spurl:My name is Alexander simpy:My name is Alexander newsvine:My name is Alexander blinklist:My name is Alexander furl:My name is Alexander reddit:My name is Alexander Y!:My name is Alexander google:My name is Alexander technorati:My name is Alexander stumbleupon:My name is Alexander windowslive:My name is Alexander

On the Scenario tab of any InnerWorkings challenge you will see a PostIt icon with the words “Estimated Coding Time 30 Minutes”. You’d be surprised how

ect.jpg

much discussion this little indicator provokes. The intention behind it is simple - we want to let you know how much coding time you can expect to spend completing the task. And it is a pretty good measure - as I write this, the average coding time per task when calculated for all tasks in our catalog across our entire customer base is 29.7 minutes. (Thanks to Seamus Brady, our Head of Platform Infrastructure, for this data!)

The discussion arises because of a subtlety in its phrasing. It says “coding” time and that is what it means. It doesn’t try to take into account any other time you might spend on the task. We don’t try to prejudge the amount of time you might spend researching, reading or just thinking about the problem and its solution. This will vary from developer to developer, depending on your knowledge and on your experience level with the material you are working on.

One of the unintended consequences of this is that users sometimes feel under pressure to complete. It is common for us to get feedback indicating that it took much longer to complete the task than the 30 minutes indicated. There are a couple of things I would say about that:

1) That’s fine. This is a learning environment. Take as long as you need to learn. It is not intended to put you under pressure - merely to give you an indication of the amount of coding work involved.

2) Go back a couple of days after you have completed the task and do it again. See how long it takes you. Repeating the task solidifies the learning. This is a practice environment. The goal is to help you master application of the technique you are learning.

However, the feedback provokes a lot of discussion here in InnerWorkings. Opinions vary from changing the message to eliminating it altogether to variations in between. I would be very interested in hearing your thoughts on this.

Add this post to: del.icio.us:Estimated Coding Time digg:Estimated Coding Time spurl:Estimated Coding Time simpy:Estimated Coding Time newsvine:Estimated Coding Time blinklist:Estimated Coding Time furl:Estimated Coding Time reddit:Estimated Coding Time Y!:Estimated Coding Time google:Estimated Coding Time technorati:Estimated Coding Time stumbleupon:Estimated Coding Time windowslive:Estimated Coding Time

Every week I get a compiled list of all the product feedback we have received during the week from users. A lot of it is complimentary which is great and I love to see it. Some if it is not. Some of the stuff that is not complimentary is fair. And some if it - well, if not exactly unfair - is the result of misconceptions about our InnerWorkings Developer product. Two misconceptions came to mind as I read through this week’s feedback:

1. We don’t teach syntax. We assume that you are a working developer, a practitioner. We don’t try to recreate the many resources and methods (classes, books, e-learning courses) that are available for beginners. There are so many great things out there at that level and, anyway, it isn’t really the issue we are interested in. We are VERY interested in the next stage and in the stages after that.

2. It’s not really about ‘passing’ the code judging engine. Of course, at one level it is, but that is not the really significant part. The point is to help you develop your capabilities (and career) by having you solve problems in Visual Studio as you do, day-to-day, on projects. The significant part is the work you do while working on those problems. The outcome is the validation (to yourself or to others) that you can apply the techniques appropriately and efficiently. Building higher levels of performance and problem-solving.

Irrespective of the feedback, we really like to get it. We give it a lot of attention so please keep it coming!

Add this post to: del.icio.us:Product Feedback digg:Product Feedback spurl:Product Feedback simpy:Product Feedback newsvine:Product Feedback blinklist:Product Feedback furl:Product Feedback reddit:Product Feedback Y!:Product Feedback google:Product Feedback technorati:Product Feedback stumbleupon:Product Feedback windowslive:Product Feedback

Interesting article on Andy Bechtolsheim in today’s New York Times. Worth a look.

Add this post to: del.icio.us:Andy Bechtolsheim article digg:Andy Bechtolsheim article spurl:Andy Bechtolsheim article simpy:Andy Bechtolsheim article newsvine:Andy Bechtolsheim article blinklist:Andy Bechtolsheim article furl:Andy Bechtolsheim article reddit:Andy Bechtolsheim article Y!:Andy Bechtolsheim article google:Andy Bechtolsheim article technorati:Andy Bechtolsheim article stumbleupon:Andy Bechtolsheim article windowslive:Andy Bechtolsheim article

What would you say if I told you that creativity is a skill and not a gift? Like any other skills, it can be learned and developed.

Viviane Ciampi Many will be surprised to know that my mum is an accomplished and multi-talented artist. She is a French-Italian poet, interpreter, writer, editor. In the past, she has been a painter, a radio DJ, a dancer, an aerobic instructor, and many other things I can’t even remember.

Even if we discount the tiny possibility that my attitude towards creativity may have been genetically determined, my character has been powerfully influenced since early childhood. In my family, we have always valued originality and worked extremely hard to develop our talents.

Although it might sound widely pretentious to state it here, I know I can be (and I have been) extremely creative. Unlike my mum, however, I’m not an artist. I’m a software developer, after all; I’m more technically inclined and definitely a bit rusty on poetry :-)

I hopefully inherited her capability of creating ideas that can bring success in any field and personal life.

The problem with such attitude, however, is that you can only accept it for what it is – it’s not easy to develop a gift, is it?

The truth is that creativity can be learned and developed indeed, and it has nothing to do with intelligence. Perhaps you knew this already, but I was surprised to make this discovery very recently and by pure coincidence.

Luckily, my motorbike broke. On my new bus commute to work, I started speed reading creativity books voraciously. I learned theories and ideas form Edward de Bono, Michael Michalko, Roger von Oech and many others.

I shared some of these findings with my team in our latest muffin morning, and will share them with you here, in my next few posts. I will present some behaviors, mental models and tools that I found useful to organize thoughts and generate tons of ideas.

My dream is to evolve as a better thinker, to be original, maybe even revolutionary. And I would love to share and help others to evolve too: my family, friends, coworkers, and, yes, perhaps even you. I know, it’s just a dream, so please don’t judge me. We are all allowed dreaming after all, although most of us have long forgotten how to.

Add this post to: del.icio.us:Skillful Creativity digg:Skillful Creativity spurl:Skillful Creativity simpy:Skillful Creativity newsvine:Skillful Creativity blinklist:Skillful Creativity furl:Skillful Creativity reddit:Skillful Creativity Y!:Skillful Creativity google:Skillful Creativity technorati:Skillful Creativity stumbleupon:Skillful Creativity windowslive:Skillful Creativity

I’ve just returned from Microsoft’s Worldwide Partner Conference in the massive Colorado Convention Center in Denver, which will be home to the 2008 Democratic National Convention. Similar levels of spin and PR were at play during the Microsoft event, but I came away from the show with two main points about Microsoft’s future strategy.

Software as a Service (SaaS) is now part of Microsoft’s mainstream platform strategy, although they’re coining the awkward phrase Software+Services in its place. Steve Ballmer’s keynote presented 4 platform pillars for Microsoft:

  • client
  • services
  • mobile
  • server

Certainly, Microsoft is not one for turning from the rich client that has paid out so handsomely in the company’s core desktop applications over the years, but they are betting on software services that exploit the natural advantages of the web. In short, the message to partners was to embrace .NET enabled services to meet customer demand. Take Outlook Web Access, for example: it doesn’t kill the Outlook rich client, but it’s very handy to access your mail over the web in a simple AJAX interface. Now apply that strategy to Office Live or Dynamics Live, and you get the picture of where Ray Ozzie is pushing Microsoft. Speaking of Mr. Ozzie, I was hoping he would present at the show, but I suppose he doesn’t waste time on the braying mass of partners with the mundane CALs, SKUs, and VARs on their minds! Despite the heavy focus on services, Steve Ballmer’s keynote made it clear that Microsoft would not abandon the rich client with its natural strengths, and the point was echoed through every subsequent keynote. You have to admire the dedication to “staying on message” at these big Microsoft events, something that Democrats would no doubt like to inherit when they take over this gargantuan building for their annual knees-up.

If anyone left this conference wondering about Microsoft’s desire to push Office as a business application platform, I’d say they must have never left the Vista “chill-out” bar (tempting, I know). The platform spin for Office was as plain as the giant 40 foot tall, 10,000 pound fiberglass blue bear staring in the window of the conference center.

Is that Big Blue Outside?

At any rate, several keynotes emphasized that OBAs were the way forward (dear God, another acronym – this time it’s for “Office Business Applications” and sounds like “oboe”, you see). Forget about VBA and macros, now partners were encouraged to build applications that draw from the rich Office experience. The old demo horse here is a VoIP conference call and application share that exploits the “presence” feature across Office applications. I do get the sense that there’s far more to the OBA idea than could be articulated at this conference, but the presentation of Office as a true platform for application development was unmistakable. Even Sanjay Parthasarathy, who usually bangs on about the .NET framework, new APIs, and VS Add-Ins, devoted a huge amount of his Developer Tools presentation to building rich applications from Office.

As with every conference I’ve ever attended, the hunt for a decent cup of coffee was as challenging as ever. Savvy conference goers tracked back to the little cappuccino huts dotted in odd secluded locations around the center – I found one early on and became a loyal customer; on a side note, can you really be a customer if the product is free? The level of staffing was a bit overwhelming – one to take your order, one to grind the beans, one to boil the milk – ordering coffee was a nice way to meet so many people. Anything to avoid the tepid brown stuff in those dreaded coffee tanks, which were absolutely a last resort for most attendees.

On a final note, I did manage to escape the Partner Awards ceremony (note to the event organizers: I’d skip the Oscar format and just run product showcases from the winners) this year to grab a meal with a friend of mine who’s based in Boulder, working for a very bright young company called Me.dium. The company just closed a whopping B round very recently and continues to innovate with a really clever browser add-in that makes surfing the web a more social and contextual experience. Check it out on Firefox, and it’s coming to an IE7 browser near you very soon. Dinner is my shout next time, Tobias…

Add this post to: del.icio.us:Microsoft gets cosy with 12,000 partners in Denver digg:Microsoft gets cosy with 12,000 partners in Denver spurl:Microsoft gets cosy with 12,000 partners in Denver simpy:Microsoft gets cosy with 12,000 partners in Denver newsvine:Microsoft gets cosy with 12,000 partners in Denver blinklist:Microsoft gets cosy with 12,000 partners in Denver furl:Microsoft gets cosy with 12,000 partners in Denver reddit:Microsoft gets cosy with 12,000 partners in Denver Y!:Microsoft gets cosy with 12,000 partners in Denver google:Microsoft gets cosy with 12,000 partners in Denver technorati:Microsoft gets cosy with 12,000 partners in Denver stumbleupon:Microsoft gets cosy with 12,000 partners in Denver windowslive:Microsoft gets cosy with 12,000 partners in Denver

Have you noticed anything different about www.innerworkings.com? Please say yes, as we’ve spent several months working on a completely fresh presentation of the company website. Last weekend, after a few Wimbledon-inspired rain delays, we launched the company’s new website. In a word, this project was “AGILE” from the outset and geared towards continual refinement until the day of reckoning arrived. Actually, the tinkering will continue for some time yet, but let me explain how we approached this website project with a real agenda for change (as Gordon Brown might say).

Agile development was definitely a first for me - we embarked on a set of website features that evolved according to changing needs, iteration details that were teased out over time, and a continual focus on incremental improvements. There was much to accomplish in terms of how we approached our intended audience of software developers; we were committed to removing clutter, purging irrelevant content, and simplifying basic workflow throughout the site. Even Jakob Nielsen’s book on Prioritizing Web Usability was called upon to help us agree sensible (but not too utilitarian) usability standards for the site.

Like recovering web usability addicts, we met twice a week (religiously) and hammered out the key issues for each iteration. If we forgot something important, we just added it to the next available iteration (and dropped a lesser feature back in the delivery schedule). Disagreements flourished until the best argument won out and our plans became more decisive. We reminded ourselves repeatedly to avoid the trap of “bloated software” by focusing on the core functionality first and foremost – that guiding principle steered us back on course more than once. Some of the websites that we unashamedly drew inspiration from during this project included the following:

The result (I hope) is a much simplified website that’s built around the core principles of getting developers into our product more quickly and offering straightforward browse, try & buy options. We’ve removed a lot of the extraneous “corporate” information that developers resolutely ignore anyway, and concentrated on getting the message across in plain but opinionated terms. You can be the judge of whether we’ve succeeded in that goal - for my part, I’m convinced that striving for effortless simplicity is a lot of work and you may not succeed the first time around. But it’s certainly a lot of fun trying…

Add this post to: del.icio.us:InnerWorkings unveils a new company website!  digg:InnerWorkings unveils a new company website!  spurl:InnerWorkings unveils a new company website!  simpy:InnerWorkings unveils a new company website!  newsvine:InnerWorkings unveils a new company website!  blinklist:InnerWorkings unveils a new company website!  furl:InnerWorkings unveils a new company website!  reddit:InnerWorkings unveils a new company website!  Y!:InnerWorkings unveils a new company website!  google:InnerWorkings unveils a new company website!  technorati:InnerWorkings unveils a new company website!  stumbleupon:InnerWorkings unveils a new company website!  windowslive:InnerWorkings unveils a new company website!

Categories

Archives