Archives

Archives / 2007 / April
  • Silverlight is here

    I watched the keynotes from the MIX07 conference and I have to say I'm rather impressed at Silverlight. I've been on the cusp with regards to WPF/E (and WPF for that matter) but after watching ScottGu talk about it and demo some pretty kick ass apps, I've gone over to the dark side.

    Maybe Microsoft won't say it out loud, but this is the Flash killer. I was always impressed with Flash because of it's rich nature. Watching Strong Bad cartoons in Flash was always fun. However I had a bad taste in my mouth with Flash. It was a giant tag on a web page, required a completely different language to learn, and was never really browser or search engine friendly. Sure, it looked good but that was about the extent of it.

    A couple of things that came out of MIX07 so far is not only the availability of Expression Studio, the web authoring tools that are sure to take the place of Flash Studio and Dreamweaver (which each member of MIX gets a copy of), but of the Silverlight Streaming service. Basically you can upload 4GB of content to the Microsoft data services and use it in a Silverlight-enabled app (web, desktop, or otherwise). Not bad for free as in beer.

    A few other cool things that came out of the keynote (once ScottGu got on stage) was remote debugging to a remote machine (he debugged from a PC to a Silverlight app running on a Mac, way cool) and the full .NET framework embedded into the Silverlight runtime enabled apps (not sure how to state this feature). So rather than the trimmed down compact framework, it's the full meal deal. There's also some great compatibility between Expression and Visual Studio Next (Orcas) as they use the same XAML files and same solution formats. You can basically build the UI that you want in XAML using Expression, then just save it and reload it in Visual Studio to use in your app. I was highly impressed with the Silverlight Airline app (hopefully source code will be available for this) which let you choose a set of dates, drag and drop an origin and destination, and with 3 lines of code Scott was able to show animation between routes and alternates when you selected each itinerary. Way cool and the way the web should be compared to the archaic way things are done now.

    Finally was the question of performance. Sure you can build awesome apps that look great but what about bandwidth? Apparently Microsoft has solved this problem so you'll start to see very right web sites using Silverlight, video enabled (even HD up to 720p), downloading in as little as 50k. This might be a bit of a bait and switch game as the app will be 50k but obviously the HD content will be larger. The point here is that it seems like Silverlight will know how to download content in a smart fashion so it's there when you need it, but you won't be staring at long loading screens. One example was with NetFlix where they streamed an HD movie with pretty good response time, from a Silverlight app. Impressive. Most impressive.

    You can install Silverlight here and download the SDK and other tools here. There's the 1.0 beta version and for your really on-the-edge guys, you can grab the 1.1 alpha releases. I'm now spending the rest of the night playing with Silverlight, getting boned up on WPF (finally) and putting together my own mashups so maybe watch for a few SL apps pop up here and there from me (as I tried to Frankenstein Silverlight and SharePoint together).

  • Calgary Code Camp 2007, A Visual Journey

    Just got the pics from James from the Calgary Code Camp we had this weekend so I figure I would take you on a visual journey. The Code Camp was a blast and we had a great turnout, with about 100 people showing up. Hope everyone had a great time. I had the best time co-presenting with John on XNA as we plowed through 2 sessions covering everything from starter kits, debugging, deploying, textures, meshes, audio, and everything else XNA.

    P4280235

    What a great crowd and hey, there's JP poking his head inthe door!

    P4280230

    The first prizes are given away. It's going to be a full day of schwag!

    P4280291

    Donald Belcham (aka the Igloo Coder) points to the word "changes". Maybe he's about to initiate some?

    P4280279

    Steven Rockarts bangs out his presentation on the Windsor Container.

    P4280278

    David Woods reflects on his work.

    P4280277

    Bruce Johnson from ObjectSharp stopped in on his way to Mix to talk about LINQ.

    P4280276

    Jean-Paul Boodhoo rides the monorail.

    P4280247

    Terry Thibodeau and his walk through mocks.

    P4280250

    John Bristowe gets some help from our XBox 360s during his DataDude presentation.

    P4280258

    James Kovacs takes a lap around TDD, mocks, and dependency injection.

    P4280241

    Daniel Carbajal takes us through WCF.

    P4280260

    D'Arcy Lussier can't be photographed with traditional equipment. I believe we need to get a special camera that can take pictures of the undead to be able to get a clear shot.

    We also had a kick-ass display for our XNA sessions. We brought 3 XBox 360s, 3 laptops, and a backup projector just in case.

    P4280229

    We had two projectors setup, one with the code on it and other with the Xbox output. We also had two laptops setup, I was doing the code on mine and John had his setup with the browser and powerpoint slides. All in all, we had about 18 cores running in our tiny room but it was a blast. Our setup was so large we couldn't get it in with one photo!

    P4280285

    P4280283

    You can view the entire Flickr set here. Sorry for the quality of the pics but things were rushed and a lot of times I didn't turn the flash on (so as not to disturb the presentations).

    I'll be following up with a post in a day or so with a wrapup of the event and download links for all the source code for our XNA sessions.

  • TFS vs. Open Source, the battle rages on

    Caught a thread between Roy Osherove and Oren Eini that has gone back and forth a few times, all about Team Foundation Server and open source tools (and the deficencies Oren points out in TFS).

    The discussion has been (mostly) centered around source control, however I think they're both missing on the main feature of TFS. That is extensibility.

    Yes, other packages out there are extensible by nature (Subversion for example) but require coding, architectural changes, hooking into events, all of which are nice but systems like this were not designed for it. Was subversion really designed at the start to be extensible so I could maybe have my storage be in a relational database rather than the file system?

    TFS by it's very nature was built around extensions. The Work Item itself is just a container, defined by the fields, rules, and relationships you create in the process template. There is no "default" Work Item. There is no concept of a "bug" or "feature" in TFS. It's just a Work Item and can be morphed into whatever you need it to be. Just look at the Conchago guys with Scrum for Team System, and how they turned Work Items into sprint and product backlog items and even through in a sprint retrospective item.

    I was asked recently if we could modify the bug template so we could track the steps to reproduce. I said we could use the description field, but decided to build out a new type of Work Item (using Joel's very excellent Process Template Editor) so that you could create a work item (a bug) and add as many steps to reproduce and and expected behavior field for kickers. The entire process took me an hour (and that included about 15 minutes to grok the templates as I've never done this before).

    I've tried these type of things on other systems and they're painful. Sure, some systems are quite helpful in adding new fields, changing the layout, etc. but none are things that you can add entire concepts that are new, not just net new (there is a difference). Could I crack open subversion to support a way to link checkins to an external feature list? Sure. Why would I when TFS has this already.

    As for modifying open source systems to do your bidding, you enter into a fork scenario. Unless the system supports a plug-in pattern and you can just add a new assembly (like say oh the TFS policy sub-system) I really can't do much with a tool even if I have the source code, unless I want to run the risk of being in a maintenance nightmare from Hell scenario. Do I really want to do diffs of new relases of NUnit with my own code to support new extensions.

    Luckily there are some open source systems that are built around an extensibility model but so is TFS. And while it might have deficiencies in various places I can plug in new features or introduce entirely new concepts to the repository so that I can make it match whatever business process I use.

    Is the source control system in Team Foundation Server extensible or replaceable? No, but I'm willing to live with a few problems while we get to version 3.0.

  • Calgary Code Camp 2007, no hotdogs but plenty of schwag!

    If you're around or about the Calgary area this weekend what should you be doing?

    1. Meeting up with Calgarians to talk about Al Gores presentation this week on his global warming show, The Inconvenient Truth?
    2. Checking out a semi-naked Rose McGowan being beat up by Kurt Russell at 120 miles per hour in Grindhouse?
    3. Enjoying the fresh air and sunshine with your family.

    No.

    You should get your geek-butts down to the Calgary Code Camp. It's this Saturday and we're ready to roll, so should you be.

    What can you do at the code camp? Not only see over a dozen speakers and sessions but perhaps walk away with some truely awesome door prizes.

    We're giving away about $20,000 (holy crap, that's a lot of stuff!) worth of software, hardware, books, and goodies from over a dozen sponsors including ComponentArt, Dundas, JetBrains and others.

    I'm giving two fun-filled-uber-cool sessions on XNA programming so we'll be building games, doing demos, and going deep dive on the XNA content pipeline, as well as checking out some cool tools for you to start writing games for the Xbox 360 (and we'll have our 360s there for some between session gaming, Gears of War anyone?)

    Oh yeah, did I mention this was... all... free! Free as in beer (or speech if you prefer).

    Be there!

  • Making up your mind about a name

    I've highly confused by Microsoft sometimes (like that's a surprise).

    Originally, we had some very cool names for new products/technologies. Indigo and Avalon. These became WCF and WPF (Windows Communication Foundation and Windows Presentation Foundation respectively). These names are so not only un-cool, they're a mouthful to say three times fast during a podcast.

    Then we had WPF/E (Windows Presentation Foundation/Everywhere) which is now identified by the much cooler name Silverlight.

    Wish they would make up their minds. Cool names or not. Which is it?

  • Being Kimberly Tripp

    This week the Calgary Code Camp is coming up where I'm giving two sessons on XNA Development (XBox 360 debugging from a laptop baby!) and I've been reflecting on my own presentation skills for the past while. As it is with being a busy-body, I've been heads-down building projects so my conference attendance has been down. The last conference I spoke at was DevConnections in Vegas back in November and with personal and professional commitments, I'm not looking to speak until next year at DevConnections again (sans the odd gig here and there like the Code Camp and various user group presentations or webcasts). This has given me some time to look at my presentation skills and ask "Do I really have what it takes?".

    I’ve only been presenting at code camps, TechEd, DevConnections and user groups for a couple of years now and I feel that I get pretty good scores. 80% of them are in the 7-8 range with a few (10-15%) being a 9 or 10 and some (5-10%) being a 3-4. I consider this pretty good but not great. Certainly not anywhere near a Kimberly Tripp, a Dino Esposito, or a Scott Guthrie. Is there a way for mere mortals to evolve from mediocre to great? My main goal here is that I feel that if someone pays top dollar for a conference, I really want to give them as much bang for their buck when they're taking time out of their schedule to sit down and wallow through what I have to say. It's only fair.

    Getting to the subject line of this post. Kimberly Tripp is IMHO by far the best presenter I've seen. Ever. She even tops people like Scott GuthrieScott Hanselman and others (sorry guys), all of which I have the utmost respect and admiration for. The question I've been mulling over in my noodle is how does one become a Kimberly Tripp? No, not how do I look good in a dress and pumps, but how does one get to become a speaker who consistently gets flawless scores and really gives you, the community, the value-add that you pay for at a conference? What is the secret?

    I did a bit of a poll from various speakers I know of to get their opinions on what it was to reach that upper echelon of the presentation platform. The answers I got were pretty on-par with what I've been thinking of so no surprise there. In short there's no cookbook here and no magic pill you can take and as Richard Campbell said, "it's a complicated subject".

    One thing that I want to mention here is that the very best speakers out there are making a living as a speaker. I have my day job and I speak as often as I can, but that equates to a few conferences a year at best. The top dogs out there are doing 60 shows a year with 4-8 talks per show. This has two effects: one is that they're extremely well practiced in their art and the other is that they're familiar to their audience. Thanks to Richard Campbell for pointing this out to me.

    Here are some tidbits I picked from speakers and combined with my own cup of reason here's some ideas on how to hopefully improve your presentation skills.

    • Spend time on your presentations. Rushing at the last minute is the last thing you should do as with Murphy's law, anything that will go wrong does. Screwing around rebuilding VMs (it happens sometimes) is not something you want to be doing hours before you're about to go on with your audience. I think it's okay to tweak things (see below on the difference between your presenation and the show notes) but complete overhauls or doing things on the fly is a no-no.
    • Follow your own rules. Julie Lerman has some safety nets and rules that she follows (as do I) like "thou shalt not code in public in a language that though dost not dream in". I think this is pretty key as you have to know your stuff inside and out in order to really be there for someone when they need an answer (or at least know where to look). Learn it inside and out and look at questions posted by the audience as areas that are things they're interested in. After all, we're here for presenting and sharing knowledge that is important to you, not the other way around.
    • Have passion for what you do. Passion and knowledge go hand-in-hand with presenting. If you're not passionate about your subject then you won't emit that to your peeps. On new topics I spend a few days before my presentations just getting deep into something not only to grok the topic but to really find the elegance (and ugliness) of something buried deep in the subject. This really helps me get excited about new topics and hopefully that shows in my work.
    • Watch everyone and build your own style. A disadvantage to being an MVP is that we're generally ahead of the curve when it comes to technology. At the last PDC I was rather bored as everything there was old news to me. At TechEd it was the same. However I try to get into see other people present, not for the content but the style and techniques that they emit. Learning from the best is the best way to learn, and you can't get that from a book. So if you're planning on getting into the speaking world spend some time watching the top dogs and seeing what makes their sessions that much better. What do you like about it? Then take it home, twist it and make it your own.
    • Give yourself time and use a little patience. I cook from time to time and it's never a good thing to just toss something in the pan and fry it on high heat (sometimes, but not always). Many times you cook it on medium heat, stirring it and letting the flavor seep in to add to the taste. Presenting is like that so give it time. The more you do it, the better you should get and you'll learn from your own mistakes, tweak a few things, and then come out next time with something even better.
    • Learn, learn, and then learn some more. If you speak at TechEd then you have access to the speaker coaching provided by Microsoft. Rocky Lhotka highly recommends taking advantage of this resource as these guys know all the tips and tricks and have the experience. I'm definitely going to see if I can do this next time round as it sounds like a great resource to tap into.
    • Take advantage of opportunity that presents itself, and make the opportunity happen if it doesn't. I've only been publicly speaking for a few years (and it shows) but others have been out there forever. Get involved with groups like Toastmasters (and similar groups) and look for opportunities to speak. Even if it's standing up in your own development group or department and talking about a cool new technology you see benefit from, it's a way to dust out those cobwebs and get the nervous bug out of your system. The more you do it, the more comfortable you'll feel.

    I wanted to mention one thing about doing last minute changes. I'm one of the worst people for that and usually update my presentations right up to the last day. Julie Lerman had a tip about this in a blog entry:

    With most conferences,speakers need to submit their powerpoints way in advance of the conferences. Attendees are provided with books filled with the printouts of the decks so that they can take notes during the conference. It is not uncommon with a new talk to fine tune it between that early preparation and the actual time you your presentation.

    Though this has only happened once, it struck me (and stuck in my brain) when an attendee wrote on an eval that it was a pain that the slides in my talk were different than the book.

    So this time around, rather than hoping that I'm going to remember in the middle of a talk and say "oh, I changed this slide a little (for your benefit)" I am just putting tiny little notes on the bottom of modified slides: "This slide is slightly modified from the original printed version".

    I found a follow-up by Billy Hollis on this (who is an additionally awesome speaker) that was a great tip:

    I solved this one long ago. Any text that's changed from the printed version I format with light green color. And I tell the audience that anything they see in light green is new or changed. With that visual cue, they don't seem to mind minor changes at all. What's confusing is knowing there is some change, but not being sure exactly how much.

    Hope these tips and ideas get something sparked for you and hope to see you out there speaking some day! 

    Many thanks to those that I bugged and pestered especially Julie Lerman, Rocky Lhotka, and Richard Campbell.

    P.S. Julie Lerman has a category on her blog here with lots of tips and her presentations mixed in. It's a good resource and a great read so check it out!

  • Taking a look at DotNetNuke 4.5

    While I'm a SharePoint guy thru-and-thru, I still like DotNetNuke think Shawn Walker and the community have done a bang-up job getting it to where it is today. It's now reached version 4.5 and includes some new features like support for Microsoft AJAX. I still struggle with module development for DNN and find writing SharePoint Web Parts (especially 2007) much easier, but PAs rule the planet for extending functionality where you don't have server access like you need for SharePoint.

    Here's a quick rundown on things I've noticed in the new version of DotNetNuke.

    The immediate thing you'll see is the improved header when logging in as admin or host.

    It's a lot cleaner and takes up a lot less real estate. Don't worry, the old header is there via an AJAX collapsible panel so it's just a click away:

    All the regular tasks are there, including a new Design view. This allows you to see the page but without the content in each module. The View vs. Edit mode is just like the old Preview mode so that's still there.

    What's new is the Solutions Explorer. This is a DotNetNuke marketplace type module that comes built-in via the Host menu:

    Looks very interesting and it loads the content each time you view it, so it's a portal to the live site to always keep you up to date.

    If you're like me I use the default accounts (host/dnnhost and admin/dnnadmin) however if you still leave those passwords intact for those accounts you'll see something like this when you login:

    It's a nice little feature to let you know your Host or Admin account could be compromised. I actually stumbled over a few DNN sites out there and for kicks would log in as admin, then send the admin and email telling him to change the password.

    Other small but nice changes I've noticed are like the host settings screen displays relative and physical paths where DNN is installed (sometimes nice to know on a hosting environment).

    Overall it's a great release, supports AJAX (Atlas, or whatever it is we're calling it these days) and looks like another solid version to build your community sites on.

  • Priority is a sequence, not a single number!

    This morning I opened up an email (and associated spreadsheet) that just made me cringe. Which of course made me blog about it, so here we are. Welcome to my world.

    Time and time again I get a list of stories that a team has put together for me to either review, estimate, build, filter, whatever. Time and time again I keep seeing this:

    StoryPointsPriority
    As a user I can ...51
    As an administrator I can ...31
    As an application I can ...41

    No. No. No!

    Priority is not "make everything 1 so the team will do it". When you're standing in front of a task wall with dozens of tasks relating to various stories, which one do you pick? For me, I take on the tasks that are the highest priority based on what the user wants. If he wants Feature A to be first, then so be it and I grab the tasks related to Feature A.

    However I can't do this (read: will not do this) when someone puts everything to be Priority 1. It's like asking someone to give more than 100%. You simply cannot do it. Priority is there to organize stories so the most important one gets done first. How you define "most important" is up to you, whether it's technical risk, business value, etc. and what value that gives you.

    This is more like what priority should be:

    StoryPointsPriority
    As a user I can ...51
    As an administrator I can ...32
    As an application I can ...43

    Another thing I see is priority like this:

    StoryPointsPriority
    As a user I can ...5High
    As an administrator I can ...3Medium
    As an application I can ...4High

    Another no-no. I can't tell from all the "High" features what is the "Highest" one and we're basically back to everything being a 1 but now we're calling it "High". Unless you've had a mulitple core upgrade in your brain (or are someone like Hanselman, JP, or Ayende who don't sleep) you do things one at a time then move on. As developers and architects, we need to know what is the most important thing to start with based on what the business need is.

    With customers everything is important, but for planning sake it just makes life easier to have a unique list of priorities rather than everything being #1. When all is said and done and I have to choose between 3 different #1s in a list, I'll pick one randomly based on how I feel that day. And that doesn't do your customer any good.

    Okay, enough ranting this morning. I still haven't finished my first coffee and I still have a few dozen emails to go through.

  • Sessions and speakers for the Calgary Code Camp

    The speakers and some of the sessions are up on the Calgary Code Camp site.

    I'm presenting two sessions on XNA programming. John Bristowe and I will double-team at the camp going over the basics then we crank up the volume to 11 and write some games as we go deep into the XNA framework and tools.

    Last year was fun but this year is going to be even funner. Yes, funner. Funest. Fun to the nth degree. The mosted fun you'll ever have for $0.

    Be there.

  • DataTable vs. BindingList<T>

    We were having a discusion today about the merits of using DataTables vs. BindingList<T> (a generic in .NET 2.0) for loading up domain objects into the UI layer (say to display on a grid). My gut feel is telling me DataTables are evil and wrong, but I don't have a lot of hard evidence to choose one over the other. We brainstormed some pros and cons for each and they're listed below.

    • DataTable
      • Pros
        • Simple to implement, not much code needed
        • Can use select statements to retrieve values
        • Change events are managed within the object automagically
        • Display handling for errors built-in (when binding to grids)
      • Cons
        • Human errors (typos on column names for example) can be exposed at runtime and can't be easily tested
        • Need to implement DataViews in order to sort or filter
        • Can't test for type safety (or as Scott says DataTables are bowls of fruit)
        • Difficult to implement business rules or logic
        • Bloatware, lot of extra baggage for features you don't need
    • BindingList<T>
      • Pros
        • No mapping needed
        • Strongly typed and type-safe
        • Loosly coupled compared to a data table -> mapping columns -> domain object
        • More extensible via superclasses, interfaces, etc.
      • Cons
        • Must iterate through list to find items
        • Must implement some mechanism (like a decorator pattern) to respond to change events
        • More short term investment to learn and implement

    Are we wrong with our list or is there something that you've come across with your dealings with the two approaches?

  • What do you do to get motivated for the day?

    I live about an hour south of Calgary in a town called High River. Each day I was driving into the downtown core and parking. It wasn't the expense that was the issue, but the fact I was on the road for about 2 hours a day, every day and my routine felt like I was driving from one place to the next (which I was). I felt unproductive and like I was switching context from one state to another with nothing in between.

    Recently I decided that I would stop driving all the way into the downtown core and just drive to our community rail system at the south end of the city (about a 30 minute drive). There I would take the train into the core (about a 45 minute ride) and walk 2 or 3 blocks to the office. This would afford me the opportunity twice a day to wind down (or wind up as it were) as I got into the day. Everyone is always go, go, go these days but my attitude is to relax and enjoy the ride. This supported that.

    With my spare time I either crack open a book (currently re-reading Jimmy Nilsson's Applying Domain-Driven Design and Patterns) or get 30 minutes or so on the laptop coding or something. And of course I plug in my iPod and whittle away the time with tunes. I think everyone needs a little downtime, not only between projects but between days. If you're constantly moving from bed -> work -> dinner -> bed, you'll burn out.

    I'm not a music afficiando or anything (don't even have a geeked-out home theatre system) but I do enjoy music. My top 5 items on my iPod that I listen to each day is:

    • Mike Oldfield. When it comes to music, I live, breathe, and eat Mike Oldfield. Most people have no clue who Mike is, but I'm sure you'll recognize it. It's the music played at the end of The Excorist (aka Tubular Bells). If you heard it, you would probably go "oh yeah". Mike is a musical genius in my books and anything he does is gold (especially when he pairs up with Maggie Reilly on vocals). Easy listening and relaxing.
    • Bond. 4 drop dead gorgeous girls playing classical instruments to a boppy beat. What more can you say?
    • Enya. The celtic sound does it for me, and her voice is soothing, especially at 6 AM on a crowded train.
    • Sarah Brightman. Another muse that lets me ease into the day without frying my brain.
    • Loreena McKennitt. More celtic goodness from someone with a heavenly voice and Canadian to boot!

    Other stuff I'll listen to:

    • Podcasts. It's always good to catch-up on the train with an episode of DNR or Hanselminutes. I never grow tired of listening to those guys.
    • Peaches. A NSFW punk-girl band that kicks things up a notch. Another band like this is Evanescence. Good music with a little raunch and kick ass attitute. I'll throw Siouxsie and Banshees in here too.
    • Classic rock. Yeah, I'm a 70s rock guy so you'll find things like Queen, Kiss, and Electric Light Orchestra happily playing alongside New Age goodness. This also includes ABBA that I'll admit I listen to. Who doesn't like these guys?
    • Old TV themes. They're short and cute and take me back to my younger days and break up the emotional ride you might get from a deep instrumental piece. Fun and peppy.
    • Movie soundtracks. Some music just works at any time of the day, like both volumes of Kill Bill. Awesome music and really gets the neurons firing early in the morning.
    • Chemical Brothers, Moby and trance music. While I do like easing into the day sometimes it's good to mix in something spicy to kick it up a notch. These guys do it for me.
    • Johnathan Coulton. Johnathan who? I only listen to one song from this guy, Code Monkey, as it bridges the music world and my geek life together in 3 minutes. Brilliant!

    To kick off the morning I'll either down a coffee or two (or three or four...) but prefer a Red Bull or Rockstar (sugar free). Silly and probably damaging to some part of my internal organs (including losing about 10,000 brain cells each day), but it's that kickstart that I use to get going. 

    When I get to work I'm ready to face the day. I'll kick into work mode about halfway on my way there, thinking about the morning scrum, what I need to prepare for it, projects I'm working on, and accomplishments I intend to commit to for the team. This gets me into a mindset that lets me slip into business-mode rather than a quick shocking start like I used to have and I find it makes me more productive as a whole.

    So what's on your iPod? How do you start your day (or finish it) so you're not burned out and ready to face any challenge you might have?

  • Breathing new life into Tree Surgeon

    As I took over the maintenance of Tree Surgeon from Mike Roberts, there are millions (well dozens maybe) of ideas buzzing around in my head. We're tracking these ideas using the Issue Tracker on CodePlex. This will allow you to add new ideas as well as vote on existing ones. The strategy here (as is with all my CodePlex projects) is to have the team (which is building right now) focus the development on the most popular ones.

    I've added a few of my own to start (VB.NET support, VS2005 support, ClickOnce) and others have jumped in too (CIFactory structure generation [great idea], and MbUnit support).

    Please feel free to keep the discussions and ideas (via comments or work items) flowing as we evolve the Tree Surgeon tool to the next level.

    Thanks!

  • Scrum Room = Fun Room!

    I like to have fun at work. Whether it's just messing around (by changing developers desktops to pictures of the Simpsons) or just focusing on a task, I think software development should be a fun thing and thus, be conducted in a fun atmosphere. After all, if you're not having fun then what's the point?

    A few months ago, we shifted things around and finally got a large enough room to setup our projects in what we call the Scrum Room (I like to call it the center of the universe, but that's a little egocentric as it doubles as my office). Unfortunately our environment isn't what I would prefer it to be (a large team room for all members to be co-located) but this isn't bad. A single "War Room" where we hold the daily scrums each morning for each project. I personally grind code, print out burndowns, and keep the ship steered in some direction (the direction changes all the time) here every day but besides holding daily scrums, the area is generally regarded as the "drop by and let's talk about [insert design pattern here]" room.

    First off, we have the daily scrum rules posted on the wall for everyone to see and for us to refer to from time to time as people forget. As I mentioned last week, if anyone strays from the rules during the daily scrum, the Scrum Witch lets out a Wilhelm scream (and we don't want that to happen). This wall also holds the burn down charts (created from Team System) of each iteration. I forgot to snap a picture of the entire burndown wall but you can catch one of them here. I'll post later a more detailed breakdown of the burndowns from one project as we're in the 6th month and there's been a lot of great activity and challenges with that project.

    P1010034

    Next is the start of daily scrum. This is a Japanese character a friend of mine got and I had to barter with to obtain (I traded a broken iMate Jas Jar for it). He's an alarm clock of sorts and when you press the button on his chest, music starts up and he tells you to wake up (in Japanese of course). Press the "snooze" button again and he tells you "thank you for waking up" (or something like that, my Japanese is non-existent) and the music stops. We would get into the habit of starting this guy up just to get everyone pumped for the day, although I haven't activated him for awhile now.

    P1010036

    Now we come to "The Wall". This is a large (about 20ft wide) wall in my office that houses 3 projects and their tasks. Each project has a 8-10ft section of the wall and we print out the splash screen for each project to identify it (of course the splash screen is the first thing done for the project, screw the requirements, we need a cool logo!).

    Under each project contains 3 sections with tasks. One for "Not Started", one for "In Progress", and one for "Done". The "In Progress" section is broken down with a small post-it showing 0% - 100% which is the completeness of the task. Under the "Not Started" section we break down tasks in an organized fashion so it's easier to find them when you're grabbing a task during your 5 minutes of fame at the morning scrum. Each team groups the tasks differently. One team has it defined by role (BA, QA, Dev, etc.), another has it defined by a feature, still another uses a line of business to collect tasks. Whatever works for each team is fine.

    It's the usual routine for task boards (in our case the entire wall is the board). Tasks move from the "Not Started" area to 0% in the "In Progress" area. As team members work on tasks, they move across the wall to 100% then drop into the "Done" area. It really does give a quick overview of where things are at. It's the easiest way to describe and display progress and the entire state of the iteration for anyone looking at it. This is how much we have to do, this is how much we've done. Highly effective and easy to understand.

    P1010030

    The banner at the top of the wall is labeled "The New Goodness" and was a phrase someone has mentioned awhile back (more than likely it was over a few shooters at the bar, but that's okay too). We liked it as it represented the new approach to software delivery (agile vs. waterfall) and seemed to reflect the atmosphere we wanted to take. Something new and something good. Sure the grammar is off but again, we're focused on fun here not English. The development manager also printed out a picture of a traditional rugby scrum so we felt it was appropriate for the wall (and some mornings it feels like this).

    P1010033

    There's a section over my desk where we've got some fun and motivational type stuff. A printout of a cartoon that Hugh MacLeod created (I'm not cool enough like Scoble to have a hand signed lithograph) that is a bit of a motto when you're in my office. We have the Scrum cartoon about the chicken and pig wanting to open a restaurant, courtesy of Implementing Scrum. Finally, there's the fish. This will take a little explaining.

    P1010031

    This fish is the award the team member gets for breaking the build. Originally we were thinking about bringing in a real (ala taxidermy) fish. The dev manager has 3 of these so we would pass out the fish and the team member who broke the build gets to display the fish on his desk all day. This wasn't quite practical (and we felt we would run out of fish and then what! Goats? Sheep? Cats?) so he hunted down a goofy picture of a kid holding a fish. If you break the build, he emails the fish to you and prints out a copy for you to pin up in your cube.

    Today we discovered some people were actually collecting their fish so maybe we'll have a contest at the end of the project as to who gathered the most fish. The idea is to spice up your team with ideas and promote fun within the team even when they do something bad like breaking the build.

    P1010032

    Well, that's the whirlwind tour of our Scrum Room. It doesn't have to be a stuffy board room or a boring task board, and if you're going to live in it every day (like I do) make it enjoyable!

    The message here is to have fun with your projects. Don't get so stressed out. So what, you lost a resource or two. So what, the requirements changed a day before you were supposed to deliver that feature.

    Breathe, relax, pick up, and carry on. It's just software.

  • Tree Surgeon has a new home... on CodePlex!

    About a week or so ago Mike Roberts posted a note that he was no longer going to be working in the .NET world as the Java world was taking over at his company. Mike is the author of many blog posts on setting up a development tree in .NET and these blog posts spawned a tool called Tree Surgeon. As Mike was no longer going to be working in the .NET space, he threw out the gauntlet for someone to pickup the maintenance for the tool.

    I picked it up as I think it's a great tool and can only improve with time. You can find the new home for Tree Surgeon here on CodePlex.

    I've setup all the documentation the same as the original site along with putting out version 1.1.1 (the last release). You can grab it various flavours:

    Source code is checked into CodePlex so you can grab the latest changesets from here.

    There's plenty of ideas for Tree Surgeon in the coming year, so I encourage you to visit the Discussion Forums and talk about what you're interested in seeing and keeping track of (and voting on) new features and bugs via the Issue Tracker.

    I've also changed the license for Tree Surgeon so it's now released under the Creative Commons Attribution-Share Alike 3.0 License (I'm not only a CodePlex junkie, I'm a CC one too).

  • Beware the Scrum Witch!

    I'm always happy when I see the Internet spread goodness, or at least what I perceive to be goodness. Last week or so I talked about the Scrum Witch, a horrific little screamer that we introduced to our daily scrums as things were getting out of hand. If a team member strays from our standard routine, we unleash the Scrum Witch on them, screaming and howling for everyone in the office to hear.

    The witch has been pretty successful as we're sticking closer to the routine and there's less gossip-talk during the scrum. Scrums end in under 10 minutes now (where they previously would linger for 15, 20 and even 30 minutes) and everyone is focused. I've only had to activate the Witch twice, and both times were with the same PM who charged off asking all kinds of questions (not even related to the current sprint!).

    Mike Vizdos over at Implementing Scrum has a cartoon this week called Work Naked on dysfunctional things he sees at the daily scrum and yes, the Scrum Witch made an appearance (although it would have been awesome if she made it into the cartoon, ahh someday...)

    The message here is simple. The daily scrum is your commitment to the team, not a report to the PM or Scrum Master on what you did. Be kind and respectful and the pain will last only a few minutes.

    Watch later this week for more scrum fun as I have a few posts on the go right now.

  • Another year, another MVP renewal

    I was a little nervous the last few days as everyone and his brother (Sahil, Frans, etc.) had all recieved their MVP renewal notices. I got mine this morning but apparently it was sent out yesterday, my pathetic mail client seems to have toasted it. Anyways, MOSS MVP for another year. This is my 4th year and so look for more SharePoint goodness the remainder of this year. Lots to come from this tired brain of mine. Congrats to all the new and renewing MVPs this round too. See you at the next summit!

  • Comparing expectations with Constraints using Rhino Mocks

    I've been more work with Rhino lately (and really digging it) and wanted to pass on a tidbit that might be useful to some of you.

    Here's the setup. You're implementing the MVP pattern and your view will contain a list of items (probably displayed in a grid, listbox, etc.). You start with a test where your presenter will initialize the view with a list of items from a backend system. You want your test to verify that the view gets updated (via the presenter) with the correct list.

    Let's setup our test using mocks. We'll mock out the view since the implementation isn't important to us right now. We only want to ensure that when the presenter is initialized (via a called to OnViewReady) it will 

    1. Call a backend system to get a list of items
    2. Set the view with those list of items
    3. We can ensure the view contains those items.

    Here's the test for that with excessive comments so it should be self explanatory:

       24 [Test]

       25 public void OnViewReadyViewShouldContainItemsFromRepository()

       26 {

       27     // Create the mock objects

       28     MockRepository mocks = new MockRepository();

       29     IProjectListView listView = mocks.CreateMock<IProjectListView>();

       30 

       31     // Creat a real presenter and assign the mock view to it

       32     ProjectListViewPresenter listViewPresenter = new ProjectListViewPresenter();

       33     listViewPresenter.View = listView;

       34 

       35     // Setup our expectations for the view by getting

       36     // a list of projects from a repository (created via a factory)

       37     RepositoryFactory factory = new RepositoryFactory();

       38     ProjectRepository repository = (ProjectRepository)factory.GetRepository<Project>();

       39     List<Project> fakeProjectList;

       40     fakeProjectList = repository.GetAll();

       41     listView.Projects = fakeProjectList;

       42     LastCall.IgnoreArguments();

       43     Expect.Call(listView.Projects).Return(fakeProjectList);

       44 

       45     // Invoke the mock engine

       46     mocks.ReplayAll();

       47 

       48     // Call the real presenter that we want to test

       49     // This will call the repository to retrieve a list of

       50     // projects and update the view to include them

       51     listViewPresenter.OnViewReady();

       52 

       53     // Check the view to ensure it's been updated

       54     // with the list of projects from the repository

       55     Assert.AreEqual(3, listView.Projects.Count);

       56 

       57     // Teardown the mocks

       58     mocks.VerifyAll();

       59 }

    Other than the setup code (creating the mocks, presenter, etc.) which could all be done once in a Setup method there's a few problems with checking the list of projects from the view. While we did mock out the view, we're checking the count only. If we want to ensure that the list contains the projects we expect we might have to iterate through the list and compare the Project objects that are returned and that's a lot of work.

    There's an easier way to check lists with Rhino which measures up to the same amount of code but is much more effective at testing the contents of the list. We can use constraints on the expected call. Constraints is a list of constraint objects attached to your mock that tell you there are expectations that should match up to the constraint you define.

    Instead of assigning our fake project list to our view then setting the expectation via an Expect.Call method, we'll add a constraint to the mock. We don't need to assign the listView.Projects value so we can set it to null and the next line, LastCall.Constraints(...) will be our contraints we want to attach to that mock item:

       30 listView.Projects = null;

       31 LastCall.Constraints(new AbstractConstraint[] { List.Equal(fakeProjectList) });

    We still have to create the expectation, but now we use List.Equal(...) and pass in the fakeProjectList. This means when the mock runs it will ensure that the listView.Projects property not only contains the same number of items (like our original test) but the list is actually of the same type and is the same list (I think Rhino internally uses the Equals method on each item to compare them). So now our test looks like this:

       14 [Test]

       15 public void OnViewReadyMViewShouldContainItemsFromRepository()

       16 {

       17     // Create the mock objects

       18     MockRepository mocks = new MockRepository();

       19     IProjectListView listView = mocks.CreateMock<IProjectListView>();

       20 

       21     // Creat a real presenter and assign the mock view to it

       22     ProjectListViewPresenter listViewPresenter = new ProjectListViewPresenter();

       23     listViewPresenter.View = listView;

       24 

       25     // Set the expectations of the mock via a constraint

       26     RepositoryFactory factory = new RepositoryFactory();

       27     ProjectRepository repository = (ProjectRepository)factory.GetRepository<Project>();

       28     List<Project> fakeProjectList;

       29     fakeProjectList = repository.GetAll();

       30     listView.Projects = null;

       31     LastCall.Constraints(new AbstractConstraint[] { List.Equal(fakeProjectList) });

       32 

       33     // Invoke the mock engine

       34     mocks.ReplayAll();

       35 

       36     // Call the real presenter that we want to test

       37     // This will call the repository to retrieve a list of

       38     // projects and update the view to include them

       39     listViewPresenter.OnViewReady();

       40 

       41     // Teardown the mocks

       42     mocks.VerifyAll();

       43 }

    Note that we also don't have to do the Assert.AreEqual check at the end. Our call to VerifyAll will handle that when the mock is torn down.

    Like I said, the amount of code isn't that much different, you're just using a different call on setting up the mock. However you can add as many constraints as you like. For example you can ensure the list is of the right type, it contains that many items, and you can even tell it the first item has to have some pre-determined value. Constraints are stacked up and evaluated when you tear the mock down so make sure you put in the VerifyAll call.

    This is just an example of changing the way you might check a list of items using constraints but you can use constraints for any type. For example if you had a single property on a mocked object you can add a constraint that it was greater than or equal to a certain value, or that it met a certain type if you were say testing a sub-class. Check out the "Is" class to do things like Is.GreaterThan, Is.LessThanOrEqual, Is.Type, etc.

    Lots of possibilities here so dig in and play with constraints on your mocks. You might find something interesting and learn something new along the way!

    kick it on DotNetKicks.com

  • Fool me once, fool me twice, April Fools Day has come and gone (again)

    No, this blog is not being sued. As some observant readers figured out yesterday, the cease and decist letter to shutdown my blog was a hoax. Astute readers pointed out the Milton, Chadwick, and Waters was the law firm from the movie The Devils Advocate and that John Milton was the character played by Al Pacino. It was the first movie with lawyers that popped into my head and seemed appropriate, although the law firm from John Grisham's novel "The Firm" would have sufficed.

    What most people didn't pick up on was that the hoax was actually setup by me. I was not the person on the recieving end of a prank as some people thought, you were. There was some news item on Saturday about someone having to change the name of their product and the idea for my blog popped into my head. I did a quick search to find an example letter and just filled in the blanks.

    For those of you that are expecting the blog to shut down by April 15, sad to say I'm still here and will be for some time. For those that started the "Save the Bil" fund, I thank you but please send you money to people who club seals for a living or some other deserving group. I don't need it.

    I don't know if I'm very, very, good at doing these April Fool blog posts or really, really, bad at them. Last years post of open sourcing Windows SharePoint Services got some people riled up (including unnamed sources deep inside the hallowed halls of Microsoft itself).

    We'll have to hang around til next year to see what my augmented mind can dream up.

  • CSS Reference Chart for SharePoint 2007 - PDF Version

    Heather Solomon, the MVP queen of SharePoint style, has put together a fabulous CSS reference for SharePoint 2007. This covers both Microsoft Office SharePoint Server (MOSS) and Windows SharePoint Services (WSS) and displays the name of the style along with an example and where the style is defined in what file. Brilliant.

    I've put together a PDF version of the reference guide if you're into that. You can download the 12 page reference guide from here. Heather's original online version can be found here.

  • Cease and desist - Have to find a new name for my blog

    It seems I am no longer able to keep this blog name. I received this email today:

    From Milton, John S. Apr 1 08:29:30 2007

    Subject: Cease and Desist Letter for your site "Fear and Loathing"

    From: "Milton, John S." xxxxx@xxxxxxx.com

    To: emailme@bilsimser.com 

    Dear Mr Simser:

    I am the senior partner with the law firm of Milton, Chadwick, and Waters based out of New York City, NY and represent the estate of Hunter S. Thompson. It has come to my attention that you have made an unauthorized use of my clients copyrighted work entitled "Fear and Loathing" (the "Work") as the name for your website. The estate reserves all rights in the Work, first published in 1970. Your work entitled "Fear and Loathing" is essentially identical to the Work and clearly used the Work as its basis.

    As you neither asked for nor received permission to use the Work as the basis for your website nor to make or distribute copies, including electronic copies, of same, I believe you have willfully infringed my rights under 17 U.S.C. Section 101 et seq. and could be liable for statutory damages as high as $150,000 as set forth in Section 504(c)(2) therein.

    I demand that you immediately cease the use and distribution of all infringing works derived from the Work, and all copies, including electronic copies, of same, that you deliver to me, if applicable, all unused, undistributed copies of same, or destroy such copies immediately and that you desist from this or any other infringement of my rights in the future. If I have not received an affirmative response from you by April 15, 2007 indicating that you have fully complied with these requirements, I shall take further action against you.

    Very truly yours,

    Milton, Chadwick, and Waters

    Attorneys at Law

    While I don't consider myself an "A" class blogger, I guess too many people who were looking for content from the late Mr. Thompson keep arriving at my site and scratch their heads about this whole SharePoint thing.

    So I need to find a new name for my blog. I turn to you, happy reader on this fine day for your help. What should I rename my blog to be? Looking for any suggestions here no matter how wild so feel free to leave them in the comments section below. If I don't come up with a good name by April 15th I'll shut this blog down.

    Thanks.