<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-8339867949129086615</atom:id><lastBuildDate>Thu, 18 Feb 2010 02:37:25 +0000</lastBuildDate><title>Winging It</title><description>Here's what I got...</description><link>http://blog.timwingfield.com/</link><managingEditor>noreply@blogger.com (Tim)</managingEditor><generator>Blogger</generator><openSearch:totalResults>78</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-2677044064943357870</guid><pubDate>Thu, 18 Feb 2010 02:22:00 +0000</pubDate><atom:updated>2010-02-17T21:30:12.114-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>kanaban</category><category domain='http://www.blogger.com/atom/ns#'>development conference</category><category domain='http://www.blogger.com/atom/ns#'>lean software</category><category domain='http://www.blogger.com/atom/ns#'>development practices</category><title>Speaking at Lean Software and Systems Conference</title><description>&lt;a href="http://lh6.ggpht.com/_5SnOEGqkJYw/S3ymMBm9S8I/AAAAAAAACEE/v4kCEwUQuw8/s1600-h/Atlanta2010Speaker%5B1%5D%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Atlanta2010Speaker[1]" border="0" alt="Atlanta2010Speaker[1]" align="right" src="http://lh5.ggpht.com/_5SnOEGqkJYw/S3ymM4FlIfI/AAAAAAAACEI/ZPhCTlDShUQ/Atlanta2010Speaker%5B1%5D_thumb%5B1%5D.png?imgmax=800" width="154" height="188" /&gt;&lt;/a&gt;  &lt;p&gt;I am more than honored to have been selected to speak at the &lt;a href="http://atlanta2010.leanssc.org/"&gt;Lean Software and Systems Conference&lt;/a&gt; in Atlanta in April. I’ll be presenting an &lt;a href="http://atlanta2010.leanssc.org/2010/02/tim-wingfield-lean-lessons-learned-our-experiences-moving-to-kanban/"&gt;experience report&lt;/a&gt; on my projects using Kanban over the last year and a half.&lt;/p&gt;  &lt;p&gt;The presentation will obviously focus on my experiences, so very little theory or how-to about Kanban here. Given the subject of the conference in general, there probably isn’t a big need for a how-to on Lean software, anyway. So I’ll share successes and failures, and the collaboration with other members of the team to improve the process for different projects. &lt;/p&gt;  &lt;p&gt;If you’re in the greater Atlanta area April 21-23, try to get to this conference. Many of the innovators in Lean Software will be speaking and there will be a significant number of people applying this in the real world. I’m almost as excited to be attending it as I am to be speaking at it!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-2677044064943357870?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2010/02/speaking-at-lean-software-and-systems.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-7238686258532153397</guid><pubDate>Tue, 12 Jan 2010 13:30:00 +0000</pubDate><atom:updated>2010-01-12T08:30:00.581-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>career</category><title>Setting Job Change Goals</title><description>&lt;p&gt;Having just gone through a job change, I thought about sharing one of the bigger aspects of my job search process. When this process started for me – and don’t be fooled, it is a whole process and not one taken lightly – I set four base goals that my new (or current) employer had to meet. &lt;/p&gt;  &lt;p&gt;I was given this idea while listening to &lt;a href="http://www.rolemodelsoft.com/people/ken_auer"&gt;Ken Auer&lt;/a&gt; speak at SCNA this summer. Ken was telling of when he decided to start his own company and one of his mentors said, “Set four goals for yourself, and only one of them can be monetary.” That hit home with me at the time: only one can be monetary. It was simple, and in regards to your career plainly obvious, but actually hearing it made it hit much harder.&lt;/p&gt;  &lt;h4&gt;1. Can I effect change?&lt;/h4&gt;  &lt;p&gt;I’ve spent the last 5+ years living agile development and working with XP development practices. I’ve been involved with Book Clubs and started &lt;a href="http://www.codeandcoffee.info/"&gt;Code and Coffee&lt;/a&gt;. I’ve picked up four different build servers, enjoyed development in ASP.Net MVC, and done a cannonball into the Rails pool. Can I take all this knowledge and use it for good instead of evil? Can I get a new organization on a path of continuous improvement?&lt;/p&gt;  &lt;h4&gt;2. Will I get to continue to push Agile/Lean and work with good technology?&lt;/h4&gt;  &lt;p&gt;I’ve put a lot of time into Lean and Kanban over the last year and a half. Both learning it, molding the process on various projects, then speaking about it to about anybody who’d listen. I want to keep on that course, because I think I’ve only started to scratch the surface of what Lean can bring to an organization.&lt;/p&gt;  &lt;p&gt;Additionally, will I continue to get to work with cool technology, or better, be involved in the decision making process on what technology we’ll use? The phrase, “Right tool, right job,” means a lot to me.&lt;/p&gt;  &lt;h4&gt;3. Cool people to work with.&lt;/h4&gt;  &lt;p&gt;I don’t want to be a one man dev team as the member of a one person dev team is never wrong. I want to be around people that I can continue to learn from, that will push me as much as I can (hopefully) push them. And, I want to have fun. It seems simple, but for many years of my IT career it hasn’t felt like work because it’s fun doing the job I do. A lot of that has to do with the people I’ve worked with in the past.&lt;/p&gt;  &lt;h4&gt;4. $$…can I get what I’m worth?&lt;/h4&gt;  &lt;p&gt;One of the four has to be about money – I don’t do this for free, after all. &lt;/p&gt;  &lt;p&gt;Market value was one of the toughest things to determine. Different people value different skills at different levels. If you’re in the consulting game, you have to have a salary that your bill rate will support. And the downward pressure on bill rates the last year is no great secret.&lt;/p&gt;  &lt;h4&gt;The unspoken goal – family time.&lt;/h4&gt;  &lt;p&gt;This is one I never put on paper because it’s the first thing that concerns me while thinking about anything with my job and my career. I’ve been extremely lucky to have a wife and two boys who have supported me as I started speaking and being gone more weekends with code camps, give camps, and conferences. So, the length of the commute to any office becomes a big deal. In an interview don’t hit me with, “We have a mandatory 45 hour work week,” because you’re taking almost another day per month of my time away from my family.&lt;/p&gt;  &lt;p&gt;If you’re in a position where you’re starting to poke around to see what might be next for you, take the time and spell out what you want. Talk it over with your significant other, with some close friends, and forge ahead. Writing it down makes you stop and think about where you really want to go. &lt;/p&gt;  &lt;p&gt;At least it did for me.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-7238686258532153397?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2010/01/setting-job-change-goals.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-1890230607293301892</guid><pubDate>Thu, 07 Jan 2010 13:30:00 +0000</pubDate><atom:updated>2010-01-07T08:30:01.349-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Reflex Design and Technology</category><category domain='http://www.blogger.com/atom/ns#'>Quick Solutions</category><category domain='http://www.blogger.com/atom/ns#'>career</category><title>Career.Next</title><description>&lt;p&gt;When you start a new job, that first day is one of the most exciting you have while you’re there. You’re busy getting settled in, meeting new people, learning new ways of doing things, and eventually fitting in and finding your place. For me, that day was June 21st, 2004 and the new company was Quick Solutions Inc. &lt;/p&gt;  &lt;p&gt;However, on that first day, you don’t start thinking about when the last day will be. But with most careers that last day on a job is out there somewhere. Eventually your career leads you on to something new, something more challenging, maybe something you never expected back on that first day. That’s exactly what has happened with me, and that last day at QSI that I never really expected will be January 8th, 2010.&lt;/p&gt;  &lt;p&gt;To say I appreciate the opportunities granted me while I was at Quick would be a rather large understatement. I’m still in awe of some of the people I worked with over the years at QSI. Most everybody assembled in our app dev group was extremely talented and extremely passionate about technology, continuous improvement, and sharing what they knew. It was exciting to go to work most days because of who was going to be sitting at the desk next to you.&lt;/p&gt;  &lt;p&gt;So what is next? I’m off to &lt;a href="http://www.reflexdt.com/work.aspx"&gt;Reflex Design &amp;amp; Technology&lt;/a&gt; to help them build a development team. Actually, on day 1 I’ll &lt;strong&gt;BE&lt;/strong&gt; the dev team - Lord help them. I’m more than a little excited to be stepping into this role with them. (Yes, if you’re doing the date math in your head, I’ll be at Reflex for two days then I head for &lt;a href="http://codemash.org/"&gt;Codemash&lt;/a&gt;.) &lt;/p&gt;  &lt;p&gt;Again, many thanks to the folks I worked with at QSI. There’s no way I’d be ready to step into the role I’m taking without all that I’ve learned from &lt;em&gt;all of you&lt;/em&gt; over the last five plus years.&lt;/p&gt;  &lt;p&gt;I’m sure at this point many of you are asking, “Why did he leave?” That’s not easy to answer. It’s a very long and complex process I went through to arrive at this decision. But, I managed to sum it up in just two words…&lt;/p&gt;  &lt;p&gt;Lotus Notes&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-1890230607293301892?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2010/01/careernext.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>17</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-146052476468146335</guid><pubDate>Sun, 03 Jan 2010 19:00:00 +0000</pubDate><atom:updated>2010-01-03T14:00:01.376-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>development</category><category domain='http://www.blogger.com/atom/ns#'>Mac</category><category domain='http://www.blogger.com/atom/ns#'>Ruby</category><category domain='http://www.blogger.com/atom/ns#'>Rails</category><title>Five Days with My MacBook Pro</title><description>&lt;p&gt;With a few changes headed my way in the coming new year, it was once again time to get some new hardware. I took the leap and opted for a MacBook Pro. (2.66GHz/4GB/320GB/15” so not the biggest, &lt;a href="http://lh5.ggpht.com/_5SnOEGqkJYw/S0DmoDoABjI/AAAAAAAACD8/GjlpjC4Xsmo/s1600-h/mac_vs_pc_2%5B11%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="mac_vs_pc_2" border="0" alt="mac_vs_pc_2" align="right" src="http://lh6.ggpht.com/_5SnOEGqkJYw/S0Dmo_Xmd7I/AAAAAAAACEA/kvkPr2XcY54/mac_vs_pc_2_thumb%5B9%5D.png?imgmax=800" width="220" height="246" /&gt;&lt;/a&gt;baddest one.) Here are a few of my initial leaving-Windows-and-Dell thoughts. &lt;/p&gt;  &lt;p&gt;I can say after five days that I’m pretty sure I made the right move. There are a few things I’m struggling with in the switch, mainly my fingers going to the correct keys. Years of hitting CTRL on a windows keyboard has me hitting the fn key on the MBP, which doesn’t do much. Getting used to the Command key will take some time, but the oddest keyboard issue I’m having is hitting the B key. The reach is apparently shorter because I’ve put a lot of spaces where there should be a B.&lt;/p&gt;  &lt;p&gt;On the flip side, it didn’t take me very long to get used to the multi-touch functions on the track pad. Having an iPhone doesn’t hurt, but the two, three, and four finger operations didn’t take long to become comfortable with. Scrolling through blog readers, articles, and Tweetdeck is a lot easier.&lt;/p&gt;  &lt;p&gt;Installing applications is a lot easier, and a lot quicker than on Windows. To be fair, I haven’t installed a lot of huge apps, but the fairly large ones I did install went really quickly. The only real side-by-side comparison of installation I have is Tweetdeck, and it was a fraction of the time getting it up and running on the Mac. Most apps are just download, mount the image, drag to applications, unmount the image, and run it.&lt;/p&gt;  &lt;p&gt;Now on to one of the bigger reasons I was after a Mac: Ruby on Rails development.&lt;/p&gt;  &lt;p&gt;Rails on Windows was painfully slow at times. I tried all kinds of stuff to get my specs to run in less time than it took me to go downstairs and brew a cup of coffee. After copying the git repo of one of my sample apps over, I ran the specs and it reported .7-ish seconds. And it actually WAS .7-ish seconds. Not the 45 seconds of dead time at the command prompt while it fired up servers and stuff then reporting .7-ish seconds when it was done with the tests that I was used to. I’m already looking forward to doing some more of this.&lt;/p&gt;  &lt;p&gt;Before I start sounding like a total fan boy, it hasn’t all been awesome. There was a 2 hour fight with an iso and some printer drivers to try and get my printer at home to work. Still haven’t got it to work, so I gave up and grabbed Brendan’s netbook to print off what I needed. &lt;/p&gt;  &lt;p&gt;I’m also not enthralled with only having 1440 x 900 resolution. But, I’m getting old and my eyes would get tired staring at the hi-res Dell I had before, so maybe I should not worry about this one too much.&lt;/p&gt;  &lt;p&gt;Also, couldn’t find any decent blog writer that lived up to Windows Live Writer, so this is being written in Live Writer in my Windows VM. (Bootcamp + VMWare Fusion + Win7 is freaking awesome. Looking forward to some .Net dev when I get Studio installed.)&lt;/p&gt;  &lt;p&gt;Suffice it to say, the positives out weigh the negatives so far. I’m sandals-to-work away from swallowing the blue pill with the Apple logo on the side of it. :)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-146052476468146335?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2010/01/five-days-with-my-macbook-pro.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-3809562978726304734</guid><pubDate>Wed, 23 Dec 2009 02:30:00 +0000</pubDate><atom:updated>2009-12-22T21:35:18.516-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>kanaban</category><category domain='http://www.blogger.com/atom/ns#'>development</category><title>Beware Your Buffering</title><description>&lt;p&gt;In a twitter discussion that was centering around some Kanban joy, the point of buffering came up. I offered &lt;a href="http://twitter.com/timwingfield/status/6944584935" target="_blank"&gt;a bit of twitter-esque advice&lt;/a&gt;, meaning it was short, could be interpreted as terse, and lacked the detail it needed. As any good friend would do, &lt;a href="http://twitter.com/jimholmes" target="_blank"&gt;Jim&lt;/a&gt; &lt;a href="http://twitter.com/JimHolmes/status/6944906114" target="_blank"&gt;called me out&lt;/a&gt; for my 140 character bit of guidance.&lt;/p&gt;  &lt;p&gt;So, in more than 140 characters…&lt;/p&gt;  &lt;p&gt;Be careful with your queues on your Kanban board. (I say queue here, because a buffer is just the queue for the next step.) By definition, any queue is waste. It’s a step in the process where something is waiting, therefore value isn’t being provided to your customer.&lt;/p&gt;  &lt;p&gt;Can queues be used effectively? Yes. Quite effectively, but you have to stay on top of them. In reality, there has to be some queuing going on to give a pull system something to pull. In practice, those queues need to be as small as you can keep them to keep things flowing.&lt;/p&gt;  &lt;p&gt;My tweet that started this mess was that I’d been burned by buffers on more than one occasion. Here’s one nasty one where the queue wasn’t a help, it was hiding the real problem.&lt;/p&gt;  &lt;p&gt;We had a project where our developers far outnumbered our testers. This isn’t an unheard of scenario in the world of software development, but we handled it badly on our Kanban board. We ended up with not one, but two buffers between the dev team and the QA folks. The true, root cause problem was we had a resource problem because we needed more testers. Instead, we masked it with some queuing.&lt;/p&gt;  &lt;p&gt;The biggest problem was that we lost our short feedback loop from development to demo. Early in the process, we’d complete a feature and it would demo within a day or two. As the project progressed and the developers’ momentum took off, the testing team was backed up and the feedback loop grew. Bugs were sitting open longer, code complete features waited to be tested, and the churn began.&lt;/p&gt;  &lt;p&gt;Our solution was to swarm the test queue to get it lowered. Having a dev or two help get some testing done got our backed up test queue fixed, but it put devs in a testing role which I’m not a big fan of doing. (Devs are notorious for making sure something works rather than looking for ways something could break.) Also, this solution was very temporary as the queue naturally filled back up once the dev team was back in high gear. The actual solution: add a testing resource. Our full queues told us that, but we didn’t listen too closely for a while.&lt;/p&gt;  &lt;p&gt;In the end, some buffers and queues are inevitable in many situations. However, make sure to do the following:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Make them as small as you can, maybe half the size of the queue limit of the step that the buffer is feeding. Adjust as necessary, but don’t keep increasing it as it fills up. &lt;/li&gt;    &lt;li&gt;If you need to increase its size, ask why a couple times to clear it up. If the answer is, “Because we need more room!” then look at the next step and see why it’s backing up your process. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;So, back to what started all this…buffers can bite you in the butt as they tend to mask the issue rather than solving it. Make sure your buffers aren’t hiding a bigger problem.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-3809562978726304734?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/12/beware-your-buffering.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-2595051597532186006</guid><pubDate>Thu, 10 Dec 2009 13:30:00 +0000</pubDate><atom:updated>2009-12-10T08:30:00.732-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>development</category><category domain='http://www.blogger.com/atom/ns#'>Ruby</category><category domain='http://www.blogger.com/atom/ns#'>Rails</category><title>Rails Study Apps</title><description>&lt;p&gt;I’m trying to pick up some rails in my spare time. Been plugging away at my pet project when I can, which leads to a lot of googling while I do it. If one of my known Rubyist friends is at a &lt;a href="http://www.codeandcoffee.info" target="_blank"&gt;Code and Coffee&lt;/a&gt; session, I spend a fair amount of time picking their brains and pairing up to learn what I can in an hour or so.&lt;/p&gt;  &lt;p&gt;That all works pretty well, but at my pace I’ll be forever getting my Ruby code to look less like C# and more like Ruby. So, as &lt;a href="http://stevenharman.net/blog/archive/2009/11/18/reading-code-is-key-to-writing-good-code.aspx" target="_blank"&gt;Steve blogged recently&lt;/a&gt;, why not find a few Rails apps to read? So, I hit up my twitter friends: &lt;a href="http://twitter.com/timwingfield/status/6464205602"&gt;http://twitter.com/timwingfield/status/6464205602&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I got three pretty good responses, and finally got time tonight to pull them down and take a quick look at them. I don’t have a lot of info on any of them, but I did browse the source to get a feel for what was going on.&lt;/p&gt;  &lt;h4&gt;Radiant CMS&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://github.com/radiant/radiant"&gt;http://github.com/radiant/radiant&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This one was recommended by &lt;a href="http://twitter.com/dugaldwilson" target="_blank"&gt;Dugald Wilson&lt;/a&gt;. Decent amount of code here to look at, and uses RSpec for the test framework. This one definitely fit the bill for what I was after.&lt;/p&gt;  &lt;h4&gt;Spot.us&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://github.com/spot-us/spot-us"&gt;http://github.com/spot-us/spot-us&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I got this one as a tag team recommendation from &lt;a href="http://twitter.com/pragma_tech" target="_blank"&gt;Scott Walker&lt;/a&gt; and &lt;a href="http://twitter.com/mattdarby" target="_blank"&gt;Matt Darby&lt;/a&gt;. This is a non-profit company doing Community Funded Reporting and is coming from the folks at &lt;a href="http://www.hashrocket.com/" target="_blank"&gt;Hashrocket&lt;/a&gt;. More RSpec out of this project, and again a fair amount of code to pour over.&lt;/p&gt;  &lt;h4&gt;Redmine&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://github.com/edavis10/redmine"&gt;http://github.com/edavis10/redmine&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The third one came through &lt;a href="http://twitter.com/jamin4jc" target="_blank"&gt;Ben Wagaman&lt;/a&gt;. This one uses TestUnit instead of RSpec, but still some decent reading. I’m going to have to dig into the tests a bit more on this one, though, because the file names aren’t jumping out at me as model/controller/etc type tests. But, that’s the point of this exercise, to see what other folks are doing.&lt;/p&gt;  &lt;p&gt;I’ve got a little flying and a lot of driving ahead of me this weekend, hopefully I get some time to dive deeper into what each of these apps is up to, and get some more Rails code under my belt. &lt;/p&gt;  &lt;p&gt;If you’ve come across a few more open source Rails apps out there, please drop a link in the comments.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-2595051597532186006?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/12/rails-study-apps.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-1935342501445145811</guid><pubDate>Sat, 14 Nov 2009 17:47:00 +0000</pubDate><atom:updated>2009-11-14T12:47:16.544-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>web development</category><category domain='http://www.blogger.com/atom/ns#'>development</category><category domain='http://www.blogger.com/atom/ns#'>ASP.Net MVC</category><title>ASP.Net MVC: A Step in the Right Direction</title><description>&lt;p&gt;A link to Doug Copestake’s article &lt;a href="http://www.thecurlybracket.com/?p=164" target="_blank"&gt;“ASP.Net MVP: A Step Backwards?”&lt;/a&gt; was forwarded to me, and it made some short rounds on twitter. I read it and had a comment underway and thought, “This is WAY to big for a comment, let’s blog it!” So here we are.&lt;/p&gt;  &lt;p&gt;Off the top, I’d like to give a tip of the hat to Doug for stepping outside his day to day and taking a look at ASP.Net MVC. It’s very easy to hide behind FUD and just blow off something different. Additionally, his initial findings are pretty much on par with most other folks happy with WebForms who take their first look at MVC.&lt;/p&gt;  &lt;p&gt;The MVC framework definitely provides simplicity and separation of concerns to web development. It allows you to only write the code you need to write to get the job done, and it allows you to work with the framework. Views become very small and very specialized, controller actions mature to be very thin, and it’s all easily testable. &lt;/p&gt;  &lt;p&gt;This has made my work with the MVC framework extremely successful. Since everything is easily testable, as we refactor the code to clean it up or add new functionality, it all flows very easily.&lt;/p&gt;  &lt;p&gt;Control reuse comes from veteran WebForms developers quite often. But if we again point at simplicity, how many of those drag and drop controls were written to cover more functionality than you need? You drag a grid control out and use 15% of it’s power because its made for everyone. Yes, you can write your own application controls to do exactly what you want, but you can do that in MVC, too. &lt;/p&gt;  &lt;p&gt;Another point to control reuse is the leveraging of more javascript frameworks to do many of the things that the WebForm control suites do. In jQuery UI alone, you’ll get tabs, accordion panels, sliders and other UI elements, all with out that “server side” part that is so prevalent in WebForms. The win there is in more than just lighter weight controls, you gain a much better user experience. (And who doesn’t like happy users?)&lt;/p&gt;  &lt;p&gt;The spaghetti code point Doug makes is quite valid, though I think that’s not a factor of one framework or the other as much as it is the person writing the code. The &lt;a href="http://www.vanderburg.org/Blog" target="_blank"&gt;Glen Vanderburg&lt;/a&gt; quote, “A bad developer will move heaven and Earth to do the wrong thing,” applies to all languages and frameworks. The person with the keyboard under their fingers is responsible for keeping their code clean, not the framework developers, but I digress.&lt;/p&gt;  &lt;p&gt;Spaghetti code in the views is a big sign that you’ve done something wrong. Even before moving to &lt;a href="http://www.sparkviewengine.com/" target="_blank"&gt;Spark&lt;/a&gt;, if you see lots of server instructions in your views, it’s time to stop and think, “What can I do differently here?” Same can be said of your controllers. If you’re used to writing a 50 line page load method in WebForms, turning similar code into 50 line controller actions is a step in the wrong direction. I guess the main point here is instead of relying/hoping for the framework to do the work for you, the onus is now squarely on the shoulders of the developer to keep his or her code concise.&lt;/p&gt;  &lt;p&gt;Doug’s last point is very true, though: if you have a lot invested in WebForms in your current situation, there’s no real reason to switch away from it. Switching for the sake of switching to anything usually isn’t a good move. &lt;/p&gt;  &lt;p&gt;That said, you can easily run WebForms and MVC in the same web application. If you have a little something to add to the project that can stand on its own, I’d say a look at MVC is in order.&lt;/p&gt;  &lt;p&gt;This definitely would have been too long of a comment… :)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-1935342501445145811?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/11/aspnet-mvc-step-in-right-direction.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-8987581085297703649</guid><pubDate>Wed, 21 Oct 2009 13:15:00 +0000</pubDate><atom:updated>2009-10-21T09:15:00.206-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>MVC</category><category domain='http://www.blogger.com/atom/ns#'>development</category><category domain='http://www.blogger.com/atom/ns#'>development practices</category><category domain='http://www.blogger.com/atom/ns#'>ASP.Net MVC</category><title>ASP.Net MVC v. WebForms</title><description>&lt;p&gt;This question seems to come up a lot in discussions around these two ASP.Net frameworks. Just this past weekend in Cincy at the MVC Firestarter, it came up a number of times.&lt;/p&gt;  &lt;p&gt;So, on the way to work this morning, I was listening to &lt;a href="http://www.hanselminutes.com/default.aspx?showID=202" target="_blank"&gt;Hanselminutes 184&lt;/a&gt;, and the question was FINALLY given an answer by Scott Hunter.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;If you care about separation of concerns, testability and tight control of your markup you should go with MVC. If you’re an enterprise developer and just want to get something out there quickly then use WebForms.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;That’s paraphrased, I may have gotten the MVC reasons in a different order, but that was the point made.&lt;/p&gt;  &lt;p&gt;Scary that “Just get it done,” is the main reason to use WebForms. I’ll stick with my “slow” TDD and long term maintainability in MVC and steer clear of WebForms where DDD apparently stands for Drag, Drop, Deploy.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-8987581085297703649?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/10/aspnet-mvc-v-webforms.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-3153319319405936396</guid><pubDate>Mon, 31 Aug 2009 12:00:00 +0000</pubDate><atom:updated>2009-08-31T08:00:04.786-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>MVC</category><category domain='http://www.blogger.com/atom/ns#'>Ruby</category><category domain='http://www.blogger.com/atom/ns#'>Rails</category><category domain='http://www.blogger.com/atom/ns#'>ASP.Net MVC</category><title>I forgot what the M in MVC was for</title><description>&lt;p&gt;What brought me to this conclusion was my reading up on a little Rails. I finally took the dive. I’ve been avoiding Rails for a while in favor of just learning Ruby. &lt;a href="http://twitter.com/stevehorn"&gt;Steve&lt;/a&gt; loaned me &lt;a href="http://www.pragprog.com/titles/cerailn/rails-for-net-developers"&gt;“Rails for .Net Developers,”&lt;/a&gt; and the research was underway in earnest.&lt;/p&gt;  &lt;p&gt;On page 89, the light bulb went off. But not for Rails so much as for how I’m writing my ASP.Net MVC apps. Here’s the bit that got me:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;• Models are the classes that represent your business domain and that are responsible for communicating with your data. In Rails, this means the tables in your database.      &lt;br /&gt;• Views represent your presentation layer, for example, HTML and JavaScript.       &lt;br /&gt;• Controllers are responsible for connecting the models and views and managing the flow of the application. &lt;a href="http://twitter.com/timwingfield/status/3646635793" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="doing_it_wrong" border="0" alt="doing_it_wrong" align="right" src="http://lh5.ggpht.com/_5SnOEGqkJYw/SprsvDOyFDI/AAAAAAAAB6c/OHmmuOl240w/doing_it_wrong%5B4%5D.png?imgmax=800" width="244" height="138" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h6&gt;&lt;font color="#666666"&gt;&lt;/font&gt;&lt;/h6&gt;  &lt;p&gt;That reads pretty straightforward to me. Hell, I’ve stood in front of groups of devs on more than one occasion and said, “Views are what gets rendered, controllers marry up the views with anything they need from the model, and &lt;strong&gt;the model is everything that’s not a view or a controller&lt;/strong&gt;.”&lt;/p&gt;  &lt;p&gt;So, what’s been going wrong? I’ve been putting way too much business logic in my controllers.&lt;/p&gt;  &lt;p&gt;The structure of most of the MVC apps I’ve worked with is a typical .Net program structure. We’ve got a core where our business domain lives, and some type of ORM set up to talk to the database. From there, we expose that domain up to the UI through some simple domain services.&lt;/p&gt;  &lt;p&gt;The issue comes when I consume those services. I’m using my controller actions to marry all that up and present it to the UI. I think my “excuse” to this point has been that I have two models: My domain model, which I’m accessing through my domain services, and my presentation model, which lives in the Models directory in the ASP.Net MVC structure. My controllers have to care about two places to get their information to provide to the views. At the least I’m violating the pattern and at worst I’m likely repeating myself somewhere and creating a future maintenance issue.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;I think I can see where this happened, too. Think back to the Bad Old Days of dealing with Web Forms, and the cubby code behinds that came with it. In order to avoid the 197 line PageLoad method, I would have a lot of little one-off methods scattered about the code behind file. Switch over to MVC, and it seemed perfectly normal to have a similar structure. Alarms should have gone off when I had 5 classes in the Models directory but 18 methods in one controller class.&lt;/p&gt;  &lt;p&gt;But wait, there’s more!&lt;/p&gt;  &lt;p&gt;While perusing some code on my current project, I came across the [NonAction] attribute decorating a couple of controller actions. Re-reading that…I had NonAction decorating Actions. That has a certain “Jumbo-Shrimp” feel to it, doesn’t it? I suppose the non-action could fall under “managing the flow of the application” from above, but I’m thinking any non-actions might need to be refactored into the model.&lt;/p&gt;  &lt;p&gt;Moving forward on my MVC apps – of any flavor, Ruby or .Net – I think I’ll move to a much thinner controller model in favor of loading up the model with business logic. Though I thought I knew the pattern fairly well, I didn’t practice what I preached.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-3153319319405936396?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/08/i-forgot-what-m-in-mvc-was-for.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>6</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-8438306807214313587</guid><pubDate>Sat, 25 Jul 2009 00:00:00 +0000</pubDate><atom:updated>2009-07-24T20:00:01.939-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>kanaban</category><category domain='http://www.blogger.com/atom/ns#'>Speaking</category><title>Kanban At XPUserGroup – July 29</title><description>&lt;p&gt;This is a bit short notice, but I just found out about it last week. (Thanks to &lt;a href="http://twitter.com/muncman"&gt;Kevin&lt;/a&gt; tweeting about it. :) ) But, I’ll be presenting my “A Little Bit of Lean with Kanban” this coming Wednesday for the XPUserGroup here in Columbus. The meeting will be at OCLC at 11:30, I’ll begin my presentation at noon. (Directions and room info at &lt;a href="http://coqaa.org/index.php?pr=OCLC"&gt;OCLC&lt;/a&gt;.)&lt;/p&gt;  &lt;p&gt;I didn’t plan on doing much speaking before leaving for vacation on August 1, but here’s one more session on Kanban. We really can’t spread the word enough about Kanban, so why not give one more a few days before I head south?&lt;/p&gt;  &lt;p&gt;I’m also giving a short presentation on the 7 principles of Lean Software development next week…but you have to be an employee of Quick Solutions to see that one. (Get hired by Tuesday to see it! :) )&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-8438306807214313587?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/07/kanban-at-xpusergroup-july-29.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-7379743577655410989</guid><pubDate>Fri, 03 Jul 2009 16:00:00 +0000</pubDate><atom:updated>2009-07-03T12:06:28.213-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>kanaban</category><category domain='http://www.blogger.com/atom/ns#'>development conference</category><category domain='http://www.blogger.com/atom/ns#'>CodeStock</category><category domain='http://www.blogger.com/atom/ns#'>Speaking</category><category domain='http://www.blogger.com/atom/ns#'>development practices</category><title>CodeStock Recap and Kanban Talk Slides</title><description>&lt;p&gt;I had a great time at Codestock this past weekend. I didn’t get to many sessions, but I did go to a number of open space sessions (have some work to do on my blog) and the normal “hallway” sessions that never disappoint.&lt;/p&gt;  &lt;p&gt;My talk on Lean and Kanban went really well. There were only a couple seats left in the smallish room we had, but that lead to a much more interactive discussion. The &lt;a href="http://www.timwingfield.com/downloads/A%20Little%20Lean%20With%20Kanban.pptx"&gt;slides are available to download&lt;/a&gt;, with some notes in the deck.&lt;/p&gt;  &lt;p&gt;To answer a couple more questions from the group, here are a couple of the resources I mentioned in the talk:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Core Ladas blog: &lt;a title="http://leansoftwareengineering.com/" href="http://leansoftwareengineering.com/"&gt;http://leansoftwareengineering.com/&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.amazon.com/Implementing-Lean-Software-Development-Addison-Wesley/dp/0321437381/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1246635882&amp;amp;sr=8-1"&gt;Implementing Lean Software Development&lt;/a&gt; by Mary and Tom Poppendieck&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Coming soon will be &lt;a href="http://www.agilezen.com/"&gt;Agile Zen&lt;/a&gt;. I’ve taken a peek at the beta, and it’ll be quite a tool in helping people and teams do lean development. Sign up for their mailing list to get notified when it comes out.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-7379743577655410989?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/07/codestock-recap-and-kanban-talk-slides.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-4180862367522245268</guid><pubDate>Tue, 16 Jun 2009 12:00:00 +0000</pubDate><atom:updated>2009-06-16T08:03:05.677-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Speaking</category><category domain='http://www.blogger.com/atom/ns#'>IndyNDA</category><category domain='http://www.blogger.com/atom/ns#'>ASP.Net MVC</category><title>IndyNDA Recap and Covering the ModelBinder</title><description>&lt;p&gt;I want to thank all that attended my MVC presentation in Indy last week. I had a great time speaking, and even though I left a portion of my code sample out (model binders, which I’ll cover below), I thought it went well and I got some good questions during and after. I apologize for leaving it out of the talk, but I get to write a little blog post about it.&lt;/p&gt;  &lt;p&gt;A couple housekeeping things before I cover the ModelBinder part I missed.&lt;/p&gt;  &lt;p&gt;Off the top, the slides and source code from last week are &lt;a href="http://www.timwingfield.com/downloads/Getting%20started%20with%20MVC.zip"&gt;all zipped up for your downloading convenience&lt;/a&gt;. (The code through SVN is also available on &lt;a href="https://codeincubator.googlecode.com/svn/Samples/timwingfield/MvcSamples/StarDestroyer"&gt;Codeincubator&lt;/a&gt;.)&lt;/p&gt;  &lt;p&gt;During the post talk talking, &lt;a href="http://twitter.com/daveleininger"&gt;Dave&lt;/a&gt; asked me about a grid option in MVC. One we’ve been using is &lt;a href="http://flexigrid.info/"&gt;Flexigrid&lt;/a&gt;. It will do paging and sorting on its own, and will call back to your controller on its own for a little JSON. The big gotcha here is it runs on an older version of jQuery, which bit us in the butt on Friday on our project.&lt;/p&gt;  &lt;p&gt;The blog post that contains the code and explanation…well better explanation than, “I copied and pasted and it worked,” on the partial views is on &lt;a href="http://blog.codeville.net/2008/10/14/partial-requests-in-aspnet-mvc/"&gt;Steve Sanderson’s blog&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Now on to the part I forgot…&lt;/p&gt;  &lt;h3&gt;ModelBinder&lt;/h3&gt;  &lt;p&gt;I’m still feeling bad for not sharing this part. I got a question about it after the presentation, and that’s when I realized I totally forgot the edit page, which was going to demonstrate the ModelBinder. (Among other things, like the FluentHTML controls.)&lt;/p&gt;  &lt;p&gt;If you have the code form above, the files in play here are InventoryController.cs and Edit.aspx. AssaultItemEditModel.cs is the object passed, but it’s just a property bag.&lt;/p&gt;  &lt;p&gt;For the Reader’s Digest version: the ModelBinder works on the premise of convention over configuration, so the naming of your fields matter in that they have to match the property names of the object you want to bind to.&lt;/p&gt;  &lt;p&gt;For the example I missed, we had the edit model that we wanted to bind to:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;public class AssaultItemEditModel      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public virtual int Id { get; set; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public virtual string Type { get; set; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public virtual string Description { get; set; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public virtual int LoadValue { get; set; }&amp;#160;&amp;#160; &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The view had the form fields hooked to that edit model through the Fluent HTML controls from MVC Contrib.&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;% Html.BeginForm(&amp;quot;Save&amp;quot;, &amp;quot;Inventory&amp;quot;);%&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;h2&amp;gt;Edit &amp;lt;%=Html.Encode(Model.Type) %&amp;gt;&amp;lt;/h2&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;%=this.Hidden(x =&amp;gt; x.Id) %&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ul class=&amp;quot;details&amp;quot;&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;li&amp;gt;&amp;lt;span&amp;gt;Type: &amp;lt;/span&amp;gt;&amp;lt;%=this.TextBox(x =&amp;gt; x.Type) %&amp;gt;&amp;lt;/li&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;li&amp;gt;&amp;lt;span&amp;gt;Description: &amp;lt;/span&amp;gt;&amp;lt;%=this.TextBox(x =&amp;gt; x.Description) %&amp;gt;&amp;lt;/li&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;li&amp;gt;&amp;lt;span&amp;gt;Load Value: &amp;lt;/span&amp;gt;&amp;lt;%=this.TextBox(x =&amp;gt; x.LoadValue) %&amp;gt;&amp;lt;/li&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;li&amp;gt;&amp;lt;%=this.SubmitButton(&amp;quot;Save&amp;quot;) %&amp;gt;&amp;lt;/li&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/ul&amp;gt;       &lt;br /&gt;&amp;lt;% Html.EndForm();%&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;And finally, the controller method that’s going to process it all. Rather than taking in the standard id, it takes in a model object to which it will do all the Request.Form for you and hook the form values up to the object properties.&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;[AcceptVerbs(HttpVerbs.Post)]      &lt;br /&gt;public ActionResult Save(AssaultItemEditModel item)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //do save       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var assaultItem = new AssaultItem(item.Id)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Description = item.Description,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Type = item.Type,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; LoadValue = item.LoadValue       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Service.SaveAssaultItem(assaultItem);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var message = &amp;quot;Item saved successfully.&amp;quot;; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return this.RedirectToAction(x =&amp;gt; x.Index(message));      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Don’t mind my extra step on newing up an object with the id as a parameter, that’s due to the way I hooked up &lt;a href="http://fluentnhibernate.org/"&gt;Fluent nHibernate&lt;/a&gt; at the start. Basically, to generate my maps from my domain objects, the id gets a private setter as convention. So, to get the right object to save, I had to set up the constructor to take an id argument. I cut some corners to get the demo app out the door. (John, you may hit me with, “Quicker does not equal better,” as soon as you read this.)&lt;/p&gt;  &lt;p&gt;The other way around that is to not use my domain objects in my views, but that’s another discussion.&lt;/p&gt;  &lt;p&gt;Under the hood where the magic happens, I haven’t dug too deep. But, I use this daily and it works swimmingly. You don’t even have to take in the model the view is bound to, just have the form fields match the model you’re taking in. I don’t recommend doing ad hoc model binding, in practice we set our edit model as a child of the view model.&lt;/p&gt;  &lt;p&gt;I feel bad that I didn’t get this up on the screen, because it’s some fun stuff to show off.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-4180862367522245268?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/06/indynda-recap-and-covering-modelbinder.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-999516521781397405</guid><pubDate>Thu, 11 Jun 2009 00:39:00 +0000</pubDate><atom:updated>2009-06-10T20:39:40.594-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>development conference</category><category domain='http://www.blogger.com/atom/ns#'>CodeStock</category><category domain='http://www.blogger.com/atom/ns#'>Speaking</category><title>Now Batting Leadoff for CodeStock…</title><description>&lt;p&gt;I am honored to have been selected to speak at &lt;a href="http://codestock.org/"&gt;CodeStock&lt;/a&gt; and will be delivering having my Kanban conversation in the great state of Tennessee. I’m really looking forward to this as I didn’t make CodeStock last summer, and it looks like a great two day event. The good folks that have organized the conference have slotted me in one of the &lt;a href="http://codestock.org/Agenda.aspx"&gt;opening sessions&lt;/a&gt; on Friday, so we’ll get our Lean on early in the conference.&lt;/p&gt;  &lt;p&gt;There are a number of sessions I’m looking forward to, and since mine is over early I should get to a bunch of them. But, as with any regional conference, I’m looking forward to the hallway sessions as well.&lt;/p&gt;  &lt;p&gt;If you’re thinking about going, go get registered, it looks like it’s going to be a good time.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-999516521781397405?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/06/now-batting-leadoff-for-codestock.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-8130811769289984836</guid><pubDate>Mon, 08 Jun 2009 12:00:00 +0000</pubDate><atom:updated>2009-06-08T08:00:30.643-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>development</category><category domain='http://www.blogger.com/atom/ns#'>ASP.Net MVC</category><title>“But WebForms did that FOR me.”</title><description>&lt;p&gt;While working with the model binder the other day, the statement in the title was made by one of the guys on my team. It’s not an unreasonable statement, but I think it spells out an important distinction between traditional ASP.Net WebForm development and using the new, shiny ASP.Net MVC framework.&lt;/p&gt;  &lt;p&gt;The point in question was in posting an object after edit, the id didn’t automatically come through. The model binders do some magic under the hood, and it’s welcome magic in my opinion as I’ll gladly leave Request.Form back with Classic ASP. However, you still have to tell the model binder the whole story, it’s not done for you anymore. (Nor was it done for you before WebForms.)&lt;/p&gt;  &lt;p&gt;Solution to our little problem: Stash the object id in a hidden form field. (Yes, I know, right click and view source and there’s my object id.) Once looked down upon in WebForms development…well, other than that one GIANT hidden form field called “ViewState”…the hidden field looks to be making a quiet comeback. &lt;/p&gt;  &lt;p&gt;Basically, if you want the model binder to find all the bits to your object, you have to make it available when the page posts. So, it needs to be in the form somewhere.&lt;/p&gt;  &lt;p&gt;Personally, I don’t see this as a step backwards, but I grew up in the salad days of request/response. Having to provide that info so you can get it back seems normal. The flip side is also true: if you don’t need it, you don’t have to add it.&lt;/p&gt;  &lt;p&gt;The more I work with ASP.Net MVC, the more I fall in love with it.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-8130811769289984836?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/06/but-webforms-did-that-for-me.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-8943154845481235052</guid><pubDate>Sun, 07 Jun 2009 13:00:00 +0000</pubDate><atom:updated>2009-06-07T09:00:11.861-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Speaking</category><category domain='http://www.blogger.com/atom/ns#'>IndyNDA</category><category domain='http://www.blogger.com/atom/ns#'>ASP.Net MVC</category><title>Back to Indy for NDA</title><description>&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_5SnOEGqkJYw/Siu0XrMEoAI/AAAAAAAABdI/WVhaCusjZCU/s1600-h/image%5B9%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://lh5.ggpht.com/_5SnOEGqkJYw/Siu0YLMJTII/AAAAAAAABdM/ncpjreCj0Ww/image_thumb%5B7%5D.png?imgmax=800" width="204" height="52" /&gt;&lt;/a&gt; A few weeks back, I made my first trip to speak in Indy at the &lt;a href="http://www.indycodecamp.org/"&gt;Indy Code Camp&lt;/a&gt;. I had a great time, met some new people, and got invited back to speak at &lt;a href="http://indynda.org/"&gt;IndyNDA&lt;/a&gt; on ASP.Net MVC. &lt;/p&gt;  &lt;p&gt;So, this Thursday, June 11, if you’re in the greater Indianapolis metropolitan area and want to learn a little MVC, then I hope to see you at IndyNDA.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-8943154845481235052?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/06/back-to-indy-for-nda.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-1923321635616252592</guid><pubDate>Mon, 18 May 2009 03:00:00 +0000</pubDate><atom:updated>2009-05-17T23:00:09.682-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Speaking</category><category domain='http://www.blogger.com/atom/ns#'>development practices</category><category domain='http://www.blogger.com/atom/ns#'>Findlay Area .Net Users Group</category><title>Presenting in Findlay this Tuesday</title><description>&lt;p&gt;I can’t believe I didn’t get this blogged sooner: I’m presenting “Care About Your Craft: Adventures in the Art of Software Development” in Findlay this coming Tuesday, May 19th.&lt;/p&gt;  &lt;p&gt;I’m looking forward to heading up to Findlay for this. I met a few of the &lt;a href="http://fanug.org/default.aspx"&gt;FANUG&lt;/a&gt; guys at Indy Code Camp this weekend, so I’ve got a few hecklers already primed.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-1923321635616252592?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/05/presenting-in-findlay-this-tuesday.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-1259046311386128271</guid><pubDate>Mon, 18 May 2009 00:00:00 +0000</pubDate><atom:updated>2009-05-17T20:03:47.182-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>development conference</category><category domain='http://www.blogger.com/atom/ns#'>Speaking</category><category domain='http://www.blogger.com/atom/ns#'>Indy Code Camp</category><title>Indy Code Camp Recap</title><description>&lt;p&gt;For the first time in my short speaking career, I stepped over my imaginary Microsoft Line and out to another region…alllll the way to Indianapolis. I’ve driven to Memphis to talk, and stay in my region, but never the whopping 3 1/2 hour drive to Indy to see the good folks over there. After this trip, I think I’ll step over the imaginary line a few more times.&lt;/p&gt;  &lt;p&gt;First, a big thanks to &lt;a href="http://twitter.com/DaveLeininger"&gt;Dave Leininger&lt;/a&gt; for putting on a great event. There were over 200 people at the event, and it seemed all were enjoying themselves. Dave drew speakers from 5 states for the Indy Code Camp, so tip of the hat for getting the word out.&lt;/p&gt;  &lt;p&gt;The hallway sessions are always good, but I missed out on a few running &lt;a href="http://twitter.com/jblankenburg"&gt;Jeff&lt;/a&gt; to the airport and back. (And not finding the airport right away didn’t help.) But even with my limited hallway track time, I still met some new folks and talked shop with some familiar faces. &lt;/p&gt;  &lt;p&gt;I’m already looking forward to my next foray over the imaginary line that is the western border of Ohio. (Maybe a trip east is in order? :) )&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-1259046311386128271?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/05/indy-code-camp-recap.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-52494893995945860</guid><pubDate>Tue, 28 Apr 2009 12:00:00 +0000</pubDate><atom:updated>2009-04-28T08:00:19.088-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>development</category><title>Code and Coffee</title><description>&lt;p&gt;After a great day at &lt;a href="http://kalamazoox.org/"&gt;Kalamazoo X&lt;/a&gt;, and a conversation with &lt;a href="http://mvwood.com/"&gt;Mike Wood&lt;/a&gt; about his Bitslinger idea in Cincy. &lt;a href="http://www.jeffblankenburg.com"&gt;Jeff&lt;/a&gt; and I had a few hours in the truck headed south to work out something for Columbus, so &lt;a href="http://codeandcoffee.info/"&gt;Code and Coffee&lt;/a&gt; was born.&lt;/p&gt;  &lt;p&gt;OK, we hatched the general idea…meet at a coffee shop on Thursday mornings, write code. I came up with the name and bought the domain. :)&lt;/p&gt;  &lt;p&gt;The idea is straight forward: Show up at our coffee shop of choice, bring a laptop, pair up, and have fun writing some code.&lt;/p&gt;  &lt;p&gt;Check out &lt;a href="http://codeandcoffee.info/"&gt;http://codeandcoffee.info/&lt;/a&gt; and join us if you can.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-52494893995945860?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/04/code-and-coffee.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-2031727665490793985</guid><pubDate>Sat, 18 Apr 2009 16:50:00 +0000</pubDate><atom:updated>2009-04-18T12:50:59.112-04:00</atom:updated><title>CODoDN Follow Up</title><description>&lt;p&gt;First, big thanks to everybody that attended my talk on Kanban at &lt;a href="http://cinnug.org/cododn/"&gt;Central Ohio Day of .Net&lt;/a&gt;. It was a lot of fun talking with everybody, no matter how many times I got side tracked.&lt;/p&gt;  &lt;p&gt;The first request from the talk was a link to &lt;a href="http://leansoftwareengineering.com/"&gt;Corey Ladas&lt;/a&gt; blog. Corey has some great stuff in there, but start with the &lt;a href="http://leansoftwareengineering.com/ksse/scrum-ban/"&gt;scrumban&lt;/a&gt; post.&lt;/p&gt;  &lt;p&gt;Here are &lt;a href="http://www.timwingfield.com/downloads/A%20Little%20Lean%20With%20Kanban.pptx"&gt;my slides&lt;/a&gt;. The slides themselves are just to support the talk, but there are notes on each slide.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-2031727665490793985?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/04/cododn-follow-up.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-477851432828940645</guid><pubDate>Fri, 10 Apr 2009 12:00:00 +0000</pubDate><atom:updated>2009-04-10T08:00:19.091-04:00</atom:updated><title>Two Talks at Indy Code Camp</title><description>&lt;p&gt;I am honored to have been selected to give not one, but two talks at the upcoming &lt;a href="http://www.indycodecamp.org/"&gt;Indy Code Camp&lt;/a&gt; on May 16th.&lt;/p&gt;  &lt;p&gt;I'll be presenting &lt;em&gt;Care About Your Craft: Adventures in the Art of Software Development&lt;/em&gt;, and &lt;em&gt;A Little Bit of Lean With Kanban&lt;/em&gt;. Both these talks are a lot of fun and get good audience participation, so it should be fun.&lt;/p&gt;  &lt;p&gt;The Indy Code Camp is typically as much code as you can crank out, and they have a max of 3 slides request for most talks. But, I'm in &lt;em&gt;Track Five: Beyond Lines of Code&lt;/em&gt;...which is a good thing, as both talks have way more than 3 slides, and 0 lines of code.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-477851432828940645?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/04/two-talks-at-indy-code-camp.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-5872313580471395442</guid><pubDate>Thu, 09 Apr 2009 12:00:00 +0000</pubDate><atom:updated>2009-04-09T08:00:21.506-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>kanaban</category><category domain='http://www.blogger.com/atom/ns#'>development</category><category domain='http://www.blogger.com/atom/ns#'>development practices</category><title>What I'd Do Different</title><description>&lt;p&gt;In my &lt;a href="http://blog.timwingfield.com/2009/04/kanban-lessons-learned.html"&gt;last post&lt;/a&gt; I mentioned a few things I'd like to do differently in my next new dev project where we utilize Kanban. I sat down with our PM, Elizabeth, and we did kind of a mini-project retrospective, and what we could do differently from the Kanban side of things to help things flow along better.&lt;/p&gt;  &lt;p&gt;The first thing we thought would help would be to get better info on the cards, and to treat the cards as Minimal Marketable Features. Across the top of the card we'll put the feature number, name, and its time estimate. In the middle of the card, the description and any task breakout that's needed. Across the bottom we'll stick with the WIP start and end dates, and the cycle time will go between them once it's complete. The back of the card we'll put actual developer and tester times, and then once complete total that and put it on the front of the card under the estimated time.&lt;/p&gt;  &lt;p&gt;This will accomplish a few things for us. First, on the dev side of things, it gets that task card breakout thing out of the way and allows us to track the features across the board as a single entity. Secondly, it gets more project management info clearly on the dev card, which makes it much easier for people not knee deep in the project daily to keep tabs on what's going on.&lt;/p&gt;  &lt;p&gt;The second thing we thought should be implemented the next time around is an extension of the board, to the left. Our board for this one had a bullpen column where features were in holding waiting for the tasks to breakout. From there, they moved into the backlog, and into work in progress.&lt;/p&gt;  &lt;p&gt;Our idea here is to break that bullpen column out into another Kanban section where discovery, design, and estimation takes place. Once that is complete the feature can wait in a &amp;quot;Ready for Dev&amp;quot; status and be pulled into the backlog column on the development Kanban board when the set trigger point is hit.&lt;/p&gt;  &lt;p&gt;Elizabeth and I went back on forth a bit on where the bullpen board would reside. Initially I wanted to see it isolated from the dev team so they could concentrate solely on the dev tasks at hand. However, Elizabeth's persuasive abilities (strawberry cake with white icing may or may not have played a role here) led us to the conclusion that it should all be one board. This allows the developers to be aware of what's in the pipeline coming at them, lest they relax a bit too much at a critical point in the timeline. And, it allows the dev side of the board to pull from the bullpen as features are estimated and ready to go.&lt;/p&gt;  &lt;p&gt;Finally one last thing we thought we'd employ would be different sized cards for different sized features. If we can't get all features to breakout into a similar estimate range, which is a very real possibility, then maybe get two or three ranges and denote them with different sized cards on the board. This would allow for different cycles to be tracked based on feature size, and a quick look at the board would tell you what type of features are moving through the system at any given time.&lt;/p&gt;  &lt;p&gt;I think these changes to our approach will help the next new dev &lt;a href="http://lh6.ggpht.com/_5SnOEGqkJYw/Sdq_yOBDMGI/AAAAAAAABZU/96kNYcKV0cA/s1600-h/PIC-0300%5B3%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="184" alt="PIC-0300" src="http://lh5.ggpht.com/_5SnOEGqkJYw/Sdq_yW25M3I/AAAAAAAABZY/eGUW0USb0h4/PIC-0300_thumb%5B1%5D.jpg?imgmax=800" width="244" align="right" border="0" /&gt;&lt;/a&gt; project where we employ Kanban. We used it successfully before, but I think this will help get more features into done with less friction for the whole team. Which means cards will get put in the envelope above this lovely lady's picture in a shorter cycle. (Whiteboard drawing courtesy of &lt;a href="http://danshultz.blogspot.com/"&gt;Dan Shultz&lt;/a&gt;.)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-5872313580471395442?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/04/what-i-do-different.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-5687503417457496313</guid><pubDate>Tue, 07 Apr 2009 02:13:00 +0000</pubDate><atom:updated>2009-04-06T22:13:34.330-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>kanaban</category><category domain='http://www.blogger.com/atom/ns#'>development</category><category domain='http://www.blogger.com/atom/ns#'>development practices</category><title>Kanban Lessons Learned</title><description>&lt;p&gt;After seeing success with Kanban in a production support environment (&lt;a href="http://blog.timwingfield.com/2008/11/kanban-o-rama-part-1.html"&gt;part 1&lt;/a&gt;, &lt;a href="http://blog.timwingfield.com/2008/11/kanban-o-rama-part-2.html"&gt;part 2&lt;/a&gt;), we decided to give it a try in a new development situation. This project was a mix of new development and working with an inherited code base to implement some existing features differently. &lt;/p&gt;  &lt;p&gt;Because of this situation, we ended up with a mixed bag of features. &lt;a href="http://lh6.ggpht.com/_5SnOEGqkJYw/Sdq2y2RIUZI/AAAAAAAABZM/n3eVSWTdIww/s1600-h/PIC-0301%5B3%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="184" alt="PIC-0301" src="http://lh5.ggpht.com/_5SnOEGqkJYw/Sdq2zb75KNI/AAAAAAAABZQ/RIeracpDFSs/PIC-0301_thumb%5B1%5D.jpg?imgmax=800" width="244" align="right" border="0" /&gt;&lt;/a&gt;At the onset, we decided to break these features out into tasks, and we would track both across our Kanban board, as shown here with a snapshot of our Work In Progress section. &lt;/p&gt;  &lt;p&gt;Features were broken into tasks and grouped together in the backlog. Once a feature went into WIP, it's tasks moved below into the Task Breakout section and were worked there. Once all tasks were completed, they were once again compiled back into a feature and went into test as a whole.&lt;/p&gt;  &lt;p&gt;What we tried to accomplish here was to keep the concept of a MMF while still breaking the work into smaller, more manageable units. What ended up happening was that features themselves became secondary to almost full task development, however we were tracking features through the system for our cycle time. Early, heavy task features that focused more on the business model skewed the cycle time higher, and later UI tweaking features sent it lower. As such, our cycle time diminished quickly as the deadline drew near...a good thing, but I don't think it was totally attributable to the team's momentum.&lt;/p&gt;  &lt;p&gt;I think we failed here in poor estimation of what lie in front of us when we started. A good bit of this is the situation we were in at the onset where we were under pressure to start getting things moving right away, and we didn't give much credence to estimating later features very well. That wasn't really a Kanban issue, and we should have known better. The excuse is we had very little time to ramp up on the discovery side of things when we got the project, but it would just be an excuse...we should have known better.&lt;/p&gt;  &lt;p&gt;One final area where we had some issues was in reporting where exactly we stood in features completed. We were fairly visible on this project, and had a lot of interest in our success by the due date. (OK, what project doesn't?) While you could look at the board and see what was being worked at any given point, due to the lack of good feature estimation up front, it was hard to see where we were in the big picture. In the latter half of the project we stole ourselves a project manager, and she did a bang up job of getting that information worked out, but she did struggle in figuring it out. Again, I think she had trouble due to the lack of good estimation up front.&lt;/p&gt;  &lt;p&gt;It wasn't all pain and suffering as we moved our cards across the board.&lt;/p&gt;  &lt;p&gt;One good thing we got out of the board was it was easily changed to fit our constantly changing team size and make up. We started out as three developers, and ended as four developers - two different than the original three, one PM, and one QA person. Being able to walk up to the board and change the queue limits on feature WIP, task development, and features in test made things flow quite smoothly as the project moved along. It did a good job of identifying a few roadblocks and getting them out of the way, as well.&lt;/p&gt;  &lt;p&gt;As noted earlier, our cycle time did drop as we neared the due date. Part of that was due to the smaller features coming through later, but there was a good bit of momentum on the dev team, too. Morale stayed fairly good as we kept moving things into the done envelope at the right side of the board.&lt;/p&gt;  &lt;p&gt;I still think we were successful with Kanban in this situation, but clearly I think we need some refinements around how we did it on this project. I'll save those ideas for my next post.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-5687503417457496313?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/04/kanban-lessons-learned.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-6764260423310012936</guid><pubDate>Tue, 24 Mar 2009 18:22:00 +0000</pubDate><atom:updated>2009-03-24T14:30:52.490-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>development</category><category domain='http://www.blogger.com/atom/ns#'>development practices</category><category domain='http://www.blogger.com/atom/ns#'>Pragmatic Programmer</category><title>"Houston here. We're looking for somebody to blame for your problem, 13."</title><description>&lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;b&gt; Fix the Problem, Not the Blame &lt;/b&gt;        &lt;br /&gt;It doesn't really matter whether the bug is your fault or someone else's&amp;#8212;it is still your problem, and it still needs to be fixed.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;--The Pragmatic Programmer&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I highly doubt that was the response to Jim Lovell after the line, &amp;quot;Houston, we have a problem.&amp;quot; However, in our world of software development it still seems to be the first reaction to any issue that comes up.&lt;/p&gt;  &lt;p&gt;I know in projects past, I've been a huge offender of looking for, &amp;quot;It's not MY fault,&amp;quot; rather than fixing &lt;a href="http://lh3.ggpht.com/_5SnOEGqkJYw/SckmknkbMoI/AAAAAAAABWE/kzGy6Onc22Q/s1600-h/blame%5B10%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="blame" src="http://lh3.ggpht.com/_5SnOEGqkJYw/SckmlkbTKVI/AAAAAAAABWI/NIpQUNHpMqM/blame_thumb%5B6%5D.jpg?imgmax=800" width="194" align="right" border="0" /&gt;&lt;/a&gt;the problem at hand. &lt;a href="http://toddkaufman.blogspot.com/"&gt;Todd&lt;/a&gt; even nicknamed me Blameosaurus on one project because I got so good at looking for the blame. So, I'm not exempt from my own post here.&lt;/p&gt;  &lt;p&gt;I've been a consultant for one company or another for over ten years now, and we're constantly thrown into burning buildings to get something working. There are a plethora of issues on day 1, and all too often those of us on the team spend too much time bitching about the issues and not enough time rolling up our sleeves to get things squared away. So, day 2 rolls around and we're in the same boat, and the same problem still exists.&lt;/p&gt;  &lt;p&gt;That said, sometimes there is a right time to track somebody down that created a problem. Don't do it as a way to shame them, but rather for more clarification. Who knows what the situation as like at the time they made the error, and maybe it's a good time to help somebody learn something new.&lt;/p&gt;  &lt;p&gt;I feel I'm still an offender of whipping out the blame thrower a bit too often, but I'm making a conscious effort to quit and move on with the solution.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-6764260423310012936?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/03/here-we-looking-for-somebody-to-blame.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-4184012250120810275</guid><pubDate>Tue, 17 Mar 2009 23:52:00 +0000</pubDate><atom:updated>2009-03-17T20:18:30.110-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>kanaban</category><category domain='http://www.blogger.com/atom/ns#'>development conference</category><category domain='http://www.blogger.com/atom/ns#'>Day of .Net</category><category domain='http://www.blogger.com/atom/ns#'>Kalamazoo X</category><category domain='http://www.blogger.com/atom/ns#'>Speaking</category><category domain='http://www.blogger.com/atom/ns#'>CODODN</category><title>Some April Kanban Talks</title><description>I'm happy to have been selected to two conferences in the region to share an hour or so of Kanban, and my experiences with it.&lt;br /&gt;&lt;br /&gt;The first will be at &lt;a href="http://cinnug.org/cododn/"&gt;Central Ohio Day of .Net&lt;/a&gt; on April 18th in Wilmington. This is a great little conference that combines the forces of the dev communities of Dayton, Cincy, and Columbus for a day of geeking out. In addition to the great sessions they have lined up, there will also be Open Spaces. If you've got time on a Saturday in the spring, this is a great gathering at a great price...free!&lt;br /&gt;&lt;br /&gt;The following Saturday, April 25th, I'm going to trek north and present at the Kalamazoo X conference. This is the first year for this conference, and it looks really interesting. It's focus is on the non-tech side of development, so there will be lots of dev process, design, and user interaction type talks. All the stuff we need to know without opening up our favorite IDE. As an added bonus, &lt;a href="http://www.bellsbeer.com/"&gt;this place&lt;/a&gt; is in Kalamazoo for a required stop.&lt;br /&gt;&lt;br /&gt;That will keep a couple Saturday afternoons busy in April for me. Now, if a certain local hockey team can keep the Saturday evenings busy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-4184012250120810275?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/03/some-april-kanban-talks.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8339867949129086615.post-1503848292003001891</guid><pubDate>Sat, 07 Mar 2009 01:47:00 +0000</pubDate><atom:updated>2009-03-06T21:03:24.046-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>kanaban</category><category domain='http://www.blogger.com/atom/ns#'>Speaking</category><category domain='http://www.blogger.com/atom/ns#'>COALMG</category><title>COALMG Kanban Talk Follow-up</title><description>I would like to thank everybody that attended my Kanban talk at &lt;a href="http://www.coalmg.org/"&gt;COALMG&lt;/a&gt; on March 5th. There were some great questions, a good discussion, and judging by the tweets on Twitter afterward, it got some wheels turning. I'm glad the talk got some of you thinking about things you can look into.&lt;br /&gt;&lt;br /&gt;As promised to &lt;a href="http://www.jeffreyhunsaker.com/"&gt;Jeff&lt;/a&gt;, here are my slides: &lt;a href="http://www.timwingfield.com/downloads/A%20Little%20Lean%20With%20Kanban.pptx"&gt;A Little Lean With Kanban&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The disclaimer on the slides: They meant to support the presentation (I have totally  bought into the &lt;a href="http://www.amazon.com/gp/product/0321525655/103-6148611-3957463?ie=UTF8&amp;amp;tag=garrreynoldsc-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=0321525655"&gt;Presentation Zen&lt;/a&gt; approach to presenting), so on their own they don't say much. However, my notes to each slide are there, and that should provide some value. Also, even though I used pptPlex for the presentation, if you don't have that they'll still work fine in Power Point.&lt;br /&gt;&lt;br /&gt;Also, I love feedback. That was the first time I gave that presentation in that form, and welcome any suggestions you may have. I already got a few from &lt;a href="http://govorin.blogspot.com/"&gt;Comrade&lt;/a&gt;, &lt;a href="http://jamescbender.com/bendersblog/Default.aspx"&gt;James&lt;/a&gt;, and &lt;a href="http://www.pandamonial.com/"&gt;Amanda&lt;/a&gt; over post-talk beers that will be folded in to the next iteration.&lt;br /&gt;&lt;br /&gt;And all you guys named Jeff that bailed on the post-talk beers...for shame!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8339867949129086615-1503848292003001891?l=blog.timwingfield.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.timwingfield.com/2009/03/coalmg-kanban-talk-follow-up.html</link><author>noreply@blogger.com (Tim)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item></channel></rss>