Archive for the ‘management’ Category

Where are you wasting your cognitive surplus?

Wednesday, May 7th, 2008

She heard this story and she shook her head and said, “Where do people find the time?” That was her question. And I just kind of snapped. And I said, “No one who works in TV gets to ask that question. You know where the time comes from. It comes from the cognitive surplus you’ve been masking for 50 years.”

So how big is that surplus? So if you take Wikipedia as a kind of unit, all of Wikipedia, the whole project–every page, every edit, every talk page, every line of code, in every language that Wikipedia exists in–that represents something like the cumulation of 100 million hours of human thought. I worked this out with Martin Wattenberg at IBM; it’s a back-of-the-envelope calculation, but it’s the right order of magnitude, about 100 million hours of thought.

And television watching? Two hundred billion hours, in the U.S. alone, every year. Put another way, now that we have a unit, that’s 2,000 Wikipedia projects a year spent watching television. Or put still another way, in the U.S., we spend 100 million hours every weekend, just watching the ads. This is a pretty big surplus. People asking, “Where do they find the time?” when they’re looking at things like Wikipedia don’t understand how tiny that entire project is, as a carve-out of this asset that’s finally being dragged into what Tim calls an architecture of participation.

Now, the interesting thing about a surplus like that is that society doesn’t know what to do with it at first–hence the gin, hence the sitcoms. Because if people knew what to do with a surplus with reference to the existing social institutions, then it wouldn’t be a surplus, would it? It’s precisely when no one has any idea how to deploy something that people have to start experimenting with it, in order for the surplus to get integrated, and the course of that integration can transform society (…)

So that’s the answer to the question, “Where do they find the time?” Or, rather, that’s the numerical answer. But beneath that question was another thought, this one not a question but an observation. In this same conversation with the TV producer I was talking about World of Warcraft guilds, and as I was talking, I could sort of see what she was thinking: “Losers. Grown men sitting in their basement pretending to be elves.”

At least they’re doing something.

Did you ever see that episode of Gilligan’s Island where they almost get off the island and then Gilligan messes up and then they don’t? I saw that one. I saw that one a lot when I was growing up. And every half-hour that I watched that was a half an hour I wasn’t posting at my blog or editing Wikipedia or contributing to a mailing list. Now I had an ironclad excuse for not doing those things, which is none of those things existed then. I was forced into the channel of media the way it was because it was the only option. Now it’s not, and that’s the big surprise. However lousy it is to sit in your basement and pretend to be an elf, I can tell you from personal experience it’s worse to sit in your basement and try to figure if Ginger or Mary Ann is cuter.

And I’m willing to raise that to a general principle. It’s better to do something than to do nothing. Even lolcats, even cute pictures of kittens made even cuter with the addition of cute captions, hold out an invitation to participation. When you see a lolcat, one of the things it says to the viewer is, “If you have some sans-serif fonts on your computer, you can play this game, too.” And that’s message–I can do that, too–is a big change.(…)

And this is the other thing about the size of the cognitive surplus we’re talking about. It’s so large that even a small change could have huge ramifications. Let’s say that everything stays 99 percent the same, that people watch 99 percent as much television as they used to, but 1 percent of that is carved out for producing and for sharing. The Internet-connected population watches roughly a trillion hours of TV a year. That’s about five times the size of the annual U.S. consumption. One per cent of that is 100 Wikipedia projects per year worth of participation.

I think that’s going to be a big deal. Don’t you?

I was there at web 2.0 but I tend to bail on keynotes. Hat tip to open left.

Code Review #6 - ‘Too smart’ aka scared of being dumb

Tuesday, May 6th, 2008

One of the biggest failing junior developers have is that they are too ’smart’. ‘Too smart’??? How can someone be ‘too smart’? Actually pretty easily.

‘Too smart’ is when the person spent hours looking at a problem. And the next day she/he

  • realizes the specs would require violating the speed-of-light;
  • or has the product manager come up to them and say, “Oh yeah, there was a typo in the spec and it should have said ‘… NOT …’”;
  • or the product manager/tech lead (when asked) says, “that’s not what I meant”;
  • or the product manager/tech lead (when asked) says, “I didn’t consider that case” (or don’t worry about that case now);
  • or is told by a fellow developer, “oh I ran into that problem last week and on the 3rd page of the documentation, a workaround solution to that problem is described.”;
  • or discovers they were working on an old version of the code and upgrading to the latest version of code or libraries, solves the problem;
  • or finally another developer looks at the problem and points out a simple condition that has been reversed;
  • or…

In all cases, the person (doesn’t have to be a developer) violated the 20-minute rule. Quite simply the 20-minute rule says

“If you are stuck for more than 20 minutes, and you are no closer to understanding the source of the problem - then ask for help”

Yes, it could be something ’stupid’ but it could also be something else. Sometimes you will be told to keep on looking because the person in question wants you to learn something. But sometimes there is a fundamental misunderstanding.

So to make sure that you are not asking for help too easily there is the corollary to the 20-minute rule, the 10-minute review rule.

Spend 10 minutes reviewing, how you got to this situation.

  • Describe why the previous code is written the way it was. Notice this is not a ‘what’ question. So do not answer ‘what the previous code was doing?’ Answer why did the previous developer did the code this way - do you know how the code is being used? Are you breaking those assumptions?
  • Describe why the previous code is now incorrect. List the changed assumptions or requirements.
  • Describe what your solution is going to accomplish.
  • Describe why your solution is the minimal solution.
  • Describe why your solution is the correct choice.
  • Describe the single problem that if solved would make your solution work correctly.

At this point, one of these choices is the path that needs to be taken:

  • Fundamental misunderstanding about existing code. You realized your initial assumptions were wrong and that your solution is the wrong path. Solution: STOP and look at reevaluate problem discarding old assumptions.
  • Missing information. The problem was not specified clearly enough. There are multiple possible problems that are being asked to be solved. Solution: get clarification. Do not proceed until the problem has been clarified.
  • Reinventing wheel. Has this problem already been solved somewhere else in the code? If so, refactor so the already created/tested solution can be used.
  • Rathole. A simple problem is becoming more and more complex. Are you fixing the problem of the problem of the problem that you started off solving? Are you making changes all over the place? If you are in a rathole, this is a sure sign of Doing-the-wrong-thing. Solution: STOP!
  • I don’t know If you don’t know, then you need to ask for help. Solution: Swallow pride and ask for help.

About Greatness and the true A-people

Monday, April 7th, 2008

A-people hire A-people and B-people hire C-people.

If something is repeated enough times, people accept it as true without questioning either the assumption or the definitions. When people refer to A-people or B-people they fall back on easily measured metrics: lines of code written, number of bugs fixed.

But what is an A-person?

Do you have an ‘A-person’ because they are willing to work 14-hours a day to get the product done, or do you just have a workaholic who is headed for a divorce and an early grave? Maybe they are abusive to the people they regard as “inferior” — thereby demotivating A-people to be B- or C- people.

Is the person who is quiet a B-person, and the talkative, helpful person an A-person? Is the ‘leader’ the A-person and the follower, the B-person? Is the top salesperson the A-person?

The A-person isn’t the just the heroic firefighter running around putting out fires. The unassuming fire inspector quietly preventing fires is also the A-person. The firefighter will prevent a fire from spreading before there is too much damage - but the fire inspector will prevent the fire and all damage.

Inspiration to Greatness

But the true measure of an A-person is their ability to inspire greatness in others. They may not be a leader, nor the best coder. But they ask the questions and provide the insight to solving key problems. The A-person offers the inspired word or phrase that fires the imagination of the others around them. Those others may be the rockstar programmers that churn out the actual code. But that quiet person who spoke up is just much an A-person as the rockstar. Perhaps more so, because that insight changes the direction of companies and without that the rockstars just turn out lots of product that does not inspire customers.

I call this Greatness. I am looking for people to inspire Greatness. Greatness is when a person exceeds their ability. Everyone wants a rockstar programmer - but they are hard to come by. But look for Greatness and your company can inspire the non-rockstar programmers to exceed their natural abilities — who knows they might discover that they are in fact rockstars!

The Robert Stephens, founder of Geek Squad, hires for these three traits:

  • Curiosity
  • Drive
  • Ethics

Everything else he regards as trainable. I couldn’t agree more. He is looking for the essential attributes that the great companies need to inspire Greatness.

But I feel Robert’s list is more individualistic and it ignore three societal traits that also cannot be trained:
Greatness list:

  • Willingness to share the glory
  • Non-judgmental
  • Eagerness to teach

How many “rockstar” programmers have the last 3? But all three are need to inspire others to greatness. Think about people that had the opposite of those traits:

Anti-Greatness list

  • “I get the credit, you get the blame”
  • “You are an idiot”
  • “RTFM”, “Figure it out for yourself, I am too busy”, “It’s easy”

If you have those people on board, make them aware of their Anti-Greatness behavior.

If they cannot, or will not correct it, then no matter how good technically they are, fire them. Otherwise you might as well just start buying posters here.

About movie theatres and bad marketing

Monday, April 7th, 2008

Continuing my comment to Rick Segal’s post:

The placement of automated ticket machines at movie theatres is really a marketing question. Where are those machines placed? The movie theaters I have been to, the machines are placed on the side behind the ticket windows.

If the owners were really serious about it they would put the machines out in front of the ticket windows right next to where the ticket windows lines would form.

Instead the machines are placed behind where people only see them after they have already made the purchase.

Stupid, stupid.

What’s even stupider is that those machines are a perfect opportunity to get opt-in access to the theater’s customers.

The machines could (for the options that would require more time make sure that the movie isn’t starting in the next 10 minutes):

  • display a 10-second preview for another movie
  • ask if the customer would like to buy a 5-movie pass instead of just the ticket they are buying now.
  • if they are buying for more than 4 people automatically print out the 5-movie pass ticket (5 separate tickets some people might need to go in ahead of others.) The customer will be thrilled to get a surprise discount!
  • Ask them if they want to get a chance to at special screenings for the summer blockbusters.
  • remind the customer of the last movie they saw at the theatre, and ask the customer if they want to buy the DVD of that movie. If so charge the customer, print out a claim ticket so that the customer with no waiting can go right to the counter inside to collect the movie
  • print out a coupon for a discount on the DVD for the movie that they are going to see right now. If the customer signs it and drops it in a collection box on the way out, the DVD will be sent to the customer even before it hits the shelves.
  • Try to sell the drinks/popcorn/etc. The customer doesn’t have to wait in the concession line. The customer line-jumps hands over the receipt (printed out by the ticket machine) to the concession employee and runs into the show. (Actually this is the exception to the 10 minute rule — always do this — how many late arrivals never buy food because the show is going to start any minute?)

The above was 10 minutes worth of thought.

But clearly this is more time than the theatre owners have spent on the issue.

anti-sales people at LayeredTech

Saturday, September 29th, 2007

Talk about a really interesting take on what being a sales person means. It is my general (perhaps misconceived) notion that when a customer contacts a sales person that their job is to try to evaluate the customer’s needs and maybe upsell them or find some combination of services that would met the customer’s needs and, oh may be make the company a wee bit more money. May be this is a little out-dated, after all it is a concept I learned while selling roast beef at Arby’s - guess it doesn’t apply to LayeredTech’s sales people.

I should preface this with the comment that I was planning on adding more servers but…..

From: Patrick Moore
To: sales@layeredtech.com
Subject: Re: [LTSALES #GHX-xxxxx]: Client Order: Patrick Moore [Client ID: xxxxxx] [Server ID: xxxxxx]
Date: Sep 27, 2007 5:38 PM

Hi there –

It looks like the prices for the servers have dropped in price to $49/month … So I would like to take advantage of that to move to the lower price.

I am also looking for a build/staging box build machine so this can be a slow box…or virtual machine…

-Pat

So here I am saying I want to get my account billing changed, but I am also saying that I want to add an extra server. (Wo ho) existing client, upsell opportunity (any place but layeredtech)!

Got this reply:

From: Sales Related Requests [Add to Address Book]
To: xxxxx@earthlink.net
Subject: Re: [LTSALES #GHX-xxxxx]: Client Order: Patrick Moore [Client ID: xxxxxx] [Server ID: xxxxxx]
Date: Sep 27, 2007 6:11 PM

Hello Patrick,

If you need to upgrade (or downgrade) your current server to a new processor, you will need to order an entirely new server. So, you should time it to where the server that you want to upgrade will be cancelled right after your new server will be up. We need a 2 day cancellation notice (go to support.layeredtech.com and open a ticket, chose ‘Cancellations’ and you will be guided through the process).

You can set the cancellation of the existing server to be now or at the end of your billing cycle. Please specify in the body of your ticket. There will be no refunds given for servers cancelled prior to the renewal date.

I apologize, but we will not move hard drives from one server to another. IP allotment is also not transferable to newly ordered servers.

If you have further questions or concerns, please do not hesitate to contact me for assistance.

Thank you,

Jenny Song
Layered Technologies Sales
Toll Free: 1.866.584.6784
Direct Line: 972.398.xxxx
Fax: 972.398.7055
Email: jsong {at} layeredtechnologies.com

You got to love this! Instead of trying to find out more about my needs was

  • to direct me to some series of steps on a website that I don’t want to figure out, and
  • not bother to find out if I had other needs (which I pretty darn clearly indicated)

But that’s o.k. right Jenny did say to contact her if I had “any further concerns or questions”. Well as a matter of fact I did:

From: Patrick Moore
To: jsong layeredtechnologies.com
Subject: Re: [LTSALES #GHX-xxxxx]: Client Order: Patrick Moore [Client ID: xxxxxx] [Server ID: xxxxxx]
Date: Sep 27, 2007 6:36 PM

well this looks like exactly the *same* server….so why can’t you adjust the price?

No response by the next afternoon, the offer of assistance must have been an empty one….


So I resent the email thread to sales@layeredtech.com hoping the luck of the draw would get me someone a little better. Wishful thinking. Got this reply:

From: Sales Related Requests [Add to Address Book]
To: xxxxx@earthlink.net
Subject: Re: [LTSALES #GHX-xxxxx]: Client Order: Patrick Moore [Client ID: xxxxxx] [Server ID: xxxxxx]
Date: Sep 28, 2007 3:54 PM

Hello,

We wish it was that simple however, it is not. Again, if you would like to upgrade or downgrade the processor you will need to order a new server. We will be unable to drop the current price of your server to $49.00 as per our current specials.

Thank you,

Drew Patterson
CSR/Sales/Accounts
Toll Free: 1-866-584-6784
(972)398-7000
FAX: (972)-398-7055
Email: Sales@layeredtech.com
Email: Accounts@layeredtech.com

Now at least Drew was a little more upfront and honest. He didn’t extend the (empty) offer to be of “further assistance” and he wasn’t even going to try to be helpful with a list of steps on navigating the layeredtech website. And certainly no direct number or email address for him!

I should also add that my whole humorous exchange started with me asking the same question of their pre-sales person ‘available’ via chat. I will not mention the id number of that person, because he did try to be helpful but admitted upfront that he didn’t have the ability to handle what I was asking for. He at least tried to be helpful and referred me to the (un)helpful people available at sales@layeredtech.com

Capitalism at its finest - “we won’t take you money unless you shove it in our hands”.

Code Reviews

Monday, September 3rd, 2007

Sometimes a code review reveals a code problem that just keeps repeating itself again and again. So rather than creating new email messages I have decided to start posting some code reviews. This will allow me to avoid repeating myself. I can just point to code-review #1 and say read this post.

Thoughts on how to evaluate code

Tuesday, May 29th, 2007

I met someone at Startup Camp2 who was non-techincal but had an idea that required technical expertise.

She faced the typical problem of judging and evaluate software code in order to make sure the people she hired were:

  • competent
  • making progress

This is of course hard especially in the beginnings of a project when so much is really building infrastructure code and configurations, none of which involves ‘visible’ progress.

I whipped off a quick email in response that even after sleep I still rather like:

  • Maintainability
  • Performance

These are your 2 key metrics. Poorly written code fails in these two areas.

Maintainability


Commented Code

Look through the code. Do all large methods have well-written comments that *you* can understand. You may not understand all the details but if there are no comments or the English is poor, this is bad. Any other developer coming later is going to have a hard time understanding what the original developer was trying to do and will probably create bugs when adding new features.

Key point: The comment should talk about *why* not just *what* is being done. The developer must describe all convoluted (to you) code in a *written* comment. This comment should be understandable to you, the layperson, to a reasonable degree. Chances are very good that, if he/she cannot that:

  • He is not quite certain himself what it does
  • He probably has not thought through completely all the issues around this code.
  • It has lots of bugs.

Be careful not to get lost in the weeds here. Have the developer take you through the high-level code, not the low-level stuff. Low-level stuff will distract you from seeing the bigger picture. You may want a friend developer who knows the language in question but be prepared to be able to fly solo on this after a few reviews.

Sample comment:
/**
 * Application State Object that tracks the current state of a flow. Holds any
 * state information related to a specific flow
 *
 * Each flow state has all the information to run the flow and re-enter it if
 * needed.
 *
 * defines an actively executing flow. Each FlowState has an attached
 * Flow which is the instantiated definition. This copy is made to avoid
 * problems with flow definitions changing while an instance of a flow is
 * active.
 */

Integration Tests/Unit Tests:

These are automated tests that anyone can run from the command line ( i.e. should not require bringing up a development environment.) You should be able to run a command line tool that reports number of tests run and the code coverage of those tests. These tests should include running something like selenium that will bring up a browser and run through your site.

Packaging

You should have a set of clear step by step instructions to get from a brand new machine to running the tests to bringing up the service. You need to be able to verify this yourself. Using only the directions only as written i.e. *no help from anyone* can you get the machine set up, source code downloaded from a source code repository**, compiled, and running? You should be able to type ‘http://localhost/’ and see your website.

[**Run away from any developer that doesn't understand source code repositories. They are your insurance that 3 months into development the developer's machine crashes and everything is gone.]

Can you bring up the development environment and start the product following the written directions by yourself? This avoids the possibility/probability that the developer’s machine is magically configured and only his machine is set up just so to build the product. Believe it or not, I have worked at large companies that are hair-pulling experiences because everything has to be magically configured to build the product.

Performance


How many people are going to hit your web server? What is the peak load going to be? What kind of response is the developer giving about issues like scalability?

Big issue here. Have the developer create jmeter tests that show how the server behaves under load. When running a jmeter test look at memory usage and CPU % on the server and that database. Ratchet up the number of jmeter users until the service just dies. Is that number acceptable? Look into making the service scalable using Amazon’s ec2 service. Ask questions about how much memory each logged in user takes. If each logged in user takes 1 megabyte of memory, you will only be able to have 300 or so users at a time/machine!

Any developer worth anything knows to use a database and well but they are not experts. Spend the money for a day or two of a database expert’s time. Have them take a look at the queries your service runs against the database. Have he/she do at least a little bit of tuning (this will be on-going process) but could easily allow the service to run 10x - 100x better.