Good Manager: Understands that developers are on the critical path: nothing "is" until someone writes some code.
Bad Manager: Thinks that developers are no different than business analysts, admins, or envelope stuffers, and treats them that way.
Good Manager: Understands that formal process, while invaluable, is not infallible and must be augmented by the performance of excellent people.
Bad Manager: Forces creativity and determination to take a back seat to process.
Good Manager: Wants people to be "intrapreneurs", to feel as if they're running their own little "business within a business".
Bad Manager: Thinks that being "part of the team" is more important that getting work done, no matter what it takes.
Good Manager: Listens.
Bad Manager: Talks.
Good Manager: Strives to understand customer issues deeply as a basis for all technology decisions.
Bad Manager: Forces customers to fit into his vision of technology.
Good Manager: Prototypes and iterates in order to learn "what".
Bad Manager: The specs are the Bible, at least until Version 2.0.
Good Manager: Ready, Aim, Fire. Or when super speed is needed: Ready, Fire, Aim.
Bad Manager: Fire. Fix. Fire. Fix. Fire. Fix.
Good Manager: Prioritizes "why"; facilitates "what"; accepts "how".
Bad Manager: Dictates "how". Blames when "what" doesn't match "why".
Good Manager: Daily interaction.
Bad Manager: He works here?
Good Manager: Leader.
Bad Manager: Politician.
Good Manager: Encourages customers to provide input and feedback.
Bad Manager: Depends upon training and documentation when customers don't "get it".
Good Manager: Encourages developers to identify their needs and is eager to satisfy them.
Bad Manager: Blames developers for missing deadlines when they lack the resources they need.
Good Manager: Offices or war rooms.
Bad Manager: Cubicles.
Good Manager: Intense interaction as needed.
Bad Manager: Meetings.
Good Manager: Has finger on the pulse of the organization.
Bad Manager: Needs town hall meetings and web conferences.
Good Manager: To foster moral, always strives to do the right thing.
Bad Manager: To foster moral, cheerleading and gimmicks.
Good Manager: Developers love coming to work.
Bad Manager: Developers love their work in spite of their company.
Good Manager: Googles you.
Bad Manager: Wants you go Google him.
Good Manager: Watches the project plans and schedules.
Bad Manager: Watches the clock.
Good Manager: Stays for years until our baby grows up.
Bad Manager: Moves on just before the smoke and mirrors clear up.
Good Manager: Worries about 2 things: Getting our work done and keeping our people.
Bad Manager: Worries about 2 things: How he looks and how he feels.
I get a lot of emails these days from fellow hackers with [ distress | concern | depression ]. They're not looking for technical solutions or advice (which is good because I have neither), they're just not where they thought they'd be and are reaching out for *something*.
I try to make a point to answer all of them because, frankly, they're my most important emails. To me, the ones and zeroes inside my fellow humans heads are far more important than those on any computer.
If I built a Venn diagram of all of my responses, the intersection is significant. There are some things I end up telling almost everyone, regardless of their situation.
This is not(Advice). Just a bunch of observations from a fellow hacker who has also suffered and learned...
1. You don't have a time machine.
So many fellow hackers say, "If only I hadn't..." with "quit my job" being the top instance.
You can't "should have". You can only "do". You don't have to forget what happened in the past, but you don't have to overemphasize the importance of its input into your future.
My favorite example:
2 people are travelling from New York to San Francisco. One drives directly from New York to Chicago. The other drives to Florida, Texas, Tennesee, and then Chicago. They are now both in Chicago, well fed, rested, and ready to go. How should their plans differ? (Hint: Except for rare exceptions, they shouldn't.)
It doesn't matter how you got where you're at. It only matters where you're at, who you are, and what you've got.
2. You can't read others' minds.
I often hear things like, "If I only knew what she wanted, I would do it." You don't know. So ask. We humans are not connected via USB 3.0 (yet). Until then, we must talk to each other without fear. That usually improves our chances of success significantly.
3. There are no rewards or punishments, only consequences.
Life's not fair. With software, unknown input + known process = predictable result. In life, known input + unknown process = consequences. We spend a lifetime learning the processes, so we should get better predicting the consequences. When you were 16 are wrote that cool software that nobody wanted, you were disappointed. Now you should either adjust the input or stop being disappointed. You'll never be perfect, but with continuous learning, you should get pretty good knowing what will work and what won't.
It's not about luck. It's about adjusting the controls to maximize the possibility of desirable consequences. You didn't do that as well as you would have liked this last time. You'll do better next time.
4. Don't order a taco at a Chinese restaurant.
Many hackers are disappointed in the responses of others in their lives. "If only more people clicked that button." "If only my cofounder worked harder." "If only that angel got it."
Sometimes we expect things from others that they are incapable of giving. It's hard for we hackers to believe that it's so difficult (or impossible) for <Person A> to do <Task B> or understand <Concept C>. We might as well order a taco at a Chinese restaurant. (Hint: They don't have any.)
When others don't respond the way you expected, maybe it's because they couldn't or didn't know how. Don't blame them. Just order what they've got.
5. You are a Chinese restaurant that doesn't serve tacos.
Sometimes a friend or loved one says something like, "You had it all! You made more money than anyone I know and you threw it away for a silly dream. You could have had and done anything you wanted with a salary like that."
Whenever they do, they're ordering a taco from *your* Chinese restaurant. They think you're something you're not and they want something from you that you don't have to give them.
In general, most normals get a greater percentage of their satisfaction from mainstream thinking, good times, and "stuff". They don't understand the hacker mindset of getting satisfaction from building and achieving.
That's OK. Being different isn't the problem. Forgetting that we are is.
6. They love you. They want to help. They're always right. Pick two out of three. (Hint: It's the first two.)
I often hear things like, "My father criticizes me for <x> and I feel awful." You can only feel awful if you believe him. You only believe him if you think he's right. But as hard as it is to believe, sometimes he's actually wrong. This is probably one of those times. Get used to it.
7. It's all in your head.
It may sound like some enlightened Zen kind of thing, but it really is true. But knowing it and living it are two entirely different things.
It's easy to say things like, "I will manifest <y> in my life," especially for us hackers because we are used to making something seemingly out of nothing. But when we appear to not succeed at building something right out of our head, it's easy to dismiss our our responsibility and blame something external (time, money, support, luck, etc.)
It really is all in your head. You may not be ready right now, but eventually you will be. Then you'll try again.
8. I care. And I have a feeling I'm not the only one.
The single biggest response I ever get is something like, "Thank you. It's not what you said, but the fact that you responded that means so much to me."
Feel free to email me any time. Any feel free to engage others, too. But don't get concerned if they don't respond. Their Chinese restaurant doesn't serve tacos yet.
I'm now a software developer. I've worked hard all my life, but I still think that McDonald's was the toughest and best job I've ever had. I learned lessons there that have helped me many times since.
Just a few of those lessons:
1. In order to do heavy volume, you have to be set up for heavy volume.
When we hung out with our friends who worked at Burger King or Wendy's, they'd tell us about their record hours and record days (in dollars). We were amazed. What they called records, we did every day. Our records were 4 or 5 times as much. In restaurants that appeared the same.
The difference was always that McDonald's was set up for volume. We ran five lines where they ran one. We made 12 hamburgers at a time when them made one at a time. We had food cooking before people even ordered it.
If a bus pulled in, we fed everyone in 10 minutes. They took at hour. When 6 buses pulled in, we fed them all in an hour. 6 buses never pulled into Burger King or Wendy's. They knew they wouldn't eat.
The same thing holds true for commercial software. Want to write lots of software? You better have everything you need in place first. People. Hardware. Environments for development, testing, and production. Source control. Frameworks. Tools. And most importantly, a mindset and the experience to do a lot of work. Anything less and you'll end up with vaporburgers.
2. If you're not prepared to serve customers before they arrive, it's already too late.
If a customer arrived and ordered a sandwich that was not already cooked or a special order, no problem. We just made it. Just as long as the grill was hot, the freezer was full, the buns were laid out, and everything else was where it needed to be. If anything wasn't, we couldn't give good service to anyone.
There's a common misconception in software development that you don't really need much software before you meet your customer; they'll tell you what they need and you'll develop it. Wrong. You better have at least half of it already written, or you'll never deliver anything in a timely manner. You may not know their exact requirements, but a form is a form, a data base is a data base, a web page is a web page, and a process is a process. You better have all your building blocks built before your customer arrives. No one wants to wait for your grill to warm up in order to make your sandwich and no one wants to wait for you to write your framework to make their app.
3. When you're operating on the razor's edge, every detail is critical.
Saturday night from 5 to 8 was always the busiest time of the week. So Saturday from 4 to 5 pm was the most important hour of the week. Everything had to be ready and everything had to be perfect. Four large stacks of buns were positioned perfectly along the wall. The meat freezer had 300 pounds of beef patties with the boxes already dropped to break them apart. All condiments and paper goods were fully stocked; bags were even "fanned" to be easier to grab. There were no cabinet doors or drawers because there was simply no time to open and close them when you got busy. And the kitchen had to be spotless; there would be no time for sweeping, mopping, or cleaning when you'll be running 72 sandwiches at a time for 3 hours. We knew what was coming, so we got very good at eyeballing the kitchen at 4:45 to make sure everything was perfect.
The only difference in developing and deploying software is that your "crunch time" can come anytime, not just during rush hour. And you better be ready. You better know exactly where your code is and what it does. Your data better be in order. Hard copies of source code and specs have to be handy and ready to use. But most of all, the programmer has to be ready for the "burst". That means taking care of yourself and being prepared to work something through until it's right. So get enough sleep, exercise, and clear your mind. And don't eat at McDonald's :-)
4. 1 + 1 = 3. 1 + 1 + 1 = 6
In order to make 12 hamburgers, you'd have to:
a. Put 12 bun crowns in the crown toaster.
b. Put 12 meat patties on the grill.
c. Sear the 12 meat patties.
d. Season the 12 meat patties.
e. Turn the 12 meat patties.
f. Put 12 bun heals in the heal toaster.
g. Remove the 12 bun crowns from the crown toaster and put them on the dressing table.
h. Put ketchup on the 12 bun crowns.
i. Put mustard on the 12 bun crowns.
j. Put pickle slices on the 12 bun crowns.
k. Move the dressed bun crowns next to the grill.
l. Drain the 12 meat patties put them on the 12 bun crowns.
m. Remove the 12 bun heels from the heel toaster and put them on the 12 meat patties.
n. Wrap the 12 hamburgers.
One grill can hold 36 hamburgers. It takes 3 minutes to cook a hamburger patty. When I was stuck in the kitchen by myself late at night, I was able to make one set of 12 hamburgers in 5 minutes. Two of us could make 3 sets in 5 minutes by starting Set 1 at time 0, Set 2 in 1 minute and Set 3 in 2 minutes. Three of us could make 6 sets in 5 minutes by using 2 grills and helping each other with the dressing.
I have found that these multipliers work about the same for developing and deploying business software, with one, two, or three people working together as a team. Beyond that, the "kitchen" gets a little too crowded.
5. Ideally, managers can do and doers can manage.
There were about 50 tasks that needed to be done all the time in these categories:
- waiting on customers
- cooking
- cleaning
- restocking
If you had 12 people, you specialized and divided up the work. If you had 6 people, everyone did multiple jobs at the same time. If you had two or three people, each had to be able to do anything, do it very well, and do it fast. If you had one person, they were called a manager and could run the restaurant alone if they had to. Imagine how much better the enterprise world would run if its managers were as versatile as McDonald's managers.
On the other hand, some doers were high school students preparing for college and had no plans to go into McDonald's management. But they were super-doers. They knew everything that had to be done and the best ways to get it done. They naturally gravitated to the top and started directing their peers. Eventually, McDonald's gave them the title of "swing manager" (someone who did everything a manager did but didn't get paid as much). It reached the point where swing managers were better than managers at day-to-day operations. Funny, the best technicians anywhere are often the same ones who self-manage.
6. The difference between mediocre and good is small. The difference between good and great is large.
For us super-doers. Tuesday night was the most interesting time of the week. That's when the weekly schedule was made up. There were about 60 of us high schoolers on the payroll, and you better believe that it was critical who we were scheduled to work with. About 40 were mediocre, 15 were good, and 5 of us were great.
Monday night? Not busy, no big deal, put Martin on porter and Mike G. on the counter. It won't make much difference. Friday night, we'll be pretty busy. If you don't have either Mark or Jay on grill, you'll never keep up. Saturday night, forget it, we'll get slammed. It's me, Jay, and Wally in the kitchen. Have Mark on standby, but whatever you do, keep Jimmy and and Fred out of our kitchen! George and Patty better be on counter that night; we won't have any time for mistakes.
You kinda get the picture. Five Jimmys couldn't keep up with one Wally, and even if they did, you wouldn't want to eat their product.
I'd like to comment on how this applies to programming, but Joel Spolsky already has far better than I could in, "Hitting the High Notes":http://www.joelonsoftware.com/articles/HighNotes.html. My favorite line: "Five Antonio Salieris won't produce Mozart's Requiem. Ever. Not if they work for 100 years." What was true in music was true at McDonald's. And is still true in our software offices. Go figure.
7. Good work habits are like antibodies; once you get them, you have them for life.
There were 2 kinds of workers at McDonald's, those who got the work done properly and completely, no matter what, and everyone else. It only took about 5 minutes to tell who was who. And it never changed. Both groups were equally smart, equally capable, and equally personable. What was the critical difference? Work habits. Good workers refused to work in dirty work areas. They refused to release deficient product. They refused to put off what could be done later because they knew it would grow to twice as much work later and screw everything else up in the interim. And most of all, they hated working with those who didn't have the same good habits. Why should I get the product out hot, mop the floor, wipe the counters, stock the freezer, and prepare for closing while Jimmy has a smoke and hangs out in the back. Get him off my shift!
Years later, it's still the same. Got a critical project with a tough deadline? Need to put out great product quickly and efficiently? Who you gonna call, the brilliant guy who sits and pontificates all night or the one who understands what it takes and won't quit until he's done. Work habits separate the good from the great and show you the way to success. Once you have that taste, it's awfully hard to become a slacker.
(A true story.)
Philip (President): Our factory is underutilized by 10%. Either we start building more of our backlog or we lay people off. I'd rather keep everyone busy, build inventory, and get ahead of the curve before the busy season. How can we do that?
Lee (Operations Manager): Company policy restricts us from building more than 3 months of backlog. If you just change that to 4 months, we'll have plenty of work.
Philip: Done. Now how do we implement that?
Lee: I'm not really sure. I think we'd have to change a setting in the legacy software.
David (IT Director): No problem. It's probably one line of code in our core routine. Fill out a ticket and submit it to IT Services.
Judy (IT Admin): I'm assigning this request Ticket# 129281. But it still needs the section on Business Impact completed and Director approval.
David: It's for Philip. It we don't do this right away, we'll have to have a layoff.
Judy: OK, then I'll fill out that section myself and put this on the fast track.
2 days later.
David: What's the status of 129281?
Judy: It's the first Enhancement in the Developer Queue, after 14 Bug Reports.
David: Forget the queue. Mark it urgent and send it to Ed immediately.
1 hour later.
Ed (programmer): On line 1252 of Module ORP572, I changed the hard-coded variable MonthsOfBacklog from "3" to "4". I unit tested this successfully and ran 2 batch test runs. The Operations work queue increased 10% as expected. This is good to go. I just submitted it to Code Review and moved in to Homer for User Acceptance Testing.
Shirley (Code Review): It is now against company policy to have any hard-coded variables. You will have to make this a record in the Parameters file. Also, there are 2 old Debug commands, an unassigned variable warning message, and a hard-coded Employee ID that will all have to be fixed before this module can be moved to production.
Ed: Fuck that shit.
Shirley: That may very well be true. But since you were assigned ORP572, you are responsible for fixing preexisting errors that violate new company policy. I cannot promote this as it is.
2 hours later.
Ed: OK, done. I just resubmitted it to Code Review.
Julie (IT Testing): Homer is not available for User Acceptance Testing because Fred is running a controlled test for month-end accounting close. Use Marge instead.
Ed: I don't have access to Marge.
Julie: Then contact Joe in IT Security. He'll get you permissions.
2 hours later.
Joe (IT Security): I cannot grant you access to Marge without David's signature. He's out of town. Can this wait until Monday?
Ed: I don't think so. Philip wants this right away. Get him to grant access.
Shirley: Your new Parameters record "MonthsOfDemand" needs a better name. The offshore programmers won't understand what this means. Also, it should have an audit trail of changes.
Ed: What policy is that?
Shirley: It's not exactly written down anywhere. The offshore team is 3 months late updating the wiki, but I assure you, all new Parameter records must satisfy new naming requirements and keep audit trails.
1 day later:
Ed: I renamed the Parameters record "MonthsOfDemand" to "SelectedMonthsOfBacklogDemand" and added Module PAR634 to maintain that record and its audit trail. I have submitted it to Code Review.
Tony (IT Testing): I see 129281 on Marge, but I have no Test Plan.
Ed: Just run it the old way and the new way and note the increase in the total on the WorkOrdersHours report.
Tony: That's your test plan? No. This affects everything in the factory. I have to have user selected Test Cases, Expected Results, documented Test Runs, and user sign-off.
2 days later:
Philip: David, tell Tony to move Ed's program to production immediately.
David: Yes sir.
Total elapsed time: 6 days.
Lines of mission critical code changed: 1.
Bytes of mission critical code changed: 1.
Excedrin eaten: 24
Pissed off hours spent on Hacker News: 14.
A local Sporting Goods retailer that had just acquired a Baseball competitor. Their ecommerce system had a clever database structure to make ordering easy from either the website or the call center. For any given Product, there could be hundreds of Stock Keeping Units (SKUs) based on Sport, Size, Color, Number, or other attribute. The database was easy to use but difficult to load.
Jim was brought in to build a one-time application that would build all the data base records needed from Excel spreadsheets from the old system. In addition, every SKU in the system had to be "smart"; that is, anyone can tell everything needed to know just from looking at the SKU. For example, a Wilson A2000 medium left handed female softball catcher's mitt might be: WIL-A2000-M-LFSC-01.
Jim wrote the application to build and load all the SKUs, Sales Orders, Work Orders, Inventory Locations, Boxes, Bins, history, and supporting indexes. He had 10 users log in to the new fulfillment system and update all the activity not on an Excel spreadsheet. This took 2 days.
Then a strange thing happened. The owner of the acquired company asked why they coded all of the left handed SKUs as right handed and vice versa.
Huh? Apparently the people from the acquiring company who encoded the Excel spreadsheets didn't realize that a left handed player wore their glove on their right hand! Every data base record was wrong.
The choices to fix this were:
1. Make L = Right and R = Left forever.
2. Jim could add one line of code to his load application to reverse the bad data on the Excel spreadsheets, rerun it, and then redo 2 days of data entry.
3. Jim could write a "quick and dirty" one-time program to fix 500,000 bad data base records. It would take a day or so to write, test, and run, but no one could do anything until he finished.
They chose Option 3, sent 5 people home, and had the other 5 do other work.
BIG QUESTION: Why didn't anyone in a Sporting Goods company know that a baseball player wears their glove on their non-throwing hand?
BIGGER QUESTION: Why didn't anyone from either company review any of the plans, specifications, or data BEFORE work began?
BIGGEST QUESTION: Why didn't a Sporting Goods company that had made 9 acquisitions in the past 3 years have any standard methodolgy to do acquisitions? Why did they even need Jim?
In the past year or two, I have learned my greatest life lesson. As a lifelong high achiever, it was extremely counter-intuitive yet it was right in front of me all along. First, a little background…
In the past couple of years:
- My father died.
- My aunt (and best friend) died.
- My cousin (who was really like my brother) died.
- My 19 year old cat died.
- We had our first ever family reunion.
- My mother's dementia has turned her back into a child.
Sure we all have great memories and are busy working at building even better futures, but ultimately it all boils down to:
All we have is now.
My pets have been trying to teach me this for years, if only I had listened. And now my mother is teaching me. They don’t really remember yesterday. They don’t care about tomorrow. But they really care about the moment. Intensely.
I have had to really slow down and let this sink in. When I visit my mother in her nursing home, we have a great time laughing, talking, visiting others, and of course, playing Jeopardy. We can’t have the conversations we used to, so we just have new experiences, one time only, in the moment, and only for those who are there. We never talk about the past and she simply doesn’t understand, “I’ll see you tomorrow.”
I haven’t stopped building my future, but I no longer sacrifice the present in order to get there. I have learned that the process must be as enjoyable as the outcome. After all, the process is “now” and the outcome is just an instant in time.
It may sound cliche, but everyone should take inventory of all the good stuff in their lives (especially other people) and make the most of it “now”. You’ll be surprised how quickly it’ll be gone. Don’t wait half your life to learn my most valuable counter-intuitive lesson.
I don’t know about the rest of the world, but lots of us sure are in a bubble. There seems to be a real disconnect between what people want to build/invest in and what people in the real world actually need and want to pay for. Just as sample of what I’ve witnessed in the past few years:
Ask HN: How do you like my file sharing app?
Ask HN: How do you like my social app for niche ?
Ask HN: How do you like my twitter app?
Ask HN: How do you like my facebook app?
Ask HN: How do you like my iphone app?
Ask HN: How do you like my facebook app that writes twitter apps?
Ask HN: How do you like my game?
Ask HN: How do you like my photo sharing app?
Ask HN: How do you like my video sharing app?
Ask HN: How do I monetize my free flashcard app?
Ask HN: How do you like my app that helps other hackers to do ?
Ask HN: How do I get traffic to my freemium app?
Ask HN: How do I get angels/VCs interested?
Ask HN: Look what I wrote this weekend!
Ask HN: Look what I wrote in one night!
Ask HN: Look what I wrote in 7 seconds!
Customer 1: How can we sell through Amazon.com?
Customer 2: How can we reduce inventory by $300 million?
Customer 3: How can we increase conversion from 2% to 4%?
Customer 4: How can we use software to reduce energy costs?
Customer 5: How can we migrate one app into another?
Customer 6: How can we get our phones to talk to our legacy apps?
Customer 7: How can we take orders through the internet?
Customer 8: How can we get our software package to do ?
Customer 9: How can we reduce credit card fraud?
Customer 10: How can we increase SEO effectiveness?
Customer 11: How can we connect fulfillment and ecommerce?
Customer 12: How can we increase revenue?
Customers 13-200: How can we increase profitability?
]]>“The path of the righteous programmer is beset on all sides by the inequities of the clueless and the tyranny of evil project managers. Blessed is he, who in the name of achievement and solid technology, shepherds the users through the valley of ineptitude, for he is truly his customer’s keeper and the finder of lost solutions. And I will strike down upon thee with great vengeance and furious anger those who would attempt to deploy without testing. And you will know my name is zedshaw when I lay my software upon thee.”
“And in my experience when enough people are saying that ‘you can’t do that’ there is an opportunity waiting for you that is proportional in pay-off to the number of people asserting that it can’t be done.”
Great thought.
Most of my most memorable successes were when others said that something couldn’t be done. First you think, “Why not?” Then you think, “What would it take?” Then you figure that you’ll never find out for sure unless you try. The reward is compounded by the initial skeptism.
Just a few silly examples (any of these sound familiar?):
Manager: Shop Floor Control is impossible.
Me: Why?
Manager: Because the base data is so inaccurate.
Me: So?
Manager: It would take years to fix all the data.
Me: What if we turned in on anyway?
Manager: The output would be worthless.
Me: Wouldn't it show where the base data was inaccurate?
Manager: Yes.
Me: Then you could fix the biggest culprits?
Manager: I suppose.
Me: So turning it on would expedite data fixing?
Manager: Yes.
Me: So it's not really impossible?
Manager: Well...
Manager: Bug free software is impossible.
Me: What would it take to make is possible?
Manager: Nothing. Can't be done.
Me: What if we added systems testing to unit testing?
Me: And then built rigorous test plans covering almost everything?
Me: And then enforced User Acceptance Testing?
Me: And allowed nothing into production without passing?
Me: Would it be better?
Manager: Yes, but we can't afford to do all of that.
Me: So, bug-free software isn't impossible, just expensive?
Manager: No, it's impossible. Get back to work.
Me: Sigh.
Manager: A web app is impossible.
Me: Why?
Manager: Because it depends upon data entered by regular people.
Me: So?
Manager: People are idiots. They enter wrong data all the time.
Me: What if we trained them?
Manager: Impossible. They don't work for us.
Me: What if we made the software smarter?
Manager: What do you mean?
Me: Data validation.
Me: Data reasonableness based upon rules or history.
Me: Crowdsourcing data validation.
Manager: The data would still be bad.
Me: What would it take to make the data good?
Manager: Nothing. Impossible.
Me: Sigh.
]]>Condescending feedback says more about the speaker than the listener. It is almost invariably about their own insecurity. This is true is almost all fields of endeavor, not just programming.
Just a few examples of my own:
Insecure bridge player: The queen of spades was a stupid play. What’s wrong with you?
Excellent bridge player: The queen of spades would have been a great play against a 4/2 split. But since you had a 3/3 split, what do you think would have happened if you had played the ace instead?
Insecure public speaker: You look like an idiot playing with your hands like that.
Excellent public speaker: You talked about a lot of cool things. I bet I would have been even more interested if I wasn’t distracted so much by your hand gestures.
Insecure parent: If you can’t keep that baby quiet, you should just stay at home!
Excellent parent: Here’s something that has really worked well for me when my kids cried in public…
Insecure programmer: How lame. I can’t believe you .
Excellent programmer: I see that works. I have found a few ways to make it work even better.
Let me know what you think.
Not so Good: Build it and they will come.
Good: Make something people want.
Better: Make something people need.
Even better: Make something people need and know that they need. If they don’t already know, someone will have to help them know. That someone might be you and helping them will take sales and marketing, a significant consideration.
Even better: Make something people need, know they need, and are willing to pay for now. Competing against “we’re not ready, maybe next year” is tougher that competing against any competitor.
Best: Make something people need, know they need, are willing to pay for now, and has their hair on fire.
Leapfrogging to “let’s just solve this problem now” is often the best (and most fun) way to deploy.
[EDIT: This is “not” about “guessing what people need”, worrying about competition, or assuming “if I need it, others must too”. This is about getting up off your butt, talking to people, finding out what they must have, and building it for them. There are people everywhere desperate for solutions to their problems, and I promise you, they’re not finding them. Sure, you may scratch your own itch and hope that someone else needs it, but this is a lottery approach. Most start-ups fail because they built something no one else wanted or was willing to pay for.
There is absolutely no better way to find out what to build than finding customers first. Please don’t be like me and learn that the hard way. There are great apps everywhere that nobody uses while people suffer because no one is building what they want.]
There’s one huge factor at work, for many programmers. I’m tempted to call it the “wimp factor”, but that’s too negative, so I’ll just call it the “introvert factor”. I’m a perfect example…
I was always small for my age and looked nerdy with my glasses and attraction to books, etc. I was always picked last for sports teams, drew little attention from girls, and was usually the first one to be bullied. It even happened in my own family, subconsciously I hope. It was always easier to pick on the little guy to get what
you want.
Fast forward to adulthood, and not much has changed, especially with bosses. It seems like my boss was always a sales/business guy, extroverted, and bigger than me. His/her natural reaction was to bully, probably because they knew they could get away with it. This was for almost everything: project management, discussions about work, and of course, money.
No more. I don’t know exactly when it happened, but I decided not to take it any more. The more anyone picked on me, the harder I shot back, right between the eyes. Nothing pisses me off more than being bullied, especially about money.
Whenever I read a post about the sprint to launch, I think 3 things:
1. Great determination, great work ethic, great job.
2. It doesn't have to be this way.
3. It shouldn't be this way.
I feel fortunate that my DNA is blessed with some sort of internal “governor”. I don’t know where it came from, but I’ve always had it. Here’s how it works: It stays out of the way when I am enthusiastic about something, allowing me work ridiculous hours and pursue almost anything that looks promising, whether it makes sense or not. But when I reach a certain point, it turns me off, completely. I don’t seem to have conscious judgement of what that point is or when I reach it, but when it happens, I know.
A few examples:
- I have worked many times without sleep, preparing for a launch. Sometimes, I know my judgement is failing and continuing would cause more problems in the long run. So I stopped and apologize to everyone. I went to sleep and informed everyone that the project would resume at x. I’m not really sure exactly what happened, but I know I had little control over the governor.
- I had 2,500 invoices spread across the carpet, looking for a clue about a bug. After 8 hours, everything was fuzzy. So I just gathered up the invoices, filed them away, and went to sleep. Three days later a lightbulb went off, I spread out 100 of the invoices, and found the problem in 15 minutes. I know that if I had continued that
night, I never would have found it.
- I worked 90 hours per week for 2 months for a big deployment. Without telling me, my co-founder spent all of our reserves travelling to a customer site to oversee the install. He emailed me every 20 minutes with a problem. Between being pissed off at him and exhausted from working on the wrong things, I realized the project was going nowhere and would never succeed. So I just stopped working completely. I went to bed and didn’t answer email for 4 days. I’m not proud of this, just one more story about my internal governor. I’m a little frustrated that I don’t have much control over my governor, but also a little relieved that it does it’s thing. After all, I’ve never really been burnt out, and I’m still going strong.
Thank you, governor.
“Six months later, things are still sounding great and not happening. What’s going on?”
It could be that nothing unusual is going on. A six+ month buying cycle for anything over 4 figures is normal.
Whenever selling to an enterprise, you should ask your contact:
1. Who is the champion?
2. Who is the decision maker?
3. What is the process for each tier?
4. What should we do the best ensure our mutual success?
The only reason for surprises in the sales cycle is if you didn’t bother to ask.
It someone sold a cure for cancer for $1000, everyone would buy it and the world would be healed.
If it cost $10,000, you’d probably have to await corporate paperwork and approval for 6 months and only then start implementation.
Teen years - flipped burgers & partied
Age 21 - graduated college, flipped burgers, & partied
Age 24 - touched my first computer
Age 25 - wrote my first program
Age 27 - touched my first PC
Age 31 - wrote my first low level code
Age 32 - started my first business
Age 39 - started my second business
Age 41 - accessed the internet for the first time
Age 44 - wrote my first browser-based app
Age 51 - found Hacker News
Now - having more fun than ever
It’s never too late, you’re never too old, and it’s not whether the glass is half full or half empty.
It’s about getting up off your butt and filling the glass the rest of the way.
“In fact, one thing I have noticed is that the people who I consider to be good software developers barely ever apply for jobs at all.”
Good point. The best developers I ever hired were (a) already working, (b) not looking, (c) referred, and (d) without a current resume.
Therefore, the people who I consider to be good software developers probably don’t have a current resume.
Therefore, the top 1% of good software developers probably don’t have a current resume.
Therefore, if you have a pile of current resumes, it probably includes none of the top 1% of good software developers.
Therefore, if you’re hiring from current resumes, your probably “not” hiring the top 1%.
[The only thing worse than sloppy probability and statistics is sloppy logic. But that’s OK, because I’m not in the top 1% of either.]
]]>“It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration.”
For what it’s worth, I have written over 1 million lines of BASIC for over 100 customers, most of it still it production, and all of it doing important work producing goods, services, and jobs in so many uncool industries we couldn’t live without.
Maybe I’m an outlier, but I have gone on to learn algorithms, dynamic programming, database theory, client/server, and web development. I believe the elegant simplicity of BASIC and database theory, although limited in application, has provided an excellent base upon which to build.
I know that ewd is a giant to be respected, but I think it’s a red flag when a teacher mutters “practically impossible to teach”, even in jest. IMHO, that says more about the teacher than the student.
Thoughts like this are great for a laugh, but when you stop to think about it, all they really do is further amplify the perception of a huge gulf between theory and practice. Academics whine while those of us in the trenches are too busy to notice because our sleeves are rolled up while we build that which must be built.
I used to be awfully hasty in judging others, “She is really smart,” or “He is so stupid”. Then I learned alot from my first mentor. He taught that there often isn’t much difference between someone who appears smart and someone who doesn’t. Perhaps no one spent enough time with them. Maybe they have other challenges, like family, health, or circumstances. Maybe they’re just a fish out of water, spending too much time on things that don’t interest him. Or maybe they appear dumb because they actually believe that they are. They’ve been told so many times that they now believe it.
At first, he sounded like some hippie idealist. But the more we worked together, the more his teachings manifested themselves in the people we worked with. People who appeared dumb blossomed under different circumstances all the time. The were smart deep down inside where no one ever explored. (These people were mostly hourly workers who knew way more than their bosses about running the business.)
To this day, when I see phrases like, “intellectual horsepower”, I cringe. We “smarties” aren’t that much smarter than most other people, if we are at all.
And just to stay humble, remember: we’re all just one head injury from blissful ignorance.
Advantages of working at home:
1. Equipment I pick.
2. Furniture I pick.
3. Temperature I pick.
4. Lighting I pick.
5. Music I pick (without headphones!).
6. Clothing I pick (shorts in summer, sweatsuit in winter)
7. Food & drink I pick. (It's really good.)
8. Commute time = 1 minute per day.
9. No gas/car expense.
10. Almost no interruptions.
11. 6 people have my IP phone#.
12. 12 people have my cell phone#.
13. Everyone else --> email.
14. I check email when I'm ready, not them.
15. I set my task list (but still deliver as promised).
16. Can easily run errands any time.
17. Can easily do household tasks any time.
18. Much easier to schedule exercise.
19. See SO much more often.
20. 4 legged creatures make much better office mates.
21. People respect my time much more when I do visit the office.
22. Can more easily switch tasks.
23. Much easier to focus all the time.
24. I get twice as much done.
1. basic form
2. form with multi-valued lines
3. form with data set (multi-valued parent/children)
4. form with grid
5. tabbed form
6. form with skins
7. batch (loop thru something)
8. batch update selected records in a table
9. batch dump table records --> .txt or .xml file
10. batch .txt or .xml file --> update table records
11. batch file --> create & populate database table
12. cut an email
13. traverse internal tree function
14. traverse file index(es)
15. build html from parameters
16. build javascript from parameters
17. build .pdf from parameters
18. build hp esc sequences from parameters
19. benchmark a process
20. how does that syntax work?
21. which way is faster?
22. batch string parser
23. batch source code search
24. batch source code changer
I have more, but I don’t have time to find them right now. OK, I think I’ll add:
25. batch parse source code, identify routine for reuse
1. There is no position. We’re just “feeling out” the marketplace.
2. There is no position. This was a headhunter building his database.
3. We were planning to promote from within, but HR made us post the position anyway. We didn’t read or respond to any of the resumes.
4. We already had the perfect candidate, but HR made us post the position anyway. We didn’t read or respond to any of the resumes.
5. We posted the position as required by HR, but when an executive saw it on the intranet, he made us hire his son/nephew/family friend. We didn’t read or respond to any of the resumes.
6. We were planning to hire someone, but by the time the resumes started arriving, the perfect candidate presented himself. We didn’t read or respond to any of the resumes.
7. We were planning to hire someone, but the budget was cut. We didn’t read or respond to any of the resumes.
8. We got 1,200 resumes in 2 days so HR ran them through a filter with almost no correlation to potential suitability for the job. Your resume didn’t get through the filter. Next time, add buzzwords from the ad.
9. Your resume made it through the HR filter, but we only had time to read 20% of them. Yours wasn’t pretty enough.
10. Your resume didn’t stick out in a field of many that did stick out. You probably should have some kick-ass differentiator FRONT AND CENTER.
11. We read many great resumes. Yours was substandard compared to many of them for one or more of many possible reasons. Have 5 friends proofread it and give you brutally honest feedback for next time.
12. Your resume sucked but you don’t. Find 5 friends. See #10.
13. You interviewed well, but someone else absolutely kicked ass. We loved him/her. Tough break for you, I guess.
14. You didn’t interview well, but we can’t really put our finger on it and don’t have time to respond. Tough break.
15. You interviewed well and are still under consideration. But we are waiting on corporate for 27 other things. You’ll probably find another job before we get back to you.
16. You really do suck. (No you don’t. Chances are the process never got this far.)
]]>Here’s an idea: find “someone else” with a problem and work on that. This works especially well if the someone else is in business, very busy, and has some money. Chances are better that your solution to their problem won’t have much competition: if it did, they would have already gone with it.
I know this is the opposite of “scratch your own itch”, but I always found that advice overrated. I have always been much more successful scratching other people’s itches.
I have found most networking (of any kind) to be an inefficient use of my time. At most events, I always had a little voice in my head saying things like, “Instead of being here, I could be building ,” or “What could possibly come out of this discussion?” I’m also frustrated because so many events don’t have my prospects, but “people who know people who know people who may know a potential prospect of mine”.
I have taken a totally different approach. It’s really simple and maybe even counter-intuitive. Hear me out:
Be excellent. Better yet, be “very” excellent. In everything you do.
If my customer doesn’t think I’m their best vendor, then I have failed.
This applies to “everything”. In the work that I do. In the products I supply. In the fun their people have with me. In the “outside their box” thinking about every project. In the communication. In the failsafe processes of doing business (Yes, I double check that some has double checked.) In thinking 2 steps ahead of them. In being a trusted partner in that part of their business. In pristine ethics (Don’t underestimate this one; one slip neutralizes “everything else you’ve ever done”.)
When I conduct business this way, I become a magnet to those who need my services. I call this “passive networking”. I spend no time networking, no time marketing, pay no referrals, and focus completely on my customers. They know and appreciate this. When one of their colleagues mentions a concern at “their” networking meeting, their Tech Club, their restaurant, or in a discussion with their vendors and customers, they think of me. When they care about the people they know, they want the best for them. I always want to be thought of in this way. IMO, “this” is the definition of totally efficient marketing.
I know it sounds awfully old school and like a cop-out, but doing everything I can to make myself a magnet is the best thing I ever did for my business. So instead of wasting 99% of my time with strangers, I spend it directly investing 100% of it in people that already matter.
I’ve been programming commercially for 32 years and in all that time, I have found very little correlation between age and ability to deliver quality software.
I have worked with younger, inexperienced, and uneducated programmers who were willing to learn, with minds like sponges and who were a pleasure to work with. They often found or thought of things the rest of us overlooked.
I have worked with younger, inexperienced, and well educated programmers who thought they knew better and were obstacles to progress.
I have worked with older programmers with the same one year’s experience 22 times. Oy.
I have worked with older programmers with excellent domain knowledge and limited technical range. Their personality and willingness to succeed were often the key to progress.
I have worked with older programmers with excellent technical range and limited domain knowledge. Sometimes it’s hard to teach an old dog new tricks, but when you can, results can be golden.
I have worked with brilliant older programmers with extensive experience and open minds. The best of all worlds.
(By the way, I have also worked with programmers of many ethnicities, female, handicapped, gay, Republican, religious, even left-handed, and have found little or no correlation between their “description” and their “performance”. One of the beauties of programming is that the easiest way to evaluate your performance is through your work itself and not much else.)
Maybe we’re lucky in Pittsburgh, but we have the best of both worlds at the main branch of the Carnegie Library. You can take a tour of where I work 2 or 3 days per week:
http://www.clpgh.org/locations/main/tours/virtualtour/
It’s fantastic. It was built by Andrew Carnegie in 1895 and most of it is original. I get inspiration from the 20 foot ceilings and hand made ornamentation everywhere you look. They simply don’t build things like this any more. There are quiet reading rooms, large tables, plenty of light, and oh yeah, a Crazy Mocha coffee shop in the building. I use a cell phone dongle on my laptop and most people know that email is my preferred communication method.
If I need a break, I can look at priceless artifacts in the Carnegie museum through the windows in the open stacks. Or just get the world’s most disgusting hot dog at the “O” a block away. If I need inspiration, that’ll either make me or break me.
One of these days, I’d like to make the claim that some incredible technology of the 21st century was conceived in an edifice borne out of the some of the best technology of the 19th century.
“My aspirations take a higher flight. Mine be it to have contributed to the enlightenment and the joys of the mind, to the things of the spirit, to all that tends to bring into the lives of the toilers of Pittsburgh sweetness and light. I hold this the noblest possible use of wealth.” - Andrew Carnegie at the Dedication of Carnegie Library of Pittsburgh, November 5, 1895.