views:

173

answers:

6

Lately I have seen our development team getting dangerously close to the 'second system syndrome' type ideas while we are planning the next version of our product. While I'm all for making improvements and undoing some of the mistakes of our past, I would hate to see us stuck in an endless loop of rewriting and never launching anything.

Is there a good design / development method that lends itself to building a better version 2.0 while avoiding second system scenarios?

A: 

Focusing on the system architecture should help e.g.

  • Having documented interfaces which support "loose coupling" between sub-systems
  • Having documented design decisions (avoid re-hashing previously beaten paths)

Hence, without going for an all out swap, the current system can be "upgraded" with more appropriate interfaces to help future growth.


Another good way to focus: assign a $$$ figure to each feature and prioritize accordingly ;-)

Anyhow, just my 2cents

jldupont
Isn't that the problem - it's easy to focus too much on re-architecting the system, rather than getting the enhancements/bug fixes for 2.0 done?
Dominic Rodger
+2  A: 

"I would hate to see us stuck in an endless loop of rewriting and never launching anything."

Which is why people use Scrum.

  1. Define a backlog of things to build.

  2. Prioritize, so that things which lead to a release are first. Things which should be fixed are second.

  3. Execute sprints to get to the release. Execute a release sprint.

S.Lott
Thanks for the answer, I chose it as correct because it is concise but gets the workflow across well.
Wally Lawless
+2  A: 

Try to focus on short delivery cycles, i.e. force yourself to deliver something tangible and useful to the users every few weeks or month. Prioritise the tasks based on their value to the customer. This way you always have a usable, functional application with satisfied users, while under the hood you can refactor the architecture in small steps if you wish (and if you can justify the need for it - that is, towards management / the customers, not just teammates!).

It helps a lot if you have a stable build process with a good suite of automatic (unit / integration) tests.

Agile development methods like Scrum do this, and they are warmly recommended. But of course it is not always easy or even possible to adapt such a method in your team. Even if you can't, you can still take elements of it and apply it to your project's benefit (maybe without even mentioning the words "agile" or "Scrum" publicly ;-)

Péter Török
+2  A: 

Get someone who has written at least three systems to lead the project.

Nat
+1 Hiring someone who has successfully built a similar solution is up there in my top 10 best project management practices.
anon
A: 

Make sure you document the requirements as well as possible. While obviously you need to also manage what gets into the requirements to avoid over-designing, having a fixed scope helps prevent developers from running off with ideas or gold-plating what needs to be done and it helps keep management or clients from introducing scope creep. Define all requirements and how scope changes will be addressed.

I'm all for short development cycles (make sure you're writing tests) and agile methodology, but neither of those is a shield against second syndrome system. In some ways it's easier to keep adding on feature after feature if you're working in short sprints without stopping to look at the overall picture. Use agile practices to build the simplest thing that works, then keep adding your other requirements as simply as possible. Remember YAGNI, because when you build a system a second time, that's when you're most likely to build something you're sure you'll need at some point, something that will make the system "extensible" so there never has to be a third build. It's the best of intentions, but the road to hell and all that.

Tom
A: 

I up-voted S. Lott's answer and would like to add some more suggestions:

  1. Deliver a working product to your customer as frequently as possible. Iterations lasting between a few weeks and 2 months are ideal. Agile methodologies, such as Scrum, lend themselves well to this.

  2. Use FogBugz for feature and bug tracking. Its features are very practical for agile projects. FogBugz allows easy prioritization according to releases and priorities. If your team enters their estimated levels of effort for each task, you can also use this to calculate reasonable ship dates.

  3. Prioritize which features you will develop according to the 80/20 rule (20 percent of the features will be used 80 percent of the time) and the most bang for the buck. This helps keep the system as simple as possible, helps prevent feature bloat, and saves development and testing time.

  4. Give similar thought to both new features and bugs when you determine the priority of an issue. One point of the Joel Test is "Do you fix bugs before writing new code?". In most shops this doesn't happen, but do not make debugging the system an afterthought. Also, keep a working copy of the old system to compare against when bugs are found on the new system.

  5. Also factor in the level of effort required to maintain, and if necessary rewrite, existing code. If you have not already done this, give the team some time to code review whole files that they find troublesome to change. If the system's code was difficult to maintain the first time, this will only get worse and cause your team to spend more time on new features down the road.

David