+===============================+ | > | | | | | | | | | | | | | | | | | | | +===============================+
Very fast. Let me explain.
I work in 2 modes: (A) At the computer and (B) Away from the computer.
When I’m in Mode A at the computer, I’m cranking out lines of code, testing, revising, testing, revising, etc. This process must be very fast. Several hundred lines of code (or whatever) in less than an hour. A complete cycle in less than a couple of hours. My guideline is that if I’m not working that fast, then I must not be prepared to work that fast, so I don’t deserve to be at the computer. I should be in mode (B).
Mode B is generally much slower. Reviewing code, specs, or notes. Refactoring code. Laying things out with pen and paper. When I have enough work clearly laid out, I know it’s time to get back to the computer and return to Mode A.
The most important thing for me in Mode A is to see results, any results, quickly and often. It doesn’t matter how correct anything is, just as long as it’s progress (or sometimes, reverse progress). I like to think of programming as making incremental progress in micro jumps, evaluate where I’m at, and go for the next micro jump.
Some of the best advice I ever got was from a prolific artist friend of mine who claimed, “I paint every day.” So I started coding every day. But that wasn’t enough. Now I make progress every day.
There are many definitions of progress. Sometimes I copy a few hundred lines of code, make a few changes, spit out a new app, and then start applying micro changes. Other times I decide that I need to see today and find a way to get there. Things don’t always work out as planned, but that’s OK. As long as tomorrow’s starting point is beyond today’s, I’m satisfied.
That’s my definition of fast. Not sure that was what you were asking, but I hope that paints you an accurate picture.
“In addition to the usual work-day schedule, I expect all of the members of the group to work evenings and weekends. You will find that this is the norm here at Caltech.”
Then you’re doing it wrong at Caltech.
We are often quick to assume that MoreHoursWorked = MoreWorkGettingDone. This is true up to a point, but false beyond that point. Personally, I believe that evenings and weekends are usually beyond that point.
I used to work 90 hours per week. But when I decided that I needed to get more done, I started working 60 hours per week. Results per hour and quality of results have both improved dramatically, so I’ll never go back. And I would never work for anyone who doesn’t understand this.
This reminds me of my first partner in our software/consulting service business. He was absolutely fearless.
We would always arrive at appointments very early so he had an excuse to “poke around”. He’d ask anybody, the receptionist, someone in the breakroom, even the janitor. He’d see what was going on in the parking lot, the loading dock, even in the warehouse or factory. Seeing him in a business for the first time was like watching a kid in a candy store.
In our first meeting, he always knew something about the client’s business that they didn’t. He’d say things like, “Automating the inventory won’t help if Fred and Jean are counting 2 different things.” This always led to interesting discussion and often, follow-up business.
Once he even spent a week of his own time on third shift, going over procedures and reports with factory supervisors. They didn’t know who he was; they just figured someone from the main office sent him. He did a complete analysis in Excel which we used in a proposal. That got us hundreds of thousands of dollars worth of work.
I often challenged him, “You can’t just do that,” I would say. To which he would respond, “These people need help and don’t even realize it. We have to find a way to show them.” Then the inevitable, “It’s better to beg for forgiveness than ask for permission.”
Looking back, it didn’t always work. It pissed off some people and burnt those bridges. But when it did work, we often concluded that nothing else would have.
I learned a lot in those days. I’m still not as fearless as my partner was, but I’d like to think I’m getting there. Thanks for the memories.
- I impose discipline upon others. Since you can’t just poke your head in with an “idea”, you have to think about it first (imagine that). If your email doesn’t include enough data for me, I say so and hit “reply”. Same for phone calls and voice mails. Signal to noise ratio increases dramatically.
- My performance metric is WorkCompleted / WorkPlanned because that’s all people can witness. Not 101 other meaningless metrics like number of sessions running, time spent on internet, time spent BSing, time spent on cell phone, time spent at lunch, shirt color, or droplets of sweat on forehead.
- Wake up at xx:34 a.m. Start work at xx:37 a.m. (if I want to).
- Wake up in the middle of the night with an idea. Log in and work on it immediately.
- No meaningless team building, HR, or mandatory meetings.
- I eat what I want, when I want, where I want. No more vending machine or carryout crap.
- Headphones or speakers? Oh wait, never mind.
- Casual dress, gym shorts, or warmups. Again, never mind.
- Cats often make better companions than cubicle mates.
- I hate shaving.
My single biggest secret for continuing to get things done, often working 12 hour days and 6 day weeks, is to love what I do.
I do not think of it as “work”, as something to “get through”, or as something difficult, unusual, “overload”, or temporary. Quite simply, I sit at my computer 12 hours per day, every day, because “I want to”, I love what I do, and I can’t imagine doing anything else. I have been working like this for years.
In fact, I feel sorry for anyone else who doesn’t feel this way. What a sad life to be spending so much time doing something that you have to force yourself to do.
Some of the things I have arranged in my life to enable me to do what I love:
I eat well. It’s a great idea no matter what your circumstances are.
I also exercise regularly, 20 minutes, 3 to 6 times per week. I mix it up and only do things I love: 5 rites, pushups & pullups, jogging, swimming, heavyhands, shovelglove, bodyweight exercises, and even a day or 2 at the gym on their machines.
Breakfast at my desk, lunch away from my desk, dinner and Jeopardy with my SO every night without exception.
At least one date night per week, with an extra beer or two just in case it’s a chick flick.
I never text, tweet, blog, IM, or facebook. I do respond to voicemail and email regularly. Everyone I know understands this.
Ipod, radio, and 3 cats keep me company.
I like to work in 48 minute bursts, with a 12 minute break each hour for email, internet, snack, or anything else.
1. Start with the answer, then work back.
2. Name your variables so that anyone will know what they are.
3. Name your functions so that anyone will know what they do.
4. Never write the same line of code twice. Use functions.
5. Assume the user doesn't know what they want.
6. Even if the user knows what they want, assume they can't verbalize it.
7. The user always knows what they don't like. Prototype often.
8. Be prepared to dig down as many levels of detail as needed to understand.
9. When you're stuck, turn off your computer.
10. Don't turn your computer on until you have a specific task.
11. Beauty is important, but delivery is more important.
12. No variable should be fully contained within another variable.
13. All variables should be at least 3 characters long.
14. Use the right tool for the right job.
15. Almost any tool can do the job. Some are better than others.
16. Benchmark often in order to learn what happens under the hood.
17. Try something that's never been done. It may be easier than you thought.
18. Remember the patterns you've used before. You'll use them again.
19. Keep it extremely simple at first. Complexify as you go.
20. Code every day.
The most important is the dedicated space with a door that closes. So you still “go to work”, just with a very short commute. A few other things that I have found helpful:
- When you're in your office, you're at work, working.
- When you're not in your office, you're at home, not working.
- Work in 48 minute bursts, then take a break.
- Only check email & voice mail during your 12 minutes off.
- Put internet and work on 2 different machines (if possible).
- I prefer radio over pre-recorded music; it reminds me I'm not alone.
- Eat lunch out with a friend several times per week.
- Eat home meals away from your office.
- If you're local, go in to the office once per week.
- If you're not local, go to the office several days per month.
- Dinner with SO every night, no matter what you're working on.
- A regular schedule of sleep, meals, exercise, and work makes things easier.
This reminds me of my hero of project management, Tom DeMarco.
His approach was that every task is either 100% complete or 0% complete.
No task is ever “80%” complete. If you really think that it is, then break it down into smaller tasks, 80% of which are 100% complete and 20% of which are 0% complete. This way it becomes much clearer what is complete and what remains to be done.
I have never allowed anyone to report anything as n% complete for values other than 0 or 100. As soon as someone does, that’s a pretty good sign that they may be confusing motion with action.
Remember an old discussion with Jim…
Me: Jim, how are we doing with getting Ansys ported?
Jim: Great, I have a bunch of calls into them.
Me: How are we doing on the Nastran port?
Jim: Wonderful, they said they'll get back to me next month.
Me: How about Dyna 3D?
Jim: It's going great, we're on their list.
Now imagine how much different that conversation would be if each question started with, “Which tasks are complete and which tasks are incomplete?”
Pen and paper.
This is a hard and fast rule that I have always followed and is absolutely critical to my success. Just a few of the reasons:
1. I firmly believe that analysis, design, and planning is much more effective if it is done “away” from the computer. These are totally different activities from programming and they take a different mindset and environment. That’s pretty tough to do if you use computerized tools to organize.
2. I like to spread out my notes, plans, diagrams, lists, etc. on a table to work on them. I also tack them up on the wall above my work space, both at the computer and in the other room. I want to give my mind every opportunity to see the “big picture” when it’s appropriate. Again, tough to do with a computer unless you have
3. I carry my notes with me whereever I go. You never know when inspriration will hit, and I don’t want to carry a laptop everywhere and wait for it to boot up.
4. Bedtime is critical thinking time (both at night and in the morning). I always have my notes and multiple colored pens with me in bed. Some of my best ideas have come at this time. I can’t imagine the same thing happening with a laptop.