LINQed IN

Blog by Troy Magennis on Software Architecture, Development and Management

About the author

Troy Magennis is a software developer living in Seattle, WA. Troy is a Microsoft MVP, the author of many articles, and the founder of HookedOnLINQ.com, a LINQ specific wiki reference site.
E-mail me Send mail

Disclaimer

The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2008

CodeCamp 2008 Seattle Notes

I was fortunate enough to attend Code Camp in Seattle last weekend. It was great to see the event attended by around 300 keen developers.

I took notes throughout some sessions, and posted full details the HookedOnLINQ.com website.

By far, the Parallel LINQ session was a standout. I was surprised just how cleanly the ParallelFx team have committed to making multiple processor development mainstream. This is a library and feature set that is important to watch.

Troy.


Tags:
Categories: C# | LINQ | Resources
Posted by t_magennis on Thursday, January 31, 2008 4:42 AM
Permalink | Comments (0) | Post RSSRSS comment feed

Prioritizing and Assigning Scale to Feature Lists and Bugs Efficiently

Sorting, prioritizing or ordering features and business objectives (or tasks, or bugs, etc) with a large group of stakeholders can be painful. Often the loudest voice in the room gets there way; some people just sit in the corner too scared to raise their objections. After sitting through many of these, I thought I’d post some ideas for improving the experience, accuracy and interaction –
  1. Do a quick read through of all the items to set the room to a common definition and understanding of the terms and items being discussed
  2. Clearly post the definition of each scale on a poster/whiteboard in clear view. If you are the moderator stand near it to re-affirm the definitions during discussion
  3. People can assign the boundary conditions quicker than the middle territory. Often a quick pass through the list solely to assign the top rating or the bottom rating (in, out, will, won’t, etc). This process also warms the group up and gets the blood flowing. It is important that if there is ANY dissent, that item be skipped
  4. The moderator should keep an eye on if someone isn’t contributing and focus a question for opinion in that person’s direction when the domain would suit (especially if it is an “obvious” yes or no). This is also a way of making sure a dominant personality gets slowed down in driving an agenda
  5. People get better at the process through experience. At regular intervals, revisit a subset and ascertain the group still feels the same way
  6.  After each break (at least every 1 hour), re-evaluate the last few items to “re-synch” people’s barometer. Depending on the time of day or the day of the week (or the amount of caffeine here in Seattle) – people can change their votes

The prioritization process is absolutely central to any agile process. Making sure you get accurately reflected priorities with large group can be very challenging.

Troy.


Posted by t_magennis on Wednesday, January 16, 2008 4:50 AM
Permalink | Comments (0) | Post RSSRSS comment feed

Lean Architecture - How much up-front architecture is needed in a Agile project?

How much up-front design or architecture to do in an agile project is always a contentious issue. Having the job title with "Architect" in it makes me personally biased; Having a background as a developer and product manager in successful agile XP gives me a huge respect for agile development practices and somewhat balances my development approach. This posting tries to define my current view on how to balance good up-front architectural planning (minimal, but where it counts) and how to assess whether more or less architectural oversight needs to be applied during a project through intervention.

Many agile scenarios promote that a project be split in a set of features; These features prioritized into milestones by the "Customer" and then these features be worked in in almost a serialized fashion. The focus is on completing the current feature, whilst promoting that refactoring be the tool of choice when a later feature adds or alters a previously signed-off complete and closed item.

I can see some issues with this when followed blindly. My definition of "Refactoring" centers on improving currently functional code with lessons that emerge throughout a project. What I see in many projects is that "Refactoring" is the title given to an almost rewriting of a previously closed feature because the number and scope of changes to keep it operating in the face of the new feature. This is bad, and it is seriously affecting development velocity.

Here is my proposed compromise, that allows features to be built in (semi)-ignorance of future features, whilst still allowing for intervention if a pattern of serious re-writing (or refactoring if you want to water the terminology  down) begins to affect velocity -

  • Up-front architecture that should always be carried out as iteration 0 of any project includes anything that WILL BE NEEDED for EVERY feature (or requirements that will cause a registration of almost every feature that has already been completed). This includes technology choices, communication and integration patterns, operational requirements like logging, deployment strategy and localization requirements can be used as a starting list.
  • At regular intervals (e.g. 1/4, 1/3, 1/2, 2/3, 3/4) of the way through features in a project analyze the task breakdowns of the latter features to determine if there is a class of task that might be eliminated by an architectural building block or by more holistic design/planning

It is the second bullet point I want to discuss further in this posting.

My boss David Anderson run a pretty tight Lean Software software development department. A lot of the lean principles are facilitated by using a Kanban tracking system (and its electronic counterpart being the data captured in Microsoft TFS). The data captured is very thorough and used as a management tool in determining progress, bottlenecks and general project health. My goal is to use the feature and tasks completed so far to assist in determining where architectural intervention or more up-front planning could avoid that class of task being necessary in future work.

Lets look at an example - In a current project that is very integration heavy with a large ERP/CRM system, that our lack of solid planning for the interface specifications (which weren't ready when we started, but are available now) is cause way too much rework as we move through the features in a linear fashion. It way pay dividends in team velocity to introduce a feature right now that looks at the spectrum of interface specifications we now have and strawman the entire message / web service interfaces. If this reduces the number of tasks in future feature that would have revisited completed interfaces and added that extra field, or changed that database schema - improved velocity is inevitable.

But there is a balance - striving for perfection in this planning intervention would also be catastrophic to feature completion velocity. Going overboard with architecture is just as evil as sticking ones head in the sand and simply working longer hours or hiring more developers to close the backlog gap.

Be interested if other teams have analyzed task types to look for patterns or work that might be eliminated by a targeted architectural focus.

Troy.


Posted by t_magennis on Sunday, January 13, 2008 4:52 AM
Permalink | Comments (0) | Post RSSRSS comment feed