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.
Saturday, Oct 27, 2007, 11:49 AM in The Spout
Working Remotely for Microsoft: What Are the Consequences?
When I went to work for Microsoft without moving up, I knew I was making a tradeoff. Before Microsoft, I spent a lot of time traveling, so MS meant staying home much more with my family. It also meant, because of MS's cultural bias, that my rate of advancement would be considerably slower than it would be if I was local. In fact, I was prepared to be completely unpromoted as several senior folks I trusted at Microsoft promised I would be. As it turned out, even though I came into Microsoft at a fairly high level (high enough that it wouldn't have been hard to not meet expectations even if I were local), I was promoted. I doubt seriously that I'll be promoted again, but I never thought I would be promoted at all. In fact, I've often referred to my Microsoft job, especially my new one on a product team, as "the world's greatest dead-end job." : )
I know this sounds bad, but it gives me two freedoms. First, and most importantly, it gives me the freedom to spend evenings and weekends with my family (especially since I shipped the last book I plan on working on for a long, long time) and to put them first. This was the conscious decision I made going it and I'm happy every day that I made it. The second freedom that took me by surprise is that I can focus on the parts of my job that I really love without worrying about picking up tasks just because they'll look good at review time. It's almost like I'm one of those Microsofties with "fuck you money" without the actual money. : )
Because my current boss cares deeply about making me as successful as I can be, we've talked about me having direct reports. I've done it before and I believe I could do it effectively again, even remotely (I've run successful remote development teams all over the world). However, because of the strong MS bias, I told my boss that I'd only take direct reports that had bought into the downsides of being remote, even if they're local. If I'm not perceived as effective because I'm remote, then by extension, neither will anyone that works for me. My boss hasn't pushed it since our conversation on that matter and frankly, I don't expect to get any reports, but he's surprised me before, so we'll see. : )
Tomorrow: Misc tips & tricks.
Friday, Oct 26, 2007, 11:01 AM in The Spout
Working Remotely for Microsoft: Can You Communicate Effectively From Home During Meetings?
Communicating during a meeting is an art unto itself and has its own set of considerations:
- Learn to love LiveMeeting: If you can't see faces, the next best thing is whiteboards and what's on each other's computer screens. For whiteboards, you really need a video camera, which I'll talk about later. For desktop sharing, I've tried NetMeeting, VNC, Terminal Services (in shadow mode) every version of MS Messenger, Office Communicator, Vista Meeting Space and LiveMeeting and a bunch more I'm not remembering. The only one that works consistently through firewalls (mine and Microsoft's) and is easy to get bootstrapped is LiveMeeting. Learn how to start a "Meet Now" meeting (I have an URL that starts up the "Meet Now: Chris Sells" meeting but I have no idea where I got it) and use it! I've actually heard Don Box, who hates working with me when I'm not in the room, say "LiveMeeting is better than you being here!" And when you're jointly working on a shared document or shared code, it's pretty damn good.
- Get a LiveMeeting monkey: If you're going to do a remote presentation, make sure there's someone on the other end with LiveMeeting tested and running that can project your slides for you while you narrate.
- Learn the short path through LiveMeeting: Microsoft employees, like most humans, don't like to be distracted by things they don't care about. They don't want to install a new piece of software on a machine they just got working again last week and they certainly don't know how to use it. Make sure you can talk them through the shortest path to getting LiveMeeting installed and sharing their desktops. The first time, this takes 10-15 minutes of disk churn (unfortunately), so ideally you'll do it before the big meeting.
- Keep time zones in mind: Martin was at GMT+0. Tim was at GMT-5. Microsoft is at GMT-8, as am I. Being working and available for meetings, phone calls and quick turn emails is important, otherwise, your team is going to start forgetting to include you in ad hoc stuff, as was a problem for Tim and completely impossible for Martin.
- Meet new people face-to-face: I go up to Microsoft 3 days/2 nights every other week with the idea that I'm not going to get much actual coding or writing done, but I'm going to get face time with new people I need to start relationships with. When they hear you're remote, most folks at Microsoft will want to postpone the meeting 'til you're in town. To make them comfortable with you and to put faces to the voices, that's a good idea the first time. However, after that, phone calls are just fine, especially when combined with LiveMeeting.
- Learn your address book: When a meeting room is scheduled, the scheduler doesn't know the phone number for the meeting nor are they even going to remember that you're calling in, so you need to know how to get the phone number yourself. At Microsoft, the address book lists conference room phone numbers as "conf room [blg]/[room]," e.g. "conf room 42/5646". If you have any trouble or you need someone to call you a cab for the airport on the last day of your trip, you can look up the receptionist for the building you're in with "Reception Bldg [bldg]," e.g. "Reception Building 42".
- Get your own personal conference call number: If more than one person is calling into a single meeting room, have your personal conference call phone number and code ready. Again, Microsoft issues these to anyone that wants one (and again I can't remember where I got mine : ).
- Take meeting notes: If you are finding yourself missing out what's going on during meetings while you're on the phone, offer to take the meeting notes. That way, when you have questions, you're asking as the guy taking notes not the annoying guy who's too full of him/herself to move.
- Play solitaire: If you're not taking notes and you find yourself zoning out during a phone meeting, either because you're surfing the web or starting to do "real" work, you need to do something that will occupy your eyes and your hands while keeping your ears and brain free to pay attention. For that I recommend solitaire or, when I've really let my work interfere with my home life balance, I like to put the dishes away or fold clothes. Handy access to the Mute button on your phone covers up the "clink" noises. : )
- Learn to intuit what's going on to the whiteboard: I find that the single biggest downside to not being there in person, especially on a product team, is not being able to see the whiteboard. Microsoft has a face-to-face, brute force culture; if a design or implementation problem can't be solved in two sentences in email, that's cause for a whiteboard scribble session. What I've learned, however, is that most such whiteboard scribbles look the same: there are going to be some boxes, some lines and some letters. The most powerful thing about what's happening on the whiteboard is not the whiteboard itself, but the story that's told while the boxes and lines are being scribbled. With some practice, you can learn to guess what's on the whiteboard by listening to the story, even if you have to ask a clarifying question or two. Further, just the mere act of saying something like "Well, I'm just guessing, but what I think you think drew is…" More often than not, the folks on the other end of the phone will say something like, "Wow. That's pretty close, Chris, except that…" With a little practice, you too can become a "whiteboard whisper." : )
That's not to say that I wouldn't love a better solution for remote telepresence then I've got. I've tried a number of experiments over the years and right now Scott Hanselman and I are trying yet another one. For me, a basket of laptop that my team can carry to meetings for me that's running Skype for a/v sharing (it works through firewalls and does great noise cancelation), with a high quality pan/tilt/zoom camera I can control from my end is the killer app for remote employees. Scott's got more of a mobile IvanAnywhere mindset, but between the two of us, we hope to cobble together something that closes 80% of the remaining gap I can't close with the communication tips I've listed above.
Tomorrow we'll discuss the career consequences of working remotely at Microsoft.
Thursday, Oct 25, 2007, 7:37 AM in The Spout
Working Remotely for Microsoft: Can You Communicate Effectively From Home?
Assuming you can focus on work and you can find someone to hire you, effective communication is the next issue you'll run into. When I was working for DM, practically everyone was remote, so our communication was based on email conversations that would be long and involved, sometimes lasting for days. However, that's not the case at Microsoft, where brevity in email is valued and meetings are called for the tough issues. How do you fit into this culture? I use several techniques:
-
Over-communicate: I like to check and double check the things I heard and read vs. the things I've seeing done. "I did X. Can you check it and make sure it's what we agreed on?" "We agree that you were going to do Y. How's that coming? I looked at that last check-in you made and you seem to be doing Z. Why?"
-
Pick good email subjects: Lots of times, people have so much email, if the subject isn't relevant, they don't bother.
-
Keep emails short: At Microsoft, we have literally thousands of mailing lists and it's not unusual for a single employee to belong to tens of them, generating 200-500 emails/day. If you want to be heard in that ruckus, you have to be succinct. If you get a reputation for long, rambling emails, especially without a summary, your missives will be ignored.
-
Summarize long emails at the top: When I need my email to go over a page, I summarize it at the top with a single sentence or two. That saves folks from having to dig through an email to get the gist.
-
Resend emails: I know Raymond Chen says not to, but if you don't get an answer to an email, send it again. I can't tell you how many times the first email was ignored, but the second email was answered.
-
Reply to yourself: If you're asking a question that doesn't get answered, follow up with the answer when you get it. I've had threads of conversation that were 80% me. At least they'll see you're there so they'll remember to keep sending the paycheck. : )
-
Follow up on hints: Sometimes you'll see something go by in an email that implies a different understanding than you had when last you talked to folks. For example, you're expecting to participate in a design review on Wednesday, but someone sends an email including the sentence like, "We'll have to have this question answered by Tuesday's design review anyway." In the hallway/meeting/face-to-face communication culture of Microsoft, decisions are made and changed all the time without a written follow-up, but most of the time you'll see the new data referenced in some kind of way. When that happens, follow up, e.g. "I thought the design review was on Wednesday. Has it been changed?"
-
Read those status mails: You're saving all kinds of time and being more productive by skipping those random conversations in the hallway, so you can afford to actual read your colleagues' status emails. I also like to follow up on them, asking questions about the stuff I'm curious about. Often it helps me get my own work done and it almost always means I can integrate my work with that of my team's better.
-
Own the efforts you're involved in: It's very easy to get focused on your own work and get out of sync with the team. If you're dependent on other folks to get their work done so that the thing you're doing gets done correctly and on time, you've got yourself a powerful motivator to communicate.
-
Get everyone on your team to use IM: IM is a wonderful simulation for hallway conversations that works even when the target of your question/comment is in a meeting (it's common for Microsofties to have their laptops open during meetings). At Microsoft, even if folks don't have a personal IM account via Yahoo or Live Messenger, they do have one with Office Communicator. If you're trying to get someone that's never online with it, instead of sending them an email with your question, send them a link to the Office Communicator installation and a request for them to log in. If that doesn't work, start calling them and asking them the same thing. They'll get the hint. : )
-
Pick up the phone: A ringing desktop phone is a novelty at Microsoft that few folks will ignore. Use it to startle them into submission! : )
-
Schedule a meeting for a phone call: If you can't get your team on the phone for a quick discussion, schedule a 15-minute phone call.
Tomorrow I'll focus on remote communication during meetings.
Wednesday, Oct 24, 2007, 11:53 AM in The Spout
Working Remotely for Microsoft: Can I Find Someone To Let Me Work From Home?
Assuming you decide you can and want to work from home for Microsoft, now the trick is finding someone that will take you. The first time, this took me years. As my writing and speaking became more popular, I'd get more regular calls from someone at Microsoft with "the perfect job for me." Each time, I'd ask them if I had to move and when they replied, "Of course" as if the entire pool of worthy workers lived in Washington, I'd politely decline. Eventually when the question came up, Sara Williams said, "No need to move" and I went to work for MSDN. As is often the case with one's first Microsoft job, it wasn't a long-term fit (a software engineer needs to be on a product team!), but finding a product team took me took 6 months of digging. All the groups I talked to wanted me and they all were happy to move me (some even offered to move my extended family up, too, eliminating my main anchor for staying in OR), but culturally they just didn't know what to do with a remote guy.
Eventually, persistence, and my long experience working remotely, paid off and I actually had two competing offers (and I'm *so* happy about the one I chose). Microsoft has a *ton* of open positions and they get more open about remote employees all the time. Keep at it!
Tomorrow: Can You Communicate Effectively From Home?
Tuesday, Oct 23, 2007, 10:59 AM in The Spout
Working Remotely for Microsoft: Can You Focus On Work At Home?
First off, I don't recommend remote work for folks who don't like spending the vast majority of their time away from their colleagues, sometimes having trouble focusing on the work in favor of household duties or interactions. In fact, the ability to focus on work while at home is the #1 issue you'll have to face as a remote employee and I've seen it drive 80% of folks back to the office. I've always been naturally in the 20% bucket on that issue.
As an example, when I first started at DevelopMentor, my office was in an open back room separated from the dining room by a hallway kitchen. My two infant boys had me in clear view when I was handcrafting RPC packets for communication with a DCOM server, hanging on the child gate, crying for me to play with them. My wife also had in plain sight when she wanted something from the high shelf. My family often heard me protest, "You know, I am actually working over here!" I eventually built a door, purchased Melissa a stool and learned to be very mushy about the split between work and home life. My family's actually been very supportive and I've always preferred the work environment I've established at home over any I've ever had from an employer, if for no other reason than my home has my family in it.
My advice to anyone that wants to switch to remote work is to try it for a month or two first. Are you able to balance work and family life when you're at home? Are you able to go for days or weeks without the hallway conversations with your colleagues? Can you communicate effectively in ways that aren't face-to-face? If you don't like it, don't force yourself into it. For example, while DM instructors didn't seem to have any attrition due to remote work, all of the names I listed above as remote Microsoft employees have either quit, moved to Redmond or complained bitterly during their transition (Scott's still new : ).
Tomorrow I'll discuss "Can I Find Someone To Let Me Work From Home?"
Monday, Oct 22, 2007, 9:16 PM in The Spout
The Whiteboard Whisperer: Working Remotely for Microsoft
I've been at Microsoft about 4.5 years, the whole time a "remote employee," i.e. I work mainly from my home in a suburb of Portland, OR but the teams I've worked for have all been based at Microsoft HQ in Redmond, WA.
Microsoft is traditionally a company that moves the bulk of their employees to WA, especially for product team and related duties. Of course, we've got subsidiaries and sales world-wide, as well as the occasional technology team in talent hot spots around the world, but there is a large corporate bias towards moving new hires to HQ. In fact, so much so that when we've got open spots, I've learned not to recommend someone that I know won't move.
And yet, there are notable exceptions. Martin Gudgin worked from England for a number of years. Tim Ewald worked from New Hampshire. Scott Hanselman works from Portland, as did Rory Blythe. Sometimes if there's enough need and the right role, the distance bias can be overcome. And when it does, I sometimes get an IM, an email, a phone call or a meeting request so that I can answer the question: how do you do it?
Tune in tomorrow for "Can You Focus On Work At Home?"
Friday, Oct 19, 2007, 12:44 PM in The Spout
Fun With GridView*RowPresenter
I was searching for advanced WPF tree samples the other day and ran into the tree-list-view sample:
Notice how the left-most column does the indenting, while the rest of the columns line up nicely. The code for the tree-view-sample is a little C# and a bunch of sophisticated XAML templates I didn't understand, so I stripped it down to the bare nubbins to discover what was going on. Assume a simple class holding the data:
classPerson { List<Person> children = new List<Person>(); public string Name { get; set; } public int Age { get; set; } public List<Person> Children { get { return children; } } }
The juicy bit that makes the tree-list view above possible is the GridViewRowPresenter:
<Window ... xmlns:local="clr-namespace:WpfApplication10" Title="GridView*RowPresenter Fun"> <Window.DataContext> <local:Person Name="John" Age="13" /> </Window.DataContext> <GridViewRowPresenter Content="{Binding}"> <GridViewRowPresenter.Columns> <!-- NOTE: must explicitly create the collection --> <GridViewColumnCollection> <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" /> <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}" /> </GridViewColumnCollection> </GridViewRowPresenter.Columns> </GridViewRowPresenter> </Window>
Here, we're creating an instance of the GridViewRowPresenter, which is the thing that the ListView creates for you if you use the GridView. Here, we're using it explicitly and setting the columns explicitly, binding it to our data and yielding the following:
Notice that we're showing a single item, arranged as a row of values according to our column definition above. It's boring and not at all interactive, at least because we don't have a header, which we can get with an instance of the GridViewHeaderRowPresenter:
<Window.Resources> <GridViewColumnCollection x:Key="columns"> <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" /> <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}" /> </GridViewColumnCollection> </Window.Resources> <StackPanel> <!-- NOTE: must share access to same column collection to get shared resizing --> <GridViewHeaderRowPresenter Columns="{StaticResource columns}" /> <GridViewRowPresenter Content="{Binding}" Columns="{StaticResource columns}" /> </StackPanel>
Here we're creating an instance of the row presenter, passing in a reference to the same columns collection used by the row presenter so that the column sizes and positions are shared between the header row and the row presenters:
If we want more than one piece of data, all we have to do is use an items control with an item template that in turn creates a row presenter for each item in the collection:
<Window.DataContext> <x:Array Type="{x:Type local:Person}"> <local:Person Name="John" Age="13" /> <local:Person Name="Tom" Age="12" /> </x:Array> </Window.DataContext> <Window.Resources> <GridViewColumnCollection x:Key="columns"> <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" /> <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}" /> </GridViewColumnCollection> </Window.Resources> <StackPanel> <GridViewHeaderRowPresenter Columns="{StaticResource columns}" /> <ItemsControl ItemsSource="{Binding}"> <ItemsControl.ItemTemplate> <DataTemplate> <GridViewRowPresenter Content="{Binding}" Columns="{StaticResource columns}" /> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </StackPanel>
Now, we've got a stack panel that combines the header to the grid view rows with the grid view rows themselves, one per item in our collection:
Now on a rush of discovery and simplicity, I took the next step to show hierarchical data, hosting the data in a TreeView control and using a hierarchical data template so that I could build the tree list view shown above with the tiniest bit of XAML and code:
<Window.DataContext> <x:Array Type="{x:Type local:Person}"> <local:Person Name="Chris" Age="38"> <local:Person.Children> <local:Person Name="John" Age="13" /> <local:Person Name="Tom" Age="12" /> </local:Person.Children> </local:Person> <local:Person Name="Melissa" Age="39" /> </x:Array> </Window.DataContext>
...
<StackPanel> <GridViewHeaderRowPresenter Columns="{StaticResource columns}" /> <TreeView ItemsSource="{Binding}" BorderThickness="0"> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Children}"> <GridViewRowPresenter Content="{Binding}" Columns="{StaticResource columns}" /> </HierarchicalDataTemplate> </TreeView.ItemTemplate> </TreeView> </StackPanel>
Unfortunately, that's where we run into the limit of what we can do without cranking things up a notch:
Beside the border around the tree view (caused by focus), the worst part about our simple tree-list-view is that, while each grid view row has the proper column sizes and relative positions, because the tree does the indenting, all of the columns are offset, not just the first one. The key to fixing this problem is to put the styling for indenting into the template for the first column only using the CellTemplate property of the GridViewRowColumn, taking over the drawing of the tree view items, which is what the tree-list-view sample does.
Friday, Oct 19, 2007, 7:28 AM
The Windows Workflow Team Wants to Hear from You!
Are you using WF but it's not quite right? Are you avoiding WF because it doesn't have the features you need? Now's your chance to influence the future of WF with a quick survey. Vote early, vote often! : )
Wednesday, Oct 3, 2007, 4:54 PM in Fun
Yahtzee Croshaw -- You're My Hero!
First it was the Halo 3 review (which I can't agree or disagree with yet because I'm still stuck on level one) which a Wii zealot forwarded to me because he likes to send me links to negative portrayals of anything MS-related (like that's a challenge to find : ), then it was the BioShock review (a game I never figured out the cool part of), then his POV on the console wars (I'm proudly a member of the frat-boy demographic!) and finally it was the Tomb Raider Anniversary review (a game I haven't played since v1 and preferred the Apple ][+ equivalent) which had me laughing out loud.
Agree with him or not, you gotta appreciate Yahtzee's style.
Wednesday, Oct 3, 2007, 2:17 PM in Tools
Releasing the Source Code for the .NET Framework Libraries!
After programming with MFC (a lot!) and writing the ATL book, it was *very* difficult for me to live in a world without the source code to figure out how something was working. All of us have since moved over to Lutz's most excellent Reflector, but that's still no substitute for actually stepping in and now ScottGu has announced that we'll have the ability to browse and debug with the .NET library source code, integrated into VS2008:
Wahoo!
Sunday, Sep 9, 2007, 11:56 AM in Fun
I'm an "Uber Cool High Nerd"
Saturday, Sep 1, 2007, 9:22 AM in Money
20 Timeless Money Rules
Save yourself the Suzy whoever and read this instead:
- Be humble
- Take calculated risks
- Have an emergency fund
- Mix it up
- It's the portfolio, stupid
- Average is the new best
- Practice patience
- Don't time the market
- Be a cheapskate
- Don't follow the crowd
- Buy low
- Invest abroad
- Keep perspective
- Just do it
- Borrow responsibly
- Talk to your spouse
- Exit gracefully
- Pay only your share
- Give wisely
- Keep money in its place
Following this advice will put you in the top 20% of investors in the world.
Tuesday, Aug 28, 2007, 5:08 PM
Programming WPF
Programming WPF
By Ian Griffiths and Chris Sells
Order Yours Today!
Buy Programming WPF, 2nd edition today!
Table of Contents
- Foreword (Don Box)
- Foreword (ChrisAn)
- Preface
- 1: Hello, Avalon
- 2: Applications & Settings
- 3: Layout
- 4: Input
- 5: Controls
- 6: Simple Data Binding
- 7: Binding to List Data
- 8: Styles
- 9: Control Templates
- 10: Windows & Dialogs
- 11: Navigation
- 12: Resources
- 13: Graphics
- 14: Documents
- 15: Printing
- 16: Animation & Media
- 17: 3D
- 18: Custom Controls
- A: XAML
- B: Interoperability
- C: Multithreaded Programming
- D: WPF Base Types
- E: Silverlight (by Shawn Wildermuth)
Samples
Tuesday, Aug 28, 2007, 9:48 AM in The Spout
"Programming WPF" (finally) shipping!
John Osborn of O'Reilly and Associates had this to say in my morning email:
"Congratulations, guys. The book is printed and shipping! Just got my copy this morning and it looks great. A very substantial body of work, to say the least.
"Thanks for all of your hard work on this project. Now to crank up the PR machine and make sure no book shelf is without a copy."
Wahoo!
Friday, Aug 24, 2007, 4:07 PM in Tools
Shawn has prepared Genghis v0.8
Shawn Wildermuth has prepared a v0.8 release of Genghis that includes a bunch of stuff that the folks that put the v0.6 release together dropped. The v0.8 release has all the good stuff from the v0.5 release and all the new stuff from the v0.6 release in a .NET 2.0 package.
Shawn's really done all the work for Genghis since I came to Microsoft. Thanks, Shawn.