The Workstation team now has an official public-facing blog :-)
You can even read about a major project I've been working on for the past year or so.
Seven years ago, on my very first co-op job at KL Group, was the last time I worked downtown in a real city and I've had fond memories of the experience every since. So when VMware recently acquired another floor at Stevenson Place near Market and 2nd in SF, I jumped at the chance to work there. Today was my first day working at the new office, which I now share with Grant, who is also on the UI team.
Unlike Manhattan, where rampant paranoia requires a background check on everybody entering an office building, getting into Stevenson Place was pretty easy. Once inside the VMware suite, I found my office and discovered that the movers had managed to transport my enormous potted peace lily without damaging it, which made me happy. Grant showed up later and we eventually left the building to eat lunch at a dim-sum place up the street. The food was good but we decided that spending $30 apiece on lunch would have to be reserved for special occasions.
On our way back from lunch we decided to try gaining access to the roof. To our dismay, the topmost floor does not permit access to anything. But the real adventure hadn't begun yet. See, like most office towers, Stevenson Place has 2 sets of elevators and the VMware offices are only accessible via the lower set, although it is the highest floor served by that set. Rather than taking 2 elevators to get back, we decided to simply get off at the floor above it and then take the stairs down.
It seemed like a sound plan until we discovered that it isn't possible to get back into a floor from the stairwell. Disappointed, we decided to walk down all the way to the bottom and take the elevator back up after all. Upon reaching the bottom, however, we discovered, to our horror, that the only exit was wired to trigger the fire alarm if opened. We were trapped in the stairwell.
Fortunately, our cell phones still had a decent signal so we called one of our coworkers and got him to take an elevator down so he could rescue us. Having had enough excitement for the day, we managed to stay out of trouble after that.
It took me slightly longer to bike home than I'd expected: 21 minutes instead of the 15 it took me to get there in the morning.
Since both Google and VMware do regular tech-talks, some people at both companies thought it would be cool to give tech-talks at each others campuses. Today we had a pair of googlers on site to talk to us about using fuzzers to find security holes. It was a very interesting and the high attendance suggests that this might prove to be an enduring tradition. On Wednesday my teammate BenGwill be speaking at the Googleplex.
People had been telling me for several months that I should visit Austin because it's an oasis of liberalism in Texas. This week I finally had a chance to spend a few days in Austin by virtue of staffing the VMware booth at a career fair and delivering an info session on the UT Austin campus.
Several people encouraged us to try the Texan BBQ but I was not particularly impressed by it. What did impress me about the cuisine in Austin were a couple of restaurants, one Thai and the other Korean. Although I'm not usually a huge fan of Thai food, Madam Mam's had me the moment I tasted their spring rolls (wrapped in soft rice-paper, not the thicker hard wheat-based things that are commonly mistaken for spring rolls but are actually egg rolls). Koriente is a small but delightful place run by a couple of the nicest people I've ever met.
The climate in Austin took me by surprise, however, despite having grown up in a pretty hot and humid part of the world and hearing about the Texan summer beforehand. Despite the stupefying heat and humidity, I was able to walk around downtown Austin without sweating too much as long as I mostly stayed in the shade of buildings. Wandering around gave me a feel for the city's vibe, which I quite liked. There are plenty of sidewalks and bike lanes in active use and only one person tried to run us over while we crossed the street. I even passed by a church whose banner read "deliberately diverse and fully inclusive". There's also just enough urban sketchiness to keep it feeling real but not enough to feel unsafe. The street hooligans are definitely more polite than those in SF but I guess they never know who might be bearing firearms ;-) All things considered, aside from the oppressive heat and humidity, Austin meets the Tony standard for liveable cities. In fact, the only thing that disappointed me was the noticeable lack of outdoor art.
Speaking to throngs of CS and ECE students at the career fair was interesting. Both those fields seem to be dominated by people of South Asian descent in Texas, although most of those at the undergrad level are US citizens who speak English fluently and whose parents probably migrated to Texas decades ago. We encouraged just about everybody who handed in a resume at the booth to attend our info session at the end of the fair. Consequently, it was extremely well-attended with probably over 90 students showing up to pack the room. I think they enjoyed my presentation because they laughed at my jokes and asked a lot of questions afterwards, mostly about how to get jobs at VMware.
VMworld was this week and I had a pass for Thursday. Although only attendees from Wednesday were supposed to attend the VMworld party that night, I was able to masquerade as somebody else and go anyway. I'm glad I went because the party was incredible; I've never seen anything like it in my life; it was as though they'd brought Vegas to us. Outside there were several free carnival games with little prizes and Smash Mouth was playing. Inside they had several different rooms that had been turned into representatives of various colourful SF neighbourhoods and they each had different forms of food and entertainment. The entertainment included stand-up comedy, karaoke, a mariachi band, 80's arcade games, costumed dancers, a jazz band, etc. And everywhere there was an open bar with a variety of beers and wines.
On Thursday morning I was on duty at the "genius bar" to answer questions about Workstation, although most people were, unsurprisingly, interested in Virtual Infrastructure. I also went to a bunch of breakout sessions. The most amusing of these was the panel discussion at the end where technical heads of several competing companies made snarky comments at each other for an hour; final verdict: Infiniband is kicking 10gigE's ass.
Altogether I was impressed by how well the conference was organized; we even had a booth for attendees to check into their flights! And a professional cartoonist had been hired to produce humorous illustrations of various virtualization-related terms, which were hung all over the place as decorations.
As part of VMware's campus-recruiting efforts, we deliver an info-session at many universities around Canada and the US each semester. Every year we have a meeting to refine the presentation based on previous successes and new ideas. Because all the presenters are volunteers from Engineering, their ability to deliver a presentation has high variance. This constraint requires us to standardize the presentation using a slide deck, a few very brief videos, and a single demo.
While I hate the use of slide decks as a crutch in public speaking, our complementary but optional public-speaking courses have not yet succeeded to a point where we can necessarily rely upon the presenters to deliver on their own merits. Consequently, we invest a good deal of effort creating a slide deck that can stand on its own as much as possible yet not limit the presenters who are able to speak well.
Our strategy for this academic year is to ground the slide deck in a small number of slides that display essential information in a very clear manner, with supplementary slides that can be added to the deck as appropriate for the student audience in question and the technical background of the presenter. One of the results we've been wanting to achieve recently has been to make students feel like they would fit into our corporate culture. An idea we're thinking of trying to accomplish this is to create slides of engineer profiles that give students an idea of what engineers do on a day-to-day basis. These profiles would include such things as programming languages and technologies used, typical working hours, products/features shipped, etc. Sounds a lot like developer trading cards, eh.
I guess it's the next best thing to having the names of star hackers on the boxes in retail stores the way Hollywood "brands" movies.
When VMware began running out of office space a couple of years ago, our visionary CEO decided that it would be a good idea to build a new campus for us instead of continuing to lease whatever vacant office buildings we could find in and around the Stanford Research Park. Wanting to build this new campus in an environmentally friendly and sustainable manner, she got William McDonough himself to design the campus and spent countless hours poring over designs herself. She even put the blueprints, materials samples and office furniture out on display periodically to solicit feedback from all of us.
All that careful planning has finally paid off and today I walked into the brand new campus (called Promontory). The flooring is made of lovely hardwood, the bathrooms have waterless urinals, and natural light abounds. I'm still getting settled in but so far I'm loving the new digs :-)
Update: I've posted pics of Promontory on Flickr
As a consequence of going through Waterloo's revolutionary co-op program, I had several amazing work placements during my time as an undergrad. On some of these I was fortunate to have been mentored by stellar software developers like Michael Valenta and Tom Ball. Now I have an opportunity to pay it forward; I'm mentoring an intern this summer.
He's going to be working on the addition of GDB support to the Eclipse plugin I wrote for Workstation 6.0 so that C++ developers can take advantage of it as well. That would nicely complement the Replay feature in Workstation 6.0 that allows developers to easily track down bugs that are hard to reproduce by letting them jump back in time after encountering such a bug and then step through the code path that was just executed.
There's nothing quite like having a new person around to highlight all the weird internal jargon being used in an organization. My strategy for dealing with this is to add brief explanations of every term that confuses him to the wiki so that in future people can just look them up on there. Wikis are awesome that way.
Update: On his first time participating in our weekly Starcraft session, he destroyed everybody else in about 15 minutes!
The xterm application, which is distributed with most X11 implementations, sports a -e flag that accepts a command followed by a sequence of arguments, all of which are space-delimited. I'd been exploiting this feature to ensure that when I programatically executed console apps inside a Linux VM, the user could interact with them. All I had to do was run xterm with the -e flag and follow that with the location of the console app and its arguments (e.g. xterm -e "xeyes -center red"). Everything had been working fine when I tried this on modern Linux distros but today one of the QA people tried it on Redhat 8, which was released in 2002, and saw a nasty error message complaining that the execvp syscall could not find the specified file.
Curious about the cause of this problem, I tried manually running xterm under strace with the same arguments. This revealed that the xterm binary in XFree86 4.2 that was part of Redhat 8 simply tries to call execvp with the entire quoted string as the first argument. Since that string contained space-delimited arguments appended to the binary's name, it couldn't be resolved as a valid pathname by execvp. That made sense but it didn't explain why it worked in newer releases of xterm. Trying the same thing with the xterm binary on my Ubuntu 6.10 system revealed that xterm now falls back on passing the entire quoted string to the shell for execution if the call to execve fails. Since bash knows to deal with the space-delimited arguments, that works fine.
I was trivially able to solve the problem by removing the quotes.
Shortly after joining VMware, I took on the challenge of making it easier for software developers to debug code running in a production environment where they don't have all the tools normally available to them during development. Traditionally, the only way to accomplish this has been through the use of remote debugging. However, while remote debugging can be extremely useful in certain situations, getting it to work is sufficiently cumbersome that it has remained the domain of the truly desperate. There are two parts to the process: running the code in debug mode on the production machine and then attaching a debugger on the development machine to the code running on the production machine. I realized that I could vastly improve the user experience if I could automate all this drudgery and present it to developers as a one-click action. But I knew that doing this would require a sequence of nontrivial actions:
Back at Waterloo when I was taking a course about the theory of computation, I wondered how relevant it would be to the sort of programming I'd be doing during the course of my career. That question was answered a few weeks ago when I actually wrote a state machine to solve a problem that involved dealing with a series of daisy-chained callbacks from the functions provided by the asynchronous library I'm using.
Yesterday I discovered a concurrency issue in my code. In order to execute bytecode on the guest OS after building it on the host OS, my Eclipse plugin shares the project folder with the guest before launching the app inside it. Now, in order to provide developers with maximal flexibility, the plugin allows them to debug multiple instances of an application on the same VM simultaneously. However, because the plugin cleans up after itself when the application terminates by removing any shared folders used by the application, it's entirely possible for one instance of an application to remove shared folders currently in use by another.
What I needed was a way to ensure that shared folders would only be removed when there were no applications left using them. The obvious approach was to use reference counters via a map of shared folders to counters. But I had to ensure that the value of this counter wouldn't be mangled by read-write overlaps from multiple launches. The desired behaviour sounded strikingly similar to what I'd learnt about semaphores in school, except I wanted to increment the count when using a folder and decrement it when I no longer required it. This is the reverse of the textbook use-case for semaphores, which were designed with resource contention in mind. Fortunately, it seems that Sun's implementation of semaphores actually handle my use-case just fine.
After a relatively painless experience upgrading my Ubuntu desktop from Dapper to Edgy, I was feeling a little adventurous. I've also been curious about the recent release of Solaris 10 so when I heard that we now have a feature-complete build of VMware Tools for Solaris, I decided to try installing it inside a VM. I copied the 3 gig DVD ISO of 64-bit Solaris 10 onto my local disk, created a new VM in Workstation and booted it off the DVD image.
The installer began by asking me the usual questions (language, timezone, network config, etc.) and then move onto package selection. This is where it became confusing. There are 3 distinct stages of package selection and considerable overlap amongst them! The 3rd stage gave me ample opportunity to mess around with the choices I'd made earlier. What a usability nightmare! It reminded me of using dselect back in 2000. With all the emphasis Sun put on making Gnome more usable a few years ago, you'd think some of that would have permeated to the Solaris installer team...
The other user-experience gaffe in the installation process was that, despite having asked me for the language, timezone and network settings at the onset, upon booting Solaris for the 1st time I was required to enter all this information a 2nd time (in a completely different UI). It's a lot to tolerate for the chance to play with Dtrace and ZFS.
I went to the Mates of State concert in the city last night with a co-worker. We got to the venue an hour early and ended up with insanely good balcony seats looking directly onto the stage. One of their two opening acts had 14 people on stage, including a guy whose sole job was to engage in rock'n'roll theatrics! It was past 11 by the time the Mates of State took the stage and, sadly, we had to leave at a quarter to midnight to catch the last Caltrain home so we didn't get to hear their entire set. What we did hear, however, was great. While both opening acts made the classical amateur mistake of drowning out the vocals with their instruments (despite the 1st one having 6 people on mic), the Mates of State noticed this problem early in their set and corrected it.
On the train home I was explaining the 2nd law of thermodynamics to my co-worker and some random people sitting in front of us took that as a cue to begin a conversation with us. When I told them we were software engineers working on virtualization, they asked, "Virtualization? You mean, like VMware?" Upon informing them that we did, in fact, work at VMware, they actually thanked us for making Workstation. I took the opportunity to conduct some impromptu guerrilla market research by asking them about the specifics of their usage. It turned out that they might be a use-case for the feature on which I've been working: the ability to build an application in your IDE, have it automatically launch inside an arbitrary VM and then let you step through the code in your IDE's visual debugger without ever leaving the host system, all at the touch of a single button.
I was in Illinois for a couple of days this week to deliver a VMware info session at the University of Illinois at Urbana-Champaign. Going into it I had no idea that UIUC was the #4 CS school in the country so I was blown away by the number of people in attendance; far greater than at Waterloo or Stanford combined! They also asked so many good questions that we nearly overran our scheduled time.
Urbana-Champaign seemed like a pretty neat city. I spent a couple of hours at the local natural history museum on Wednesday morning, where I encountered a pair of tour-guides-in-training. One of them was French and seemed quite shocked that neither the other student nor the teacher had ever heard of Asterix and Obelix. They were equally surprised that I had.
On the flight home I inadvertently discovered that:
a) wireless electronic devices do work on aeroplanes during flight, although T-Mobile doesn't have much coverage over most of middle America;
b) the flight crew have no way of telling if you leave them on.
I randomly ended up in a lively discussion about UI design at work today. At stake was the optimum way of selectively displaying UI components that are not usually of interest to the user. The means we evaluated included disclosure triangles, modal dialogues, and tabs.
Although others may disagree, I dislike modal dialogues because they feel restrictive, clutter the screen with additional windows and often make it hard to view all the information at once. Disclosure triangles are usually a good idea but when you have so many of them that expanding them all would cause the content within the window to exceed the available vertical space and force the user to scroll then they can actually degrade the user experience. Tabs do prevent the user from being able to view all the relevant data at once but they avoid the other downsides of modal dialogues and can be easier to navigate than a bunch of expanders.
Decisions like this make me wish that semantic UI layouts were a realistic option. Then I could just specify that certain components were optionally visible and let the layout engine decide how to render them at runtime. As we say in computer science, any problem can be solved by adding another layer of abstraction.
To eat one's own dogfood is an expression used to describe the process of using internally the products that are normally sold to customers. At VMware we periodically hold dogfood days for specific products or features before dispatching them to our external beta testers.
Yesterday we held one for the feature that I've been working on for the past year or so. We set up a dogfood lab with a few machines running either Ubuntu Linux 6.06 or Windows XP Pro configured for using the feature and had a batch of VMs available locally on each system for getting broad coverage of the guest platforms we suspect will be popular. Some people from around the various Palo Alto buildings came in and spent a few hours playing with the software while others followed our online instructions to test the feature out on their own desktops. They were each supposed to record a journal of their experiences and thoughts as they used the software and hand those to us at the end.
We got quite a bit of useful and enlightening feedback for improving the feature, some of which I'd been wondering about myself and some of which had escaped me entirely. We'll probably hold another dogfood day for all of Workstation 6.0 in the near future and include this feature as part of that once I've had a chance to address some of the issues that were raised this time.
In the interests of backward compatibility, I decided to see if my code would handle a Windows NT 4.0 guest OS. It did (after a minor modification) but what struck me was how refreshingly clean that OS was. While it wasn't bereft of some of the things I still find annoying about Windows, there was very little of the crap that seems to have been added in the years since: no automatic system updates forcing me to reboot every few days, no security centre nagging me about the lack of an antivirus, no Windows Messenger that won't go away, no crayola-inspired UI, no reminders that I need to clean up the infrequently-used icons on my desktop, no popups asking whether I really want to let some program I'd just launched access the network, no automatic hiding of my systray icons... It just worked :)
Yesterday the R&D dept. at VMware had a team-building day where we played a Survivor-inspired game before lunch and various team sports after lunch. The company chartered 3 buses to take people from the office to park across the bay and some people car-pooled. When we got there they randomly assigned us into large groups by handing out coloured bracelets along with breakfast. I was in the purple group.
After we'd eaten they split each group up on their own "island". The purple group was lined up in a row using a bucket-sort by birth-month and then divided up into 8 teams of roughly equal size. Each team was handed a flag and some face paint with instructions to choose a team-name and paint a team logo on our faces. We ended up being the purple people eaters and our logo was a purple pac-man with blood dripping out of his mouth. It was indicative of VMware's quick growth rate that more than half of my team had started after me. Our flag had 4 rows of little humanoid figures on it and would be used to keep score for the team by circling figures so that the team with the fewest figures circled at the end would be declared the winners.
We began with an immunity challenge in which 4 members of each team had to throw javelins at a skull in a large chalk circle. Teams were to be awarded 1 point for a javelin that landed at least partially in the circle and an additional point for knocking the skull over. After watching the 1st few teams all throw their javelins too high into the air and have them fall short of the circle, we threw ours directly at the circle and aimed for its far side. Our strategy yielded 3 spears inside the circle and succeeded in knocking the skull over. As none of the other teams had even managed to get more than a single spear into the circle, we won the immunity necklace handily.
The first round of challenges where we could have figures circled was this maze game where we had to flip tiles on a grid to discover a path through it within a given time-span of a few minutes. Each team member took a turn flipping tiles until they hit one that wasn't part of the path through the maze while the rest of the team face away from the maze. Then they would have to return to the rest of the team and another person would take their place. We devised a strategy that involved using a co-ordinatee system to specify tiles and decided that each time a person returned (s)he would tell the team which tile had been last found to be wrong. We also decided upon the statistically optimal sequence of tiles to try. Sadly, this strategy proved to be overly complex and broke down horribly. People kept thinking they had to try the tile that was mentioned and so we ended up overturning the same tiles multiple times in a colossal waste of time. Consequently, we ended up with 4 circled figures.
Although we failed to win the next immunity necklace, we were able to escape unscathed from the subsequent challenge. This one involved putting plastic fish into a bucket. The fish had hooks on them and were scattered around a disc-shaped mat. Across the mat lay a pair of ropes that criss-crossed each other with their ends sticking out on 4 equally spaced points along the circumference. Both ropes had been run through a metal loop that was positioned at their intersection and this loop was to be used for picking up the fish. We needed to get 10 fish into the bucket within 7 minutes to avoid getting any more figures circled. After we managed to pick the disc clean, getting 16 fish in 4 minutes, they made us stop. That revived our team spirits for the next few rounds.
The next immunity challenge involved predicting what our teammates would answer to given questions about VMware and each other. Each team was split into halves and handed a set of cards with questions on them. We had to answer the questions and if the answers for both halves of a team matched then they scored a point. One of the questions asked us to name the employee from whom a a quote was featured on the "about us" web page. Nearly every team guessed that it was Diane, the CEO; it's actually her husband Mendel, the chief scientist. We didn't win this necklace either but once again kept our noses clean on the challenge that followed.
This one was called "the acid river" and required each team to get across an imaginary river using blocks of wood and a pair of planks. We started out on one bank with 3 blocks and both planks while there was a 4th plank available on the far bank. Despite not really having a strategy, we ended up with what I think is the best solution: each plank held up by a pair of blocks at either end covering part of the distance and gaps at both ends plus between the planks. While it took us a while to get that setup, once it was ready we were all able to walk across quite easily. Some of the other teams ended up dropping planks into the ricer, thereby rendering them unusable, and having to make extremely difficult leaps between blocks that cost them several circled figures.
Although we didn't win the game, we came pretty close and it was a lot of fun. After a short reprieve for lunch, the organizers listed out various team sporting activities in which we could participate. It was pretty hot so I decided to go kayaking. Sadly, this hadn't been planned too well and the lake was closed so I opted to play whiffle-balll instead. The rules are very similar to softball but there are no strikes so batters just keep swinging until they make contact with the ball. During one of my at-bats, I was charging towards 1st base after a hit when the 1st baseman stepped backward into my base-line as I approached the base. Unable to stop in time, I crashed into him very hard, bounced of his ample paunch and ended up sprawled in the grass. A quick self-diagnostic indicated that I had not sustained any critical damage but I had to bend my glasses back into shape and my left quad still hurts.
When the whiffle-balll game wrapped up I decided to play bocce-ball next. It was a 2-on-2 game and one of the opposing players was ridiculously good, although he claimed to have never played before. Apparently he wasn't even sure what the game was called! That didn't stop him from wiping the floor with us repeatedly though. I wonder if he'll start playing more often now...
Update: the skin on my nose is peeling, indicating that I may have been sunburnt, although it doesn't hurt at all!
On Monday night I went with a few friends from Hammarskjold to see the Oakland A's play the Boston Red Sox. Although baseball games are generally a lot cheaper than hockey, they really stick it to you with the parking fee and horribly overpriced food. The sun was in my face for the 1st couple of innings, which sucked, but after that the game was pretty good. The Sox established an early lead and, although the A's made a valiant effort to catch up - at one point they were in tying position with the bases loaded - but they never quite managed to pull it off.
Yesterday VMware gave all the engineers 2nd flat-panel displays. It took me an unduly long time to get both my monitors working with my dual-headed NVidia Quadro graphics card, mostly because of a couple of subtle Ubuntu packaging issues. The worst of these was that the package for the binary-only kernel module hadn't been updated to match the kernel itself. I eventually worked around the problem by booting off the kernel from an older package.
Yesterday we ratified the design for the upcoming release of Workstation and were given our assignments for the implementation phase. Unsurprisingly I am implementing the feature that I designed. But I also get to do a couple of other ones, one of which I prototyped. I'm excited :-)
Last night I saw a minivan run a red light while pedestrians were crossing the road. We need more of those red light cameras.
Navigate: (Previous 20 Entries)