« May 2005 | Main | July 2005 »

June 29, 2005

Monad and RSS, Part 3

First, a couple of improvements in the array handling of my previous get-feeds.msh script.

The MSH language has a -contains operator, which will tell you if an array contains an element. So instead of the clunky:

$seen = $false
for ($i = 0; $i -lt $seenlist.length; ++$i) {
    if ($seenlist[$i] -eq $_.pubDate) {
        $seen = $true
        break
    }
}
if (!$seen) {

you can just say:

if (!($seenlist -contains $_.pubDate)) {

Also, to extend an array that might be empty, instead of:

if ($seenlist -eq $null) {
    $seenlist = [array]$_.pubDate
} else {
    $seenlist += $_.pubDate
}

You can do:

$seenlist += @($_.pubDate)

OK, now let's talk about output formatting. In Monad the formatting of objects is controlled by files that end in ".format.mshxml". If you look in your Monad directory (you DO have a Monad directory, right?) then you will see several files like this. You can easily add your own.

If you look inside, you will see a bunch of views for different types. If we create a new file rss.format.mshxml (and add it to filelist.format.mshxml, minor point), then we can set it up like this:

<View>
  <Name>System.Xml.XmlDocument</Name>
  <ViewSelectedBy>
    <TypeName>System.Xml.XmlDocument</TypeName>
  </ViewSelectedBy>
  <TableControl>
    <TableHeaders>
      <TableColumnHeader>
        <Label>Title</Label>
        <Width>60</Width>
      </TableColumnHeader>
    </TableHeaders>
    <TableRowEntries>
      <TableRowEntry>
        <TableColumnItems>
          <TableColumnItem>
            <ScriptBlock>$_.rss.channel.title</ScriptBlock>
          </TableColumnItem>
        </TableColumnItems>
      </TableRowEntry>
    </TableRowEntries>
  </TableControl>
</View>

Now instead of typing

write-host $rssdata.rss.channel.title

You can type:

$rssdata

It will pick up the format.mshxml information for System.Xml.XmlDocument and display only the title (and a header that says "Title").

But surely you don't want to display ANY XmlDocument this way? And what about the items? And maybe we want to use this to handle different RSS formats...all good ideas, but we'll save them for later. I'm off for 5 days of vacation. Don't bother coming by to boost our television, the kids and aunts will still be in the house.

Posted by AdamBa at 11:33 PM | Comments (0) | TrackBack

June 28, 2005

Flex Time

There has been some discussion recently in the Windows Server Division about flexible work policies.

I'm all for flexible work policies since keeping the workforce productive and happy is my main concern about Microsoft. An employee working part time, from home, on a flexible schedule, etc. is certainly better than no employee at all, and in most cases should be almost as good as a "normal" employee--and may well be better.

One idea being bandied about is the compressed workweek, where an employee works 4 days instead of 5. This notion in particular seems to stick in the craw of most Microsoft managers.

On the surface, a compressed week should be good. People only have to spend time driving 4 days out of 5; they only have to take up a parking space 4 days out of 5. They only eat 4 lunches on company time each week. If they are the type that waste X minutes or hours getting up to speed each day, they only need to do that 4 times. Although people's productivity may drop after extended time at work, I don't think this would kick in working 25% longer in a day. And the extra hours would presumably be early in the morning or later in the evening, when distractions would be fewer and employees could be more productive.

It's true that Microsoft isn't running an assembly line; the time you spend at work isn't completely fungible. Employees need to talk to each other, and the more people see and talk to each other the more likely they are to cohese into a team. Yet Microsoft already has people who work early and people who work late and don't overlap much. Certainly there are people on my team that I am shifted from by at least 2 hours each day, which adds up to one whole day per week.

I think if you dig down, the real reason managers don't like a compressed work week is because they want employees to work "as much as necessary" every day, and they want 5 days of that, not 4. They don't want you to take five 8-hour days and turn them into four 10-hours days, they want you to turn them into five 10-hour days. Or at least, they want to be able to count on you for 5 10-hour days during a crunch, and in exchange it's OK if you do 5 7-hour days other times.

In a sense they are right; Microsoft does not have its employees on a fixed work schedule, so you wind up with some months where you work harder and some months where you can goof off a bit. BUT, overall, this attitude is a reflection of the overall Microsoft attitude towards time management:

  1. Take all the employees who react to having too much work by working extra hours, instead of cutting work--in other words, the employees who don't have good time management skills
  2. Promote these people into management positions where they are responsible for scheduling software deliverables
  3. Scratch head when your software isn't done on schedule

I remember on Windows 2000 at some point we went into "7 day a week mode". This meant everybody was supposed to work 7 days each week (or at least that was the implication; they never actually told us that in so many words). So you do this for 3 months--assuming everyone actually works a full day every day--and you gain...26 days of work? One month, on a project that lasted 3 years? Is that worth burning out your whole team? This attitude needs to change, and forcing managers to deal with a compressed workweek would be a good start.

Posted by AdamBa at 10:06 PM | Comments (4) | TrackBack

June 27, 2005

Monad and RSS, Part 2

Continuing on with our command-line RSS reader, I first cleaned up my add-feed script:

# add-feed.msh

$regpath = "HKCU:\Software\Microsoft\MshReader"
$feedpath = [System.Uri]$args[0]

# make sure name is a proper URI

if (!$feedpath.IsAbsoluteUri) {
    write-host "Feed name `"$feedpath`" is not a valid URI"
    exit
}

# feed name is domain name

$feedname = $feedpath.Host

# make sure our overall path exists

if (!$(test-path $regpath)) {
    new-item $regpath
}

# create the key for this feed...

$newpath = combine-path $regpath $feedname

new-item $newpath | out-null

# ...and the value for the URI

set-property $newpath -Property "URI" -Type String -Value $feedpath.AbsoluteUri | out-null

# if it worked, then print a message

if ($(test-path $newpath)) {
    write-host "Created feed for `"$($feedpath.OriginalString)`" named `"$feedname`""
}

I now parse the URI by creating a System.Uri (idea courtesy of Keith Farmer) and I store the URI in a value instead of a subkey (the Monad registry provider treats registry values as "properties").

Next, I improved get-feeds.msh. I changed the registry access to reflect the fact that URI is now a value, not a subkey. More importantly, I added another value SeenList which is a REG_MULTI_SZ that stores which entries have already been viewed (I identify them by pubDate, don't know if that is official RSS reader best practice, but it seems to work). I read the REG_MULTI_SZ out of the registry for each feed, check each pubDate to see if it is in SeenList, if it is I skip it, if it isn't I display it and add it to SeenList. At the end I write SeenList back to the registry:

# get-feeds.msh

$regpath = "HKCU:\Software\Microsoft\MshReader"
$feeds = get-childitem $regpath

# loop through all stored feeds

foreach ($f in $feeds) {

    # get the URI for the feed from the registry

    $feedpath = combine-path $regpath $f.MshChildName
    $feeduri = $(get-property $feedpath).URI

    # read the content from $feeduri as XML

    $wc = new-object System.Net.WebClient
    $rssdata = [xml]$wc.DownloadString($feeduri)

    # display title

    write-host $rssdata.rss.channel.title

    # get list of items already seen

    $seenlist = [array]($(get-property $feedpath).SeenList)

    # display title and date of each item

    $rssdata.rss.channel.item |
        foreach-object {
            $seen = $false
            for ($i = 0; $i -lt $seenlist.length; ++$i) {
                if ($seenlist[$i] -eq $_.pubDate) {
                    $seen = $true
                    break
                }
            }
            if (!$seen) {
                write-host "-" $_.title
                write-host "     " $_.pubDate
                if ($seenlist -eq $null) {
                    $seenlist = [array]$_.pubDate
                } else {
                    $seenlist += $_.pubDate
                }
            }
        }

    set-property $feedpath -Property SeenList -Type MultiString -Value $seenlist | out-null
}

It seems to work:

MSH> add-feed "http://www.proudlyserving.com/index.xml"
Created feed for "http://www.proudlyserving.com/index.xml" named "www.proudlyserving.com"
MSH> add-feed "http://radio.weblogs.com/0001011/rss.xml"
Created feed for "http://radio.weblogs.com/0001011/rss.xml" named "radio.weblogs.com"
MSH> get-feeds
Scobleizer: Microsoft Geek Blogger
- SQL Server podcast starts up
     Tue, 28 Jun 2005 02:08:19 GMT
- Blogging food fight breaks out
     Tue, 28 Jun 2005 01:41:00 GMT
...
Proudly Serving My Corporate Masters
- Discovering Objects in Monad
     Sun, 26 Jun 2005 21:24:50 -0800
- Monad and RSS
     Sat, 25 Jun 2005 22:38:53 -0800
...

W00OO00OO00t!! In our next installment, we'll look into how we can display more details about each item (in a nice, user-modifiable, Monad-y way).

Posted by AdamBa at 10:42 PM | Comments (5) | TrackBack

June 26, 2005

Discovering Objects in Monad

One of the nicest features of Monad is how it lets you discover the properties of objects.

Consider the get-feeds.msh script I talked about yesterday, at the point where I assign the variable $rssdata. Now it turns out I could have written those four lines in one, like this:

$rssdata = [xml]$(new-object System.Net.WebClient).DownloadString("http://www.proudlyserving.com/index.xml")

But what I want to talk about is what I did to write the next part of the script. I wasn't sure what the $rssdata object would look like (although it matches the tag heirarchy in the RSS). So what I did was take my script and change the line from

$rssdata = [whatever]

to

$global:rssdata = [whatever]
exit

Then when I ran the script, it assigned $rssdata as a global variable and then exited the script. This meant $rssdata was available outside the script, after it exited (the normal scope for variable declared within a script is local to the script, so they go away when the script exits).

Now I could type at the interactive prompt and start playing around with the $rssdata variable to see what it contained, and what the script should do next. First I did the basic:

$rssdata | get-member

which prints out

    TypeName: System.Xml.XmlDocument

Name                        MemberType Definition
----                        ---------- ----------
ToString                    CodeMethod static String XmlNode(MshObject insta...
add_NodeChanged             Method     Void add_NodeChanged(XmlNodeChangedEv...
add_NodeChanging            Method     Void add_NodeChanging(XmlNodeChangedE...
Clone                       Method     XmlNode Clone()
...
rss                         Property   System.Xml.XmlElement rss {get;}
xml                         Property   System.String xml {get;set;}

(I cut a bunch of methods out, but you get the idea. I could also consult MSDN for documentation on the System.Xml.XmlDocument type). Now the rss property looks interesting, so I can try:

$rssdata.rss | get-member

and see what properties (and methods) that shows. I can also just type

$rssdata.rss

by itself and uses the default formatter to display the properties:

version                                 channel
-------                                 -------
2.0                                     channel

which again gives me an idea of what lies beneath. Eventually, after playing around with it, I can figure out what I want the script to do, add it to the end, make $rssdata default scope again, and take the exit line out of the script.

Posted by AdamBa at 09:24 PM | Comments (3) | TrackBack

June 25, 2005

Monad and RSS

Since Monad and RSS are both extra-cool right now, I wrote a couple of scripts to scan RSS feeds in Monad.

The first one is used as follows:

add-feed http://www.proudlyserving.com/index.xml

It stores the URI in the registry for use later (see below):

# add-feed.msh

$regpath = "HKCU:\Software\Microsoft\MshReader"
$feedpath = $args[0]

# make sure name starts with "http://" (case-insensitive comparison)

if ($feedpath.Substring(0,7) -ine "http://") {
    write-host "Feed name `"$feedpath`" does not start with `"http://`""
    exit
}

# feed name is domain name

$feedname = $feedpath.Substring(7).Split("/")[0]

# make sure our overall path exists

if (!$(test-path $regpath)) {
    new-item $regpath
}

# create the key for this feed...

$newpath = combine-path $regpath $feedname

new-item $newpath | out-null

# ...and the value for the URI

new-item $newpath -Name "URI" -Type String -Value $feedpath | out-null

# if it worked, then print a message

if ($(test-path $newpath)) {
    write-host "Created feed for `"$feedpath`" named `"$feedname`""
}

The second script uses the registry information stored by add-feed.msh to dump out the titles and dates of every item in the RSS feeds. It uses the XML support in Monad (the [xml] cast in the code below) to convert the feed into an object that can be accessed like any other object in Monad:

# get-feeds.msh

$regpath = "HKCU:\Software\Microsoft\MshReader"
$feeds = get-childitem $regpath

# loop through all stored feeds

foreach ($f in $feeds) {

    # get the URI for the feed from the registry

    $feedpath = combine-path $regpath $f.MshChildName
    $uripath = combine-path $feedpath "URI"
    $feeduri = $(get-property $uripath)."(default)"
    write-host feeduri $feeduri

    # read the content from $feeduri as XML

    $wc = new-object System.Net.WebClient
    $s = $wc.OpenRead($feeduri)
    $sr = new-object System.IO.StreamReader($s)
    $rssdata = [xml]$sr.ReadToEnd()

    # display title

    write-host $rssdata.rss.channel.title

    # display title and date of each item

    $rssx.rss.channel.item |
        foreach-object {
            write-host "-" $_.title
            write-host "     " $_.pubDate
        }

}

If you run get-feeds, you get a display that looks like:

feeduri http://www.proudlyserving.com/index.xml
Proudly Serving My Corporate Masters
- 10 Slightly Unusual Ideas to Mildly Perturb Microsoft
     Thu, 23 Jun 2005 22:26:25 -0800
- Microsoft: We Are Professional Grade?
     Wed, 22 Jun 2005 16:44:19 -0800
- Building Community at Microsoft
     Sun, 19 Jun 2005 22:09:39 -0800
...

(NOTE: The web and registry access code could probably be cleaned up, but I was stealing from some other code that does it this way, so bear with me.)

In the next part, we will improve get-feeds so it only displays feeds that have been updated...or at least I hope we will do that!

Posted by AdamBa at 10:38 PM | Comments (7) | TrackBack

June 23, 2005

10 Slightly Unusual Ideas to Mildly Perturb Microsoft

A few months ago Mini-Microsoft talked about the Bill Gates think week paper entitled "10 Crazy Ideas to Shake Up Microsoft". Dare Obasanjo recently discussed the paper and said that the list "succintly summarizes the major problems facing folks trying to get stuff done at Microsoft today".

So I finally read the paper today, and I have to say I was massively underwhelmed. As Mini-Microsoft already revealed, the 10 ideas are:

  1. Schedule Unscheduled Time into Performance Reviews
  2. "Break Up" the Company
  3. Encourage Loose but Prominent Couplings
  4. Exile and Empower Incubation Projects
  5. Offer Super-exponential Rewards
  6. Offer Different Risk-Reward Compensation Profiles
  7. Cut Back on Bureaucracy
  8. Review Cost Cutting
  9. Reduce Headcount on Large Dev Projects
  10. Eliminate Exec Reviews

My comments on these:

  1. This is a legitimately interesting idea (the suggestion is to take Google's idea of 20% free time and apply it to Microsoft). It's a complete ripoff from our current biggest competitor, but that doesn't mean we shouldn't do it.
  2. This is nothing new; it's a common suggestion for big companies (encourage internal autonomy). Microsoft already has pushed P&L respnsibility down to the 7 product units and beyond; this suggestion would not have helped Longhorn ship any sooner.
  3. Microsoft already does this; that's why all the examples in the paper are from Microsoft. Is the point that integrating Office was a good idea? You're right, integrating Office was a good idea. To the extent that this point doesn't contradict the previous one (about 50%, roughly), it's already known.
  4. This is a good idea, but again I don't think it's a crazy idea, or a new idea.
  5. Microsoft already does this.
  6. I think this is an actively bad idea. If people want to take a huge risk and get paid in equity rather than salary, they should go do a startup.
  7. Sounds great. Let's make crime illegal while we're at it. The honest-to-god suggestion here is to add more bureaucracy to police the existing bureaucracy.
  8. This kind of suggestion always puzzles me. Do people really think that executives cut costs willy-nilly without thinking of the effect on employees? Do they really think they cut towel service and then after-the-fact say, "Gee, we never realized that this might upset someone?" Do you think they limit supplies to the first floor without realizing that this requires employees on other floors to walk down to get supplies? Look, you may agree or disagree with decisions like these--but the notion that these ideas are not fully considered before being implemented is ridiculous.
  9. Ah yes. This assumes that the corollary to the Mythical Man Month rule that "Adding more people to a late project makes it ship later" must be "Removing people from a project that is late makes it ship earlier." Every project I know is perennially understaffed. Now, there is a good idea buried in there, which is that management should be judged on their ability to deliver on time.
  10. The answer here should not be to eliminate executive reviews. The answer should be to eliminate executives.

So I count this as "1.5 Actually Interesting Ideas, 2 Ideas We Already Know, 2 Things We Already Do, 3 Silly Ideas, and 1.5 Bad Idea." Not as snappy a title, but IMHO more accurate.

I'm not saying Microsoft doesn't have problems; the company has big problems. I just don't see this paper addressing them, and I doubt it would make Bill Gates do much except roll his eyes. Microsoft has antitrust issues, it has trouble hiring the people it wants, it already makes so much money it is hard to grow the stock. The company does have a long-running "eyes bigger than stomach" problem in which it continuously tries to tackle big projects in one fell swoop; the think week paper hints at this in terms of cross-group dependencies, but it's not just that, it's the sheer size of what individual groups accomplish. Probably this is because the company overvalues failure as a learning experience, but who knows...my point is that the problems Microsoft faces are very hard. If they were easy problems that could be fixed in 10 simple steps, they would have been fixed.

If you want crazy ideas, then propose some really crazy ideas. I can think of a few:

  • Create two teams to work on the same project and let them race.
  • Rotate employees on a team through the lead position.
  • Allow any dev in the company to modify the source code of any project.
  • Make our project schedules public from the start.
  • Merge the dev and test teams on a project (everybody does both).
  • Pay at 120% of the industry average.
  • Release all of our source code (hey, had to throw that in there).

It's easy to sit there and get all goo-goo-eyed over what two people can accomplish in a month with no management oversight. But the reason two people can accomplish that in a month...is because it's two months of work. It's not Windows or Office.

Actually I just went to a talk today about a project going on inside Microsoft that trying to be progressive in how it goes about its business...and has at least one really good idea that should go in a thinkweek paper. But the talk was NDA, sorry! If you really want to know, come work for us. That'll help solve both of our problems.

Posted by AdamBa at 10:26 PM | Comments (11) | TrackBack

June 22, 2005

Microsoft: We Are Professional Grade?

(It's a reference to GMC Trucks). Microsoft is currently holding a 3-day Engineering Excellence/Trustworthy Computing Forum on campus. This is an internal event for employees, featuring about 100 talks on basically anything you can think of about how Microsoft develops software, what the company is up to, tools you can use, etc. It's a huge event and a big commitment on Microsoft's part to teach its people how to do it right.

This brings to mind something I was discussing with Gretchen Ledgard about how Microsoft can help attract people to work here. My suggestion was that Microsoft should promote itself as the company that really knows how to engineer software: how to design it, how to write it, how to test it, how to make it secure. You won't make it in the real world (unless you are lucky) by continuing the practices you learned in college; you need to come here first. At least put in 10 years learning the ropes before you do go off on your own. Before you do your web startup, come work on MSN; before you do your end-user application, come work on Office; before you become a consultant writing kernel drivers, come work on Windows; before you set up your own security shop, come learn from the best.

How many companies are willing to devote 3 days of all their engineers' time to improving how they develop software, and with a roster of speakers that's a virtual "who's who" of Microsoft executives? Just imagine what any random software developer would be willing to pay to listen to all these talks...and here at Microsoft you get it for free. Microsoft has a vice president in charge of Engineering Excellence, and it's not just some schmo with a title, it's a guy who shipped a bunch of software and could certainly be adding value to a specific product team--but Microsoft sees the value in letting him devote his time to engineering excellence.

The problem is that for some people, the terms "Microsoft" and "Engineering Excellence" in the same sentence would inspire derisive laughter. So the message has to be crafted very carefully. But if we do it right, I think it is a message that could really resonate.

Posted by AdamBa at 04:44 PM | Comments (1) | TrackBack

June 19, 2005

Building Community at Microsoft

I was reading an article in the Princeton Alumni magazine titled "Building Community". It discusses how the Princeton community has changed between the class of 1951 and 2001.

Read the following quote from the article:

"In the last 50 years, Princeton has gone to great lengths to diversify its student body geographically, racially, spiritually, and, most obviously, in terms of gender. These changes have made the endeavor of building a well-connected undergraduate community both vastly more difficult and potentially far more educationally rewarding than ever before. In other words, what Princeton has done during the last few decades is essentially to raise the stakes on the prospects of its undergraduates learning from one another: The barriers to doing so now are higher than they were in the past, but so is the potential payoff."

Now read it again, changing "Princeton" to "Microsoft", "last 50 years" to "last 15 years", "student body" to "work force", and "educationally rewarding" to...well, insert your favorite phrase to describe the technological, customer, and financial goals that Microsoft is pursuing.

There is no doubt that Microsoft has gotten more diverse since 1990. When I started there it was a bunch of white guys. The article on Princeton states: "According to the admission office’s September 1947 analysis of the freshman class, for example, exactly one-fourth of the newly admitted freshmen hailed from only six preparatory schools (Exeter, Lawrenceville, Deerfield, Andover, The Hill, and Mercersburg)." I would bet that in 1990 more than a quarter of Microsoft's college hires came from Princeton, Harvard, Yale, Cornell, Dartmouth, and Waterloo.

As I have written before, there is great value in Microsoft increasing its diversity. Princeton is not experiencing the rapid growth in size that forced Microsoft to expand its recruiting efforts, but in fact this emphasizes my point: Princeton sought diversity because it recognized that if it wanted to attract the best students, and therefore the best professors, and produce the best educational "product" (for lack of a better term) it had to diversify.

But the article points out that a more diverse student body (or workforce) also introduces some challenges. Quoting Robert Putnam's book Bowling Alone, Professor Stanley Katz points out "America’s social capital — the extent to which citizens feel connected to one another through social networks — has declined precipitously since the 1950s. Putnam wrote about two types of social capital: bonding social capital and bridging social capital. Bonding social capital, he wrote, is 'inward looking' and tends 'to reinforce exclusive identities and homogeneous groups.' Bridging social capital, by contrast, is 'outward looking' and results when people connect 'across diverse social cleavages.' Both kinds of social capital are, of course, necessary to the formation of healthy communities. But not surprisingly, bridging social capital is the harder of the two to create — and in an educational community like Princeton, it is also the more valuable." Princeton in 1951 had "far fewer divisions, and thus far less need — as well as far less potential — for the creation of bridging social capital"--just like Microsoft today. Building a "team" into a "community" is critical to enable people to reach their full productivity. You have to have people trusting each other, helping out when necessary, sharing credit instead of trying to hog it. Having more diverse teams makes the potential rewards even greater, but also makes it harder to achieve true community.

I know my team today is more diverse than the ones I worked on back in 1990. And I also think it is less tightly bound. Back in the early 1990s the NT team was comprised of two groups--the original people from Digital, and the various Microsoft employees who had filtered in. Dave Cutler, in one of his Tom West moments, notice the distinction, and started the Weekly Integration Meetings, or WIMs. Late on Friday afternoons he'd get some beer for the lab and we could all sit around shooting the shit. It probably worked, but the creation of this bridging social capital wasn't too hard--all it took was a common enjoyment of beer. Today the groups are much more diverse and much harder to bring together. You're not going to unite a team over beer if some of the people don't even drink beer. The Windows team still has WIMs, but they are huge events, and everyone just stands around talking to people they already know.

It's true that Microsoft has become more heirarchical, which creates new social strata that need to be bridged. Then again, this can lead to the other way to bring a group together, which happened at my previous job in New Jersey. We were as diverse as any Microsoft group, and we worked great as a team. What brought us together? A common belief that management was incompetent. I doubt management would like to encourage this--much easier to go with the morale events. But when it works, it works.

Posted by AdamBa at 10:09 PM | Comments (1) | TrackBack

June 18, 2005

Monad Team Hike

On Thursday the Monad team went on a hike up Tiger Mountain 3. Here's a picture at the summit. Can you spot your friendly neighborhood blogger? Hint 1: I grew up in Montreal. Hint 2: I read slashdot. Actually it tells you who everybody is at the bottom.

We were gone from 1 pm to 5 pm. Last year we did similar hike and the majority of hikers were from the test team. This year the majority were from the dev team. This reflects the stage of the project: last year was early in the project when dev was in a crunch, but now we are buckling down to ship so test is in a crunch (program managers stay perpetually as busy as they want to be).

Posted by AdamBa at 10:22 PM | Comments (0) | TrackBack

June 17, 2005

New Monad Build Available!

A new Monad build is up on betaplace. To get it, go to beta.microsoft.com, sign in (yes, you need a Passport account), then give the guest ID "mshPDC", and follow the directions for the Microsoft Command Shell preview.

You can also read the same information on Lee's blog and Arul's blog.

This is a pretty nice build of Monad. I use it every day and it's extremely stable. When you sign up for betaplace you can also join a non-public newsgroup which is monitored and responded to by everyone on the Monad team, as well as other betaplace users.

Tom's Hardware tea-leafed this release. The article says it was "released on schedule to a select group of invited developers". Don't worry, you're all invited!!

Posted by AdamBa at 07:03 PM | Comments (2) | TrackBack

The Blog is a Harsh Mistress

Ook, it's been 2 days since I posted, 6 days since I posted anything meaningful. Help! Gotta feed the machine...although with people reading via RSS, maybe it doesn't matter if I post every day? But I don't want to lose my stickiness for people who actually visit the site every day.

I work, I blog, and I write. I'm not sure of the priorities. I started blogging to hype my book, but I enjoy the community aspect of my blog, and blogging can also help my status at work, and eventually help drive use of my product. Writing (books and stories, I mean) may be what I enjoy most, but it takes a lot of time and is hard to get going with the fragmented time I have available. Much easier to blog, and blogging is writing also, right? Meanwhile my job lends credibility to the other two (at least for technical writing like my book), and gives me something to blog and/or write about.

Then over all that you have my family, friends, other commitments, which I can't neglect. Work of course gets a guaranteed 40+ hours each week carved out for it (except when I blog from work like I am now), which is probably out of proportion to the amount of satisfaction I derive from it compared to the other two (although I am enjoying my work at the moment). But of course work pays the bills for the family, whereas blogging and writing don't do much for them.

In my high school yearbook somebody wrote: "I thought and thought about what to write in my yearbook...then at the last moment I thought of writing this!" [note to the one high-school classmate I know reads my blog: maybe it was the year before, whatever]

Posted by AdamBa at 12:03 PM | Comments (3) | TrackBack

June 15, 2005

Yet Another Monad Blogger

Arul Kumaravel, a dev lead on Monad, has a blog. And Lee "1337" Holmes has been blogging up a storm. Hmm, I suppose you could spell his name 53W704 337.

Here's a Monad factoid: if you want to get all the values for an enum, you can do:

[System.Enum]::GetValues([System.IO.FileMode])

(this example is for the System.IO.FileMode type, but it would work for any type). What you are doing is calling the static method GetValues() on the System.Enum class--that syntax of [typename]::method() is how you do that. The parameter to it is an instance of the type System.IO.FileMode--enclosing a type name in square brackets gets you an instance of the type (that's an instance of the type itself, not an instance of an object of that type. In .Net, types are also represented by objects).

Posted by AdamBa at 11:14 PM | Comments (0) | TrackBack

June 13, 2005

Another Stab At Monad's Ship Vehicle

(A "ship vehicle" is not some fancy car you get after you ship, it's the term for the actual shipping product that a technology is delivered with. E.g. "Monad's ship vehicle will be Train Simulator 2.0" (note that is merely an example of using "ship vehicle" in a sentence, not a factual statement)).

There was an article in Tom's Hardware Guide (which is an acronym for "Wired outraged hams") in which an unidentified "Microsoft spokesman" confirmed that Monad has not been cancelled (didn't know THAT was a possibility) and that "that it will be released to the public in time for the initial public distribution of Longhorn."

The rest of the article is somewhat confusing. Then you've got a poster over on this Channel 9 thread saying that Jeffrey Snover said at Tech-Ed that "Monad will appear in WinFX (the framework) rather than Longhorn (the operating system)."

I can understand not preannouncing stuff...but in this case we have managed to generate such a confusing, contradictory message that we might as well just state exactly what the current plan is, with the understanding that it might change. All I will say is that I am working hard every day to bring you a great product, whenever/wherever/however it ships.

In other news which I am too lazy to write a new entry about, I finally got my RAS working from home. It turns out that the WMI service had somehow uninstalled itself. It was slow to fix because I would get a message from helpdesk to try something, go home and try it, report back the next day, etc. Then they sent me a .inf to reinstall WMI, but when I ran it from home, it prompted for some files and since I had originally installed off the corporate net, I had no CD, so back to work, then home to try it again, yawn.

Posted by AdamBa at 09:31 PM | Comments (2) | TrackBack

June 12, 2005

Ex-Microsophist?

Hmm, Microsophist's page now has the title "Ex-Microsophist" and all the content is gone. Quick, grab the Google cache (although this is missing all the trenchant comments).

It doesn't explain if he/she is an ex-(Microsophist) or an (ex-Micro)sophist--meaning did he fall-or-was-pushed to stop blogging, or did he leave Microsoft?

Interesting realization--if someone stops blogging without posting a final message, and you only read them via RSS, you won't notice.

Posted by AdamBa at 09:38 AM | Comments (7) | TrackBack

June 11, 2005

The View From Inside the Sausage Factory

As a Microsoft employee blogger, I try hard not to reveal information I'm not supposed to reveal. Obviously I don't post source code or proprietary algorithms, but I also don't want to discuss Microsoft's future plans unless the information has already been released through an official source (marketing, VP interview, etc).

The problem is that with events like this week's Monad media happening, it can be difficult to know what has actually been officially stated.

For example, this week the official word came out that Monad would not ship in Longhorn. Or did it? The Microsoft-certified data that I know of is the PressPass interview with Bob Muglia at Tech-Ed. This has his now-famous quote: "For example, we are changing the command line environment in Windows using a new object-oriented command line technology, code-named 'Monad,' that will exceed what has been delivered in Linux and Unix for many years. It will take three to five years to fully develop and deliver."

That's all he said about Monad, as far as I can tell. Now, when Mary Jo Foley linked to that article, she linked to it with the sentence "Senior Vice President Bob Muglia acknowledged Monad won't make it into either Longhorn client or server." Then she repeated his quote as evidence, and explained that the three-to-five-year period was beyond the Longhorn ship dates.

OK, so at this point has Microsoft officially announced that Monad is not in Longhorn? Bob certainly didn't say that in the PressPass article. Did Mary Jo Foley draw that conclusion only from the fact that Longhorn is due to ship sooner than "three to five years"? That's not any kind of official statement, just an inference from an analyst. She evidently tried to get official confirmation and what she wrote was "When asked last week if Monad was still slated to be part of Longhorn, the Windows client team declined to comment. A representative with the Windows Server team said that Microsoft had not committed to a ship vehicle for Monad." Even the title of the article is "'Monad' Scripting Shell Unlikely to Debut in Longhorn"--it says "unlikely".

Meanwhile the BetaNews article that was linked to by Slashdot has the title "No New Command Line for Longhorn", which seems pretty definite. But again, the only documentation for this that the article links to is Muglia "three to five year" quote. Or look at the eWeek article. The title "No Monad, No Longhorn?" leaves some doubt, but then the text states "Microsoft tells us that Monad, Microsoft's super-duper combination shell and script language, isn't going to make it into Longhorn either". So did Microsoft say that, or is he just following the same argument that the other articles did, each one bolstering the other?

Yet Foley stated that Bob Muglia acknowledged the fact. And the BetaNews and eWeek articles both state unequivocally, in at least one place, that Monad is not in Longhorn. So I presume that Muglia said it in answer to a question, or in some other context, or someone else gave the official word. So it would be OK for me to acknowledge it as true, if I chose to do so, which I am not necessarily doing. Right? Of course right!

Then you have the question of whether Exchange 12 is going to build their command-line administration tools on Monad. In the same article, Mary Jo Foley stated "Company officials at Tech Ed confirmed that Microsoft is planning to include Monad in Exchange 12 (E12), the next version of Microsoft's Exchange product due out next year." But she has no link that backs that up (she links to a generic article about Exchange 12).

In this case, however, there is a news.com article in which Kim Akers, a marketing director, states "[Exchange Server 12] will also have improved antispam tools and support a scripting language, called Monad, which will make it easier for administrators to manage several servers at once." So that's an official announcement. And in fact in this case there was also internal email saying that it was OK to acknowledge that Exchange 12 was using Monad. So I'm on solid footing there. Yes, Exchange 12 is using Monad!

Posted by AdamBa at 05:41 PM | Comments (7) | TrackBack

June 10, 2005

Lee Holmes: Another Monad Blogger

There's another Monad blogger: Lee Holmes, a developer on the team. Lee's first post discusses our recent slashdotting.

Of course it wouldn't be a new day if there wasn't a new Slashdot story about Monad (sample comment: " This was my only reason to really get longhorn. oh well. I'll just stay with what I have now. gj micosoft"). Yesterday's was about Bob Muglia's comment that Monad would become the default shell in three to five years; today's story was about Bob Muglia's comment that Monad would become the default shell in three to give years PLUS the extra news that Monad would not ship in Longhorn. This extra fact was connected with Bob's comment and the resulting conclusion was that the REASON Monad would not ship in Longhorn was because it wouldn't be ready for three to five years. That's not what Bob said; he was talking about it being "fully developed and delivered". Actually I'm not sure what exactly he meant, but he wasn't talking about version 1. Getting a first version of Monad out is different from getting it to the point where you can stop shipping cmd.exe.

Posted by AdamBa at 10:05 PM | Comments (1) | TrackBack

June 09, 2005

Bitching, Moaning, & Complaining

Boy, you can't swing a dead cat these days without hitting a Microsoft blogger bagging on the company. Gretchen Ledgard unloaded on clueless Hiring Managers (which was picked up by the ever-voluble Ed Frauenheim at CNet). The next day Micro delivered a few body blows, and a few days after that Mini echoed the theme that Microsoft sucks in so many ways.

Then of course you had people bitching about the moaning, and moaning about the complaining, and complaining about the bitching. And people complaining about the moaning about the bitching...you get the idea. By my rough count Gretchen's article had 36 comments saying she was a genius and 11 saying she was an idiot; Microsophist had 21 saying he was the second coming of Einstein vs. 9 saying he was a classless ho; and Mini-Microsoft's comments were 16-to-2 in favor of dude-liness (preaching to the converted, he must be).

As for me, I work on Monad, the coolest project at Microsoft. But I subscribe to the theory that there is no such thing as bad publicity. And I especially appreciate Gretchen for having the gumption to sign her work. Keep those insights coming, folks.

Posted by AdamBa at 09:27 PM | Comments (5) | TrackBack

Monad Slashdotted Once Again

Once again Monad was discussed on Slashdot (as it was last September). The link in question was to an article on Tom's Hardware in which Bob Muglia says that Monad will become the command line for Windows Server in 3 to 5 years.

(The article speculates that this means the death knell for WMI, but Jeffrey Snover posted a comment explaining that this was wrong.)

The discussion on Slashdot followed the typical pattern: some jokes about the name, some complaining about unrelated Mirosoft foibles, a song, a mention of category theory, but ultimately some real understanding and appreciation of what we are doing with Monad (sample quote: "Being bash addict, I must however admit, that Monad offers functionality beyong imagination of modern Linux shells.") I think Monad is one of the few things Microsoft is doing that is discussed on Slashdot in a generally positive way.

Posted by AdamBa at 07:04 PM | Comments (4) | TrackBack

June 08, 2005

Microsoftiana

After I mentioned in a comment on Larry Osterman's blog that I had a handout from Microsoft Moving giving instructions for moving offices, somebody asked me to send it to them. This was such an absurd request that I complied.

I know there was a market for Enron crap, although it seems to have tailed off (only 97 items as I write this). But do people really want Microsoft stuff? You can't just do a general eBay search because so many people are selling actual Microsoft products, but currently there are 74 items on Collectibles and 58 items in Clothing, Shoes & Accessories and even 9 items in Entertainment Memorabilia.

So I'm looking around my office and thinking about what I could unload. Unfortunately all my junk from my first 10 year stint is at home. Anybody want a Microsoft Speech Server re-stickable sticker? A Microsoft MVP fake subway token? A Windows Marketplace notepad? The envelope that a Ship-It Award plaque came in? An Office XP card-key zip thing? An MSN Search window cling? Well, I'll probably keep all of it, but the mind still boggles.

Posted by AdamBa at 04:43 PM | Comments (6) | TrackBack

June 07, 2005

Teenage Bloggers

My son is involved in local youth musical theater, and a lot of the high school students who participate have blogs (or at least had blogs, it seems to have been a bit of a fad that died out earlier this year).

The blogs are by turns hilarious, insightful, and frightening. These are kids who are outwardly successful, happy, talented, doing something they love. Yet their blogs reveal a sleep-deprived, caffeine-fueled existence that veers wildly between utter bliss and abject depression.

It's not just their theater experience that they blog about, although you do get comments like "this show sucks" and "tack on another shitty show" and "our choreographer's a total idiot" and "my callback sucked the big meat rod" (I can't recall people in my high school being that clever with their vocabulary...).

What is really astonishing is that so many of them seem to go through episodes where they hate themselves. Here's a sample of quotes:

"I'm not having fun with my friends and I'm bored with people around me."

"I want to die so I won't have to deal with my stupid self anymore."

"I feel like I just don't belong to my family anymore."

"I know that I look happy a lot but really I'm not."

"I think nobody will ever be attracted to me again for my entire life."

"I started smoking again, drinking again, becoming somebody I don't like."

"My life is slowly yet surely swirling down the drain."

This stuff is so raw that I feel like a voyeur for reading it, even though it's on a public website. And I really am baffled by the emotions on display. Do so many teenagers go through such episodes of alienation? And remember, these are not (mostly) the stereotypical trenchcoat-wearing, school-avoiding, disaffected teenages. I met the person who wrote "I feel like my family is falling apart, and I will be the first piece gone", and I've met both parents, and seen them all together, and my reaction is WTF?!?!? This doesn't appear to be the distant dad and the nagging mom and the unmotivated child. This looks like a cheerful, outgoing, successful kid, with supportive, helpful, successful parents, and what they write amazes me.

The other fascinating thing is that all this is posted in public, where it can be read by anyone. Unlike other ways that people record or discuss their innermost feelings--diaries, phone calls, instant messaging--blogs leave a permanent, public record. When someone writes about a family member, "Maybe it's my fault for not telling you, maybe that's why you're so fucking naive about it all. But I hate you. And I don't respect you. And I don't like you. And I don't love you anymore"...and also has a home page link to that family member's blog...they have to assume the other person is reading that, right? Maybe it's like the roommates who can't get along and write letters to each other instead of talking. But now instead of just sharing your feelings with one person, you're sharing them with the world, so everyone knows how you feel, and the other person knows that everyone knows how you feel.

When you describe a teacher as "my arrogant, pompous, DICKHEAD english teacher"--what if the teacher reads that? (Somebody did report a rumor that their school administrators were trolling blogs looking for evidence of excessive partying, but that doesn't seem to have stopped anyone from writing about it.) When you write, about a bad relationship "No amount of random hooking up with people...will make me forget it" it's not just you who can see it, or your friends, it's the other person also. It's your parents! I can't imagine how I would feel if one of my children was writing blog entries like some of the ones above.

Remember Harriet the Spy? Remember what happened when they found her diary? That's what's being risked with every blog entry. But nobody seems to mind that. In fact someone reminisced, when the blogging fad died down, "It was nicer when everybody was blogging...yes shit got started, but it was a way for all of us to keep in touch." I guess many people like that tradeoff. As someone else said, "No matter what, I would keep a journal, might as well let everyone read it."

Posted by AdamBa at 10:42 PM | Comments (6) | TrackBack

June 03, 2005

Home Connection: 2/3...Make that 1/3

I managed to spend another exciting Friday evening trying to get my home<->work connection going.

We were moved to Exchange 12 dogfood (I thought we were on Exchange 12 dogfood already? Maybe it was Exchange dogfood, not Exchange 12 dogfood, but what else would we be dogfooding?). This came with a new OWA URL, and lo and behold that one works (you can send 'n' stuff). Actually the basic mode doesn't work (lot's of NIY popups, which I assume means Not Implemented Yet), so I can't use Firefox, but the premium mode works great from IE.

Then, I tried RPC-over-HTTP on my laptop from home, and amazingly enough that worked also. W0000t!!

I figured I was on a lucky streak so I would try to get RAS working. Why not? Why not indeed...first I reinstalled Connection Manager, the app which you use to connect. This was the suggestion from the error message I was receiving (an extremely unhelpful "Critical Error"). I had to hack up the VB setup script because it was trying to access some WMI something-or-other to determine which OS I was running, but I'm pretty sure I finagled that without breaking anything else. But connecting was still disconnecting after a couple seconds, so I called Microsoft helpdesk. An hour or so later, nothing was working and my problem was being "escalated". Unfortunately, as part of futzing around, the tech advised me to take my machine out of my Microsoft domain. Which of course I now can't get back into because RAS isn't working. So I can't logon to my domain account which has my email configured...therefore unless I want to configure the account info again under the Administrator account, my RPC-over-HTTP will be out of commission until I can go back to work on Monday and rejoin the domain.

Posted by AdamBa at 10:17 PM | Comments (2) | TrackBack

June 02, 2005

My Guest Chair

I always like to have two guest chairs in my office, because it makes it easier to have meetings with just a couple of other people invited. However, the official Microsoft rules (or at least the official Microsoft rumor) is that you can only have one guest chair in your office. When we were packing for the move a couple of weeks ago one of the movers told me I could request two guest chairs, but on the form they only let you choose one. I could have written in two, but I didn't know if that would work (Am I spending too much time thinking abut this issue?).

Now I did have two guest chairs in my old office. I had also had two guest chairs in my office two offices ago, and when we did that move (last November), I snuck one of the guest chairs home so I could bring it back once the coast was clear (the movers are around for a couple of days after the move is done, double-checking office setups and whatnot). But, lo and behold when I was setting up my new office last November, I found a guest chair in the hall, so I grabbed that one, and was back to two guest chairs.

When we moved again this last time, I decided that 3 guest chairs would be even better. So I took the second guest chair from my office and put it in my garage next to the original second guest chair (pay attention, there will be a quiz). Then I once again innocently requested one guest chair for my new office, planning to bring in the two (2) guest chairs currently taking up room in the garage, to the eternal amusement/annoyance of my wife.

BUT, when I moved in to my newest office, I discovered in the hall...not just a guest chair...but a lobby chair! In the lobby of 44 they have these pretty nice upholstered chairs. Well, there was one sitting in the hall across from the bathrooms. Trust me, my practiced Microsoft eye could tell that the chair was lonely and abandoned and needed a home. It had had that look about it...you know that look that chairs get when they have no owner? Plus I also had 2 visitors coming that day (actually it was Gretchen Ledgard and her manager's manager), so a second guest chair would be nice. I generously decided to give this de-lobbied lobby chair a nice comfy home in my office. I figured the worst that would happen was one of the movers would see it and remove it from my office.

Of course my fellow employees were amused and astonished at this, but I confidently predicted that nobody would care.

So imagine my surprise when I came in on Wednesday there was a note on my chair telling me that it belonged in a particular office in Building 43. My initial thoughts were 1) WTF does this moron really think I dragged this chair all the way over from another building, and 2) like I am really going to bring it to his/her office. Instead, I put it back in the hallway where it had been--although I was certain it would still be sitting there a month later.

Then, I was going to visit a co-worker in his office and as I approached I noticed that his office number matched the one on the note...except we are in Building 44, not 43. And the first thing he said was, "Did you bring my my chair?" It turns out that HE had left the note...except he got his own building number wrong. What kind of goof doesn't know his own building!?!?!?!?! (Maybe he has building number trauma, this is the same guy who went on vacation for a month last November and came back to discover that our group had announced, planned, and completed the move to a different building, so when he got back late at night and went in to work to check his email, he discovered that his office was nowhere to be found.) The funny thing is that if he had put the correct building number I would have realized right away it was a joke, but the wrong building number was just strange enough that I believed it.

As penance, I made him help me carry the chair back to my office. Where it sits to this day, along with my one allocated guest chair. And I still have the two cached guest chairs in my garage. I guess I should bring them in, although there really isn't room for all of them.

Posted by AdamBa at 10:17 PM | Comments (9) | TrackBack

June 01, 2005

Morale Events

We just had a morale event last Friday--an Argosy Cruise around Elliott Bay and Puget Sound. "Morale events" are the general term used at Microsoft for any kind of special thing that your team does which the company pays for. It could be just a small group of people (e.g. the 25 people on the Monad team) or your product unit, or your whole vice president's team, or whatever.

I didn't attend the cruise, because we had won some tickets to see "Madagascar" and it was a day off from school, so we took the kids and various friends. The buses for the cruise started boarding at 10:30 and got back around 4, and I was gone from 10:30 to 3, so it was OK to leave, right? It certainly was good for my own personal morale.

The one reason Microsoft might prefer that I spend a bit more time on the company morale event was that it would have meant interacting with other people on the team, thus helping us bond a bit. This is actually a change from when I first began at Microsoft. Back then you would have ship parties (or trips, sometimes), plus the company picnic in the summer and the giant blowout Holiday Party, but other than that the "morale budget" (which each team had a per capita allocation for) was mostly spent on gifts, in particular t-shirts.

In 1993 Mike Murray, then-VP of Human Resources, sent his (in)famous "shrimp and weenies" email. The email was actually in 3 parts:

  • "Shrimp and weenies", an exhortation not to spend so much money on catered lunches (and by implication on other unnecessary expenses).
  • "T-shirts and Stupid Dog Tricks", an appeal to rein in the number of t-shirts handed out for minor achievements like attending a meeting or completing an office move.
  • "Headcount growth -- and the lack thereof", explaining that Microsoft needed to keep headcount growth down.

Murray was right about the t-shirts. He said that the morale budget back then was about $20/month per employee, which is $240/year (I think it is less now). $240/year could buy a lot of t-shirts--and it did. When I moved to Montreal in 1995, after 5+ years at Microsoft, I was weeding my closet and counted 103 items of Microsoft clothing--mostly t-shirts, but also jackets, sweatshirts, sweatpants, polo shirts, etc. In the LAN Manager team they handed out t-shirts like they were napkins. Literally, the day I started, it was "Here's your computer, and here's your first t-shirt." (Larry Osterman can tell better LAN Manager t-shirt stories than I can).

Now the pendulum has swung too far the other way, if that's possible. In my 1 1/2 years on Monad, I think I've gotten 4 pieces of clothing -- a short-sleeve Monad polo shirt, a long-sleeve AXP polo shirt (AXP being the next org up from the Monad team), an OCP long-sleeve t-shirt (OCP is the parent of AXP), and an astonishingly bright orange-and-blue long-sleeve t-shirt commemorating some community building program (I can't remember what it is, possibly because the shirt is too loud to focus my eyes on so I can read what it says). The only other tchotchke is the "Monad - I'm lovin' it!" buttons that I printed up myself. I don't even have a nice, plain, Monad t-shirt! Mike Murray recognized that (and I quote) "A well designed T-shirt can and should be a great team building device for a group and/or a reward for the achievement of a key goal (ie, shipping a product on time)."

I think the current theory at Microsoft, Mike's statement notwithstanding, is that a t-shirt is just a t-shirt, but a morale "event" can help build a team. So the money is now being spent on events instead of things.

I don't necessarily think a cruise is so great because you sit around talking to the people you already know. But while I have gotten so few articles of clothing in the past 18 months, I have gone to team events at Illusionz, Whirlyball, the Spirit of Washington train, and Tech City Bowl, plus the Star Wars movie and probably a few I've forgotten (someone on the team organizes an annual hike, although that is not an official event and doesn't cost anything). Participating in events that nobody is really good at, like laser tag or bowling, really is a good way to build a team. So although I may pine for my Monad T, overall I'm not complaining.

Posted by AdamBa at 10:19 PM | Comments (3) | TrackBack