Welcome to MSDN Blogs Sign in | Join | Help

Why does C# always use callvirt?

This question came up on an internal C# alias, and I thought the answer would be of general interest. That's assuming that the answer is correct - it's been quite a while.

The .NET IL language provides both a call and callvirt instruction, with the callvirt being used to call virtual functions. But if you look through the code that C# generates, you will see that it generates a "callvirt" even in cases where there is no virtual function involved. Why does it do that?

I went back through the language design notes that I have, and they state quite clearly that we decided to use callvirt on 12/13/1999. Unfortunately, they don't capture our rationale for doing that, so I'm going to have to go from my memory.

We had gotten a report from somebody (likely one of the .NET groups using C# (thought it wasn't yet named C# at that time)) who had written code that called a method on a null pointer, but they didn’t get an exception because the method didn’t access any fields (ie “this” was null, but nothing in the method used it). That method then called another method which did use the this point and threw an exception, and a bit of head-scratching ensued. After they figured it out, they sent us a note about it.

We thought that being able to call a method on a null instance was a bit weird. Peter Golde did some testing to see what the perf impact was of always using callvirt, and it was small enough that we decided to make the change.

Posted by ericgu | 10 Comments
Filed under:

Looj Review

As many of you know, we have lived with a Roomba for a few years. He's been a faithful servent, though our cleaning people sometimes unplug the charger and don't plug it back in.

A while back I got an email that said "Looj on Woot!". Woot!, as many of you know, is a website that specializes in selling something different every day. And Looj is a gutter-cleaning robot from iRobot, the maker of the Roomba. A week or so later, the Looj showed up at my door, but I only got around to reviewing it today.

Unlike the Roomba, the Luje is not authonomous. So, strictly speaking, it's a radio-controlled gutter cleaner rather than a robotic one, but I'm willing to cut them so slack on this. It has two parts - there's the main body of the robot, which is about 12" long, 2" wide, and perhaps an inch and a half tall. On the front is the cleaning part, which has rubber flaps and some strong brushes.

Attached to the top is the handle/remote control.

I got up on my roof today to try it out. I have a few leaves, a few needles, a bit of moss, and a whole lot of maple tree seeds (aka "helicopters"). It's all fairly dry because of the time of the year.

To use it, you set it in the gutter, turn it on, and detach the handle. Turn on the auger, and then you just drive it forwards and backwards like an RC car. In most cases, it will clear all the debris in the first pass, but sometimes there's enough that it climbs on top a bit, and you have to reverse and then move forward to clean it all out. Or, you can drive forwards in spurts when you hit a lot of debris.

It works really well. I only ran into two problems. In one of my gutters, the Looj rolled over on its back, but since the tread design is symmetrical, it works fine on the back as well. The second problem I had was when I drove it over a short maple tree which got tangled in the auger and the auger clutch released (this doesn't damage the Looj). I untangled it, pulled out the tree, and finished that section of the gutter (the Looj manual tells you not to try to remove trees...)

So, I did all the gutters - perhaps 120' - in about 15 minutes. Now, I did it from the roof, so I didn't have to move the ladder, but it was still remarkably painless. And it's pretty cheap for what it does - about $100 for the basic model.

Recommended.

Posted by ericgu | 1 Comments
Filed under:

Again

I was really just trying to get people to smile when they read about it.

Last Sunday night (the 9th), I played another game of indoor. I felt pretty good, and though I got run into fairly hard at one point, I thought that the guy who ran into me came away worse than I did. At the end of the game my right ankle was sore, but everything else was fine.

Tuesday morning, I woke up, and my side hurt. I tried to deny it, but by Thursday morning, it was clear. The guy who hit me must have run into me with a knee, because I have another hurt rib (on the lower-left quadrant - one of the short ribs, another new spot for me). I'm not sure whether it's bruised or cracked, but I do know that it's pretty painful. The 30 miles I did on the bike on Sunday were about as pleasant as 7 hills was (ie not much), and I skipped this Sunday's soccer game (it's better to spread the injuries out rather than enjoy them all at once). So, it's another 2-3 weeks of pain, though the only really bad time is when I first get up in the morning and stretch.

The only upside for this is that I've been looking for a good excuse to skip RAMROD this year, and I figure the double-rib qualifies.

Posted by ericgu | 2 Comments
Filed under:

Conference wrap-up...

After a bit of time to recover from my back-to-back conferences (TechEd 2008 in Orlando and the 2008 HealthVault Solutions Conference in Bellevue), I have a few thoughts to share.

I haven't been to TechEd for a few years, but TechEd is still TechEd. The developer division, however, has seen a lot of turnover, and I was surprised to find how few Microsoft people that I knew were in attendence. I did two "lunch talks", which is code for "we don't know what track to put you in...". You only get 45 minutes for your talk (after which they come in and tell you to get off the stage), but on the plus side, you don't have to go through any slide review process. I did a HealthVault introduction that went relatively well, and a "write lots of code" talk that went well except for some demo slowness (more on that later). There were about 50 attendees in each session, which is pretty good for a lunch session because of the hassle of attending them.

I'm disappointed that TechEd no longer devotes a night to "ask the experts". Instead, the MS people have to do "booth duty", which means you stand at your designated section for hours and hope that somebody will come by to talk to you. From watching and talking with a few MS people, that meant a lot of hours where you just stand around, and even when people come by to talk, the MS person who is best equipped to answer the question may not be there.  

I talked with developers at all the meals, and had some good conversations. I ran into 3 developers who worked in the Health area but had never heard of HealthVault. It means we have some work to do to find out why those developers don't know about us, but it also means that we have some nice opportunities to reach a new audience.

Splitting the conference into two sections (dev for 4 days, IT for 4 days) was a positive move for the people I talked to, and made it a bit more intimate (if you can properly apply that term in a conference that big).

Two things I suggest not doing at a conference:

First, don't try to write a presentation for a second conference while you are at a conference. It's really hard to do well.

Second, don't check your bag at the conference center, unless you want to spend 35 minutes to do what will take you 5 minutes at the airport. The shuttles to the airport were nice, however.

After the week at TechEd, I headed back for the

HealthVault Solutions Conference

Which was held Mon/Tue of the next week in picturesque downtown Bellevue (come see our construction) at the Hyatt Hotel. This was a great conference - everybody was uniformly friendly, and because of the partner approach the conference is as much about partner <-> partner interaction as it is about Microsoft <-> partner interaction. Monday featured a keynote and then a very complex demo involving live code from lots of different partners working together, put on by my team (but with very little effort on my part). The demo was nearly flawless, and if anything, they made it look a little too effortless. It was very compelling.

Tuesday started with a keynote by Dr. Oz, a cardiac surgeon and gifted speaker. After a product roadmap talk (that I skipped to get set up for our technical track), we had the following talks:

  • An architecture talk by Bert and Sean
  • A data type talk by Tim and Eric
  • (lunch)
  • A development talk (same talk I did at TechEd) by Eric
  • A third-party-library and other topics talk by Chris
  • A Patient Connect talk by Kalpita

The talks all went well, with the exception of Eric's. Apparently he forgot to modify his proxy settings to be used outside the firewall, so everytime he made a request it had to time out finding the proxy server before it completed. He is disappointed that he didn't figure this out before the talk, and apologizes to all those who put up with the slowness.  

Our goal is to re-use the slides and get them on MSDN in some form. I'm probably going to take the development talk about make a tutorial out of it.

Posted by ericgu | 3 Comments

Answering a question nobody asked...

I'm on a break between sessions at TechEd, downstairs in one of the cavernous halls. Something like 400 yards from from to back (yes, I paced it off). I was looking for a comfortable place to sit for a few minutes, and found that the MSDN Zone has a big space with about 20 bean-bag chairs in it. I walk around the side, and am surprised to find that there are a few empty ones. I gracefully lower myself - as gracefully as my middle-aged body will let me right now - and settle in.

Disappointed! 

Apparently, somebody thought it was important to answer the question "what if I made something that looked like a bean-bag chair but stuffed it with cheap fiberfill instead?", and somebody else thought it was a good idea to answer the question "will people like these better than bean-bag chairs?"

Questions that nobody had every really asked before, but for good reason. The whole point of a bean-bag chair is that the user gets to modify the chair to their own personal support requirements. If you want to flop out, you mush it out flat. If you want to sit up - and perhaps use your laptop - you smush it so that it provides good support.

This "chair" is okay for flopping on, but despite a bit of swelling at one end, provides little in the way of support. After trying a few positions, I'm writing this while I'm in "street luge" position - my legs stretched out in front of me and my head just slightly raised up - which manages to look fairly relaxing without being relaxing at all.

Posted by ericgu | 1 Comments

Meet me at TechEd...

If you're at TechEd this week and are bored Tuesday afternoon, I'll be hanging out in the community lounge (in the basement near the online labs area) during the afternoon.

I'll try to make the 3-mile walk to the back of the basement room worth your while.

Posted by ericgu | 0 Comments

Indoor

This spring I decided to start playing indoor soccer. I had played in the informal Microsoft outdoor lunchtime games a few years ago, but decided to do something different because a) it's hard to find time in the middle of the day, b) my group ride is Tue/Thu evenings, and iii) I might get wet and stuff.

I needed to do something other than cycling because cycling specialists have trouble running to save their lives and have the bone density of 75 year old grandmothers.

So, I signed up for the "over 40" league at Arena Sports in Redmond. We play on Sunday nights.

The first few weeks were hard. My atrophied soccer skills were complimented by my disused running muscles and my untrained anaerobic system, but over time I started to make progress in all those areas, and the day at which I could actually walk without wincing became Monday rather than Thursday. I did get a rather spectacular skinned knee, and have therefore become a devotee of Tegaderm, a truly wondrous wound dressing (Seriously, it's great stuff).

About 10 days ago, I scored two goals (one floater, one hard shot with a move before hand (I played defender for years, and my skill with "moves" is fairly limited)). I also left the field with Grade 1 Turf Toe, which was notably painful at the time. By Sunday, it was healed well enough that I could show with only a moderate lack of judgement, to play a double header. The games have blurred together, but both were against the top teams in the league and both featured some pretty skillfull players. Playing defense, I blocked one shot with my left leg, leaving a nice imprint of the ball across my knee. And I blocked another killer hard shot with my upper right chest, leaving me with...

Longtime readers (Hi George and Fred) have probably figured it out already...

Cracked rib.

To go with #2 and #3. #1 is not chronicled yet, but involves people asking me if I was alright from a chairlift and lots of animated waving by me.

This one - which I'm considering naming "Stanley" - is still in the "hurting more each day" phase, so it's not clear how it will compare to the others in terms of overall pain. Given how much it hurt to get out of bed today, I'd have to say I fancy its chances. I am happy that this is in a different place than the last two so the experience will be different.

The *real* question is whether this is the "reason" (ie "excuse") I drop off of the waiting list for RAMROD.

I'm going to ride 7 hills on Monday, doing a distant but undoubtably far whinier imitation of Tyler Hamilton in the 2003 Tour. The smart money is on the "7 hills" variant rather than the "11 hills" version, though some savvy betters have chosen "4 hills".

To make it easier to track my rib-cracking antics (a pretty good name for a rock band), I've added the "CrackedRib" tag to my blog.

Enjoy.

Posted by ericgu | 4 Comments
Filed under:

My TechEd Presentations...

I've been working on my TechEd HealthVault development slides for the past week or so. I'm taking the "build an application from scratch" approach, which I think will work well but has a lot of interesting challenges.

If you want to show up on Friday to shout helpful suggestions like "you forgot the semicolon" (ie "heckle"), here's the information:
 

Dev Conference LUN05 Developing Microsoft HealthVault Applications
Session Day/Time: 6/6/2008 12:00PM-12:45PM
Room: S220 A
 
Dev Conference LUN06 Introduction to Microsoft HealthVault
Session Day/Time: 6/4/2008 12:00PM-12:45PM
Room: S230 E (DEV)

Note that LUN06 happens on Wednesday, and LUN05 happens on Friday, for a reason that I know better than to ask for.

I will be there from Tuesday-Friday, so if you want to catch up and complain about how I don't write anything useful any more, let me know.

 

 

Posted by ericgu | 0 Comments

Individual Empowerment and agile...

(Interestingly, I find myself writing more about agile and team stuff now that I'm not on a development team....)

 

This is in response to a question about how you balance individual empowerment with the collaborative approach on a agile tem... 

 

*** 

 

Agile is all about the team, and being on an agile team requires participants to give up some autonomy towards the team. The team is empowered to do what they need to do to reach their goal. If there are issues around how things should be done or what decision is right, the team needs to come to a decision, and I would encourage management to let the team try to do it.  Further, the team needs to “meta rules” around how to make decisions, and they also need to develop those.

 

This is very different than the “alpha geek” culture that exists in some groups, where a small number of developers are interested in wielding power. There are some individuals who just aren’t willing/able to work collaboratively – I’ve worked with a few, and if you are trying to run an agile team, they are likely better in a different position.

 

One of the teams I was on basically came to this agreement:

 

Developers are expected to use their best judgement when deciding what advice to seek when they are doing development.   There are no rules around when you should seek advice, but as a rough guideline, extending functionality under existing patterns is something you can safely do on your own, and big refactorings or new components are areas when you should definitely seek advice. In between, think about the implications of any design choices you might make, and act accordingly.

 

The other approach is to adopt pair programming, which is a bigger cultural change, but generally if you get two people thinking about decisions they usually make the right decision about involving others.

Posted by ericgu | 1 Comments
Filed under: ,

HealthVault Vocabulary Browser

I wrote a little utility to browse vocabularies that I thought you might be interested in.

It uses the HelloWorld app id, so you should just be able to dump it to a directory and run it.

Posted by ericgu | 1 Comments
Filed under:

Being greener

For most of my life, I've been a "small e" environmentalist. I'm not outspoken on my views, but I really hate to see needless waste. For me, that's meant keeping cars for a long time rather than replacing them, spending a little more on stuff that will last so I don't need to throw as much stuff away, and getting books at the library. Stuff like that.

I haven't, however, put as much effort into applying the same principles to my profession, and over the past few months, I've been working to be more reasonable in that area as well.

I've come up with a few practices that I thought I'd pass along, as part of what I'm calling "Green Programming - Simple practices to make the world a better place..."

Practice #1:

Consider the following code:

    if (x > 5)
    {
        i++;
    }

Now, if I need to change it so that 2 is added to the value of i rather than one, I would probably do the following:

First, I'd select the line with the increment:

    if (x > 5)
    {
        i++;
    }

hit "delete":

    if (x > 5)
    {
    }

and then type in the new line:

    if (x > 5)
    {
        i = i + 2;
    }

I've done that sort of thing millions of times in my career. But not any more. Here's what I do now:

First, delete the characters that I no longer need. In this case, it's just the second "+" sign:

    if (x > 5)
    {
        i+;
    }

 then, insert " = i "

    if (x > 5)
    {
        i = i +;
    }

 and finally, " 2":

    if (x > 5)
    {
        i = i + 2;
    }

In my first version, I deleted 12 characters (plus a carriage return and linefeed), and then added 20 new characters. With my new approach, I deleted 1 character and added 7 characters. That small change reduced my deletion percentage by 91.67%, and my new character percentage by a less impressive but still impactful 65.00%.

Practice #2:

The first practice made some great improvements, but I thought there was more to be had. I found that I could keep open a session of notepad, and rather than deleting the characters from my code, I would copy them to notepad, for possible reuse later. Unfortunately, since I write a lot of new code, I tended to exhaust this resource fairly quickly, and was forced to fall back on typing new characters.

Practice #3:

To give me a better source of recycled characters, I came up with a new approach. Not only do I copy characters to notepad before deleting them, when I need to delete a source file, I copy *all* of it's contents to my notepad buffer before deleting the file.

I am proud to report that I now am justified in believing that I am "character neutral" in all of my coding. That made me quite happy, until I realized that I still had a problem.

It was my blogging. I tend to write a fair bit on my blogs (3-5 depending on how you count them), but because of my natural eloquence and low quality standards, I rarely delete stuff, and therefore keeping a buffer for my blog writing was problematic. I tried using my programming one - it certainly is sufficiently full that it won't run out quickly - but I found that I tended to have some problems with expression ("I regret I have but one life to give foreach my country"), not to mention developing having to write lines like this:

(){=();="");(<,>){=.;=..;=..;<>=<>();(());(..()){=;}}

to use up some of the excess punctuation.

So, that clearly wasn't workable, but just yesterday I came up with a great idea. I'm now recycling all the contact spam that is *already generated* by my blog into my blog buffer, and I'm considering re-using the splog links I keep getting, which would be especially convenient as they already have the words that I like to use.

So, that's my little contribution, because as I like to say, if you're not part of the solution, you're part of the problem. Or the precipitate.

Future Ideas:

I haven't thought all of these through fully, but here's a list of other ways you might "recycle and reuse":

  • Don't throw away that command window you're using and create a new one. Reuse the existing one.
  • Keep old classes around to use as the starting point for new ones.
  • As some believe in "Peak Oil", I fear that we've already reached "Peak Guid", and that the days of $4 guids are in sight. I therefore recommend that you save all of the guids that you generate. Sure, it may be 15 years before the software that you used them in is gone and you're free to reuse them, but if you're the guy with 500 guids in your pocket during the Guid crisis of 2025, you're going to be sitting pretty.

What practices can you add?

(composed of 100% post-consumer characters)

Posted by ericgu | 8 Comments
Filed under:

Uncanny valley

Try this on your second monitor...

(yes, I know it's not fully rendered, but "Ew")

Posted by ericgu | 0 Comments

International Dance Party

What a nice build. Make sure to watch the video:

International Dance Party

 and you might want to take a look at the manual...

Posted by ericgu | 0 Comments

Project managers for agile teams...

A recent question about skill requirements for project managers of agile teams led me to write this:

In traditional project management, “project manager” means “person who is in charge”. In other words, that person makes the decisions, with varying degrees of depth (sometimes it’s high-level, sometimes it’s micro-management).

 

Agile doesn’t have somebody in change – inherent in the concept of agile is that the group is responsible and the group decides.

 

There *is* somebody who facilates (scrummaster in scrum, coach in XP), but their job is very explicitly not to make decisions. That means that the person who takes that role needs to be mindful of that and willing to push any decisions that rise up back down to the time. If the person has previous experience (and a preference) for “being in charge”, they are unlikely to do a good job in that role. If they aren’t thoughful about group dynamics in general, they may not do a good job in that role.

 

Double that comment if the group is not experienced with making decisions together. If they tend to defer upwards and the facilitator is used to making decisions, you probably won’t get a good result.

 

Posted by ericgu | 1 Comments
Filed under:

Job openings in the HealthVault team...

Long-time readers (who I like to refer to as "those three guys") know that I rarely blog about job openings, but I've decided to make an exception.

The HealthVault team is building a platform to solve "real important" HealthCare problems that affect the lives of "real people". We're a small but growing group that still has that "new group" smell to it, and we're looking for people who would do well in that sort of environment.

If you want to find out more information, you can find it at the Microsoft Career site (choose "Health Solutions Group" as the product). If you don't want to find out more information, you can find it at the bottom of a locked filing cabinet stuck in a discused lavatory with a sign on the door saying "Beware of the Leopard".

Or so I'm told.

 

Posted by ericgu | 1 Comments
More Posts Next page »
 
Page view tracker