Tuesday, June 21, 2005

Moving to YeAndNoni.com

I have moved my blog to YeAndNoni.com. This blog will no longer be updated.

Monday, June 13, 2005

I'm Jealous of People Who Work at FogCreek

If you are a fan of Joel and his company, like I am, you would have followed closely the progress of Project Aardvark and what the interns are doing. Last Friday afternoon Joel sent an email to FogCreek employees:

"I thought it might be fun to go to a movie instead of working...

We have 12:45 lunch reservations at Chevy’s in Battery Park City and 2:25 reservations for the opening of Mr. & Mrs. Smith, so let’s officially close the office at noon today.

Joel"

The reaction from one of the interns was "I Love This Place!". Hence the saying "a little goes a long way".

I'm working on a similar plan with my team of developers. Our team has been putting in some crazy amount of hours the past few weeks. I know I will be getting a budget to spend for this kind of stuff for my department. The biggest hurdle is convincing management to let us off early. But with the number of hours the team has thrown in lately I am fairly confident this will work out in our favor.

Thursday, June 09, 2005

Satay Malaysian Grille

So Satay finally opened its doors to the public a couple of weeks ago. Last Friday, my wife and I went to the only Malaysian restaurant in Vegas.

Satay is at the corner of Spring Mountain Rd and Valley View. Spring Mountain Rd is Vegas Chinatown. Naturally, the building looks like a chinese temple. Satay shares the building with Starbucks and T-Mobile. The parking lot seems a little too small. But because it's small it always seems to be packed - good for business.

My first criticism about the building itself is the lack of lighting. It's important for a restaurant to be bright. People like to dine in bright places, especially in Vegas where you need to live up to the casino lighting standards. The restaurant has glass windows all around. Unfortunately, one of the windows let you peek behind the bar. And usually behind the bar is not a pretty sight. You see a lot of hoses and metal sinks.

The entrance is just typical glass doors. Not a bad thing, but not too interesting either. We were first greeted by a waterfall glass screen. Classy. The hostess then sat us at a table in the smoking area because the non-smoking area was full. No big deal because nobody was smoking in the smoking area at that time.

We looked at the menus. Typical Malaysian restaurant menu. No surprises there. We went straight for the Malaysian favorites: roti canai $3.50, nasi lemak $7.95 and beef rendang with rice $8.95. Hmm... may be some kangkung belacan later if the portions were too small.

The waitress was nice. She's not Malaysian. I can tell from the way she speaks english. Because Malaysians learn British english at school but watch American shows at home, we spell "colour" with an 'u' but speak with an accent that is closer to the American accent. Since a lot of Malaysian chinese speak english and we watch chinese shows from Hong Kong, we have developed our own Malaysian english accent. We tend to inject into our sentences sounds adopted from the Hong Kong slangs such as "meh", "ah", "loh" that do not mean anything by themselves but would emphasize emotion - "You serious, meh?", "Why you so like that, ah?", "You tell him, loh." Malaysians who have lived in english speaking countries for a long time tend to lose that accent because we would only get a puzzled "Huh?" if we kept our accent. So that we don't sound funny, we dropped those weird sounds but kept the rest. Our intonation would still tell that we are Malaysians.

An Introduction to Malaysian Food
Anyway, first, some introduction to the food... Roti canai was originally known as paratha, a crispy South Indian Flatbread. Paratha is a plain pastry. But creative Malaysians started to stuff butter, eggs, bananas and sardines in the flatbread and thus roti canai was born. Roti canai is usually served with chicken curry. There are many types of roti. Roti paper is a flatbread so thin it disintegrates into tiny flakes if you apply a little too much pressure, thus the name. Roti planta is stuffed with a popular brand of margarine called Planta. Malaysians are not too creative when it comes to naming food. But the names are self explanatory.

Nasi lemak is another well-known Malaysian dish. The dish is a combination of white rice cooked in santan (coconut milk), sambal (chili paste with onions and anchovies), deep fried ikan bilis (anchovies), fried peanuts, wedges of half-boiled eggs or fried eggs, slices of cucumber and curry chicken, beef rendang or mutton rendang. Nasi lemak is often served on banana leaves on a plate or wrapped up in banana leaves for those in a hurry. Most Malaysian foods are spicy and bursting with flavors. Dishes are cooked with a complex combination of spices that make each dish distinct in taste, appearance and aroma.

Beef rendang is another Malaysian favorite. 20,000 miles away from Malaysia, you can still find this dish in any Malaysian restaurant in the US. Rendang is much like dry curry. The gravy is thick and spicy. Good rendang takes about three hours to cook so that the sauce thickens well and the beef tenderizes and fully absorbs the rich flavor of the spices. Beef rendang is usually served with plain white rice or nasi lemak.

Kangkung belacan is really water convolvulus cooked in what some people would consider stinky shrimp paste. On cooking with belacan:

"You'll be well advised to ventilate your kitchen and light a scented candle; as it has a pungent scent like 'stinky cheese'"

Yes, Malaysians are also well-known for our sometimes "weird" taste buds. If you like belacan, you may also want to consider equally aromatic salted fish, cencaluk (another shrimp paste) and durian (king of the fruits, this one has a scent so strong it is banned from airplanes, hotels and restaurants).

Associating and Hoping for Special Treatment
Anyway, we saw this other lady. My wife said she used to work at this Vietnamese restaurant that we frequent for the pho (rice noodles). So we said hi, hoping she would recognize us so we don't look like idiots. At first she was puzzled, but then she smiled and remembered us. She now works at Satay as a manager of some sort. I'm guessing she's part owner because she's dressed different from the other waiters and orders people around. We chat a little and exchanged some background information. She's from Ipoh. Been in the states for 14 years. It's interesting to meet people from your home country. I guess Satay is beginning to establish itself as a place where all Malaysians in Vegas gather to meet and eat. I can't help hoping for some kind of special treatment simply because I am Malaysian too.

Special Treatment #1?
We noticed there was an empty booth in the non-smoking area and the lady responded with "No... (a pause) problem" and smiled. Roti canai was served first. The curry for the roti was excellent. The roti was a little mushy. Seems to me it was one of those frozen roti canais you can get at the asian supermarkets. The portion was small. But for an appetizer it's acceptable. I think it's one and a half pieces of roti sliced into quarters.

The Food
Waiting for the main entrée seemed like forever. At one point the waitress told us our food was coming and she had asked the chef to cook faster. We didn't mind the wait. But I wondered what she meant by "cook faster". I stopped myself when I imagined the chef skipping the part where she was supposed to wash the vegetables and wait until the meat is well cooked.

While waiting my wife and I observed the interior design of the restaurant and the people who were eating there. The furnishing was made to mimic high-end restaurants. Strong straight lines with bold colors of black, red, yellow and gold. The booth where we sat had a canopy with curtains tied to both seats. I suppose it could be used to give people some privacy by closing the curtains. But then again, how many people would want that kind of privacy? Furniture is made of cheap materials although effective. I have no problem with cheap materials as long as they appear to be expensive. It's understandable you would want to cut some corners somewhere especially when you were just starting out. However, I thought the overall design lacks distinction. Being the only Malaysian restaurant in town, you have an advantage. You serve food that no one else serves. So why stop there? Re-create the Malaysian dining atmosphere in your restaurant. I think that will make your restaurant more appealing, interesting and talk of the town. You found a niche where you could be a leader in. Why would you want to go into some other niche and compete with the French and Italian restaurants in the casinos that buys million dollar original paintings just to decorate a wall?

While I played critic, the first entrée, beef rendang, was finally served. The portion was ridiculously tiny. Two pieces of beef with a little gravy and some white rice. My immediate response to my wife was "Should we get the kangkung belacan?" She nodded. I am a food fanatic and I think pretty much most people are. I learned presentation comes first because we see the food first. The beef rendang was served on a giant white ceramic plate with a tiny portion in the center. I'm okay with that. It sort of creates an illusion that you are being served a big portion. And when you are served a generous portion, you are happy. But the illusion didn't quite work for me. Next, the color of the beef rendang is just not right. Too light colored. A good beef rendang is lightly blanketed with shredded, fried coconut flesh covered in reddish brown gravy. The two pieces of beef are too big. The beef should be cut into small cubes that can be easily fed into your mouth without a need for a steak knife. The scent has a little too much shrimp and ginger and lacks spice. As predicted the taste is just not right. I am disappointed. For a price so ridiculous for a portion so tiny, I expected the beef rendang to taste, at the very least, right if not excellent.

The wait for the nasi lemak was not as long. Again same big plate with tiny portions. We weren't too surprised after the beef rendang. I told the waitress to bring us a kangkung belacan. She didn't understand what I said and asked me to point to the entrée on the menu, thus confirming my suspicion that she is not a Malaysian. The egg was missing from the nasi lemak. At this point, I am convinced the restauranteur did not do enough research before s/he opened the restaurant or s/he forgot what a nasi lemak should have as sides. Naturally, the curry chicken served with the nasi lemak had more potatoes than meat. I think skimping on little things like that could cost the business in the long run. The ikan bilis (deep fried anchovies) looked good. There were two thin slices of cucumber. Unbelievable. You had to skimp on cucumbers too? The sambal color was just plain wrong. It was dirty yellow. This led me to think maybe the owner is not even Malaysian. Take a look at the photo above. The sambal is the red stuff at the top. Yeah, unless you are color blind, in which case you shouldn't be driving, you should be able to tell something must be amiss with your sambal recipe. The white rice was just that; plain white rice. It should have been cooked in coconut milk but I doubt the chef knew that. The curry chicken was rather bland and the gravy wasn't thick enough. Cooking a good Malaysian curry chicken is very difficult to master. It takes a lot of spices and a lot of patience. Good curry chicken usually takes hours to cook.

Special Treatment #2
The lady whom we talked to earlier told us the chef was stingy. So she brought us an extra serving of the very wrong sambal. We didn't touch the extra serving because the sambal tasted like shrimp paste when there shouldn't be any shrimp paste. But we appreciated her gesture and said thank you.

Thank goodness the kangkung belacan was served before we finished the nasi lemak. This was the only dish the chef got right. The gravy was thick but not too much so that the kangkung didn't soak in it. The gravy tasted good with the stinky shrimp paste called belacan and dried, red hot chilies. I would recommend the kangkung belacan if you were to stop by at Satay. Just a word of caution: for some reason eating kangkung causes drowsiness. So don't eat too much kangkung and drive. Maybe now that Satay's in town Vegas ought to have a law against eating kangkung and drive. But I'll leave it up to the creativity of the law enforcers to find a breathalizer for kangkung. Perhaps the mere presence of the stinky belacan is an indication of Driving Under Kangkung Influence (DUKI).

We ended our night of splurging on ridiculously expensive Malaysian food that we can get four times cheaper back home with a helping of the irresistable dessert, Air Batu Campur (ABC). It means mixed ice. It's a bowl of peanuts, sweet corn, red beans, cincau (black jelly) and sometimes green and red jelly coverd with shaved ice, red syrup and sweetened condensed milk. The Satay version of ABC was missing the sweetened condensed milk. But it's very hard to disappoint when you are serving an artery clogger. So if you just want to meet Malaysians in Vegas but not spend too much for too little food, go to Satay and order an ABC.

Wednesday, June 01, 2005

Speaking English to Jackie Chan

Working with a team of programmers who are non-native English speakers can be a real challenge. I was raised speaking Mandarin at home, went to a school that taught Malay as the first language, married a wife who speaks Indonesian and conversed casually with friends in Cantonese. However, I started learning English when I was 5 so I think I've got the basics nailed down.

My fellow colleagues are excellent programmers, but not excellent English speakers. One guy is so smart it makes it hard sometimes to understand what he's trying to say. He likes to use metaphorical scenarios to help explain what he's trying to say. It usually ends up sounding like "Suppose I have an apple. You have an orange. If you give me orange... Apple costs $1.00. I won't give you apple. You pay me $0.50 then I give you apple... You tell me orange costs $3.00. I don't care. I want $0.50 then I give you apple..." As soon as he throws in a donut into the equation I begin to think yummmmm and start drifting to Donut Land. It reminds me of a scene in Rush Hour 2 where Jackie Chan was getting off a plane and greeted by Chris Rock. Chris Rock was mouthing some words while Jackie Chan seemed to be ignoring him completely. Thinking Jackie Chan doesn't speak English, Chris shouted at Jackie Chan "Do you understand the words that are coming out of my mouth?" to which Jackie Chan replied "Yes, I do."

Today I had first hand experience of what my colleague must have gone through trying to explain himself to me. I realized my colleague must have felt the same way Chris Rock did when he was talking to Jackie Chan. The programmers had a meeting with the inventory department to discuss our idea of streamlining the process of acquiring inventory. Because some of the information is classified and I signed one of those damn NDAs I will use metaphorical examples to give you a better idea of what we were trying to communicate to the inventory people.

Let's begin with some background about how our company operates:

Suppose our company, DVD Exchange, Inc., specialized in exhanging points for renting DVDs. Let's say John purchased a plan from Blockbuster where he gets 1,000 points every year. If he has unused points from previous year, they get rolled over to the current year. Now, John wanted to rent Star Wars Episode III. So he went to Blockbuster and found that all the Star Wars DVDs were rented out. Next day at the office, Christine told John about DVD Exchange and how he could exchange his points through DVD Exchange and get his Star Wars DVD from Hollywood Video instead. John got all excited and decided to call DVD Exchange.

Currently DVD Exchange would handle John's call like this:

DVD Exchange Rep: DVD Exchange. Hello, may I have your name please?
John: Hi, I'm John.
DVD Exchange Rep: Hi John. How may I help you?
John: I would like to exchange my Blockbuster points for the Star Wars Episode III DVD.
DVD Exchange Rep: OK, let me check the availability of that DVD. One moment please...
John: (whistling, tapping his fingers on the receiver, pretending to be patient)
DVD Exchange Rep: I apologize for the wait. Unfortunately, we don't have any Star Wars III DVD available at this moment.
John: (A little frustrated) Are you sure? What about Hollywood Video or the other video stores?
DVD Exchange Rep: I'm very sorry, sir. They don't show any availability.
John: (Starting to lose his patience) So what do I do with all these damn points if I can't use them?
DVD Exchange Rep: We could buy them from you, sir.
John: You can do that? (Getting excited again)
DVD Exchange Rep: Absolutely, sir. We will reimburse you for the points you are giving us.
John: Awesome! Sign me up.
DVD Exchange Rep: Sure. How many points do you have, sir?
John: Umm... About 1,300 points.
DVD Exchange Rep: Okay. Are any of these points rollover points?
John: Yeah.
DVD Exchange Rep: How many points do you get per year?
John: 1,000.
DVD Exchange Rep: How much do you have to pay per year?
John: $200. Oh wait, I paid more last year though.
DVD Exchange Rep: Okay. How much did you have to pay last year?
John: Well, I don't remember exactly. But I think I have rollover points from the past three years. And I paid a different amount for each of those years.
DVD Exchange Rep: I see, sir. I will need to have the points that were rolled over every year and how much you paid for them.
John: I don't remember them exactly.
DVD Exchange Rep: That's fine, sir. Can you give me some rough figures? You just need to send us the previous year receipts later.
John: Okay...

Once the DVD Exchange Rep collected all that information, the inventory department will evaluate John's points. The inventory department tries to find some DVDs that we could acquire with John's points and rent out again at a profit. If the inventory department finds something, then we will reimburse John for the points that we could use. For example:

Suppose John has 1,359 points available. 1,000 are points from current year 2005. 221 points are from year 2004. 138 points from 2003. He paid $200 in 2005, $220 in 2004, $250 in 2003. Every year he gets 1,000 points.

The inventory department found some DVDs we could acquire for a total of 987 points. We will only pay John for those 987 points that we are using. We always use the oldest rollover points first because rollover points will expire, say in 4 years. This way John will not lose his 2003 points next year.

So, based on the following:

138 points from 2003 at ($250 / 1000) per point = $34.50
221 points from 2004 at ($220 / 1000) per point = $48.62
628 points from 2005 at ($200 / 1000) per point = $125.60

Assuming the information given by John is accurate, John is asking $208.72 for his 987 points. Now, we are not going to pay him $208.72 for DVDs that we deem only worth $180 lest we want to make a loss instead of a profit. Next, we tell John to send in his previous year receipts to prove that he paid as much as he claimed for those points. If everything checks out, we make an offer to pay him $180 for those 987 points. On the other hand, if from the receipts we found that John actually paid $150 in 2003 and $160 in 2004, we will offer to pay him only as much as what he paid for those points. This way we don't overpay him.

Phew, that was a toughie.

Now, we programmers like to think we are smarter than everyone else. And to make things worse programmers are lazy. We like to simplify things. Maybe we just can't get refactoring out of our heads. So we thought why do we need all that information about rollover points and how much they cost? Their accuracy is not reliable anyway. So we came up with this clever idea where we only ask for the total points available and the asking price for those points. We would still arrive at the same outcome and make the same offer to John. But since we are not asking for the rollover points breakdown we may be overpaying John for his points. However, if we asked for the previous year receipts we will not overpay John for his points.

If you are still with me, thank you for your patience. I must be doing an okay job explaining myself then. Now, let's get to my tao of communication for programmers.

People Are Frustrated Because You Are Speaking Klingon
Presenting your idea well is crucial in getting your points across. When you can't explain your ideas well people can't understand you. They get confused, frustrated and tired from arguing with you. And they start to get the idea that you are stupid. During a meeting one of the inventory department staff said "I thought the programmers are supposed to do what we told them to. Why do we want to confuse ourselves with what they think?" Ouch! Sure enough that meeting ended up a disaster. There was a lot of frustration and confusion. People were just tired and angry that we wasted their time getting no where.

I made a point to present ourselves better and apologized for our lack of communication skills. When we got back from the meeting, I rounded up my team and cleaned up our acts. We wrote down our idea on a piece of paper and made sure every programmer are on the same page. I made a big deal out of choosing the correct words and terminology in presenting our idea so as not to confuse people. For instance, back to John's example:

Total number of points
Total available points
Total points that John is giving us
Total points that John is willing to give us

could all mean different things to different people. In our subsequent meeting, I started out explaining exactly what I meant by my terms and made sure that everyone understood what I meant. In some situations, I played translator by using terms in the inventory department context when my colleague was using his terms. Choose your words wisely. Do not use apple when you should use orange. Go the extra effort by explaining in detail what you meant to make sure everyone understand you the way you intended.

Speak Clearly
I get by with my English. I can't write a novel. I will probably get a B- if I were to take an English paper. But people can understand you even if you speak broken English. To prove my point, read the following sentences and you will understand exactly what I meant although it is grammatically incorrect:

Homer Simpson fat stupid. Homer son Bart naughty. Lisa Simpson smart.

You don't have to be a journalist to be able to communicate clearly. But you will need to make sure there is no ambiguity when you are speaking. Don't say "Marge tall blue hair" when you really mean "Marge's hair is blue and tall." and not "Marge is tall and has blue hair." If you have an accent that people find hard to understand speak at a slower pace.

Get Your Facts Straight
When citing examples, make sure the examples are in context, logical and accurate. If you started out with an example where an apple costs $1.00 and an orange costs $1.20 don't get all excited and say an apple costs $1.50 halfway through. Listen to yourself as you speak. If you realized you said something wrong, immediately stop and correct yourself. Otherwise, your listeners will think you make no sense while you wonder if they understand English.

Use Simple Metaphors
Metaphors are great ways to help your audience look at something from a different perspective. But don't go overboard and use complicated metaphors that people have no concept of. Don't use extracting hydrogen from water as a metaphor for ordering a meal at McDonald's. Sometimes, metaphors when used right can immediately get you an "Ahh. I see what you mean." from your audience.

Do Not Leave Out Important Information
I learned this one the hard way. Today we spent an hour trying to convince the inventory department that our method will get them the exact same result they will get with their current method. The one most important little piece of information that we forgot to mention was that in both method we will collect the receipts from the customer to verify their points and how much they paid for them.

We started out drawing a T-comparison chart with their method on the left and ours on the right. We made up a scenario and walked through both methods to prove that they would both arrive at the same end result. We did arrive at the same result but the inventory department still think we are missing something. They were questioning the reason for not collecting the rollover points breakdown information upfront. I explained that it would be redundant and the information collected is not reliable anyway. They acknowledged that the initital breakdown information is inaccurate and therefore unreliable. So I had to prove that their method involves redundant steps. I labelled their first step of collecting the rollover points breakdown as #1 on the left. And I labelled our first step of collecting points without the breakdown as #1 on the right. Next I added a #2 step where they ask for the receipts from the customer on the left and added the same #2 step on the right under our method. Instantaneously, I got an "Ahh. I see what you mean." Almost at the same instant, I realized what a dumbass I was for leaving that out in the first place. Suffice it to say that today's meeting ended in our favor.

Do You Understand The Words That Are Coming Out of My Mouth?
Despite Chris Rock's disrespectful method of getting his point across to Jackie Chan, he was making a good effort. He was trying to get an acknowledgement from Jackie Chan and he got it. When presenting your ideas it is crucial to get an acknowledgement every step of the way so you don't let anyone detour and arrive at a completely different conclusion than what you intended. If you see blank faces repeat yourself with a more detailed explanation of what you just said. Then follow up with "Do you understand what I'm saying?" Make eye contact with everyone as you ask that question. If they don't understand, their body language will give you a hint even if they don't admit it.


My learning experience has helped me communicate more effectively. If you are a programmer and have trouble communicating your ideas, it could hinder your career growth. Team leaders tend to be the most outspoken person in a team. If English is not your first language, speak more, read more and write more. You may not write a bestseller novel and make millions, but you'll be a good candidate for a promotion and raise.

Thursday, May 19, 2005

The Perfect Compensation Package for Programmers

One of my readers (2 readers and counting) liked my previous article, "The Business of Managing Programmers". Ok, the reaction is really more like, "Okay, smarty pants, how about some solution?" So, I decided to try to create the perfect compensation package that will hopefully influence those employers who are willing to change to retain key programmers.

Many of these ideas come from Joel's "How do You Compensate Programmers?". Some of them are from my experience as an employee and how I would want to be treated. I am not an employer so I am writing strictly from my informed opinion and experience as a lead developer managing a small team.

The Two Perspectives of The Perfect Compensation Package
Obviously, the employer and the employees never share the same view of what makes a good compensation package. The employer wants to minimize the compensation package, whereas the employee wants to maximize compensation package. Usually, one party ends up exhilarated and the other ends up "Yeah, okay." Ah, but therein lies the fallacy of employer and employee's misaligned interest with regards to compensation. See, most employers may think their goal is to hire the cheapest, best programmer. But "cheapest, best" are an oxymoron.

Let's put on our shopper's hat for a minute. Unless you are Bill Gates, when you walk into your neighborhood PotteryBarn you get a sticker shock realizing a simple wooden desk costs $1,199. Head over to the Cheapo-Mart, you can get a just-as-functional desk for a mere $250. So you ask yourself, "Why in the world would I want to pay an extra $949 for PotteryBarn's desk when I can get a desk 10 times cheaper that will support my monitor just as well? "

The naive shopper will go for the cheaper desk because he thinks they are the same thing. Three months later, he noticed the desktop starts to warp due to the weight of his 20" monitor. So he goes and buy another one. The desk warps again and this continues for one year. So he ended up paying $1,000 for a desk that's supposed to cost him only $250. Of course, this is an exaggerated example.

However, when you shop for a programmer like a naive shopper you will end up exactly the same way. If you were lucky enough to hire a top programmer who took your pittance just because he needed money to get his landlord of his back, you may be able to keep him for a few months. Once he gets a better offer, he'll be gone faster than you can say "I'll give you a raise." All of a sudden your development slows to a crawl because what's left of your cheap programmers are too dumb to make any progress. May be some time later, you found another superstar willing to code for food. You repeat the same mistake of taking him in, paying him minimal wage and hope he feels so debted to you he never leaves. Surprise, surprise. He leaves again. And the cycle continues and you wonder why your company stops growing. Funny thing is companies who hire desperate programmers on lousy compensation packages never seem to learn.

If you want to be the next Microsoft, do yourself a favor and adopt my Perfect Compensation Package for programmers. This will guarantee that you hire the best programmer you can afford. If after following my suggestion you still could not find a programmer, make me an offer.

1. Salary is guaranteed to be at least the market rate.
Before you hire, do some research and find out what your competitors are paying their top talents. You will get a range of salaries. To err on the side of caution, pay the amount closest to the highest range that you can afford. If you realized you were underpaying, do not wait for review time to adjust the pay. Your employee will appreciate a nice surprise more than an expected raise. Do not wait until your programmer finds out that you are underpaying. Usually, when your programmer approaches you about dissatisfaction of pay, this means she already has a better offer and she's ready to leave.

2. Fully paid health insurance for employee, spouse and family.
Do not skimp on this benefit. This is one of the most important factor that I would consider after salary. Companies who do not pay for the health insurance for spouses and families are scamming their employees. Why? Because the employee ends up with $10,000 less per year paying for his family's health insurance. Plus, you make it so easy for other employers to steal your superstar.

3. Great office with great equipment.
Programmers sit at the desk longer than you sleep on a bed everyday. Make sure your programmers are comfortable. Give them high back executive chairs to sit in. Provide work areas with windows and privacy. No straight line of sight between two programmers. Buy good, fast computers with big LCD screens. Your programmers will be eternally thankful for this. If your office is better than your average programmers' home offices, where do you think they would rather be?

4. Entertainment in the office.
Programmers are not like your normal employees. Programmers are programmers because we love what we do and we actually enjoy what we do. This is the one most important factor that drives us to work overtime voluntarily sometimes. And what better way to encourage programmers to work overtime for free than entertainment. Get a wall mounted LCD screen TV complete with cable for your programmers' office. XBox or Playstation will provide us with jolts of excitement to keep us awake throughout those 24-hour work days.

5. Work hour flexibility.
If you expect your programmers to work more hours, give us the flexibility to come in whenever we want during business hours. After putting in a 16-hour day the previous day, your programmers will be pissed if you expect us to come in at 8:30 am. Give your programmers keys to the office so we can come in during weekends when we have nothing better to do.

6. Frequent evaluation.
Conduct evaluations at least twice a year. Notice I used the word evaluation, not review. Performance reviews do more harm than good. Evaluation is meant for you to evaluate how you are doing at managing your programmers. Evaluations are like real estate appraisals. Every time you do evaluation, expect the value of your programmer to go up, just like your house. A programmer who has learned about your business is worth more than a programmer who is just coming on board. Prepare to offer a raise. Make use of the opportunity to get some feedback about what needs improvement. Remove all barriers that reduce productivity of your programmers and you end up with a lean, mean team of programmers. When you do offer a raise make sure you offer the same raise for the other programmers lest you want the other programmers leaving due to unfair compensation.

7. Immgiration services and relocation expenses reimbursement.
Follow the golden rule: Hire the best programmer you can afford and you'll do fine. If the programmer happens to need immigration services, offer to pay for it in full. It costs you more at the beginning, but you are almost guaranteed the programmer's loyalty for the next 5 years. Likewise for out-of-state candidates. If paying for relocation expenses will get you loyalty for the next 3 years, it's more than worth it.

8. Fun day.
Plan for some workday fun activities. That's right. That's what I said, workday fun. The keyword being workday. Why workday? Am I crazy? On the contrary, if you plan for a fun day on a weekend or on holidays you are doing nothing to improve the work environment because we don't work on weekends or holidays! As a matter of fact, programmers will not participate in these weekend "fun day" activities because you are taking away their personal time. Be creative. Fun day can be a short trip to a movie theater for three hours, or a picnic at the park two blocks away, or two hours of bowling at the mall downtown. These are cheap ways to tell your programmers to take a break and it goes a long way.

9. Training and books.
Continuous learning is the only way a programmer can improve herself and advance in her career. You must allocate budgets for training and books for your programmers. You cannot tell your programmers you don't have a budget for training. Training doesn't always have to be expensive. Send your programmers to conferences or user group meetings. Organize training classes internally. Encourage programmers to pick a topic and do some research, then share with colleagues what they learned.

10. The itsy-bitsy stuff.
Finally, take every advantage you could to improve the work environment by focusing on the itsy-bitsy stuff that cost you very little but mean a whole lot to the programmers. Weekly free lunches, paid for home Internet access, health club membership, free beverages, paid dry cleaning, occassional free tank of gas, etc. When you focus on these tiny details frequently, it tells your programmers that you care. Don't be afraid to go all out to help an employee. His loyalty and passion for his job will quickly repay you tenfold. Offer to help a programmer move to a new apartment. The more you surprise your programmers with out-of-kindness gestures, the more indebted the programmers will feel towards you. And the more productive and loyal the programmers will be.


This is what I think the perfect compensation package for a programmer should be. I'm sure a lot of the great companies already have this in practice which is why they are so successful. Programmers are not hard to satisfy. We just crave some appreciation.