Wednesday, June 27, 2007

Noogler, Day 3: Juggling Eggs, Technical Talks, and a Method and Apparatus For Remembering What's Going On

On the wall of my office is written in grease pen: "Juggling priceless eggs in variable gravity." This is a phrase used by programmers to talk about the state we're in when we're at our best. We hold a lot of information in our heads while we're coding: the structure of the program, the information it's holding, what parts have been written and what hasn't, and lots of other detail about the program. It's far, far too much to hold in our heads throughout the day. Instead, we remember the basic structure, and pick up the rest every time we sit down at our editors. I'm simplifying things a bit here, but that's the basics of it.

The thing is, keeping all this information in our heads is a delicate thing. Any distraction, and it all comes crashing down, and the programmer is robbed of precious time to get it all back in our heads again. (I'm slow in this regard; it takes me up to an hour or so. Fifteen minutes to a half hour is more common.) We borrowed the phrase about juggling eggs from the novel The Mote in God's Eye to describe this.

I read a book about managing programmers (or as some call it, "herding cats") recently, called Peopleware. It refers to this concept as "flow". If the flow is broken, then the company is then paying for a programmer to spend time just regaining that flow. (This isn't exclusive to programmers, of course. I see the same phenomenon in chess players, and other disciplines probably have similar situations.)

It's therefore quite important to build an environment that maintains flow. This is one of the reasons that kitchenettes are everywhere. If a programmer starts getting distracted because he's hungry, then the company starts paying for an unproductive programmer. Keeping a bowl of apples conveniently around, so the programmer could grab a bite when he went into his office in the first place (presumably, he was feeling peckish on his way in), is much cheaper than paying some percentage of your programmers to be unproductive because they're too distracted to maintain flow, but not so hungry that they feel the need to leave. This works well, because 100% of programmers have to eat.

Another thing that programmers do is talk shop. They talk about their projects, ideas, possible directions, cool technical tricks. When they're talking to other programmers, they'll bounce ideas off of each other and get lots of good ideas. But even if they're just talking to a rubber duck, the programmer doing the talking will often get ideas just by the simple act of talking about the problem. (I keep a number of rubber ducks around for this reason.) In my experience, a chat between a couple of co-workers in the halls is infinitely more productive than a formal meeting, not to mention more fun. Programmers will talk shop whenever there's an opportunity... particularly when they're with other programmers.

Programmers, like all people, need recreation. A programmer who isn't taking time for recreation burns out, and a burnt-out programmer is worth much, much less than a happy programmer. (This is a big problem I have with EA: they burn out their programmers, who are usually fresh out of college and don't know better. They're effectively strip-mining our young minds.)

These two activities are not mutually exclusive. Talking shop while playing is not a problem, as long as it's friendly and playful talk instead of a directed activity. This sort of friendly talk can be highly productive, though. Now, this is just my thinking, but I think that Google recognizes this. They want to encourage programmers to talk to other programmers. They also recognize the need for recreation. They provide recreation because, they figure, the programmers are going to take time to play ping-pong. They may as well do it with another programmer, and it's quite likely they'll get new ideas talking to their opponent between volleys.

Now, this sounds borderline exploitative, but personally I think it's a win-win. Everybody talks about all the perks around campus, and how it's fun to work there because of them. The fact that it's also helpful to Google's productivity is, for the programmers, just a convenient side effect.

Okay, enough rambling. I didn't sleep well at all last night, I'm afraid, and was pretty sluggish getting ready. I ended up cutting the time pretty close, so I grabbed a croissant from Jack-in-the-Box to eat on the way in. It may not be great food, or healthy, but it's faster than trying to find and eat something before my class, at least until I'm more familiar with the food options at the Googleplex.

Today's classes were the first technical talks they gave, when they presented an overview of some of the Google architectures. While interesting, these ran over— until about 13:00, so that's the first time I was able to check my email. My office-mate Karl was there, and he talked to me about some of the work he was doing. As part of this, he went over the architecture of the systems our team deals with. It was the same area that one of my classes went over, but more in-depth, and one-on-one.

After that, I went to find some lunch. They were having a benefits fair at the time, and on my way to lunch I passed through a cholesterol testing station. I haven't checked my cholesterol since I lost the weight, so I figured it was a good idea. My total count was a little higher than I'd like, and my HDLs were a fair bit lower than I'd like. Without a fasting test, I didn't get LDLs or triglycerides, and I also wanted an ALT and metabolic test, so I intend to get these at my regular doctor's lab next week when I have time to go in for a fasting test before work.

While I was getting the cholesterol test, though, the cafeteria closed. Another sandwich; some food I've had these weeks, for the place with such legendary food. Mind you, the sandwiches are quite good... the ingredients are high-quality and fresh, like they were made at home. There's a variety of breads and sauces (such as the grain mustard I had), and the vegetables are fresh and crisp. I like that there's red-leaf lettuce on the sandwich bar; it makes for a good nutrient mix. There's also panini grills, although I haven't used them yet.

After supper, I went to work on my to-do list. I've been feeling pretty annoyed; I've been putting in 10-12 hours / day at the office, but still feel like I haven't been getting anything done. Then again, what I want to get done is to learn, and when I think about how much I've learned so far about the system structure, I'm happy. I guess I'm a little frustrated that, while I've been learning quite a lot, I haven't been getting a lot of more practical things done, like setting up the source control system. Still, that'll come.

I use a program called Life Balance to help me organize my to-dos. It's great... I can feed it a hierarchy of things to do, along with deadlines, importance, and where I can do things. For example, I can write a task of building a shelf. Within that, I can give it a few more subtasks: (1) buying lumber: minimal effort, essential, can be done while running errands; (2) staining the shelf: moderate effort, not as important, must be done at home; and (3) assembling the shelf: considerable effort, essential, must be done at home. I can also tell Life Balance that these subtasks must be done in order, that I want the shelf done by Sunday, and to give me three days' lead time.

Then, at any given time, I can ask the computer what my pending tasks are, based on my current location and time of day (since I can't run errands in the middle of the night). It will give me a list of outstanding tasks, automatically filtered and ordered.

Right now, my task list contains 350 items. Of these, 237 are work tasks, which are spread out over the next few months. The remaining 113 are personal tasks, including things like getting groceries (which repeats every week), books I want to read, programs to write, furniture to assemble, bills to pay, etc. This is also synced with my Palm Pilot, and I can do everything from it that I can from my computer (although it's much easier to enter tasks from the keyboard than using Graffiti).

It's a great program, and I highly recommend it. Really, if I didn't have the list, I'd be lost in all the things I have to set up and learn about, from my 401(k) to my team's computing infrastructure. I still feel like I haven't gotten anything done, but at least I know what I need to do.

I also joined a general brainstorming meeting with my team. It's not common for me to be in a meeting where computer theory that I don't know comes into play, but that's exactly what happened. I stayed pretty quiet, but threw out a few ideas, and have some notes on items I want to follow up with people on one-on-one.

After the meeting, I went to get some supper. Finally, I get a meal when Charlie's is open! Lamb tandoori, jasmine rice, and a green salad made for a nice meal. Before I ate, I had called Scott and Matt, and we decided to move the compiler discussion from Wednesdays to Sundays. That gave me a bit more time to enjoy my meal and get back to the computer.

Overall, I'm glad to be getting into the technical details, but I can't shake the feeling that I'm behind where I should be. Juniper has always had a similar feeling to new hires. People would come to me, and say that they felt so far behind, and were SURE they were about to be fired that week! I've had a fair number of times reassuring people that no, it's okay, everybody feels like that for their first several months at Juniper, and they're certainly not about to get fired.

I don't feel like I'm a burden (or at least, no more than is expected at this point), and certainly don't feel that I'm going to get fired, but I do feel like I'm behind where I should be in my training.

Well, it's only been three days. We'll see how the next couple of days treat me. At least I did get out relatively early today: just about half past nine.

No comments: