Friday, July 28, 2006
Iterative development is generally a good thing. However, it is important to recognize that things don't really happen sequentially.
I was recently involved in a project that had three phases. The idea was that the developers would create the Phase 1 software, then that would go into testing and later production, while the developers started working on Phase 2. Then when Phase 2 went into testing, the developers would start Phase 3. The intended timeline looked something like this:
|Developers||Develop Phase 1||Develop Phase 2||Develop Phase 3||Get some sleep||Testers||Prepare for testing||Test Phase 1||Test Phase 2||Test Phase 3||Get some sleep||Operations||Prepare for Deployment||Deploy Phase 1||Deploy Phase 2||Deploy Phase 3||Take turns getting some sleep|
Looks good on paper, right? I saw the Gantt chart, and it looked very simple.
Here's what really happened: Developers worked on Phase 1, and met a tight deadline. So they started on Phase 2. But of course, the testers found some problems and had some questions about Phase 1, so developers kept getting pulled away from Phase 2 to support Phase 1.
Even with those distractions, the developers met their second deadline. Here's where the real fun started. Now the developers were expected to develop the Phase 3 software, while supporting deployment of Phase 1, and supporting testing of Phase 2. For a team of a half-dozen members, this was spreading things thin.
Rather than being a three-phase project, it was really more like working on three projects simultaneously. There were no breaks for people to rest. Once the system went into production, everybody was on call 24 hours a day to deal with whatever fires broke out. There were all-night teleconferences. The developers were still expected to make progress on Phase 3.
How did it end? Thankfully, a project manager realized that there was no way for the developers to meet the Phase 3 schedule, and convinced the higher powers that Phase 3 needed to be postponed. And so all the developers got to take vacations (except for those who had already quit).
- Support of testing and deployment are not trivial tasks that developers can do in their spare time.
- Consider assigning different teams to different phases.
- An iteration doesn't end until its product is no longer in use.
Saturday, July 22, 2006
Motorcycle Training Course
I spent this weekend taking the Motorcycle Safety Foundation's Basic RiderCourse at the local Honda Rider Education Center. This is a course aimed at new riders which teaches fundamental riding techniques and skills for safely dealing with traffic. In the state of Georgia, passing this course qualifies one to waive the tests for a Class M (motorcycle) driver's license endorsement.
The course is spread out over a Friday evening and two weekend days. The class fee is $250. Motorcycles and helmets are provided. I had to buy my own boots, gloves, and a rainsuit.
When I started telling people I was taking a motorcycle training course, a few thought it would be a waste of money. "I can teach you myself some day, if you want" was the typical offer. Thanks, but no. Maybe I'm kidding myself, but I believe that a good training program will help keep me safe. Statistics show that riders who have formal training are less likely to suffer a fatal accident than those without training.
Prior to the class, my only experience with a motorcycle was a single ten-minute ride that I took on my uncle's bike, about 15-20 years ago. I drove through the deserted streets of a small town in North Dakota. I only saw one car during the ride, and I pulled over to the side of the road until it was out of sight.
Friday night's session was all classroom work (no riding), from 6:00 PM to 10:00 PM. Class time was spent going over the first few chapters of the MSF textbook. These chapters are introductions to the various kinds of motorcycles, use of the controls and some basic safety information.
There are twelve students in the class. About half of them already had experience riding, some with street bikes and some with dirt bikes.
The course is led by two "RiderCoaches." However, the classroom work is structured as a set of reviews of material from the textbook and discussion among the students. This bugged me a little—it felt like I was paying money to just listen to other people read the textbook aloud and tell war stories about all the times they almost crashed their bikes. The coaches did provide some interesting information, and kept things moving along, but I'd prefer a less "participatory" kind of class. I want the experts to tell me what I should know; I don't want to get the information from a bunch of other people who are as clueless as I am.
In addition to the textbook, there are also some videos. They weren't bad.
I awoke to thunder, but that didn't matter. The class goes on even if there is inclement weather. They stop it only if there is lightning in the area. So I made sure I had my rainsuit with me.
There was a little bit of lightning in the area when class started at 8:00 AM, so we spent some time in the classroom. Unfortunately, one student showed up late, and was not allowed to continue the course. (Those are the rules.) So we're down to eleven students.
As the weather started clearing, we got to go out to the riding range. The "range" is basically a big asphalt parking-lot-like area where the coaches set up cones for each of the exercises. We each got a gray Honda Nighthawk to ride for the duration of the course.
The initial exercises taught us to mount the motorcycle, get the transmission into neutral, and start the engine. Then we put it into gear and experimented with getting it moving (much like you do with a manual-transmission car). After a lunch break, we had more exercises where we learned how to shift gears, corner, and weave through cones. At the end of all that, I feel like I know how to ride a motorcycle, although I obviously need a lot more practice before I'd be comfortable in traffic.
It was a hot day. The high today was "only" about 90 degrees, which is cooler than it has been lately, but I think the real temperature was warmer on that asphalt pavement. However, when the motorcycle is moving, it doesn't feel hot, so the exercises were a great way to cool off. Thankfully, we didn't need the rainsuits.
After the exercises, we had a couple more hours of classwork, going over various strategies for dealing with risk factors in traffic. There is another guy in the class who has a private pilot's license, and we both noted the similarities between this risk-management training and what we were taught during flight training.
The exercises on the range today were more challenging than those yesterday, including maximum braking performance, maneuvering in tight spaces, swerving, and negotiating turns. Swerving was pretty easy for me, but I had problems with each of the other exercises. I just wasn't able to get into the flow of many of the activities. I felt very tired for most of the day, but I was having fun.
In mid-afternoon, we had "Skills Evaluation," where we had to demonstrate our mastery of several skills. A good score on the evaluation would mean we could waive the state's testing requirements to obtain a motorcycle endorsement on our driver's licenses. I went over the painted lines on the course a couple of times, and hadn't maintained the necessary speed in a curve, so I was concerned that I hadn't passed. The instructor/evaluator said we'd get our scores later.
After parking the bikes, we had a couple more hours of classroom time, followed by a written exam (50 multiple-choice questions). I finished my exam, then waited for my turn to talk to the instructor about my skills evaluation.
He had bad news for me: I had not passed. I was one point short of a passing score. He had to deduct points for the times I went off the course. He said he knew I could perform the skills, but I just hadn't done them very well when it counted. He suggested that I should get a learner's permit and a motorcycle, and practice, and I should have no problem taking the state's skills test.
I got a score of 100% on the written exam, but that was small consolation.
The class ended with some disappointment for me, but it was still a weekend well spent. I had a good time, and would recommend it to anyone who wants to do something fun for a couple of days, even if they aren't interested in ever getting a motorcycle.
According to my bike's odometer, I drove 20 miles during the class. Nobody suffered any injuries: the class is very safe. My left hand is a little sore from working the clutch, and my left ankle is a little sore from shifting gears, but otherwise the activities were not physically strenuous.
I'm checking the classifieds for used motorcycles. I'm not sure whether I'm motivated more by an interest for motorcycles, or a need to prove to myself that I can pass that damned test.
Friday, July 21, 2006
Positioning Myself in the Market
After an eerily simultaneous set of surprising events at work, I have decided that I need to find a new job. I still have my current job, and I don't expect to lose it involuntarily, but I know that upcoming changes will be bad for me, and it is time for me to try something new.
Unfortunately, I don't know exactly what kind of job I'm looking for. Of course, I want a technically challenging job in an interesting industry with pay appropriate for my experience where I get to work with smart people. But recruiters and interviewers don't want to hear that. They want to hear acronyms, names of operating systems and programming languages, desired salary or hourly rate, and answers to the "Where do you see yourself five years from now?"-type questions.
So, I need to come up with a sound-bite-ish subset of the things that interest me. My resumé will contain the depth of my experience and skills, but I need to have a short list of bullet points that will make people exclaim "This is exactly the guy we want!"
First, I'll look at operating systems and programming languages. I am thoroughly sick of writing C++ code for the Win32 API. I've been doing it a long time, and I take pleasure in being good at it, but I'd really like to do something else. Anything else. Ideally, I'd like job using a variety of programming languages and operating systems, but adaptable generalists aren't valued. So, if I have to pick a poison, I'd like a cross-platform Python job, but I'll settle for a .NET C# job. Maybe I can position myself to take advantage of all the new development that will happen when Vista hits the market.
Second, what kind of position do I want? I like being a mentor to junior developers. I like meeting with customers and other stakeholders. I like reading and writing specifications and documentation. I don't like project-management responsibilities. I don't like trying to guess what technologies will be popular five years from now. I'm not the guy with "vision." Maybe the best description of my ideal role is "leader of a small cross-functional software development team." Another good role for me would be "consultant" or "coach," but that doesn't sound important enough
Third, what kind of company do I want to work for? Definitely a small company. I don't like the feelings of powerlessness and the lack of information I've had working a big company. I like having lunch with the company president once in a while. I like it when the salespeople ask me questions in the hallways. I like knowing the names of all the people I see every day. In a big company, I'm just another resource, but in a small company, I feel like a valued, trusted, productive member of a team.
Where do I want to be in five years? I'm still working on the answer to that one.
(And yes, Sean, I will look at those government jobs.)
Monday, July 17, 2006
To hold off the need to buy a MacBook, I've decided to change my Windows notebook into an Ubuntu notebook. I downloaded the Ubuntu self-booting demo CD a couple of weeks ago, and it looked alright, so I'm going to install it on an old laptop.
The notebook in question is a Sony VAIO model PCG-GR300P. I bought it a few years ago, when a 1.13-GHz notebook was considered top-end, and I used it during my (failed) consulting career. For the past couple of years, it has been sitting next to my couch, and I pick it up to check e-mail, write blog entries, and do some occasional programming while watching TV.
I've been doing a lot of Unix-ish and open-source programming in my free time, so I wanted a Unix-based notebook next to the couch. That's the real reason for the urge to buy a MacBook, but if I can get a Linux notebook working, that might be enough (for a while).
I'll write about my tribulations getting this thing working. I don't expect it to be trouble-free.
Monday, 7:47 PM
I installed Ubuntu 6.06 (desktop) from the downloaded CD. I let it erase and automatically re-partition the 40-GB hard drive in the notebook. A lot of stuff is working fine out of the box: keyboard, trackpad, video, and sound are all fine.
The only problem is that I don't have networking. The notebook has a built-in Ethernet port on the back, and also a Netgear WG511 wi-fi PC card, but neither one is working. I did a little investigation of this a couple of weeks ago, and apparently the secret to getting the wi-fi card working is to use ndiswrapper, which I understand to be some sort of utility that lets you use Windows networking drivers on Linux.
Unfortunately, with neither network interface working, I'm not sure how I am going to get any necessary packages and drivers onto the notebook. I'd hate to have to burn CDs on the Mac just to get the files over. Maybe I'll have to get a dial-up connection working.
I suspect I'll end up buying a new wi-fi card that is known to work with Ubuntu out-of-the-box.
Off to the READMEs and FAQs...
Monday, 11:02 PM
Still no joy for networking.
The notebook has an internal Intel PRO/100 Ethernet controller, for which the e100 driver should work. If I try an ifup eth0, it doesn't report any errors other than the fact that the DHCPDISCOVER messages don't get responses. But my router doesn't seem to be seeing those messages. Using a static IP address doesn't work either.
All the Google searching I've done leads to people saying that their Intel Ethernet controllers just work automatically on Linux, or all they have to do is a modprobe -v e100, and then it works.
Time to buy a new wi-fi card, I think. (Or maybe a MacBook.)
Monday, 11:12 PM
After seeing a thread about problems with the e1000 driver (http://www.ubuntuforums.org/showthread.php?t=149941), I tried the following sequence of commands:
sudo rmmod e100 sudo insmod /lib/modules/2.6.15-23-386/kernel/drivers/net/e100.ko
Then, I reactivated the eth0 interface, and it got an address through DHCP. I could then ping other machines on the local network.
However, it couldn't get out to the Internet. Names weren't being resolved. I manually added the DNS server addresses that my other home machines have, but that didn't help.
So I rebooted, and then everything worked. Just like Windows!
Now I'm updating and installing packages (apt-get rocks). Tomorrow, I'll look into getting the wi-fi working.
Tuesday, 9:16 PM
I'm going to try to get the wi-fi card working. There is information on the Ubuntu site and elsewhere on the Internet for using the Netgear WG511 card with Linux, but the information is inconsistent and I think much of it is out of date.
My particular card is labeled "v2.0" and "Made in Taiwan." Here is the output I get from lspci -v:
0000:03:00.0 Network controller: Intersil Corporation Intersil ISL3890 [Prism GT/Prism Duette] (rev 01) Subsystem: Netgear WG511 Wireless Adapter Flags: bus master, medium devsel, latency 80, IRQ 9 Memory at 34000000 (32-bit, non-prefetchable) [size=8K] Capabilities: [dc] Power Management version 1
According to https://help.ubuntu.com/community/WifiDocs/WirelessCardsSupported and https://help.ubuntu.com/community/WifiDocs/Device/NetgearWG511andNdiswrapper, the cards labeled "Made in Taiwan" should work out of the box. Mine didn't when I tried it yesterday. I guess I'll try the same rmmod/insmod dance I did with the internal Ethernet interface driver.
Tuesday, 9:33 PM
OK, I feel a little stupid. It turns out that the WG511 was working all along. I just had to go into its Properties page and select an available wireless network, then enter the WEP key, and now I'm wi-fi'ing.
Wednesday, 11:20 PM
I can access shared directories and the shared printer on my Windows box from Ubuntu. No problems there.
However, the notebook is suffering from lock-up problems. Every once in a while, the screen just freezes, and the trackpad and keyboard have no effect. The only recourse is to cycle the power. I have no idea what is causing it, but it is really annoying.
Thursday, 8:20 PM
I'm not positive, but I think every time that my notebook has locked up, I was running one of the GUI package-management applications. Following a lockup, a command-line apt-get update results in an error message. A subsequent apt-get works fine, so it seems like something is getting corrupted when I run the package managers. I'll try using just apt-get for a while to see whether that eliminates the lockups.
Next Tuesday, 12:19 AM
After refraining from using the package management apps, the random lockups have stopped. However, I can usually get a lockup if I start Firefox right after logging in. The simple solution is to just wait a minute or so before starting Firefox. I wonder whether the network stuff might take a while to get initialized...
Next Tuesday, 8:22 AM
Mozilla doesn't cause lockups like Firefox does, so that's now my web browser.
Here are a few little things I discovered along the way:
- To enable anti-aliased fonts with subpixel rendering (great for LCDs), go to System -> Preferences -> Font and choose the appropriate button.
- Install kompose to get a feature like Mac OS X's Exposé.
Linux usability has gone a long way since I last played around with it. Installing Ubuntu was relatively painless. I had a little frustration with the network interfaces, but apparently the wi-fi worked out of the box, and the internal Intel PRO/100 network interface works fine for everyone but me. This is a big improvement over the good old days when getting the right drivers and configuration for all the hardware for a new Linux installation could take days or weeks of experimentation. I didn't have to rebuild my kernel, and never had to study a HOWTO.
The Ubuntu desktop is a lot prettier than the GNOME desktops I've seen in the past. It's not a Mac, but it's as pleasant to use as a Windows box.
I have a few complaints:
- The user interface feels slow. It's usable, but the notebook is not as snappy as it was when it was running XP. Even a simple app like the Terminal takes several seconds to start up, and it is slow to redraw when windows are exposed or moved. Firefox is a pig. Eclipse is practically unusable.
- XEmacs looks and feels like crap with the Motif-ish widgets. It may be time to learn vim.
I'm going to try to live with Ubuntu for a few weeks, but I suspect I'll have a MacBook before too long.
iMac Fixed at the Apple Store
After two weeks out of town, I finally had an opportunity to take my malfunctioning iMac G5 to the local Apple Store for repair. I expected that I'd just have to drop it off there, and then in a week or two I'd be able to pick it up.
When I got to the store, I was asked to sign up for an appointment at the Genius Bar. This can be done online, but I figured the Genius Bar was for people trying to figure out how to get their Anne Murray collections onto their iPods, not for hardware repairs. It was 11:15, and the next open appointment was not available until noon, so I spent 45 minutes looking at MacBooks. I came really, really close to buying one, but my will didn't break.
Promptly at noon, my name was called and I explained my problem. The tech took my iMac to the back room, and I spent about fifteen minutes sitting at the bar. A lot of that time was spent listening to a conversation between a customer who just wanted to drop off an iMac for service, and a manager who kept explaining that they don't let people just drop off machines without talking to a tech to ensure that there is an adequate description of the problem and that basic troubleshooting has been done. The guy got irate, repeatedly saying "I can't wait around all day." Finally, the guy said he'd just have his daughter bring it in herself, and left with a sour look on his face.
The tech returned with my Mac, saying she had replaced the power supply. Then there was some paperwork to do, which took about as long as the repair did, and then I was on my way. Total repair+paperwork time: 30 minutes (not including the 45-minute wait). No charge.
I'm typing this blog entry on the iMac, and it appears to be working fine. In fact, I am amazed at how quiet it is now. Apple's original ads for the iMac G5 all claimed that it was "whisper quiet," but my experience has been that the iMac is as noisy as any other computer. Now, it really is silent. I guess the power supply has been overheating all along.
So anyway, I'm happy. Now I just wonder how many days I can hold out before I have to buy myself a new MacBook.
Saturday, July 01, 2006
This audio file has been making the rounds on the Internet: Cancelling AOL.
AOL's official response to this incident is to claim that it is an aberration. But when you listen to the call, it seems pretty clear that the "retention specialist" is following a script and doing what he thinks his job is. This is not a case of an overenthusiastic AOL employee: this is standard AOL policy.
I had a similar experience when I cancelled my AOL account years ago. After asking to close it, I was subjected to many, many questions about why I wanted to cancel, how I use the account, and whether I knew about all of AOL's wonderful services. So I just want to add my "This happened to me too" comment to the net.
Flaky iMac G5
I've described problems with my iMac G5 before. A new problem appeared last night: the machine suddenly turned itself off, and would not turn back on. I tried pressing the power button several times, but nothing happened; it was as if the power was not plugged in.
I figured the power supply died. I have a first-generation iMac G5, and they have known power issues. So I figured I'd be without my Mac for a couple of weeks while waiting for Apple to fix it. And unfortunately, I'm going out of town this week, so I wouldn't be able to attend to this until I got back.
Using my Windows laptop, I went to Apple's support site, and found an article about troubleshooting when the Mac won't turn on. I removed the back cover as directed, then spent a few minutes trying to find the four LEDs pictured in the article. The inside of my iMac doesn't match the pictures in the article. It would have been nice if they had a picture or diagram showing where in the Mac those four LEDs are. I didn't find the LEDs until I plugged in the power cable.
One of the LEDs turned on, which was a good sign—it meant that the power supply was getting power from the outlet. The next instruction in the article directed me to press the internal power switch. Again, I spent a long time trying to find that switch. I finally found one that looked like it might be the right one, so I pressed it, and the iMac turned on. Another good sign.
At that point, I thought my problems were solved. I replaced the back cover, and pressed the external power switch. It wouldn't turn on. The article said that if that happened, then I needed to order a new back cover. Buying a whole new back cover seems like overkill, when the problem is probably just a flaky switch.
After rechecking the back cover to ensure everything was seated properly, I tried the external power switch again, and this time it turned on. Great! Problem solved, right? Not quite: after a couple of minutes, the Mac turned itself off for no apparent reason.
I turned it on again. It has stayed on during the time I've typed this entry. I hope it stays that way.
Every time I start seriously thinking about buying a MacBook, something flaky happens with my iMac, and so I decide to hold off on the MacBook purchase until the second generation appears.
(While typing that last sentence, my iMac lost connection to the Bluetooth keyboard. I turned the keyboard off and back on, and now it is fine. Maybe it just needs new batteries, but it's spooky how everything always seems to go wrong at once.)
Update: It's still shutting itself down. The shutdowns happen most often in these two cases:
- about a minute after starting up
- when being awakened from sleep
Another update: I chatted with an Apple support agent, and was told it seems like a hardware issue, so I need to take the Mac to an Apple Authorized Service Provider. My choices are the local Apple Store, or the local CompUSA. I think I'll give the Apple Store a try.