You've reached the internet home of Chris Sells, who has a long history as a contributing member of the Windows developer community. He enjoys long walks on the beach and various computer technologies.
Monday, Jul 7, 2003, 12:00 AM in The Spout
My First Press Contact @ MS
Today I spoke with Todd Bishop, a reporter from the Seattle Post-Intelligencer ("the Seattle PI"). He was interested in my spout entries about my initial experiences with Microsoft, specifically the BillG ThinkWeek stuff. He called last week, but I didn't call him back right away. Instead, I asked my grandboss (my boss was out on vacation) what I should do. I remember during NEO that MS has very clear instructions about when to talk to the press, i.e. never. Of course, some folks at MS talk with the press, but unless it's specifically part of your job, you're supposed to refer the press to other folks more trained in the ways of the wily reporter trying to get the dirt on MS.
So, when Todd called and I hadn't yet made my millions on MS stock options (any day now... : ), I thought I'd ask around first before making any career limiting moves. That was early last week. It wasn't 'til today that I got the approval to give the interview. In fact, I'm pretty the MS marketing guy checking on what Todd was up to had a longer conversation than I did. Here's pretty much the entire conversation (paraphrased from imperfect human memory):
Todd: "Thanks for getting back to me, Chris. I'm glad you went though official channels. That tends to make things go easier."
I thought that was strange. If I was a reporter, I'd want to track down the defenseless MS employee when they were least expecting it. That's what I figured Todd was up to when he called my direct MS line w/o any introductions. Luckily, I work from home in PDX. Bwa ha ha ha ha!
Chris: "No problem, Todd. Sorry it took so long to get back to you. They were clear my first day at MS not to talk to the press unless explicitly instructed and I'm new."
Todd: "Did you get the list of things I'm after? I've already written the story; I just want to check some facts."
Oh sure, I thought. This is Todd buttering Chris like toast...
Chris: "Yes. What can I tell you?"
Todd: "You spell your last name S-E-L-L-S?"
Chris: "Yes."
Todd: "What's your position at Microsoft?"
Chris: detailed explanation of MSDN, DevCenters (including their need in the world) and how I'm doing the Longhorn DevCenter.
Todd: "Can I just say you're an MSDN Content Strategist?"
Chris: "Sure."
So now the reporter's got me giving him more info than he actually wants. I'm in trouble...
Todd: "And your blog is http://www.sellsbrothers.com/spout?"
Chris: long explanation about how I organize my site, how the Spout is just the editorial section and that I announce everything from all sections on my home page.
Todd: "Oh. So your blog is just http://www.sellsbrothers.com. I'll correct that. Thanks. That's all I need."
Chris: "Really? I expected to be grilled."
Todd: "Well, you're lucky you waited. If you'd have called last week, I'd have really hammered you."
Aha! He's just lulling me into a false sense of security for next time! : )
[ed: Apparently Robert Scoble took the brunt...]
Friday, Jul 4, 2003, 8:11 AM in The Spout
Alvio -- a very cool place to order computers
Craig [1] (via Brad) found Alvio, a really cool place to order computers online. My favorite is the page that lets me configure a barebones P4 system from scratch [2] and then they assembly it, test it and guarantee it for a year. The thing that I like most about Dell is how easy it is to configure computers online. To be able to configure one from the ground up w/o any OSes et al is *way* cool. [1] http://staff.develop.com/candera/weblog2/permalink.aspx/9090a88d-dd58-4310-bb33-85cdc0b121b6 [2] http://www.alvio.com/smoreinfo.asp?iid=941
Monday, Jun 23, 2003, 12:00 AM in The Spout
The Danger of Good Debate Skills
I have been in technical arguments many times where I knew I was right and used every once of my debate skills to convince the other person of their terrible wrongness. This can go four ways:
- I'm right and they eventually agree
- I'm wrong and I turn to their point of view
- They get worn down and stop listening
- I'm wrong, but they fail to convince me
Being right is fun, of course, as is finding someone that's willing to change your mind (lots of folks don't like to argue). Wearing a person down is no fun at all, but by far the worst is that I'm wrong and I stay wrong. Unfortunately, as a professional communicator for the better part of a decade, #4 is a real possibility and it's something to really watch out for. Being right is easy. Recognizing that I'm wrong is easy when I'm arguing with someone with good communications skills. Recognizing that I'm wrong when the person I'm arguing with isn't quite up to the task, that's hard to detect and fix.
Of course, even harder is being wrong and having no one to tell you you're wrong, but I can't blame that on anyone but myself. : )
Sunday, Jun 22, 2003, 12:00 AM in The Spout
Learning to Learn
Sun, June 22, 2003
The most important thing that I've every learned is how to learn. I and a few other lucky souls gained this knowledge at the tutelage of one of my mentors, Don Box, during my tenure at DevelopMentor. Not only did I have an amazing thinker to learn from, but I had a enormously difficult topic to learn on: COM.
When I started learning COM in the early '90s, only a few souls inside of MS really knew it. The only real book in the world on COM at the time was inscrutable and no one with the necessary communication skills and the time to teach COM had yet grokked it fully. Don had written a five-day short course entitled Essential OLE, but only given it a few times, so hadn't really gotten over the hump (as evidenced by the title of the course). It was my job to become the second instructor on COM at DM.
I've always been one of those people that, when faced with a topic and the proper motivation, could almost always learn it easily. This skill helped me to get good grades, but didn't teach me how to really learn; it was too natural for me to understand how I did it. Unfortunately, COM was too hard to learn "naturally" and there's nothing like preparing to stand up in front of a group of people to motivate you to learn. In fact, the first time I'd had to teach COM, I was so nervous on the last day (when I was to teach the material I knew the least well), that five minutes before my first lecture of the day, I had to find an empty room to hyperventilate. I literally didn't know what I was going to say.
Unfortunately, I didn't have the option of bailing at the last day of this class unless I was prepared to give up my job at DM. It wasn't the bailing that was the issue; if somebody else that knew the material was available, I could've bailed (that's how cool DM was). Unfortunately, only Don knew it and he was out of town. So, I had only one choice -- fake it. I wasn't proud, but public speaking is like any other form of entertainment and "the show must go on."
As I was giving the slides that morning on COM structured storage (a particularly nasty topic in COM), I found myself learning how it it worked as I told the story to my audience. All the studying and experimentation I'd done had given me the foundation, but not the insights. The insights I gained as I explained the technology. It was like fireworks. I went from through those topics in a state of bliss as all of what was really going on underneath exploded in my head. That moment taught me the value of teaching as a way of learning that I've used since. Now, I always explain stuff as a way to gain insight into whatever I'm struggling with, whether it's through speaking or writing. For me, and for lots of others, story telling is where real insight comes from.
Still, teaching without the foundation of knowledge isn't effective. How do I gain that foundation of knowledge? I consume the available material and ask "why" a lot. If I look at a class hierarchy and it's design isn't immediately obvious to me, I ask why it was built that way and why was that way chosen over another. And to the answers to those questions, I keep asking why 'til I get to something I know already or until I get to a human reason. The reason for not stopping 'til I get to something I know is that I believe that all learning is only as affective as well as it can be tied to what you already know. How easily it is to learn something is directly related to how much you already know about related topics, so the more you know, the easier it is to learn more. However, when humans are involved, aesthetics take over, e.g. the reason that C++ has member initialization lists and Java doesn't is that Stroustrup liked that feature and Gosling didn't.
The process and benefit of asking why is described well in a novel I'm reading: "It put me in contact with military planners from a dozen nations, and more and more they began to come to me with questions well beyond those of military strategy. ... I didn't think my answers were particularly wise, I simply said whatever seemed obvious to me, or when nothing was clear, I asked questions until clarity emerged."
What made this process so amazing with Don was that we were both doing the same thing: experimenting and telling each other how it worked, which made for a very tight feedback loop. The loop got better as we added more people, like Tim and Keith, both of whom are also amazing thinkers. Audiences are good because of the feedback that they can provide, but optimized feedback like this got us all leapfrogged very quickly into deep COM thinkers.
The goal of all learning is clarity. My own method involves taking in the available material, asking a bunch of "why" questions and then telling somebody else 'til clarity emerges. After COM, I've successfully applied that method to learning how all kinds of other technologies work, how to run a business, how to write, how to manage, how to lose weight (50 pounds and holding) and, most recently, how Microsoft works. Thanks, COM (and Don and Tim and Keith and every audience I've every had : ).
Friday, Jun 20, 2003, 12:00 AM in The Spout
Naming My Feed
Fri, June 20, 2003
When I built the Windows Developer News feed on my
home page, it was an attempt to build a Windows equivalent of SlashDot.
Unfortunately, I'm not interested in keeping up on all the news in the Windows
developer space and the few folks that have stepped up to post on this site are
largely spammers (although not all of them). Also, in my own feed subscriptions,
I find that the ones I'm most fond of are from individuals, not groups. Plus, my
grandboss recently put a fine point on it, "I hate the name of your feed. That's
not what it is."
So, I've moved this feed to be just stuff from me. The
problem was, I didn't know what to call it. In addition to posting links to
stuff I produce, e.g. tools, writings, editorial, etc., my site's feed is really
about the things that I find interesting and my personal insights, so I need a
name that reflects that. Also, I'm a big fan of puns, alliteration and double
meanings (the logo has *3* meanings), so a name with those elements was
important.
As always, when I'm faced with something like this, I turn to the community, specifically my own readers, who seem to have an unhealthy desire to participate in things like this. When I asked them for their input, I was overwhelmed with more the number of responses; and good ones, too (it probably helped that I was giving away a free seat at the Applied XML Developer's Conference [July 10th -- register now!] to the one I picked)! Here're some of the best that I didn't pick:
- "The Naked Programmer" from Richard Caetano. This has a nice tie in with the logo and connotes the openness I'm fond of in my writings. The problem with this one is only that it already appears on the web.
- ".Nirvana" from Yaniv. This one goes nicely with the logo and my current technology of choice. However, as much as I like .NET, it's not likely to be the last disciple I embrace, so I don't want to tie myself to it.
- Sells-A-Go-Go from Michael Weinhardt. This one from a former protege very much appeals to my sense of fun, but it only has one meaning.
- Longhorn Foghorn from Mickey Williams. Again, this one ties me to a wonderful technology, but one that I'm legally obligated to stay mum about for a while longer. However, if I have anything to say about it, Mickey, you have named the Editor's Blog for the Longhorn DevCenter when it goes live. Thanks!
The one I did pick was a blend from three guys: Mike Prilliman, Chris Burrows and Roland Tanglao. They each gave me parts of my new RSS feed name: "Marquee de Sells: Chris's insight outlet". This name has tons of wonderful qualities:
- it's unique on the web
- it's short and distinctive
- I share a birthday with the Marquis de Sade
- the Marquis and I share an unhealthy obsession with our respective writing topics of choice
- my logo is an abstract of my naked picture (the Marquis's topic of choice : )
- a marquee is an entrance (like my homepage) with a sign announcing what's new (like my feed)
- my feed is an outlet for my insights, whether code, writing or interesting things I find I the web
- "insight outlet" sounds like
"inside out," which connotes how open I try to be (ok, I'm stretching on
this one, but "insight outlet"
*does* sound cool : )
Of course, once I'd picked a name that blends entries from three people, I had the problem of how to award the prize: a single seat at the the Applied XML Developer's Conference. And then I remembered that it's my conference, so all three of them get free seats. Welcome!
BTW, the Applied XML Developer's Conference is going to rock. Register now before all the seats are gone.
Wednesday, Jun 18, 2003, 12:00 AM in The Spout
End-To-End RSS + Comments
My RSS 2.0 feed exposes end-to-end support for the comments specifications I'm aware of:
- The RSS 2.0 <comments> element to expose a link for a browser-based UI to view/add comments
- The <slash:comments> extension element to expose the number of comments current made on an item
- The <wfw:comment> extension element to expose the URL endpoint for posting comments via the CommentAPI
- The <wfw:commentRss> extension element to expose the RSS endpoint for consuming the comments of an RSS item.
Several other folks are working on producing and/or consuming the <wfw:commentRss> extension as well, including Joe, Sam, Scott, JamesS and Kevin. JamesD posted instructions on how to do it with MoveableType. Hopefully Dare, Luke and Nick will follow suit.
Monday, Jun 16, 2003, 12:00 AM in The Spout
Releasing Nested Objects in Rotor
Chris Tavares is making more progress finishing up the Ref-Counting in Rotor project:
class
FinalizerObj {
int n;
public FinalizerObj( int n ) {
this.n = n;
Console.WriteLine("Created Finalizer
object {0}", n);
}
~FinalizerObj() {
Console.WriteLine("Finalizing finalizer object {0}", n);
}
}
class
FinalizerContainingObj {
FinalizerObj subObj1;
int n;
FinalizerObj subObj2;
public FinalizerContainingObj( int n ) {
this.n = n;
subObj1 = new
FinalizerObj(n * 100);
subObj2 =
new FinalizerObj((n * 100) + 1);
Console.WriteLine("Creating containing object {0}", n);
}
~FinalizerContainingObj( ) {
Console.WriteLine("Finalizing
finalizer containing obj {0}", n);
}
}
class
TestApp {
static
void Main() {
for(
int i = 0; i < 5; ++i ) LeakAnObj(i);
}
static void LeakAnObj(int
i) {
FinalizerContainingObj obj =
new FinalizerContainingObj(i);
}
}
Running this app under our ref-counted Rotor yields the following output:
C:\Home\Chris\Projects\Rotor\src\tests>clix FinalizerTest.exe Created Finalizer object 0 Created Finalizer object 1 Creating containing object 0 Finalizing finalizer containing obj 0 Finalizing finalizer object 0 Finalizing finalizer object 1 Created Finalizer object 100 Created Finalizer object 101 Creating containing object 1 Finalizing finalizer containing obj 1 Finalizing finalizer object 100 Finalizing finalizer object 101 Created Finalizer object 200 Created Finalizer object 201 Creating containing object 2 Finalizing finalizer containing obj 2 Finalizing finalizer object 200 Finalizing finalizer object 201 Created Finalizer object 300 Created Finalizer object 301 Creating containing object 3 Finalizing finalizer containing obj 3 Finalizing finalizer object 300 Finalizing finalizer object 301 Created Finalizer object 400 Created Finalizer object 401 Creating containing object 4 Finalizing finalizer containing obj 4 Finalizing finalizer object 400 Finalizing finalizer object 401
In other words, all top-level and 2nd-level objects are finalized deterministically. Wahoo!
Thursday, Jun 12, 2003, 12:00 AM in The Spout
Exposing RSS Comments
So far, comments have gotten a lot of play in the RSS space:
- The RSS 2.0 <comments> element to expose a link for a browser-based UI to view/add comments
- The <slash:comments> extension element to expose the number of comments current made on an item
- The <wfw:comment> extension element to expose the URL endpoint for posting comments via the CommentAPI
However, what's missing is the ability to pull out a list of comments associated with an item. Instead, folks like Sam publish their comments as a separate feed, and then feed readers thread the comments with the content by comparing the elements from the type feeds (as well as all of the other feeds). That works for most standard-sized RSS sites, but what about sites that exposes hundreds of thousands of entries like msdn.com? Cached per site comment feeds don't scale as well as on-demand per-item comment feeds. Towards that end, I'd like to propose another element to the well-formed web's CommentAPI namespace: commentRss.
The commentRss element would be a per-item URL for an RSS feed of comments. It looks very like the wfw:comment element:
<wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/"> http://bitworking.org/news/commentsRss/52 </wfw:commentRss>
With wfw:commentRss, the RSS reader can pull the comments down on demand, merging them in with the cross-references from other blogs as it does now. In addition, an extension to RSS like this would allow feed readers to subscribe to comments for a particular item, either manually for conversations in which the user is interested or automatically when the user posted a comment for an item.
Wednesday, Jun 11, 2003, 8:01 AM in The Spout
.NET Rocks Interview -- Chris Sells (Again!)
Here. "Chris talks with Carl and Mark about Longhorn, Working at Microsoft, his book with Don Box, his new Windows Forms book, dealing with Printer Margins, passing command-line arguments to auto-deployed applications, linking assemblies, the new Matrix movie, what's new in Ghengis, and answers the age old question 'to GAC or not to GAC?'"
Thursday, Jun 5, 2003, 12:00 AM in The Spout
Ref-Counting + Rotor Status
I just got this email from Chris Tavares (who's doing the lion's share of the implementation work to add ref-counting to Rotor):
using System;
class FinalizerObj {
int n;
public FinalizerObj(int n) {
this.n = n;
Console.WriteLine("Created Finalizer object {0}", n);
}
~FinalizerObj() {
Console.WriteLine("Finalizing finalizer object {0}", n);
}
}
class TestApp {
public static void Main() {
for( int i = 0; i < 5; ++i ) LeakAnObj(i);
}
static void LeakAnObj( int i ) {
FinalizerObj obj = new FinalizerObj(i);
}
}Under the desktop CLR, I get this:
C:\Home\Chris\Projects\Rotor\src\tests>FinalizerTestBut when I run under Rotor, now I get this:
Created Finalizer object 0
Created Finalizer object 1
Created Finalizer object 2
Created Finalizer object 3
Created Finalizer object 4
Finalizing finalizer object 4
Finalizing finalizer object 0
Finalizing finalizer object 3
Finalizing finalizer object 2
Finalizing finalizer object 1C:\Home\Chris\Projects\Rotor\src\tests>clix FinalizerTest.exe
Created Finalizer object 0
Finalizing finalizer object 0
Created Finalizer object 1
Finalizing finalizer object 1
Created Finalizer object 2
Finalizing finalizer object 2
Created Finalizer object 3
Finalizing finalizer object 3
Created Finalizer object 4
Finalizing finalizer object 4
Finalizing finalizer object 4
Finalizing finalizer object 0
Finalizing finalizer object 3
Finalizing finalizer object 2
Finalizing finalizer object 1I obviously still need to figure out how to pull the object off the finalization queue, but that will have to wait until tomorrow night.
Even though they're being called by us and by the GC, this is the first time we've been able to get finalizers working. Wahoo!
Wednesday, Jun 4, 2003, 12:00 AM in The Spout
My First API Review
Wed, June 4, 2003
Maybe you're getting tired of my posting my "firsts" at MS, but that's the beauty of this medium. I get to say what I feel like and you get to listen or not, as you choose. Mostly this "Dear Diary" format helps me to digest the world around me. Many times, the writing itself has helped me to clear my head. If you haven't tried it yourself, I recommend it.
So, on with my next "first." Today I crashed an API review. I happen to be on a few internal Longhorn mailing lists and recently got an announcement of a new API that was going up for its first review. I didn't know what to expect, but I hoped at least to see some familiar faces and to introduce myself around.
Now, the way I work things, I try to really pack myself into meetings when I'm up in Redmond so that I can get the most out of my time away from home (I'm still based in Portland, OR). In this case, I had a meeting scheduled from 9am to 10am in building 5 and then had to truck across campus to building 42 for the API review at 10am. Needless to say, I was late (the only thing harder than finding parking in the sea of cars after 9am is finding your anonymous rental car when you come back for it). Luckily, MS meetings seem to start late as a matter of course, so I hadn't missed anything. However, I was a bit surprised that in more than a month of introducing myself around, there was a room full of 10+ people and no familiar faces. They glanced up at me when I came in the door and seemed a bit confused as to who I was, but didn't ask or toss me out on my butt (it's handy being 6'5" sometimes : ).
The process was pretty cool. Apparently the team building the API had answered a standard questionnaire from the review team, which included target users, potential security problems and representative sample code that users would be expected to construct. The review team had prepared by going over the questionnaire and prepared topics of discussion (the latter making this review process better than most I'd attended). The API team provided answers to the questions and took notes on how to fix their API.
I was impressed with the whole thing. The API team was very open to suggestions for improvement, even letting me put in my two cents (I couldn't help myself : ). And the design team gave out just the kind of advice I want all .NET APIs to follow, e.g. use best practice coding conventions in sample code, support IDisposable at a macro level instead of a micro level, expose collections from properties returning IEnumerable (not from the parent object itself), prefer properties over Get/Set methods (as appropriate), don't tack the name of the enumeration type onto the enumeration values themselves, prefer overloads to parameters that can be null, prefer typed parameters to object parameters, etc. In addition, where the API team had reinvented the wheel (they were experts in their problem domain, not the entire .NET Framework Class Library, after all), the review team pointed them at what to emulate and where to look for more guidance. The whole process gave me quite a bit of confidence in .NET maintaining the high degree of consistency that's it's achieved to date (the FCL consistency is not perfect, I admit, but it's a damn sight better than COM APIs ever were and don't even get me started on Win32).
After all that, I did finally get to introduce myself (the note taker on the API team wanted to know who was complaining : ), I helped name a Longhorn data structure and I met a General PM that I needed to talk to anyway, so it was a useful experience all around.
Tuesday, Jun 3, 2003, 12:00 AM in The Spout
Submitting to Billg's ThinkWeek
As has been mentioned out in the world, every once in a while Billg takes time to back away from whatever he's working on to think big thoughts. Employees are allowed to influence those thoughts by sending in papers about whatever they want. I heard about this a few days before the deadline and, as I had an idea for something, I wrote up a quick treatment. In spite of the odds against me, I couldn't let such an opportunity pass by w/o even trying!
I sent my short piece around internally and, because of it's length (I only had time to put together 2.5 pages), I expected to get all kinds of feedback of the lack of depth. Surprisingly, I only got one of those and a bunch of positive feedback, including some useful tweaks.
After applying the tweaks and running into the limit of time I could spend on it (I did have any actual job to do, after all : ), I sent my paper to the screener that makes sure that Bill's not bothered by trivial things, expecting to hear where to file it. But I didn't hear that. In fact, I didn't hear anything at all 'til today when my own patron St. VP thanked me for my submission, being all kinds of vague about whether Bill will be handed my paper or not, but pointing me to some folks internally about making my idea happen. I took this as letting me down gently, but further emails indicated that my paper *had* been sent along to Bill.
Now I'm wondering what the heck Bill will do with it. Ignore it? Shred it? Send me an email with a single line, "Make it so, #1?" I'm not sure which one is scarier. After having survive my first encounter with a VP, I wonder if I'll survive my first encounter with it's commander and chief. Keep your fingers crossed. : )
Monday, Jun 2, 2003, 10:40 PM in The Spout
MSDN Article: No Touch Deployment
Here. From JosephCooney: Chris has a new MSDN article on passing command-line parameters to "No Touch Deployment" windows forms applications
Saturday, May 24, 2003, 12:00 AM in The Spout
My First Meeting with a Senior VP
On the anniversary of my first month at MS, I took my first meeting with a Sr. Vice President. I'm told that's a big deal. One colleague who'd been at MS for a few years said, "Wow. You must be important. I expect that the first time I'll be in a meeting with a Sr. VP will be at my firing." In my case, it's not that I'm important (I'm not) that got me involved with such a meeting; it's that I have recently been asked to participate in a project that needed to meet with the VP to clarify some review feedback . Or, in other words, it was a pretty pedestrian "here's what we've come up with since the last time we met" kind of meeting. What made it interesting was that it was with a Eric.
Imagine a company run as a strict meritocracy that's one of the most important and profitable in it's industry. Now imagine that this company has been around for a while and has acquired tens of thousands of employees in a multi-layered hierarchy, with only the best and the brightest surviving and the best of the best rising to the top. That's MS. Billg is layer 1. Eric is at layer 4 w/ a small number of peers. I'm at layer 9 or, as I like to call it, "the bottom." By all rights, that means that Eric should be "5" smarter than me, and I can see him fitting comfortably into that category.
Had Eric wanted to shred us, I'm sure he could have. Luckily, it was a nice, calm, productive meeting w/ him cutting quickly to the main points (in spite of the fact that he was reading and making notes on our handouts while still listening to our presentation). He also make some pretty interesting comments, especially considering how little time I'm guessing he's had to think about the problem space. At least one comment put me on a path that I like much better than the one I was on (although we'll see how he feels about it at the next review). The comment that startled me most, however, was when he said that he read my site. If this is my last post from inside the big house, you'll know how much he liked it. : )
Wednesday, May 21, 2003, 12:00 AM in The Spout
My First Month @ MS
Wed, May 21, 2003
Today marks the 1-month anniversary of my assimilation. For those expecting references to my "scars," you can be as surprised as I am that there aren't any. In fact, my coming to MS has not really been a big deal. Oh, folks were nice and I got emails from all manner of internal and external folks with nothing but good wishes, but, somehow, I expected something different. Frankly, given the world's impression of MS, I think I expected hazing. In fact, I woke up this morning with memories of dreams involving all kinds of bizarre knowledge- and activity-based initiation rites lead by my grand-boss that reminded me of a cross between my college fraternity and Fear Factor (although maybe I was still reliving my MSDN "morale event" experience : ).
Why did I expect all kinds of horrible things? Because MS is a very intimidating company; they play to win, seemingly at all costs. This A+ personality trait is certainly reflected inside the company, but there's something else there, too. The part that surprised me was that job #1 seems to be exactly what I would pick: do "the right thing" for the customer.
In fact, doing the right thing is so important that MS builds a "customer advocate" position right into the heart of their culture; these people are called "Program Managers" (PMs). PMs are not to be confused with "Product Managers," who are marketing folks. Of course, MS has all the standard positions, e.g. marketing, managers, developers, testers, documentation, etc, but they also have this PM position that, as far as I can see, forms the glue for the company and affects everything else. The PM's job is wake up in the morning and think to him/herself, "What's the right thing to do today?" The range of things that fall into this category is far too wide to even give you the bounds, but essentially it's whatever someone else isn't already doing (or isn't doing to their satisfaction : ). Once they identify the right thing to do, they can attempt to take "ownership" of making it happen (your boss gets a say in how you spend your time).
Once ownership is acquired, that's when things get interesting. PMs have all kinds of responsibility, but no authority. While this kind of position is generally one to avoid in the world of corporate politics, the internal product cycle training video I watched a couple of weeks ago points out that "responsibly without authority" is by design. Instead of ruling by fiat, PMs have to wander around the company finding folks that are involved with what they're doing to get their "buy in" and their help. The way to do that is through old-fashion politics, i.e. gathering consensus, persuasion, trading favors, brow-beating, table thumping, complaining up your own management chain, complaining up your opponent's management chain, etc. It's not just a popularity contest, although being liked certainly helps. It's also about your reputation, as established by your technical chops and your ability to produce, among other things. Under-achievers need not apply.
In other cultures where the hierarchy is all, such meritocracy can't really work (in spite of lip service to the contrary). There's often too much of an attitude of "who the hell are you to tell me what to do?" to even be allowed to present your case. Luckily, since there's a whole bunch of folks wandering the halls looking for favors, the MS culture makes it OK to work in this manner. That's why the role of PM forms to key to the culture, imo. Oh sure, MS is a real company with a well-established hierarchical chain of command (there're currently 7 people between me and Billg), but hierarchy is only one part of the organization, and arguably not the dominant one (although I'm still new : ).
In a way, the whole system is kind of like the legal system. In the court room, lawyers from each side argue before a jury, each using every trick in the book to push their agenda and the law is only part of the equation. The jury decides who's right.
At MS, multiple PMs all wrangle with each other, each using every trick in the book to push their agenda and technology is only part of the equation. Sometimes, it's the folks inside of MS that serve as the jury. Sometimes, it's the market itself that serves as the jury. In the latter case, that's why you sometimes see multiple products from MS that seemingly serve the same purpose, e.g. C++ vs. C#. Those are two groups that both think that they've got the best way to accomplish their goals and they've both made strong enough cases internally to be allowed to compete externally. Probably the reason that each product exists in the first place is because one day some PM probably woke up and said, "MS really needs a C++ compiler" or ".NET really needs a C-like language that's not as hard to use as C++," and look what they got themselves into. : )
Of course, it's not just PMs that have the responsibility to constantly be on the lookout for the right thing. Everyone is supposed to get up every day with this attitude. It's just that PMs only get to persuade; they don't get to order things to be done (unless they get staff). Since MS is filled with folks all aiming to do the right thing, everyone is constantly committing to help with new ideas. That's why you see MS folks at conferences always busy and always rushing back to their rooms to check their email; they've committed to do way more than a normal human can do because as the "right things" come along, it's darn hard to say "no." That's why I started this spout entry on a Wednesday but I'm finishing it at 8am on a Saturday while the rest of my family sleeps. Even in the last month, I've accumulated a bunch of projects of varying sizes, all of them "right" as far as I was concerned.
According to the training video, in spite of this overwork and the recent lack of any expectation of riches, folks that come to MS don't seem to ever want to leave. It's that darn culture of the PM again. I've worked at large companies that run by fiat and they suck. Hell, I've worked at small companies that work by fiat and they suck, too. Is it any wonder that, assuming you have merit, once you find a stable, interesting, friendly company judging you on your merit that you're loathe to leave? I find myself cataloging the skills that I think I'll need to be successful at MS and it seems like I've been preparing for this job since I was 12 years old. I've hopped from company to company looking for the perfect fit. DM provided that fit during the boom. Is MS going to provide it from now on?