views:

170

answers:

8

G'day,

While having a think about this question here about overdesigning for possible future changes it got me thinking.

What reasons against can you provide to people who insist on blowing out designs because "they might want to use it somewhere else at some stage in the future"?

Similarly, what do you do when people take the requirements and then come back with a bloated design with lots of extra "bells and whistles" that you didn't ask for?

I can understand extending a design when you know it makes sense for requirements or possible uses that exist either right now or in the near future. And I'm not advocating just blithely accepting a list of requirements and implementing that explicitly without providing any feedback on what you think may be missing.

I am talking about what to do when people insist on adding, or having, extraneous functionality so that "we might use it somewhere else at some stage in the future?"

+5  A: 

Plenty of good reasons on Wikipedia.

http://en.wikipedia.org/wiki/You_Ain%27t_Gonna_Need_It

  • The time spent is taken from adding, testing or improving necessary functionality.
  • The new features must be debugged, documented, and supported.
  • Any new feature imposes constraints on what can be done in the future, so an unnecessary feature now may prevent implementing a necessary feature later.
  • Until the feature is actually needed, it is difficult to fully define what it should do and to test it. If the new feature is not properly defined and tested, it may not work right, even if it eventually is needed.
  • It leads to code bloat; the software becomes larger and more complicated.
  • Unless there are specifications and some kind of revision control, the feature may not be known to programmers who could make use of it.
  • Adding the new feature may suggest other new features. If these new features are implemented as well, this may result in a snowball effect towards creeping featurism.

See also: http://en.wikipedia.org/wiki/KISS_principle

FogleBird
+1  A: 

It's a balance, as a rule I over design only where it's cheap to do so. For instance, I wouldn't write a function that takes in 2 parameters and adds them, instead I'd write a function that takes n-parameters and adds them. However, I don't write a function that takes n-parameters and adds them using assembly.

Adam Luter
+3  A: 

Especially on an embedded device, size is money (larger Flash part, say, which costs more and has a longer programming time at manufacture; or more peripheral components).

Even on a Windows application, the larger your application and the more features it has, the more it costs to develop; wait until you know what's needed and what's not and you'll waste far less money developing stuff that turns out not to be what was needed at all.

Also, any additional functionality brings with it the potential for bugs.

It's good to think properly about the requirements before developing something, but over-designing is often just borrowing trouble.

Vicky
The more it costs to develp _and maintain_.
Carl Manaster
@Carl: Good point.
Vicky
+2  A: 

Them: "We might use it somewhere else at some stage in the future."

Me: "Yes, we might. And we might not. And we can't know, now, in what ways we might want to. And if we do want it at some stage in the future - that's the time when we'll know the ways in which we want it. That's when we can write it with confidence. On the other hand, if we write it today, but never need it, we've wasted resources to develop something we didn't need. And we've added to our code bloat, so it's harder to find the pieces of our code base that are in use, because we've got all this (presently) unnecessary code crowding out the useful stuff."

Carl Manaster
+1  A: 

You say

I can understand extending a design when you know it makes sense for requirements or possible uses that exist either right now or in the near future.

and I guess that sometimes people see this line as blurry something that "makes sense" to you may be over-design to someone else.

Aidan
+3  A: 

In our team we just say "YAGNI". It reminds people why. There is MORE than enough stuff on the web about YAGNI if you think you need to collate it to provide a report.

Actually, having someone say "YAGNI" to you on our team cuts a little because it's like saying "C'mon; you know better than that", which always hurts a little. :)

Bernhard Hofmann
+1  A: 

Overdesign (solving a problem in a way that is more generic than needed) a specific piece of architecture is acceptable only if you can afford it.

If you accept extraneous functionality (which is generally speaking different from overdesign) you need - again - to accept the costs that come with it (time ==> money) - if you can't afford those extra costs then you got your answer :)

JohnIdol
+1  A: 

There's a big difference in providing for future functionality and adding future functionality. A good design should have the "hooks" or whatever to provide for new features or modifications.

There are two ways that you can possibly handle this situation. The first way is that if they are contractors and providing the software to you. You can simply refuse to pay for all of the extra functionality and impose very strict deadlines for your required functionality. If they miss the deadline then you impose financial penalties for every day they are late.

The other way is if they actually work for you. If this is the case then you can get rid of them or downgrade them in their performance reviews.

Mark