Goodbye 2006, Hello 2007

2006 has been a great year where I've reached several milestones.  Here are some of the important events that took place in my life in 2006:

  • In January, I flew out to Redmond, WA to interview for a full time job at Microsoft.  They made an offer and I accepted.
  • In May, I graduated a year early from RIT with a Bachelor of Science degree in Computer Science along with minors in both Communication and Entrepreneurship.  I achieved my goal to graduate with a 3.7 or higher GPA.
  • In July, I moved across the country from upstate NY to Seattle, WA to start my career at Microsoft.  I'm a Program Manager (PM) on the Common Language Runtime (CLR) team where I help design APIs in the base class libraries.  Among other things, I am the PM owner for most of the types in the following namespaces: System, System.IO, System.Text, System.Text.RegularExpressions, and System.Resources.  I also contribute to the BCL team's blog.
  • In late October, I met my wonderful new girlfriend Deborah.

Here are my goals for 2007:

  • Be a great PM.
  • Balance work and life.
  • Work out at least 3 times a week.
  • Create and launch a software product in my free time.
  • Blog at least twice a month.
  • Read at least one book per month.
  • Buy remaining items for my apartment:
    • Coffee table
    • Large flat screen TV
    • TV stand
    • Aeron chair
    • New desk
  • Buy a condo or house.

I hope to make 2007 even better than 2006.

Posted on January 1, 2007 at 11:55 PM | Permalink | Comments (2)

What's going on in building 42?

My OfficeRobert Scoble is wondering what's going on in building 42.  His curiosity seems to be the result of John Lam's recent announcement that he will be joining Microsoft as a Program Manager on the CLR.

Well, Mr. Scoble, today is your lucky day.  Since I'm a Program Manager on the CLR, and building 42 is where I work, I'm going to tell you a little about what's going on here.

First, there are tons of really talented people working in 42.  It still amazes me seeing these individuals on a daily basis around the building and cafeteria.  Just the other day I was in an elevator with Don Box.  Often I'll see him chatting with Chris Sells.  And Brad Abrams, a former Lead Program Manager on the CLR, is just upstairs.  The list goes on and on.

<tangent>Speaking of Brad, I noticed that he linked to John Resig a couple weeks ago on his blog.  That was kind of neat because both John and I went to RIT.  I seem to remember being in at least one computer science class with John, but he probably doesn't remember me.</tangent>

So a lot of talented individuals work in building 42.  I have the pleasure of working with many of them day-to-day.  But working on what?

Now that the Orcas October CTP is out, I can finally talk about some of the stuff we've been working on.

  1. A new high performance set collection.

    HashSet is a new generic collection that has been added to the System.Collections.Generic namespace. It is an unordered collection that contains unique elements. In addition to the standard collection operations, HashSet provides standard set operations such as union, intersection, and symmetric difference.

  2. New IO types that expose almost all pipe functionality provided by Windows.

    Pipes can be used to achieve inter-process communication (IPC) between any process running on the same machine, or on any other windows machine within a network. We've added managed support for both anonymous pipes and named pipes. Anyone familiar with streams should be comfortable using these new APIs to achieve IPC.

  3. A new date time data structure that can specify an exact point in time relative to the UTC time zone.

    The current DateTime is insufficient at specifying an exact point in time. DateTimeOffset represents a date time with an offset. It is not meant to be a replacement for DateTime; it should be used in scenarios involving absolute points in time. DateTimeOffset includes most of the functionality of the current DateTime API and allows seamless conversion to DateTime as well.

  4. Support for time zone conversion, enumeration and serialization, including cases where Daylight Saving Time rules change over time.

    TimeZone2 actually made it into the Orcas September CTP, so this one has already been public for over a month.  Kathy blogged about TimeZone2 here and here and put together a nice starter guide to using it.

I'm personally very excited to finally get a set collection in the framework.

We will be talking more about these features this week on the BCL Team blog, so head over there if you're interested in hearing more about what the BCL team has been working on.

Posted on November 1, 2006 at 01:52 AM | Permalink | Comments (1)

Adding a SettingsSaved event to your project's Settings class

.NET 2.0 makes it much easier to add settings to your application. If you're using Visual Studio 2005 to develop your .NET 2.0 application, adding settings to your app is even easier.

The Settings class generated by Visual Studio is a subclass of ApplicationSettingsBase which provides four events:

  • SettingChanging - raised before a setting's value is changed.
  • PropertyChanged - raised after a setting's value is changed.
  • SettingsLoaded - raised after the setting values are loaded.
  • SettingsSaving - raised before the setting values are saved.

A while back I needed an event that is raised after the setting values are saved, so I added a SettingsSaved event to the Settings class.

To add this event to your project's Settings class, add a file called Settings.cs to your project (if it doesn't already exist) and add the following code.

Settings.cs
using System;
using System.Configuration;

// Change "MyApplication" to the name of your project
namespace MyApplication.Properties {
    internal sealed partial class Settings {
        #region SettingsSaved Event
        public event EventHandler<EventArgs> SettingsSaved;

        private void OnSettingsSaved(EventArgs e) {
            EventHandler<EventArgs> handler = SettingsSaved;
            if (handler != null) {
                handler(this, e);
            }
        }

        public override void Save() {
            base.Save();
            OnSettingsSaved(EventArgs.Empty);
        }
        #endregion
    }
}

Feel free to use this in your own projects.

Posted on September 9, 2006 at 10:24 PM | Permalink | Comments (0)

Jeff Atwood is Wrong

Over at Coding Horror, Jeff Atwood talks about Properties vs. Public Variables.  I agree with everything Jeff has to say except his first point:

When is a property not a property? When it's a glorified public variable.

Why waste everyone's time with a bunch of meaningless just-in-case wrapper code? Start with the simplest thing that works-- a public variable. You can always refactor this later into a property if it turns out additional work needs to be done when the name value is set. If you truly need a property, then use a property. Otherwise, KISS!

This is wrong. Wrong Wrong Wrong.  You should never, ever, under any circumstances, use public fields.  The main reason for this is that fields and properties are very different things.  Jeff's advice that "you can always refactor this later into a property" is just plain wrong.  Changing a public field to a property is a potential breaking change. A good description for why this is the case can be found here.

Using public fields is setting yourself up for failure.  It limits what you can do in the future.  If for some reason you need to do some extra work when the value is set, you're sore out of luck because you can't change the public field to a property without potentially breaking other code.

I think the main reason Jeff brought this up is because using properties can be verbose.  Compare this...

// Public field
public int Age;

With this...

// Public property
private int m_Age;
public int Age {
    get { return m_Age; }
    set { m_Age = value; }
}

The public field above is much less verbose than the public property.

In the comments of Jeff's post, someone brought up the point that a shorter C# syntax for properties might be in order and offered the following:

// Potential new public property syntax
public property int Age;

I've actually thought about this myself a great deal and arrived at the same exact syntax a long time ago.

I'm willing to bet that Anders Hejlsberg has thought about including this syntax in the past but has rejected it as something that's not truly necessary.  Adding another way to make a property can also make things more ambiguous.  Having the separate getter and setter blocks makes things very clear what is going on.

Still, this new syntax would be a nice little addition that shouldn't be too hard to implement.  It's basically just syntactic sugar.

Anders is actually an architect on one of the features I'm currently working on, so I'll have to ask him about this the next time I see him.

Posted on August 9, 2006 at 01:15 AM | Permalink | Comments (3)

Blue Angels

Today I went over to Marina Park to see if I could see the Blue Angels from there. Turns out I could! The air show was taking place much further down the lake than where I was, but I was still able to see a lot of what they were doing.

This was actually the second time I've seen the Blue Angels perform over Lake Washington. The first time I saw them was several years ago when I was visiting my aunt and attending a summer program at the UW. My aunt and uncle took me down to some park on the west side of the lake to see if we could see them. I don't remember actually seeing much of the show, but I do remember one Blue Angel flying right by us. It was incredible. The Blue Angels fly very low to the ground as part of the show, so it was amazing to see one fly by so close. It zipped by us practically without a sound, followed by a loud boom.

Even though I didn't get to experience a close flyby this time, it was still neat to be able to see most of the show from a distance. Enjoy the pictures.

Posted on August 6, 2006 at 11:55 PM | Permalink | Comments (0)

Intern New Graduate Tech Fair 2006

On Tuesday afternoon I was able to duck out of work for a few hours to attend the Tech Fair for new graduates and interns at Microsoft. The Tech Fair featured a free t-shirt, free food, exhibits of Microsoft's latest technologies, and a keynote by CEO Steve Ballmer. It was also a chance to meet up with some other new grads and interns.

Ballmer's keynote was pretty good. First he talked a bit about Microsoft and then he opened it up and took questions from the audience. A lot of the questions revolved around Microsoft's recently announced iPod killer: Zune.

As far as the tech exhibits go, there were booths for nearly every interesting product group at Microsoft. Most had demos of new products that will be coming out in the near future. From what I could tell, these exhibits were mainly for the benefit of interns—many of employees tending the booths were actively recruiting interns to join their teams full time.

I'm pretty glad to be on the team I'm on right now, so the recruiting aspect wasn't really applicable to me. But I did get to see some cool new technologies. I also got to hang out with a bunch of other new hires like me. Not to mention all the free stuff and getting to see Steve Ballmer (all the while during work hours). Good stuff.

Posted on July 28, 2006 at 12:16 AM | Permalink | Comments (0)

Portland Code Camp 2.0

Friday night I drove down to Vancouver, WA to attend Portland Code Camp 2.0 on Saturday. My motivation for going was mainly just to meet a few people who were presenting.

First, I got to meet Scott Hanselman. I'm a big fan of Scott. He has an excellent blog and podcast and is a great public speaker. Scott's session on PowerShell was very good—I'm starting to see why Scott is so excited about it.

Second, I got to meet Chris Sells, who I'm also a big fan of.

Third, I got to see Rory Blyth (of .NET Rocks! fame) do a presentation on WCF. Rory is hilarious and he didn't disappoint.

I also got to meet Wilco Bauwer who gave an interesting talk on his current pet project: IronRuby. Wilco is from The Netherlands and is here interning as a developer at Microsoft. Turns out he works in the same building as me, albeit one floor above. I'm glad I got a chance to meet him, he really knows his stuff.

Lastly, even though I didn't attend any of his sessions, I got to sit around and talk with Rick Strahl. I wish I had attended one of his presentations because other attendees were raving about how good they were. I'll definitely have to sit in on one at next year's code camp.

Overall, Portland Code Camp was very worthwhile. Not only did I get to meet a bunch of really great people, I also learned a thing or two!

Posted on July 24, 2006 at 10:55 PM | Permalink | Comments (1)