<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Jeff does Server &amp; Tools Online</title><subtitle type="html">The sillynonsense and .NET musings of Jeff Putz</subtitle><id>http://weblogs.asp.net/jeff/atom.aspx</id><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jeff/default.aspx" /><link rel="self" type="application/atom+xml" href="http://weblogs.asp.net/jeff/atom.aspx" /><generator uri="http://communityserver.org" version="3.0.20510.895">Community Server</generator><updated>2009-08-12T13:23:00Z</updated><entry><title>Starting at Microsoft</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jeff/archive/2009/11/17/starting-at-microsoft.aspx" /><id>http://weblogs.asp.net/jeff/archive/2009/11/17/starting-at-microsoft.aspx</id><published>2009-11-18T02:41:00Z</published><updated>2009-11-18T02:41:00Z</updated><content type="html">&lt;p&gt;I had my first "real" day at Microsoft today (the first day is mostly an HR thing). There's still a great deal of stuff to do to really get settled, as anyone who has ever started a developer job knows, but it felt like I actually worked there today.&lt;/p&gt;&lt;p&gt;I'll be working on the forums team in Server &amp;amp; Tools Online, which owns the forums on the MSDN site, among others. Since I'm only at a point where I'm trying to find the restrooms, I'm not sure yet what kinds of things I'll be able to blog about, but given the fairly non-proprietary nature of what we do in that group, I hope to be able to blog more. Over the last few years I've not posted a lot here outside of stuff relevant to &lt;a href="http://coasterbuzz.com/" target="_blank" mce_href="http://coasterbuzz.com/"&gt;CoasterBuzz&lt;/a&gt;, one of my own personal sites, but the more interesting stuff that I couldn't blog about had to do with previous employers. The really off-the-wall non-technical junk (complete with the occasional naughty word) will appear on &lt;a href="http://jeffputz.com/" target="_blank" mce_href="http://jeffputz.com/"&gt;my personal blog&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;A quick shout out goes to the relocation folks at Microsoft, for making the move from Cleveland (relatively) painless. In another week or so, the move should be history overall, not counting the sale of my houses back in Cleveland. I think things have gone as non-stressful as could be expected. &lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7258603" width="1" height="1"&gt;</content><author><name>Jeff</name><uri>http://weblogs.asp.net/members/Jeff.aspx</uri></author><category term="Microsoft" scheme="http://weblogs.asp.net/jeff/archive/tags/Microsoft/default.aspx" /><category term="Career" scheme="http://weblogs.asp.net/jeff/archive/tags/Career/default.aspx" /><category term="Community News" scheme="http://weblogs.asp.net/jeff/archive/tags/Community+News/default.aspx" /><category term="MSDN" scheme="http://weblogs.asp.net/jeff/archive/tags/MSDN/default.aspx" /></entry><entry><title>Google Maps: They have humans!</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jeff/archive/2009/10/19/google-maps-they-have-humans.aspx" /><id>http://weblogs.asp.net/jeff/archive/2009/10/19/google-maps-they-have-humans.aspx</id><published>2009-10-19T19:51:00Z</published><updated>2009-10-19T19:51:00Z</updated><content type="html">&lt;p&gt;The last refresh of Google Maps messed up my street. I live two houses down from an intersection, where on one side the street has one name, and a different name on the other (two subdivisions started years apart). In the last refresh, they had the name from the other street extending half way down my street. I noticed a "report problem" link on the map, so I did. Here's what I got...&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi Jeff,&lt;br&gt;&lt;br&gt;Your Google Maps problem report has been reviewed, and you were right! We'll update the map within a month and email you when you can see the change.&lt;/p&gt;
&lt;p style="margin-left: 50px; margin-right: 50px; background-color: rgb(224, 224, 224); word-wrap: break-word;"&gt;&lt;em&gt;Report history&lt;br&gt;Problem ID: A4EE-24E3-19D7-40FE&lt;br&gt;&lt;br&gt;Your report:&lt;/em&gt; Beaumont Dr. actually extends to N. Carpenter. It's Red Clover to the east, Beaumont to the west.&lt;/p&gt;
&lt;p&gt;Thanks for your help,&lt;br&gt;The Google Maps team&lt;/p&gt;
&lt;/blockquote&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7233222" width="1" height="1"&gt;</content><author><name>Jeff</name><uri>http://weblogs.asp.net/members/Jeff.aspx</uri></author><category term="General Software Development" scheme="http://weblogs.asp.net/jeff/archive/tags/General+Software+Development/default.aspx" /></entry><entry><title>Interview to start: Six and a half weeks</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jeff/archive/2009/10/14/interview-to-start-six-and-a-half-weeks.aspx" /><id>http://weblogs.asp.net/jeff/archive/2009/10/14/interview-to-start-six-and-a-half-weeks.aspx</id><published>2009-10-15T03:36:00Z</published><updated>2009-10-15T03:36:00Z</updated><content type="html">
&lt;p&gt;Trying to wrap your head around leaving an area you've been around for 36 years for a destination and job 2,400 miles away is one of the single most bizarre things that I've encountered in my life. The time between my arrival in Seattle to interview at Microsoft (I was in town for just 27 hours) to my start date is going to be about six and a half weeks, or a month and a half. I'm not sure if that's making good time or not, and I'd love to hear stories from other current Microfolk who have relocated. The only unknown variable left is the move scheduling.&lt;/p&gt;
&lt;p&gt;We're downsizing a bit, because we simply can't buy a house. The housing market here around Cleveland has been a brutal disaster, and between my wife's unsold house of 18 months, which we'll take a bath on eventually, and my own which may sell quickly but erase most of the equity, this move is very much like starting over. We're not angry or bitter about it, but it isn't the most cheery subject. Lots of nice apartments and townhouses around the Seattle metro, and we look forward to waking up to much better scenery every day.&lt;/p&gt;
&lt;p&gt;It's weird how you can end up in a particular place for much longer than you expected. A great many life changes have affected me the last five years or so, which led me to one of the big "I'm a grown up" discoveries: That I can move if I want. Between visiting my new family out in Snoqualmie and frequent trips to Orlando to support my theme park habit, I was done with Midwest winters. Then I lost my job, twice in the span of a year, and I started to realize how awful the job market here was. Duh, good time to move.&lt;/p&gt;
&lt;p&gt;I've only had a few other "I'm a grown up" moments. The earliest one was that I could buy a season pass to &lt;a href="http://cedarpoint.com/" target="_blank" mce_href="http://cedarpoint.com/"&gt;Cedar Point&lt;/a&gt; and go as much as I wanted to. It makes me a little sad to break the streak of 11 straight seasons of passholderness. Another moment was they day I realized I could buy a house to live in. The most recent one was about two years ago, when I had a lot of bonus cash in hand and decided I could buy a completely non-essential expensive item: a hot tub.&lt;/p&gt;
&lt;p&gt;But the moving on to a new place and new job bit is the best moment of all for me. I've been a fan (and critic) of Microsoft for a very long time. I got caught up in the excitement of product development when I was writing my book, privy to early builds and roadmaps under NDA, and wondered what it might be like on the inside. Then the Mix conferences (I've been to three of the four) gave me warm fuzzies about how the Server &amp;amp; Tools division as a whole was coming along. Now I get to work with smart people who are very rapidly changing the way the customers of those products are interacting with the company. Very exciting times, indeed.&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7230270" width="1" height="1"&gt;</content><author><name>Jeff</name><uri>http://weblogs.asp.net/members/Jeff.aspx</uri></author><category term="Microsoft" scheme="http://weblogs.asp.net/jeff/archive/tags/Microsoft/default.aspx" /><category term="Career" scheme="http://weblogs.asp.net/jeff/archive/tags/Career/default.aspx" /><category term="Community News" scheme="http://weblogs.asp.net/jeff/archive/tags/Community+News/default.aspx" /></entry><entry><title>The animated featured content box: Critical design issues</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jeff/archive/2009/10/14/the-animated-featured-content-box-critical-design-issues.aspx" /><id>http://weblogs.asp.net/jeff/archive/2009/10/14/the-animated-featured-content-box-critical-design-issues.aspx</id><published>2009-10-14T16:02:00Z</published><updated>2009-10-14T16:02:00Z</updated><content type="html">&lt;p&gt;I saw &lt;a href="http://weblogs.asp.net/kencox/archive/2009/10/13/animation-on-msdn-web-pages-no-thanks.aspx" target="_blank" mce_href="http://weblogs.asp.net/kencox/archive/2009/10/13/animation-on-msdn-web-pages-no-thanks.aspx"&gt;this post from Ken Cox&lt;/a&gt; about his displeasure with the preview of the new VB developer site, specifically the animated box at the bottom. You've seen these before on a million different sites, where a number of featured content items are previewed.&lt;/p&gt;&lt;p&gt;Putting aside for a moment that this one is particularly non-useful (no single frame hangs out long enough to read it), what do these really accomplish? We can assume that the goal is to get a number of different things in front of the viewer. News sites in particular seem to love using these. I've certainly not conducted a human factors study on the subject, but my gut feeling is that this is completely ineffective.&lt;/p&gt;&lt;p&gt;The first flaw is that it's easier to scan a handful of headlines that are all there. My armchair designer mind says that people are drawn to pictures and retained longer by them, but I'm sure not I buy it. ABC News used to have an annoying headline rotator, but they recently switched to something that shows the picture as well as allows for the quick scan of headlines.&lt;/p&gt;&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/jeff/abcnews.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/jeff/abcnews.png" border="0"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;ESPN went a step further, realizing that their strength is the mountains of video they have. They abandoned the rotator entirely for video right there, immediately available.&lt;/p&gt;&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/jeff/espn.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/jeff/espn.png" border="0"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;It's funny how the traditional media is doing it better, while new and trendy get it wrong. Revision3 has the classic interpretation of this, and it's a failure. First off, they're using a busy image with text over it that's hard to read. Then they have the goofy "highlighted square" navigation in the top right that you almost miss. I shouldn't even call it navigation, because it doesn't tell you anything other than the number of frames, which is nearly useless information. There's no incentive to hang out and see what's next. It also continues to animate whether you like it or not.&lt;/p&gt;&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/jeff/rev3.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/jeff/rev3.png" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;But in my quick survey of things, no one gets it quite as wrong as MTV. They have the good old fashioned mystery meat keyframes at right, and many of the text descriptions are too long to read before the next frame.&lt;/p&gt;&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/jeff/mtv.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/jeff/mtv.png" border="0"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Ultimately, I think some of these attempts come from stakeholders who all get in a room and believe that their content is most important. That's a nightmare you'll frequently run into if you do client work in particular. Other attempts at this I think are simply imitation of a trend.&lt;/p&gt;&lt;p&gt;So what would I consider the critical thinking points around these things if I were in charge? In no particular order...&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Is it critical that everything sits above the fold? If not, then why are you trying to cram it all into the first 400 pixels? We live in a Google Analytics world. You can see how often people are clicking down the page.&lt;/li&gt;&lt;li&gt;Is everything you want to show really that important? If it is, are you sure there aren't other means of discovery? If you're a marketing department and everyone in your company thinks their stuff is most important, rank it yourself or get someone senior to the various departments involved.&lt;br&gt;&lt;/li&gt;&lt;li&gt;What is your audience looking for? This seems like such an obvious question, and I don't think designers ask it enough. If they're looking for headlines, give them headlines. If you want to pair with images, make sure they don't come at the expense of headlines. If the reverse is true, again, keep in mind that too much compromise may not effectively give your audience what they're looking for.&lt;/li&gt;&lt;li&gt;If you're convinced you have to show more than one thing in a given space, don't rely on conventions you've seen elsewhere. Mystery meat navigation sucks and it pisses off users. As it is, they're probably not going to hang out for more than a few seconds.&lt;/li&gt;&lt;li&gt;Animate only if you have to. You're falling into a trap where you have to predict the future in terms of how fast your readers can read, how long the content will be as long as you're using the animation, and you're living on the assumption that the dwell time on the page is long enough to see it all. If the average user sees 1.5 of your frames, you've already failed in getting the rest of that "important" stuff in front of the user.&lt;/li&gt;&lt;/ul&gt;Getting into the weeds like this is an important exercise I think. It's something that I've thought about quite a bit, and because of the objections I arrive at, I've never used one of these devices in my projects. That doesn't mean I won't, but I've yet to come up with something appropriate for my specific use cases. I think ABC News probably has the best implementation for their audience, and not surprisingly, it does the least.&lt;br&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7229863" width="1" height="1"&gt;</content><author><name>Jeff</name><uri>http://weblogs.asp.net/members/Jeff.aspx</uri></author><category term="Internet" scheme="http://weblogs.asp.net/jeff/archive/tags/Internet/default.aspx" /><category term="General Software Development" scheme="http://weblogs.asp.net/jeff/archive/tags/General+Software+Development/default.aspx" /></entry><entry><title>New MSDN preview from Hanselman</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jeff/archive/2009/10/09/new-msdn-preview-from-hanselman.aspx" /><id>http://weblogs.asp.net/jeff/archive/2009/10/09/new-msdn-preview-from-hanselman.aspx</id><published>2009-10-09T18:24:00Z</published><updated>2009-10-09T18:24:00Z</updated><content type="html">&lt;p&gt;If you haven't seen it (or don't otherwise subscribe to his blog), do &lt;a href="http://www.hanselman.com/blog/ANewMSDNForANewOperatingSystemAndANewDevelopmentEnvironment.aspx" mce_href="http://www.hanselman.com/blog/ANewMSDNForANewOperatingSystemAndANewDevelopmentEnvironment.aspx"&gt;check out Hanselman's peek at the new MSDN&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;My impression is that I'll be working in some subset of this new stuff when I get there next month, so I now have a vested interest. :) &lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7226317" width="1" height="1"&gt;</content><author><name>Jeff</name><uri>http://weblogs.asp.net/members/Jeff.aspx</uri></author><category term="Microsoft" scheme="http://weblogs.asp.net/jeff/archive/tags/Microsoft/default.aspx" /><category term="Community News" scheme="http://weblogs.asp.net/jeff/archive/tags/Community+News/default.aspx" /><category term="MSDN" scheme="http://weblogs.asp.net/jeff/archive/tags/MSDN/default.aspx" /></entry><entry><title>I'm joining the mothership</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jeff/archive/2009/10/05/i-m-joining-the-mothership.aspx" /><id>http://weblogs.asp.net/jeff/archive/2009/10/05/i-m-joining-the-mothership.aspx</id><published>2009-10-05T18:10:00Z</published><updated>2009-10-05T18:10:00Z</updated><content type="html">
&lt;p&gt;&lt;a href="http://weblogs.asp.net/jeff/archive/2009/09/28/redmond-bound-dismal-job-market-at-home.aspx" mce_href="http://weblogs.asp.net/jeff/archive/2009/09/28/redmond-bound-dismal-job-market-at-home.aspx"&gt;As I mentioned previously&lt;/a&gt;, I interviewed in Redmond for a position with Microsoft in the Server &amp;amp; Tools Online group, specifically Community Applications &amp;amp; Services (Codeplex, MSDN forums and other stuff in that area). I got the word Friday that I had an offer, today I verbally accepted it, and pending a background check and move, I should be starting some time in early November! I posted a few words about the interview experience on &lt;a href="http://jeffputz.com/blog/more-details-about-my-day-in-redmond" target="_blank" mce_href="http://jeffputz.com/blog/more-details-about-my-day-in-redmond"&gt;my personal blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;From a personal and professional standpoint, there are a million reasons why this is the right thing at the right time, and I really look forward to getting started. Those who have followed me on blogs over the years know that online communities have been a passion for me for as long as the Web has been around, and that's a perfect match to my enthusiasm for much of what Microsoft is doing. I look forward to being a part of the stuff in between the products and the people using them. Very exciting times!&lt;/p&gt;
&lt;p&gt;In the process of networking around Microsoft, I've also talked to quite a few people there outside of the group I'll be working in, and it feels good to have a greater awareness of what's going on. By the time I left Seattle last week, I was more convinced than ever that for the most part, the Server and Tools division of Microsoft is headed in the right direction. After living in a market (Cleveland) where nothing outside of medicine is doing anything with forward motion, it's a relief to see myself as a part of something good.&lt;/p&gt;
&lt;p&gt;So for the next few weeks, I'll be spending time selling non-essential stuff, making minor house repairs, closing out the season at &lt;a href="http://cedarpoint.com/" mce_href="http://cedarpoint.com/" target="_blank"&gt;Cedar Point&lt;/a&gt;, throwing a party to end all parties for our friends, and figure out how to get the cats to Seattle without causing them major trauma. My wife is stoked too, since her brother and his family lives out there.&lt;/p&gt;&lt;p&gt;What a year... marriage, honeymoon, unemployment, sell a house, move 2,400 miles, start a new job and prepare for a little bundle. Heck of a year! &lt;br&gt;&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7223737" width="1" height="1"&gt;</content><author><name>Jeff</name><uri>http://weblogs.asp.net/members/Jeff.aspx</uri></author><category term="Microsoft" scheme="http://weblogs.asp.net/jeff/archive/tags/Microsoft/default.aspx" /><category term="Career" scheme="http://weblogs.asp.net/jeff/archive/tags/Career/default.aspx" /><category term="General Software Development" scheme="http://weblogs.asp.net/jeff/archive/tags/General+Software+Development/default.aspx" /><category term="Community News" scheme="http://weblogs.asp.net/jeff/archive/tags/Community+News/default.aspx" /></entry><entry><title>Redmond bound, dismal job market at home</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jeff/archive/2009/09/28/redmond-bound-dismal-job-market-at-home.aspx" /><id>http://weblogs.asp.net/jeff/archive/2009/09/28/redmond-bound-dismal-job-market-at-home.aspx</id><published>2009-09-28T19:50:00Z</published><updated>2009-09-28T19:50:00Z</updated><content type="html">&lt;p&gt;I'm coming out this week to Redmond again to visit Microsoft and interview, this time for a developer gig.&lt;br&gt;&lt;/p&gt;&lt;p&gt;That last time, I was interviewing for a PM gig that I didn't entirely understand, and the vetting process before coming out was not particularly rich. I was an awful fit for that job, I think, and in retrospect, I'm not even sure how they came across me because I had never applied for it. But it was still a good experience, because it gave me a peek into the culture that I would never have had otherwise.&lt;/p&gt;&lt;p&gt;When I lost my job in April, the day after my honeymoon no less, my game plan became pretty obvious after a few days. I had to broaden the search and think more nationally in terms of the kinds of places I wanted to work. I also wanted to use the time I wasn't working (which has been a lot longer than I expected) to try new things, learn new things and develop my side business (mostly &lt;a href="http://coasterbuzz.com/" target="_blank" mce_href="http://coasterbuzz.com/"&gt;CoasterBuzz&lt;/a&gt;) into something that could sustain me for the duration. I feel like I did most of that.&lt;/p&gt;&lt;p&gt;Locally, in Northeast Ohio, the work potential is the worst it has been since 2001. The smaller short-term contract stuff kept leading me to the "over-qualified" response (seriously, for three months, doesn't that make me a low-risk bargain?), and the three really solid gigs I encountered after long interview processes ended up in two "we can't spend that money right now" endings and one that went to one of my mentors from two jobs ago, who also got let go and was clearly the better candidate, by a long shot.&lt;/p&gt;&lt;p&gt;We're not at all tied down here in any way other than real estate (another dismal market), so I've been targeting a number of well-known companies and watching their job postings, mostly in the Pacific Northwest and Central Florida. Good choices, too, as &lt;i&gt;Forbes&lt;/i&gt; recently named Seattle as the best place for tech jobs, and Orlando was third place. I never forgot the trip to Microsoft, and going to conferences and what not just made me want to be a part of what goes on there even more. It's a far cry from the start-ups I've been working at, but internally, there are a lot of people taking initiative to better their product areas. Who wouldn't want to be a part of that? I've been watching the boards for start-ups and small companies as well, but the number that are hiring in these regions seems to be nearly zero.&lt;br&gt;&lt;/p&gt;&lt;p&gt;This trip feels much different already. I had two brutal phone screens that were far more intense than most face-to-face interviews. The vetting process was solid and I go in feeling like I understand the gig, they understand me and flying me out there is a good decision for everyone. I'm really psyched for the trip. Plus there are bonus points because I'll have a short window to visit family out there.&lt;/p&gt;&lt;p&gt;I'll share more about the process after I get back, and hopefully have good news to share as well! &lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7219499" width="1" height="1"&gt;</content><author><name>Jeff</name><uri>http://weblogs.asp.net/members/Jeff.aspx</uri></author><category term="Microsoft" scheme="http://weblogs.asp.net/jeff/archive/tags/Microsoft/default.aspx" /><category term="Career" scheme="http://weblogs.asp.net/jeff/archive/tags/Career/default.aspx" /><category term="General Software Development" scheme="http://weblogs.asp.net/jeff/archive/tags/General+Software+Development/default.aspx" /></entry><entry><title>Dependency injection, providers and ASP.NET MVC</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jeff/archive/2009/09/16/dependency-injection-providers-and-asp-net-mvc.aspx" /><id>http://weblogs.asp.net/jeff/archive/2009/09/16/dependency-injection-providers-and-asp-net-mvc.aspx</id><published>2009-09-16T15:23:00Z</published><updated>2009-09-16T15:23:00Z</updated><content type="html">&lt;p&gt;I've been thinking a lot about all of the frameworks we have now to use with our, uh, frameworks. There's a framework to solve every problem. Dependency injection frameworks are of particular interest to a lot of people because they make unit testing ridiculously easy. They're also well suited to something like ASP.NET MVC, where you're trying to make as few dependencies as possible between the various concerns.&lt;/p&gt;&lt;p&gt;But I was chatting with someone the other day about all of the frameworks for DI, and he expressed concern that he wasn't comfortable depending on a lot of external libraries for some things. His view (pun intended) was that you start to junk up a relatively simple framework like MVC by putting all kinds of other stuff into it to support another framework, and that introduces different kinds of risks. For example...&lt;/p&gt;&lt;ul&gt;&lt;li&gt;You're decorating everything with attributes.&lt;/li&gt;&lt;li&gt;There are all kinds of configuration files or classes to do the hookup.&lt;/li&gt;&lt;li&gt;You'll replace the standard controller factories, perhaps giving new devs one more thing to learn about for your project.&lt;/li&gt;&lt;li&gt;Global.asax becomes even more of a dumping ground (more because of the placement of routing there plus DI framework init).&lt;/li&gt;&lt;li&gt;It just feels dirty to some to be using another library you don't own.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I think these are all valid concerns, though the scope of them depends a lot on your specific scenario. The funny thing about using frameworks that are named after design patterns is that everything becomes an academic debate about where and how you do this and that. And if you're a junior developer wanting to impress your peers, or a senior developer not wanting to set a precedent for the "wrong" thing, you want to get it "right."&lt;/p&gt;&lt;p&gt;Many of the examples published on the Web and in books suggest simply using different constructors on MVC controllers to handle DI in a rational way that doesn't require an additional framework. That allows you to keep the default controller factory and let your unit tests instantiate them with your mock objects. I read a lengthy discussion forum thread that suggested this wasn't proper either because you aren't testing the way that the objects are created in the real production environment. I thought that was a pretty thin argument, but I do see the point.&lt;/p&gt;&lt;p&gt;I got to thinking about how the provider model introduced in ASP.NET 2.0 worked pretty well for a lot of things, and it was used effectively before that in wiring up swappable data access layers on various apps. Creating a lightweight container to do that wire-up would be pretty straight forward, even if it did reinvent some wheels.&lt;/p&gt;&lt;p&gt;I don't really have a point that I'm after here. I guess these are things I'd like to hear people talk more about. What are you doing in the real world to keep things testable and maintainable?&lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7208223" width="1" height="1"&gt;</content><author><name>Jeff</name><uri>http://weblogs.asp.net/members/Jeff.aspx</uri></author><category term=".NET" scheme="http://weblogs.asp.net/jeff/archive/tags/.NET/default.aspx" /><category term="unit testing" scheme="http://weblogs.asp.net/jeff/archive/tags/unit+testing/default.aspx" /><category term="General Software Development" scheme="http://weblogs.asp.net/jeff/archive/tags/General+Software+Development/default.aspx" /><category term="MVC" scheme="http://weblogs.asp.net/jeff/archive/tags/MVC/default.aspx" /></entry><entry><title>On constant connectivity and information overload in the online social age</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jeff/archive/2009/08/29/on-constant-connectivity-and-information-overload-in-the-online-social-age.aspx" /><id>http://weblogs.asp.net/jeff/archive/2009/08/29/on-constant-connectivity-and-information-overload-in-the-online-social-age.aspx</id><published>2009-08-29T16:21:00Z</published><updated>2009-08-29T16:21:00Z</updated><content type="html">&lt;p&gt;There was &lt;a href="http://www.visitmix.com/Opinions/Unplug-Unfollow-Drop-Out" target="_blank" mce_href="http://www.visitmix.com/Opinions/Unplug-Unfollow-Drop-Out"&gt;a solid post on the Mix blog&lt;/a&gt; about just letting go of all the stuff going on in the online social world and getting back to work. It's a subject that I've thought a great deal about lately for a lot of reasons. With a baby on the way, balancing life is important to me. I see friends who can't got five minutes without checking Twitter. Sometimes I worry about whether or not I'm learning the right things. The presence of information itself causes worry.&lt;/p&gt;&lt;p&gt;The thing that I keep coming back to is that there are a number of means to limit what you're exposed to, and they're not always electronic tools. Some people make it their job to find stuff and filter out the unimportant stuff (heck, I'm applying for just such a job). I find that in areas of expertise or interest, your overload is reduced when you find these human filters. The method of transmission is unimportant. I've been filtering out amusement industry news for almost ten years on &lt;a href="http://coasterbuzz.com/" target="_blank" mce_href="http://coasterbuzz.com/"&gt;CoasterBuzz&lt;/a&gt;, with a Web site. Remember Web sites? Pages, hypertext, pictures? It doesn't matter if it's a blog, Twitter, Facebook or a newsletter printed on dead trees. Fundamentally, there are still sources that act as information aggregators for things you care about. In the .NET world we have these folks, and they're authors, Microsofties, code project owners, etc.&lt;/p&gt;&lt;p&gt;The bottom line is that I don't think you need to be on 100% of the time trying to follow it all yourself. The trickle down filters work pretty well for most people.&lt;/p&gt;&lt;p&gt;If it's your job to have a higher awareness, then yes, engage at an appropriate level. But at the same time, make sure you're monitoring your peers, and if people report to you, listen to what they have to say. The tools and conduits are only a discovery mechanism, and most of them don't even offer a lot of depth or context. Engaging with people is still necessary.&lt;/p&gt;&lt;p&gt;Don't be lured into the real-time trap to the extent that you feel you have to see every last thing. If it's important, it'll keep coming up, and you'll see it tomorrow. The only exception I can think of is if you're a thought leader, but in those cases, shouldn't you be the originator of the important brain snacks in the first place? &lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7185162" width="1" height="1"&gt;</content><author><name>Jeff</name><uri>http://weblogs.asp.net/members/Jeff.aspx</uri></author><category term="General Software Development" scheme="http://weblogs.asp.net/jeff/archive/tags/General+Software+Development/default.aspx" /><category term="Community News" scheme="http://weblogs.asp.net/jeff/archive/tags/Community+News/default.aspx" /></entry><entry><title>Snow Leopard impressions</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jeff/archive/2009/08/29/snow-leopard-impressions.aspx" /><id>http://weblogs.asp.net/jeff/archive/2009/08/29/snow-leopard-impressions.aspx</id><published>2009-08-29T16:02:00Z</published><updated>2009-08-29T16:02:00Z</updated><content type="html">&lt;p&gt;I was one of the nerds that went to church, er, the Apple Store,
yesterday to pick up Snow Leopard, the OS X update. For $29, I think
it's a pretty reasonable upgrade price (are you listening, Windows 7
pricing people?), considering it's an evolutionary upgrade and not
feature heavy.&lt;/p&gt;&lt;p&gt;The first win was getting back 10 gigs of space
from my hard drive. I thought it was supposed to be only 7, but I'll
take what I can get. My Mac Pro's system drive is also where I put my
iTunes library, and it's getting crowded.&lt;/p&gt;&lt;p&gt;Booting and shut down
is faster, as they said it would be. Time Machine backups are crazy
fast now, where it used to be that the icon would swirl for ages
without anything new to even backup. Everything in Finder seems
snappier, though it's hard to quantify it. The slider in Finder windows
for icon size is a welcome addition. Spotlight seems faster. Stack
navigation out of the dock is far, far better now that it scrolls. &lt;br&gt;
&lt;/p&gt;&lt;p&gt;I wonder if they haven't tweaked memory management. Parallels
seems to be more responsive when I've also got Photoshop and/or
Aperture open. Perhaps it's the CPU core management. It's all that
under the hood stuff that's hard to measure.&lt;/p&gt;&lt;p&gt;Lots of little
tweaks that I've read about, but not encountered, are intriguing. That
it can figure out what time zone I'm in and adjust the clock is really
cool. Definitely a worthy and inexpensive upgrade. And did I mention
there are no install keys or other such nonsense?&lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7185146" width="1" height="1"&gt;</content><author><name>Jeff</name><uri>http://weblogs.asp.net/members/Jeff.aspx</uri></author><category term="Apple" scheme="http://weblogs.asp.net/jeff/archive/tags/Apple/default.aspx" /><category term="General Software Development" scheme="http://weblogs.asp.net/jeff/archive/tags/General+Software+Development/default.aspx" /></entry><entry><title>Twitter: I begrudgingly get it</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jeff/archive/2009/08/19/twitter-i-begrudgingly-get-it.aspx" /><id>http://weblogs.asp.net/jeff/archive/2009/08/19/twitter-i-begrudgingly-get-it.aspx</id><published>2009-08-19T18:16:00Z</published><updated>2009-08-19T18:16:00Z</updated><content type="html">&lt;p&gt;More than two years ago, I made a post on here about how I didn't get Twitter. It's one of the most popular posts I've ever made for some reason, which perhaps I'm not proud of. I been meaning to follow up on that for, well, at least a year, because obviously things have changed a great deal.&lt;/p&gt;&lt;p&gt;My view was skewed in some respects because I never looked at it much outside of the context of technology circles. In its earlier days, Twitter was dominated by attention whoring tech pundits, and that seemed boring to me. These days, it enjoys more widespread use, but there are still some critical points that measure how effective it is as a communications medium, and furthermore, it serves different people different ways.&lt;/p&gt;&lt;p&gt;That 80% of people never post anything and have few followers indicates to me that a lot of people are tending a flock, and that's OK. In reality, this is a lot like any other Internet media we have, whether it be blogs or Web sites as a whole. It's a minority that publishes content while the vast majority are consumers only. This has been true for a long time. In fact, the forums on my sites over the years have always been a 95% read-only affair. Many view, few post.&lt;/p&gt;&lt;p&gt;The development community has a much more robust two-way audience. Its effectiveness is rooted in using the right tools, like TweetDeck, to follow not individuals, but hash tags and search terms that matter to you. You get and give help pretty quickly. There's a lot of re-tweet noise, unfortunately.&lt;/p&gt;&lt;p&gt;The bigger story is that it has finally achieved a more critical mass, making it useful by volume. So these days, yes, I'll admit that Twitter is useful if you cast out the attention whoring. Yesterday, I got RT'd by &lt;a href="http://twitter.com/scottgu" target="_blank" mce_href="http://twitter.com/scottgu"&gt;@scottgu&lt;/a&gt;, and within an hour, added 15 new followers. Can't argue with that as a means to get your words out. (&lt;i&gt;Wonderfalls&lt;/i&gt; reference!) &lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7173977" width="1" height="1"&gt;</content><author><name>Jeff</name><uri>http://weblogs.asp.net/members/Jeff.aspx</uri></author><category term="culture" scheme="http://weblogs.asp.net/jeff/archive/tags/culture/default.aspx" /><category term="Internet" scheme="http://weblogs.asp.net/jeff/archive/tags/Internet/default.aspx" /><category term="Community News" scheme="http://weblogs.asp.net/jeff/archive/tags/Community+News/default.aspx" /></entry><entry><title>Under the covers of HTML helpers in ASP.NET MVC</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jeff/archive/2009/08/18/under-the-covers-of-html-helpers-in-asp-net-mvc.aspx" /><id>http://weblogs.asp.net/jeff/archive/2009/08/18/under-the-covers-of-html-helpers-in-asp-net-mvc.aspx</id><published>2009-08-18T18:14:00Z</published><updated>2009-08-18T18:14:00Z</updated><content type="html">&lt;p&gt;Coming from the Webforms world, the thing you might miss most when using ASP.NET MVC is the ability to create rich Web controls that generate all kinds of markup and do nifty things. HTML helpers do similar work, even if their plumbing is different, and because we can see the full source code of the MVC framework, we can explore their innards. Keep in mind that this isn't a straight analog, since there are no events to worry about. The helpers have one responsibility, and that's to display the right data as HTML. The truth is that you don't need to know any of this, as the existing helpers probably meet your needs 95% of the time. But in the event you want to build your own helpers for the purpose of encapsulating some kind of common, reusable markup (or keep your views cleaner), you'll benefit from understanding what goes on inside the black box.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;By the way, if you've never looked, I'd strongly encourage you to download and poke around the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b&amp;amp;displaylang=en" target="_blank" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b&amp;amp;displaylang=en"&gt;MVC source code&lt;/a&gt;. I know that you're probably expecting a big mess of overly abstract pieces that you can't follow, but it's one of the cleanest and easiest to understand projects I've ever seen. They did a really great job with this, and the whole thing weighs in at only 10,000 lines of code, and 500 of that is just resource stuff.&lt;/p&gt;

&lt;p&gt;HTML helpers generally do the dumb work of creating markup. They save you the hassle of making input tags or links or whatever. But the other thing they do, the magic, if you will, is process model state. &lt;code&gt;Controller&lt;/code&gt; has a property called &lt;code&gt;ModelState&lt;/code&gt;, which is an instance of the &lt;code&gt;ModelStateDictionary&lt;/code&gt; class. This is passed along to the view in a context object. Your views inherit from &lt;code&gt;ViewPage&lt;/code&gt;, which has an instance of &lt;code&gt;HtmlHelper&lt;/code&gt; (the &lt;code&gt;Html&lt;/code&gt; property). Got all that? I'm first trying to illustrate how data gets from the controller to the view, where the helpers do their thing. The controller is where you process input via model binding and validate, and this is what gets the model state involved. It's a different topic from what we're discussing here, but hopefully you've had exposure to it and understand the goodness that makes working with input and models so easy. (Read up on &lt;a href="http://www.asp.net/mvc/learn/" target="_blank" mce_href="http://www.asp.net/mvc/learn/"&gt;the tutorials on the official site&lt;/a&gt;, specifically the stuff about model binders and validation.)&lt;br&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;HtmlHelper&lt;/code&gt; class by itself doesn't do much to generate markup. It does have the anti-forgery token code in it, as well as some static methods to create route links (I'm not sure I understand the decision to put them there), but otherwise, the creation of markup lies in several other classes filled with extension methods to &lt;code&gt;HtmlHelper&lt;/code&gt;, found in the &lt;code&gt;System.Web.Mvc.Html&lt;/code&gt; namespace. They're grouped into classes for input, forms, links, selection controls, validation, etc. Since they're all extension methods, they have access to the data in the &lt;code&gt;HtmlHelper&lt;/code&gt; instance (the &lt;code&gt;Html&lt;/code&gt; property of the view), so that means they can work with the model state and virtually anything else available in the view. As extension methods, you can hopefully see that you can build your own to generate most any HTML you can think of.&lt;/p&gt;

&lt;p&gt;Let's start with the simplest example: text boxes. Found in the &lt;code&gt;InputExtensions&lt;/code&gt; class, there are several overloads:&lt;/p&gt;

&lt;code&gt;public static string TextBox(this HtmlHelper htmlHelper, string name) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return TextBox(htmlHelper, name, null /* value */);&lt;br&gt;}&lt;br&gt;&lt;br&gt;public static string TextBox(this HtmlHelper htmlHelper, string name, object value) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return TextBox(htmlHelper, name, value, (object)null /* htmlAttributes */);&lt;br&gt;}&lt;br&gt;&lt;br&gt;public static string TextBox(this HtmlHelper htmlHelper, string name, object value, object htmlAttributes) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return TextBox(htmlHelper, name, value, new RouteValueDictionary(htmlAttributes));&lt;br&gt;}&lt;br&gt;&lt;br&gt;public static string TextBox(this HtmlHelper htmlHelper, string name, object value, IDictionary&amp;lt;string, object&amp;gt; htmlAttributes) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return InputHelper(htmlHelper, InputType.Text, name, value, (value == null) /* useViewData */, false /* isChecked */, true /* setId */, true /* isExplicitValue */, htmlAttributes);&lt;br&gt;}&lt;/code&gt;

&lt;p&gt;The MVC team is obviously thinking of your well being in allowing you to provide as much, or little, as you need to make that text box. The real meat comes in the last overload, which calls another extension method in the class named &lt;code&gt;InputHelper&lt;/code&gt;. This is where we finally start to make some HTML.&lt;/p&gt;

&lt;p&gt;Before we get into that method, consider what the typical code looks
like in your view to make a text box. It may look something like this
in a strongly typed view that has a "Name" property on the Model:&lt;/p&gt;

&lt;code&gt;&amp;lt;%= Html.TextBox("Name", null, new { @class = "textField" })%&amp;gt;&lt;/code&gt;

&lt;p&gt;This says, "Create a text box on the 'Name' property, don't give it a
value, and while you're at it, add a class attribute with the value
'textField'." This corresponds to the third overload of the available
extension methods. In essence, we're calling:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;InputHelper(Html /* instance of HtmlHelper on the view */, InputType.Text, "Name", null, (null ==
null) /* useViewData */, false /* isChecked */, true /* setId */, true
/* isExplicitValue */, new { @class = "textField" });&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Pretty well-factored code! This works with the extension methods for check boxes, hidden
fields, passwords and radio buttons. Note the fifth parameter, the
Boolean useViewData parameter. What this says in English is, "If the
value given is null, then use the view data."&lt;/p&gt;

&lt;p&gt;Here's the &lt;code&gt;InputHelper&lt;/code&gt; code, with some of the non-relevant parts taken out for the purpose of this example.&lt;/p&gt;
&lt;code&gt;private static string InputHelper(this HtmlHelper htmlHelper, InputType inputType, string name, object value, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, IDictionary&amp;lt;string, object&amp;gt; htmlAttributes) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (String.IsNullOrEmpty(name)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ArgumentException(MvcResources.Common_NullOrEmpty, "name");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TagBuilder tagBuilder = new TagBuilder("input");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tagBuilder.MergeAttributes(htmlAttributes);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tagBuilder.MergeAttribute("type", HtmlHelper.GetInputTypeString(inputType));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tagBuilder.MergeAttribute("name", name, true);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string valueParameter = Convert.ToString(value, CultureInfo.CurrentCulture);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool usedModelState = false;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (inputType) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case InputType.CheckBox:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case InputType.Radio:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case InputType.Password:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string attemptedValue = (string)htmlHelper.GetModelStateValue(name, typeof(string));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(name) : valueParameter), isExplicitValue);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (setId) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tagBuilder.GenerateId(name);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // If there are any errors for a named field, we add the css attribute.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ModelState modelState;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (htmlHelper.ViewData.ModelState.TryGetValue(name, out modelState)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (modelState.Errors.Count &amp;gt; 0) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return tagBuilder.ToString(TagRenderMode.SelfClosing);&lt;br&gt;}&lt;/code&gt;
&lt;p&gt;Now we can dig in. To get things started, the method creates a &lt;code&gt;TagBuilder&lt;/code&gt; object, which is used across most (maybe all) of the helper extension methods. Check out the source if you get a chance. It encapsulates the process of creating the tag and its attributes, and does all of the boring string formatting work. It creates an ID, checks for duplicate attributes, sets the innards of a non-self-closing tag, etc. The one important thing to note is that it also concatenates CSS classes (important for the validation part, as we'll see in a minute).&lt;/p&gt;

&lt;p&gt;The switch block trickles down to the default, where it uses the &lt;code&gt;GetModelStateValue&lt;/code&gt; method of the &lt;code&gt;HtmlHelper&lt;/code&gt; to see if there is a value to drop into the text box. That method returns the value from the model if it's there and matches the type String (since we're using text here), otherwise it returns null. The next line calls up the &lt;code&gt;TagBuilder&lt;/code&gt; to add a value attribute to our tag. What it puts there depends on what's available. You may recall from the documentation or books that the first thing it tries to do is use the value stored in ViewData.ModelState, if that's available, and that's what the &lt;code&gt;EvalString&lt;/code&gt; method of &lt;code&gt;HtmlHelper&lt;/code&gt; does. If that's not available, it goes with the value we passed in from the markup in the view. Since we specified null, it won't show anything, even if there was no value in model state. Again, read up on how model state is used to work with validation to repopulate a view with the values entered before posting the form to the controller.&lt;/p&gt;&lt;p&gt;After creating an id attribute for the tag, the method finally gets to the validation piece. Recall that fields that don't validate have their helpers render the CSS class "input-validation-error" in addition to any style classes you've specified. That happens here by checking to see if there are any errors associated with the model state of this field.&lt;/p&gt;&lt;p&gt;Finally, the method uses &lt;code&gt;TagBuilder&lt;/code&gt; to build out the string of HTML to drop into the view. If you look around at the other helper methods, you'll find that they all work similarly to this.&lt;/p&gt;&lt;p&gt;To summarize, the helpers do this work:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Use &lt;code&gt;TagBuilder&lt;/code&gt; to create the HTML tag&lt;/li&gt;&lt;li&gt;Pass in the attributes&lt;/li&gt;&lt;li&gt;Figure out what the value of the HTML control will be&lt;/li&gt;&lt;li&gt;Give the tag an id&lt;/li&gt;&lt;li&gt;If there are validation errors, apply the predetermined CSS class in addition to others specified&lt;/li&gt;&lt;li&gt;Output the string of HTML into the view&lt;/li&gt;&lt;/ul&gt;As I said before, I think the code is surprisingly easy to follow, and once you understand what's going on under the covers, and how it interacts with model state, you're in a good position to start working your own helpers. &lt;br&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7172549" width="1" height="1"&gt;</content><author><name>Jeff</name><uri>http://weblogs.asp.net/members/Jeff.aspx</uri></author><category term=".NET" scheme="http://weblogs.asp.net/jeff/archive/tags/.NET/default.aspx" /><category term="General Software Development" scheme="http://weblogs.asp.net/jeff/archive/tags/General+Software+Development/default.aspx" /><category term="MVC" scheme="http://weblogs.asp.net/jeff/archive/tags/MVC/default.aspx" /></entry><entry><title>Windows 7 in Parallels on a Mac</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jeff/archive/2009/08/18/windows-7-in-parallels-on-a-mac.aspx" /><id>http://weblogs.asp.net/jeff/archive/2009/08/18/windows-7-in-parallels-on-a-mac.aspx</id><published>2009-08-18T16:56:00Z</published><updated>2009-08-18T16:56:00Z</updated><content type="html">&lt;p&gt;It's no secret that I'm all about Mac hardware and living in OS X when I'm not developing .NET stuff. It's also no secret that I thought Vista was too much of a dog to use, and have been sticking to Windows XP because of that. And in all fairness, I suppose some of that bias is rooted in the fact that Vista was a nightmare on my wife's old laptop, but I did experiment a little with it in a Parallels VM, and it just felt clunky. The outright bizarre dialogs with a chapter of text for everything also threw me for a loop.&lt;/p&gt;&lt;p&gt;People seemed pretty enthusiastic about Windows 7 though, so I thought I'd give it a go using Parallels 4, which lists 7 support as "experimental." Well, it's a pretty solid experiment so far!&lt;/p&gt;&lt;p&gt;Install went perfectly, and pretty quickly, without the silly self-serving ads describing how great Windows is. Once the install was done, the first win is the boot time, which is frankly awesome. This is after installing Visual Studio, SQL and such. Visual Studio seems to start faster as well, but I'm still convinced that this is caused by some kind of "cache rot" with ReSharper, since turning it off seems to yield faster start up times.&lt;/p&gt;&lt;p&gt;I prefer coherence mode in Parallels, since I typically run Adium, Firefox for e-mail and &lt;a href="http://coasterbuzz.com/Feed.aspx" target="_blank" mce_href="http://coasterbuzz.com/Feed.aspx"&gt;CoasterBuzz Feed&lt;/a&gt; in the background while working. It generally seems to work pretty well, and dock icons are much nicer than they were in XP when a high-res version is available. Trying to drag a window around at high speed is still not a pretty affair, but generally I don't do that in real life anyway. Drag-and-drop between an Explorer window and the OS X desktop works fine too.&lt;/p&gt;&lt;p&gt;So my early impression is that at the very least, it's a substantial improvement over Vista in terms of general perceived performance. I'll have to experiment some more and see how it affects battery life, which is something largely left to the folks at Parallels, I suspect. The question becomes, "What do I get that I don't get in XP?" I'm sure that's what IT departments everywhere also ask. I don't have a good answer for that other than I want the pretty, and I want to feel like everything is a bit zippier.&lt;/p&gt;&lt;p&gt;Poking around control panels and properties dialogs and such, it does appear that the Windows team has made great strides in getting away from the ridiculous verbosity of Vista, thank God. Stuff feels like it was built by user interface designers and not engineers who "know" what people want. I'm really happy to see this corner turned. &lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7172507" width="1" height="1"&gt;</content><author><name>Jeff</name><uri>http://weblogs.asp.net/members/Jeff.aspx</uri></author><category term="Apple" scheme="http://weblogs.asp.net/jeff/archive/tags/Apple/default.aspx" /><category term="General Software Development" scheme="http://weblogs.asp.net/jeff/archive/tags/General+Software+Development/default.aspx" /><category term="Community News" scheme="http://weblogs.asp.net/jeff/archive/tags/Community+News/default.aspx" /></entry><entry><title>Be more than a developer</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jeff/archive/2009/08/13/be-more-than-a-developer.aspx" /><id>http://weblogs.asp.net/jeff/archive/2009/08/13/be-more-than-a-developer.aspx</id><published>2009-08-13T18:26:00Z</published><updated>2009-08-13T18:26:00Z</updated><content type="html">
&lt;p&gt;I do love a spirited debate. It seems that everyone I've had a relationship with suggests that I should have been a litigator because I love to argue. And hey, if practicing law wasn't 95% research and 5% arguing, I'd be all over that.&lt;/p&gt;
&lt;p&gt;That said, I think it's important to have a general awareness of the world, especially in business. A lot of techies and developers don't seem interested in that, unfortunately. Take this recent random Twitter exchange:&lt;/p&gt;
&lt;blockquote&gt;someguy: Why is #Zune website www.zune.net made in flash and not silverlight?...&lt;br&gt;@jeffputz: Why do people ask this question over and over? Because for a marketing site to move product you use what's most installed.&lt;br&gt;someguy: well then they could have it done in both SL as well as Flash.. atleast show it to the people who have it installd...&lt;br&gt;@jeffputz: For what purpose? How does that sell more Zunes?&lt;br&gt;someguy: true but atleast those blogs criticizing MS for it, wouldnt be written :-) ... it shouldnt always be ONLY marketing..&lt;br&gt;&lt;/blockquote&gt;
&lt;p&gt;I probably wasn't being very diplomatic in this case, but my intention was to challenge him on the reasoning for making his initial statement. In this case, perhaps he was baiting some goofy point like, "Well if Microsoft doesn't use Silverlight themselves, then what does that say about it?" Great scandal? No, I think they just want to sell more Zunes, and that has nothing to do with platform religion or their belief in the product.&lt;/p&gt;&lt;p&gt;Every time I've hired consultants for project work, regardless of how trivial or complex, I've made it a point to try and get in their head to see if they understand just the fundamentals of business, and if they can work and design software with business goals in mind. I can teach someone how to use dependency injection or the control lifecycle, but I strongly believe that greater awareness about the business is a lot harder to instill in someone.&lt;/p&gt;&lt;p&gt;I freely admit that I'm a gear head (or is it bit head?) and love to mess with stuff. But I also believe that it's critical in your every day work to ask yourself if what you're doing adds value. It's OK to not be sure about the value in cases where you're taking a risk. I'm not suggesting you have to buckle down and not try new things, but if you want to rewrite some component just because, ask yourself if there's some return you'll get for that action, and if not, I'd do something else.&lt;/p&gt;&lt;p&gt;The best developers have a keen awareness of the bigger picture across other disciplines. You can be more than just a heads-down code monkey. &lt;br&gt;&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7168580" width="1" height="1"&gt;</content><author><name>Jeff</name><uri>http://weblogs.asp.net/members/Jeff.aspx</uri></author><category term="culture" scheme="http://weblogs.asp.net/jeff/archive/tags/culture/default.aspx" /><category term="General Software Development" scheme="http://weblogs.asp.net/jeff/archive/tags/General+Software+Development/default.aspx" /></entry><entry><title>Silverlight vs. Flash and other pundit fodder</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jeff/archive/2009/08/12/silverlight-vs-flash-and-other-pundit-fodder.aspx" /><id>http://weblogs.asp.net/jeff/archive/2009/08/12/silverlight-vs-flash-and-other-pundit-fodder.aspx</id><published>2009-08-12T17:23:00Z</published><updated>2009-08-12T17:23:00Z</updated><content type="html">&lt;p&gt;Yet &lt;a href="http://www.bitsandbuzz.com/article/silverlight-good-for-adobe-bad-for-microsoft/" target="_blank" mce_href="http://www.bitsandbuzz.com/article/silverlight-good-for-adobe-bad-for-microsoft/"&gt;another blog post&lt;/a&gt;
has hit the airwaves and become all atwitter about Flash and
Silverlight, the competition, Adobe vs. Silverlight, etc. While this
makes for interesting pundit fodder, I just think that the people
observing the situation don't really, well, &lt;i&gt;get&lt;/i&gt; the situation.&lt;/p&gt;&lt;p&gt;Earlier
this year, just after Mix in Las Vegas, I was asked by a client about
what Silverlight is, because he read about how it was supposed to be
"Microsoft's Flash killer." If I had a dime for every headline like
that, right? I told him that there were different perspectives on what
its role was, but killer wasn't one of them in my mind. I believe the
root of the difference truly comes from the history behind Silverlight
and Flash.&lt;/p&gt;&lt;p&gt;Flash began its life as a way to make stuff dance on a
Web page. Let's not kid ourselves, it was a cosmetic thing. Over time,
it introduced more UI elements and a scripting language to make it more
than just a timeline of moving objects. Silverlight, by comparison, set
out to be a great many things, rooted in its big brother, WPF, a UI
technology intended to (in my view) kill the awful Windows Forms.
Remember that Silverlight was once called "WPF/E" for "WPF Everywhere."
I think these two technologies started from two different angles, and
today can do many of the same things. Yet their origins still largely
dictate their dominant use.&lt;br&gt;
&lt;/p&gt;&lt;p&gt;Initially, I felt that Silverlight's greatest strength was the
ability to build line-of-business apps that didn't suck, and deployment
was a snap. If you've ever worked in a corporate environment where
dozens of barely maintained Windows Forms apps get passed around on
network shares or installed by phantom IT forces, then you know what
I'm talking about. Learn a few important concepts about
WPF/Silverlight, and you're well on your way to leveraging hoards of
.NET code monkeys to make good stuff. This is hardly the goal of Flash.&lt;/p&gt;&lt;p&gt;When
you really let go of the punditry, link baiting and scandalous
headlines, and God forbid put on your business hat, you see that in the
current universe, Flash and Silverlight seem intended for two different
things. I'd never put Silverlight on the front page of a marketing site
because the penetration rate. But on the other hand, you bet I'm using
it today to handle file uploading deeper in a site. Then I added a
simple out-of-browser app for my most passionate audience, and guess
what my Silverlight 3 penetration rate is now? 20%! Add another 20% for
version 2.&lt;/p&gt;&lt;p&gt;With the forthcoming Winter Olympics being broadcast
via Silverlight, I suspect we'll see another bump in penetration. But
all of the predictions about a winner are silly. Advertising will be
Flash for a very long time to come. Silverlight will be the dominant
line-of-business platform on corporate networks as soon as skillsets
align with it. I'll push my audiences on public sites toward it because
they're passionate enough to want the content it brings.&lt;/p&gt;&lt;p&gt;So what
has Microsoft truly accomplished? They put browser-based rich UI (and
dare I say, animation) in the hands of a bazillion .NET developers,
using tools they already know. My prediction is not that there are clear winners here, but a long-term coexistence.
The versus debate causes a needless holy war that non-technical
management types will read and want a VHS vs. Betamax prediction
instead of leaning toward the right tools for the job.&lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7167546" width="1" height="1"&gt;</content><author><name>Jeff</name><uri>http://weblogs.asp.net/members/Jeff.aspx</uri></author><category term="Microsoft" scheme="http://weblogs.asp.net/jeff/archive/tags/Microsoft/default.aspx" /><category term="General Software Development" scheme="http://weblogs.asp.net/jeff/archive/tags/General+Software+Development/default.aspx" /><category term="Community News" scheme="http://weblogs.asp.net/jeff/archive/tags/Community+News/default.aspx" /><category term="Silverlight" scheme="http://weblogs.asp.net/jeff/archive/tags/Silverlight/default.aspx" /></entry></feed>