views:

194

answers:

7

My team is building a product that has a lot of components that rely on each other. For example, whenever we add a new type of data to the system, we also have to add logging code to track the changes that use that data type. Or, when we add a new UI screen, we have to make sure that its strings are externalized so they can be translated. These things slow down almost every task we do, and sometimes one of the the steps gets forgotten.

The traditional way to handle this problem is to add required checklists and documentation and things like that. How do Agile methodologies handle it?

+5  A: 

The design you describe sounds like it might be a little too tightly-coupled. A renewed focus on enterprise patterns (such as Inversion of Control, programming to interfaces, etc) could help a lot.

If you are doing pair programming, you should be checking each other's work, making sure all of the i's are dotted and the t's are crossed.

If you are doing Test Driven Development, your tests should not be passing until all requirements for that particular portion of the development effort are satisfied.

If you are developing a large, complex system, you need experienced developers who understand the design and development process. You may also need a hands-on (read:coding) architect who can oversee the whole process.

Oh, and checklists (despite their traditional nature) are good too.

Robert Harvey
Thanks for the suggestions. They make a lot of sense.
Josh Yeager
A: 

Have cross-component teams. That way when you add some functionality, the member(s) from the logging component will update their part and the translator(s) will update the strings.

vladhorby
+1  A: 

Depending on your IDE there are various tools to help identify strings that need to be externalized, but if you are in a habit of just not putting in static strings this can be avoided.

If you need to add logging I would suggest AOP, as, at some point you will want to remove the logging code and you risk breaking the application.

But, a long-term, complex system is ideal for agile development, as, while you are developing, the needs of the client/customer may change, and you can adapt to it.

You need to ensure that the customer has feedback on a regular basis (ideally daily, and in a perfect system the customer has a rep sitting by for questions).

When I have many steps that must be done, esp for something like datatypes, I will resort to using a spreadsheet, so, you add a datatype, you add a row to the spreadsheet. Then you can track everything that needs to be done before that datatype is completely added to the application.

James Black
+1 for suggesting AOP. That was my thought too!
TrueWill
A: 

I think it is important to understand that Agile methodology is only a process framework, not a process in itself. For example it says to follow test driven development and do pair programming but it does not say how to write the tests, or suggest a review checklist or suggest a coding guideline or say what documents to write. Those parts are entirely upto you or your organization to define and follow.

When planning a feature, you can add a engineering task called "review" and allot time for it. You could do the review task in whatever way works best for you and your organization. If pair programming doesn't work as well as a formal inspection for you, you should do formal inspections.

trshiv
+4  A: 

I'd suggest reading Alistair Cockburn's "”Agile Software Development: The Cooperative Game" - he takes quite an intelligent approach to Agile that's largely "do what gets the job done". That might help you work out how to get some kind of checklist / documentation into what you're doing without making everything horribly top-heavy.

Could some of your problems be solved by better tests? When you talked about not doing things that need to be done, my first thought was "why hasn't a test failed?" Maybe you need to look at tools for testing user interfaces? (edit: or even some small script on commit that greps code for whatever indicates the need for translation strings and checks against the files with the translations in?)

Also, can you change your design so that it's both less coupled and "forces" you to do the right thing. Perhaps making those data types implement a logging interface that the logger delegates to, or similar...?

andrew cooke
+1 for mentioning Alistair Cockburn's wise words "do what gets the job done" (Agile is a lot about common sense). And +1 for "why hasn't a test failed?". Sadly, I can't upvote twice.
Pascal Thivent
Thanks, I'll check out that book.Making the design less coupled makes a lot of sense, but I'm not sure how tests would catch things like forgotten logging. If the developer forgets to add the logging code, then they're probably going to forget to write the test too.
Josh Yeager
Well, I can't address your exact case, but if you have several of something, and logging should happen for all of them, then a test might cycle through all the things, in some way, checking that the amount of logging is proportional to the number of different things.Writing a test like that is a bit of a pain, but it would be worth it if this is a problem.
andrew cooke
A: 

Do what needs to be done, but not more:

  • better definition of done (the definition of done is a kind of checklist to me),
  • better testing,
  • "just enough" documentation (Agile != no documentation),
  • etc.
Pascal Thivent
A: 

Well, where I work we have QA that can catch some of the bugs if there are missing requirements or something slips through. I'm not saying the development team is intentionally putting in bugs, but as a codebase grows, it becomes harder and harder to remain nimble and thorough in checking everything.

Wikis can be useful for capturing methods used to try to get the clearest requirements. By clear I mean that the story card isn't likely to list all the requirements and that there may be discussions with an end-user or business analyst to get their understanding of what is desired. Part of our sign-offs involve getting an end-user to see the functionality and approve it before moving from the development environment.

Once every handful of sprints, we may have most of a sprint devoted to bug fixing/refactoring so that things can be cleaned up that would otherwise not get done as they aren't likely to be important. This can be cosmetic bugs or broken windows that while they have little business value initially can be useful in the long run.

JB King
The project owner should be aware of changes in requirements, and there should be some acceptance tests that the developer, or can be run nightly, to help ensure that the expected results are there, otherwise the system is flawed anyway, and it isn't too agile.
James Black
While I can agree that the owner should be aware of major changes, there can be the hangup of that being a committee of top executives that may not care for the little details which can happen frequently when requirements are vague and finger pointing follows when one tries to clear up any misunderstandings. For example, in putting in a new CMS, is that committee of top executives supposed to review every time the codebase is changed? I'd think no, but that's what has been done in our current project that has been going for over a year now that is what the OP is asking.
JB King