views:

1039

answers:

15

Does the functional spec help or hinder your expectations? Do programmers who practice the waterfall methodology, are they open to functional specs? I'm a web designer/developer working with a team of 5 programmers and would like to write a functional spec to explain what we need, so that when I begin my work - I know we are working towards the same goal.

+2  A: 

Another way to accomplish this is using user stories

bpapa
a user story is a "placeholder for a conversation with the stakeholder(s)", it is NOT a specification of any kind. a user story after the conversation plus unit test descriptions IS a specification
Steven A. Lowe
+7  A: 

I work with mostly the Waterfall model, and solely with functional specs. When working on my own (where I can set my own model and program any way I want) I start by writing up functional specs and then implementing them. It gives me a much better idea of the size and scope of the work, helps me estimate the time involved, and helps ensure that I don't miss anything.

Also, you can pass this document to:

  1. Users so that they can make their requirements clear
  2. Developers to create the functionality
  3. Testers to make sure they are testing the right thing
  4. Architects so that they can analyze the requirements

Using functional requirements over user stories is a matter of preference and the scope of the project. If you have a small user base, then you may be able to get away with user stories (which outline various event sequences the user might do), but for larger projects, you should use functional requirements as they have more detail and lead to fewer misunderstandings. Think of them as a means of communication with all people involved in the project.

Elie
A: 

It depends on the functional specification. I've had functional specifications where the writer knew the system inside and out, and wrote the specification as such, and I've had other writers write it with just what they expected to see as a user.

With the former, it's easier because I know exactly what I need to write and where I need to write it, but it limits how easily I can refactor the existing code, since estimates took into account just this feature, and not refactoring existing code that it touches.

With the latter, I have freedom to refactor (so long as end functionality is the same), but if it's a system I'm unfamiliar with, the time estimate is harder to make.

Overall, I love functional specifications -- I also like to remind people that they're written on paper that bends, and as such, should be flexible.

George Stocker
+5  A: 

Frankly, the Functional Specifications should already be part of your Big-M (Waterfall) methodology. Your functional specification is WHAT you are going to build; not necessarily how you are going to build it (which would be your detailed design/specification and the next step in the waterfall).

If you haven't written one yet, stop what you are doing and write one. You are just waste time if you do otherwise. You can start here with Joel's article.

CodeSlave
+1  A: 

I find well-written functional specs very useful. A well organized functional specification can also help organize your tests (many-to-many mapping from individual requirements to test cases).

<p style="tongue: in-cheek">They also prove useful for finger-pointing in larger organizations (The requirements were inaccurate! The implementation didn't follow the requirement! QA didn't properly test this requirement! etc.)</p>

Ates Goral
+21  A: 

I won't start any freelance project until I've got a design spec and functional spec written up and signed off. There's too much room for rogue clients to nickel and dime you to death if you don't have it. The functional spec allows you to stay on target/focused and gives you a natural check list to work to.

If there's no functional spec then you get all the "what ifs" starting to creep in and developers thinking - you know, this would be useful, and it'll only take me an hour. Sure an hour to code the prototype and get it basically working - plus the day to design all the tests and make sure all test cases are covered, then another couple of days to iron out all the bugs, then time to write the documentation. There's far too much room for what seems like a trivial addition to be inserted when there's no spec. You've no doubt heard of the infamous "scope creep". There's also far too much room for clients to say "that's not what I wanted..." when you deliver it and try and wriggle out of paying you.

If you've got the design spec and the functional spec written up ahead of the development and both you and the client have signed off that your understanding of not only the basic details but all the nuances of the language used is one and the same - only then can the real work begin.

There are a couple of anecdotes out there the first is quite true, while the other is a common misconception:

  • Software development is only 15% about the code, the rest is resource/people management.
  • It takes 20% of the time to complete the first 80% of the project and the remaining 80% of the time to complete the last 20%.

The misconception is that a working prototype is 80% of the way there - don't be fooled, it is not. So it's easy for a client to say "what's taking so long, I thought you were almost done!" and then quibble that they're paying too much for something that should've been finished months ago. Some of the design methodologies out there really lend themselves well to this popular misconception. The waterfall design methodology is one of them if it's not used correctly.

My view is make sure your understanding is the same, both sign off. Set milestones and make the client very aware at the outset that prototypes are a long way from the completion of the project and set expectations right from the outset as to what those milestones are and when the client can expect to see them delivered.

For project managers of development teams documentation and expectations are everything. You can't live without it, it's the only form of recourse you have against "That's not what I said" or "That's not what I meant" and ergo "I'm not paying you".

I learned from a lot of mistakes made by far more qualified developers than me and saw what it did to them. The two most important documents for your project are the design spec and the functional spec. Don't leave home without them or it can [or most likely will] come back and bite you in the ass.

Addendum re: User Stories:

An additional note about user stories is that they're great for what they are. They should be included in your functional specification but shouldn't be your functional specification.

A user story only describes a single task. It is very lightweight and doesn't contain excessive detail. As the common recommendations go, it should fit on a 3x5 card...if you as a project manager handed me a 3x5 card and told me to write a piece of software based on what I read, no doubt it would be handed to the user at the end and they'd tell the project manager that's not what they wanted.

You need a far greater level of detail in a functional spec. It shouldn't be limited to basic workflows. A functional spec is a whole bunch of user stories along with notes on interpretation of those user stories, improvements that can be made to them, common tasks that can be combined to improve efficiency. The list goes on.

So user stories are a good beginning, but they're not a replacement for a functional spec, they're bullet points in a functional spec.

BenAlabaster
Totally agree ... nice rant.
John MacIntyre
Excellent answer. Thanks!
jrutter
Agree wholeheartedly. Next time a project manager says 'high level specs' you have my permission to head-butt them.
ConcernedOfTunbridgeWells
a user story is a "placeholder for a conversation with the stakeholder(s)", it is NOT a specification of any kind. a user story after the conversation plus unit test descriptions IS a specification
Steven A. Lowe
@Steven - that was my point... I guess I should make that clearer
BenAlabaster
+3  A: 

It took me more than 10 years to get it beat into my head to write a functional spec before doing any code. Now I will write one for anything taking more than a day to write. The level of detail, and level of assumptions should be as much as needed to clearly define what needs to be done and communicate it to others (or remind yourself), anything beyond that is a waste.

Others prefer User Stories ... which is fine too, as long as you do some kind of planning.

John MacIntyre
A: 

I have seen and written many specs, some were very good, most weren't. The main thing that they all had in common is that they were never followed. They all had cobwebs on them by the 3rd day of coding.

Write the spec if you want, the best time to do it is at the end of the project. It will be useless for developers to follow but it will at least be an accurate representation of what was done (I know- not really a spec). But don't expect the spec to get the code written for you. That is the real job. If you don't know what to write talk to your stakeholders and users and get some good user stories and then get on with it.

Andrew Cowenhoven
agree with your first part but -1 for the idea of doing the spec at the end...you might as well make the code the spec in that case. no spec = no design.
frankodwyer
don't agree with anything beyond the first sentence. Where I work, we always follow specs, and I haven't seen them collecting cobwebs. If you don't do them at the beginning of the project, why are you bothering with them at the end? Who are you writing them for?
Elie
@frankodwyer: yes you got it. No design, at least not in the traditional sense. See Martin Fowler: "Is Design Dead".@Elie:Glad to hear it, you got a good job. My experience: they are equally useless written at the beginning or end. At least they are accurate written at the end.
Andrew Cowenhoven
+1  A: 

I'll second Codeslave's reference to Painless Functional Specification. It's a good series of articles on specifications. See also this Stackoverflow post for a discussion on what content to put into functional specs.

I've done a few large projects, including one with some hundereds of person-years of total effort. As a project team gets larger the number of informal communication channels goes up with a quadratic upper bound. Without a spec this informal communication mechanism is the only way things can get communicated. With a spec, the communication channels approach a hub-and-spokes, making the growth more like a linear function of the project team size.

A spec is really the only scalable way to to get the team 'singing off the same hymn sheet'. There should be some review and negotiation about the spec, but ultimately someone has to take ownership of this to avoid the project becoming a free-for-all.

ConcernedOfTunbridgeWells
A: 

One interesting substitute for a func spec or user stories that I have seen advocated is to write a user manual for the software first.

Even if this is only notional (i.e. if you do not intend to ship any manual - which you probably shouldn't as nobody will read it), it can be a useful and reasonably lightweight way to reach a common understanding of what the software will do and look like. And it forces you to do the design up front.

frankodwyer
A: 

Whether you call them functional specs, business requirements, or user stories, they are all very beneficial to the development process.

The issue with them comes when they are chiseled in stone and used as a device to pass blame around when the system utimately doesn't fit with the user's real needs. I prefer to use the functionals or requirements as a starting point for an iterative process not as the bible for exactly how the system will look when it is complete. Things change, and users typically don't have an understanding of what they want until they have something (a working prototype possibly) in their hands that they can work with instead of conceptualizing on a piece of paper how it will function in the real world. The most successful projects I've implemented were ones where the development team and the users were closely aligned and were able to rapidly turn around changes instead of holding people to what they wanted on a piece of paper six months ago.

Of course this process wouldn't work if you were in a fixed-bid type of situation as one of the earlier answers pointed out.

coleca
+1  A: 

I think they're a lovely idea, and should be tried.

Charlie Martin
Wasn't that something like what M.K. Ghandi said about Western civilisation?
ConcernedOfTunbridgeWells
Damn, and I thought I'd gotten the serial numbers cleaned entirely off.
Charlie Martin
+1  A: 

Just a few comments on some of the answers here...

First of all, I do believe that a good spec document is important for any moderatly complex requirement (and definitly for highly complex ones). But make sure it is a good spec i.e. don't just state the obvious (like one poster already mentioned) but also don't leave out those parts that may seem trivial to you (or even the developers) since you might have more knowledge of that part of the system than some others involved (e.g. testers or documenters) which will appreciate the otherwise "missing bits".

And if your spec is good, it will get read - in my experience (and I've written and read lots of specs over the last years) it's the bad specs that get dumped and the good ones that get followed.

Concerning user stories (or sometimes also called use cases): I think these are important to get an idea of the scenario, but they usually can't replace the details (e.g. screen mockups, how where and if a feature is configurable, data model, migration issues etc.) so you'll probably need both for more complex requirements.

ISW
+1  A: 

In my experience, functional specs have a fine line between not saying enough and saying too much.

If they don't say enough, then they leave areas open to misunderstanding.

If they say too much, they don't leave enough "wiggle room" to improve the solution.

And they should always be open to a process of revision.

Mike Dunlavey
A: 

I've found that even if you write Functional Specs a lot of the detail is sometimes lost on the person you are trying to address. Now if a Functional Spec is written along with some kind of UI mockup, that makes a huge difference. UI mockups not only show the user what you are envisioning, it also triggers users into remembering things they wouldn't have thought off in the first place.

L. DPenha