Category Archives: Work

Telecommuting


I’ve worked as Sybase since August 1997, and have been a part-time telecommuter since January 2004. I already worked at home infrequently when the need arose (as did many others in our group), but at that time, my (old) car was around 275,000 km, and I wanted to reduce the mileage I was putting on it so that it would hopefully last a little longer. I asked my boss if I could regularly work at home one day a week (every Friday). He asked his boss who asked the President of the company (who to this day I have never met), and they all OK’ed it on a trial basis. Five years later, I’m still at home every Friday, and sometimes on other days as well. If there is a lot of snow in the forecast, I will generally work from home; in the past, I have had days where it took me two hours to get to work and the same to get home, and wasting that much time (and gas) seems really dumb if I can work at home and avoid it all. I’ve done this for a couple of years now, and I’m sure there have been days where the traffic would have been fine despite the snow, but one day a few weeks ago it was snowy but I didn’t think it was that bad, so I figured I’d brave the weather. Stupid move. It took me a little over two hours to get to work, and then about an hour and a half to get home.

I’ve read a number of articles on telecommuting, and one of the pieces of advice I’ve seen the most often is that you should treat working at home as the same as going to work, meaning that you should sit down and work during your regular office hours, you should have a separate “office” space and not just sit at the kitchen table, things like that. I’ve even read about people who close the door to their “office” and force their family to either call or email if they need him, just as if he were at an external office. This seems a little extreme to me, but it does avoid persistent interruptions. I would love to have a dedicated place in the house where I could work more comfortably than the dining room. We do have an office upstairs, but the desk is so cluttered with stuff that there’s no room for my laptop. If I were to clear off the desk and use that as my telecommuting “office”, I think I’d have to invest in a new chair. Hmmmm…. I’ve thought about that idea in vague terms before but never really thought about it until now, and I’m starting to think that it’s a really good idea.

Treating working at home like working in the office is particularly important if you telecommute 5 days a week, since you don’t want to feel like you live in your office — you want a place that you can “walk out of” at 5:00 and feel like you’re back home. For me, I only work at home one day a week most of the time, so I set my laptop up at the dining room table and sit there. Sometimes I used to sit at the kitchen table, since it’s closer to the entertainment centre so I can plug my iPod in and listen to music while I work. I recently bought a speaker device for my iPod so I can listen in the dining room, so now I don’t need to move. But generally, it’s a normal working day. I get up at the same time, have a shower and get dressed, get the boys breakfast and make their lunches, just like any other day. It’s just that when I’d normally kiss everyone goodbye and leave, I simply walk into the dining room and sit down.

It does take discipline to work at home. It’d be very easy for me to sit with my laptop in front of the TV all day, but I know that I’d get much less (read: nothing) done, so the TV never goes on. Surfing the web is harder to avoid since the browser is right there, but I’m getting pretty good at not sitting on Facebook or writing blog entries all day. Most of the incentive to not do this comes from my work ethic — I know that if I’m goofing around when I’m supposed to be working I’m essentially ripping off the company, and so I feel guilty. I do have to admit that some comes from the fact that working from home is a privilege that Sybase has given me. If they decide I’m not getting as much done when I work from home, they might decide that they don’t want me to do this anymore, and I don’t want to lose the privilege. It’s something like: I want to be able to work from home and goof off, so when I work from home, I don’t goof off in case they don’t let me work at home.

One of the huge advantages of my job, from the point of view of telecommuting, is that from a work perspective, there’s not much I can do in the office that I can’t do from home. (Obviously teachers, policemen, and anyone who works in retail or deals face-to-face with customers doesn’t have this luxury.) Copying large files over the network is much slower (100 Gb line vs. VPN over wireless G). I do a lot of network-related projects, and sometimes that doesn’t work very well. As I’ve mentioned before, the product I work on is a mobile database called SQL Anywhere (SA), and the clients use UDP broadcasts for locating the server. When I’m at home, my machine is essentially on its own private LAN separate from the work one (VPN does stand for Virtual Private Network after all), so any broadcasting stuff doesn’t work properly since UDP packets don’t span subnets. I have a couple of VMWare images running on our VMWare server in the office, so whenever I need to do network stuff, I can simply remote desktop into one of those. I used to do a lot of work on the NetWare version of our product, and I can’t do NetWare stuff at home either. But we don’t support NetWare in the latest version of SA, and we get very few bug reports from previous versions (that’s obviously because my code is robust and efficient, not because we only have a handful of customers using NetWare). I have my NetWare development environment set up on a VM now so I can do that from home anyway.

The obvious advantage to telecommuting is the lack of travel time and effort — not only does it reduce the time spent travelling (on Fridays I generally spend the extra two hours working), but it also reduces the gasoline used and the extra mileage on the car. On days where the traffic or driving conditions are bad, it also eliminates the likelihood of accidents, and lowers my general stress level as well. It’s also very nice to be able to schedule things like dentists appointments and visits from service people (the furnace guy, the guy who will hopefully fix our dishwasher next week so I don’t have to wash a thousand dishes every night, etc.) on Fridays and not have to take vacation days.

Other than work stuff I can’t do from home, the main downsides to telecommuting are things like participation in meetings, whether scheduled or impromptu (Aside: “impromptu” is a really weird word), and socializing. Some things are just more difficult over email or IM.

From the company’s point of view, there are only one real advantage: keeping employees happy (and therefore keeping employees). I do love my job, but if Sybase didn’t allow me to work from home, I might have grown tired of the commute by now and left to find a job closer to home. In terms of job perks, it costs the company nothing, and is a display of trust on their part, further enhancing my overall job satisfaction.

I’ve written before about IvanAnywhere, the telepresence robot in our office controlled by my colleague Ivan Bowman, who lives in Nova Scotia. Ivan used to live and work in Waterloo, and now travels here a few times a year. But I’m curious how Ivan’s working relationship with colleagues that he has never worked with “in person” differs from those with whom he has.

Technical Debt


Jeff Attwood wrote an article on his blog Coding Horror yesterday all about paying down your technical debt. This is when you do something “the quick and dirty way”, which then costs you “interest” in the future in terms of bug fixes, workarounds when new functionality is needed, and just extra time for developers unfamiliar with the code to understand why something was done the way it was. There are certainly times in every developer’s life when you have a choice between doing something “the right way”, which might take weeks to design and implement properly, or you could do it the easy way, which gets the job done for now, but may have consequences later. If you’re under a tight deadline, often the easy way wins out — that’s your debt.

People often complain about Microsoft Windows being bloated, and that’s largely because of technical debt that they can’t easily pay off. When they released Windows NT in 1993, they made sure that all existing Windows and DOS programs would still run. That decision saved them — who’s going to upgrade to a brand new OS when there are no programs and drivers for it, and none of your existing stuff will work? — but they incurred a huge debt because of it. Backwards compatibility has always been a huge issue for Microsoft — it’s only recently (2007) that they released an OS (Vista) that won’t run 16-bit DOS software from the 80’s. I cannot imagine how much of the Windows source code is dedicated to running legacy software.

I love this “technical debt” metaphor, as we’ve gone through it a couple of times on our mobile database product, SQL Anywhere, most notably a few years ago on SQL Anywhere version 10.

One of the advantages of SQL Anywhere is the way we save data in the database file. We do it in such a way that a database created on any supported platform can be copied and used on any other supported platform. Also, if you create your database with one version of our product, you can continue to use it when we release updates for that version, or even completely new versions. Version 9.0.2 of our server, released in 2005, can still run databases created with Watcom SQL 3.2, released in 1992. I remember my time as an Oracle DBA – every time we upgraded Oracle, we had to “fix” the database, and by “fix” I mean we had to rebuild it or upgrade it or something. I don’t remember what we had to do, but we had to do something. We also had Oracle on our test server, which was a different platform than the production server, which means that we couldn’t just copy the production database to our debug server for testing or debugging purposes, which was quite a pain.

Anyway, while this was a very convenient feature, we did accrue some “technical debt”. This is not quite the same as described above, in that we never took the “quick and dirty way”, but we still had to have code in the server to support features that had been removed from the product and very old bugs that had long been fixed. After six major versions and thirteen years, there was a lot of these. After much discussion, we decided to take the big plunge with the 10.0 release (known internally as “Jasper” — the last few releases have all had code names from ski resorts, “Aspen”, “Vail”, “Banff”, “Panorama”, and the next one is “Innsbruck”), since we were adding a ton of other new functionality with that release. The decision: version 10 servers would not run databases created with version 9 or earlier servers. Everyone would have to do a full unload of all their data and reload it into a new database when upgrading to version 10, and they’d have to do this for all their databases. This would allow us to remove thousands of lines of code from the product, making it smaller, and since we have far less cases of “what capabilities does this database have?”, the code can be more efficient. As a simple example, we now know every database that the server can run supports strong encryption, checksums, clustered indexes, and compressed strings, among others, so we don’t need to check for those capabilities before using them. There are a lot more assumptions we can make about the layout of the database that makes the code simpler, smaller, and more efficient. We can also add new features that might have clashed with old databases. We knew that the rebuild itself might be inconvenient, and upgrading to version 10 wouldn’t be nearly as seamless as previous upgrades, but we also knew that once the initial pain of the rebuild was over with, life would be much better for everyone. We even put a lot of work into streamlining the rebuild process so that it was as fast and simple as possible.

As you can imagine, there was some resistance to this, and I’m sure product management had to handle more than one call from a customer asking “I have to do what with my multi-terabyte database?”, but to their credit, they stuck to their guns and told the customers that yes, we know it’s inconvenient, but it’s really for the best, and you’ll appreciate it once the rebuild is done. Or perhaps they blamed it on us, telling the customers “We know it’s a pain, but engineering won’t budge. They’re determined to do this.” Either way, it happened, and we did get some more bug reports because of problems with the rebuilds, but for the most part, things went pretty well. That pain paid off the technical debt that we’d accumulated over the previous decade.

Of course, we’ve since released version 11, which added new stuff to the database file, and we’re working on version 12 which adds even more, so now some of those “if the database file has this capability, then do something, otherwise do something else” conditions are creeping back into the product. So far, there aren’t a ton of them, so our current interest payments are pretty low, but perhaps in five or six more versions we’ll have accumulated enough technical debt that we’ll have to bite the bullet and pay it off again.

IvanAnywhere on Space TV


Space TV interviewed my co-workers Glenn Paulley, Ian McHardy, and Ivan Bowman about IvanAnywhere a few weeks ago, and the results aired last Friday night on their show “The Circuit”. The piece is online: go here and click the link at the top that says “Ivan Anywhere, the robot telecommuter”. There is also a direct link to the video, but note that the link resizes your browser window. The bit about Ivan is about four minutes long, and starts a minute or so into the video.

I PVR’ed the show, but I’ll be damned if I can figure out how to copy it to my computer. I thought I could record it straight to my digital video camera, but the camera doesn’t have inputs, so I’d have to play the video and then actually record the TV screen with the camera. Video and audio quality would both suck, so I didn’t bother. Of course, even if I could get it in digital format, I couldn’t post it to YouTube or anything, since it’s copyrighted.

I want to be terrible too


Here is a great article by a self-confessed “terrible programmer” who points out his own “failings” as a programmer and how he covers them up, so that nobody will find out the truth. Of course, he is not a terrible programmer; quite the contrary. He is obviously an experienced programmer who is very good at what he does. (Note that I have no idea who this guy is.) The methods he uses to cover up his incompetence are time-honoured ways of ensuring that the code you release is as correct and robust as possible: do code reviews, use assertions liberally, test the snot out of your code, and use the right tool for the job.

As for me, I do use assertions all over the place, and I’m usually pretty good at writing tests for the modules I write. I am part of the core engine team for SQL Anywhere, a relational database management system from Sybase iAnywhere. When I add features to the database engine, I make sure I test boundary conditions, confirm the syntax of any SQL statements I add, and try to make sure that whatever changes I’ve made work in multiple types of databases, and on multiple platforms. However, I work on a lot of security-related features (encryption, authentication, database permissions, auditing), so I have to do more than just write tests — I have to think about how hackers could break into our systems, or otherwise gain access to data that they should not have access to. If someone was watching packets go by, could they use that information to break into the database? Could someone write a man-in-the-middle program that makes itself look like a server so that clients will connect to it instead of a real server? Can we eliminate the possibility of brute-force attacks, or at least slow the process down enough to negate the effectiveness of the attack? Can we give the DBA the ability to detect when intrusion attempts are happening, and determine where they are coming from?

Anyway, I occasionally make the same mistakes the author does — bugs in code, not initializing variables (ran across one of those this past Friday, actually), making assumptions that aren’t true (and not backing up those assumptions with assertions), stuff like that. I use some of the same methods of covering up my own incompetence as he does, so perhaps I’m as terrible a programmer as he is. I can aspire, anyway.

Just remembered that my boss sometimes reads my blog, so maybe admitting my own incompetence here is a bad idea…

Windows reminder app


Does anyone know of a good Windows-based calendar / reminder application? I’m currently using the Lightning plug-in for Thunderbird. Lightning is basically a plug-in version of Sunbird, which is a Mozilla calendar application. It has the advantage of being able to read events from my Google calendar plus add events of its own, and it can give you reminders, but the reminders seem to be flaky.

My company uses Lotus Notes for email, but after using it for a few years, I now flatly refuse to install it. I switched to Outlook for the next few years, and Outlook has a pretty nice calendar built-in. I’d set up reminders for my meetings, and a message box would pop up 10 minutes beforehand. I switched to Thunderbird for email a year or so ago, but Thunderbird doesn’t have a calendar built-in, so I’ve been without one ever since. I discovered Sunbird a little while ago and set that up, but soon discovered Lightning — it’s the same thing as Sunbird but since it’s a Thunderbird plug-in, it’s one less application to run. However, I have been late for a number of meetings lately because my reminders never fired. Sometimes they fire the next time I stop and start Thunderbird, and sometimes they simply fire an hour or two later. The reminder for the meeting I was late for this morning fired an hour after the meeting ended.

I’m thinking of re-installing Outlook just for the calendar, but that seems like overkill. Considering how happy I’ve been with Firefox and Thunderbird (for the most part), I’m quite disappointed with Sunbird. Anyone have any other suggestions?

Mobilizers baseball


Our baseball season ended today. (We all call it “baseball”, but it’s really softball, or even more accurately, 3-pitch.) This past year, I was the captain of the iAnywhere Mobilizers, one of our company’s two teams. We play in the “B” division of the league, whereas the other team (the “Sybase Sluggers”) play in the “A” division. We usually refer to the Sluggers as “The A Team”, and after playing in this league for two years, it’s only recently that I don’t giggle every time I say that, thinking of Mr. T in a baseball cap and glove, yelling “C’mon, guys, force play at second, let’s get this one”.

The “B” division is for those teams that aren’t good enough to play in the “A” division, but don’t completely suck — those guys are in the “C” division. Well, for most of this season, I suspected that they’d move us down to “C” next year because we more or less completely sucked. We started the season 0-10, including scores like 24-3, 19-4, 33-11, 11-2, and 24-1. The week after the 24-1 loss, I went away on vacation and someone else made the lineups, and we won 13-12. Then I came back and we lost the next 6. I like to think that was coincidence.

In late July, we lost a game 20-15, but the 15 runs was our highest run total to date, and we played pretty well, and I started to realize that we were actually playing better as a team. In August, we won another game, this time in convincing fashion, 26-20. I was actually at the helm for that game, so that broke my personal losing streak at about 18 (including the 0-3 showing at last year’s September tournament). We ended the season in last place at 3-18, two games worse than the second-last place team. Doesn’t sound like there was much reason for confidence going into The Tournament, but we actually had some guarded optimism, since we played much better in the last month, and two of our three wins came in the last four games.

The tournament was played yesterday and today, and rather than one or two games per week, we suddenly had to play four in one day, and up to three more the next day. Our first game was 8am, and we played pretty well. We lost by one run, but because the score differential matters in the tie-breakers, we played the bottom of the ninth even though the home team was winning. They scored one more, so it goes in the books as a two-run loss. 0-1 and -2 in the run differential column after one game. Not great, but considering we were 0-3 and -30 in last year’s tournament (the max run differential in any one game is -10), this was an improvement. The second game was pretty good too, and we were losing by 1 when the umpires called the game because of time constraints. I went and argued that the time limit had not yet been reached (we were two minutes shy), and we wanted to keep playing. They agreed that the game should continue, and we proceeded to not score any runs and allow 5, so we ended up down by 6. After two games, we were 0-2 and -8. Still better’n last year, but not great.

The third game never happened. Someone on our team had heard from someone else (who heard from someone else who… ) that the team we were playing in the third game did not have enough eligible girls — the rules say that you must have at least three girls who have each played at least nine games during the regular season, or you forfeit the game. I asked the umpires and the other team’s captain, and he confirmed that they had three girls available, but one had not played the requisite number of games. The umps called the game a forfeit, and we were considered the winners (by a 10-0 score), but said we could play anyway if we wanted. We declined, saying that we didn’t want anyone getting hurt in a meaningless game, but in reality, I think we were just hot and tired and wanted a break. So we were now 1-2 with a +2 differential.

The fourth game was great, except for the part of the game that really sucked, but I’ll get to that in a second. We hit well, played defence well, and won the game by 8 runs. I don’t think I made any errors on the field during that game, and I missed turning a 5-3 double play by this much. Runners on first and second, I’m playing third base, and the ball is grounded in my direction, just to my right. I run forward, grab the ball, step on third, and heave a throw to the first baseman, who catches it just after the runner hit the base. Normally, that’s the kind of play where I’d (a) miss the ball completely, forcing the left fielder to come in and get it (probably allowing a run to score), (b) boot the ball, loading the bases, or (c) make the play at third and then blow the throw to first, so I was very pleased with the fact that I made both ends of the play.

The part of the game that really sucked was during the bottom of the third inning. I was playing left field, and the batter grounded the ball to the second baseman. I didn’t see what happened, but some of our players were yelling “Throw it to first!”, and I didn’t understand why it was taking so long to do so. Eventually, the ball made it to first, the first baseman stepped on the bag, and then everyone walked towards the plate. I had no idea what was going on, until I saw that the batter had never left the batter’s box. He swung, hit the ball, and then must have dislocated his knee when taking off towards first base. Someone called 911, and an ambulance showed up 10 minutes later and took him to the hospital. The whole thing caused a delay of about a half hour, and since the games were a max of an hour and fifteen minutes long, that was almost half the game right there. Eventually, we got back onto the field, but I think the whole game lasted five innings. I haven’t heard since about how the guy is doing, but I can’t imagine he’ll be walking much in the next couple of weeks.

So at the end of the day, we were 2-2 and +10, a tournament record with which I was completely thrilled. As I said, the only experience I’d had in the tournament was the previous year, in which we got smoked three games in a row. Both teams that we beat won against (since we didn’t actually beat anyone in the third game) ended up going 0-3 on the day, with one game left to play this morning, while the other two teams in our grouping were 3-0 yesterday with one game this morning. So regardless of the outcomes from today’s games, we ended up third in the grouping, which meant that we played a quarter-final game today at 11:30 against the team that finished third in the other B-division grouping.

Yesterday, the weather was great for baseball. Sunny and hot. Today, the exact opposite — rainy and cold. It just flat-out rained for the first three innings or so, though after that it was just drizzly. We had one guy show up to play that I didn’t expect, since he said the day before that he couldn’t make it. I don’t want to put any blame on him at all, since the team is certainly better with him in the lineup than without, but the defensive lineup I had was done assuming he wasn’t going to be there, so I spent most of the first inning tinkering with it to make sure that he was included, but that nobody was sitting too often or in consecutive innings, that we didn’t have people playing in positions they weren’t comfortable with, and we didn’t our best defensive players all sitting at the same time. I didn’t do that great a job, though, since we ended up with too many or too few fielders in at least half the innings, and I had to make last-minute “You sit! You play right! You play third!” decisions on the fly. I think I ended up sitting out about four times just because I didn’t have time to figure it out properly. And to cap it all off, the hitting that came along so well in the last month of the season and all day Saturday completely vanished, and we ended up scoring all of two runs. We lost by about 12, and so ended the Mobilizers’ dream “worst-to-first” playoff run. The A Team (heh) got spanked in their game today as well, so both Sybase teams were eliminated.

Despite the win-loss record, I really enjoyed playing ball this year. It was much more work than in previous years because being the captain, I couldn’t just show up to games and play wherever someone else told me; I had to be the one to tell others where to play. One thing that I told everyone at the beginning of the season was that being the team captain does not mean that I’m the best player on the team, and it does not mean that I’m a good coach. I know the game itself as well as anyone, but I’m generally a crappy teacher, and I tend to forget that not everyone knows the intricacies of the game as well as I do. We had plays during the season where a fielder caught the ball while stepping on the base, but the runner was called safe because it wasn’t a force play. I knew it wasn’t a force play, but it didn’t occur to me to yell “Tag him!” because everyone knows that, right? Well, no, as it turns out. Anyway, due to complicated reasons that I’m not going to bother posting here, the league may not even exist next year, which means I may be looking for a new league. I remember looking into a league in Waterdown a while ago, but it was only for men 35 and older, and I didn’t qualify at the time. Now I do. Sigh.

It occurred to me earlier this year that if I played golf once a week during the summer instead of baseball, I’d become a much better golfer than I am now, and that concept certainly has some appeal. But can you imagine life without baseball? I can’t. I’ve played in a baseball league of some kind every summer since university, and I played pick-up baseball with friends every summer before that since I learned to walk, so until I get to the point where I am physically unable to play, I’m playin’.

IvanAnywhere


And I thought I had a tough commute… A guy (Ivan) on the query processing team lives just outside of Halifax, Nova Scotia. He’s been living out there for a few years now, and has been telecommuting. His ability to interact with the rest of us was greatly improved a couple of months ago when IvanAnywhere was introduced. IvanAnywhere is a “telepresence” robot, built by another guy in our department, Ian. One of Ian’s hobbies for many years has been flying RC airplanes, and after Glenn (Ivan’s boss) semi-jokingly asked him to build a flying RC blimp with a webcam that Ivan could control, Ian thought about it and decided it was possible, though with a robot, not a blimp. He took an RC truck and mounted a tablet PC and webcam on it as a proof of concept, and once that worked, he built a robot that Ivan can control. It has a webcam as well as a digital camera, microphone, speakers, proximity sensors so it won’t run into walls and such, and works over our internal wireless network. Now when Ivan wants to talk to someone, he can just go on down to their office, and he can attend meetings and even give presentations. The robot has a monstrous battery, but can run all day without being recharged.

Ivan can’t do everything himself, though. The robot can’t turn and move forward at the same time, so to go around a corner, it had to go forward, then spin 90°, then go forward again. Update: Yes it can! For tight manoeuvring, Ivan has to point the webcam down so he can see what he’s doing, so it’s easier to stop first. He can’t open doors, and manoeuvring around chairs and stuff in meeting rooms can be challenging. In one meeting, Ivan misjudged how far away a chair was, and the robot crashed into it (ironically, it was Ian’s chair). Also, someone here has to plug the thing in at night to recharge the battery.

Regardless of how cool this technology is, it’s almost no big deal anymore. We’re all so used to seeing Ivan (well, the robot, who we generally refer to simply as Ivan) roaming around, we don’t think much about it. One big difference is that our area is now pretty much mandatory on all building tours, so when customers or other partners visit, they are always brought through this area to see Ivan. Thankfully they haven’t changed our dress code (i.e. given us one) because of this.

As someone who telecommutes on a regular basis, I can certainly see the appeal of this for Ivan. For me, talking to co-workers via email, IM, or telephone is almost always sufficient, but I’m only at home one day a week (though it’s more if the weather is bad or I’m not feeling well or whatever). If I was at home every day and it was pretty much impossible to get into the office, I’m sure I’d miss the face-to-face interaction, and I find attending meetings over speakerphone (when everyone else is in the same room) difficult. Unfortunately, I think I live too close for the company to consider creating GraemeAnywhere.

Cool — just found out that we’ve been slashdotted!

Update: Ian informs me that IvanAnywhere can move forward and turn at the same time, so I updated the paragraph above. Also in the comments I say that it’s running a 9.0.2 server, but it’s actually running 10.0.1, and it stores status and monitoring information, which is used for diagnosing problems.