in

ExpressionBlog.com

Microsoft Expression Studio Community

This Blog

Syndication

Mirrored Blogs

Browse by Tags

All Tags » Agile (RSS)
  • dnrTV Episode #126: Roll-Your-Own IoC with Me

    My first dnrTV episode went live today. I am talking with Carl Franklin about dependency inversion, dependency injection, and inversion of control. I demonstrate how to build a very simple IoC container. My intent is to show developers that it isn't any thing crazy scary. I talk about how IoC facilitates decoupling dependencies and creating more easily testable software. Check it out! dnrTV #126: James Kovacs' roll-your-own IoC container Feedback is always welcome. Carl and I plan to do another show focused on IoC containers in the next few weeks. Specifically we'll be talking about what a full-fledged container offers over and above the roll-your-own. If you have other IoC questions you would like answered on the next show, drop me an email.
  • DC ALT.NET - 10/21/2008 - A Look at Kanban Software Development

    The August meeting for DC ALT.NET will be on October 21st, 2008 from 7-9PM.  Check the DC ALT.NET site and our mailing list for continuing updates and future meetings.  This month, Linda Cook will be presenting "A Look at Kanban Software Development".  I've been exploring a lot of Lean Software Development and Kanban, and this is an opportunity to explore the topic in depth with an established Lean/Agile coach.  My CodeBetter compatriot, Dave Laribee had introduced Kanban to XClaim Software and has some really good information on the topic. About Kanban Software Development Kanban is gaining popularity thanks to a growing number of groups, including Corbis and Yahoo!, who have been practicing and learning how to best apply Kanban to software development projects.  Kanban uses lean techniques, such as queue management, flow control and theory of constraints to optimize the workflow of a team.  As David Anderson states, "Kanban is a process that exposes the natural workflow of a system and reduces lead time by limiting the amount of work in progress." As part of this discussion, we'll look into what it means to use a Kanban system for software development and how to apply the "pull based" system, which determines the supply, or production, according to the actual demand of the customers.  Comparison and contrasting between Kanban and Scrum will also be discussed.  Kanban systems use constant inspection and adapting techniques to identify bottlenecks and defects.  Linda will share her experiences using Kanban and how it helped the team collaborate on a variety of projects. About Linda Cook Linda Cook is a Lean/Agile Coach with over twenty years’ experience in the IT industry. She mentors colleagues, creates formal and informal training programs, and helps organizations apply some of the best practices in the Lean Software Development and Agile Project Management. She is a Certified Scrum Master and completed the Lean Six Sigma program at Villanova University. Details The details of the event are as follows: Date/Time: 10/21/2008 - 7-9PM Location: Motley Fool 2000 Duke Street Alexandria, VA, 22314 Hope to see you there!
  • Done For Real

    I had the good fortune to sit in on a day long session with Dave Hussman (who is awesome, by the way) on the topic Agile coaching as a lead in to the Atlanta APLN meeting . It was chock full of tips and I recommend getting out to see Dave if and when you get the chance; he packs a lot of knowledge into a short amount of time in an extremely entertaining way. One of the questions he asked is: when is a feature done? This is a perennial topic with Agilists and it's a very valid question; how do we know when a feature is "potentially shippable?" I piped up with my answer: a story is done when it's in production use . That was a little different than the answers from the others in the room. Think about it: we're not delivering value until that value has been delivered. That's a very Yogi Berra way of saying that until the user's using, that feature you made isn't contributing to business value. In a way that's one of the original premises of Agile: release early, release often. This is the reason why I like the cycle time measure over the velocity measure. Cycle time tells us how long the feature took from the time it was green lit to the time it went into production. This gives us a real measure of how long it takes to deliver business value. Velocity simply tells us how long a feature took to develop (unless, of course, we have release-per-iteration) Agile asked us to work better as software development teams and deliver in tiny little batches. Lean asks us to do the same thing, but put the software team in the context of the larger organization and from the customer perspective. Think globally, act locally. Doesn't matter how rockin' a development team is, if those features are being held in inventory until waiting for some deployment event, they're not done; they're only done as far as you're concerned , and, last I checked, there were more than developers and testers involved in the process of delivering software.
  • Learning and craftsmanship

    Roy has a pretty thoughful post on the barrier to entry for most developers with Test-Driven Development. I hope I am not doing Roy a disservice by summarizing it as: we have made TDD unapproachable to many by making it more and more complex. I would agree with many of the points that Roy makes about returning to the basics when approaching TDD. I still find Kent Beck's book captues the essence of TDD. It also contain wisdom that when I return to it makes me realize that much of what I assumed were new ideas were all there in Kent's original book on the topic. I like the clarity of the Four-Phase Test and its cousin Act/Arrange/Assert . I agree that we should prefer testing the state of the class we are testing over its behavior. But I do not think that another naming taxonomy for techniques to swap out depended-on components is going to do anything more than muddy the waters. Maybe you don't like Gerard's Test Doubles but they do catalogue a lot of what is out there in the wild. The naming conventions behind test doubles are not the issue most people encounter. The problem they hit is that in reality there are hard-to-test areas and people look for help in overcoming them. After I learnt TDD I wrote, by my current standards, poor unit tests. I wrote tests that touched the Database. I wrote tests that touched the file system and called across the network. I wrote tests that checked private methods. I wrote tests that shared fixture or had dependencies between them. I put mocks everywhere, replacing every depended upon component. And I suffered with fragility, slowness, an unmaintainable code for my mistakes. But I needed to make those mistakes. Because it was only by making the mistake that I could understand the need for and value of a solution. We live in a fairly lucky time for software craftsmanship. The wisdom of the masters of our trade is published in accessible formats for all of us to read. So when we need to learn at the feet of the masters we do not have to look for opportunities to work alongside them, we can find their wisdom in the form of patterns, principles, and practices published in books or on the web. I started my career in a period where this kind of knowledge was much less accessible, and the only way to discover a better solution was to find one yourself or work with someone who knew of a different approach. We live in fortunate times. But the ease with which we can find best practice often masks the fact that understanding the value of that advice usually requires us to have experienced the pain beforehand. When I teach TDD one point I try to flag is that the first step is to start writing tests. Not to worry about how good those tests are, but to start writing tests. Once you are writing tests and experiencing the pain that comes from poor tests, you will appreciate the value of some of the best practices out there. Because then you understand them as solutions to problems not just more complexity. But first...
  • TDD and Hard To Test Areas, Part 2

    It's been a while. I have been heads down on a new project (more about that some other time), and have not got around to posting. Without further ado here is the follow up post to TDD and Hart To Test Areas, Part 1 . Depend upon Abstractions The Gang of Four’s first principle is to program against abstractions not implementations. If we use abstractions then we can solve the hard-to-test problem by implementing the abstraction in terms of the hard-to-test dependency in production, but with a simple-to-test dependency in test. So we could use an IDatabase to abstract out our interaction with the Db, using concrete Ado.Net classes in production, but replace it with an in-memory collection for testing. Jeremy Miller summarizes this approach as ‘ isolate the ugly stuff ’. We need to show some rationality here. No one wants IString, everyone wants IDatabase, and we probably don’t need an ICustomer, but we might. The advantage of TDD is in flushing out where ICustomer is useful by exercising the SUT. So when designing for testability we need to think about which dependencies we want to allow to be concrete, and which won’t don’t. Different schools of programming make different value judgments here. Classicist approaches tend to avoid replacing all dependencies, focusing instead on ones that are needful to support extensibility and layering. Design principles should help us identify when to use interfaces and these tend provide the opportunities we need to use abstractions to isolate hard-to-test code. Layers A layered architecture also creates a need for abstractions. While the layers must communicate, like a layer cake higher lays may depend on lower-layers but not vice-versa. To effect this, higher layers in our architecture should depend on an abstraction exposed by the lower layer, not a concrete type. The two layers can communicate via the agreed contract, but the higher layer has no dependency on the lower layer. Robert Martin's Dependency Inversion Principle states that High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions. This dovetails with hard-to-test areas as layer boundaries often co-inside with hard-to-test areas such as the UI or access to external systems. So using abstractions when we layer helps us to achieve testability. To ensure cohesion we often talk to a façade when we cross a layer boundary, which hides the complexity of the other layer, and this again simplifies testing, by removing the need to create the objects that implement the façade as part of our test setup. Open-Closed Principle In Agile Principles, Patterns, and Practices in C# Robert Martin describes the Open-Closed Principle as “ Software entities (classes, modules, functions, etc.) should be open for extension but closed for modification. ” To achieve this ‘impossible thing before breakfast’ we use polymorphism. By creating an abstraction...
  • Introducing Kanban at Xclaim

    We've rolled out Kanban at my company Xclaim Software. Prior to this we were following a more-or-less XP process evolved and tweaked over some two years. Even though our team has been doing the Agile thing with good results, there are times that the process seems a little opaque and wasteful. I've noticed that it's hard to surface where we're encountering bottlenecks or impediments. Planning and maintaining a large inventory of backlog creates waste; planning can take several hours for large batches of new stories and, while I think there's good value in preparing a as-full-as-possible backlog at the beginning of a project, I see very little value in maintaining a backlog over three months at a maximum. There's simply too much risk of redundancy and re-work in a large backlog. For a while now I've seen iterations as an arbitrary nuisance. We all know velocity is a yardstick measure that's imprecise and best used for rough planning. We can also take points delievered over any two points of time and compare this number to previous durations to develop a trendline. Over a longer history we can use these numbers as a measure of throughput and improvement. Why then do we need to make them reset every Wednesday? If we're using similarly-sized items -- which we are -- it seems that feature cycle time (time from 'activation' to 'in production') is equally useful and much more understandable by both customer and developer. A big source of waste, waste due to over-processing , is the planning, retrospective, and customer demo ceremonies. It's easy to burn a half-day or more in these meetings and the fact of the matter is that a lot of these things can just be JIT'd on an as needed basis with the right people getting us much closer to the lean concept of pull. Is it too much of a stretch to say project determines process ? Every project we work on and environment we work in will come with requirements that drive a customized process. Of course we can't get there from day one. We need to setup a good baseline with the practices we know have broad applicability, acceptance, and tolerance: TDD, rolling wave planning, etc. Good Agile teams, however, continually adjust their process to fit their product and the needs of their customers. In a sense, we're designing our process as we go and this is something I see Kanban encouraging. There's a few things to say about this Kanban thing we've got going on, and I'd like to tackle this as a mini-series to make the posts digestible. I'll continue with five installments to start: 1. Why bother? Pull, flow, throughput and constraints. 2. Anatomy: queues, buffers, work-in-process, standard work and order points. 3. Developing and introducing a Kanban in your team. 4. A tour of our initial Kanban pipeline. 5. Handling rework and the zero defect mindset. 6. TBD If you're interested in Kanban, I highly recommend subscribing to the Yahoo! Group...
Powered by Community Server (Commercial Edition), by Telligent Systems