Last weekend was bike-tacular in two ways: I scored my first podium finish in a cross-country bike race, and also spent all of Saturday night on a bike.
Let me 'splain.
Last Saturday was the "First Annual Duthie Hill Dash", a race which took place [appropriately enough] at Duthie Hill Mountain Bike Park, an awesome new bike park that just opened up 30 mins from downtown Seattle. Duthie has a little something for everybody: cross-country trails, "flow" trails with lots of jumps and obstacles, ladders, bridges etc. [This video gives you an idea of the variety of terrain and grin-inducing potential of Duthie.] Before the race, I'd only been there a couple of times before, as part of a class some P529 folks and I took with Simon Lawton, where we spent a bunch of time doing the fast, downhill-y bits over and over again, which ended up coming in pretty handy in the race.
The race course started with a short climb up a gravel road before taking a sharp right turn into single-track; I started off relatively slowly at first because I didn't want to blow up at once, but when it became clear that everybody else was taking it easy too, I decided to get the holeshot into the singletrack and see whether I could clear off. That proved to be a key move for me, because the first bit of singletrack was a downhill section that I railed through fast enough to put a reasonable bit of daylight between me and the rest of the folks in my race. That advantage was further compounded by soon catching up with the folks in the back of the race class that had started before us, and passing them, so I had some "blockers" further slowing down the people behind me. The advantage I pulled out of that first bit was enough to avoid getting caught on the next uphill section, and then there was another downhill section that allowed me to gain some time, and so it went. Of course, it wasn't entirely smooth sailing -- during one climb, a few people caught me and I just let them pass, but overall I was able to hold on to most of my early advantage.
However, there was no rest for the weary [ie: me] because I'd also signed up to ride in the 2nd annual "9-to-5 Solstice Scavenger Hunt" which was also on Saturday, an all-night event that ran from 9pm to 5am. I did this with 14 other members of the Project 529 crew -- we felt we were honor-bound to compete given our team's tagline of "We work 9-to-5 so we can ride 5-to-9". We split up into 3 teams: the cross-country team [which I was on], the downhill team, and a "Girl Power" team consisting of all the P529 ladies, and off we went. Notable bits of the night include:
- Spending an hour looking for a friggin' statue of a man on horseback near the Woodland Park Zoo, and failing miserably. Oh, and if you were wondering, riding through Woodland Park at night, by yourself, is pretty creepy. - Riding out to West Seattle. As it turns out, that's friggin' far away. From anywhere. - Periodically coming across other teams also participating in the scavenger hunt; it was strangely bracing to see other people on bikes at 3am engaging in the same insanity - Trying to look inconspicuous while prying up road turtles [those little reflector/lane boundary markers] - Deciding whether we wanted a grave rubbing badly enough to climb over a cemetery fence topped with barbed wire. Additional disincentive: the fence looked like it was designed to keep people [or things] in the cemetery, rather than keep people out. We ended up wussing out on that one. - Hearing about the guy sleeping in a dumpster next to Krispy Kreme who was getting extremely pissed off because people kept disturbing his sleep by opening up his dumpster looking for a Krispy Kreme cup [which was one of the items we were supposed to get].
Final statistics: about 35 miles covered, and 218 points accumulated, which put us 10th out of 23 teams. The downhill team came in 5th and the P529 ladies came in 15th. Overall, a lot of fun, and definitely something I'd do again.
When Xander wakes up, he usually comes upstairs to terrorize us into getting up and then we coax him into climbing into our bed so we can try to eke out a few more minutes of sleep. Of course, as anybody who has ever shared a bed with a 4-year old who is ready to get up knows, this produces unsatisfactory results for everybody -- Xander squirms, taps on the wall, talks to himself, digs his elbows into the tender bits of our anatomy etc until one of us can't stand it anymore and gets up.
A couple of days ago, Xander apparently decided that he was tired of trying to get us out of bed, and so he brought the fight to the enemy, so to speak. He walked into our bedroom at 6am carrying a loaf of bread, a jar of peanut butter, and jam, set them on our bedside table and announced that he was hungry and was going to make himself a PBJ sandwich. My first instinct was to tell him to take it all back to the kitchen, but then I figured that our bedroom was in such a shambles anyway that a few breadcrumbs wouldn't make a difference, so I sent him back downstairs for a knife to spread the peanut butter with. He then proceeded to make himself a PBJ sandwich, and insisted on making one for me and Christina too, so we all started off the day with breakfast in bed.
Now we just have to train him to make tea, eggs, and bacon and we'll be all set.
After a relatively mechanical-free rookie season, I'm now having the unavoidable bike-falling-apart season. Those of you who have been paying attention may remember that it started with losing one of the bolts holding my rear suspension at the Black Diamond race, an incident that could reasonably have been expected to lead me to check that all the other bolts on my bike were tight. And I thought I did so, but apparently I lack a bit of attention to detail, as shown by the fact that a couple of weeks ago I lost one of the bolts holding in my rear brake and one of my cranks came off. However, this last incident did lead me to consider that learning about all the bolts on my bike by dint of having them fall out was probably a rather painful way to go about things, so I did take half an hour last week to meticulously tighten everything I could find.
Given the incredible mechanical diligence I displayed by spending a whole 30 minutes on it, it's fair to say that I felt ill-rewarded when 20 minutes into a Saturday ride at Soaring Eagle my left crank came off once again. A bit of cursing later, the cause became clear: the threads in the crank were stripped, and no amount of tightening would help put this particular assembly of bits together again. This was all the more distressing because I needed a bike for the Steilacoom race, which was the following day. However, a quick phone call and a bit of hike-a-bike later, I was on my way to Raman's place to see whether my bike was fixable or whether we should finish putting together the Blur LT I'd started to build up the weekend before.
Given the choice between trying to fix up a slightly beat-up older bike and putting the finishing touches on a shiny new one, it was pretty clear which way to go, with the end result being this purty lil' thang:
So, equipped with a sweet new ride I headed down to the BuDu race at Fort Steilacoom. However, the bike wasn't quite complete yet; it still needed a touch of personalization, which was supplied in the form of this little custom sticker:
[Back story: Paul Midgen, one of the Project 529 folks, claims I look like this guy, and the name has stuck. As nicknames go, it could be worse. After all, who doesn't want to be The Man Your Man Could Smell Like ?]
... which brings us to the actual race. My plan was to stick with a guy I'll call Cowbell, since he has a little cowbell attached to his bike. At the Soaring Eagle race, I managed to keep him behind me for about a lap and a half until he got by me on a climb and disappeared. He ended up finishing 4th, so I figured sticking with him would allow me to get to that elusive mid-pack finish I've been aiming for this season.
That plan lasted until about 5 minutes into the race, which was when we hit the first steep climb. When the course goes uphill, my race goes dowhill, and so he cleared out and I lost sight of him. However, I did fixate on a couple of other folks in front of me and managed to mostly stick with them until the last climb on the course just broke me and I had to resort to a bit of pushing the bike uphill. The end result was a 6th place, out of 8. Not great, but at least I managed to not just totally lose touch with the folks in front of me, so overall I count it as reasonable progress. And the new bike was awesome -- while it's a little heavier than my Blur, it's much more planted on downhill bits, and so I could just let it roll and not worry about taking a tumble. [Well, I did take a dirt sample on the last downhill bit of the course -- there was a washed-out, sandy bit right before a sharp right turn.] The course itself was pretty fun [once you take out the uphill bits ...], with some nice bits of singletrack and some up-and-down through meadows. I also vaguely seem to recall seeing a lake off to the side somewhere through the tunnel vision induced by the acute cardiovascular stress I was experiencing.
After my race, I hung around to watch the rest of the Project 529 crew start the Sport race and then headed home.
Next up: Soaring Eagle, next weekend. Maybe I'll have the other bike put together again by then.
As I mentioned earlier, I started mountain biking a lot last year, and even did some races. Last Sunday was supposed to be the start of the racing season for me this year, with a race at at Black Diamond organized by Budu Racing. The plan was to go race in the Beginner class and finish in the middle of the pack, instead near the end, which is how things went last year. The airtight reasoning that led me to this plan was the fact that, on the basis of no hard evidence whatsoever, I figured I was in better shape than last year, and that this would automatically translate into better results.
Of course, I forgot the cardinal rule of competition: it never goes the way you think it will. That’s always been the case for me, whether it’s been motorcycle racing or taekwondo tournaments. And this time was no different.
The day started out promisingly enough – I’d gotten a good night’s sleep, got there early and registered without an incident, and found my friend James, who was also going to race in the Beginner class. Since we still had a while before the race started, we headed out to pre-ride the course.
Halfway through the pre-ride, I noticed that something wasn’t quite right with my bike – each time I pedaled hard, I could feel something give, as if my rear wheel or drive train was moving. After limping back to the starting point, it became clear what the problem was: I’d lost one of the bolts of my rear suspension, so it was flopping around. At this point, it was 15 minutes to the beginning of the race, so I went running around asking anybody who also had a Santa Cruz bike whether they had a spare bolt.
Predictably, nobody did, so I swore a bit, wished James good luck in the race, packed up my bike, and headed home. Halfway home, though, I realized that I might have a spare bolt at home, and that if I made it home and back in time I could still race in the Sport class, which didn’t start for another couple of hours. 30 mins of fast driving and some frantic digging through my spare parts bin later, it became clear that I didn’t actually have a spare bolt. Crap. At this point, though, I was determined to race no matter what, so I texted James to ask whether I could borrow the bolt from his bike [since he also has a Santa Cruz]. Luckily, James was still at the race and agreed to lend me the bolt, so I raced back down. … but it still wasn’t quite that easy. It turned out that the bolt from his bike didn’t quite fit, so he generously offered to let me ride his bike for the race.
In the meantime, two other folks from the Project 529 crew, Nate and Sergei, had also shown up, so we headed out for another bit of riding to warm up before the race. However, halfway through that pre-ride, we realized that we’d better high-tail it back to the start if we didn’t want to miss the start of the race. A brief bit of hectic pedaling and cutting through roped-off trails later, we arrived back at the start with a few minutes to spare.
It's worth digressing a moment to explain the difference between the Sport and Beginner classes: the Beginner race was 2 laps, and supposed to last about 40 minutes. The Sport race was 4 laps, and expected to take about an hour. So, Sport: twice as long, and faster. Given that I'd already ridden two laps of the course, was on an unfamiliar [and heavier] bike, and was previously just aiming for middle-of-the-pack in the Beginner class, it's fair to say that my expectations were not high. I was basically just racing because, well, I'm pig-headed and determined to ride in a race, any race, that day. My stretch goal was to not finish last.
In any case, we lined up, fidgeted a bit and ... we were off. The course was a mix of different types of terrain: it started out fairly technical with lots of baby heads and a couple of steep but short climbs, transitioned into some flowy singletrack, then went back to being very bumpy but with no elevation changes. All in all, a pretty fun course.
For the first half of the first lap, we were pretty bunched up -- there were a couple of pileups as people fell in the tricky sections, we'd stretch out a bit on the easier sections and then accordion together again as the going got tough and people in front slowed everybody down. I stayed in touch with the middle group for the first lap, but by the start of the second lap had lost them, and from then on it was a pretty lonely race -- there was nobody close enough behind me to make me really work hard, and I couldn't see anybody in front of me that would have spurred me to try to catch up. So I just pedaled around trying to keep up a decent pace. By the end of the second lap, I was hurting pretty badly; by the middle of the third lap, I was wondering whether I had another lap in me. Thankfully, I was put out of my misery shortly thereafter, as the two leaders came by and lapped me, so that my race was over after 3 laps.
End result: 15th out of 18. So, goal achieved, but not exactly something to write home about.
Let's hope the next race in a couple of weeks goes according to plan, for some value of "plan".
After 3+ fun years working on Live Mesh and associated technologies, I decided it was time to go work on something a little different. In particular, I went looking for a job that allowed me to focus full-time on building technology related to data mining and machine learning. And I’m happy to say that I found a lot of interesting work being done in those areas, across multiple divisions in Microsoft.
Unfortunately, there’s only one of me, and so I had to choose a single position [this is one instance where something similar to the vaunted Google “20% time” would have been nice …]. I ended up picking a development manager role in our adCenter group, to run a team that builds the infrastructure necessary to run all the machine learning and data mining algorithms that we use to optimize the paid search ads that we show, as well as the feedback we give to advertisers to help them optimize their campaigns.
While I’m just starting to understand the space, it’s already pretty clear that this is going to be a ton of fun, since it involves both extreme scale [billions of possible ads that can be displayed, thousands of requests per sec, terabytes of data per day that need to be analyzed], very strict performance requirements [ads need to be selected in a few milliseconds], and a continuously-learning system that gets better the more data it sees. And on a less-technical note, the recently-approved Yahoo-Microsoft deal is going to make this an exciting place to be for the next few years.
One of the tricky bits about being a lead is finding the time to keep writing code yourself – with the transition to managing people, your world changes a lot. That’s true even if you’re in an organizational structure expressly set up to allow development leads plenty of time to write code – you’re responsible for more “stuff”, and the time you spend on the not-writing-code work items is generally quadratic in terms of number of items, not linear. This is problematic because it’s very easy to get divorced from the reality of the source code trenches if you’re not checking in, or reading and having to modify other people’s code, on a regular basis. Such a lack of full context, in turn, makes it harder to do your job well, because you don’t really know how that feature works, or what the current health of the codebase is, or how your bits are going to get deployed etc. And then you run the danger of making a decision with long-term ramifications based on incomplete or incorrect information, and it comes back to bite you in the posterior 5 months later, when you’ve lost all context about why you made that decision. Or you start making statements that so obviously highlight that you’re out of touch that people start to flip the “pointy-haired clueless manager” bit on you.
Ok, so you try to keep writing code. But what sort of stuff should you really sign up for ? You shouldn’t promise to deliver a complex feature that lots of other features depend on because you don’t really have the time to implement it properly, with a clean design, high performance, unit tests, stress tests etc. And then you’ll deliver something half-baked and other people will have to fix your mess, and that’s not going to do anything for your reputation as a good engineer. And it’s not so great for your performance review either …
[Note: I’m assuming here, for the sake of discussion, that you choose to work sane hours. You can always find time to keep writing lots of code if you’re willing to spend lots of time at night doing so …]
Well, gentle reader, I believe I have part of the answer, at least if you’re working on something Internet service-y: sign up to write the live-site troubleshooting, “Is it healthy ?”-type monitoring and usage analysis tools for your service.
Work of that nature has several features that make it a good fit. First, having to write tests that check whether a service is working will force you to understand what the thing you’re testing is supposed to do [giving you a better understanding of the features that your team of programming elves has been busy cranking out], and will also give you direct insight into how well it actually is working, which serves as good way to check whether your team is checking in solid code or not. Second, it’s work that nobody usually wants to do, so there’s not a whole lot of contention – monitoring tools aren’t nearly as sexy as user-visible features. Also, these sorts of tools [generally] don’t have to be ready at the same time as the product, so there’s less schedule pressure to get them done. This lack of schedule pressure fits in nicely with the fact that, as a lead, the best you can generally do in terms of estimating how long it’ll take you to finish a given piece of code is to provide the calendar year in which you think you’ll finish. And, last but not least, doing logfile analysis helps you see how your service is being used, which is useful context to have when you’re deciding what features to add, how to modify existing features, which features to de-emphasize etc, and will help you drive product direction.
I can’t claim to have thought up this scheme all by myself. Rather, I happened to do this sort of work on a couple of projects, and it worked out well both times, which made me realize that I might have stumbled onto a pattern worth thinking about a bit more to see whether it could be generalized. I believe it can, so that’s my plan, and I’m sticking to it.
On the theory that stating a goal publicly will act as a goad to spur me to action, here is a list of things I'd like to accomplish in 2010:
- Take more pictures: Christina is the de facto photographer for all family occasions, but this also means that she's hardly ever in a picture. That's at least partially because I don't like using her camera -- I find it too bulky, and it takes too long to get all the settings just right. So, my plan is to get a small point-and-shoot camera that I can carry along to lots of places, and start contributing to our digital treasure-trove of memories. This leads right into the next goal:
- Organize the pictures we have: we've got thousands of pictures scattered over various hard drives and as prints strewn through our [thoroughly disorganized] closets. I want to send off all the prints to get scanned, and, together with the already-digital ones, consolidate and tag them in some coherent fashion.
- Get a reasonable music setup: our "stereo system" currently consists of a set of $30 computer speakers hooked up to a laptop sitting on a kitchen counter streaming Pandora -- as you can imagine, the sound quality is stellar. And if you want to listen to music, you have to be in the kitchen. I've gotten as far as getting most of our ripped CDs accessible via our Windows Home Server, but it's probably time to consider something like Windows Media Center and/or Sonos.
- Get decent sets of basic household items: Christina and I are the queen and king of hand-me-downs. We didn't buy a real couch until last year [a white leather couch, which the dog promptly got on with red paint on its paws ...], and the breakthrough kitchen gift from me to Christina this year was a set of Henckel knives [which she's cut herself with a lot, because she's not used to knives actually being sharp]. Our linen situation is a disaster -- we have one set of sheets that fits our bed properly and another set that fits if you stretch it really, really tight [it's sort of like sleeping on a drum] and then a bunch of sheets that must all be at least 10 years old, and fit nothing we have. Our cutlery and dishes are a hodge-podge of one-off Ikea purchases, dishes we got when we were married, some stuff we got from Christina's mum and stuff that we acquired from the neighborhoood equivalent of Craiglist. It's high time to get past this bit of the college student lifestyle.
- Make some progress on home improvement: before, and for a few months after we moved into our house, we had a lot renovations done. However, since then we haven't done anything to the house, and there's still oodles of stuff to do, as you'd expect from a house built in 1905 whose previous owner didn't let the fact that he was a crappy handyman stop him from being, well, handy. [Exhibit A: the attic extension that he built, a structure that still makes Christina angry every time she looks at it.] There's some stuff that I'll let professionals do [like putting down carpet in our attic] and some stuff that I want to do myself, or at least help out on, namely all the stuff that involves destruction: taking off the decks, and taking off the siding on the south side of the house.
- Be hosts more often: we go through spurts of hospitality [ie inviting people over for dinner] interspersed with long periods when dinner consists of just Christina and me trying to trick persuade Xander into eating his food. The goal for this year: have somebody over for dinner once a month.
- Do more cross-country mountain bike races: last year I only did 3 Indie series races; this year, I'd like to do 6. And instead of finishing at the back of the pack, I'd like to finish in the middle. This will presumably require working on my endurance, something I've always hated. Time to try moving past hate to strong dislike, I suppose.
- Go on an "epic" ride: Per the ever-informative Evergreen Mountain Bike Alliance site, "Debate has raged for years on what rides qualify as epic rides. Criteria mentioned include being far from civilization, high mileage (e.g. over 20 miles), high percentage of single track trail, substantial amounts of elevation gain, taking most or all of a day to complete, great views, beautiful nature." So far, the longest ride I've been on was about 3 hours, and I'd love to do an all-day one.
- Write some code just for fun: I'd like to expand my horizons and get some hands-on familiarity with non-MS languages, environments and/or systems for a personal project. In particular, becoming fluent in Python would be nice, and Hadoop, Lucene, and Mahout all look pretty interesting in terms of learning more about data processing/mining/analysis [but are all implemented in Java, unfortunately, so I may end up learning Java instead of Python ...].
Despite [or maybe beause of] my dismal blogging track record this year, I figured it was worth trying to put together a recap of 2009. At this point, I suspect it's primarily for myself, because anybody who might have been reading this blog likely gave up on it a while ago.
So, in rough chronological order:
I got into mountain biking in a big way this year, starting out on a bike first borrowed and then bought from my friend J. My first trail ride was a night ride at St.Edwards State Park and I was hooked -- riding around at night in a forest, with a headlamp, over slippery mud, roots and rocks, was a total blast. I ended up joining a group of folks that ride every Thursday night, rain or shine, pretty much throughout the year, and actually even did a few cross-country races in the Indie Series, as part of the Project 529 cross-country race team. It was after the first of two laps in my first race, when my lungs were ready to burst, that I realized "Hold on a second, this is an endurance sport, and I don't do endurance sports" ... In any case, my goal as far as the races went was "just don't finish last", and I'm glad to say that I achieved it, even though there was one race that almost killed me -- I was ready to quit 3/4 of the way through the first lap, and had to have a serious "Dude, don't be a wimp" internal conversation in order to make myself do the second lap.
I also got a chance to do some downhill mountain biking at the Whistler Mountain Bike Park, and that is much more my speed -- very little pedaling, and just going as fast as you dare to go. Check out the video below to get a taste of what my favorite trail, "Crank It Up", is like:
I think it's safe to say I'll be doing a lot more of this in the future ...
On the subject of two wheels, I also sold my motorcycle -- I just wasn't riding it enough, and, besides, I needed money to pay for the mountain bike [which is also bright yellow ...]
Xander turned 3 in August, and shortly thereafter started "official" preschool, at Giddens. We considered sending him to a Waldorf school, but we thought Xander's "energetic" nature might be a bit at odds with the calm, peaceful classrooms we saw when we visited the nearby Waldorf school. In other words, we thought that loosening Xander upon them might be a bit like letting Vikings loose on an unsuspecting hippie commune -- visions of burning buildings, sacked ruins and weeping women came to mind. Giddens also has the advantage that it's literally right across the street [useful for punctuality-challenged parents], and a couple of Xander's playmates from the neighborhood also go there. So far, we've been pretty happy with it. We've even had our first "parent-teacher conference", complete with an evaluation of Xander, which resulted in some head-shaking on our part -- the evaluation form claimed that they wanted to work on his climbing, hopping and jumping abilities, which is patent nonsense. Anybody who has seen this child on a playground can attest that his gross motor skills are about equivalent to those of a 3-year old monkey ie pretty damn good.
In general, Xander has turned into a very funny, if often very obstinate, little man. He's been announcing his career aspirations a lot recently, and they mostly revolve around driving various types of trucks, but my favorite so far was his announcement a couple of weeks ago to the effect that "When I get big, I'm going to drink beer and drive a garbage truck". Reach for the stars, baby !
In between Xander's birthday and starting school, we went to Ghana for 2 weeks. It was the first time I'd been back since April 2004, so the trip was long overdue. We were initially worried about how much of an nightmare the flights would be, but a combination of a portable DVD player, flight times coinciding with Xander's sleep schedule, and Xander being unusually cooperative made the flights relative non-events. The time in Ghana was fun as well -- I got to see a bunch of people I hadn't seen in over 12 years, Xander and my mum had a great time together, Christina and I got to spend two days by ourselves lounging on the beach, and we had a big family get-together/reunion where I met a bunch of cousins etc that I hadn't met before. All in all, a good trip.
The Mallet Menagerie also morphed -- just before our trip to Ghana, we unfortunately had to put down Christina's old cat Mooshi because he developed an extremely aggressive cancer. When we came back, Christina was in full-on "cat replacement" mode and found a likely candidate in the form of a Siamese cat that had been living across the street from us, in a carpentry school, and that needed a home because the carpentry school was being torn down. After some hemming and hawing, I gave in, and was promptly confirmed in my stance that pets are, in general, more trouble than they are worth. After 24 hours in our house, the new cat simply ... disappeared. Christina looked everywhere and literally ripped the house apart, prying up floorboards, breaking down drywall etc, all to no avail -- the cat remained resolutely gone.
Ever resourceful, Christina then engaged the services of a pet detective [no, not Ace Ventura ...], who supplied her with infrared cameras and motion sensors that were strategically deployed in areas that the cat might possibly be hiding in, like the basement. Still, no dice. After 17 days of Christina losing her mind, she [I thought] finally accepted that the cat had just somehow slipped out of the house and disappeared, so she went and got another rescue cat. And, of course, the day after the new cat arrived, we found the other one by following its miaowing -- it had somehow managed to get underneath the floorboards on the second floor, and stayed there, without food or water, for 18 days. But it apparently had finally had enough, and started miaowing, so we had to hack some more holes in drywall to get the friggin' thing out. So, now we have 4 cats, and it's fair to say they're still trying to establish an equilibrium -- the screams of catfights are currently a pretty regular occurrence, usually around 3 am, but so far nobody seems to have drawn any blood, so we're letting them work it out.
On the professional front, Christina had a fairly busy year, despite the down economy -- apparently the demand for great photography is fairly inelastic. Besides boudoir photography, she also did a few weddings, a Bar Mitzvah, some pictures for Giddens, and managed to score a full page in the upcoming Valentine's Day edition of Seattle Magazine.
On my end, nothing much changed at work, besides having to deal with the standard once-a-year reorg and team shuffle -- my team grew a bit, but nothing really changed in the areas we were working on.
So, all in all, a pretty good year.
Here's hoping 2010 is at least as good, if not better.