Slashdot Mirror


What Makes a Good Design Document?

dnnrly asks: "I've been writing software professionaly for a couple of years now for more than 1 company and I've noticed a recurring pattern: I get put on a new project that already has a bit of history and I get told to read the design documents and then implement XYZ. What happens is I read the document, find that it gives me a lot of information about certain aspects of the system we are building, but leaves huge gaps in others. We're going to be rewriting some of the procedures very soon and I'll be able to influence the software side so I wanted to ask Slashdot readers what sort of things have they seen in design documents that they've liked/thought are a good idea? What have they found works and what doesn't? If all else fails, where's a good place to find all this stuff out?" "There's usually a very defined and rigid format for every design document and the writers have obviously tried very hard to make sure that procedure has been followed, generally leading to an almost unreadable doc or a design for the sake of it. Part of the issue is that these guys have written the design after 2 or more years exposure to the problem so they tend to forget just how much they know."

461 comments

  1. Existence by Soskywalkr · · Score: 2, Insightful

    As opposed to some napkin smudged with barbeque wings...

    1. Re:Existence by Anonymous Coward · · Score: 0

      How can the first post be redundant?!?!

    2. Re:Existence by Cigarra · · Score: 1

      How can the first post be redundant?!?!

      It was just punished for being simple... and not posted by the *moderator*.

      --
      I don't have a sig.
    3. Re:Existence by Anonymous Coward · · Score: 0

      How can the first post be redundant?!?!

      Uh, by stating the obvious?

    4. Re:Existence by Anonymous Coward · · Score: 0

      How can the first post be redundant?!?!

      Well, it's the first post, and all it says is "first post"... do you see where the redundancy lies?

    5. Re:Existence by Rick+the+Red · · Score: 0, Offtopic
      How can the first post be redundant?!?!
      As of when I post this, it has the following moderation:

      Starting Score: 1 point
      Moderation +1
      40% Underrated
      20% Offtopic
      20% Redundant
      Extra 'Insightful' Modifier 0 (Edit)
      Total Score: 2

      Please tell me how that adds up to "+1 Insightful"

      --
      If all this should have a reason, we would be the last to know.
    6. Re:Existence by Rick+the+Red · · Score: 1
      To the moderator who rated the parent post "Offtopic": First, the topic of the thread was the moderation of a comment, so the post was on topic.

      Second, as long as Slashdot refuses to provide a forum for discussing problems with Slashdot itself, including the Slash code, then all discussion of Slashdot itself is ON TOPIC no matter where it occurs.

      --
      If all this should have a reason, we would be the last to know.
    7. Re:Existence by NateTech · · Score: 1

      At least you got the napkin!

      --
      +++OK ATH
  2. "What is software design?" by tcopeland · · Score: 5, Informative

    Here's the classic article by Jack Reeves.

    1. Re:"What is software design?" by MrAnnoyanceToYou · · Score: 1

      After reading the document, I can't help but notice that it's highly possible that things have changed in the last 13 years. Is it possible that the large number of 'QA' style positions I see available in my area (Greater Portland, OR) are an expression of his slowly being proved right? Is this the marking of an industry shift towards code as a real commodity?

      As a side note, this document is all about C++ as an object oriented programming language. My question is whether software development can now be done so quickly (I have heard commentary from people saying they are outputting 10k lines of code in a day with Eclipse) with more effective hardware / software that design and code will eventually merge.... One has heard that the ideal design document creation software would be one that could make not just a mock-up but a working piece of code on spot, and many posts are mentioning steps towards this. How far off is this kind of software?

    2. Re:"What is software design?" by Anonymous Coward · · Score: 0

      Well, although things have changed massively since the days when the article was written, the problems associated with developing with C++ are still with us today regardless of the language that one is using, totally safe languages being no exception.

      It's true that a C++ bug could very easily blow your whole leg off, while a similar bug when scripting in Perl or Python etc would only dent your ego. The lesser extent of bleeding doesn't change the fact that a bug is a bug though, and equal care has to be taken whatever the language if the goal is to get the end product working correctly.

      It's possible that modern languages may require slightly less documentation but that is only because they can do more in a given number of lines of code. It's nothing inherently magical about them.

    3. Re:"What is software design?" by bstil · · Score: 2, Informative

      Joel on Software has another set of relevant articles. See "Painless Functional Specifications" and "Don't Let Architecture Astronauts Scare You."

    4. Re:"What is software design?" by vmaxxxed · · Score: 1


      A Classic ?, this guy is just a classic cowboy programmer with 0 project management skills.

      Excuse me, but I've heard this BS for more than 15 years. Fact is that software projects are just like any other project. In my experience, in any kind of project, the success is more related to proper planning and experience than sheer building skills. This is like saying that a construction worker can learn to build a house as good as an Architect, or that the guy at the repair shop can build a car.

      Problem is that software is very new, and it is evolving very quickly. We are still in the infancy of good software design tools and notations, and we still do not have the experience to make designs right all the time. But, to take the extreme position that software is different in "nature" from any other endeavor, and hence not planning and formal agreements are required, is ludicrous.

      The reason that OO and C++ are so successfully is not an oddity as it seems to this guy; it's a normal result of our better understanding and more experience in software design, that is being translated into better design techniques. To put it simple, OO and C++ are successful because they let you introduce and enforce design decisions into the code, period. Why is this so important? Because, that way, the guy with the big picture has the tools to communicate this "Big Picture" to the workforce. Of course, this "Big Picture" requires years to experience to see, and for inexperienced people or small projects, these extra complications might seem unnecessary, and hence, articles like this trying to explain them.

      Of course, these kinds of arguments always come from the junior programmer that was part of a failed project, and he thinks he knew "the right way" all the time. Of course, there are always all the explanations you want for failure. And let me even conceded that, yes, may be the junior programmer had the technical solution. But the reality is that in modern medium sized projects, there is no way to know all the details of the whole design at a level that could let you write the code yourself. Either you design or abstract modules at high level, to coordinate the construction at high level, or you code a module and only worry for the actual coding details for that module and leave the overall design to others.

      To assume that "Coding is design" and that no formal planning is required to start working only indicates that this guy has never tried to work with more than 2 or three people, let's no add on top that programmers are especially difficult to handle.

      In conclusion, this article claims of how cheap software is and how actual coding is more important than separate design only reveals the limited experience and project management skills of the Author.

    5. Re:"What is software design?" by EnderWiggnz · · Score: 1

      How the fuck is software a "new" thing? Last I've checked moden programming has been around for 40 years, and modern languages for at least 30. Why is this attitude of "its brand new, oh my god we dont know what we're doing??!??!" still prevalent?

      and as for your prima-donna programmers, they need to grow the fuck up, this isnt highschool anymore.

      --
      ... hi bingo ...
    6. Re:"What is software design?" by stonecypher · · Score: 1

      Someone should tell that site how to spell bleeding.

      --
      StoneCypher is Full of BS
    7. Re:"What is software design?" by vmaxxxed · · Score: 1

      I am sorry if my use of language was a little bit rough. I didn't mean any disrespect.

      I understand your position. But 60 years is nothing, compared to most engineering practices.

      Formal architecture has been around for like 4,000 years, naval technology almost the same, including navigation and charting. "Recent technology" like steam machines and gas machines more than 200.

      Ship building, architecture... all of them had passed through several major different construction styles and design approaches. There have been as many kinds of buildings as different types of boats.

      In the other hand, computer programming didn't become widely used until the Apollo program, and that was in the mid 60s, that's just 40 years ago. Even the initial space projects like Soyuz or Mercury didn't have a computer. Comparatively, to this day, there are very few different design and construction approaches, OO is almost universal, and that cant be enough.

      So, I have to disagree, even 60 years is nothing compared to other human endeavors, like architecture and ship building, not even compared to airplanes.

    8. Re:"What is software design?" by EnderWiggnz · · Score: 1

      however, widespread electrical use is 100 years?

      And somehow, they have managed to get their shit together, and acredit and build their profession.

      i really think that its time that software engineering grew up and starting policing its own ranks.

      sorry about my earlier tone, too.

      --
      ... hi bingo ...
    9. Re:"What is software design?" by syousef · · Score: 1

      I find the classic definition niave to say the least.

      Here's the thing - the design decisions you make will ultimately be tradeoffs. By designing one way or another you'll limit some abilities of the system to change in certain ways, while enhancing its ability to change in other ways.

      I see it all the time in UI design. The customer wants something added or things to work in a particular way for a particular screen. But the whole system has been built around a GUI framework that works a different way. Suddenly that one simple change is VERY hard and time consuming.

      Therefore it makes sense to FOLD THE DESIGN INTO THE REQUIREMENTS AND GET EXPLICIT CONSENT FROM STAKEHOLDERS THAT THESE TRADEOFFS ARE ACCEPTABLE.

      This should be done throughout the development process. Users, Business Analysts etc. need to know what decisions you're making and you need to communicate them in easy language - this is not an easy thing to do.

      A more technical example:

      You can use a Builder pattern to translate a document from one format to another - this makes your system more flexible because you can add conversions to other forms of document more easily (and the requirements could change at some future point to require that.

      But you've also increased the complexity and perhaps reduced performance of the conversion (which may be important if you suddenly have a change to requirements which stipulates that you have to convert lots of documents quickly).

      Should you use the builder pattern? Perhaps, but either way you should let all those concerned know which way you've gone and what that means for them if they change their mind about requirements.

      --
      These posts express my own personal views, not those of my employer
    10. Re:"What is software design?" by ewillyb · · Score: 1

      Hmmm, the "classic" article, What is Software Design?, by Jack Reeves, rests entirely on the notion that what everyone else calls development and testing, Reeves calls design. And the actual design -- that is class, entity relationship, data flow, state transition, and sequence dgms -- Reeves feels is simply unnecessary.

      I can appreciate that detailed design is often overtaken by events during development and that sometimes the best approach is to code and refactor/refine, test, and repeat. But does that obviate the need for a true design phase for a project with any complexity?

      And why can't Reeves just stick to the generally accepted lifecycle terms (design=blueprinting, dev=coding) to make his argument.

      SHAKY STUFF, classic or no.

    11. Re:"What is software design?" by Mufasa245 · · Score: 1

      The "auxiliary documentation" that is mentioned at the article being kept up-to-date and reflecting code changes is now implemented as javadoc and its competing technologies like Doxygen or phpDocumentor.

      --
      Mufasa http://www.firetiger.net/
  3. Design Document by goretexguy · · Score: 5, Funny


    Dee..zin...dok...u...ment...?

    1. Re:Design Document by Anonymous Coward · · Score: 0

      The immediate response that came to mind was

      "Lee-la Dallas Moolti-pass"

    2. Re:Design Document by Anonymous Coward · · Score: 0

      thank you, i really wanted that coke snorted all over my shirt

    3. Re:Design Document by Anonymous Coward · · Score: 0

      awesome movie... watched that again the other day. It is Lelu though... she is teh hot!

    4. Re:Design Document by Anonymous Coward · · Score: 0

      It's funny cause it's true.

    5. Re:Design Document by dubl-u · · Score: 1

      Dee..zin...dok...u...ment...?

      I know you were trying to be funny, but I think that's exactly the right question to ask.

      The poster starts out with the assumption that the best way to get up to speed on a project is reading documentation. For most projects, I think that's wrong.

      I have seen a lot of projects over the years, and I've never seen one with good, up-to-date design docs. I used to think that lack of docs was wrong, and that people needed to reform. But lately I've come to think that maybe the people were right, and my idea was wrong. If the goal is to bring somebody up to speed quickly, a week or two of pair programming with other team members will do much more than a lot of time wasted reading and, worse, writing docs.

      If that isn't enough to get somebody started, I have to wonder if there's something wrong with the code itself. I'd much rather see the effort people normally spend on docs go on writing beautiful code and tests. On too many projects, the docs try to compensate for opaque, poorly structured code. It's like somebody has a dog that poops all over their house, and their solution is to wrap the turds in Christmas paper.

      The one time I think programmer-written design docs are still valuable is at the end of a project. If I won't be around to introduce the next people to pick up the code, I like to write something explaining the big picture: what technologies we chose and why, what the architecture is like and how we got there. If we've done our job right, the details should be in the code and the test cases. But a good overview can help the new team get oriented.

    6. Re:Design Document by RFC959 · · Score: 1
      I'd like to approach your comments from another angle. Most of the people here seem to be programmers, which is understandable. Design documents aren't just for programmers, though; they can also be useful for sysadmins. As a sysadmin, "learning by looking over the shoulder" is useful, but I don't think it can or should be the primary method of knowledge transmission. For one thing, you may not have someone's shoulder to look over when you get paged at 2am! (Something you soft programmers sleeping comfortably in your beds never have to worry about! Pah!) For another, it can take a lot of looking over someone's shoulder to learn a complex system. A week or two? I think that would only work if the system is already logically consistent to a high degree...but that probably came from having a good design plan. (Or possibly from being trivially small.) It's also conceivable that everyone who worked on it before was a ninja who was extremely thoughtful and conscienscious in everything he did, but how many projects like that have you gotten to work on?


      I agree that existing documentation is often not very good, but I see that as a failure of the document-writers, not of documentation in general. Documentation and plans are not easy to write, but they can serve as road maps and give form to the work that follows them.

    7. Re:Design Document by dubl-u · · Score: 1

      Design documents aren't just for programmers, though; they can also be useful for sysadmins.

      I completely agree that sysadmins deserve high-quality documentation with every release, documentation that specifically addresses their needs and concerns. I don't think the design documents are the right ones for that, though. I also think programmers should work closely with operations staff *before* the final release, so that the product is built to be easy to maintain.

      When managers say, "We need documentation for X", it makes me crazy if they can't say who the documents should be for, or why those people will read them. Often that this means that the programmers are forced to write a pile of documents that serve no need and are read by nobody. Your request is, thankfully, just the opposite: a clear need that programmers should specifically address.

  4. Duh by Erwos · · Score: 4, Insightful

    Figure out which class from your local university deals with software engineering, find the book(s) for the class, and buy it.

    Writing a good design doc is mostly tedious work interspersed with lots and lots of communication with your programmers and customer.

    -Erwos

    --
    Plausible conjecture should not be misrepresented as proof positive.
    1. Re:Duh by OhPlz · · Score: 2, Interesting

      I'm still taking CS classes after ten years in the business. The books my college uses present an assortment of different design techniques and various documents that go along with them. They do not present an absolute solution.

      I dare say that I haven't seen much in the way of design documents in anything I do. A "design" to me, typically means a braindump committed to email. It's not too surprising either, I doubt many software engineers got into the business to write documents.

    2. Re:Duh by EEBaum · · Score: 5, Interesting

      Figure out which class from your local university deals with software engineering, find the book(s) for the class, and buy it.

      Then burn it. The methods are all nice in theory, but in practice it's often a crapshoot. Then again, I have a bit of history on this one, as my software engineering class was more of a class on how to deal with the PHB (clueless professor).

      We learned how to make all the pretty diagrams, while we discovered that such pretty diagrams could never have relevance to our particular project. It ended up a game of "make the diagrams the customer wants, then make much simpler and more sensible ones for yourself that don't follow proper software engineering protocol but actually tell us how the darn thing works."

      --
      -- I prefer the term "karma escort."
    3. Re:Duh by Anonymous Coward · · Score: 0, Funny

      If you still haven't gotten a CS degree after 10 years, maybe its time to look into another career path.

      Just sayin'.

    4. Re:Duh by JackAtCepstral · · Score: 5, Insightful

      "I doubt many software engineers got into the business to write documents."

      No, that's just it. People often ask the difference between a Software Engineer and a Computer Scientist. This pretty well covers it. Ideally, a Software Engineer is an Engineer like any other. A major portion of their work is designing and documenting. Like how a Structural Engineer would create blueprints. Also ideally, a Computer Scientist is a scientist like any other. He investigates the world of computer software - experimenting and recordign the results.

      In the real world, the roles of both blurr into "the customer wants this, code it." But to live up to the title of Software Engineer, you need to be much more proactive and be very involved in the non-programming aspects such as requirements gathering, documenting, designing, documenting, prototyping, documenting, and documenting.

      --
      Cepstral: Quality TTS for OS X, Linux, Windows
    5. Re:Duh by smittyoneeach · · Score: 2, Insightful

      C2 lays it out.
      School is about learning the terminology and trying to get the most egregious errors out of the way, so that, after graduation, real work can commence.

      --
      Get thee glass eyes, and, like a scurvy politician, seem to see things thou dost not.--King Lear
    6. Re:Duh by Karma+Farmer · · Score: 1

      Actually, neither Software Design/Engineering or Computer Science involves writing any code at all. Code is writter by Programmers.

    7. Re:Duh by CastrTroy · · Score: 5, Insightful

      This is where my classmates coined the phrase UML Nazi. Some professors were so obsessed with producing "proper UML" that the diagrams the professor asked for didn't really explain how things worked, and the documents that explained how things actually worked, got shot down as not being proper UML.

      A lot of the time, we just put diagrams that made sense to us, and that worked a lot better than trying to make proper UML documents.

      --

      Anthropic principle: We see the universe the way it is because if it were different we would not be here to see it.
    8. Re:Duh by secolactico · · Score: 0

      If you still haven't gotten a CS degree after 10 years, maybe its time to look into another career path.

      Read the parent post again. He said he has been in the business for 10 years. He didn't say how many years he has been taking classes.

      --
      No sig
    9. Re:Duh by Anonymous Coward · · Score: 0

      If I had mod points, you'd get a million. Doing and documenting design is one of the key differentiators between a PROFESSIONAL Software Engineer and a Computer Programmer. The fact that this guy is even asking the question points out that he is moving towards becoming the former, rather than being the design-while-you-code programmer who is more akin to a builder building a house without a plan, than a structural engineer applying his knowledge and experience to design a bridge that will stay up.

    10. Re:Duh by Eternally+optimistic · · Score: 1

      Not entirely. Computer scientists write lots of programs, but it is not directly what they are paid for. Same thing for software engineers. Unless of course they work as programmers, which most of them do.

      --
      What keeps me going is my inertia.
    11. Re:Duh by CatGrep · · Score: 2, Interesting

      Then burn it.

      Amen.


      It ended up a game of "make the diagrams the customer wants, then make much simpler and more sensible ones for yourself that don't follow proper software engineering protocol but actually tell us how the darn thing works."


      Actually sounds like you learned your lesson well.

    12. Re:Duh by ClosedSource · · Score: 1

      I don't think there is any universally agreed upon difference between a Software Engineer and a Computer Programmer.

      In my 20+ years of experience I've worked under many titles and I never worked with anyone who merely wrote code on the job. Everyone was involved with design, documentation, implementation and testing.

    13. Re:Duh by Anonymous Coward · · Score: 0

      "It ended up a game of "make the diagrams the customer wants, then make much simpler and more sensible ones for yourself that don't follow proper software engineering protocol but actually tell us how the darn thing works."

      I guess it depends on your customer. Often it's the customer that wants the oversimplified version of diagrams and documentation.

    14. Re:Duh by srock2588 · · Score: 1

      I had a really good software engineering class but the book was more of a reference guide. The professor only used selected parts he liked from it. Instead of using a local university, go to the software engineering sites for major universities with good programs. There tends to be quite a bit of information there. For instance: http://doubletap.cs.umd.edu/~sandro/cmsc435new/htm l/index.php

      Notice this thread is referenced in the news section :)

      --
      Ehh...this is the life we chose.
    15. Re:Duh by fatjesus · · Score: 1

      "A major portion of their work is designing and documenting. Like how a Structural Engineer would create blueprints."

      The code itself is the blueprint. The running software is the structure itself. The design document is just a description of the code (blueprint).

      The most important thing is that the design documents should develop along with the code and should be updated as the code is updated. Far too often the design document is completed before coding begins. The code ends up varying significantly from the design document and the design document becomes useless and even misleading.

      Open source projects are very good at this. The design grows with the code. This model is the future of software development.

    16. Re:Duh by PeterFranks · · Score: 1

      I was with you until you drew an analogy between programming and building houses. I think there is a fundamental difference between the two that is often overlooked.

      If you mess up building a house (or the requirements change, or whatever), you likely have to tear everything down and start that piece over, no matter how you built it. If you mess up a programming project, as long as you knew you might from the beginning, fixing it should be mostly trivial.

      If you embrace the possibility of change and start to expect it, your code will end up easier to change. A house's design can't quite do that.

    17. Re:Duh by EnderWiggnz · · Score: 1

      blech.

      A "Computer Scientist" is a mathematician specializing in an obscure branch of mathematics. There is no "science" involved.

      A "Software Engineer" is an applied mathematician, closing in on acutal engineering, depending on how close to the metal they get.

      This is coming from a Software Engineer, with a CompSci degree.

      --
      ... hi bingo ...
    18. Re:Duh by OhPlz · · Score: 2, Interesting

      I would define a programmer as one who takes a thorough design and implements specific portions of it.

      The software engineer, even if he or she writes code, is not doing that. The software engineer has to design, whether it's done in their head alone or whether it gets committed to paper.

      Is that coding software engineer less of a software engineer by skipping over the design documentation stage? Perhaps. We are a profession that doesn't have strict rules. How to write a good design document is a massive question because I don't think we've figured it out yet.

      If you're going to construct a building you know you need floors, walls, windows and such. You have to do a site plan, blue prints, environmental impact studies and such. Good design documentation, I think, would be more of a given.

      Software ranges from games to scientific applications, distributed apps and so on. Can a cookie cutter approach work? Is software still advancing with such a pace that a more formal technique is still out of our grasp? Or are we at a point where patterns are emerging and can we can point to a design as a "typical" design?

    19. Re:Duh by Anonymous Coward · · Score: 0

      I take your point. It is perhaps a bit of a stretch. But I am convinced (and it is my experience) that someone who takes an engineering approach to solving a problem with software will create something that is better, faster than someone who codes from the get go. I'm not advocating waterfall life-cycle, but putting some up front effort into at least finding out what your user wants, and then thinking about how best to provide that is what distinguishes, in my opinion, and engineer from a programmer.

      Software Engineers apply their knowledge of how to produce stable, maintainable, reliable, useable, fit-for-purpose code in producing solutions for users.
      Computer Programmers apply their knowledge of programming languages in producing software which might do hwat someone wants.

    20. Re:Duh by winwar · · Score: 2, Funny

      So, the class DID prepare you for real life then, didn't it :)

    21. Re:Duh by ShieldW0lf · · Score: 5, Interesting

      The difference between a software engineer and a computer scientist is that the software engineer doesn't do any engineering, while the computer scientist doesn't do any science.

      Computing is a creative technical discipline that has little to do with engineering and even less to do with science. It is an art, a craft and sometimes a trade.

      Just because they're older buzzwords doesn't mean they're accurate.

      --
      -1 Uncomfortable Truth
    22. Re:Duh by Anonymous Coward · · Score: 0

      I've worked as a Software Engineer/Developer for almost 10 years now. I have a university degree in Electrical Engineering and sufficient classes for a Computer Science degree. In my opinion (based on my experience), a Software Engineer is a designer, scientist and programmer all rolled up into one. A Computer Scientist is more of a mathematician (many former fellow employees of mine have been Math majors, not engineers or comp sci) and a programmer (but will commonly often do design work as well). A programmer is just that... a programmer. If you have good documentation, a programmer should be able to take that design document and write the code for a finished product that works as the customer expects.

      What's the difference between the design and the product when it comes to software? Again, in my opinion, the design itself should explain the customers' needs in technical terms and should include some kind of algorithm (either the form of pseudo-code, flow-charts, or something along those lines). That design document should be based on a Requirements Specifications document, which contains a description of the customers' needs in more laymans terms. The final product itself can be either the written code, a compiled executable application, or both.

      So... the Req Specs document is: "the customer wants this". The Design Doc is (as I said earlier) a more technical description of the customers' needs, along with some form of algorithm. In my experience, this Design Doc should be given to or explained to the customer (or the customers' representative, usually a QA department), to verify that the customer is going to get what they really want.

    23. Re:Duh by rleibman · · Score: 2, Insightful

      That's why you go to school. Much of the learning is formative, you'll use little of it in "the real world", but you'll learn "how to learn". Do I use all those years of integrals and derivatives? No, but they trained my mind into the proper engineering mode. While in school, follow the excercises, once you are outside you'll quickly figure out what works and what doesn't, and sometimes, you'll find yourself coming back to things you learn in school a long time ago.

    24. Re: Duh by gidds · · Score: 5, Insightful
      Indeed. For me, the most important thing to remember about UML, and other methodologies, is this: They are tools to be used, not rules to be followed. Too many PHBs (and colleagues) don't seem to understand this.

      The most important thing for a document is to communicate. UML is a very good way to communicate that sort of information (when everyone understands it). But it's not the only way. Use whatever's best. If a few lines of text on a scrap of paper, or an ad-hoc diagram you've just invented, will communicate better (with your memory, with your immediate colleagues, and with anyone who might be maintaining the system in future), then by all means use it! Anyone who insists on UML or whatever for the sake of it is missing the point.

      The main problem with these methodologies is that there's no way to force people to think clearly. You can encourage it, certainly; you can make it easier to do, easier to communicate, and easier to spot its absence; but you can't force it. Following the procedure is no guarantee of clear thinking -- and it's that clear thinking which gets projects designed and built.

      --

      Ceterum censeo subscriptionem esse delendam.

    25. Re:Duh by Bongzilla · · Score: 0

      what a corporate tool.

      --

      ;///////////////////////////////////////////////// /
    26. Re:Duh by EnderWiggnz · · Score: 1

      but what is harder to remove, a foundation that was poured incorrectly, or a jack-assed implementation of your core API's?

      it has been argued (About Face: Alan Cooper) that it is harder to remove the code than the tons of concrete, because ego's are attached to the code, whereas nobody cares if you rip out the foundation, hell the construction crew would be happy - they're going to be paid for it!

      Imagine telling your senior engineers that the implementation they just laid down needs to be totally scrapped because its... retarded? They would kick and scream and bitch and moan.

      As a discipline, we need to mature, a lot.

      --
      ... hi bingo ...
    27. Re:Duh by Anonymous Coward · · Score: 0

      You can't call yourself an Engineer without a degree in Engineering.

    28. Re:Duh by cerberusss · · Score: 1
      I dare say that I haven't seen much in the way of design documents in anything I do. [...] I doubt many software engineers got into the business to write documents

      I have a whole 'nother experience actually. Most big projects I've do(ne) have a fairsized design and I have absolutely no problem doing my share as well. I find the diversity of designing, testing and coding actually the nice thing about being a software developer.

      People who strictly either design or code tend to irritate me. I have to explain the basics of a webserver/-browser to the former, and have to ask the latter to quit using obscure object-relational shit in their queries.

      --
      8 of 13 people found this answer helpful. Did you?
    29. Re:Duh by EnderWiggnz · · Score: 1

      you cant call yourself an engineer without an EIT or PE...

      and as soon as you point me to an authority that accredits Software Engineers, I'll gladly submit myself to the process.

      --
      ... hi bingo ...
    30. Re:Duh by Erwos · · Score: 1

      Purtilo's 435 class is godawful, dude. Let us never speak of the abomination that SEAM is.

      -Erwos

      --
      Plausible conjecture should not be misrepresented as proof positive.
    31. Re:Duh by civilizedINTENSITY · · Score: 1

      The code itself is the blueprint. No, you confuse the "thing" for the "map". The blueprint exists to make comprehending the "thing" easier.

      The most important thing is that the design documents should develop along with the code and should be updated as the code is updated. Far too often the design document is completed before coding begins. The code ends up varying significantly from the design document and the design document becomes useless and even misleading. If the code contradicts the design then the code is *wrong*. Period. Being to lazy to code to design spec. shouldn't be tolerated. If you have issues with the design, get the training and experience to be an Analyst or Architect. It isn't the programmer's job to defy the design.

    32. Re:Duh by duffbeer703 · · Score: 1

      There's a critical difference between a "real" engineer and a software engineer. When a building fails or a bridge collapses as a result of a critical design flaw, engineers lose their licenses and can even face criminal charges.

      When software fails, most software engineers shrug their shoulders and release a patch or sometimes even redefine success to eliminate errors.

      --
      Conformity is the jailer of freedom and enemy of growth. -JFK
    33. Re:Duh by dgatwood · · Score: 1
      There's a big difference, though. Software depends on its core APIs much more than a building depends on its foundation. Changing the foundation is like changing the OS. It can be nasty to do it, but there can only be so many dependencies, and it is possible to build a program in such a way that the OS can be yanked out from under it and replaced with minimal effort.

      Changing the core APIs is like deciding that you really should have made the house using steel beams instead of wood. It involves exhaustively modifying something that is, by its very nature, pervasive throughout the code. There's a reason that certain things have to be pretty much nailed down before you begin, whether building a house or a piece of software. Changing certain design decisions can actually be harder than putting a wrecking ball to it and starting over.

      --

      Check out my sci-fi/humor trilogy at PatriotsBooks.

    34. Re:Duh by Hognoxious · · Score: 1
      If you mess up a programming project, as long as you knew you might from the beginning, fixing it should be mostly trivial.
      Are you a PHB by any chance? It may require less mechanical effort to move words than bricks, but I've seen too much crap sopftware that was patched & frigged after being created conceptually wrong. It would have usually been better to throw it away and start from fresh.
      --
      Confucius say, "Find worm in apple - bad. Find half a worm - worse."
    35. Re:Duh by duncan7 · · Score: 1

      Communication with the customers? That takes people skills, that I don't have. Just let Tom Smykowski do it...

      "Well-well look. I already told you: I deal with the god damn customers so the engineers don't have to. I have people skills; I am good at dealing with people. Can't you understand that? What the hell is wrong with you people?"

    36. Re:Duh by PeterFranks · · Score: 1

      Key phrase being "as long as you knew you might from the beginning." The crap software you mention might have been crap only because it wasn't written with change in mind.

      By the way, I apologize, but what's a PHB?

    37. Re:Duh by jasmusic · · Score: 1

      When you're already working a job, the main limited resource with pursuing a degree on the side isn't brainpower or ability, it's spare time.

    38. Re:Duh by EnderWiggnz · · Score: 1

      I disagree.

      First, let me clarify, when I was talking about reimplimenting API's, I meant only their implementation, and not the interface. Changing the interface is akin to changing water rough-ins and electric homeruns and drops after installing all teh end fixtures :-)

      There are often times when you absolutely, positively need to trash an implementation, yet ego's involved will force you to patch the shoddy work endlessly, and fruitlessly.

      If your foundation is cracked, or leaking, or crumbling, you try to fix it, and failing that, you replace it.

      In that same vein, if the requirements changed from a two story dwelling, into a 20 story skyscraper, you would have to find a way to change everything to engineered steel instead of wooden beams.

      The problem is, that programmers have these entirely too large of egos to divorce themselves from their implementation. When clear and conclusive evidence demonstrates that a piece needs to be scrapped, you will hear howls of derision. They simply can not admit that their implementation is faulty at its core.

      If a foundation is crumbling, you will never hear the Civie scream how the design was fine, and the implementation perfect, and how dare we suggest that it needs to be scrapped! They'll fix the damn thing.

      As I've said elsewhere in this thread; Software Engineering has a ton of maturing to do, in a hurry.

      --
      ... hi bingo ...
    39. Re:Duh by angel'o'sphere · · Score: 1

      A friend of mine is studying CS at a "Fachhochschule", thats a kind of university in germany with a relatively short studying time. Beyond that we have the "Universität" or "Hochschule" wich is similar to a university in other countries.

      Anyway, one of his professors seems to be similar to what you mention (UML Nazi).

      My friend is often asking me about UML and general OO issues and shows me the proposals or even worse: the demands, of his prof. Main reason: a lot of students cant follow the prof and often they don't understand what he wants or what they are supposed to show him in excersises.

      Anyway: I think nearly every document I ever saw from that teacher was simply wrong. Either overcomplex, or contradicting or wrong applied UML concepts to the problem he wanted to elaborate.

      I think teachers, professors, are very unlikely to provide good UML and even good OO, and very often they even fail with good programming or design principles.

      Why? Lack of experiance! Same topic every year, probably adapted every 2, 3 or 4 years to changes. They never really use their own ideas to craft actual software. They rarely program, or haved programmed a lot, they rarely design and follow the design till market etc.

      Well, I'm working as freelance OO/UML/Architecture/Process(SCRUM/XP) consultant and trainer. So I allow me to say: even the worst designer, who has participated in development till release, is far better than this teacher.

      And indeed most designers are really bad (ivory tower syndrom? UML feaver?). Somtimes I wonder if all the programmers who can't program good enough, moved into design?

      angel'o'sphere

      --
      Cost free eBook I read (by iBook/Kobo/Amazon/ObookO/Gutenberg etc.): "The Green Odyssey" by Philip Jose Farmer.
    40. Re:Duh by qwijibo · · Score: 1

      Users are sheep. What the user wants is irrelevant. That may not be a nice way to say it, but I've seen too many projects succeed or fail based on what purpose is being served. Most nontechnical users see "requirements" as a wish list. Trying to meet those kind of requirements will ensure failure.

      The trick to being a good software engineer is to understand the users. A good solution gives them what they need, not what they want. A software engineer has to understand the problem the user has before being able to propose a solution. The user is the best source of information about the problem that needs to be solved, and often the worst source for figuring out what should be done.

    41. Re:Duh by srock2588 · · Score: 1

      Screw that, Purtillo's class was awesome. Sandro on the other hand is a B. Only CS class i pulled an A in. Larry Herman, on the other hand, made me want to die.

      --
      Ehh...this is the life we chose.
    42. Re:Duh by Bamafan77 · · Score: 2, Interesting
      "But to live up to the title of Software Engineer, you need to be much more proactive and be very involved in the non-programming aspects such as requirements gathering, documenting, designing, documenting, prototyping, documenting, and documenting."

      You make an excellent point. It's the difference between being a developer vs being a "programmer", something that Eric Sink (founder of a small ISV called SourceGear) wrote a very nice article about.

    43. Re:Duh by PeterFranks · · Score: 1

      Hmmm.. OK, looked it up.

      Sometimes I wish I were a PHB because maybe then projects wouldn't fail as much around here. Instead, I'm just a low-life developer, whose own projects seem to work mainly because I code with change in mind.

      Anyway, wouldn't a PHB think oppositely than me? Wouldn't he want rigorous up-front design that won't change at all? Then he could blame me when the project went so far off course? Wouldn't a PHB be opposed to a fundamental concept of Extreme Programming, if only because of that scary name?

    44. Re:Duh by gte910h · · Score: 1

      I don't think I've ever seen someone with the job title of "Computer Scientist". I myself am a "Research Scientist", and I'm definitly NOT a software engineer. However I do write a lot of code in an applied research setting, that's actually used by customers to do non-academic tasks. And my degree is also in "Computer Science" I have PLENTY of scientific training (as much as many of my friends who graduated with a true science degree).

      --
      Want to see every step I took to start my company? http://www.rowdylabs.com/blogs/pitchtothegods
    45. Re:Duh by Fulcrum+of+Evil · · Score: 1

      When software fails, most software engineers shrug their shoulders and release a patch or sometimes even redefine success to eliminate errors.

      That's because, when software fails, it usually doesn't kill anybody. The general fallout is some lost work or a slightly delayed order. The reason software still crashes is that people aren't willing do do things differently. This implies that it isn't that big a deal.

      --
      "We returned the General to El Salvador, or maybe Guatemala, it's difficult to tell from 10,000 feet"
    46. Re:Duh by Fulcrum+of+Evil · · Score: 1

      If the code contradicts the design then the code is *wrong*. Period. Being to lazy to code to design spec. shouldn't be tolerated. If you have issues with the design, get the training and experience to be an Analyst or Architect. It isn't the programmer's job to defy the design.

      I'll follow that rule when I get designs that lack errors. As it stands, I am the designer and the coder. Design docs are generally viewed as a predictive tool, rather than documenting what's actually there. This last part is a problem, but it will take time to change.

      --
      "We returned the General to El Salvador, or maybe Guatemala, it's difficult to tell from 10,000 feet"
    47. Re:Duh by Anonymous Coward · · Score: 0

      Let me get this straight...you are showing the customer one diagram, and then coding to another? If this is a contract, you're probably commiting fraud. At the very least, you are going to end up in breach of contract sooner or later.

      Just because you're too stupid to learn UML or proper software engineering doesn't make it useless.

    48. Re:Duh by Oxryly · · Score: 1

      So, to paraphrase General Eisenhower: when writing working software the UML is useless, but producing the UML is essential.

      Oxryly

    49. Re:Duh by anomalous+cohort · · Score: 1
      UML Nazi

      I think that this was a /. story but the ACM ran a humorous piece that depicted zealous overindulgance in all things UML as a disease to be cured.

    50. Re:Duh by orderb13 · · Score: 1

      And perhaps he isn't pursuing a degree, simply keeping up with new things they teach. Generally it's much cheaper to do a college class a semester than to shell out the bucks for a week long class on a given language. Personally I'd rather just read a book than waste my time in class, but there are some classes that would be fun to take as a class.

    51. Re:Duh by orderb13 · · Score: 1

      I disagree. Engineers have egos just as bad as, if not worse than, techies. Having worked as a programmer in an Engineering firm I've seen it first hand. NO ONE likes to be told their work was crap.

    52. Re:Duh by orderb13 · · Score: 1

      I've adapted an old saying the the tech biz. "Those who can, code. Those who can't become analyst/designers."

    53. Re:Duh by fatjesus · · Score: 1

      "The difference between a software engineer and a computer scientist is that the software engineer doesn't do any engineering, while the computer scientist doesn't do any science." I like that a lot. Do you mind if I use it?

    54. Re: Duh by DrEasy · · Score: 1
      If a few lines of text on a scrap of paper, or an ad-hoc diagram you've just invented, will communicate better (with your memory, with your immediate colleagues, and with anyone who might be maintaining the system in future), then by all means use it! Anyone who insists on UML or whatever for the sake of it is missing the point.

      The problem is that the "ad-hoc diagram you've just invented" doesn't have standard semantics. You might mean one thing with your diagram, the reader might understand another. And if your answer to this is: "but the reader did understand what I meant by my diagram", then your mistake is that you've reduced your readership to a very small subset of potential readers. If your design is meant to be durable, then your documentation should also stand the test of time and future readers/users.

      UML might not be a panacea, but at least its diagrams have a known and standardized meaning. The problem is that it is often misused and misunderstood, maybe because it is sometimes unintuitive and overly complex. But then again any type of modelling tool that would aim for completeness and unambiguous semantics would probably end up that way...

      --
      "In our tactical decisions, we are operating contrary to our strategic interest."
    55. Re:Duh by fatjesus · · Score: 1

      You are correct, the code should be based on the business requirements and therefore the design. And yes, the code shouldn't contradict the design. That's my point. But they need to evolve together.

      If you think you can write a spec and then not diverge from it during development, then you're not being realistic.

      The design always develops with the code. Software developmentment is an evolutionary process. We're not building bridges or skyscrapers.

    56. Re:Duh by darnok · · Score: 1

      > Computing is a creative technical discipline that
      > has little to do with engineering and even less to
      > do with science. It is an art, a craft and
      > sometimes a trade.

      Although I suspect most coders would agree with you, IMHO it's the fact that people approach coding as "art" rather than "engineering" that screws up schedules and gets business offside.

      I've been lucky enough to work with 2 coders who come from a strong engineering background. They approach coding as an engineering task; they design code specifically so that it doesn't fail and does EXACTLY what it's supposed to do under all circumstances.

      In terms of documentation, these guys are high maintenance; they question every piece of unclear text in requirements documentation because that's what's required when you're e.g. building a bridge. They don't guess or extrapolate; they execute. Best of all, their results are highly predictable; if they say a task is going to take 3 weeks, then it'll take 3 weeks plus or minus 10%.

      Show me an "artistic" coder who can work in that fashion, and it'll be a revelation to me. I don't believe they exist. 90% of the coders I've employed or work with can't estimate within 100% on a regular basis, which is completely intolerable for a project manager.

      When times were tough a year or so ago, I sought out these guys time and time again to work for me, and recommended them for other roles when I couldn't employ them myself. Everyone they work for wants them back, simply because they do what they say they're going to do, and do it within the time they originally stated. That makes them HIGHLY employable, even in a downturn.

    57. Re:Duh by ShieldW0lf · · Score: 1

      I'm an "artistic" coder. But then, I'm also high maintenance and question every unclear piece of text in requirements documentation. Even an artist needs to know if you're looking for a head shot or a body shot. But I operate in a world full of black boxes just like everyone else, and recognize that the level of disipline and surity required of engineering is unavailable.

      Personally, I'm usually not able to estimate how long every task will take, because I'm usually operating in an environment full of uncertainty and dealing with other peoples mess. If I'm building it from scratch, generally no problem... dead on estimates every time. But when you want me to build something that interacts with something else that I didn't write and don't give me the time to develop a thorough understanding of it before I start, don't ask me how long it will take. Cause I'm one of those assholes that will sing-song "I don't know" before I let you pass the buck on to me.

      Nothing more frustruating than dealing with a project manager too stupid to understand this. Engineers building a bridge will have LOTS of time to ensure that there is NO uncertainty before they start. No one ever tells a bridge builder that they don't have the resources to test the earth it will be built on. But if you come up to a project manager and say "I don't know how long it will take because of these areas of uncertainty. These areas are known and will take this amount of time, these are not and cannot be predicted without research, I would like to spend x amount of time developing a thorough understanding of what I'm interoperating with before I complete my estimate." they will usually simply insist that you pull a number out of your ass for them.

      If you're the project manager, you're the one sending your grunts out without a clue and wondering why they don't get things done when they said they would. Stop passing the buck and create a more stable and clear environment for your developers to work in. That is, after all, the only reason you're there.

      Sounds to me like you met a couple of guys who insisted that you actually do your job properly and had an epiphany. Try learning from it.

      --
      -1 Uncomfortable Truth
    58. Re:Duh by ShieldW0lf · · Score: 1

      Fill your boots. Only one hit wonders need copyright, and I've got a million of em :P

      --
      -1 Uncomfortable Truth
    59. Re: Duh by GlassHeart · · Score: 1
      For me, the most important thing to remember about UML, and other methodologies, is this: They are tools to be used, not rules to be followed. Too many PHBs (and colleagues) don't seem to understand this.

      Sure. My problem is that people who are not yet UML experts decide to break the rules, without necessarily understanding why the rules were in place, and obviously unable to foresee the problems that breaking such a rule might bring in the future.

      If a few lines of text on a scrap of paper, or an ad-hoc diagram you've just invented, will communicate better

      How do you know, first of all, that there isn't already a standard notation for what you're trying to describe? Secondly, how do you know your method is better?

      In other words, I agree with your advice, to the extent that experts should not be bound by rules. The problem is that far too many people think they are experts. Worse, real experts don't need this particular advice from Slashdot.

    60. Re:Duh by EEBaum · · Score: 1

      Let me get this straight...you are showing the customer one diagram, and then coding to another? If this is a contract, you're probably commiting fraud. At the very least, you are going to end up in breach of contract sooner or later.

      True. This was for a class, and there was no contract. Had it been for a real job, I would have quit without signing said contract and gone for a job at McDonald's. It was one of those "If this is software engineering, I'm changing my major" courses. I learned proper software engineering by using a "this idea could work very well if it was applied in a different way than they're showing us here" philosophy.

      We did a funky version of UML in the course, and were given specifications on how to apply it. These specifications were completely inapplicable to our project. It was as if we showed up one day with a can of beans and the professor said "I want you to make a popsicle out of them."

      --
      -- I prefer the term "karma escort."
    61. Re:Duh by angel'o'sphere · · Score: 1

      might be :D but luckyly there are exceptions :D

      --
      Cost free eBook I read (by iBook/Kobo/Amazon/ObookO/Gutenberg etc.): "The Green Odyssey" by Philip Jose Farmer.
    62. Re:Duh by orderb13 · · Score: 1

      Every rule has the exception. I know of a couple of people that just kind of wandered into doing analysis, even though they were good coders, but by and large I think most SAs don't have a clue.

    63. Re:Duh by darnok · · Score: 1

      > Sounds to me like you met a couple of guys who
      > insisted that you actually do your job properly
      > and had an epiphany. Try learning from it.

      Absolutely not - I'm from an engineering background myself, so I appreciate having people around me with a similar mindset.

      I don't expect people to "pull a number out of their ass" when I ask for an estimate. However, I expect them to be able to formulate a list of requirements they have which, when addressed, will let them give me an accurate estimate. Although I'm technically capable of doing so, I've got nowhere near enough time to analyse every piece of documentation (including revisions) that comes my way - I have to delegate that task to trusted lieutenants, and to do that I need to have faith that the approach they take will give me a correct answer. To refer to your message, I expect them to test the earth before they build a bridge; if they can't test it themselves, then they need to get someone who can. Until they get the definitive answer, the answer I expect from them is "I don't know, but I'm working on it now". If they can tell me the cause of the delay, I'll manage the uncertainty upwards in the organisation.

      Way too many people think of a number, multiply by 2 or 3 to cover things they don't know and are too lazy to find out, then go with that - sorry, doesn't cut it. When you do that, you're hanging people out to dry. I've seen many multi-million dollar projects die because someone didn't do their due diligence and what they thought was a small problem was actually a big problem.

      Bottom line: if you're one of those people who actually does the investigation required to come up with accurate estimates, I'd probably employ you. To some people, you might appear to be high-maintenance because you take time to come up with the right answer; to me, you're low maintenance because I don't have to continually check that you know what you're doing.

    64. Re:Duh by Anonymous+Brave+Guy · · Score: 1
      I don't expect people to "pull a number out of their ass" when I ask for an estimate. However, I expect them to be able to formulate a list of requirements they have which, when addressed, will let them give me an accurate estimate.

      That's fine, but what if the amount of time required to list those requirements accurately could be 80% of the total development time for the project? Anyone can give you an estimate for the release date five minutes before they release the code. ;-)

      Seriously, I see this all the time at the moment. I'm adding new features to a relatively old piece of software. My last project was timetabled to take about six weeks of development, but lasted nearly a year. The new development work I did actually took (give or take a couple of days) the amount of time I'd estimated, and met its spec after that time. The problem was that then they found a zillion bits of old code that didn't meet their spec, hadn't been tested sufficiently to discover this a decade ago, but now weren't up to the job of driving my nice new functionality. Fixing those extended the length of the project as a whole by an order of magnitude.

      Now, I could have told the project managers that was going to happen. But until I'd spent the several months I took investigating the older code to identify the numerous special cases that would need removing in order to reduce it to a systematic, effectively testable design, I couldn't have told them how long it was going to take. Once you've got that knowledge, writing the code itself is barely significant in the amount of time it takes.

      --
      If you disagree, post your argument. (-1, Overrated) isn't your personal censorship tool for views you don't like.
    65. Re:Duh by Hognoxious · · Score: 1

      No. They see design as wasting time. Heck, they see thinking as wasting time. For them LOC/day is the only metric (Look that one up too, if you don't know it). They don't have the brains to measure true quality, so they assume whoever gets in earliest and seems to be hitting his keyboard fastest is the most productive.

      --
      Confucius say, "Find worm in apple - bad. Find half a worm - worse."
    66. Re:Duh by Anonymous Coward · · Score: 0

      I think he want's a Design Doc Button(TM)

    67. Re:Duh by nikkoslack · · Score: 1
      Figure out which class from your local university deals with software engineering, find the book(s) for the class, and buy it.
      That's what's wrong with design documents today. Most local university professors have no earthly idea how to write design documents.
  5. About Resources by superpulpsicle · · Score: 1

    The person writing the document should have enough software/hardware resources. So many engineering specs are written too early in the phase when there is nothing tangible. It just becomes a fairy tale document.

  6. The problem. by ShaniaTwain · · Score: 2, Funny

    Part of the issue is that these guys have written the design after 2 or more years exposure to the problem so they tend to forget just how much they know.

    why? is the problem radioactive? Some sort of alien compound that causes forgetfulness? Sounds potentially preferable to some of the projects I've worked on.

    1. Re:The problem. by scovetta · · Score: 1

      I hear there's a document-version of code-rot going around, removing whole paragraphs, and sometimes even entire revisions!

      --
      Wer mit Ungeheuern kämpft, mag zusehn, dass er nicht dabei zum Ungeheuer wird. --Nietzsche
    2. Re:The problem. by Fulcrum+of+Evil · · Score: 1

      why? is the problem radioactive?

      Yeah, it's contaminated with obviousium. Exposure to Obviousium makes you view everything as obvious and not worthy of mention.

      --
      "We returned the General to El Salvador, or maybe Guatemala, it's difficult to tell from 10,000 feet"
  7. Mythical Creatures by telecsan · · Score: 4, Funny

    The design document was rumored to be a cross between a unicorn and the dodo bird. What would a bird need with a big pointy horn on it's head? I don't know, but then, I've never seen one of these rumored documents, so I can't say for sure.

    1. Re:Mythical Creatures by GIL_Dude · · Score: 0, Offtopic

      I always thought the horn was to attact the virgins... Wait, maybe that was the other way around...

  8. Be agile by kabdib · · Score: 2, Insightful

    Who needs documentation? Just wade in with something like Scrum. Most documentation is out of date anyway (about a month after you're coding, it's useless).

    --
    Any sufficiently advanced technology is insufficiently documented.
    1. Re:Be agile by KlomDark · · Score: 1

      What? You mean the Tall Man from Phantasm? I guess that might work. (Here, you don't like that? Try a silver ball drilling a hole in your head...)

      Oh wait, that was Angus Scrimm, not Angus Scrum.

    2. Re:Be agile by Malc · · Score: 1

      If it's out of date in just a month then the engineers are doing what they're paid to do. Sorry folks, but parts of this job can be mind-numbingly tedious. We're paid as professionals, not hobbyists.

    3. Re:Be agile by Wally+Holt · · Score: 1

      I don't pay my team to write documentation. I pay them to develop solutions to business problems. If you need some docs to support that development then produce no more and no less than what is needed to do the work. If the documentation is out of date in a month, then you should be questioning its usefulness and the need to maintain it. If it is really necessary then it tends to stay up-to-date.

    4. Re:Be agile by phliar · · Score: 1
      Agile my ass. If the design evolves as you code, the documentation -- design docs, functional specs, comments in the code, whatever -- must evolve to match it. If you don't update the doc when the design changes, you are doing a half assed job. If you whine that you don't have the time to, well, why was your time estimate so off to begin with?

      Certainly, estimates of how long it's going to take to do something are just estimates and can be wrong. But if they're constantly wrong so you never have time for documentation, face it -- you're incompetent. If you can't resist management pressures to do a quick half-assed job and get it out the door, you should quit. Unless you don't mind doing a half-assed job, of course.

      And if for any reason your doc becomes out of date and you're not going to fix it -- delete it. Bogus documentation is worse than no documentation.

      As Abelson and Sussman write, "Programs should be written for people to read, and only incidentally for machines to execute." The more complex the system, the more important that is.

      --
      Unlimited growth == Cancer.
    5. Re:Be agile by Malc · · Score: 1

      What seems important or unimportant now will often be completely different in 6 or more months time. When your engineers have moved on to other tasks, the documentation becomes more important. It's easiest to keep it up to date as one goes along. Of course, the best code is written after the documentation, and that kind of documentation is even easier to keep up to date. I've had to pick up projects that I haven't touched in 3 three years and even though I was the sole developer, I thank myself for the documentation I wrote at the time.

    6. Re:Be agile by EnderWiggnz · · Score: 1

      honestly, when you get a bug report froma project that completed 2 years ago do you:

      A) Search for the Design Doc before debugging
      B) Look at the damn code

      --
      ... hi bingo ...
    7. Re:Be agile by Phillup · · Score: 1

      A) Make sure the bug really exists

      Before I...

      B) Enable debug mode

      and...

      C) Read the design docs (which are embedded in the code)

      If it isn't in the comments, it isn't documented.

      --

      --Phillip

      Can you say BIRTH TAX
  9. I hate it when that happens by nietsch · · Score: 3, Insightful

    This story has no posts, just when I tought it would be nice to read from others how they think about design problems.

    All I can suggest is: keep a strict separation between features and implementation.
    do some use cases that describe how the most important part (the user) will handle the program.

    And think ahead, your designs will change while building/deploying. How are you going to accomodate that?

    --
    This space is intentionally staring blankly at you
    1. Re:I hate it when that happens by Grab · · Score: 0, Flamebait

      Good call.

      Pseudo-code, or any other formal or semi-formal tool, is the kiss of death. Do not EVER, under ANY circumstances, use ANY method to document exactly what the code should do. It is always quicker to just write the damn code, and your design document becomes an unusable pile of crap.

      What a design document should say is what they want the design to do, and the decisions made in implementing it. So the architecture, the interface between your software and the outside world, and the interfaces between chunks of your software are essential to capture. Data flow diagrams are a useful tool here. A truly vast amount of errors come from interface issues, where group A expected one thing and group B expected another. NASA's little oopsie in units is a good example, but another thing to beware of is deadlock, where process A is waiting for message X before it sends message Y, and process B is waiting for message Y before it sends message X.

      Flow charts and state machines can be useful, but only as a method of documenting what's supposed to be happening in the "big picture". A good guideline is that if you ever find yourself using variable names, this is the point to close down your current diagram, delete it, and probably delete the next diagram or two above it as well.

      What else? Hmm. "Why did you implement something a particular way?" "Oh, because it saved 200KB and 5% execution time, so it's super-efficient even though the code looks way confusing." Write it down, otherwise someone else may misunderstand your code, rewrite it and add 200KB and 5% execution time to a future release.

      And if you don't have a requirements document, write your requirements in the design document. It's more of the "why did we do that?" decisions, and it also stops you getting reamed by the customer when someone realises they forgot feature X and then lies through their teeth to say they told you to do it.

      Grab.

  10. Don't use one by Anonymous Coward · · Score: 1, Interesting

    Design documents are a waste of time. I have never seen one that is current, or even comes close to explaining the system accurately enough to be useful. The best solution is to write code that is easy to understand and go from there. Maybe create a high level diagram of the system, but let the code be the language in which the design is written. Do you really think the design document comes first? It never does. It is always done after the code is completed, and only because management has no clue and thinks documenting the system will make is easier to hire new developers. I'd honestly suggest looking at the design side of XP. I have used that a lot recently and have seen hug improvements in efficiency and code quality.

    1. Re:Don't use one by Anonymous Coward · · Score: 0
      I seriously hope you're not working on embedded systems...

      Not doing design documents is a mortal sin.

    2. Re:Don't use one by Grab · · Score: 1

      Untrue. A design document upfront is worth its weight in precious metal X for any system more complex than a tricycle.

      Check your argument. You're saying it's not useful because it's not current, and it's not current because management is lousy. But you've failed to see that the fix is to tell management that writing docs after the fact will increase the time to do your coding. If they see docs as a 20-hour surcharge after the project, sure, this'll happen. But if they see docs as a 20-hour charge at the start which then reduces coding cost by 10% then believe me, they'll get the message. It's like saying "my boots come off when I walk through puddles of thick mud, therefore I should never wear boots" - you've missed the obvious concept of "don't walk through muddy puddles"! ;-)

      It sounds like the problem is that you've never worked in a company with competent management and a half-decent development process.

      Grab.

    3. Re:Don't use one by ClosedSource · · Score: 1

      "I have never seen one that is current"

      "It is always done after the code is completed"

      Assuming you've actually seen a design document, these two statements are contradictory.

  11. Design Document requirements: by amichalo · · Score: 5, Insightful

    Be sure your DD includes:
    - Sitemap (web) or screen map (desktop app)
    - Feature matrix with columns for features, rows for pages/screens and indicators where a page/screen has a feature.
    - Detailed feature specs need to be written kinda like function documentation - "preconditions" that state what is expected as in the user is authenticated or the DB has products and "post conditions" that say what gets set or hwat the user can do.
    - Style documents greated by graphics designers who understand the medium (web/Windows API/etc) are invaluable for refering back to when someone doesn't like a font size.

    All this documenting is no fun, but it is more fun then dealing with the lake of the document.

    --
    I only came here to do two things; kick some ass, and drink some beer...looks like we're almost out of beer.
    1. Re:Design Document requirements: by TechnologyX · · Score: 1

      "but it is more fun then dealing with the lake of the document."

      But I bet that's better than dealing with the lake of fire anyday!

      --
      Slashdot sucks
    2. Re:Design Document requirements: by VitaminB52 · · Score: 1
      Don't forget to include a terminology list.

      Things like 'product price' tend to have a different meanings to different people (for sales people it's the selling price, for others the purchasing price; for some it's always the price + V.A.T., for others it's the price minus V.A.T., etc.).

      Make sure everybody has the same mental picture when you talk about 'x' will help reducing the errors that creep into a project when 'x' has different meanings to different people.

    3. Re:Design Document requirements: by mr.newt · · Score: 1

      It sounds as though you are describing a user's manual, not a software design document. An SDD should be focused almost completely on code structure, not on UI.

    4. Re:Design Document requirements: by Anonymous Coward · · Score: 0

      - Sitemap (web) or screen map (desktop app)

      What a load of B.S. I think the point of this article is that there's an enormous gap between what the screen looks like and what the software actually has to do and how to implements it. I am completely sympathetic to the guy who posted the article because as a developer I've never seen a good design document. The problem usually stems from some douchebag salesman designing the software based on "screenshots" that you as the developer have to implement as it appears in some poorly written document...my favorites are the fake database tables the sales guys make up and then reference from the screenshots. Therein lies the problem...

      IMHO I think software should be designed from its functionality outwards...the visual representation of the program is simply an interface to the underlying function of the software. Good software is a combination of the interface and its underlying functionality. All too often software is designed from the interface to the function instead of having a nice piece of code and attaching the simplest interface to that piece of code.

    5. Re:Design Document requirements: by aziraphale · · Score: 2, Insightful

      Maintenance coders typically get asked to do things like this:

      - add a button to screen A that does function X
      - change the layout of screen B so that it shows ALL of the widgets in chronological order

      etc.

      To do that, you want to start off with a nice diagram of the screens showing which UI elements come from which classes/controls/include files/etc. so that you know where to go and start looking at code.

      90% of software design is about putting code in the right place. That means architecture consists, mostly, of telling codemonkeys where to go and put their code. When an architect is attached to a project, they can tell the codemonkeys directly - 'make a class called Foo, give it these methods'. Once the architect's gone, and the codemonkeys are maintaining it, the design documentation is the only hint any of them will get as to where is the _right_ place to put code.

      In those situations, nice block diagrams showing which bits of code make which bits of which screens can be a real help.

    6. Re:Design Document requirements: by Anti+Frozt · · Score: 1

      A good SDD should include both. A strong, easy to use, well designed UI is critical in the success of almost any front-end application. If the people developing the UI have no idea what it should look like (all they know are they requirements), you are almost guarenteed to get something with lots of blinking/scrolling text, unusable functionality, and terrible navigation.

      In fact, a SDD should hardly mention code at all. Class diagrams that give a skeleton of how the functionality will be seperated and interact is much more concise and functional. Your programmers will appreciate not having to wade through hundreds of pages of code when a page containing a class diagram would have been sufficient.

      --
      In C++, friends can touch each others private parts.
    7. Re:Design Document requirements: by mr.newt · · Score: 1

      Perhaps you didn't read my comment. I said "focused on code structure" not "containing source code."

    8. Re:Design Document requirements: by jasmusic · · Score: 1

      But I bet I haven't seen a cheesier reply to date!

    9. Re:Design Document requirements: by TechnologyX · · Score: 1

      Nacho, Cheddar, Pepper Jack, Swiss, American, Provolone, Gouda, Mozzarella, Blue.. ahh crap I can't think of any more :/

      --
      Slashdot sucks
    10. Re:Design Document requirements: by jasmusic · · Score: 1

      Ha! That's not enough to absolve you of your blunder!

    11. Re:Design Document requirements: by Salamander · · Score: 1

      Yeah, that will work really well for your device-driver design. What you describe sounds like a requirements document for a very narrow domain. Even in web-weenie-world a decent design document should address things like database usage and authentication, which your list omits. Try gaining experience beyond one role on one type of program before you try to tell other people about what makes a good design spec.

      --
      Slashdot - News for Herds. Stuff that Splatters.
    12. Re:Design Document requirements: by amichalo · · Score: 1

      Try gaining experience beyond one role on one type of program before you try to tell other people about what makes a good design spec.

      I didn't represent my post as some type of definative guide. Why are you being such an ass? I read your "Consider your audience" post and it certainly has ideas that are worthy of merit, as does my post.

      You may think of web application development as "web-wennie-world" if you want to, but you will only be limiting your own experience.

      When you are ready to appologize for your unwarranted attack, the reply button will be waiting.

      --
      I only came here to do two things; kick some ass, and drink some beer...looks like we're almost out of beer.
    13. Re:Design Document requirements: by Salamander · · Score: 1
      Why are you being such an ass?

      Welcome to Slashdot. I see you're new here.

      You may think of web application development as "web-wennie-world" if you want to, but you will only be limiting your own experience.

      Would be, you mean, if I hadn't actually done web application development. I've done that, and I've done real programming, so I do know the difference. You apparently don't, or you wouldn't be arguing this point. Web application is a specialty more insulated than most from

      --
      Slashdot - News for Herds. Stuff that Splatters.
  12. Diagrams, for one thing by blueZ3 · · Score: 5, Insightful

    I document software for end users, and get some of my information in the early stages of development from design docs. I have to say that the most useful design documents that I've seen are ones that contain diagrams, flowcharts, and other "pictures" of how the system (or the module, component, whatnot) functions.

    If I have to choose between a 50-page design document and three pages of clear diagrams, I'd pick the pictures.

    --
    Interested in a Flash-based MAME front end? Visit mame.danzbb.com
    1. Re:Diagrams, for one thing by gfreeman · · Score: 1

      If I have to choose between a 50-page design document and three pages of clear diagrams, I'd pick the pictures.

      Contrariwise, if I have to choose between 50 pages of pretty pictures or three pages of well written documentation, I'd pick the documentation.

      --
      Ceci n'est pas un sig.
  13. Audience == People by mike_the_kid · · Score: 3, Insightful

    Overly rigid structure and formatting are not helpful. Often times I think programmers are so used to writing for compilers that they forget that humans are much better parsers.

    Design documents should be easilly written and easilly updated. I prefer a text editor to something where I can have 'really nice' formatting. Its just easier and quicker, and that leads to the documents being more likely to be kept up to date.

    If the docs aren't up to date, no matter how well written or well designed they are, they are misleading and unhelpful.

    --
    Troll Like a Champion Today
    1. Re:Audience == People by yagu · · Score: 2, Insightful
      Unfortunately, templates and standards for design documents rarely are left to the hapless development staff but are instead left to the people who don't have to read them... Oh, they have to look at them, bind them, distribute them, and related "business" machinations, but they don't really have to READ them, and thus far too often technical teams are left having to shoehorn designs into inappropriate, rigid, and non sequitor documents. If this were an only-one-time experience in my career, I'd have more hope, but I've encountered this phenomenon over and over.

      For the record, I agree: Design documents should be easilly written and easilly updated. I prefer a text editor to something where I can have 'really nice' formatting. Its just easier and quicker, and that leads to the documents being more likely to be kept up to date...., but ability and common sense about what documents SHOULD look like is far less likely to be the obstacle than the policy governing design documents.

      Your mileage may vary. Good luck! We're counting on you.

    2. Re:Audience == People by jeillah · · Score: 1

      Amen to that brother! At my company we are required to produce reams of documentation in a format that some outside consultant came up with. The documents are worthless to the coders on the team but they get awarded the required checkmark in someones MS-Project plan. I always write my own document and include it in the CVS module for the project. I try to keep it up to date... I also use JavaDocs to create API documentation. Neither are a requitrement but they are helpful later on when you need to come back to the projects or pass it on to other developers (offshore) to maintain.

    3. Re:Audience == People by scovetta · · Score: 1

      ...humans are much better parsers

      You obviously don't work at my company.

      --
      Wer mit Ungeheuern kämpft, mag zusehn, dass er nicht dabei zum Ungeheuer wird. --Nietzsche
  14. What's the purpose of the design doc? by DanielMarkham · · Score: 4, Interesting

    Basic communications 101 says the purpose of any document is to communicate. And you, the poor schmoe left with maintenance, is exactly the guy the design doc is supposed to be talking to. Now a lot of times businesses create documents just to "check off the boxes" in which case they want some big, heavy monstrosity to deliver. If that's what you're getting, good luck. People (especially programmers) tend to think of design docs as some kind of ultimate bible in the sky that's going to answer all questions and be a completely accurate guide to what's in the code. That's fine in theory, but in the real world the best design doc you're going to find is one that tells you what the design team was thinking when they started down the path of building this program. What's the patterns that were used? What constraints kept them from doing things differently? It's just a technical memo from them to you that's supposed to help you get oriented and work more efficiently. Sometimes those memos aren't done so well. My advice is to get what general information you can from them, and then talk to the coders who worked on the project. That's my two cents.

  15. a good place to find all this stuff by wiredog · · Score: 2, Insightful
    The source, especially the comments. Assuming there are comments, and they don't read (I really saw this once) "Why did I do this?"

    A good design document often duplicates the actual programming process. It starts at a high level (What are we trying to do? How do we do it?) and drills down to the level of what each function (or class method) should do. It should define acceptable inputs and outputs, both overall and for each method. It should also define the unacceptable ones. You should be able to generate the unit tests from it as well as the actual program.

    It should leave room for changes if you find out that using methodology Bar to implement Foo doesn't work.

    The Final Document should be based on a reading of the code, and any differences between that and the pre-code spec should be documented as to their cause.

  16. Design documents become stale by davidwr · · Score: 3, Insightful

    The biggest problem I've had with design documents is that they aren't updated.

    When first written, they are good and complete.

    As the project moves along and the design changes, the design documents aren't updated. If you are lucky, new features will be covered in errata documents, but old features that were found to be not feasable remain in the document, without any indication of why they were removed from the project.

    --
    Knowledge is how to play a game, intelligence is how to win, wisdom is knowing what game to play.
    1. Re:Design documents become stale by ciroknight · · Score: 1

      As a freshman computer engineer, I've already developed a design process that works well for me.

      It's pretty simple actually. First, draw a diagram showing work flow and data flow. This will help when you go into implementation and try to work out algorithm and memory problems (you can easily see which parts of the software will be doing more work, and which will be dealing with memory/data).

      Then code.

      Since a lot changes in the coding process, the original design document is now practically worthless, except that it's still conceptually correct. Now all you have to do is read through the software and create a new diagram, showing how everything works, and adding file names/line numbers to the boxes in your diagram.

      Take this diagram to the beginning of this algorithm and repeat.

      I find too many software engineers forgo this last, most important step, and that sucessful projects are the projects that are able to clearly keep design goals and patterns in the blue, and not hidden in a million pages of documents. For this same reason, I tend to shy away from using "Automatic Documentation Generators", and CVS systems (but that's for other reasons as well, as I really hate CVS). I also tend to "re-invent the wheel" a lot because developers forget this last step and as I may be able to make sense of their code, I simply hate the design layout of it, or the lack thereof. This happened to me when I wrote my own MP3 management software; every single implementation of an ID3 library I ran into was garbage. There were a few that were less garbagy as the rest, and I drew heavily on them for design, but re-implemented everything in a different fashion.(Why on EARTH do you need 70 objects to deal with an ID3 tag that only contains 10-20 objects itself???? I think some people need to re-take object oriented design...) [p.s. I probaby will not open source this work; it took up far too much of my time to just give away.]

      It's funny as well; I often get picked on because my code takes longer to produce, even if I generate at least three times as much design information as the rest of my classmates. I also had the highest grade in my last class (the teacher would often give me 10 to 15 points simply for my design information and comments).

      --
      "Victory means exit strategy, and it's important for the President to explain to us what the exit strategy is." G.W.Bush
    2. Re:Design documents become stale by civilizedINTENSITY · · Score: 1

      "As the project moves along and the design changes..." is a problem. Why not code to spec? Was there a reason the design was structured as it was? Why isn't it being followed? Who authorized the deviate code?

  17. Steps to writing a good design document by GillBates0 · · Score: 5, Funny
    I've noticed a recurring pattern: I get put on a new project that already has a bit of history and I get told to read the design documents and then implement XYZ.

    1. Write a design document containing information about the design document you're trying to create.
    2. Read the design document you wrote in (1) describing the design document that you are trying to write.
    3. Write actual design document as described in design document written in (2).

    --
    An Indian-American Hindu committed to non-violent thought/speech/action alarmed by the global explosion of radical Islam
    1. Re:Steps to writing a good design document by 88NoSoup4U88 · · Score: 0
      4. ?
      5. Profit !

      .... I'm sorry.

    2. Re:Steps to writing a good design document by Anonymous Coward · · Score: 0

      Actually this previous post should be made informative, not funny. This is bang-on. With every design document you have to think about what are the important design issues to be brought out. It's very important to have that meta-design step before writing out the actual design doc.

      For example, data flow diagrams, structural decomposition diagrams, sequence diagrams, etc are all very very useful diagrams to have in general. But are they applicable to the specific document you are writing? Do you have a lot of data being processed.. if yes then a data flow diagram can convey a lot of information. Is the structural decomposition important.. do you have a huge class hierarchy or is the hierarchy flat or a single flat file.. etc. Is the order in which calls are made in your code important.. if not then adding a sequence diagram is a waste and just complicates the doc. This is the meta-level of figuring out what you should be explaining in the first place.

      In my experience there is really no generic formula that you can follow to come up with a perfect design document. These documents always have to be tailored to the characteristics of your specific project.

  18. A Good Design Document by darthtrevino · · Score: 5, Informative
    I've seen alot of design documents. Most of them fit into a sort of cookie-cutter as to what the company expects. If UML is standard, expect to see alot of crappy UML with substandard explanations.

    The best design documents are ones that aren't trying as much to fit the cookie cutter as much as they clearly convey the idea of the design.

    I'm not saying to throw design standards to the wind. I'm saying that your standard as a design document generator is to create something that is readable, decent to look at, and clearly conveys what is going on.

    Try to use vernacular vocabulary and language style when explaining what things do, and try to make your pictures look as pleasing and simple as possible.

    Hope that helps.

    1. Re:A Good Design Document by Anonymous Coward · · Score: 5, Funny

      Ironically, I had to look up "vernacular."

    2. Re:A Good Design Document by sconeu · · Score: 1

      Yep, and the lack of a good one can cause nasties too.

      I was once on a project, and the design document (we had one, but it was lousy), and the pseudocode were specified as deliverables. We spent two weeks reverse engineering the system to create the pseudocode.

      On the gripping hand, I was on another project, and I had written a design document. However, I was told to use my "experiment with the hardware to figure out how it works" code as the final version because "we didn't have time" to do it per the design. It caused so many bugs that I convinced my immediate supervisor to let me do it per design. The code was much cleaner, understandable, faster and reliable. There was one bug found in the code (typo -- missing break statement).

      I always try to convince my bosses to have a decent requirements and top level design document. And to let me follow them, existing "working" code to the contrary.

      --
      General Relativity: Space-time tells matter where to go; Matter tells space-time what shape to be.
    3. Re:A Good Design Document by hkroger · · Score: 1

      Thank you for not sharing the meaning with us. I had to look it up too.

    4. Re:A Good Design Document by cerberusss · · Score: 1
      Bastards ;)

      vernacular
      n.

      1. The standard native language of a country or locality.

      2. a. The everyday language spoken by a people as distinguished from the literary language.
        b. A variety of such everyday language specific to a social group or region: the vernaculars of New York City.
      3. The idiom of a particular trade or profession: in the legal vernacular.
      4. An idiomatic word, phrase, or expression.
      5. The common, nonscientific name of a plant or animal.
      --
      8 of 13 people found this answer helpful. Did you?
    5. Re:A Good Design Document by Slicebo · · Score: 1

      God, I miss Jim Varney.

    6. Re:A Good Design Document by ivec · · Score: 1

      Totally agree with parent.
      Ultimately, the code is the design.
      To me, a properly documented header/source file speaks just as clearly as a UML diagram -- and it remains in sync with what the code is today.
      So I like to use doc-from-source generation tools such as doxygenhttp://www.doxygen.org/ or javadoc.

      The design document should not include any information that is readily available in the code.
      Instead, it should provide:
      - the big picture, illustrations, an introduction to a module's architecture, and how the module fits in the system.
      - an explanation and justification of all the key design choices that where made.
      - cross-referencing information (i.e. traceability of requirements, etc).

    7. Re:A Good Design Document by Thuktun · · Score: 1

      Try to use vernacular vocabulary and language style when explaining what things do [...]

      Indeed, especially with non-technical types. I had a meeting once where I had to explain the term "deprecated". Even using the term "self-deprecating" as an example didn't help.

      In a different setting, I had to do the same thing with the word "cryptic".

    8. Re:A Good Design Document by Anonymous Coward · · Score: 0

      You think that's bad? I had to look up "vocabulary".

    9. Re:A Good Design Document by cerberusss · · Score: 1

      HAHAHAHahaha! If only I had mod points...

      --
      8 of 13 people found this answer helpful. Did you?
  19. Interfaces by dsplat · · Score: 4, Insightful
    There are lots of things that can, and arguably should, be documented in a design document. One category that should never be omitted is the interfaces. Whenever a system or subsystem interacts with something else, you need to know how. This includes:

    • Database schemas. Unless your DB is so well hidden that no one will ever find it, someone will want to read it some day.
    • APIs you support or use. If there's a standard or a 3rd party product, just list it and the version.
    • Command line parameters for those little maintenance tools you don't tell the users about. This is a design doc, not a users' guide.

    --
    The net will not be what we demand, but what we make it. Build it well.
    1. Re:Interfaces by CommandLineGuy · · Score: 1

      Another thing that really should be in there is a listing of tradeoff criteria for the design. If they're documented, reviewers/developers can have a better appreciation for how the design evolved and what thought processes were followed and why particular constructs were chosen.

      --
      [Of course it's client-server; it runs on a LAN]
  20. You Already Know by 4of12 · · Score: 2, Interesting

    What happens is I read the document, find that it gives me a lot of information about certain aspects of the system we are building, but leaves huge gaps in others.

    If you can already identify gaps in previous design documents, then you are already qualified to write the next design document.

    Apart from that, talk to some other experienced people in your organization and get their take on previous projects failures and delays. Then, see if there is any way to preemptively incorporate measures into the design document to improve your projects chances for success.

    [Although, a lot of project success really boils down to getting the right people on the team.]

    --
    "Provided by the management for your protection."
  21. Code by Virtual+Karma · · Score: 1

    I would still say that code is the best design. (these are not my word. I had read is somewhere and I forgot. Sorry about that, else I could have linked it). The article said that code is the best design document and shoudl be considered so. The actual 'construction' phase happen when the code is compiled by the compiler.

  22. Keep it current by Reality+Master+101 · · Score: 3, Insightful
    There are a lot of things that can be said, but I think the biggest problem with design docs is that they aren't kept up-to-date.

    If you're really serious about having useful design docs, the only way to do it is to have a dedicated staff whose job it is to keep it current, accurate and useful. Coders are rarely good writers, and even if they are, it's almost impossible to get them to keep docs in sync.

    --
    Sometimes it's best to just let stupid people be stupid.
    1. Re:Keep it current by civilizedINTENSITY · · Score: 1

      So you are implying that after getting the design spec.s, coders go off on their own, and it is necessary to bring the spec.s down to the code rather than raise the code up to spec? Isn't that ass-backwards?

    2. Re:Keep it current by mosabua · · Score: 1

      I thnik the parent is implying that if the coders find that the specs need to be modified because they needed more detail or they needed to be modified to make any sense at all (which i find all the time) .. you need to do so. Update the spec! The implementation and the documentation have to be in sync. Always.

    3. Re:Keep it current by moderators_are_w*nke · · Score: 1

      The problem in my experience is that the best coding documentation writers are also the best coders, so they always get shipped off to work on the next tough problem and the rookies (like me) get left to document a system.

      --
      "XML is like violence. If it doesn't solve your problem, use more." - Anonymous Coward
    4. Re:Keep it current by gnalre · · Score: 1

      Then maybe you are designing to too low a level...

      Design documents should describe the problem domain and the suggested solution(and perhaps why other routes were not taken). A break down of the system to a level that an individual engineer can code and a description of external interfaces and API's.

      These should not change greatly through the project. If they do then it is a new problem and the design should be restarted.

      If you wish to document API's etc use a tool like doxygen, since it is much easier to keep it current with the code

      --
      Choose your allies carefully, it is highly unlikely you will be held accountable for the actions of your enemies
  23. My favorite design document . . . by PIPBoy3000 · · Score: 4, Insightful

    . . . is a prototype.

    To be honest, I find that customers have a hard time visualizing how something will work unless they can interact with it. I'll take some internal design notes for myself, then whip up something and reiterate.

    This approach doesn't work well with some projects, but for the small web applications I make it works great.

    1. Re:My favorite design document . . . by CatGrep · · Score: 2, Informative

      . . . is a prototype.

      Exactly!

      But most 'old-school' outfits using heavy waterfall processes think that prototyping is evil if you do any of it prior to writing your 50 to 100 page 'design document' (I worked at a place like this a few years back).

      Of course the company that uses Agile processes and encourages prototyping will probably get to market way before the dinosaur company.

    2. Re:My favorite design document . . . by sconeu · · Score: 2, Insightful

      The problem is when the prototype becomes the final product because TPTB don't want to waste money re-doing it.

      --
      General Relativity: Space-time tells matter where to go; Matter tells space-time what shape to be.
    3. Re:My favorite design document . . . by rleibman · · Score: 1

      I'll reply to you, but it applies to many other comments in this thread.

      Of course the company that uses Agile processes and encourages prototyping will probably get to market way before the dinosaur company.

      I hate most generalizations of this sort. Agile is no silver bullet: there are no silver bullets. The methods involved in Agile applied judiciously (and independently) by experienced professionals can help ***some*** projects a lot, and seriously hurt others. One difference between an Engineer and a technician is that the Engineer gathers tons of tools, and figures out when to apply each. You don't use the same methodologies for writing space shuttle software as you do for pacemaker software as you do for bank websites as you do for MS word as you do for console games: that's just stupid.

      When you are porting an accounting application to a new platform for the 10th time the waterfall process works pretty good, the lack of iterations is actually a good thing. The same approach applied to a totally untested product would just not work.

      As for prototyping... another great tool, when appropriate, and mostly as company to a well written (i.e. not paper weight) SRS, but a prototype is not design: it is requirements.

    4. Re:My favorite design document . . . by zx75 · · Score: 1

      Definitely... its much easier for a customer to grasp and express how something needs to be changed and what needs to be added than how it needs to work from scratch.

      Also a good reason to involve customers interactively in the development process when doing custom web-apps, because often they won't know exactly what they want until they see something that isn't right. (Though for the business side, sign a contract agreement for what you are going to develop for them and be clear that additional costs will be incurred for changes.)

      --
      This is not a sig.
    5. Re:My favorite design document . . . by corngrower · · Score: 1
      When you are porting an accounting application to a new platform for the 10th time the waterfall process works pretty good, the lack of iterations is actually a good thing.

      You shouldn't be needing a new design document if all you're doing is porting to a new platform.

    6. Re:My favorite design document . . . by dubl-u · · Score: 1

      The problem is when the prototype becomes the final product because TPTB don't want to waste money re-doing it.

      That's indeed a huge problem. It's worth making the prototype look and act like a prototype. Fine ways to do that include Paper Prototyping, click-through mockups in plain HTML, and the Napkin Look-and-Feel. Also consider making the prototype obviously flawed in other ways. E.g., leaving stuff out, making graphics very low-res, adding long sleeps to make it slower, and so on.

    7. Re:My favorite design document . . . by bar-agent · · Score: 1

      Depends on if the design includes UI, or takes advantage of platform-specific features.

      UIs need to be customized for each platform. And that's that.

      --
      i'd hit it so hard, if you pulled me out you'd be the king of britain [bash.org]
    8. Re:My favorite design document . . . by stygianguest · · Score: 1

      I can't see how this should replace the design document. Although it can clear up a lot of questions, I find it more plausible that it will solve requirement related problems instead of design related ones.

      But I agree nevertheless, building a prototype is much more fun than writing such a stupid document.

  24. You have good intentions by 0kComputer · · Score: 1

    But sadly we are all part of the vicious cycle

    --
    Top 10 Reasons To Procrastinate
    10.
  25. And tests, do not forget to write the tests! by nietsch · · Score: 3, Insightful

    Write them before you write the new features, to test for the new features.

    This will save you eons when you are actually coding. Way too many testers are still wasting their time with manually going through the ssame maotion again and again to make sure it all works as expected.

    --
    This space is intentionally staring blankly at you
    1. Re:And tests, do not forget to write the tests! by Anonymous Coward · · Score: 0

      Yes, it's all very logical.

      1) Write tests for features
      2) Figure out which features you want
      3) Code features
      4) Test features based on 1
      5) Miss bugs because we wrote tests before knowing what we were building.

  26. I know!!! by Iscariot_ · · Score: 1
    • Bullet points, not paragraphs!
  27. If your product has a UI by mveloso · · Score: 2, Insightful

    If your product has a UI, then the design document should start by describing the UI and how all the features work.

    If you don't have a UI, then start from the configuration file or command line switches, and do the same thing.

    Then you're done. If you can't configure a feature, or can't trigger it from the UI, then it shouldn't exist...unless there are other interaction points.

    If you have a network app, document the wire protocol, range of input values, and expected behaviors (of your app and its clients) and outputs.

    If it's a distributed system, figure out the different states and document them.

    It's actually a pretty simple, though tedious, process. Starting from the UI is a great place, because it shows you instantly how complicated your app is. If it's too complicated, this type of document will show that pretty quickly.

  28. What Makes a Good Design Document? by Anonymous Coward · · Score: 4, Insightful

    Existence.

    At least for most of the projects I've worked on.

    1. Re:What Makes a Good Design Document? by bwt · · Score: 1

      Actually, I would argue that the best design document is a NON-existent one. Documentation is a non value added task unless it actually results in the final product being produced more quickly with fewer bugs. I see no reason why I cannot go from something like use case documents to unit tests, API documentation (like javadocs), and a physical data model.

      The people who are wasting their time making documents that won't be maintained and therefore will be guaranteed to be wrong, should just be coding tests, classes, and DDL scripts.

      If you view the design doc as an end in itself, then it should provide traceability from every "what" enumerated in the requirements documents to the corresponding "how". This could be done with class models, physical database models, data flow diagrams, and sequence diagrams, along with a big matrix cross referencing these artifacts to the enumaration of the requirements.

      I contend that requirements are never stable enough for this traceability to have any real value. All it does is add cycle time to feature changes and make you less agile and produce fewer features per year. Even if all requirements were known and set in stone, the "best" way to implement them changes over time as new technoligies and standards (including your organization's internal ones) change. So design documents hamper refactoring. I content refactoring and agility are more important that auditability to the bottom line of your enterprise.

  29. If all fails.. by Anonymous Coward · · Score: 0

    >> if all else fails, where's a good place to find all this stuff out?

    fastForward (till the end of the project)

    Look (comments)

    If (no comments){
    setdesign(null)
    worry(no)
    }
    else{
    setdesign(comment)
    }

    comeBack(present)

    getDesign()

  30. Document the choices by tcopeland · · Score: 2, Insightful

    Don't document every function and class. That's useless; let Doxygen or Javadoc do that.

    Instead, document why you chose PostgreSQL over [foo]. Why you chose to roll your own templating system. Why you fork off jobs in a separate process rather than doing them in one process. Why you wrote this particular thingy as a C extension.

    Documenting that stuff will be helpful to folks down the road when requirements/environments/whatever changes and they wonder why things were done this way in the first place.

    1. Re:Document the choices by dmatos · · Score: 1

      Close, but I'd make a couple of changes to your suggestions.

      Document why you are choosing PostgreSQL over [foo]. Why you are choosing to roll your own templating system. Why you are going to fork off jobs in a separate process rather than doing them in one process. Why you are going to write this going to write this particular thingy as a C extension.

      A design document is something that should be written completely before the first line of code is entered. It is something that can be used to ensure that your design meets each and every one of the requirements in an efficient manner so that you don't start coding, realize you something is missing, and have to kludge it in.

      --

      It may look like I'm doing nothing, but I'm actively waiting for my problems to go away.
      --Scott Adams
  31. There is no perfect design document.. by Kalroth · · Score: 1

    .. and if there is, I've yet to see it. :-)

    Short answer:
    Some UML (Use Case + Activity + Class) documents and a technical textual description of the task.
    You can of course add more, but in 99% of the time, the programmers will either ignore or overlook it.

    Long answer:
    We (small software business) are working on making our inhouse design documents more standard.

    One of the things we ran into was also the "What should we assume to be basic knowledge for a design document" question and after having spent some time, we came to the conclusion that design documents had to be so basic that you can replace a programmer in almost any state of the project.

    Based on above we made an estimate on how long it'd take to make the proper documentation, showed it to the manager, got a swift "fsck no!" reply and went back to the old system of poor documentation, but high productivity (and many bugs ;)

    Personally I try to aim for the "three developers" goal. If three non-involved developers can understand it and come to the same conclusion as me, then it's all good.

  32. Simple by dfn5 · · Score: 1
    A document that accurately specifies what the customer needs as opposed to what they asked for.

    --
    -- Thou hast strayed far from the path of the Avatar.
  33. Test Driven Development, User Stories by shapr · · Score: 1

    My preference is to get a list of features from the customer in the form of User Stories, and turn those directly into Acceptance Tests.
    Tests tell you what to do, and when to stop.
    I also put a rough estimate on the various user stories, and then let my client prioritize the stories so the work I do first is what they want most.

    In many cases, clients don't know what they want until you don't give it to them. The best approach I've found for those cases is to whip up a tiny prototype to show to the clients and ask them what they like and don't like about that prototype.
    Clients know what they want, but they rarely understand what's hard and what's easy when it comes to software.
    So, I think design documents are best as a bunch of 3x5 cards holding user stories, along with matching acceptance tests.

    --

    Shae Erisson - ScannedInAvian.com
  34. IEEE Standards!!! by ShyGuy91284 · · Score: 1

    As I have learned from classes, following IEEE standards to the T!!!!! Go 830-9993........... What? You mean there's more to writing a good document then following the standards? Impossible.......

    --
    In undeveloped countries, the consumer controls the market. In capitalist America, the market controls you.
  35. Wiki? by adz · · Score: 2, Interesting

    Has anybody tried using a wiki for the design documents? Might help keep the documents correct and up-to-date.

    1. Re:Wiki? by Anonymous Coward · · Score: 0

      Just implemented a few weeks ago.. it works out great since anyone at any terminal can place their changes directly into the wiki. The bad news.. it can get unorganized real quickly and there is no easy way to print the document to hardcopy.

    2. Re:Wiki? by ninjagin · · Score: 1
      We did this for a couple projects at my last job, and it started out just fine, but entropy eventually set in and allowed the documents to drift, for a few reasons:

      1. folks would either forget to update the pages with all of the new information or forget to delete/rewrite old content
      2. the tendency to start new wiki pages is hard to resist, so what starts out as a cohesive set of docs smooshes out into a big soupy unorganized blob, even if it is updated regularly
      3. the review of changes in a wiki-based approach tends to be less formalized than a requirements/design process that's conducted on paper (with signoffs). You can tell someone to review a wiki page and make corrections (which they may or may not do). On the other hand, a paper document that needs initials/sigs is something physical that lands on a desk, sits there waiting for attention, and eventually gets some kind of review and the application of some ink that says that it was reviewed.
      4. depending on which type of wiki you're running, images (putting them in the doc, recording the changes) can be a hassle. Plain old Word (or OpenOffice Write) docs seem to be able to handle diagrams much more easily.

      I used to think that everything in software could be done without paper, but there are some things that paper is really good for. Wiki can be good for a lot of things, too, but my experience has taught me that it's not the best tool for requirements/design.

      It's just my experience, though. YRMV.

      --
      .. pa-ra-bo-la, pa-ra-bo-la, 2 pi R, 2 pi R, where's your latus rectum, where's your latus rectum, 2 pi R
  36. Find the Guru by StarWynd · · Score: 2, Informative

    The primary problem is that there's too much information to document. I could create a document which included every design decision and every little facet of the project, but the document would wind up so huge, it'd be impossible to work with. The best resource I know of is the project guru. Every project has one -- the one guy who seems to know everything or at least can tell you where to find the details. Find this guy and pick his brain as much as you can. That'll carry you a lot farther than the documentation itself. However, if the guru is no longer around, you're up a creek without a paddle.

    1. Re:Find the Guru by Grab · · Score: 1

      Exactly - which is why you WRITE IT DOWN!!!!! If the decision was trivial, no worries. But if it was anything significant, or involved any reasonable application of brainpower, get it documented.

      Grab.

    2. Re:Find the Guru by StarWynd · · Score: 1

      Of course, but there is a trade-off between the depth of the documentation and the ease of use. It's easy to get lost in the documentation especially for large projects. If you record every last use of "brain power," you're going to wind up with a lot of detail that will be hard for the new programmer on the scene to wade through.

      Let me use a good ol' practical programming example. Oracle is by far one of the most powerful, but yet one of the most complicated programs to work with. If I recorded every detail of Oracle, I'd wind up with a tome which would contain a huge number of volumes. While this ensures that I have every last significant detail written down, it becomes really hard for the new programmer to learn or to even find the place where the answer is. It's easier to learn if there is a distilled version of the documentation. While it doesn't have every last detail, it can get a new programmer started on trying to learn the system. This still isn't the best solution because you may need specific information that isn't included in the distilled version. The best case is to find your Oracle guru and get some guidance from them. Your co-workers and the local gurus are the greatest assests. Sometimes a quick question to your local guru will save you hours of trying to figure things out on your own. Use the documentation first, but when the documentation breaks down, find the people who know where things are and just ask them "Hey, where can I find this or that?"

      And by the way, if you find yourself asking such questions, WRITE THE ANSWERS DOWN somewhere and amend the documentation itself. It's all too often that the same old problems are revisted time and time again because no one wrote down the answer the first time.

    3. Re:Find the Guru by dubl-u · · Score: 1

      I could create a document which included every design decision and every little facet of the project, but the document would wind up so huge, it'd be impossible to work with.

      Exactly! Documents should be written for particular audiences who have particular purposes. The document that included everything would have enough information that you could just write a compiler to build the project, completely eliminating the coding phase. And it would be a terribly boring document that almost nobody would read.

      The best resource I know of is the project guru.

      Even better, you should arrange your project so that everybody has an opportunity to become a guru. Getting everybody (including the product manager) to work in a single project-focused team room is great for that. Also valuable are test-driven development and pair programming.

      Eventually, the project will go dormant and the team will scatter. That's the time to write documentation.

  37. "pictures"? by Anonymous Coward · · Score: 0

    >>If I have to choose between a 50-page design document and three pages of clear diagrams, I'd pick the pictures.

    Bingo!! No stories, only porn pictures.

  38. !Who! Makes A Good Design Document by Fox_1 · · Score: 1

    A Good Product Manager
    This person should follow the development of a product from beginning to end, and document as well as be responsible for the production of the Design Requirements.
    The Product Manager should work in the business/marketing side of the company, as ultimately the customer will determine the success of the product, however they should have a strong enough background in the technologies that they aren't some caricature from a Dilbert cartoon. It isn't necessary to define individual segments of code since the basic technologies may change by the time the project moves to design and later phases - but the end results of the implementation of the elements of the product should be documented, the developers can then always know what their product should be capable of. Of course everybody who does work should be documenting their work and ideally to document specs laid out by the Product Manager to ensure consistency with all the product materials.

    --
    The rock, the vulture, and the chain
    1. Re:!Who! Makes A Good Design Document by Fox_1 · · Score: 1

      I left enexplained and likely understood I hope that the PM coordinates regular meetings (with agenda's, minutes and all that) on the products design, development, and testing on a regular basis (weekly)with all involved parties (devs,QA,Mkting,etc) to ensure that the product is matching the expectations laid out in the documentation.

      --
      The rock, the vulture, and the chain
  39. Cohesiveness by behindthewall · · Score: 1

    I have worked for organizations that uses Lotus Notes extensively.

    [diety] save me from documentation that consists of links upon links upon links. I certainly find this disconcerting, and I imagine I'm not the only one in that execution based on these documents often seems disjointed with significant factors going lost in the process.

    Whatever you put together, try to ensure it's not blown into thousands of pieces. Documentation requires some effort; updating should be more than just glomming on a paragraph at some document boundary or via yet another link to an independent context (independent document). The payoff is when you can actually get an overview of what you (and OTHER teammates) are doing, in a reasonable amount of time and with a reasonable amount of effort.

    It also protects your organization from the proverbial "run over by a bus" (as in, the only one who knew this just was...).

  40. Model Driven Development by __aaanwh8370 · · Score: 2, Interesting

    I've had excellent success with model-driven development.

    The basic process is : create a model that encapsulates the three bigs:

    1) Analysis (i.e. requirements, actors, and use cases)
    2) Components (object models, system models)
    3) Interactions (interfaces and sequencing)

    Once your model contains a good description of these three domains, expressing a design document from the model is straightfoward (indeed, many of good modellers will provide excellent document generators). XDE works fine, but my particular favorite is Enterprise Architect

    The beauty of treating the design document as an expression of the model is that by changing the model, you change the document.

    In a situation where you're doing large scale code-generation from the model, you're living high on the hog - one repository for your solution information, and any number of expressions of that information into the formats you need (requirements docs, design artifacts, codebase, etc...). By actually including the analysis elements of the solution (the requirements, particularly), you can link those requirements to system components that fulfill the requirements. As the requirements change (and, of course, they will), you can evaluate the impact of those changes quickly by tracing the associations.

    Decent article on MDD

  41. not so much design documents... by LegendOfLink · · Score: 1

    In my experience, I'll be honest and tell you that design documents are a pile of crap. They're usually written from a limited point of view with the assumption that you understand all the nuances of the business. Most of the time, that is not case.

    You're a lot better off talking to the key people involved in either the business process or decision making. If you're working for a smaller company, this is relatively easy to do; however, if it's a larger company, I would think it's more difficult (ie less access to the managers). But find out how the process works and what people are looking for in a system.

    The key to obtaining the right information is to ask the right questions. Don't approach with, "Hey, I'm designing a new system, what are your needs?", but rather approach with questions regarding problems with the current system. Then, when you get a feel for everything, you can design a system that will fit the right needs.

  42. Re:Mythical Creatures? NOT by jcomeau_ictx · · Score: 2, Insightful
    I don't know, but then, I've never seen one of these rumored documents, so I can't say for sure.
    Sure, you have. RFCs are my idea of what makes a good design document: tell me what I have to do to make this software interoperable with the rest of the world, what you want this software to accomplish (including sample gozintas and gozoutas), and that's it. Short and sweet. Now get out of the way and let me code. :^)
  43. Don't forget Requirements by Anonymous Coward · · Score: 0

    Design is the "how", a tactical plan that requires the "why", or the strategy. What functionality is required? The strategy is often not in place.

    Requirements documentation is the "why" and the strategy driving the software development. This should be done before the design and is almost always neglected. This becomes more important with either feature creep or software maintenance. The "why" will always help to keep focus on the important factors in mind.

    If requirements change, there is often a value attached to those changes. As a result, the justification for increases in development are often understood and accepted. In the outsourcing development world, it is also the basis for a contract to show that the program meets the needs of the customer.

  44. Re:A Big Chief Tablet and... by dsplat · · Score: 0

    Spoken like an experienced Extreme Programmer.

    --
    The net will not be what we demand, but what we make it. Build it well.
  45. Keep it up to date by mosabua · · Score: 1

    There is lots to say about design documents but one thing I always find to be lacking is how up to date the documents are. Mostly they are written for some sort of release and then left untouched again until the next one. That's bad. Enforce that any change to the software in terms of features and requirements has to be documented as part of the implementation task. No bug or change requests gets closed without the documentation being done and being up to date... Hard to achieve but once you documentation is concise AND up to date you will be a great step closer...

  46. Most Important part of Design Document by Loitl · · Score: 3, Insightful

    The most importnat part of a design document is to document what is NOT going to be implemented.

    1. Re:Most Important part of Design Document by fraudrogic · · Score: 5, Funny

      Ah yes...the infinitely outlined requirements document is my favorite:

      1.1.1.1.1.1.1.1.1 The system shall not make tacos on demand.
      1.1.1.1.1.1.1.1.1.1 The system shall not make tacos on demand with sour cream.
      1.1.1.1.1.1.1.1.1.2 The system shall not make tacos on demand with guacomole.
      1.1.1.1.1.1.1.1.1.3 The system shall not make tacos on demand with cheddar cheese.
      1.1.1.1.1.1.1.1.1.3.1 The system shall not make tacos on demand with sharp cheddar cheese.
      1.1.1.1.1.1.1.1.1.3.2 The system shall not make tacos on demand with mild cheddar cheese.
      ...

      1.1.1.1.1.1.1.2 The system shall not make CHICKEN tacos on demand.

      ...

      this could get messy.

      --
      I only mod up parents of "mod parent up" posts...
  47. Reference the requirements. by JustNiz · · Score: 1

    Yep. Reference the requirements document from the design document, showing how aspects of the design address each particular requirement.

    You may also find it useful to split the design document into a hierarchy of many; one or more high-level documents for module-level descriptions, each having one or more low-level design documents for stuff like unusual algorithms or other non-obvious aspects of the design of a particular module.

  48. Good Writing by EEBaum · · Score: 1

    A good design document, like any technical document, should be well written. All too often, something that could take a sentence to write is expanded into multiple paragraphs or even pages, because the writer likes to feel important. Keep it relevant, and keep it simple.

    Also, despite what they tell you in academic paper-writing classes, it's *all right* to write in everyday language. A statement such as "The user moves pointing device A over the activity area of the button in question, intending to activate Process Retroincabulator, and presses the button of activation." can easily be replaced by "Click button A."

    Less is more. Each unhelpful word the engineer has to read in a hopelessly long design document brings them one step closer to "Screw it, I'll do it my way and get yelled at later." Reread and revise, removing as much unnecessary verbage as necessary.

    --
    -- I prefer the term "karma escort."
  49. General principles by turg · · Score: 1

    The basic idea behind writing anything right is to know your audience. You've used these documents before -- write out a list of all the information you, as a user of these documents, need to get out of them to do the work properly. The format, etc., should support the answering of these questions -- don't decide on a format/structure and then shoehorn the information into it.

    --
    <sig>Guvf vf abg n frperg zrffntr
  50. peer scrutiny by spyrochaete · · Score: 1

    The best thing you can do is compose an outline or draft and show it to as many people as possible. Get feedback, criticism, and suggestions, and update the outline. Then get feedback again. The more eyes, the fewer mistakes.

  51. The Test Plan *IS* The Design Document by rewinn · · Score: 1

    No matter what the official titles may be, the real design document is the test plan.

    This is because if the product should accepted if and only if it satisfies the test plan. A good test plan will thoroughly exercise the conditions that the product will encounter, and specify the expected response. Once you know those things, generating a traditional design document is trivial (plus or minus nontrivial graphic design).

    Because PHBs expect something called a Design Document, I suggest you build a database of Product Condition/Responses (e.g. "Condition: Push Red Button; Response: Sound Klaxon") which you can sort one way to produce a design document and another way to produce a test plan. This is not intended to be cynical; design documents may need to be organized differently than test plans.

  52. Not sure what type of design document. by Voidwalker · · Score: 1

    I've taken a few software engineering courses, there are two main documents of a design spec. I'm not sure from your post whether you're lumping them into one or not, but they are Requirements Definition and Requirements Specification. Look up ANSI/IEEE Standard 830 for the full blown layout of these things. You can tailor them to suit your needs (not all the guidelines need to be followed)

  53. Try Joel for a good Functional Spec description by rmerrill11 · · Score: 5, Informative
    I think that Joel Spolsky addresses software design docs well. Among other things, at one time he was responsible for writing the software spec for Microsoft Excel.

    Summary:
    This series of articles is about functional specifications, not technical specifications. People get these mixed up. I don't know if there's any standard terminology, but here's what I mean when I use these terms.

    1. A functional specification describes how a product will work entirely from the user's perspective. It doesn't care how the thing is implemented. It talks about features. It specifies screens, menus, dialogs, and so on.
    2. A technical specification describes the internal implementation of the program. It talks about data structures, relational database models, choice of programming languages and tools, algorithms, etc.
    When you design a product, inside and out, the most important thing is to nail down the user experience. What are the screens, how do they work, what do they do. Later, you worry about how to get from here to there. There's no use arguing about what programming language to use before you've decided what your product is going to do. In this series, I'm only talking about functional specifications."

    One of his books: Joel on software

    His blog: What's a Spec?

    Highly recommended!

    1. Re:Try Joel for a good Functional Spec description by Anonymous Coward · · Score: 0

      And I've seen many a functional specs that were almost useless because they didn't make it clear what the information really was that was presented to the user. For example, one screen returned the results of a query from 4 tables and had a column labeled date, but each table had 2-3 date columns. Yes, the technical spec could have spelled this out, butthe functional should identify what & why a user is getting something!

    2. Re:Try Joel for a good Functional Spec description by mrtom852 · · Score: 1

      I've seen too many clowns in the industry who think they can write a functional spec. I'm not saying they are useless but I think it's safer for most small-medium sized projects to do without them

      In my mind there should be a business plan a technical spec and prototypes.

    3. Re:Try Joel for a good Functional Spec description by Anonymous Coward · · Score: 0

      Joel Spolsky

      A programmer who talks like he works for NASA but actually only produces web based bug tracking software written in VB.

    4. Re:Try Joel for a good Functional Spec description by cerberusss · · Score: 1
      A troll, but I'll bite.

      I hold Joel Spolsky in high regard. He has set up a company in New York City, created a number of products and shares his knowledge with the rest of the world in plain understandable English. He is the CEO, but fluent with VB, C++, PHP and has done extensive design work. He's gay and makes jokes about it.

      So, what have you done?

      --
      8 of 13 people found this answer helpful. Did you?
  54. How does MS or other 'big' ones document software by dilan · · Score: 1

    I have never worked for a large software company. How is a large design effort that goes into something like Windows or Oracle documented and maintained. I am sure these companies would separate people from processes and maintain the independence.

  55. After the design document comes by rjh · · Score: 5, Insightful

    ... the "this is how it really works" document. That's what you're really interested in. There's nothing wrong with the design documents you've seen.

    No, I'm not kidding.

    The design documents which have driven you mad probably weren't incomplete. They were probably quite complete design documents. But a complete design document isn't supposed to cover everything. If you had a design document that was fully specified in every significant detail, you could run the design document through a compiler and generate your code. (This isn't as far-fetched as it sounds; there are tools to automatically generate large amounts of code just from simple UML diagrams. That's an example of design documents being translated directly into running code.)

    A design document can best be viewed as the development team's prejudices regarding the best way to solve the problem. There will be holes in the design document, mostly in those areas where the programming team doesn't really have a good grasp on what the best thing to do is.

    A good design document is a like a good steak; they're best when served a little bit rare. You want to give the guy who comes after you a game plan, but you don't want to commit yourself to doing things in one particular way when you don't know if that one particular way is going to work. After all, once the design document has had every stakeholder sign off on it, going back to the drawing board and saying "uh, this isn't going to work, let's try something else" means all the stakeholders get back on board again. But if the design document has some room to move--what you think are "holes"--then that gives the programmers freedom to get the job done without having to go through the entire design approval bureaucracy again.

    Most serious software engineering shops worship at the altar of requirements and architecture documents. Hackers in the trenches add the "this is how it really works" document to that list. There's nothing quite as valuable as stumbling across some prior hacker's notes when you're trying to grok the system.

    Stop looking at the design document for the 'missing' stuff. It might very well have been deliberately omitted. Start asking around for the "this is how it really works" documentation, instead.

    1. Re:After the design document comes by Anonymous Coward · · Score: 0

      there are tools to automatically generate large amounts of code just from simple UML diagrams

      To take it one step further, if you can design a complete model, there are tools that can implement that model (for example, in C)...

  56. Pictures are good! by gosand · · Score: 5, Interesting
    I have to say that the most useful design documents that I've seen are ones that contain diagrams, flowcharts, and other "pictures" of how the system (or the module, component, whatnot) functions.

    Amen. I do Quality Assurance (and for those who don't know, that isn't just testing). I use design docs to figure out how something is supposed to work before I get it. Pictures are good. You can (intentionally) bury information in a 50 page document. It is hard to bury information in pictures. I say "intentionally" above because in the past I worked with a guy who was the director of a development group. He didn't like to design things, or tell people about how things were going to work. So his requirements and design documents were vast containers of information. His standard answer to questions was: It's in the document.

    Me: What is the flow of events from beginning to end?
    Him: It is in the document.
    Me: I couldn't find it. Where is it?
    Him: It's in there, you just have to find it. See, here on page 3, and on page 10, and...ummm... You just have to piece the information together, but it is all in there.

    Talk about information hiding. In meetings, people would ask questions, and he would say "It's all in the document, should I go get it?" Nobody wanted to spend meeting time sifting through it for answers. And sometimes, the answers weren't there, and we would always get the "I'll add it". Of course, nobody ever checked to make sure he added it.

    I fought for months to get him to add a flow diagram in a doc. He kept insisting that all the information was there and that a diagram was useless. After months and months, he finally added it. The FIRST thing that someone said at the next meeting was how useful that diagram was, and they pointed out some improvements to it. It turned out those comments sparked conversations that led to the discovery of flaws that went unnoticed for months. I'll leave it up to the reader to guess who got credit for the diagram in the document. (hint: Senior QA person or director of development)

    Let me re-iterate: pictures are good.

    --

    My beliefs do not require that you agree with them.

    1. Re:Pictures are good! by multriha · · Score: 1

      Sounds like your colleages don't understand the difference between in the document and deducible from the document.

    2. Re:Pictures are good! by jafac · · Score: 1

      Worst answer:
      "if you want to find out what my code does, read it." (. . . then worship me for my superior ability at obfuscating functionality through obtuse syntax.)

      --

      These are my friends, See how they glisten. See this one shine, how he smiles in the light.
    3. Re:Pictures are good! by CheeseTroll · · Score: 1

      I totally agree. I've lost track of how many times I, as the designer, *think* I know how to get from point A to point C, but it isn't until I attempt to show the flow graphically that I see the gaping holes in my understanding. It's just too easy to bog down in the detailed text, especially early on in the process.

      A high-level view of the flow is especially handy when bringing a programmer up to speed on a project quickly. Often, by the time we introduce the project to the developer(s), I've been researching the topic for weeks, and can overwhelm them with obscure details without conveying the overall goals, if I'm not careful.

      --
      A post a day keeps productivity at bay.
    4. Re:Pictures are good! by sgt_doom · · Score: 1

      Just be sure not to take any advice from anyone associated with Microsoft - of the many things they are incapable of there - documentation and design documents are definitely one of those categories.

    5. Re:Pictures are good! by Anonymous Coward · · Score: 0

      I don't really get it.
      Could you please make a diagram that shows it clearly?

    6. Re:Pictures are good! by patrickcollins12 · · Score: 1

      Bad documentation is bad documentation whether it's in a picture or in text.

      I have found that most software engineers get so hung up on UML notation of their diagrams that they end up never doing any because it takes too much effort.

      Start with simply and succintly writing what the software does COMPLEMENTED by a diagram. Not the other way around.

      Diagrams on their own are useless without some accompanying explanation. Ever read a book full of diagrams?

  57. explain why by senahj · · Score: 1

    Every design involves choices and tradeoffs.
    Each of these requires a decision.

    In order to intelligently maintain and extend
    the project, the owners need to know why each
    decision was made: what were the design goals,
    what were the available alternatives,
    what were the constraints, and what might be
    done under different alternatives or constraints.

    That is, explain why the design is the way it is.

    "This algorithm has n-squared behavior, but
    was easy to implement and test. N-squared
    behavior is tolerable for a small number
    of fazzbarns, and we are fairly certain that
    no more than a few fazzbarns need ever be supported.
    If the glup module is ever scaled up to produce
    more fazzbarns, this will be a bottleneck, and
    the well-known but much more involved RTTD
    (Right Thing To Do) approach, with n*log(n) behavior,
    would be much better."

    He's no fun; he fell right over.

    --
    Wait a minute. Didn't I say that on the other side of the record? I'd better check ...
    1. Re:explain why by KlomDark · · Score: 1

      Just for the evil fun of it, I just pasted your paragraph about fazzbarns into the middle of some code I am just getting ready to put into production as a comment. (A large data manipulation intranet web app).

      Some poor guy in the future is going to come across this explanation (right in the middle of some relatively complicated code) and be like "W in TF???"

  58. Requirements are the foundation! by mikesmind · · Score: 2, Insightful
    You can write the best design document around, but if it doesn't address the requirements, it won't produce a good result.

    I think that most requirements gathering activities don't involve the right people. Most importantly, they should involve the developer. I have seen requirements sessions involving only the business analyst, an IT lead, and the project manager. They leave out the developer! Usually it is done because the developer is busy with other things.

    If you leave the developer/programmer out of the requirements work, they never get the opportunity to understand the requirements and ask questions as the requirments are formed. If you do these two things, you will get much better designs.

    --
    www.mikesmind.com - www.daddyworkathome.com - www.freetofarm.org - www.tenfoottable.com
  59. I like to include the "why" by WarmBoota · · Score: 1

    I like to describe why I did things in a particular way. Much of what ends up in a design document describes what the system does (I can run the app to see that), or how it does it (that's what the code is there for and I guarantee that the code is more recent than the design document).

    What always gets me is when I show up and ask "Why didn't you use XXXX?" No one knows. Often there is a really good reason that I find out after weeks of unsuccessfully attempting to implement XXXX.

    --
    90% of everything is crap. Also, crap is relative.
  60. Like the Yeti by Anonymous Coward · · Score: 0

    In 20+ years of programming, admittedly all in groups of 15 or fewer programmers, I have yet to see a good design document. Most design documents are obsolete as soon as a significant amount of code has been written.

    1. Re:Like the Yeti by Anonymous Coward · · Score: 0
      Ditto here (also 20+ years).

      Design documents are a waste of time. The last one I wrote (under duress) even had to include sequence diagrams -- for code that hadn't even been written yet.

      Within the first day of coding, the "document" became obsolete, because of course as I coded I had to change things.

      Not that it mattered much, because nobody actually read the document.

  61. in English by kin_korn_karn · · Score: 2, Insightful

    Having someone that can speak and write English do it will go a long way. My current project is working from a design generated by an Indian guy that has no clue what half the words in the language mean. I resent having to rely on half-assed work when I'm not in a position to advise on the design. It's not hard to run the grammar checker.

    1. Re:in English by freedom_india · · Score: 1
      The indian guy probably writes in "English".

      Words like "Yo man!", "wassup dude!" don't exactly count as literary art pieces.

      If i were you, i would goto college or study up on Collegiate dictionary and actually try to learn English as it's spoken around the world.

      --
      "Doing what i can, with what i have." ~ Burt Gummer
    2. Re:in English by kin_korn_karn · · Score: 1

      No, it's not the Queen's English or any kind of standard international english. It's plain old I-don't-know-what-the-fuck-I'm-saying half-assed English.

  62. Don't document your code. by ring-eldest · · Score: 2, Insightful

    How does the classic quote go? If it was hard to write it should be hard to understand.

  63. Video game design documents... by __aaclcg7560 · · Score: 2, Insightful

    Video game design documents are tricky beasts.

    If the design document is underweight, it was good enough to trick the bean counters into giving up the first check. But you really can't use it to build test cases out of it since the developer can add or subtract whatever they want.

    If the design document is overweight, you can build test cases with a fair degree of accuracy over the life of the project. The problem is that some developers will bristle at being held accountable for every detail promised and don't like their milestone checks being held up until they deliver the goods.

    The ideal design document that lays out what to expect without too much overwhelming detail and the developer delivering to full spec on time probably doesn't exist. At least, not in the video game industry.

    1. Re:Video game design documents... by sconeu · · Score: 1

      You don't build test cases from design documents. You build them from REQUIREMENTS documents!

      --
      General Relativity: Space-time tells matter where to go; Matter tells space-time what shape to be.
    2. Re:Video game design documents... by __aaclcg7560 · · Score: 1

      You build them from REQUIREMENTS documents!

      I'm talking about the video game industry. I have never seen a requirements document, only design documents (which are usually elaborate sales pitches). A good lead tester can build test cases off the sales pitch... uh, design doc. :P

  64. Software Engineering 2005 == Medicine 1805? by gvc · · Score: 4, Insightful

    Much of software engineering is received wisdom. It involves little engineering and even less science.

    I draw the analogy to medicine in the 19th century because at that time physicians were finally trying to investigate the causes of disease and developing insight that, more than a century later, would lead to their interventions improving rather than diminishing life expectency.

    Nobody knows what "best practice" should be, yet we're codifying a process. The design document is one aspect of this process. Rarely is the purpose of a design document to convey design. Rather, it is a "deliverable" presented to a PHB or client as evidence of progress. To this end, the larger and prettier it is, the better.

    1. Re:Software Engineering 2005 == Medicine 1805? by sr180 · · Score: 1
      Much of software engineering is received wisdom. It involves little engineering and even less science.

      I dont agree at all. That is exactly half the problem, too many 'coders' dont involve ANY engineering process into the system at all. Science isnt involved here, as science is the research into better computing.. However, engineering is the production of systems that work. Design, implementation, testing, production and delivery are ALL engineering processes. Adherence to engineering thought through out these processes WILL result in a better product.

      --
      In Soviet Russia the insensitive clod is YOU!
  65. When to write a design document? by teetam · · Score: 1
    In companies with strict processes around design documents, usually there are rules to make sure design documents are written and approved before coding happens.

    However, most of the time, the code rarely stays true to the design. Things come up and the code has to keep adapting and changing. By the time the software is released, the design document reflects the original intent and not really the actual design of the system.

    As a result, it less useful and may even be misleading to someone new.

    If we do the opposite and let developers write design docs after coding, there is often very little interest in work that is already done, so the docs turn out to be very sparse.

    IMHO, the best design documents are closely tied to the code itself and constantly gets reviewed as a part of the code reviews as well. That is the only way to make sure relevant information is documented and that the document stays fresh.

    --
    All your favorite sites in one place!
  66. good code by fermion · · Score: 2, Interesting
    I have worked on three or so real legecy projects, not to mention going back to my own old code. In each case the official documentation has been hopelessly out of date. What saved me is the quality of the code. Even in the most archaic languages, good developers self document in such a way that other good developers can easily understand and map the process.

    Good design documents show intent, but it is the code itself that determine the process. It is like a factory. One has draft and official procedures, but it is the marked up copies on the floor that indicate what is actually going on.

    Amazingly, I find this somewhat harder to do in OO languages. The flow is often not as clear due to polymorphism and the like. Makes coding easier, but sometime reading harder. I guess it is just a matter of manners.

    --
    "She's a scientist and a lesbian. She's not going to let it slide." Orphan Black
  67. Good requirements = good design by jmh_az · · Score: 2, Insightful
    A good design document starts with good requirements. It also requires that your process have some way to capture and fold changes back into the documentation as necessary.

    A good place to look is "Software Requirements--Revision" by Alan Davis (1993). I don't agree with everything Davis has to say, but the book is full of good ideas and potential "gotchas" to watch out for. Another good reference is DO-178B, the guidelines used for the development and testing of safety-critical software in commercial aerospace applications. It is available from the RTCA for about $50.

    If you're doing an OO project, then you might want to look at Booch's book: "Object Oriented Analysis and Design" and the UML 2.0 specification .

    But, most importantly, you MUST have some kind of design documentation (requirements, at a minimum) and that documentation needs to be flexible enough to accomodate changes without causing everything else to grind to a halt while the revisions happen. Expecting to get good software with inadequate formal documentation, minimal planning and insufficient requirements is why 70% of all commercial software projects end in failure (documented and published statistic).

    Anyone who says you can do good software by shooting from the hip is nuts. And they don't work for me.

  68. Re:Audience == People (mod parent up) by RealProgrammer · · Score: 1

    Every document should focus on its audience, which in the case of a design document changes over time. Its goal should be to get the reader up to speed on the target program or system, with as little self-aggrandizing fluff as possible. Keep it simple, and work from the top/outside to the bottom/inside.

    It should always give an overview of the program, telling what each chunk does. It should also tell how the program does what it does in terms of the chunks of the program, but not the details of how each chunk should do what it does. It should tell how the chunks relate to accompish the task.

    At first, the design document should specify the boundaries of each chunk of the program or system being developed, along with the data to be exchanged at the borders.

    As time goes on, and the work progresses, the design document should be changed to reflect the current status, as if there were no work completed. The goal is to zero in on the completed program, not to have it expand out of control, so you have to watch that.

    When handled properly, the finished program and the finished design document make a better finished product. When handled incorrectly, you have either unimplemented or undocumented features, two classes of bugs that are particularly annoying for the end user.

    --
    sigs, as if you care.
  69. What Makes a good design document by Anonymous Coward · · Score: 0

    There is no "best method". There are however, some good cliches to follow:

    1. Less is more: The less detail you go into the more likely it will be relevant.
    2. A picture is worth a thousand words: simple high level diagrams are good.
    3. If you have nothing to say, say nothing at all: write documentation because it is needed, not because you feel you should.
    4. Don't be a copycat: If the code documents what needs to be said, don't duplicate the code in your documentation.
    5. Those who can not remember the past are condemned to repeat it: Team knowledge is your greatest resource. A "living history" will give you a better understanding of a piece of software than a document ever can.

    Where I am working we are experimenting with using a Wiki for writing and maintaining documentation. It might be worth your looking into.

    Also, using something like javadoc for documenting you classes and class files is probably better than writing a separate document.

  70. OO UML by Yakasha · · Score: 1

    I've found most useful three things:
    Class Diagram
    Use Case Scenarios
    Flow Chart

    The class diagram I think is the single most useful doc for any OO project. It tells exactly what the package/application/whatever can do, and often gives some insight into what the designers were thinking.

    Use case scenarious tell you how the designers imagined the program would be used. You can also ask users to write down how they envision their interaction with the program.

    A flow chart or state diagram or something similar for the app if needed. The larger the app, the more useful this is.

  71. RFCs are requirements documents, not design by rjh · · Score: 5, Interesting

    RFCs are requirements documents, not design documents.

    An RFC specifies what behavior MUST, MUST NOT, SHOULD, SHOULD NOT, MAY, MAY NOT exist. It doesn't say jack about how that behavior is supposed to come into being. I could write an OpenPGP application that did all of its work by hiring Bruce Schneier to manually do the RSA computations, and it'd pass the RFC.

    RFCs aren't design documents. RFCs specify behavior; design documents specify how that behavior is achieved.

    1. Re:RFCs are requirements documents, not design by jcomeau_ictx · · Score: 1
      That sounds right. I responded without thinking it over. But then, that being the case, maybe design documents are an exercise in futility, since the first (and often second and third) design ideas are usually proven unworkable in practice. The original post seems to support that, as the developers had to keep maintaining the design document as they coded.

      Maybe it's better to have someone (not the coders, but a programmer) write the design document after the code is written and tested; documenting the design as it was done.

      As you can see, I'm a stranger to these concepts, being more of the "lone coder" type and never having coded in a corporate structure, and never with a "team" larger than 2 members. So I'll get out at this point since I'm obviously in over my head.

    2. Re:RFCs are requirements documents, not design by Anti+Frozt · · Score: 1

      If I had mod points, I'd give them all to you!

      I've recently graduated from university with a CS degree. I've had practical work experience developing n-tier systems and I can tell you that a lot of people always confuse these two aspects of systems engineering. In the few documents I've seen (this seems to be another problem, but I'll leave that to another discussion), it is all but common-place to list requirements followed by a blurb on implementation details.

      I was fortunate enough, through my instruction, to learn the significant difference between requirements and design and that they need to be seperated. A requirements document should be able to be picked up by anyone and give them the ability to draft a design document for their specific implementation, e.g. coding it in VC++ instead of Java (though language can sometimes be a requirement) or using one sorting algorithm over another.

      --
      In C++, friends can touch each others private parts.
    3. Re:RFCs are requirements documents, not design by ThosLives · · Score: 1
      I agree that RFCs are requirements documents, but if you ever see a requirement "this feature SHALL NOT do such-and-so", reword it immediately. There is no way to test that somehow, somewhere in the future, the code does not do something weird. In fact, a not requirement means that anything other than what you excluded is allowed to happen. Here's a simple example.

      Bad requirement: "The feature shall not process invalid commands."

      Good requirement: "The feature shall ignore invalid commands."

      So, to meet the first (bad) requirement, I could do anything with the invalid command - like sell it to aliens, put it on the output pins, treat it like a function call, overwrite the stack, rob a liquor store, pretend the commands were valid...and I would meet the requirement. See the danger there? (That is, of course, ignoring the fact that how can you even determine if an invalid command is invalid without processing it in the first place?)

      The second (good) requirement really says what you want the feature to do - the feature must ignore invalid commands to meet the requirement. It can't pass go, it can't collect $200, it can't roll again.

      Hopefully this illustration will reduce one of the nasty trickeries of requirements...

      --
      "There are a dozen opinions on a matter until you know the truth. Then there is only one." - CS Lewis (paraprhase)
    4. Re:RFCs are requirements documents, not design by rjh · · Score: 1

      One valid reason for MUST NOTs is to allow implementors to experiment. Many of the "implementation-defined" parts of the ANSI/ISO C++ spec, for instance, are left that way to encourage vendors to come up with new solutions to the problem. Then the next draft of the standard looks at the existing body of software and decides which is the best solution, and that gets turned into the new MUST.

    5. Re:RFCs are requirements documents, not design by rjh · · Score: 2, Insightful

      This is not an insult. I want to make that very clear, right up front. That said:

      Go take a software engineering course. There's a lot of wisdom that's been accumulated about how to write reliable software, and while (IMO) about two-thirds of it is utter rubbish, one-third is really good advice. Learning software engineering is like eating pufferfish: really cool, but be careful what you swallow. You'll learn about requirements analysis, drafting a coherent requirements document, architectural analysis, drafting a coherent design document, interpersonal skills needed to get people to sign off on your ideas, time management, resource allocation... computer programming isn't the same as software engineering. Very little software engineering is concerned with computer programming--less than a quarter, in my experience.

      It's a fun subject. It teaches you how to tackle big projects, and have a reasonable chance of success at them. 70% of all software projects fail, but the 30% which succeed include some of the most fun projects you'll ever see. Take a software engineering course. It's fun, and you'll be hunting much bigger game once you're through. :)

      Now, that said... you ask reasonable questions, you get reasonable answers. Design documents aren't exercises in futility. In fact, they're essential. For any nontrivial software project, at least 75% of the codebase is trivial--and since it's trivial, that means there are a few thousand ways to do it. A design document lets the entire team know precisely how the trivial parts are going to get solved, so that the team can all be on the same page when it comes time to tackling the big stuff.

      In a good design document, the hard parts are underspecified for exactly the reason you mention; you go through a lot of bad ideas on the way towards finding the Right Thing.

      Design documents come in two varieties: the kind which is written by one person who has final authority, and the kind which is written by committee. If it's the former, the design document will have in big boldface letters at the header and footer of every page, SUBJECT TO CHANGE. If you've got one of these and your copy of the design document is more than 24 hours old, go check another one out of CVS. These design documents change very quickly as the development teams try different approaches. Unfortunately, the latter is more common--in which case just getting everyone to agree on the design document is a labor of Hercules, so usually the middle is left underspecified so that the programmers can do whatever the hell they need to do without needing to go back to the committee.

      After the project's done, one day should be set aside to document "okay, now this is how it really works...". That document stays inside the engineering pit. When people need to learn how the package works, they read the requirements (to learn what it does), the design (to learn how the trivial parts work), and the How It Really Works (to learn how it really works).

      Hope this sheds some light on the documentation issue. :)

    6. Re:RFCs are requirements documents, not design by EnderWiggnz · · Score: 1

      You're stating that 70% of software projects fail. Can you imagine if 70% of Civil Engineering projects failed? 70% of bridges designed?

      All you are saying to me is: We suck at this whole "design and implementaion" thing, but if we produce a lot of documentation, at least it we'll have a record of why we suck so badly.

      --
      ... hi bingo ...
    7. Re:RFCs are requirements documents, not design by Anonymous Coward · · Score: 0

      a requirements document should never say "SHOULD" or "SHOULD NOT". this effectively makes that section optional and therefore not required and therefore not a requirement.

      requirements need to be quantifiable (true/false, yes, no, 100 simultaneous users, 32768 colors, etc.), shouldn't specify an implimentation (try convincing clients of that, hehe), and when the design document comes need to be traceable (what requirements does a design element fulfill?)

    8. Re:RFCs are requirements documents, not design by rjh · · Score: 1

      No: what I'm saying to you is it's only a cogent, coherent engineering process--of which documentation is a large part--which allows 30% of software projects to succeed.

      The 70% failure rate is unacceptable, yes. That's not an excuse to ignore the processes which let us have a 30% success rate.

    9. Re:RFCs are requirements documents, not design by EnderWiggnz · · Score: 1

      I'm saying that the current high-ritual processes, such as UML, RAD, etc. have not significantly increased the chance that a certain software project will succeed.

      Without a doubt, there is a need for a cogent, coherent software process, thats not my argument. My argument is that our processes are awful, and the documentation we produce is generally useless; being either too vague, too explicit or not related to the finished product.

      I've recently begun to appreciate the lesser-ritual approqches, such as SCRUMM and to a lesser extent XP and Agile. They produce enough documentation to be useful, but focus on producing a real, working, testable product quickly and efficiently.

      In SCRUMM, if you need a feature, you first write a test case that will prove you contain that feature, and its working. If you dont have a working test-case, you dont have a working feature. Period.

      In other methodologies, you spend more time with a word-processor open than you do truly designing, implementing and testing requirements.

      If you're organization requires a strict documentation regimine (ISO-XXXX, CMM-$FOO), then you make that one of the features, and have a test case for that.

      The biggest problem with this approach is that you need fairly ego-less programmers that can divorce themselves fromtheir creation, and throw away bits that better implementations suggested.

      If you can create an appropriate work environment, and trust me this is the hard part, this approach works amazingly well, and will produce great products, quickly and cost-effectively that will meet your stakeholders needs.

      There is a huge problem with Prima-Donnas in our industry, and I have been lucky enough to work in one environment that simply doesnt allow Ego's to run wild. I'm still trying to decipher how you create this environment, and am simply astounded that it can be done.

      I truly hope that our industry matures in my working lifetime. I think that we need a formal accreditting trade group that is elitist, like every other engineering field. I also think that "programmers" need to be seperated from "engineers" formally.

      Yeh, its elitist, but you never hear about a Lineman calling themself an "electrical engineer", they're skilled workers who work under the direction of an educated, certified engineer.

      So basically, I see two problems with our field:
      1) Our current processes are ineffective.
      2) There is no formal method of seperating the Wheat from the Chaffe.

      It needs to be done. Reboot monkeys are not engineers, whether or not Microsoft says they are.

      --
      ... hi bingo ...
  72. Design docs are like flowcharts by AppyPappy · · Score: 1

    Design docs are like flowcharts. You write them AFTER the system in implemented. That way, you don't have to explain why the system doesn't fit the documents.

    --

    If you aren't part of the solution, there is good money to be made prolonging the problem

  73. Keep it living, be complete by mikeborella · · Score: 1

    I try to keep mine current, revving them after peer reviews, low level designs, test plan reviews and customer discussions. I also try to be as complete as possible, within reason, so that the outcome (i.e., what the product actually does) is predictable. A hard thing to do is maintain traceability between requirements and the resulting software and test plans, and I've not seen good tools to do so (I've seen lots of tools, but they all seem to require too much overhead).

    Once I have a solid design doc for a feature that is released and dpeloyed, I turn the doc into an Interface Control Doc or incorporate it into an existing one, which is then kept current with subsequent changes.

    None of this is perfect but it seems to work and is fairly low-overhead if everyone buys into the process.

    --
    Mike Borella http://www.borella.net/mike
  74. impossible problem by king_ramen · · Score: 1

    Things that get FULLY documented become so obtuse, esoteric and bureaucratic that they can never actually work without huge teams of people. Look at CORBA, X.500, iCAL, and government defense contracts.

    Things that are over simplified (HTTP,SOAP,SMTP) take off quickly and people are left to their own devices to fill in missing protocol gaps, causing huge future headaches.

    The best way to split the difference is to make LOTS of simple design docs that allow for multiple iterations, where no single document becomes a monster (the CORBA spec is currently over 1000 pages).

    --
    ----- Refactoring is the reason why man does not mistake himself for a god.
  75. Look at IEEE standards. by rleibman · · Score: 4, Informative

    I'm not totally sure what you mean by Design document, I've seen many software shops. Some call the requirements document design, while others define the design document as the document that describes the high level description of the internal architecture of the system (system diagram, major modules, client/server decomposition, class diagram).

    Either way, I like to start with some templates I created based on IEEE standards, a few come to mind, Here's the list:

    IEEE standards pertaining to sofware engineering. In particular take a look at the Software Requirement Specifications and the software design descriptions.

    Some of these are very documentation intensive, but I find that at least reading through them when starting a new project helps me direct my thoughts and make sure I don't forget anything that might be relevant to the phase in question (what? I need to think about the maintainability? the stability? the robustness?) pick and choose those things that apply to your project.

    1. Re:Look at IEEE standards. by jeff_grimshaw · · Score: 1

      Too bad that the IEEE standards cost $$$ to view :(

    2. Re:Look at IEEE standards. by rleibman · · Score: 1

      Yeah, sucks, kinda, I used to read them at my university's library when I was in school (11 years ago). I now reading at my corp's library (large, two letter acronym company mostly known for its printers). I'm not sure if public libraries carry them, or if your local community college might have them available for browsing.
      If you are doing this for a living, and your company is at all supportive of process improvement the cost can be justified. If you do this on your own, think of it as a (tax-deductible) cost of doing business, not too much.

  76. Pictures! by PromANJ · · Score: 1

    Every time I want to check out a game I go straight for the screenshots. A picture says a thousand words and all that. Pictures at the start of the doc are a good way of quickly explaining what it's roughly about.

    I think another important thing is to explain why you made certain decisions. Just stating things like facts and leaving out your justification and thought process will make you decisions seem like arbitrary opinions.

    Naming characters Azearoth and Kyliandra is not game design. Keep things fuzzy, details later. The concept should work on an abstract level.

  77. Doxygen... by zarthrag · · Score: 1

    "...Make that shit up as you go!"

    --
    Why can't all fpga/microcontroller manufacturers just release free optimizing compilers???
  78. Docs! Docs! We don't need no steenking docs... by pottymouth · · Score: 1


    Documentation is a good place to start and it may give a reasonable overview (sometimes) but I've found the best place to start is with the people that are still on the project that have written what already exists. Use their knowledge and their experience with the specification to first get a feel for how things lie and where they need to go next.

    Written docs vary so much in accuracy and detail. It's too easy to read docs and think you know how things work just to find out that's where things started but now they're completely different. Sometimes the docs you have can really mislead you and waste your time. Start with the people, then do a quick once over of the docs, then start reading code. That's the way to get an accurate picure as quickly as possible.

  79. Design Dialog by xbytor · · Score: 1

    I frequently find that design documents do not have enough of the reasoning behind why a decision was made. Issue Based Information Systems (IBIS) is one way of recording this information and I have seen people use this technique successfully. But what may be of more value is to setup a designated mailing-list/newsgroup/blog/journal for the project that can be accessed (online and searchable) in addition to any formal documentation that is generated.

  80. Hate to Say It by Stormcrow309 · · Score: 2, Insightful

    Read Wieger's Software Requirements from Microsoft. It is a very good book to work on. Mainly, our process is:

    1. Get User Requirements By Process Reviews, Functionality Studies, and User Panels
    2. Translate Everything into Use Cases
    3. Write User Requirements Document, specifying everything into Must Haves, Nice Haves, and Too Bads
    4. Have technical team review and impose technical requirements and organizational standards
    5. Write Software Requirements Document from User and Technicals Docs

    At least that is what we try to do. Half the time, it is 'You bought what?'

    --

    In God we trust, all others require data.

  81. Read Joel on Software by (nil) · · Score: 2, Informative

    Painless Functional Specifications--not precisely what you were looking for, but pretty close, I think.

  82. Good design doc. by Anonymous Coward · · Score: 0

    I like to see...
    a) meaningful title
    b) Table of contents - even for short documents, any modern word processor is good for this (mark headings as you go along and most can just insert one for you automagically
    c) glossary (up front), there will invariably be TLA (three letter acronyms) that arn't obvious to all readers. Just assume that every TLA needs a one liner.
    WIFI , WIreless FIdelity - Superset of ....
    d) SHORT Introduction in the narative (i find it makes things more readable "In august 2004, blah blah project was undertaken to blabh blah".
    e) function, stored procedurs, whatever correctly names with UML or other data flow diagram approach.
    f) high-level data flow diagram.
    g) network diagram (however trivial it may seem).
    h) Points of failure / or future upgrade path (note specifically not implemented features and why). I've read too many dd's only to discover half the features don't exist.

  83. If all else fails by Anonymous Coward · · Score: 0

    "If all else fails, where's a good place to find all this stuff out?"

    Ask your boss... geez. Next question?

  84. Requirements Analysis by brett77 · · Score: 1, Insightful
    I believe very strongly in a formal Requirements Analysis (RA) document that the end user will sign off on before any development begins. The RA document is a means for the developer to thoroughly document and understand the problem, and also for the client to understand what he/she will receive at project completion. The various projects I have worked on have had differing RA documents but they all have some boiler plate sections:

    Purpose

    Requirements

    Definitions

    Business Rules

    Use Cases

    Wire Frames (UI)

    All of the terminology within the document is non-technical and basically describes the said business process and the proposed technical solution. In my experience the clients always flip to the wire frames section of the document, since this is the easiest thing for them to understand (pretty pictures!). A wire frame is really just a stencil of a screen created in any modeling tool.

    So now you must be thinking why is he mixing design with definition work? I'm sure some would argue that the wire frame need not be in the RA document, since this is really design. However, a client may find it easier if they can walk thru the use case while looking at a screen representation.

    Once client sign-off has been obtained that's when we get into the fun design stuff. Depending on the said tasks complexity you can utilize UML to further document the process. Any design documentation will be separate from the RA documentation but it will accompany the RA document when handing off to a developer. To me the single most important design document is the class diagram, and depending on complexity possibly a sequence diagram. I use UML on an as needed bases, you'll never need it all, but pick and choose different pieces as you see fit.

    The 5 D's of software development:

    Discover (Business Briefs)

    Define (RA Document)

    Design (UML)

    Develop

    Deploy

  85. Good design documentation by MisterE · · Score: 2, Interesting
    Based on your description it seems you've got some classic problems facing you. I've found you need a couple of key things to have good design documentation:

    1. Needs to be complete - use a modeling tool that encourages complete designs.
    2. Needs to have buy-in from all levels - so the documentation should be easy to understand by technical and business users (that leaves UML out!)
    3. Needs to be online, navigable, flexible. Graphical models are the best by far.

    I solve all these problems by using the Business Architecture Method from Business Architects The site is new - online examples are coming later today (Monday).
    Yes, I'm biased... I work for them.

  86. 20,000 ft view / honest "Mission Statement" by Anonymous Coward · · Score: 0

    There needs to be a page, either included within or accompanying the design document, which describes the real reason for doing the project. Put it in plain language, rather than padding it with legalese or marketing jumbo.

    There will inevitably be gaps in the technical specification, and it will be up to the programmers and project leaders to use their best judgement where the design leaves off. Give them a conceptual roadmap, so they have an idea of what they are really doing. They'll understand what needs to be well-designed and what can possibly be skimped on.

    Having such a "Mission Statement" will reduce the risk of spending too much time on details which really aren't significant in the grand scheme of things.

    If the project's reason for existence is to artificially inflate monthly sales figures for your suppliers through a system of prepaid consignment, put this in writing. Don't keep your technical people in the dark, even if it's a dirty secret. If you obfuscate and tell them something like, it's about "enhancing channel flexibility," not only will the project take longer, but the final result won't be as bug-free or effective.

    Do you really want your engineers wasting their intelligence on trying to figure out what their job is for? They WILL figure it out, over time, at the water cooler. If it's not what you say it is, worker morale (and future projects) will certainly suffer.

  87. Write it in English/Hindi by rocker_wannabe · · Score: 1

    Your design document needs to be culturally relevant:

    Include a Hindi translation next to the English

    Include culturally relevant analogies to help the programmers:

    I want the wrapper APIs to the 3rd party software thinner than a sanded papadum.

    This will help the quality of the code immeasurably


    -- What?!?!? I'm not bitter!!!

    --
    "Meaningless!, Meaningless!" says the Teacher. "Utterly meaningless!"
  88. That Jack Reeves is Real Smart by the0ther · · Score: 1, Interesting

    Read the Jack Reeves article from C++ Journal. His main message is that software IS design. Code IS design. Convincing your designers that this is the case will be difficult, but the best takeaway from this is that whatever your design is, keep it as close to the code as possible. If blocks of the design document do not naturally copy&paste as comments into your code, something is seriously wrong. Either the "design" is wrong, or your code is wrong. Keep the 2 close together and it should be easy to decide which needs tweaking.

  89. Re:Wiki?...no, but close by ScrappyLaptop · · Score: 1
    I've seen the chronological "notes" fields and attached docs in a good tracking system work in much the same manner as a Wiki, with the "added feature" of an audit trail. If the tracking system allows the linking of projects & bugs with both heirarchical and lateral links, you end up with a only slightly chaotic tree that at least contains all of the communication that occured between the original spec docs, programmers, testers and marketing. Not the prettiest thing to slog through, but if you have a good search tool built in, it does serve the purpose and by definition is always up to date. The key is to avoid using email and drive-by verbal transfers of knowledge; keep it all in the audit trail. Nicer still if it links to your version control system so that the comments for each feature and bug have a notation to the code that implements or fixes.

    The question is: how many times will a document be consulted in the future vs. how much time, effort and cost do we want to incur to make it perfect? By creating ad hoc documentation via a searchable communication tool (tracking system), you incur no extra cost yet all of the information is there someday if you need it.

  90. Procedure for reviewing design & implementatio by selectspec · · Score: 1
    The best design doc in the world is not a file, but a blog/wiki/forum/mail thread/etc. Sure there is a heading file that explains it all, but docs are worth 10% of what a good, searchable discussion database can accomplish.

    The people working on requirements and the design will through a series of meetings argue and debate over the design until a handful of key folks understands it. Usually the implementing team or individual understands it the best. As "discoveries" reveal flaws, that team meets and discusses the changes.

    These people don't need the docs. The docs are really for the poor sucker that gets hired a year later - i.e. somebody new to the project. Those poor saps have to get up to speed. However, design docs (if up to date) don't show the whole picture. They just give a snapshot view of how things work. Having the thought process, the decision process, the proof (if you will) of how the project was pieced together with some kind of discussion database is the best tool these people can have. Plus, it eliminates stupid questions. As an original implementer, if somebody askes you a question on how or why you did something, you can refer them to the forum/mail thread/etc (like you remember).

    --

    Someone you trust is one of us.

  91. A-7E by sho222 · · Score: 1

    You might want to research the A-7E method for specifying software systems. It's a highly structured documentation method created by the Naval Research Library (I think) for the A-7E aircraft software systems. It can be applied (and modified) to work for any software system. Of course, this is a method for documenting the system specification, but it might work for you... What's the difference between a spec and a design doc again?

  92. Sequence Diagrams and Logic flow by reynard_ze_fox · · Score: 1

    For me, the documents that finds the most use are the sequence and the logic flow diagrams. They can both be used by developers and make a great starting point for process flow documentation for end users.

  93. You can't get blood from a stone by couch_warrior · · Score: 2, Insightful

    Here's a cynical view of a system lifecycle
    1) A company has a business process that isn't working well because it is understaffed by poorly trained and unmotivated personnel
    2) The company decides to automate the business process to make it "more efficient". In the project charter, they justify the project by promising further staff cuts.
    3) A project team is formed, and the IT department interviews the poorly trained unmotivated users to gather "system requirements". Which end up covering only a small fraction of the actual business process because the users don't care.
    4) The IT department realizes the project is hopeless, and uses lack of resources as an excuse to bring in "consultants".
    5) The consultants poor concrete on the system requiremnts to avoid "scope creep", ensuring that the resulting system will be functionally useless.
    6) The consultants carefully build a system that meets a minimal interpretation of the sparse requirements.
    7) In testing it becomes obvious that the system meets the paper requirements, but is functionally useless to the actual users.
    8) The IT department offers the consultants follow on work in return for helping IT blame the users. The users get a staff cut.
    9) The system is declared a victory, and bonuses go to the executives who weren't involved.
    10) The consultant is hired to fix the system, now called "Phase Two"

    --
    "Sic Semper Path of Least Resistance"
  94. There are some simple universal guidelines... by DeepDarkSky · · Score: 1

    ...but there is no one right way to do it. I suppose that's the whole problem. If it were standardized, then people would not have such problems (though the gaps in the docs may still be there).

    In any case, some people will tell you that such desgin documentation is absolutely essential and absolutely required, and there are those who think that they are an absolute waste of time. The truth is somewhere in-between. It depends on the projects and the organization that you work for and their adherence to standards and methodologies.

    I for one, think that the documentation should be minimal but complete, and no more. Strive for conciseness. Nobody likes to read reams of documentation and then try to figure out what needs to be done. Lots of overhead usually exists in these design documents.

    I frankly think design documents should not exceed certain lengths - artificial limits are not useful, but the main point is to break up documentation into smaller chunks and then work on keeping the amount of documentation that one has to read and understand in one go smaller (kind of modular programming, gee).

    structure and organization will allow you to create more concise, modular and portable designs and design documents...

    I have to say though, this is coming from someone who hates reading documentation of any kind.

  95. Humans != Better Parsers by camusflage · · Score: 1

    Humans are more forgiving than a compiler, but humans don't always exhibit the same behavior given the same command. This, for many, is the primary frustration in writing software documentation.

    --
    The truth about Scientology, Xenu, and you: Operation Clambake
  96. ReadySet by stephen_e_nelson · · Score: 1

    I'd check out the ReadySet project, hosted on Tigris: http://readyset.tigris.org/.

    ReadySet is a collection of templates in HTML and CSS for project requirements and specification. Even if they're not perfect for your organization, they can serve as a starting point.

  97. It should be flexible: Use Wikis by CatGrep · · Score: 2, Insightful

    There's usually a very defined and rigid format for every design document and the writers have obviously tried very hard to make sure that procedure has been followed

    Exactly. I used to work at a company that had a 50+ page document that was supposed to be used as a template for design documents - a sort of meta-design document, I suppose. Problem was that things rarely fit into their preconceived ideas. It definately led to unreadable documents. The other problem was that the procedure to change the design document was so draconian that everyone was hesitant to change anything even though it would become clear that things needed to be changed when the real world crept in. (BTW: this company allowed absolutely no prototyping prior to finishing the almighty design document - for those of us who like to prototype, it was frustrating)

    I'm thinking that wikis are the best way to both communicate and develop a 'design document'. The design document should be flexible and wikis fit the bill. The design document should show the history of thinking about the design and again, Wiki's fit the bill quite nicely as you can look back and see the discussions that took place that led up to various decisions.

  98. Requirements by nate+nice · · Score: 0

    Make sure all the requirements for the procedure/class etc are rigidly and unambiguously defined. Implement them as required and develop test cases that test the requirements/bounds/etc. If there are problems with the requirements then validate everything first.

    --
    "If you are a dreamer, a wisher, a liar, A hope-er, a pray-er, a magic bean buyer ..."
  99. Documentation is just the start by joonasl · · Score: 1
    I'm not saying that design documentation is not useful or needed, but it should be regarded as the first draft of the final product and not a bible. Instead of trying to pin point every detail down on the design phase, try to document the core functionality and the purpose of the system. Then in the implementation phase it's essential to have a product owner,or owners if it's a very large and complicated system, that understand the functionality and take responsibility of the use cases on both the buyers side and on the suppliers side. This way the details can be figured out while both the project teams and the customers understanding of the project increases.

    We have implemented this typoe of procedure in several projects in the sofware company where we work and we have been very pleased with the results.

    --
    "There is a terrorist behind every bush"
  100. Link it to your unit tests by Aredridel · · Score: 1

    With test-first development, one can even work in tests with the design docs.

    class TestMyUnit Test::Unit::TestCase
    def test_feature_foo_with_bar
    a = Foo.new
    b = Bar.new
    assert(a.frob(bar))
    assert(File.read('designdocs').grep('Foo connects to Bar'))
    end
    end

    That, along with some statements of purpose for each bit and a commitment to keeping things simple should suffice. Each feature should be mentioned in the design docs, at least. The rest is just work policy on keeping it up to date.

  101. Good design docs by Anonymous Coward · · Score: 0

    What makes a good design doc is usually a good requiremens spec. If you can get a user to sit with you and describe the system in excruciating detail (at least the parts they know) including all functional and non-functional specs and business rules, the design doc is incredibly easy to put together.

    That's not to say that the requirements won't have to be altered once the design doc exposes conflicts or flaws in the requirements but a good user who's willing and able to put in the time and a good Business Analyst (best when it's not the developer but still someone moderately technical) make all the difference in getting scope limited and driving the desgin phase.

  102. Testing the design -- traceability by Morgaine · · Score: 2

    Reeves' article really is classic, and hugely valid even today. However, one of his most important points is left dangling.

    The software design is not complete until it has been coded and tested.

    100% true. The problem is, designers in traditional or semi-traditional development teams usually get only the most rudimentary feedback from test, usually just along the lines of "This doesn't work very well". In some places I've worked in (I'm freeelance), designers pretty much sat in their ivory towers almost without accountability for their designs. XP is different since the designer is more often than not the programmer and tester too, but most dev teams are still structured along traditional lines.

    What Reeves needed to stress but didn't was traceability, from each element of design through to the results returned from test. Those elements of design which are too abstract to have actual live machine-generated tests need to have a scoreboard assigned to them, on which the testers can ++ or -- design hits and design misses.

    And this very issue of traceability is the key to TFA's question as well, because all documentation except for overviews should be viewed as testable in the same way as any design feature. In particular, modules and smaller components all need to carry their own descriptions, and the accuracy of those descriptions needs to be subject to testing and QA signoff after each change.

    It's not a simple area, but where there is a will there is always a way. And many designers do have the will to make their designs stand up to the rigours of testing and quality assurance.

    --
    "The question of whether machines can think is no more interesting than [] whether submarines can swim" - Dijkstra
    1. Re:Testing the design -- traceability by ThosLives · · Score: 5, Informative
      "The software design is not complete until it has been coded and tested."
      I would have to disagree with this; a design is complete when it meets all requirements. A design can only be shown to be complete when it passes all testing; a subtle difference, but one that's come to my attention as being very important.

      I have to agree with the statement about traceability though. One of the worst things I've had to deal with is getting a specification document that does some stuff and then have to write the requirements "that would result in this design if we started with those requirements." This is endemic to all industries: ill-formed or ill-stated requirements. I'm always amazed at how many "requirements" are either designs or implementations or are not testable or aren't requirements at all. Even more entertaining are tests that don't test in a way that proves requirements are met...

      If I had to enumerate what makes good design the list would have to include:

      1. DO NOT START DESIGN UNTIL YOU HAVE THE REQUIREMENTS (yes, I know there are exceptions, but you should at least have *most* of the requirements first).
      2. Have a good requirements document: everything is actually a requirement (not a design or implementation) and is testable (if you have the word "not" in it, it's not testable, for instance).
      3. Make sure the design is design and not implementation (design is "sum two numbers and check for overflow"; implementation is "temp32 = x16+y16; if temp32 > MAX16 then result16 = MAX16 else result16 = x16+y16;). Put another way, despite the popular writings I've seen lately to the contrary, CODE IS NOT DESIGN (any more than a car is the design of the car).
      4. Make sure you can test that THE DESIGN MEETS THE REQUIREMENTS (which is subtly different than "does the design do what I designed it to do?"). If the design doesn't satisfy the requirements, it can never be a "good design".
      5. Separation of responsibility. You mentioned XP above where "the designer is the coder is the tester" which is just bad practice in my experience. My company *strongly* discourages the designer to be the coder, or the coder to be the tester (the designer can be the tester though, and this often makes sense). This is because there are inevitable blinders that you put on when coding your own design or testing your own code.
      Ok, that wasn't an exhaustive list by any means, but I think those are the key points. To summarise: have good requirements, separate requirements from design from implementation, and have many eyes looking at things throughout the whole process.
      --
      "There are a dozen opinions on a matter until you know the truth. Then there is only one." - CS Lewis (paraprhase)
    2. Re:Testing the design -- traceability by sconeu · · Score: 4, Interesting

      Mod this guy up +5.

      They're all important points. If I had to rank them in order, I'd sort them as follows:

      Items 1, 2, and 4 are the most critical, followed by 5 and then 3.

      I'd add subitem 4a: During design, don't add features that aren't in the requirements, unless you can show a derived requirement (usually from one what I call the "X-ability" requirments -- scalability, maintainablilty, testability, and reliability). But don't add it because it would be "a cool feature to have".

      --
      General Relativity: Space-time tells matter where to go; Matter tells space-time what shape to be.
    3. Re:Testing the design -- traceability by Anonymous Coward · · Score: 0

      I would have to disagree with this; a design is complete when it meets all requirements. A design can only be shown to be complete when it passes all testing...

      Minor technicality - it is possible to prove (mathematically) a design meets all (functional) requirements before the implementation (and hence testing) stages using formal methods. It's ugly and tedious, but you can do it...

    4. Re:Testing the design -- traceability by astavans · · Score: 2, Insightful

      One thing that stuck with me after Fred Brooks' book was something to the effect of "A good design document doesn't just specify what the program does, but also, as importantly, what it doesn't do". And that, I can vouch from experience, is a very useful thing to have in a design document. Ruchir Astavans

    5. Re:Testing the design -- traceability by Hognoxious · · Score: 1
      if you have the word "not" in it, it's not testable, for instance.
      "Program does not dump if an alpha value is entered where a numeric is expected". That looks pretty testable to me.

      As you seem to know what you're talking about, can you clarify what you really meant there?

      --
      Confucius say, "Find worm in apple - bad. Find half a worm - worse."
    6. Re:Testing the design -- traceability by maddugan · · Score: 1

      CODE IS NOT DESIGN (any more than a car is the design of the car). The simile fails in the sense that code doesn't equate to finished product, the applicaiton the code produces is the finished product. E.g. a car design that is 'compiled' produces a car.

    7. Re:Testing the design -- traceability by ThosLives · · Score: 5, Interesting
      To use your example:
      Program does not dump if an alpha value is entered where a numeric is expected
      Okay, I'll make the program erase all your files, hack into your bank, and transfer the balance to my offshore accounts when I get an alpha value when a numeric was expected.

      This meets your requirement; the program didn't "dump". *grin* Hopefully that illustrates the dangers of most "not" requirements.

      The best way to write the requirement you're looking for in this instance is something like:

      "Ignore alpha values where a numeric is expected."

      Or, "If an alpha is given where a numeric was expected, ignore all following input up to [some delimeter].

      Or, perhaps, "If an alpha value is given when a numeric is expected, display an error and get the input again." The general idea is you want to define the requirement and the bounds of operation; "not" requirements are unbounded.

      I will grant, however, that sometimes you want a "not" requirement; this discussion has more details on 'not requirements' and rjh points out that sometimes folks use not requirements to prohibit things but purposefully allow anything else; in my opinion this is very dangerous and should only be used very rarely.

      --
      "There are a dozen opinions on a matter until you know the truth. Then there is only one." - CS Lewis (paraprhase)
    8. Re:Testing the design -- traceability by BigOrangeCup · · Score: 2, Insightful
      Make sure the design is design and not implementation (design is "sum two numbers and check for overflow"; implementation is "temp32 = x16+y16; if temp32 > MAX16 then result16 = MAX16 else result16 = x16+y16;). Put another way, despite the popular writings I've seen lately to the contrary, CODE IS NOT DESIGN (any more than a car is the design of the car).
      While, I agree with the rest of your post, I have to disagreee with this. Code is just a more detailed level of design. Any time I write any code to implement any specification or higher level design description, I make many "design decisions". Just because code requires that you conform to a certain specification and is usually (more or less) the last step before testing doesn't make it the implementation. The implementation of software is the actual running program - there are many other layers of "processing" that must occur between code and a running program (compilation or interpretation and execution by the computer itself). Each of which can give you different results depending on how the code was written.

      I often consider code the "detailed blueprints" of a piece of software. To use the construction analogy:

      An architect describes a new building at a high level. (high level design)

      A civil engineer designs the building generating the blueprints (aka code).

      Contructions workers implement the design by putting up the building (compile and run).

    9. Re:Testing the design -- traceability by ThosLives · · Score: 5, Insightful
      I think people misunderstand what happens when code is compiled. Compiling is not "the compiler uses the source code as instructions to produce an executable"; it's merely a translation of human-readable instructions into computer-readable instructions. I can "read" code and produce the same results by stepping through by hand; the executable code does the same thing (generally much faster). In this sense, the code *IS* the final product; the Reeves article incorrectly equates compiling to building. The "building" is the writing of the code. Compiling is more like translating a book from English to some other language.

      When I use the blueprints for an automobile to build the automobile, I get something different than the blueprints. I cannot use the blueprints to emulate the functionality of the vehicle. The blueprints are instructions to build the vehicle.

      In software, the design is the thing which tells me how to write the code (have you ever tried to read code and find out what the function is supposed to do? generally you can only know what it does, not what it's supposed to do. Sometimes you get lucky and the design is written in the comments, but that's rare; generally comments just say "we watch out for overflow here" or something like "use pointer rather than array lookup to avoud some tricky thing" - comments are usually descriptive of what is going on, not why). If I have a good design I can write it in any language and meet the same requirements. That's a good litmus test for software: if it depends on a language, it's not a pure design. If you have to figure out what's going on to translate into another language, you're in implementation rather than design.

      I will grant, however, that there are some difficult situations when you have a requirement "you shall use language X for this project", or "we decided to use language X to meet these requirements" - what happens if that requirement changes halfway through and your "design" was language specific? You're hosed. Good designs are language transparent.

      Remember, the goal isn't to produce an application, the goal is to meet the requirements. The design tells you how you are going to meet the requirements ("have a text grid input box" and, at the next level, "have a function that draws a text grid input box") and the code fulfills the design ("textgrid.draw()"). (Note that some design decisions become requirements for a lower level, such as function calls, interfaces, etc.). Code should only be implementation.

      --
      "There are a dozen opinions on a matter until you know the truth. Then there is only one." - CS Lewis (paraprhase)
    10. Re:Testing the design -- traceability by ThosLives · · Score: 1

      You'd probably be interested in reading my post above; it addresses what I think is an improper use of the construction analogy for code.

      --
      "There are a dozen opinions on a matter until you know the truth. Then there is only one." - CS Lewis (paraprhase)
    11. Re:Testing the design -- traceability by Gr8Apes · · Score: 1

      In simplest terms, here's the flaw with a "not" requirement.

      Let's say I want to divide a bank acount into a an integer number of accounts. An alpha would cause a NaN error. Now, since we don't want the NaN error, we make it 0, oops, it would be a divide by 0 error, except somewhere there was another requirement (for whatever reason) that divide by zero's would equate to INT_MAX. Now I have a really big bank account. :)

      That's why we do specific requirements instead of "not" requirements (e.g., in case of alpha entry, display error message indicating "only numeric input accepted".)

      --
      The cesspool just got a check and balance.
    12. Re:Testing the design -- traceability by Gr8Apes · · Score: 1

      Too bad I don't have mod points today. Definitely a "nail on the head" post.

      I'd actually not thought of design documentation as a series of layers, going from design docs to function calls/interfaces/etc to the actual code implementation. Interesting viewpoint that explicitly states what many of state about the "design" of classes, interfaces, etc.

      --
      The cesspool just got a check and balance.
    13. Re:Testing the design -- traceability by Anonymous Coward · · Score: 0

      DO NOT START DESIGN UNTIL YOU HAVE THE REQUIREMENTS (yes, I know there are exceptions, but you should at least have *most* of the requirements first).

      So what fucking planet are you from??

    14. Re:Testing the design -- traceability by russellh · · Score: 1

      This is endemic to all industries: ill-formed or ill-stated requirements.

      Therefore, the challenge is to figure out how to build effectively with ill-stated requirements. It's hard. Hire some masterful people and manage them with wisdom.

      --
      must... stay... awake...
    15. Re:Testing the design -- traceability by richieb · · Score: 1
      Minor technicality - it is possible to prove (mathematically) a design meets all (functional) requirements before the implementation (and hence testing) stages using formal methods.

      Actually this is untrue. The general problem of showing that a program meets its specs is equivalent to the Halting Problem. That is it is undecidable (eg. my spec is that a given program halts - it's impossible to show which programs meet this spec in general).

      Furthermore, you need to have the spec written precisely enough, so a formal proof is possible. In practice no one writes such specs, except for some toy problems.

      Finally, if the proof is automatic - i.e. performed by a computer program - how do you verify that that you proving program is correct?

      Proving that a proving program is correct sounds to me like another undecidable problem.

      --
      ...richie - It is a good day to code.
    16. Re:Testing the design -- traceability by Anonymous Coward · · Score: 0
      Traceability gets hard when the requirements are complex and you decide to create some additional abstractions visible to the user to support the implementation. These can often much improve the user interface if the user accepts them, but how to trace them to requirements?

      For example, you might have requirements for a search engine like google that don't say that the search results are divided into pages. The user might really want to have all the results on one page (no matter how many) and to be able to just keep scrolling as far as they want. So, we have requirements, but the designer has to add the abstraction of the 'page' to make the implementation reasonable. How does one trace this to requirements if the requirements are like most requirements cooked up in business and don't mention non-functional aspects like performance, etc?

    17. Re:Testing the design -- traceability by Anonymous Coward · · Score: 0

      The word you should be using is "masterly".

      Masterful people may or may not do masterly work.

    18. Re:Testing the design -- traceability by stonecypher · · Score: 2, Interesting

      I think people misunderstand what happens when code is compiled. Compiling is not "the compiler uses the source code as instructions to produce an executable"; it's merely a translation of human-readable instructions into computer-readable instructions. I can "read" code and produce the same results by stepping through by hand; the executable code does the same thing (generally much faster).

      This viewpoint seems to be largely tautological - two forms of an algorithm are equivalent because their input/output behavior is equivalent.

      Of course, the counterargument is complex and more than I care to handle at work, but let me point out two things:

      1) a binary running quicksort and my hand stepping through bubble sort aren't equivalent, even though one being run by the machine and the other being run by the human have the same end-result; input/output equivalence isn't the same as identity equivalence, and

      2) various compilers don't output the same binaries for the code, and in the case of a naive and a cutting edge compiler can generate vastly different binaries with majorly different underlying behavior; hell, with optimizations, even the same compiler won't generate the same binary.

      The source code most certainly is a generative set of instructions, rather than an equivalent form of output; take a look into compiler optimizations about proving whole sections of code are unnessecary. That the generative instructions are significantly different than the output is in fact the crucial bases of some techniques like SFINAE.

      This argument is roughly the same as arguing that a mansion and a home are equivalent just because you can enter them, recieve housing and protection services from them, and because they have the same interface (doors, spigots, electrical outlets, garage, etc.)

      In this sense, the code *IS* the final product; the Reeves article incorrectly equates compiling to building. The "building" is the writing of the code. Compiling is more like translating a book from English to some other language.

      I just don't think this is correct. The purpose of Reeves' article is to equate programming to design as opposed to construction; all you've done is to take the opposed viewpoint. Whereas the case can be made for either, in the context of Reeves' arguments the latter viewpoint doesn't make sense.

      To wit, if you want to discuss building, you should observe that the output in best possible world should be identical every time; that's a reasonable goal for architecture, but not for implementation. Why do you suggest that building is coding? Saying so without rationalization isn't discussion, it's argument.

      When I use the blueprints for an automobile to build the automobile, I get something different than the blueprints.

      Uh, no, you don't. That's kind of what mass production is about, is that within the limits of machine technology, every car is the same. If you go to a junkyard, you can use pieces from other cars. You can get replacement pieces at a dealership without anyone measuring your car.

      Cars to a single line are effectively identical. If you'd like to learn what the difference is, read about the problems WW1 doughboys had because of their Hotchkiss weapons not being able to exchange parts, then consider that that's just a question of low quality manufacture; the reason you want to look that up is because of the glaring contrast with the well-manufactured Browning, which the military didn't deploy because it was the superior weapon of the day, and because they didn't want its design to fall into enemy hands.

      Cars most certainly are identical per design, unless you want to go off onto non-issues like micrometer differences due to machining, scratches in paint, et cetera. The average educated adult cannot look at four of the same make and model of new car, have them rearranged, and still tell them apart, provided they're clean; The Price Is Right relies heavily on that fact for more th

      --
      StoneCypher is Full of BS
    19. Re:Testing the design -- traceability by kaladorn · · Score: 2, Interesting

      A few points:

      I've been on projects where the RTM became God and we ended up spending more time documenting how X -> Y -> Z throughout the document tree than we did coding it. There is some sort of happy medium.

      OTOH, I'm working on a project now with:
      No design docs.
      No requirements in written form unless my company writes them for the client, and even then they are abbreviated severly.
      The great habit of getting a bug report from QC, wanting to say "Show me the requirement" then realizing there isn't one, then having to discuss, argue, etc. out what the 'requirement' that isn't really should have been....
      That's going waaaaaay too far the other way.

      Also, unspoken in what you said, a design that meets requirements can still be a bad design. One that meets requirements does at least have a chcne of being a good design. One without requirements is effectively FUBAR from the beginning.

      Lastly, I've been on teams where the dev *team* tested things. Now, you tended to not test your own work, but you were involved in testing the product, so it gave you a lot of experience with look and feel of the product, workflow, and just the kinds of issues users would hit. Sometimes, you had to be the one testing your stuff because only you could reasonably setup the failure conditions that needed to be tested (for instance, you're the network/dial-up expert, and you need to generate a lot of failure conditions here). Of course, we also always had a separate QC pass, but nothing went into Dev without a pass from developer smoke testing. It led to much smoother QC iterations and a much better and more stable product.

      On the topic of design docs:
      1. A document topology roadmap is nice. Ours used to show where the document inter-related with other documents in the project tree. That proved handy on more than one occasion.
      2. PICTURES! Message flow diagrams, client-server network layouts, cloud diagrams showing software layers and major internal components/organizations, etc. A diagram plus some reasonable number of words is wroth ten times as many words with no diagram. Visio is your friend. So are modelling tools that produce good diagrams. A lot of times, a diagram alone will tell you a lot of what you need to know about a system's architecture or the interactions between components or computers.
      3. Be as specific as you need to, but not more. It's tough to know, but consider your audience and don't go into excess detail (ie don't make your DD a regurgitation of the code). You need to have enough detail to make it quite clear what the implemenation must do, but not to *be* the implementation.
      4. XRef to various other documents like the requirements documents and to any background docs people might need to clarify something they read in the DD (mostly background).

      --
      -- Mal: "Well they tell you: never hit a man with a closed fist. But it is, on occasion, hilarious."
    20. Re:Testing the design -- traceability by Bill+Dog · · Score: 1
      An architect describes a new building at a high level. (high level design) A civil engineer designs the building generating the blueprints (aka code). Contructions workers implement the design by putting up the building (compile and run).

      This is essentially right on. Unfortunately, non-technical managers, I've found, believe that there are only two levels, designers/architects, and implementers. So they have a senior person do the design, and then hand it off to junior code monkeys (at that point in their careers) to implement it, and so while the high-level architecture has good qualities, at the code level there is little-to-no design, so ultimately what you end up with is brittle and non-performant.

      You don't throw the high-level design directly to the noobs, you throw it to another senior developer (the "civil engineer"), who can do the code-level design, and hand out smaller-sliced implementation tasks to the beginners and to herself, and she can oversee things at that level and ensure generally loosely-coupled objects, wise algorithm choices, etc.

      --
      Attention zealots and haters: 00100 00100
    21. Re:Testing the design -- traceability by tjanke · · Score: 1

      He's right - traceability is *very* helpful.

      At one of my former employers, our programming group insisted that every requirement in the Requirements doc have an identifier. Every element of the subsequent Design had to refer, by id, to which requirement it fulfilled, and have its own identifier in turn. Everything specified in the Internal and External Specs had to refer, by id, to which part of the Design it implemented. The QA Designs and Specs for each test had to refer to these ids for each test.

      This forced us, while designing, to that ensure that every design feature actually fulfilled a specific requirement or requirements. While coding, it forced us to ensure that every implementation detail arose from a specific element of the design. And in QA, it allowed us to directly correlate specific tests with specific requirements - any requirement that wasn't covered by a test was glaringly apparent. In short, it made the documents and code both directly testable long before the formal QA stage, and made the applicability of each QA test itself testable.

      As it also forced us to audit our design and code during development, it made superfluous features or implementations obvious as they arose. In some cases, that meant simply losing the superfluous bit, but in most cases, it exposed places where the requirements, or design, were vague, and forced us to clear them up before proceeding further (usually, if an element of the design was vague, it's because the requirement it purported to fulfill was vague). As a result, the requirements tended rather quickly toward the unambiguous and testable, and our ultimate design and implementation was cleaner. Our bug-count went down noticeably just because of this one practice.

      --
      Cheers, Tim -- Tim Janke Part mad scientist, part lion tamer: sr. software engineer, global team leader, project mana
    22. Re:Testing the design -- traceability by dhasenan · · Score: 1

      Except for one thing: architects do the low-level design. The high-level design comes from the customer.

      Programming is similar: management or sales generates a list of high-level requirements, which is translated into low-level requirements in the design documentation (similar to the work of a general contractor, to use your analogy); then it gets implemented.

    23. Re:Testing the design -- traceability by Anonymous Coward · · Score: 0
      I couldn't figure out whether you were trolling or just thick, but I guess this answers the question nicely:

      "When I use the blueprints for an automobile to build the automobile, I get something different than the blueprints."

      Uh, no, you don't. That's kind of what mass production is about, is that within the limits of machine technology, every car is the same.

      When he uses the blueprints for an automobile to build the automobile, he gets an automobile, not another set of blueprints; so, you know, something different than the blueprints.

      I know that in your rush to (dis)prove how intelligent you are you couldn't be bothered to think about what was written rather than what you wanted to read, but you might try it the other way next time. It'll save you from spending so much time essentially arguing with yourself, which has the nice side benefit of not making you look incredibly stupid.

    24. Re:Testing the design -- traceability by Hognoxious · · Score: 1
      "Okay, I'll make the program erase all your files, hack into your bank, and transfer the balance to my offshore accounts when I get an alpha value when a numeric was expected."
      u r teh funny. Was that in the requirements?

      Now:

      "Users without such-and-such authorisation may not change property yada".

      "Only users with such-and-such authorisation may change property yada"

      Don't try and tell me those aren't functionally equivalent. I just don't see the added value in rewriting sentences to satisfy your bizarre edict, especially if the version with 'not' comes more naturally or reads better in the context.

      --
      Confucius say, "Find worm in apple - bad. Find half a worm - worse."
    25. Re:Testing the design -- traceability by Stu+Charlton · · Score: 1

      I know that in your rush to (dis)prove how intelligent you are you couldn't be bothered to think about what was written rather than what you wanted to read, but you might try it the other way next time. It'll save you from spending so much time essentially arguing with yourself, which has the nice side benefit of not making you look incredibly stupid.

      It's fun making brash claims like this when Anonymous, but you're the one that's clearly being daft.

      When he uses the blueprints for an automobile to build the automobile, he gets an automobile, not another set of blueprints; so, you know, something different than the blueprints.

      His point was that an automobile's manufacturing process is specified down to the absolute smallest detail in order to be mass manufactured. You only out of a mass manufacturing process what you put in.

      As it is with source code. The source code is the design. Anything else is representation.

      --
      -Stu
    26. Re:Testing the design -- traceability by Sir+Tristam · · Score: 2, Insightful
      "Users without such-and-such authorisation may not change property yada".

      "Only users with such-and-such authorisation may change property yada"

      Don't try and tell me those aren't functionally equivalent.

      Okay, but they aren't functionally equivalent. In the first spec, are users with such-and-such authorization allowed to change property yada? Although it implies it, the specification doesn't actually say that they can. The permission is actually undefined; the "unboundness" that the parent is talking about. The second specification is unambiguous about users with such-and-such being allowed to change the property.

      Chris

    27. Re:Testing the design -- traceability by NickHewitt · · Score: 1

      "This is because there are inevitable blinders that you put on when coding your own design or testing your own code." I couldnt agree more with this. I recently designed and developed an app which our helpdesk use to log calls. I was asked to do the testing which I tried to decline saying that it was bad practice. I found that I struggled to create faults / errors because I knew how it should work and how new records should be created - the end users are good testers I found - We set the app up for 10 users and within 2 weeks any bugs / annoyances were cleared up so we could roll out properly. your average user can break anything... Testing your own code is a big no no as far as I am concerned..

    28. Re:Testing the design -- traceability by Hognoxious · · Score: 1
      In the first spec, are users with such-and-such authorization allowed to change property yada?
      Er, yes. Are you retarded or something?
      --
      Confucius say, "Find worm in apple - bad. Find half a worm - worse."
    29. Re:Testing the design -- traceability by Anonymous Coward · · Score: 0


      Actually... you could even say that the running program is the building and that the executable file is the blueprint.

      After all, it is a translation of your code and describes how things will be layed out and connected in memory. What will be done with that memory and so on.

      However, that comparison is not so helpful. neither is to say that code is design. Especially since it encourages some people to never bother explain how they plan to do something before doing it and be sure that they can cover all requirements before testing. It gets extremelly annoying if you need to integrate their stuff with something else.

    30. Re:Testing the design -- traceability by Sir+Tristam · · Score: 1
      In the first spec, are users with such-and-such authorization allowed to change property yada?
      Er, yes. Are you retarded or something?
      No, I'm not. If you'd bother to read the sentence immediately after the one you quote, you'd see why I ask that question: "Although it implies it, the specification doesn't actually say that they can." You see, the reason they are called specifications is that you specify things in them. If you were supposed to just imply thing in them, they would be called implications.

      But I'm sure you already really knew that your example had been shot down, which is why you resorted to personal attack ("Are you retarded") instead of trying to actually defend your position. I appreciate your acknowledging the error of your position by attempting to "defend" it with only a personal attack.

      Chris

    31. Re:Testing the design -- traceability by shpoffo · · Score: 1

      Okay, I'll make the program erase all your files, hack into your bank, and transfer the balance to my offshore accounts when I get an alpha value when a numeric was expected.

      This point is all too relevant, such as with an example in the (perhaps) not-too-distant future:

      Eventually we will only write design docs, and have compiler agents write the program for us. (only limited numbers of people will advance beyond this to learn a language like Java or , C. Assembly programmers will have a status of mystique and revere similar to neuro-surgeons or shaman (in the right circles).

      .
      -shpoffo

  103. The way I see it: by Anonymous Coward · · Score: 0

    A (good) design document, from my perspective, helps me understand the actual massive codebase I'm pitted against. It tells me what things the system is trying to do, what are its major pieces, and how they fit together, so that when I look at one particular piece of code, I can understand how it fits into the whole, and thus be that much less overwhelmed by details.

    Another way of putting it: I've been asked a lot of times to work on a really complex piece of code, and have had to look at it, almost completely lost in it. Then I go talk to the guy who wrote it (and luckily, most of the founders in my company are still around), he explains what it's trying to do at a very high level, and how it does it, and then, when I go back to it, it suddenly makes a lot of sense. A design doc, in my mind, should aim for exactly that.

  104. Re:Mythical Creatures? NOT by Anonymous Coward · · Score: 0

    I thought RFC's were the poster child for an incomplete requirements document. That's why everybody goes back to the original source code for Network Protocols.

  105. Software requirements by Is0m0rph · · Score: 1

    The strength of a design doc really relies on the documents that should come before it. A solid functional spec leads to a solid software requirements spec which allows you to create a solid design doc. It's when the process isn't followed and things are done first and then documented where you get the problems described in the story. I've found managment is more than willing to excuse you from doing part of the process if it means they can have the change done right now.

  106. Some sections you might consider by Anonymous Coward · · Score: 0

    -Interface definitions
    -Key Objects/Data types/Schemas
    -Diagram showing where the new software fits in a system
    -Diagram showing internal make up of you design
    -Definitions of what each internal part of your deisgn does and what it is responsible for
    -Explanation (maybe in diagram) of how the design solves some key requirements. handy for testing the design
    -Requirements that can't be met by the proposed design (and maybe mitigations)
    -A presentation to reviewers, explaining the design verbally, before they try and just review the document (give them a head start).

    plenty more......

  107. What you need is a Maintenance Doc. by jimbro2k · · Score: 4, Insightful
    In addition to a design doc, which you may or may not need to update, depending on how I interpret your immediate task, you really should have a maintenance document.

    Design Docs tell the reader how you intend to build something. In many shops (depending on the SDLC version, if any, that they use), it has little value after the design review.

    As a roving consultant, I've seen a lot of crappy documents and SDLC (et.al.) procedures, and what has the greatest value for the programmers who come later is a Maintenance document that specifies:

    1. The overall philosophy of the design: Why specific design choices were made.

    2. What things did you want to implement (and why) but were postponed to a later version.

    3. What design decisions were specifically rejected (and the reason).

    4. Where are the system's weaknesses?

    5. What are the coding standards specific to this particular project?

    The Maintenance Doc provides guidance to the people who have to work on this stuff after you're gone (and to you, unless your memory is perfect). More than anything else, they will need to know the why of the design, not the what.

    In my perfect world, the maintenance doc would be the main appendix to the design doc.
    However, in most shops, the SDLC & its policies & procedures will prohibit that, and usually acknowledge neither the existance nor desirability of a Software Maintenance Document.
    Good Luck.

    --
    There is not nearly enough love in the world, but there is far too much trust.
  108. It doesn't matter .. by Stavr0 · · Score: 2, Funny
    as long as you don't forget to include your TPS report cover sheet.

    (ducks)

  109. Re: Design of a good Functional Spec ... by Anonymous Coward · · Score: 0
    (More from from Joel's blog on writing software good specs:

    Sample spec

    "Here are some of the things I put in every spec.

    A disclaimer. Pure self defense. If you put a paragraph saying something like "This spec is not complete", people won't come into your office to bite your head off. As time goes on, when the spec starts to be complete, you can change it to say "this spec is complete, to the best of my knowledge, but if I forgot something, please tell me." Which reminds me, every spec needs:

    An author. One author. Some companies think that the spec should be written by a team. If you've ever tried group writing, you know that there is no worse torture. Leave the group writing to the management consulting firms with armies of newly minted Harvard-educated graduates who need to do a ton of busywork so that they can justify their huge fees. Your specs should be owned and written by one person. If you have a big product, split it up into areas and give each area to a different person to spec separately. Other companies think that it's egotistic or not "good teamwork" for a person to "take credit" for a spec by putting their name on it. Nonsense. People should take responsibility and ownership of the things that they specify. If something's wrong with the spec, there should be a designated spec owner, with their name printed right there on the spec, who is responsible for fixing it.

    Scenarios. When you're designing a product, you need to have some real live scenarios in mind for how people are going to use it. Otherwise you end up designing a product that doesn't correspond to any real-world usage (like the Cue?Cat). Pick your product's audiences and imagine a fictitious, totally imaginary but totally stereotypical user from each audience who uses the product in a totally typical way. Chapter 9 of my UI design book (available online for free) talks about creating fictional users and scenarios. This is where you put them. The more vivid and realistic the scenario, the better a job you will do designing a product for your real or imagined users, which is why I tend to put in lots of made-up details.

    Nongoals. When you're building a product with a team, everybody tends to have their favorite, real or imagined pet features that they just can't live without. If you do them all, it will take infinite time and cost too much money. You have to start culling features right away, and the best way to do this is with a "nongoals" section of the spec. Things we are just not going to do. A nongoal might be a feature you won't have ("no telepathic user interface!") or it might be something more general ("We don't care about performance in this release. The product can be slow, as long as it works. If we have time in version 2, we'll optimize the slow bits.") These nongoals are likely to cause some debate, but it's important to get it out in the open as soon as possible. "Not gonna do it!" as George Sr. puts it.

    An Overview. This is like the table of contents for your spec. It might be a simple flowchart, or it might be an extensive architectural discussion. Everybody will read this to get the big picture, then the details will make more sense.

    Details, details, details. Finally you go into the details. Most people will skim this until they need to know a particular detail. When you're designing a web-type service, a good way to do this is to give every possible screen a canonical name, and provide a chapter describing each one in utter and mind-numbing detail.

    Details are the most important thing in a functional spec. You'll notice in the sample spec how I go into outrageous detail talking about all the error cases for the login page. What if the email address isn't valid? What if the password is wrong? All of these cases correspond to real code that's going to be written, but, more impor

  110. Joel Spolsky Says... by tommyServ0 · · Score: 3, Informative
    I really really enjoyed Joel Spolsky's series on writing Painless Functional Specifications back in 2000. Granted, this doesn't refer to design docs (or technical specifications as Joel calls them), but I think some of the ideas carry over.

    You should read the entire series, but I'll give some of the highlights:

    • You should write the spec before you start the project, not during.
    • It should have one and only one author
    • You need to flag Open Issues and Side Notes by themselves so you can search for them later.
    • The functional spec should be a living document.
    • Be funny: specs are only good if they are read. The more funny anecdotes the better.
    • Be pithy and understandable.
    • Lots of screenshots, tables and diagrams to break up long pages of text.


    tS
    --

    Consider the daffodil. And while you're doing that, I'll be over here, looking through your stuff.
  111. Traceability and References by frostfreek · · Score: 2

    Two things I find that are missing from many documents that I have to work with, are traceability, and references.

    References are great (especially if you have a hyperlink) for any number of reasons...

    As for traceability, I *loathe* documents like this:

    Design document version 1.1
    This document describes the differences between version 1.0 and 1.1

    And then, version 1.0 is not included as an appendix, and it doesn't tell you where to find it.

    As for sticking the 'differences' into a document, and calling it a design, I loathe that too. &*(@# lazy turds!

  112. wafer thin by glenrm · · Score: 1

    wafer thin...

  113. IEEE SDD by Anonymous Coward · · Score: 0

    It's a standard and it works.

  114. Wiki is your friend by damacus · · Score: 2, Insightful

    Start a Wiki from the get-go of the project and keep your notes. Over time, as the implementation changes, it'll be easier to keep the information (as your own reference) up to date as things proceed. Once you consider things usable, you can start forming official documentation using your Wiki as a guide.

    As another said, "All I can suggest is: keep a strict separation between features and implementation. do some use cases that describe how the most important part (the user) will handle the program."

    1. Re:Wiki is your friend by ninjagin · · Score: 1
      I agree that a wiki can be a good place to start, but once you've made a couple passes to gather ideas and rough them, a more formalized document has offered better payoff for me in the past.

      I may not be reading you correctly, but you appear to say that you change your design to fit how you're implementing the project. That's pretty bad mojo and would suggest that the design was not very good to begin with. Requirements and Design docs should be pretty much solid once implementation begins, and should need very little extra editing from the time the implementation phase begins.

      What you may be referring to is what I'd call Project and/or Implementation documentation that records how things got put together, what pitfalls or challenges made the design tough to implement, or how progress and timelines unraveled. For these notes, a wiki is a great vessel to store the stuff until a more formal document (near the end of implementation) is needed.

      --
      .. pa-ra-bo-la, pa-ra-bo-la, 2 pi R, 2 pi R, where's your latus rectum, where's your latus rectum, 2 pi R
  115. Shorter is better by dirc · · Score: 2, Informative

    I will assume that the audience for the design documents is other programmers who have not worked on the project since its inception. With that in mind, the most useful design documents are:

    1. Short. Hundreds of pages of detailed design are useless without context. Short documents can and should provide context and pointers to other documents (or code) that will explain the details. If the document is more than about six pages long, it will be ignored by most programmers.

    2. One of many. It is obvious that you cannot describe a complex system in six pages. Try to write many design documents that are short. The documents can be a hierarchy. There should be a top level document, that refers to the individual elements that make up the system. Each element can be described in its own document. Each element's subelements can be described in their own documents, and so on, down to the lowest level that it is interesting to document.

    3. Describe major functions and interfaces. The document should tell what the system (element or subelement) does, and where the reader can learn more about the elements that implement the functions and interfaces.

    4. Describe things that don't change much. One of the problems (as noted by other posters) with most design documents is that they are not kept up-to-date. The solution is to write documents about things that don't change much, such as the overall system design and interfaces. And if the overall system design or interfaces do change, then you can usually persuade people to update the documents.

    In my view, good software design documents provide context and pointers to the authoritative documentation. Most programmers (myself included) do not trust any documentation that is too detailed, since it is usually wrong.

  116. The perfect design document... by IdJit · · Score: 1

    is one that does not allow editing by the sales staff.

  117. Demanding docs before switching vendors by Mike+Farooki · · Score: 1

    Interesting discussion. Any advice for this situation?

    My employer hired an outside software vendor years ago who has provided us with very little end-user or developer documentation. I am new here, and I'm the only person on staff with any technical background or experience. In my opinion, we're being taken for a ride.

    Granted, the software generally works, and it provides us with a revenue stream. But for what we're paying, I'd expect it to be spit-shined and polished, well-documented, and easy-to-use. It is none of these things. My guess is that we could have better products, better consulting, and better support for a hell of a lot less money, so "generally working" doesn't cut it.

    My fear is that said documentation doesn't even exist. We're not ready to jump ship yet, but I wonder what steps we might need to take in order to jump ship. How do you go about getting a legacy developer to document the years of work they've already produced for you so that hiring another vendor is even an option?

  118. What Makes a Good Design Document? by Maxime+Lefrancois · · Score: 1

    Money.

  119. Good Design Document by Anonymous Coward · · Score: 0

    Far too often "good document" is an oxymoron. But what you need to have documented can vary significantly from project to project. For our distributed systems, the one piece has always been missing is a description of all of the interfaces used. We currently range from RS-232, with or w/o 202T modems, to plain sockets over TCP/IP, SSH tunnels and some DCOM. Throw in LonTalk and RS-485 on the side, and you have a real mess. Without adequate coverage for each, it is very difficult to decide where to connect a new component, or what capabilities each interface has. We also can't explain which ones are deprecated and why, which means we still get sales orders for combinations that no longer, or never did, work.

  120. Don't just document the design by Cederic · · Score: 5, Interesting


    The single biggest mistake most design documents make is that they document the design.

    That's nice, to a small extent, but generally of relatively little use.

    It falls down completely when
    - the designer made bad assumptions that subsequently don't hold
    - the users change the requirements
    - someone actually writes the system
    - the system goes through years of maintenance

    So what is of use in these circumstances? The ideas, concepts, approaches and general thrust of the design.

    Where did this design come from? Why has this approach been taken. What are the concepts embodied here?

    Don't tell me that the Widget is round and talks to the Doodah.

    Tell me _why_ the Widget is round (and why square wans't good enough), explain what the Doodah does and why the Widget needs to talk to it, what the contract (informal or formal) between the two is.

    If the Doodah works with hexagonal Thingamies then explain that. If there aren't any Thingamies yet but it's possible they may be added give the guidance on where they'll be added.

    A good piece of software design is a vision, a pure and beautiful concept in the mind of its creator. What gets written on paper has to share that vision with others, so that they can understand it, and share it going forwards.

    Then you have design documentation that makes sense, that outlives the initial implementation, that's useful to people in years to come.

    ~Cederic

  121. Brevity is the soul of wit by crmartin · · Score: 1

    Three things to think about:

    (1) As above, shorter is better.
    (2) Eschew obfuscation. Simple, clear, active, declarative sentences are best.
    (3) Keep the notion in mind that you're creating a contract. You shouldn't develop low-level details, you shouuld state in a very crisp, preferably testable, fashion what you expect from the thing you're designing.

  122. Maintaining the doc by Thieron · · Score: 1

    The biggest issue I've had with design doc is maintaining them.

    A system design is a living animal, but often, the doc gets written before the initial development starts and isn't modified when changes are made later.

    After a few revisions, the design doc can easily be out of date.

    I think this often happens because the changes are typically smaller and easier. Therefore a developer won't bother with a process for them (when spend time documenting something that you can do in 1 hr and double the amount of work) and instead just go ahead and make the change. A few months down the road and the system may not even reflect the design doc.

    If you can find a way to maintain the doc without it being a hassle for the developers that could help make the doc actually useful.

  123. On The Fly by umbrellasd · · Score: 1

    When you have a question that the documentation does not answer, find the answer and then document it. If each member of the team does this, the documentation will evolve to a useful and current state. If some do not do this, the documentation will not be as good, but unless you are the person creating and enforcing policies, you simply have to accept it. I do not think there is a set "answer" to the question, "What documentation is good?" Like a Slasdot post review, many people have a hand in "documenting"; each person offers their perspective. If you have enough participation, the documentation will be good.

  124. 4+1 View Model by Anonymous Coward · · Score: 1, Informative

    I tend to use the 4+1 View Model, originally introduced in 1995 by Philippe Kruchten at Rational Software. It uses a set of different views, in order to clearly communicate a system's design (or architecture).

    The 4 views are: Logical, Process, Physical, and Development. The +1 is the Use Case view, which describes the specific requirements that influenced the design.

    I sometimes add a Data view and/or Security view. In any case, I use the 4+1 approach as a starting point and tailor it to the system at hand.

    For more info: http://www-128.ibm.com/developerworks/wireless/lib rary/wi-arch11/?ca=dnt-65/

  125. A really good statement of intent by stunted · · Score: 1

    I think one of the most useful parts of a good design is a really good overview or statement of intent that should include logic trees / flow diagrams and a few other diagrams. It should be mainly written, in good, concise, accurate, English and should make sense in it's own right while not being too long or overly technical.

    You know you've got it right when you can grab anyone with a logical mind and, though they have no contact with the project, they can read the overview and know what the project is trying to achieve and have a vague idea of how your planning on doing it.

    These are very useful when a hole appears in the meat of the document because from the higher level overview you can see the direction the missing bits would have taken had anyone had ever written them.

    Other than that there are a lot of good suggestions posted here, particularly on the need to update documents.

    --
    In order to save our freedom it was necessary to destroy it.
  126. This is how you accomodate it. by rjh · · Score: 5, Interesting
    1. Talk to the various stakeholders. Hold meetings. Get everyone's input on what's the Right Thing To Do.
    2. To the degree these ideas are not the Wrong Thing, do them, even if they're less efficient than you'd like, or are less fun to code. You're going to be giving them a prostate exam with a cheese grater in a couple of steps, so soothe their egos proactively by letting their ideas make it into the final product.
    3. Take the draft to your dev team. Circulate copies, have everyone read it, then have a short meeting--one hour, tops--not to discuss how to do things, but which parts of the design will require a lot of experimentation and fiddling.
    4. If your dev team doesn't already have someone fluent in Corporate Weaselspeak, then get one.
    5. Give your translator this sentence: "We will use our magic powers to accomplish this part of the design document." Have him turn it into a five-page monstrosity that lets every stakeholder think these difficult parts are going to be done their way, without really committing your dev team to anything.
    6. Take the weaselized design doc back to the stakeholders. Your Corporate Weasel's job is to make the stakeholders sign off on it.
    7. The easy and routine parts of the job get done the way the stakeholders want, assuming their way isn't completely braindamaged. The hard parts of the job will be solved by your development team's magic powers. It's right there in the design document.
    8. Bring the project to completion. As you're doing the hard part, write This Is How It Really Works documentation for engineers who are coming after you.
    9. When your project is ready for handoff, make sure to praise the (easy, routine) parts for which you used Marketing's ideas of how the software ought to be written.
    10. Gloss over the fact that you did the hard part via magic powers. The other stakeholders probably don't care. You're giving them a beautiful bullet point for their end-of-year performance eval. That's what they care about at this point.
    11. Move on to the next project.
    ... Is all this weasel office politics? Damn straight. On the other hand, it's weasel office politics meant to shield your development team from unnecessary weasel office politics. As much as we hate weasel office politics, sometimes it's necessary.
  127. Once you have your design document by samael · · Score: 1

    You'll find it useful to have an addendum to the design document:
    A user.

    We work in teams of 5/6 people + one user/business expert.

    That way when we hit inconsistencies in the design, or missing details, we turn and say "Bruce, does this mean X or Y?" (and he usually says "Z").

    Note: They aren't all called Bruce. Yours may have a different name.

    If you want a further idea about our working practices, take a look at an article I wrote here

  128. Yeah, that's pretty much the distinction I learned by jd · · Score: 5, Informative
    Software Engineers are pretty thin on the ground. I don't know of that many. Well, truth be told, I've not seen one since moving to the US. Real design work is rarely done, and documentation is something added on at the end.


    Getting back to the original question, a design document should be divided into three primary sections. The first section should always say what the problem is that the design document is trying to address. Any given design document should address only a limited set of problems, or it will become too complex. Ideally, any given document should be small, compact and address one or (at most) two issues.


    The second section should describe how to use the solution presented to solve the problem described. In programming terms, this is your API. That is all it should describe.


    The third section should then cover how the solution goes about solving the problem. Again, that is all it should cover.


    When projects or modules within those projects are updated, it should be possible to update/replace any one section in any one document without touching any other section or any other document.


    Documentation should also always stick to the level for which it is intended. Ideally, references should be to ever-more specific information, never the other way round. So, a project overview might point to the components of that project. Each component might then point to documentation on the low-level mechanics. On the other hand, a discussion on low-level mechanics is not the right place to talk about a specific project that uses those mechanics. That gets in the way of understanding and obstructs code reuse.


    That, I think, is the key to writing good documentation. Does it positively assist those who would need it? If the answer is "no", or is even a "not sure", then it doesn't matter what standards it follows, it is useless.


    The ideal length for a document is going to vary, project to project, but by building documents in a modular fashion it should be rarely necessary to have a document longer than about 20 sides of A4. Most should be around 10 sides. Anything longer likely covers unrelated topics and can be split up. (Remember, it is easier to open 20 books to one page each, than to open one book to 20 different pages.)


    This limit gives you about 3-7 sides per section per report. If you need more than 7 sides, the design is too complex and unmaintainable over the long-haul. On the other hand, any less than 3 sides likely means that the project has been over-designed with lots of redundancy, plenty of overhead and no possibility of meeting the requirements.


    Going by this description, virtually all documentation in existance is ghastly beyond all imagining. Which, by and large, is exactly how most people see it.

    --
    It's a small world and it smells funny; I'd buy another if it wasn't for the money; Take back what I paid (SoM)
  129. Documentation on many levels... by tbedolla · · Score: 1
    I've read a number of the replies on your question, and hope to give you some constructive feedback, as the slashdot community has a tendency to look for the negatives in everything...

    I've worked as a programmer, project lead, project manager and have eventually found my way to enterprise architect. I've seen a plethora of software development projects, in all stages from beginning to end. What stands out most in documentation is the need for various levels of detail. A good design document will provide at least three levels of detail for every section. The first and highest level is a summary of business requirements that are being met with descriptions of associative functionality, almost in a "the business dept needed THIS and THESE functions are designed to meet that need". This highest level is for the project members who are neither technical, nor intimately involved in the project other then as business leaders for requesting department(s). The second level of documentation should be designed with QA in mind, detailing data sources, structure and flow. Diagrams are a natural fit in this section. The third section of documentation should deal more with the architectural design of the code itself. This includes the explanation of complicated algorithms used to solve problems which are also explained. This level of documentation is difficult to come by, but it the section most usable by the programmers themselves (well commented javadocs is an example).

    The challenge with this is that to get this kind of detail, you will require a number of authors, and that is rarely a priority or even a possibility of team put together to develop software against both a budget and a timeline.

    I wish you luck on your documentation efforts.

    --

    "Everything in the universe is clouded by the impositions of the mind"
  130. Document patterns by M$Lackey · · Score: 1

    The design document should feature explanations of your architectural patterns. Those are less likely to change in the short term and therefore makes the document less problematic to maintain.

    Let's say that you are writing an MS.NET Windows forms application and you have the following dataaccess strategy (which may or may not be 100%, though that is irrelevant)
    - write stored procedures,
    - generate datasets,
    - encapsulate the datasets in a business object.
    - implement typical NELS features in the business object
    - databind GUI on top of that.

    Your design document should contain one or more system sequence diagrams, and a class diagram to communicate to other/new developers the key aspects of how this pattern is implemented and which consequences it has. Document the stuff that represents core design desicions, and not all the stuff that is evident from the code.

    Don't hesitate to use descriptions such as "Adapter", "Bridge" or "Abstract Factory" in your design document. It might actually help a future co-worker.

    Do not Ctrl-C Ctrl-V chapters in your design document to cover every single business object that is created using a pattern. Mention special cases only if they deviate significantly.

    Document complexity and not the simple stuff!
    A complex security model, an algorithm to calculate optimal scheduling are both examples of things that should be given special attention. Use the appropriate documentation techniques in each case.

    Document a specific feature type or an idea behind the application as opposed to describing how these ideas apply to every single class

    Document a design decision even if you know it could be better! A lot of developers make design decisions that they know have deficiencies. Either due to incompetence or lack of time (or both). It may even be these design decisions that are most important to document(since really good designs often are more selfexplanatory). Many developers choose to leave such low-quality decisions silently undocumented because their gut feeling tells them they're on thin ice.

    I have no idea how many hours I have spent trying to figure out whether I can change some spaghetti code or whether there is som hidden meaning behind those 20 layers of nested if's :-D

  131. "You're going to be giving them a prostate exam.." by nietsch · · Score: 1

    "...with a cheese grater in a couple of steps"

    where is that step?

    --
    This space is intentionally staring blankly at you
  132. Only 1 approach ever seems to work by eison · · Score: 1

    Read the code.
    It is, unfortunately, the only current and correct accurate description of the way things work.

    Documents rot because nobody is measured by the document accuracy or quality after version 1.0 of the document.

    --
    is competition good, or is duplication of effort bad?
    1. Re:Only 1 approach ever seems to work by pkesel · · Score: 1

      Documents rot because no one USES the documents. I'm in the middle of a situation for my client where their ability to make code corrections or enhancements is compromized by the complexity (unnecessary) of the code and the loss of justification for why it is that way. So now they've asked me to help them dig out. One of the most common questions is, "Who's going to maintain all this documentation?"

      My answer is that there is never a reason to MAINTAIN documentation. If you have to maintain it, throw it away. But if you're going to USE the documentation as part of your problem solving and day-to-day routine you'll be developing it just as much as you are your code. An analyst or system architect should express teh solution in the documentation, or more accurately the model. They hand off hte task and the solution in the documentation to the developer. They use the documentation justify and guide what they're doing. It has to be part of how you work.

      See my earlier post about a design documentation philosophy. Your maintained model should be just enough to springboard any decision making about your system. Then work out from there into specifics about your task at hand. Start from your accurate baseline model. Build the new one from the current implementation. Validate that with the business peo ple to make sure it's correct, and make your design and implementation decisions. Do the work. When you're done you can throw that away because the task for which it was created is completed.

      Like I said before, the purpose of Analysis, design, and documentation is to improve the probability that any development activity is successful. Do enough to achieve that and no more. Doing less is assuming unnecessary risk. Doing more is wasteful.

      --
      - Sig this!
  133. K. I. S. S. by marcus · · Score: 2, Insightful

    The Fundamentals: Interfaces and Constraints and that's about it.

    The bare minimum is often the best. So, include precise definitions of the interfaces that the code has to meet, including any tests that it must pass and the constraints within which it must fit.

    If it is firmware, then hardware interface specs must be included as well as whatever interface the firmware must provide for other system code. Add to this performance constraints or requirements and you are done. Leave implementation for later.

    If it is module constructed in isolation, again the interfaces must be clearly defined and performance requirements declared.

    Constraints define the resources allocated to the code. Performance requirements are a sort of constraint on time and hardware allowed. There are also other constraints that are usually implied but not stated like how long the engineer has to implement, test, debug, etc. This is effectively a cost constraint.

    Implementation can also be documented, but is not fundamentally a part of a design spec. Sometimes code comments can be enough. Sometimes a few notes about competing implementation ideas and why one was chosen over the others can be helpful, but not as part of a design spec.

    Keep It Simple Stupid - define what the module(s) must do, what tests it(they) must pass and that is it. If you do this right, then the implementation can speak for itself.

    --
    Good judgement comes from experience, and experience comes from bad judgement.
    - W. Wriston, former Citibank CEO
  134. UML Nazi by tonicxt · · Score: 0

    What is GOOD DESIGN? A design document that 1. Adds value/understanding of the proposed system to the developers 2. Can facilitate a test plan 3. Can adopt change 5. Etc. If it does not satisfy point #1, then it is completely worthless. Note that UML documentation is merely a notation; a bad design in UML is still but a bad design. Its unfortuate that you had a UML NAZI as a prof. There is a perfect example of one who is in academics because they cannot hack it in the business world. I recommend you switch to a more prestigious university. Software Engineers use engineering principles yes; designs which are tried, tested, and true. Whereas, Computer Scientists, when faced with the task of designing a system, will try to "reinvent the wheel". Futhermore, UML Documentation should only be written if it adds value to the projcet; if the UML documentation helps developers understand the system, then it should be written. If it doesn't, then it is completly useless!!!!. Any competent prof will pound that into your head, like a mantra. However, there it should be noted that modern Computer Science programs are interlaced with Software Engineering.

  135. Testable Requirements by rben · · Score: 2, Interesting

    It's simple, make sure that each requirement that is stated in your design document meets the testablility test. If you can't think of a simple way to test the requirement, than it isn't properly defined.

    Along with this simple idea, the person who is specifying the system has to be willing to put in the time to make sure all requirements are testable. You also have to have a good programming manager, one who will make sure each new requirement is checked for testability and that all changes are checked to make sure they don't mess things up.

    With this combination of factors, I was able to reduce the number of errors discovered after release in one system from over 400 (taking 4 months to fix) to 4, which took three days to fix.

    Make note of the tests you envisage for each requirement. Ideally, this should be done by a very sharp-eyed QA Analyst.

    Finally, build code reviews into your schedule. That way you have a good chance of meeting your deadlines. The code reviews not only find many bugs, they are also good places for mentoring members of the programming team who have less expertise.

    Hopefully, some of this is useful to you.

    --

    -All that is gold does not glitter - Tolkien
    www.ra

  136. IEEE standards documents work well by Anonymous Coward · · Score: 0

    Software Requirements Specification - IEEE Std 830-1998 - IEEE recommended practice for software requirements specifications

    Software Design Document - IEEE Std 1016.1-1993 - IEEE guide to software design descriptions. Updated in 1998 IEEE Std 1016-1998

    Software Acquisition - IEEE Std 1062-1993 - IEEE recommended practice for software acquisition. IEEE Std 1062-1998

    Found by searcing IEEE:

    http://ieeexplore.ieee.org/xpl/standards.jsp?fin dt itle=software&letter=software&imageField.x=2&image Field.y=3

  137. Good example by Eternally+optimistic · · Score: 1

    Those are good points. Similar stuff is adressed by a few other good posts - but everyone is assuming the system has databases, a GUI interface etc.
    Lots of software has none of those, not even a user interface. You also need things like:
    - Design goals: what are the objectives and constraints
    - Requirements (can be just references) and how they affect the design

    --
    What keeps me going is my inertia.
    1. Re:Good example by dsplat · · Score: 1

      By "interfaces" I didn't specifically mean the GUI. I don't tend to think in those terms myself. I tend to work on odd networking and embedded stuff. You don't want your interfaces to other components to have unexpected behaviors on stuff that has to run 24x7 without a user anywhere in sight to reset it when it goes wrong.

      --
      The net will not be what we demand, but what we make it. Build it well.
  138. One Simple Rule for a Good Design Document by dbretton · · Score: 2, Funny


    It must compile and run correctly.

  139. Very simple approach. by bill_kress · · Score: 2, Interesting

    First trick: Empathy. You have to understand your target audience and write to inform them and fulfill their needs. Don't try to appease every audience with the same document--engineers need to see a much different document than marketing.

    Second trick: Brevity. Put NOTHING in there unless it communicates the design and is required by the target audience. Get rid of Cut & Paste boilerplate just as you would in your code.

    I guess finally I'd have to say --be complete. If you find yourself saying "We'll work out the details of that later", it's going to be one of the more difficult parts of your project.

    The problem is that these standards are difficult to quantify, so the most important point would be Hire a good architect. Look at design docs they have written and see how many questions you might have if you were implementing that project. Let them train the rest of your staff.

    The difference between a typical programmer and a good architect is about the same difference as that between a house painter and a classic artist. Even if a group of house painters could paint the Sistine Chapel, they would have to have some pretty good instructions to follow--and they would be completely incapable of making those instructions themselves.

  140. a history of design changes by Uzik2 · · Score: 1

    I've been on a few where something got changed
    for a very good reason, but the reasoning was
    lost when the staff left, or was forgotten with
    time. I like to see comments on WHY things were
    done, not stuff like:
    i++; // increment i

    --
    -- Programming with boost is like building a house with lego. It's a cool but I wouldn't want to live in it
  141. Unforunately, I find design can be a hindrance by pg110404 · · Score: 1

    I've worked on many projects, some with documentation, some without. I'm currently designing a point of sales system for my employer and trying to get information from him is worse than pulling teeth. At least with persistance, the teeth come out. I've gone days without getting a straight answer out of him, often without being able to get any kind of useful answer out of him at all, so I resort to implementing whatever the hell I want.

    Sometimes that backfires and I have to rip it out, but for 99% of what I've been doing, it stays in. To make it more interesting, development and deployment are simultaneous and I can't exactly withhold adding new features for months on end before letting loose a new version that could break a bunch of stuff. I average a release every 2 to 3 weeks.

    When I started working for him, I was going to do it right by ironing out exactly what he wanted on paper then implement. I got about 5 pages of design before I realized it wouldn't work here.

    Code documentation can also be just as bad. I could spend up to 70% of my time maintaining comments and function documentation, only to accidentally let something slip when I subtly change the behaviour of the function or the block of code.

    I've always been pretty good at reading the code directly to find out what it does. It might be time consuming to figure it out, but as I see it, the time I save not maintaining documentation which over the course of a complex project will invariably become incomplete/incorrect, can be better spent figuring out what the code is actually doing. The code does not lie. It can be very misleading, but it does not lie.

    If I ever did plan to write up documentation (non user guide) on this project, it would be a very simplified overview of the environment, the tools required, the source control used, the database backup and archiving schemes, etc, but to get into serious detail of why this feature belongs or not, in my opinion can hide the forest for the trees.

  142. Read this about 10 times by JenniefromtheShire · · Score: 1

    http://www.joelonsoftware.com/articles/fog00000000 36.html Explains clearly how to lay out an actual like useful spec.

  143. Pessimistic way.. by t_allardyce · · Score: 1

    The design document should be the source code with a few big blocks of comment at the start of various modules and one readme file that tells you which source file to start reading first. The reason is that in the heat of coding, everything thats not source code is going to get lost, no-one is going to bother opening up a word processor and the only place you can easily write something and expect to find it again is in a comment. Also the only way someone is going to read your design document is if its in the section of code they're looking at. Diagrams and tables? ASCII art.

    If your boss asks you for a formal document printed and bound, just write a script to dump all the comments to a file - you could even have a system to mark single line code-explanatory comments so that they don't go in the doc - then your document is always up to date.

    --
    This comment does not represent the views or opinions of the user.
  144. Software process = albatross by Urusai · · Score: 0

    You should have 2 documents only--an informal sketch of the design (possibly including addenda for fixed-in-stone interfaces), and a slick, comprehensive manual for the end user. All this UML and case use junk is an impediment to writing software. Software should be written in a military model, not a consensus or collaborative model. One project general who understands the whole thing, who delegates subcomponents. If one person cannot understand the whole thing, your project is dead already.

  145. Typical... by unix+guy · · Score: 1

    I spent most of last winter writing software for a major university. The specs were passed by a review board who were more concerned about the spelling and CAPITALIZATION than the functional points of the design.

    Having 10 weeks to write the app, it took them 9 to decide on the specs. - I wrote the app while they were arguing about it. The app worked - they paid me..

    --
    "Straddling the sword of technology..."
  146. Effective Design? by ArchiTom · · Score: 1

    For another point of view, check out http://www.ArchSynergy.com, click on the SEEM link. SEEM takes formal methodologies and wraps them with a more practical approach. We've been using it successfully on a variety of projects with excellent results. Of course, I'm a little biased... :-)

  147. Re:Yeah, that's pretty much the distinction I lear by starsandsipes · · Score: 1

    "Well, truth be told, I've not seen one since moving to the US. Real design work is rarely done, and documentation is something added on at the end"

    Don't really know where you work, but welcome to my world! I have been a software engineer for 5 years now, and we do ASPECS, BSPECS, SRS's, Pre-Design, and Designs Docs. We do some prototyping sometimes in between to make sure it can be done, but most companies do design before code.

  148. Explain why by Anonymous Coward · · Score: 0

    This is the thing I miss most about a design document. They go into details of all the specifications and requirements and fail to give the big picture.

    Explaining why a requirement exists helps the person actually doing the design and implementation understand if you really need it to be this way, or if certain things happened to be a mistake.

    By explaining why, you allow the designer and the implementor to solve the problem elegantly and well as they understand how each part of the system ties into the whole.

  149. Pay for documentation. by Mybrid · · Score: 1

    Many companies won't pay engineers to write documentation, i.e. give engineers documentation time. However, the PHB will have a requirement that engineers must provide documentation all the while looking over their shoulder to make sure they are writing code.

    Too often documenation is only given the appearance and lip service as to the importance of the documentation all the while asking engineers if they can meet deadlines. Even if someone other than the engineer is writing the documenation often times the engineer is tasked with starting development before the design document is completed or yeah even started.

  150. functionality, inputs and interfaces by Anonymous Coward · · Score: 0
    We're going to be rewriting some of the procedures very soon and I'll be able to influence the software side so I wanted to ask Slashdot readers what sort of things have they seen in design documents that they've liked/thought are a good idea?

    A software design document is primarily a communication tool. First step is to decide who you are communicating to, as what needs to be in the doc differs for different audiences.

    For the purposes you describe -- to subdivide the implementaiton between people who were not part of the original design team-- you probably need:
    * An understanding of the overall design of the system (what the system does belongs in a different document).
    * An understanding of what each piece needs to do. What all the legitimate inputs it can expect are, and what it must do with them or in response to them.
    * All the details of the interfaces between the components. Be analytic here -- you can't have too much detail as these are the places where you can parcel out work between the engineers. Anything not documented here is where the engineers will get it wrong and cause flat out failrues, rework or bugs.

    Often, there are several levels of breakdown. Document them all.

    Whatever you do, avoid implementation space. -- don't document how a subsystem is to work niternally, even though you need to understand it at that level to do the design work. I don't know any engineer that can successfully do this, but writing such text only wastes time, makes the document heavier, harder to read and understand, and ultimately won't make sense to some other person who has to implement that part anyway.

    Then, when you realize that doing this is indeed what you need, but will take longer than management will allow you to do the design and implementation, pick a subset of what you really need that safisifies management to document, and leave the rest as verbal documentation to the other people who join the project. Factor in the size of the implementation team and document only the functionality and interfaces between the parts that different engineers will be doing.

  151. rather Waiting for Mythical Creatures by DuctTape · · Score: 1
    but then, I've never seen one of these rumored documents, so I can't say for sure.

    My experience has been, working for a former Fortune 500 company (it may still be, but it stopped acting like one about 8 years ago), that there were no good design documents from anyone else that we could use as a template. Either someone had a document from a book somewhere that had the kitchen sink in it, or else it was such an atrocious and/or insufficient mess, that it was useless.

    I think that what was really going on what that everyone was waiting around for someone else to come up with a good design document that could be used as a prototype. In the meantime we used the old standby, tribal knowledge, as a communication medium and design store. Thank goodness nobody ever got run over by a truck. ...no, actually, that wouldn't have been all that bad....

    DT

    --
    Is this thing on? Hello?
  152. Functional Specs vs. Design Docs... by Lodragandraoidh · · Score: 2, Informative

    I write seperate functional specifications. If the implementation requires new machines and installation by our operations department, then I might do a presentation showing why we need it, and how to hook it up (for most things this is pretty much standard boilerplate) - and perhaps how to pay for it in an appendix to the spec.

    The software design documentation is in the code in the form of a detailed comment at the begining of the main code module explaining my design choices for each piece. I like to use languages, such as Perl, that allow me to format and extract documentation directly from my source code. I also like it to be inside of the code so I can make changes to my documentation at the same time that I make changes to the code. This is much more efficient for me - things don't get lost in the shuffle.

    Going forward my goal is to generate XML documentation for not only the design document, but also the user manual, and other documentation from the same source code. I'll have a makefile sitting in my revision control archive that will generate all of my documentation for all apps in one command. BAM! I'm done, and can then read and edit my docs at my leisure.

    The hard part is getting everyone else who touches my code to follow the same procedures.

    --

    Lodragan Draoidh
    The more you explain it, the more I don't understand it. - Mark Twain
  153. It doesn't matter ... by jc42 · · Score: 1

    In all the projects that I've worked on, the design docs are just there to satisfy management. Nobody ever actually reads them. ;-)

    This is, of course, said in a "Ha, ha, only serious" fashion. I've written any number of design docs. But I tend to play them down. The reason is that, when you start implementing, you invariably find that you've missed a few important things. Sometimes this leads to significant redesign. And this means a lot of finger pointing and recriminations, because you Didn't Get It Right The First Time. Eventually you can get back to the job of implementing what you now understand you really need, and maybe do a bit of rewrite of the design docs. But you've lost a lot of time playing political games. And in poorly-run organizations, your initial incomplete design will be held over your head indefinitely. So it's best to try to make the design docs "preliminary", with the understanding that you'll revise them as requirements change or serious problems are found with your platform that prevent you from building part of the design.

    In a really bad organization, the design docs will be cast in concrete, and you must implement to the design, even when you can show that it'll be a disaster. But in that case, you start looking for a new job right away.

    I've seen one case of a design that had a serious flaw, which the designers insisted was right. I implemented the correct design in parallel with the official design, with a runtime flag to select between them. When the first customers all rejected it because of the flaw, I was able to quickly "implement" the correct design. I was a hero with everyone except the design team, who discovered what I'd done.

    The fun ones are where you can prove that the design can't actually be implemented at all. I've worked on a couple of those. I found new jobs pretty quickly ...

    I've long been a believer in the rule that the designers should be forced to implement their design.

    --
    Those who do study history are doomed to stand helplessly by while everyone else repeats it.
  154. A Must Is... by vlad_grigorescu · · Score: 1

    Using GPL fonts!

  155. Domain-Driven Design - Recommended Reading by DrPlutoMadre · · Score: 1

    See "Domain-Driven Design" by Eric Evans. (Addison-Wesely, 2004). I general, I recommend writing about the system from different points of view, using different types of diagrams, even if it means some redundant information.

  156. Extreme Programming by TheSpooler · · Score: 1

    One of the increasingly popular developpement technique is the Extreme Programming (XP) as envisionned by Kent Beck http://c2.com/cgi/wiki?KentBeck. It involves constant testing, not designing everything up-front, but rather progressively. A must read.

  157. Re:Yeah, that's pretty much the distinction I lear by dnoyeb · · Score: 1

    A design document is not the same as a requirments document. as a example see IEEE 1233 for a description of a requirements specification.

    Design document is lower level. It shoudl describe how you are going to deal with the requirements. Perhaps its just that what you call 3 sections, is for some 3 seperate documents. Created and managed by different parts of a business sometiems.

  158. New starters by old_unicorn · · Score: 1

    I ask new starters to my projects to write or add to the "things new starters should know" document. That seems to help.

    --
    ***You learn something Every day. And then you die.***
  159. The Solution! by Anonymous Coward · · Score: 0

    A few years ago I developed a large project in Visual Basic. The only design was a pencilled sketch of the User Interface.

    As the deadline loomed, I sat down and carefully wrote an overview of the system with copious flow
    charts. This then was the design document.

  160. Document readable to other engineers by Jboy_24 · · Score: 2, Insightful

    Reading through some of the comments it seems that other engineers and those that havn't progressed to that level, don't indicate who should be reading the design documents. The audience for design documents are your collegues. Before you begin your document you should start by reading theirs. A good PHB should force you to.

    A good design document should describe what you want to build, what you need to change in the existing system and what your dependancies are to name a few. It should spell out how you want to order you classes (UML!), most importantly how you will use the global classes (like an user class).

    Therefore, if any one of your colleagues can read your document and think one of the following thoughts your document was a success:

    "Oh Joe wants to use the user class like this, I guess I won't change it to stop that from happening"

    "I don't think Joe knows that I'm building a Foo class since he thinks he's going to build one, I'll email him and we'll decide who's going to do it"

    "I see that Joe has this great system designed, but he seems to be forgetting the requirement that we have to let the end-users configure it through the app and he's only using property files. I'll email him and make sure he didn't forget that."

    "Uh... what the hell is Joe thinking, there's an existing class that does exactly what he wants to do, why did he waste his time writing this document?"

  161. Less is more. by Anonymous Coward · · Score: 0

    One of the real problem, IMO, with design documentation is that a lot of time is invested in creating documentation no one ever reads.

    Certainly, some documentation of "how things work" is a good thing. And key parts like API's and interfaces should be fairly well documented.

    But unless you're part of a team of 200 programmers writing Longhorn, resist the urge (or the requirement) to document every little thing in tremendous detail. Here's why:
    * Designs change. If you're doing "adaptive development" (a.k.a. Agile, RUP, Unified Process, etc.), the design is never 100% final. Some things are solid, but some will change. Out of date documentation is in 90% of cases WORSE than no documentation if someone relies on it as "authoritative."
    * Even if you're doing classing waterfall development (first we gather ALL the requirements, then we do ALL the design, then we do ALL the coding), it's still a fallacy to think you can document everything in detail in a way that won't change. Writing code usually entails some learning, and that will affect the design. Again, a great big document that covers "everything" will probably wind up having inaccuracies unless you're INCREDIBLY anal about updating it.
    * It's expensive--it's taking a lot of developer time to document.
    * Skillset issues--developers aren't tech writers, so a developer writing a design document isn't ideal. On the other hand, getting a tech writer up to the level where they can write good design is difficult.

    The best principle is "write the minimum set of documentation needed to ensure interoperability with other necessary components, get the entire development team on the same page, and to ensure your ap can be supported going forward." More than this is waste.

  162. Design and Implementation Framework is Crucial by afroncio · · Score: 1

    Before answering the question, we all need to agree on a design and implementation framework. For instance, the one I use looks like:

    Phase I: Functional Spec
    - what problem needs to be solved
    - QA suite defined
    - user's requirements
    - use cases defined

    Phase II: Technical Spec
    - proposed API
    - specifics of satisfying above QA suite
    - class hierarchy
    - functions needed

    Phase III: Implementation
    - set up QA suite + build environment
    - code
    - debug

    Once the above framework is laid, the following definitions can now make sense:

    Bug: variance between technical spec and coding

    Software Validation: an assessment of whether the functional spec is consistent *and* satisfies the real user requirements.

    Note that if the code is the spec, then there can never really be a bug, can there?

  163. MIT's 6.170 by ccjernigan · · Score: 1

    Being a student currently taking MIT's 6.170: Lab in Software Engineering, I would point people to this page: http://www.mit.edu/~6.170/supplemental-info/docume ntation.html
    And to http://web.mit.edu/6.170/ for the general class website.

  164. Some project documentation by BorBoss · · Score: 1

    Hello guys!
    There are a couple of projects carried out at a department at my university. Abstracts for them are available in English. Maybe someone would take a look at them and comment on them somehow just a couple of sentences. English versions appered only a few weeks before today. I'm just curious - are these projects of any interest? Here is the address of the department - http://is.ifmo.ru/projects_en/. There is one project completely translated to english - http://is.ifmo.ru/projects_en/elevator/

  165. 3 things by dustin_0099 · · Score: 1

    It should enable new hires to ramp up quickly. When nobody works on it for 2 years and it needs a small modification, it should be clear from the docs where the change can and should be made. All upstream and downstream dependancies should be noted so when something breaks you know where to make the update to keep the systems working with each other. See? It's simple.

  166. 5 steps - untenable by israfil_kamana · · Score: 5, Insightful

    The five steps enumerated here are, sadly, rather untenable. In particular, points one and two make a fundamental assumption that I believe is invalid - get your requirements first. If we have learned nothing in the past 40 years of software, and especially in the last decade, it's that we will never have "the requirements." We will have subsets, or views of the requirements, true. The fact, however, is that requirements change during the life of the product development.

    Skipping to point four for a moment: I would argue that the requirements should be expressed in the form of tests - functional, unit, or otherwise, and that these tests be executable. The design MUST therefore meet the requirements. This then means that point number three may or may not apply.

    I agree that code is not design. Design is abstract, and code is not. And pure-code-no-design folks go overboard in my view, but if you can't have complete requirements (and you can't) then you certainly should document that which is not obvious from a structural breakdown of the code itself. Particularly, documenting risky or unusual features of the code, such as tortured relationships and their semanitcs. To me that is the limit. Document what is not obvious, do not document what is structurally implicit, or otherwise explicit. Documentation covers risk, and risk mitigation points (ie. person hours) are best spent making better software, except when documenting something that, if left unsaid, might lead other developers to an incorrect assumption or conclusion.

    As to point number five, your experience may vary. In my experience, it's quite the reverse. But in the example I'm thinking about, we didn't have each individual designing - the whole team designed together, and the whole team coded and tested, and never alone. Also, design changes, or any changes to assumptions (or APIs, or etc.) were well published throughout the team, so that there was ongoing restatement of context. If anyone thought that something was an odd or interesting design feature/artifact, they mentioned it, and the author clarified it and documented it. I don't think having individuals altering design outside of a process of consultation is wise, and I think this "cowboy" flavour of agile developent is abortive and a throwback to no-process development. However, small teams that are engaged collectively produce, in my experience, excellent design. You then need to capture what is not obvious, or somewhat obfuscated, and especially capture assumptions.

    Where ThosLives and I would agree, however, I think, is that you need to trace design aspects to requirements. You may not have final requirements, but you always have some, and you shoulnt' make design decisions without a requirement to trace to. In this sense, you absolutely must have tracability from requirement to design to implementation to proof (test). And if requirement can be expressed as a test (not all requirements can), then that is, in my view, the best way.

    --
    i - This sig provided by /dev/random and an infinite number of monkeys at keyboards.
    1. Re:5 steps - untenable by jschrod · · Score: 1
      he five steps enumerated here are, sadly, rather untenable. In particular, points one and two make a fundamental assumption that I believe is invalid - get your requirements first. If we have learned nothing in the past 40 years of software, and especially in the last decade, it's that we will never have "the requirements." We will have subsets, or views of the requirements, true. The fact, however, is that requirements change during the life of the product development.
      Well spoken. That's the cold hard reality for most of us.

      I don't have mod points right now; perhaps with my +1 bonus, some moderator sees your article and mods it up.

      --

      Joachim

      People don't write Manifestos any more -- what's going on in this world? [Frank Zappa]

    2. Re:5 steps - untenable by RodRandom · · Score: 2, Insightful

      You have to come up with as objective and purely functional a set of requirements as possible, if only for the reason that (most of the time) you have a customer and a contract, and the requirements are what the customer signs off on after testing instead of suing you or witholding payment(and believe me, they'll try it).

      Clear requirements are your protection against politics in the client's office, using your project as a stalking horse, and many other unfair surprises of the business world.

      If you have responded to an RFP, the requirements process allows you to restate over-specific, vague, or non-optimal customar requirements into a form that is testable and clearly specifies the functionality that is to be encoded. You restate what the client gives you, and negotiate until agreement is reached.

      You have to have enough requirements to specify the functionality that you are committed to providing so it can be verified, and not so many that you wind up with a government ashtray that does work but costs five times (or five thousand times) what it should because it is over-specified.

      This presumes a process of iteration and clarification that may well continue throughout the development cycle, and may be formalized in a number of different methodologies. But the principle of agreeing on requirements and proceeding on the basis of the agreement is essential to any productive business process, no matter how iterative.

    3. Re:5 steps - untenable by jschrod · · Score: 2, Insightful
      I'm a CEO, and my company is profitable since 1995 -- I know the risks and the opportunities of projects and associated contracts.

      But I also know that non-insistance on precise, predefined requirements got us lots of contracts; in especially the circumstances that our customer doesn't know exactly what he wants and that it is part of our job to find that out.

      There are other ways than technical or functional requirement specs to bring this shared understanding in a contract and manage the risk for both sides.

      Good IT projects don't react or ride the waves of change, they create them. And these are typically projects where one doesn't have functional requirements up front.

      --

      Joachim

      People don't write Manifestos any more -- what's going on in this world? [Frank Zappa]

  167. Things to include in your design document by James+Youngman · · Score: 3, Informative
    Assuming that you have separate documents that include the requirements that you've agreed with the users/client, the system test battery, how the system will be operated/managed/installed, you should include the following in your high level design document (hint: high-level desgin documents include pictures but not pseudocode)

    Not all of these things will be appropriate for all systems. This is not a table of contents!

    1. Purpose & Context
      • why are we doing this?
      • helps low-level designers (who read the high-level design) to make the inevitable trade-offs in the right way, and also helps them to recognise a gap when they see one
    2. how this fits in with everything else
    3. scope (that is, what are we not trying to do?)
    4. References
      • list your 'upstream' input documents
      • sources of extra information
      • ways to arbitrate conflicting statements or to help drive the process of feeding back reports of defects in this document
    5. what is the baseline? It's important to work from a consistent set of documents:
      Know what you are trying to build; otherwise you won't know when you haven't managed to build it
    6. Assumptions
      • Check these! Often the users needs to agree to these (but make sure they actually understand the implications!)
    7. System Overview
      • The Big Picture
      • what are the interfaces?
      • what smaller components make up the overall system?
      • within the components, what are the layers? e.g.
      • presentation layer
      • application-specifc ("business") logic
      • data access, protocol handling, etc.
      • migration to/from (this verstion of) the system
    8. Explain the end-to-end processing of requests (or whatever)
    9. Main body
      • pehaps one section per interaction
        or per group of web forms,
        or per batch process
        or per ... whatever is appropriate for the things your system does ...
      • include mapping to significant parts of other documents; for example, if you have a database, show how each thing described in your functional spec is stored in the database.
    10. Error handling, exception processing, resilience issues
      • user input validaiton
      • validation of other inputs
      • error conditions; how do we distinguish
      • data/business errors - the functional spec demands that these errors must occur when the system gets this input
      • technical errors - might be fixed by trying them again later
    11. handling environment problems
      • database went away
      • pneumatic drill through network cable
      • no response from remote system
      • cluster node failure
      • out of disk space
      • server obliterated by thunderbolt
      • ...
      • But not an error catalogue (since you will not yet know the full list of error conditions; don't try to put one in here otherwise when the code is written people will represent a new kind of error as some weird variant of an old one because the old one is in the error catalogue and the catalogue is carved in stone - bad idea!)
    12. likely failure modes - and how the design prevents things getting worse in each case
    13. Discussion of configurability, scalability, performance issues, user accessibility, compliance with standards, etc.
    14. Security
      • trust boundary (which things do we trust, what information are we trying to keep safe?)
      • authentication
      • authorisation
      • data integrity
    15. Compliance matrix
      • Shows how the design meets each agreed functional (or non-functional) requirement; cross-references the functional spec to each section of the design document
      • Handy when you change the design document - it shows you which functional spec requirement might be affected and hence which of the tests will need to be redone (you do have a test battery, don't you?)
      • what parts of the design should be included but are not yet complete?
    1. Re:Things to include in your design document by QuestorTapes · · Score: 1

      I like the Purpose And Context and System Overview at the start. I have never been on a project that failed if there was a clear vision of the purpose.

      The Compliance Matrix is good too.

      Regarding Assumptions:

      > * Check these! Often the users needs to agree to these (but make sure they actually
      > understand the implications!)

      Here be dragons; I've been thinking about the projects I have been on in the past where assumptions bit us, and I think one problem is that users agree to them too easily.

      Too many projects start off for internal network use only; then need to support dial-up; then need to support 100 times as many users as originally decided.

      I think it might be best to document the consequences of these assumptions. Add something in the design document like this:

      'Application will support high-speed local LAN connections only. Adapting the application for other connections, including but not limited to VPN and web access, cannot be retrofitted into this version, and will require creating new application version. This will require all ordinary resources, calendar time, and expense for a -new- project, and will require a complete reestimation process.'

      The idea being to deal with inevitable requests to just bolt on the web access. It doesn't have to be this wordy or formal, but document and get sign off that this is a major design decision, and that we can change these assumptions just like the requirements, -but- that it will have big consequences, and here is what they are.

  168. Re:Yeah, that's pretty much the distinction I lear by jd · · Score: 1
    Requirements analysis should be in its own document, but the design document should reference it. That way, you can "prove" coverage of the requirements, because all requirements are referenced by the design.


    Actually, you can think of the three sections as being collections of pointers. The introduction should point to the more abstract view from which it is derived. The second "design" section should point to a more detailed design-oriented view. The third "implementation" section should point to a more detailed implementation-oriented view.


    It may well be that the different sections are written by different people, but those sections define a complete view of a given level in the project. A complete view is the key difference between projects that succeed and projects that fail. How a company goes about doing that is largely irrelevent.


    It is also important to understand the difference between implementation details at different levels. If you're starting with a formal requirements specification, then your "implementation" could be a Z Specification. From the standpoint of that perspective, it is an implementation, even though it is not an implementation a computer could realistically use.

    --
    It's a small world and it smells funny; I'd buy another if it wasn't for the money; Take back what I paid (SoM)
  169. CMU has done great work by Anonymous Coward · · Score: 0

    See http://www.sei.cmu.edu

  170. What about agility? by zorander · · Score: 3, Insightful

    All of this talk seems to assume that there's at least some excess manpower to be thrown at the problem, that the customer knows what they need at the time of specification, etc. It doesn't allow the softare to become what it was meant to be, but only what the potentially narrow mind of one designer allows for early in the process.

    I work in control systems. We have in-house motion control software that we use to do weird jobs. This software is not as featureful or complete as the packaged solutions, but it is cheap to deploy, and designed to be expandable and flexible. A project might entail anywhere from a few hundred to a few thousand lines of custom code that sits on top of the 30-40klocs of core code.

    When a customer requests a CNC retrofit of an old or weird machine, they seldom have any idea how the machinist on the floor actually uses the equipment. They see the problem as a basic one--the machine takes too long at X or the machine lacks capability Y. The machinist is not really a programmer and isn't mentally prepared to make the leap to writing a specification.

    The solution to the problem was for me (a programmer) to go into work with the machinist for a few days when the software was about half done and help him make the parts he needed to. Even though the software was incomplete, I could at least step around any immediate problem by throwing a little bit of prototype code at the problem and get the operator's feedback regarding the process as a whole and how it could be changed to make his life easier.

    I guess the point I'm making isn't fully formed, but all this talk about design processes seems to be missing the essence of that project, which was only possible by allowing the sole user of the software and the programmer to spend time collaborating. For much of the coding, I brought my workstation to the factory floor and worked right there. It made testing much easier and let me ask the operator questions whenever an issue arose that hadn't been forseen by my boss or his when they planned out this task and designed the system. I would, of course, run major changes by my boss first, but he pretty much trusted what the operator and I were figuring out.

    We've been providing custom software to this company for several years. It's pretty much run without issues and has saved them huge amounts of money, essentially by optimizing a handful of machines in there shop. The project would never have gotten off of the ground if we'd been caught up in these sorts of formal processes. We don't have the manpower, or the timeframe.

  171. Wrong question by pkesel · · Score: 1

    You can't ask for a good "design document". No single document is going to be sufficient for transfering design knowledge to every developer and analyst on a system. You need to have a good design documentation PHILOSOPHY.

    I've been an analyst and coder and now system architect on a number of systems. My philosophy is to create a baseline system model that is the starting point of every discussion about the system. It is generally not detailed enough to answer any question about the system, but the important point is that IT IS ALWAYS ACCURATE! This model is the starting point of every discussion. We then look at the decisions being made and we start on a more detailed model that is tailored to those. That model -- diagrams, text, etc. -- is generally not proper for any other decisions because it's not focused for any other decisions. You have to do it again for every significant decision making session. That may seem like waste, but there are two important points.

    First, we ALWAYS start from an accurate model. Any decision made from an inaccurate model may be inaccurate, and that means improper design, coding, testing, and delivery. In other words, defects. If your baseline model is not accurate you've changed underlying business objectives. That means you have a LOT of work to do. It should scare people when your baseline model becomes innacurate.

    Second, we deal only with the information that is important for our current decisions. We have an accurate picture without distractions from extra information, too much detail, etc. We all know we can't maintain a detailed model. Software changes too frequently and deadlines don't let us spend the time we might need to maintain a fully detailed model. And we most of the time won't need a fully detailed model, just enough to make the decisions at hand. So don't try. Keep just enough to start from and go just far enough as required when you need to.

    So, in short, develop a system model that has enough detail to springboard your development process, but not so detailed that it's hard to maintain and that it carries baggage to discussions that doesn't need to be there. This model will become the paper that everyone recognizes and everyone carries around to meetings. When that paper is insufficient for your decision making, let your analyst or system architect work with you to get you a more detailed model. When you're done, throw that one away because it'll probably be obsolete by the time you're done with your coding anyway. It certainly won't be pertinent to your next decision making and design activity unless you screw up the one that brought it about.

    No methodology will tell you to do it this way. But then, I've never seen any named methodology ever executed to its fullest. No one can afford to do it.

    The point of analysis, design, and documentation is to improve the probability that any development task will be successful. Out of the box, no methodology can guarantee that. But, if you approach analysis, design, and documentation with this as your objective -- making development successful -- you can use any methodology you want and adapt it as necessary. If you know your business people, your developers, and your processes you can take any methodology as far as it needs to go to improve that probability of success.

    --
    - Sig this!
  172. Design Docs by spring · · Score: 1

    Good question. Unfortunately, what constitutes "good" depends a great deal on what the system is.

    Assuming that you have a separate set of requirements in some form, a set of design documentation should answer questions like this:

    1. How is the software structured, at a high level? What are the logical pieces, the chunks of functionality that make up system behavior? What are the languages / platforms used?
    2. How is the software physically structured? What does it "look like" when deployed?
    3. What are the key points of contact between components and systems? How are they integrated (API, protocol, etc...)?
    4. How are the core business requirements implemented? Which components collaborate to implement key algorithms?
    5. How do the logical layers of the system fit together?
    6. What additional technical requirements surfaced when creating a design to meet the business requirements? How did these technical requirements constrain the design?
    7. Were are the data stored and in what format? Database schemas, XML schemas, etc...
    8. What surprises surfaced during design? Why were key design decisions made, particularly where something was implemented in a more complex way than would seem necessary?
    9. Are there any sample data that will help explain the system behavior?
    10. Additional technical documentation for the problem domain (e.g. hardware interfaces, non-standard protocols, etc...).

    My bias is that structure and interaction is best described with UML. My preference for technical documentation is a word doc that walks technical staff through key points of the model, with snippets of the model incorporated into the document. The word docs and the UML models work together to specify the system. This depends a great deal on the kind of software you are designing. A three-tier Java system will reqire quite different documentation than a COM-based desktop app. Some documentation just doesn't apply to one or the other.

    UML is best kept at an analysis or logical level; in most cases, code is its own best physical documentation.

    Assuming the system has a reasonable set of UML diagrams describing the structure and dynamic behavior, a walk-through document with good explanations can make things a lot clearer.

  173. I have to ask... by humphrm · · Score: 1

    Why are you asking Slashdot? :) Yeah, I can afford the karma.

    --
    -- "In order to have power, I must be taken seriously." -Mojo Jojo
  174. Make it a living document. by MythMoth · · Score: 1

    Whatever you do, can I suggest that you put it in a Wiki? This will give you some glimmering of a hope in hell that it will reflect the actual product you deliver some day.

    All other design documentation gets admired right up to the point that the writing of the application begins, then lip service is paid to it. If that.

    If you do accept my advice, make the first job of any developer or support person this: walk through the design of the application (or their part of it) with a current dev team member, and amend all any inaccuracies found during this process. They will thus learn about the application, and the Wiki at the same time. You get immediate feedback (in the form of their contributions) on their competence. If they get it wrong it's easy to revert.

    Another benefit is that the history will allow you to see how the application evolved through time - some of those nasty hacks the support team curse will be easier to understand (and thus support) when they know the short term advantages, or misapprehensions that it resulted from.

    And lastly a word of warning - I've only had limited success selling this to management; I've not tried it in anger. But I've read a lot of design documentation that didn't faintly resemble an application that I was expected to fix at short notice - so it's got to be worth a shot.

    --
    --- These are not words: wierd, genious, rediculous
  175. The one thing you usually WON'T find by Anonymous Coward · · Score: 0

    in a design document is Good Design.

  176. One HUGE necissary component by chromium · · Score: 0

    One thing that I've found that is necissary but often hard to do is getting the end-users or functionality drivers to sign-off on the document.

    This gets people to agree to a certain set of design requirements, helps reduce scope creep or at least track the baseline, and it scares people into reading more of the document when their butts are on the line. It also helps get user buy in and especially when third parties are involved, a negotiation point.

    At my workplace, a document isn't considered complete until sign-off has been achieved. You can design all you want to but if you can't get everyone involved to agree you're in for a rough ride.

  177. Some of the titles I see here... by Richard+Steiner · · Score: 1

    ...seem mostly meaningless to me except perhaps in a university or very large corporate or government environment where research is done.

    I've never met a "Computer Scientist" in the companies I've worked for, since that title implies a mainly research-oriented role.

    I've also never met a "Software Engineer" except for the few folks I know who have that title and are also EE's, but they tend to be involved in the design of firmware or other hardware components.

    Most of the folks I've run into in applications development tend to be described by more practical titles:

    * "Project Manager" typically does task and resource allocation and coordination, but often remains somewhat non-technical.

    * "Programmer/Analyst" tends to be heavily involved in both the design, coding, and testing stages and approaches things from a technical perspective.

    * "Business/Analyst" tends to be heavily involved in both the design and testing stages and approaches things fron a functional end-user standpoint.

    * "Programmer" is usually someone who is very inexperienced, and who helps the Programmer/Analyst during the coding and testing phase and sometimes in the design phase. In time, they typically turn into Programmer/Analysts.

    There are also sysadmin and database admin folks, operators, and a few others, but they aren't as involved with formal softwae development (though the writing of scripts, stored procedures, and other things can often be significant tasks).

    --
    Mainframe/UNIX Bit Twiddler and long time Windows/Linux Hobbyist.
    The Theorem Theorem: If If, Then Then.
    1. Re:Some of the titles I see here... by EnderWiggnz · · Score: 1

      Most likely, you have been around database application shops.

      --
      ... hi bingo ...
    2. Re:Some of the titles I see here... by Anonymous Coward · · Score: 0

      You may see the word "engineer" avoided in many jurisdictions because it may be illegal to use to word except for professional or certified engineers. Note that when I say "certified", I mean in the sense that some countries refer to "certified engineer" the same way that "professional engineer" is used in North America. I do NOT mean "[Vendor] Certified Engineer" or some other such thing.

      Generally, though there are exceptions which may vary, these are people who have an engineering degree accredited not just by a post-secondary accredation body, but also by a professional engineering body. Many professional engineering bodies are typically backed by government legislation.

      By using a job title that does not use the term "engineer", a company can hire not just a professional engineer, but somebody with some other engineering background, a computer science degree, IT diploma, etc. if it so chooses.

      There are many people who care about their job title, but some people care more about the job duties, salary and long-term career. Of course, job title can affect long-term career.

  178. Pecker Tracks by Anonymous Coward · · Score: 0

    A good document design will include the pecker tracks of every swinging dick that touched it.

  179. I have a BSCS, but I'm no "engineer". by Richard+Steiner · · Score: 1

    The best description of my role over the years has been "programmer/analyst". I do requirements gathering, technical design (usually in conjunction with one or more end users or user reps), coding, testing, documentation, and support.

    There isn't much complex math involved at all unless the applications I'm writing involve complex equations, or unless some of the solutions involve some form of mathematical computation.

    While I respect people who have my qualifications and perform the types of tasks that I do, I've always considered "engineering" to be a somewhat more rigorous discipline.

    --
    Mainframe/UNIX Bit Twiddler and long time Windows/Linux Hobbyist.
    The Theorem Theorem: If If, Then Then.
  180. The best design document is the one not written by bADlOGIN · · Score: 1

    The ideal design document is the one you didn't have to write because you were too busy delivering well tested, working software to your customer. This is a lot better than the 300 page design document (which the customer in truth doesn't give a damn about) that you deliver only to have the requirements change 20 times, which are still incomplete, which lead to your project cancelation. I look at it this way: typical software development lifecycle assumes not only that you can know everything up front, but that you make the right decisions with the information. Dispite more than 30 years now (see The Mythical Man Month, F.P. Brooks) of repeated demonstrations that this doesn't work, projects are still too often structured around this flawed concept. A lot of Agile approaches discard this ritual or at least put a reasonable devaluation on it.

    Take a look at Agile Manifesto for more info.

    --
    *** Sigs are a stupid waste of bandwidth.
  181. No one wants to pay... by CptNerd · · Score: 1

    It takes a lot more design time and effort to make your underlying design flexible enough to handle many changes. But, that design time and effort costs money, money that no one in either management or on the customer side is willing to pay. It also means that once a design has been settled on, implemented, and fielded, major rewrites will almost never happen. The attitude is "it works, it's making us money, and the customer is mostly happy with it, why change?" Unfortunately circumstances arise where the code no longer works due to outside changes (business rules change, operating system upgrades, customer requirements change, etc.) but still no one wants to pay to redesign based on the new environment.

    Plus, a "design written with change in mind" can only accomodate so much, case in point, the project I'm working on currently was designed and implemented on Solaris with Sybase and Motif, and the customer wants a version in Visual Basic .NET on WinXP with Oracle. I'd really like to see a design flexible enough to accomodate that kind of change!

    --
    By the taping of my glasses, something geeky this way passes
    1. Re:No one wants to pay... by Hognoxious · · Score: 1

      I'm currently working on something 'designed' by the Swiss. The brief was to produce a core design that would be adaptable to all the countries in Europe. Which it is, as long as by Europe you mean anywhere between Germany, Austria, Italy and France.

      --
      Confucius say, "Find worm in apple - bad. Find half a worm - worse."
  182. Bottom Up Design by Edward+Faulkner · · Score: 1

    Three words for you: bottom up design.

    The obsession with design documents is a dogma that refuses to die. But it should.

    It is folly to think anyone can sit down and plan out all the important parts of a complex piece of software without actually building and testing the ideas first.

    You won't find your faulty thinking until you try to build it. So the goal should be building a working prototype as fast a possible. Using a powerful, high-level language makes this easier.

    Start by building the primitive pieces you think you'll need, and continue by combining primitive pieces into higher level pieces. You'll frequently realize that some of your pieces need to change in order to fit together nicely, but the changes are small and local. That's the whole point.

    You will change your design over time, if you want it to be any good. So don't waste time on elaborate design documents, and write your software with changeability (and as a corollary, readability) as your highest priority.

    --
    "The danger is not that a particular class is unfit to govern. Every class is unfit to govern." - Lord Acton
  183. No, airline application development. by Richard+Steiner · · Score: 1

    Mainframe-based transaction systems, specialized apps like aircraft gross weight and optimal flap and thrust calculations, weather/ACARS message retention and distibution, etc., and now specialized application gateways between government systems.

    Also a certain amount of systems software and utility development.

    Not a lot of "database" work. We mostly use flat files or specialized transaction-system file types that are designed for high-speed access.

    --
    Mainframe/UNIX Bit Twiddler and long time Windows/Linux Hobbyist.
    The Theorem Theorem: If If, Then Then.
  184. why not code to spec? here's why by davidwr · · Score: 1

    As ciroknight pointed out, design is fluid.

    In just about every major project I've worked on, the programmers discovered that writing to the spec wasn't feasable. Yes, we had a process to deviate from the spec, and yes we got permission to do so, but real-world time pressures frequently kept the spec from being kept up to date.

    Not everything that is worth doing is worth doing well or correctly. Engineering is the art of making this judgement. A GOOD engineering process will at least go to the trouble of marking an out of date document as "out of date" so nobody gets burned by it in the future. Check that - a good engineering process will prefer to keep documents up to date, and only abandon that requirement when economics demand it - and then they'll mark the documents as stale.

    --
    Knowledge is how to play a game, intelligence is how to win, wisdom is knowing what game to play.
  185. If the product doesn't change the requirements... by refactored · · Score: 2, Interesting
    ...it isn't worth building.

    Think about that. If the the software you are creating isn't altering the business methods, the usage patterns, the very opportunities available, why are you bothering?

    New software should be disruptive. It should enable things that were never present before. It should create opportunities that simply weren't even on the horizon before.

    If it doesn't, then why bother? Make do with the old version. Patch it, kludge it. Software is incredibly expensive to write, so unless it is really disruptive, don't do it.

    So your system is worth creating, it is disruptive. THEN IT'S PRESENCE WILL CHANGE THE REQUIREMENTS.

    Thus the requirements gathering, design coding, testing, deployment must occur in a tight a loop as possible. The system must be flexible as possible to keep pace with those changing requirements.

    This is what extreme programming is about. It is "Extremely Conservative Programming". It is performing the conservative best practices that traditionally, give us quality systems, at a sufficiently high rate to cope with the disruption our software produces.

    You mention the designer is the coder is the tester in XP. Wrong.

    The coder / customer team are the requirements gathering, priority setting team. The tester is the designer, forcing the designer to design testable systems.

    The coder is the implementor constrained by superbly tight design / spec (the test), earning the greatest value to the customer soonest.

    The coder then changes hats and becomes the refactorer, who can in the light and hindsight of the evolving system create a superbly designed and crafted system. Why? Because the system was designed to be testable, it is deeply tested so refactoring is safe. It won't unwittingly break the system. And being superbly designed, it is flexible, ready to earn the next greatest chunk of value for the customer.

    And having come out of implementation with a higher level of testing than most traditional systems, it is ready for deployment to the customer. It can start to disrupt his business, start changing the way he does things, start changing requirements and priorities.

  186. Design documents are partly fiction by ebcdic · · Score: 1

    I've worked in universities, where programs are written to further research goals, and in commercial companies. In universities there's no pretence: design and implementation happen in parallel; you write the bits you know how to do and gradually fill in the rest. In industry, this is unacceptable: the design has to be done first.

    But - surprise! - it doesn't work like that. In industry as in academia design and implementation are done together. The difference is that industry pretends that it isn't true. Design documents are written that are accurate for the well-understood bits, and waffly or absent for the other bits. Provided that the same team does both design and implementation, this doesn't matter: it's just a harmless fiction. But if you have to implement from someone else's design document, the fiction is exposed.

  187. I have two words for you : Change Control by Kenneth+Stephen · · Score: 1

    Yes - thats what you are missing : Change control. It is used to track changes from a known baseline. Your known baseline is the set of requirements that you started from and any changes to that has to be estimated for, designed for and implemented without losing sight of the fact that this is a change - and not part of the base. What you are advocating is throwing out the (good) development methodology baby along with (bad) fact that requirements always change bathwater.

    --

    There is no such thing as luck. Luck is nothing but an absence of bad luck.

    1. Re:I have two words for you : Change Control by israfil_kamana · · Score: 1

      Untrue. I'm all for change control, both at the source and requirements level. Good Agile development does not do away with documenting requirements - in fact it must, but you don't spend time documenting every possible requirement. You document what you must, and you track changes to everything, source, docs, specs, etc.

      I'm not advocating a fundamentalist position here. In fact, fanatic agile people are, by definition, not agile. You need to have balance and judgement. If you don't document anything out of a "principle", they you're just as foolish as those who document everything for two years before the project starts.

      The point of not over-dcoumenting requirements, is that THEY WILL CHANGE and be obsolete by the time you're done capturing them all. So you capture what you need for a small set of iterations, document them, implement them, then document the next delta, implement the next delta, etc.

      --
      i - This sig provided by /dev/random and an infinite number of monkeys at keyboards.
  188. Keep it on a Wiki by g8oz · · Score: 1

    I've found keeping it on a wiki helps to keep the design document more current than it otherwise would be.

    Its just so much easier to make minor changes when you have 10 minutes to spare.

  189. Jargon and wishful processes by MarkusQ · · Score: 1

    One rule I used to use: before I would assign a design to a team to even think about coding, it had to be "cogent," by which we meant:
    • Every word/term/acronym in it had to either
      • Be listed in the Oxford English dictionary in the intended sense
      • Defined in the design document's glossary
      • Defined by reference (e.g. a URL or RFC#) within the design document and so indexed
    • Ditto for file layouts, protocols, etc.
    • Conflicting acronyms were not allowed (AI means something very different to a farmer and a game developer; if they are both going to be using the document, it will have to be spelled out).
    • Any objects or processes alluded to in the document had to be fully defined within the document or by reference ("the EOM batch job"? Whose, HR's, Finance's, or the cron-job-of-holding the development team owns?)
    • Any subjective criteria (e.g. "reasonable response time") had to be quantified.
    • Any subjective criteria (e.g. "an atractive layout") that could not be quantified had to be tied to an individual or group that would sign off on it.
    • There had to be a decent index
    A good test would be to give it to someone reasonably intelligent who knows nothing about the subject, and let them red-pen in their questions.

    --MarkusQ

  190. Don't do it Unix-style, or Linux-style, or .... by just+fiddling+around · · Score: 1

    Don't do it Unix-style, or Linux-style, or even worse, javadoc-style.

    These 3 approaches cover how all the nuts and bolts do their thing. That's good, and it *is* really bad. When I approach an existing system, I want a high-level description, which get broken in successively lower-level ones, until I get down to nuts'n bolts.

    That's the difference between facing a forest and a whole effin' bunch of trees.

    --
    You're not old until regret takes the place of your dreams.
  191. Re:Yeah, that's pretty much the distinction I lear by stonecypher · · Score: 2, Funny

    The ideal length for a document is going to vary, project to project, but by building documents in a modular fashion it should be rarely necessary to have a document longer than about 20 sides of A4. Most should be around 10 sides. Anything longer likely covers unrelated topics and can be split up. (Remember, it is easier to open 20 books to one page each, than to open one book to 20 different pages.)

    Yes. Tetris and MS Office have the same target complexity, to within fifty percent. Also, generalizations are helpful.

    --
    StoneCypher is Full of BS
  192. do this, simply. by mindesign · · Score: 1

    (cribbed from other comments, man ya'll are wordy)

    works for small to large projects, succinct version:

    requirements -> design -> implementation
    design phase produces separate functional & technical specs
    methodologies are tools to be used, not rules to be followed!


    ...there are likely some good & useful things to be written about the requirements process, but i gotta go. have at it!

    --
    everything is closer than you think.
  193. 3 things: What, How and Why by angel'o'sphere · · Score: 1

    There basically 3 things to be covered:

    What
    What is the software about, what are the functional requirements? This leads to input for the developers and to input for the user documentation (and maintanance documentation).

    How
    How is it supposed to work internal, that is a design about code structure, more about this later?

    Why
    Why is the code structured like it is. Why are technical solutions chosen, why got others rejected?
    More important, when the sysem get changed you will see RCS/CVS logs like: changed the datastructure, field X from pointer to reference.
    Hu hom, why? The why is usually missing.

    Regarding the How I would assume you have at least 3 if not 4 levels of detail.

    1)
    Very high level design based on components. Every of the components or bigger subsystems of about 10 components should be documented again in the What, How, Why structure. How do subsystems communicate, which external resources do they access.

    Technical issues like "we have choosen CORBA" and this "...." are the main (architecture) patterns we use, belong on this level also.

    The architecture of the system below this level should be technology agnostic anyway.

    2)
    Every component should have associated the business rules or use cases it realizes. Again it should describe what it does (see rules and use cases) and how it is done (how do classes/sources realize the requirements).
    Remeber a lot of WHYs probably answer the questions about: oops, why is it done that stupid? Hehe, probably there was a reason. If not its probably stupid indeed.

    3) On this level now we are basically on code documentation level. Java Doc etc.
    Again: don't forget to include a Why here and there.
    This loop exceptionaly goes to length_of_array -2 ... yes ... I see that ... but why?

    Besides this documentation you likely have an over all technical and/or architecture document.

    Also, like others have mentioned, a DB schema might be interesting, I however would associate it to the number 3) above.

    A possible 4 is low level code documentation if tricky algorithms (sorting by counting) are needed or protocolls (my own subset of TFTP commands) or standards (hand optimzed DSE encryption).

    Finally:
    Intersting allways is a log where every major change and descission with a "what" "when" "from" "to" and "WHY" is recorded. Like a SCRUM backlog. Or simply a "Oppen Issue" list with resoltions, best of course in an issue tracker.

    I left open in which way you do that. *I* would of course use use case diagrams and component diagrams (UML in other words)for the very high level. Going down via package diagrams (one per component) to class diagrams if technical issues are important. OTOH the latter often is not relevant IMHO.

    angel'o'sphere

    --
    Cost free eBook I read (by iBook/Kobo/Amazon/ObookO/Gutenberg etc.): "The Green Odyssey" by Philip Jose Farmer.
  194. Professionaly? by The+Grassy+Knoll · · Score: 0

    >I've been writing software professionaly (sic)

    That's professionally.

    Luckily you haven't been writing the manuals.

    CAN EDITORS PLEASE CHECK THE POSTS FOR SPELLING??

    --
    They will never know the simple pleasure of a monkey knife fight
  195. Mod Parent Up (Was Keep it on a Wiki) by anomalous+cohort · · Score: 1
    I've found keeping it on a wiki helps to keep the design document more current than it otherwise would be.

    Mod Parent Up. Wiki is a godsend to software development. The only problem with most Wiki technology is a lack of version control that is available in more sophisticated content management systems such as plone.

  196. Garbage In, Garbage Out by PFY+by+Day · · Score: 1
    As in all things, the design document is only as strong as the documentation it's built on. That is to say, if the user gives you crappy functional spec, you'll have a crappy design document as follow-up.

    Key: Make sure the functional spec is exactly what it needs to be. If this means coaching your users on what you need from them, so be it. It'll be a heck of a lot easier than the back-and-forth that usually results.

    I've recently been dragged in as the liaison on a project that had little to no functional spec. And because of it, we've got a lot of tension between the programmers and the end user in trying to get the job done. As far as the programmers are concerned, they've done their job because the code is exactly what was "requested". From the user's perspective, the program is entirely unusable.

    Maybe I go overboard on the f-spec part, but if the user communicates exactly what they expect to see, the programmer has a much better idea of what they need to do and how best to do it.

    F-Spec

    (1) The "Here's what we're trying to accomplish, ahd here's how we think it'll work" fluff.

    (2) The "Here are the parts we need, and what we think they'll do when we see them/click on them/enter stuff into them."

    (3) Followed by the "Here's what CANNOT happen based on what we see/do/click."

    (4) Have the user list stuff as
    (a) Critical
    (b) Desireable
    (c) Absolute minimum allowable
    (d) Ideal
    (e) Totally unnecessary

    (5) Make sure the user explains what they expect to do with the output of the program. Does it feed another program? Is it the be-all/end-all of programs? Is it a "nice thing to have"?

    Given all this stuff, the design spec is much easier to build, or at the very least, more accurate.

  197. Take a look at CMM by StormShadw · · Score: 1

    Check out the Capability Maturity Model by SEI out of Carnegie Mellon. While it doesn't tell you exactly how to structure a design document, it does help dictate process and repeatability throughout the entire lifecycle. It's not just the design document that's important - it's how changes to scope and budget are managed, how costs are assessed, how not only technical designs are documented but how business requirements are discovered and recorded. And, at the end of the whole process, you need to review all of that with all the stakeholders to find out where things fell apart and how to improve the next time. The goal is not just to have a single, good design document for a single project - you want to be able to consistently, repeatedly deliver the same (high) level of quality using the same process. Doing that is more than just a design document format, or using UML, or having a good project manager - but all of those things contribute to ending up with a good design.

  198. My $0.10 process-that I've used for quite a while by thoalex · · Score: 1

    There are three forms of documentation. The first describes what the product does, the second describes how it does it from an abstract point of view and the third describes how it does it from a concrete point of view. The first is the requirements document. This document should be readable (and read) by everyone from your CEO/President down to your Secretary (oh sorry "assistant" as secretary isn't used anymore). It states that you have A and you want it to do/be B. The way to get to point A from point B is by developing and using the Widget. Any modifications to this document after the coding process has begun requires signoff by the coding project lead (not just the technical manager) and anyone else you may desire to be involved. If your product managers (not project - product) attempt to put anything about HOW you the widget to work kill them. They are not software developers. Often times they are trying to "help" you because they know of other projects that are in the pipeline. Again, kill them. Those projects may never see the light of day yet would cost you X amount of development time to put the hooks in for it. The second is the technical specification document. This document is seen by the developers primarly. Anyone else would just look at it and be confused as they well should be. This is an abstract view of the Widget in its development form. Objects are described in this document and how they inter relate with the other Objects (and/or data). However, no code is included in this document. Even pseudo-code is a no-no in most instances. However, there are exceptions to this rule. Your lead architects and technical project managers create this document. Everyone on the technical side should read it but the coding team are the only ones required to read it. The coding team gives an estimate on how long the project will take. (Hopefully this estimate can be peer reviewed by another team). Again this all should be done before ANY code has been written (existing code is of course an exception). At this point, code is written and documentation is peppered thoroughout the code. With Java or .NET you can put comments in the code that you can then use to create documentation. This is ideal. Any other kind of documentation about the code itself is useless as it will rarely be used if ever. Again, there are possible exceptions such as Class Diagrams. If you do peer reviews of code before check ins then the peer reviewer should also review the documentation in the code. If you do not do peer reviews then the a portion day after release (or whenever you do a post mortem) should be dedicated to code documentation review. New developers on a project should read the requirements document. No exceptions. The second document is actually optional and used for reference. And of course, the third is available for reference and will be used the most (by developers).

  199. Consider your audience by Salamander · · Score: 1

    Instead of providing a checklist, I'd suggest a mental approach to writing a design document. Consider who's going to be using your design - developers working on the piece you're designing, developers working on other nearby pieces, QA engineers, support, documentation, etc. Now, imagine you're in a room full of all those people and you have to explain/justify how the code is put together. For best results, imagine that the audience is just slightly hostile. Now, try to anticipate all of the questions they're going to have. Is somebody likely to suggest that you should have used a particular framework or technology? Explain why you did or didn't. Is there likely to be a performance weenie involved? Explain what you expect the performance to be under different kinds of load, and what will affect it. Security weenie? Explain what kinds of authentication/authorization will be involved. For anyone, explain what kind of diagnostic or debugging capabilities will be provided. Is there a particular kind of danger to which this type of program is particularly vulnerable (e.g. loss of connection for a network app, missed deadlines for A/V, data corruption for storage)? Explain what steps you're taking to prevent or ameliorate it. For extra credit, offer QA some ideas for testing difficult cases. If you do a good job anticipating what kinds of questions your constituents/reviewers should ask, you'll end up with a document that will not only sail through review but will actually be useful when it's all done.

    --
    Slashdot - News for Herds. Stuff that Splatters.
  200. Open Source Design Doc Templates by gtshafted · · Score: 1
    Here's something that could help.

    http://readyset.tigris.org/

    I use this at work and it's a dream.

    From the site:

    "ReadySET is an open source project to produce and maintain a library of reusable software engineering document templates. These templates provide a ready starting point for the documents used in software development projects. Using good templates can help developers work more quickly, but they also help to prompt discussion and avoid oversights. "

  201. This is not the place by Anonymous Coward · · Score: 0

    Posting this question here is like going to a pharmacy for a medicinal diagnosis. They like to imagine they're docs, and might even play with the same toys, but in all actuality they're the ones who didn't cut it as the medicine man (or in this case computer scientists).

    I recommend going to a local college or university and speaking with a couple of professors there about design documents. As you may have noticed there are a bunch of Slashdotters here who know a little more than crap about program design but like to comment on it as if they do this everyday. If you haven't picked up already they're the pharmacists or the nurses at hospitals - useful but not specialists.

    Alright , hit me.

  202. Are we in the deep south here? by synesis · · Score: 1

    We have a statement "code is design" (which I agree with) and a response from the old guard. Requiremnts, Design, Code, Test. Neither side quite capture the problem. Evolutionary development is the ONLY way. Start small, prototype all aspects of the problem, incorporate improvements in understanding - repeat. Tom Gilb has been saying this for twenty years now.
    The monolithic design, code, test has so many failures attributed to it, I am amazed that anyone would still use it. At least when the Tacoma Narrows bridge collapsed engineers changed the way they design bridges - software engineers still proudly proclaim that they use the "Tacoma Method".
    Part of the problem is that we are still developing systems based on 19th organizational princples. The "Designer" who is above mere mortals and is able to forsee all and every problem. The minions who are supposed to code in the way that Ford workers were supposed to build cars - with perfect ignorance. Get real!

    1. Re:Are we in the deep south here? by tcopeland · · Score: 1

      > we are still developing systems based
      > on 19th organizational princples.

      Sir, I salute you. Great post. If only you had posted earlier so that more folks could have seen this...

  203. Just easier to grade by EmbeddedJanitor · · Score: 1
    It is way easier to grade a design based on quanifyable values like use of correct diagrams, headings, spelling etc than it is to grade a design on whether it will produce a good chunk of software.

    At the end of the day, the professor and the PHB have similar goals. Keep employment and grow their powerbase wilth minimal stress. This is far more easily done by throwing around and demanding buzzword compliance (makes you sound cutting edge) etc and being picky about little details.

    --
    Engineering is the art of compromise.
  204. The code is the design documentation by Anonymous Coward · · Score: 0

    Use Eiffel! :)

  205. Battle plans never survive meeting the enemy by David's+Boy+Toy · · Score: 1

    People seem to understand this in war, but they keep up this pretense that software can and should be spec'd fully before the first line is written. In the real world as opposed to the CS classroom, you iterate and evolve software. Anyone who thinks they can design a complex system down to the last bit is a fool. At best they will make stilted complex software forced fitted to an obsolete design document. Screw the fucking acronyms and design methology du jour. Natures already shown us how to develop complex system, its called evolution. Like it or not, your down to the last bit design documented software is going to evolve. Just as its about done, there is going to be a new sales requirement, just get used to it. Cut with the grain not against it. This is the real world, not a CS professors fantasy world. Thats not to say documentation isn't useful, however its better to document what really exists, than documenting a fantasy system, which then must be force fitted to that fantasy.

  206. Re:Yeah, that's pretty much the distinction I lear by jd · · Score: 2, Informative
    Anyone idiotic enough to put MS Office in a single document is asking for trouble. In the same way that programmers learn quickly to break things down into managable procedures and functions, documentation writers need to look at one small compartment at a time.


    In the case of MS Office, for example, the requirements for loading and saving documents has nothing to do with the requirements for handling macros, and none of the above has anything to do with the way that the GUI is structured.


    All of these, then, should be separate in the documentation. They are separate in function, they are separate in nature, they should be presented as separate units, because that is what they are.


    Keep doing that for the rest of MS Office and I guarantee you will find that you can document the entire of MS Office without any given unit of documentation exceeding 20 sides. 10 sides if it is designed well. (Although we know the answer to that one. :)


    Documentation writers should be forced to learn EBNF and Jackson Structured Diagrams. Why? Because these force you to think in small pieces, to modularize and compartmentalize. If you don't, you'll go nuts. Besides, it should be possible to then take a JSD/EBNF description and map one simply-connected set of rules to one - and only one - document. One document should also map onto only a simply-connected set of rules, with no overlap.


    In this case, it is not a "generalization", it is simply a direct consequence of structured programming techniques. Redundancy and Bloat Are Evil, Satanic and Despicable. Clean Designs Are The Only True Designs. Documentation is no different.

    --
    It's a small world and it smells funny; I'd buy another if it wasn't for the money; Take back what I paid (SoM)
  207. Re:Yeah, that's pretty much the distinction I lear by jd · · Score: 1

    I've worked at NASA, the DoD and a nuclear accelerator facility. Frankly, the code quality was minimal and if serious, usable documentation existed, it was because I wrote it.

    --
    It's a small world and it smells funny; I'd buy another if it wasn't for the money; Take back what I paid (SoM)
  208. figure out why you want a damn design doc by sean.geek.nz · · Score: 1

    Two (completely different) reasons to have a design doc:

    1) As part of the process of figuring out what to build.

    2) To document what we have built.

    If (1) then it's a part of the build process - you write it to get your ideas concrete for yourself and so others can review them, you may mention options you aren't taking and why, the results are fluid.

    If (2) then you'll want references to the code that you've built to give examples, and also pointers of to key bits of code and a mention of what bits ended up more complex than expected and why, what bits of code to read and pay attention to, etc.

    Many bad processes try to conflate these two documents. That wastes a lot of developer hours and results in crappy documentation.

    If your aim is (1) then don't pretend you're producing good documentation for what the final system is like. Also realise that anything written before you coded and tested will be inaccurate by the time you go live because plans shift and change.

    If your aim is (2) then you can write it much faster and better after you've finished coding.

    Sean

  209. Where do you find good Q/A? by xxxJonBoyxxx · · Score: 1

    I would kill for some people who actually want to do Q/A. All the people I see are "SysAdmin" wanna-bees or lazy-ass "coders" who don't want to bothered with details. Any tips on advertising for qualified Q/A people?

    1. Re:Where do you find good Q/A? by dpud1234 · · Score: 1

      Good QA people are hard to find. The best way to find good ones is through their own informal referral network. I have found that the good ones like to stick together as it never fun to work with poor QA folks (for me the poor ones have no idea of the difference between testing & QA and usually believe that finding 100's of bugs in the last few project weeks in a massive firefighting effort makes them genuine heroes.). The generic add in Monster / Craig's list will get you 100's, perhaps 1000's of responses where probably none of them are good QA. Really good QA folks have deep employment networks and generally never use these basic recruitment tools except to gage the market or satisfy some curiosity about who's hiring in their area. I personally have never used professional recruiters so I don't know if this is a valid avenue to find good QA. Make sure that your company / department, etc actually wants good QA and not glorified test monkeys. I'm not implying that one is right or wrong, but sometimes a company / department is really not mature enough to need good QA (any software person who's been around a while has experienced the "Chop Shop" where code is hacked out in all night crazed sessions to meet insane delivery targets without any form of documentation or process beyond the cubical white board - just hack-n-compile till ya get it right.) These type of places drive good QA people crazy. Basically, you convince good QA people that they are wanted / needed by following the good design principles outlined in this thread. I suspect that this is essentially no different than advice for finding "good developers." In case your wondering, yes I am a QA person with 14 years experience in the QA business (ok the first 3 or 4 years I was a test monkey as I learned the difference from a couple of great mentors; but that is a different story). As to the informal networks - they exist. My 3 compatriots and I have managed to stick together through 3 companies now with brief interludes at other "jobs." It seems like eventually one us of lands at a great job and the inevitable question arises from the management team "do you know any other good QA candidates..?"

  210. i disagree... by nml · · Score: 1

    A "Computer Scientist" is a mathematician specializing in an obscure branch of mathematics. There is no "science" involved.

    Describing computer science as maths is like trying to pass off biology as physics. Certainly at some level everything in computer science can be described by maths, (and in certain areas it is just maths) but in many cases the level of abstraction is so high that it's impossible to analyse it. Hence the science.

  211. state the problem first by jalfreize · · Score: 1

    I've been working for a few years now, so here's my take on documents I found useful and that I really like to borrow stylistic elements from.

    - The problem should be stated first, clearly. This usually helps someone reading the document to think roughly of their own solution first -- the rest of the document only confirms their hunch (if they're competent enough, i.e.).

    - Avoid presenting low-level details as long as possible, proceed top-to-bottom in the hierarchy of abstractions in the system you are designing.

    - Define all special terms and jargon in a separate section after the introduction.

    - Use the right diagrams -- this is a tough one. Finding the right graphical representation to concisely yet lucidly describe something is the toughest problem I've had.

  212. Re:why not code to spec? here's why by civilizedINTENSITY · · Score: 1

    Agreed that design is fluid, but my point was that design is done before implementation begins. Thus, while design is fluid during the design process, it is over by the time programmers have started.

  213. Re:Yeah, that's pretty much the distinction I lear by Cederic · · Score: 1


    Your approach would leave you with approximately 327 documents for MS Office.

    To find anything at all in them you'll need another document: An index. Good luck getting that down to 20 pages.

    And 300 documents, 1 index? I know.. lets consolidate them all into a single bound volume.

    No, don't call it a book!

    ~cederic

  214. I don't agree. by Stu+Charlton · · Score: 1

    And I've been around a fair amount too.

    DO NOT START DESIGN UNTIL YOU HAVE THE REQUIREMENTS (yes, I know there are exceptions, but you should at least have *most* of the requirements first).

    In my entire career, I see people try this time and time again. And it always winds up the same: destroyed family lives from the developers working 24x7 near the crunch time because of ambiguous requirements, customers that are unhappy because every time they change their mind they're given two words: "CHANGE REQUEST". CRs associate tremendous $$$ with any change, making it hard to deliver true "quality" if the market needs or our understanding of them is to ever evolve. Project managers that have very little real process control over what's going on and wind up as mere maintainers of spreadsheets, gantt charts, and earned-value analysis that have about as much accuracy as a tealeaf reader.

    Your stated approach probably works well in enviornments where requirements are stable, and design work is so specialized that it requries rare subject matter experts. But I don't see those circumstances often.

    There is a shift underfoot in software development akin to the one that manufacturing has gone through, from mass manufacturing to lean manufacturing, driven by Toyota's production and product development system. Gathering requirements , designing them, coding them, and testing them is "large batch" thinking that causes tremendous waste and inefficency because of the lack of learning, number of hand-offs, and amount of inventory (unimplemented requirements). Lean "Small batch" thinking is about small cycles of requirements, design, coding, testing, and refinement, with high levels of artifact reuse. Change is considered the norm in this process, while the product is in development. It's built into the funding and scope management structure of the project from the beginning , not bolted on as massive "shock trauma" that usually happens on projects with large requirements documents.

    Have a good requirements document: everything is actually a requirement (not a design or implementation) and is testable (if you have the word "not" in it, it's not testable, for instance).

    There are some circumstances where a good requirements document is attainable, and useful. In most IT or product development circumstances, however, the number of changes required mean that requirements must be captured in a more fluid manner (whether they are use cases + a set of non-functional metrics, or features, etc.)

    Make sure the design is design and not implementation (design is "sum two numbers and check for overflow"; implementation is "temp32 = x16+y16; if temp32 > MAX16 then result16 = MAX16 else result16 = x16+y16;). Put another way, despite the popular writings I've seen lately to the contrary, CODE IS NOT DESIGN (any more than a car is the design of the car).

    Sorry, this is a fundamental disagreement. The code is the embodiment of the design. Sure, there is high-level design and low-level design, with different concerns. BUT, design is about direction. Implementation is about mechanism (do I use a for loop, a while loop, or a do loop?)

    The algorithm and all of its exceptional cases are simultaneously part of code and the design because no matter how much paper you write, it's completely useless if that's not how the software was written.

    Make sure you can test that THE DESIGN MEETS THE REQUIREMENTS (which is subtly different than "does the design do what I designed it to do?"). If the design doesn't satisfy the requirements, it can never be a "good design".

    In a vacuum sealed world of hand-offs, this might be appropriate. But most of the time, I find that a classic requirements document are not the real requirements. There is loads of ambiguity in it, it requires constant iteration to clarify that ambiguity, and that iteration is best done through collaborative development between customers and deve

    --
    -Stu
  215. Mod up by Stu+Charlton · · Score: 1

    Couldn't have said it better.

    --
    -Stu
  216. Requirements required by corneliusagain · · Score: 1

    Sounded like a dangerous cowboy until the last paragraph. Requirements are vital but never final. Yes. Tracing from requirements and understanding clearly requested changes to requirements is vital.

  217. Truss Framework by baron52 · · Score: 1

    dnnrly, Take a look at the Truss Framework (http://sourceforge.net/projects/jdbgen/). This project started out because we had similar questions. The result is essentially design documentation for model driven architecture. Although the framework was originally intended for web-based database applications, we would like to hear other cases where it has been useful.

  218. Re:Yeah, that's pretty much the distinction I lear by jd · · Score: 1
    Uh, no. The entire point of this method is that you need to cross-reference and books are notoriously bad for that. You're on one page and one page only. Consolidation would be disasterous. You also don't need all those documents at once - you need only the document for the component you are working on.


    (In the same way, if you are building a bridge, you just don't care where they are going to place the restrooms in a nearby airport. If it's not relevent to what you're doing, why be burden yourself with the overhead?)


    You also don't need an index. Remember, each document is linked (by means of pointers) to related documents. As such, an index serves no purpose. You'll always find things faster by following the pointers.


    (Indexes are sequential. The document structure described is an n-ary tree. Trees are always superior to sequential systems for searching.)

    --
    It's a small world and it smells funny; I'd buy another if it wasn't for the money; Take back what I paid (SoM)
  219. Re:Yeah, that's pretty much the distinction I lear by Cederic · · Score: 1


    Trees are great when you're on them. However, the root of a tree for multiple documents is going to have to effectively be an index.

    This might be why many books have a contents page and an index. Two alternate navigation routes, maximising the flexibility and accommodating imperfect initial information (i.e. what it is that you're looking for).

    Obviously the answer is online documentation, in a fully indexed form, because your tree isn't as efficient as my google..

    ~cederic

  220. Re:Yeah, that's pretty much the distinction I lear by Salus+Victus · · Score: 1

    Any given design document should address only a limited set of problems, or it will become too complex. Ideally, any given document should be small, compact and address one or (at most) two issues. I do work at a CMM level 2 company, doing designs, and I don't agree with this principle. First, though, I'll agree with a point made earlier: no one ever has the full set of requirements. Real-world schedules simply do not allow for it. When business people commit to a project, the money is allocated now, and you'd better be ready for the testing team to do their work sooner, rather than later. So, in practice: you start with the system architect gathering high-level requirements, and sketching a high-level design out of that. He then hands this off to the subject matter experts, so they can begin work on the design of each component -- but meanwhile, the architect fills in suggested low-level requirements, formalizes the document, and reviews it with the customers. He then revises the document as necessary, and passes the "near complete" requirements to the component designers, so they can revise their own designs. In practice, the customer will sit on the requirements for weeks before signing off on them ... even though they are effectively complete at this stage of the game. It then becomes the job of the architect to merge all low-level designs into a single, comprehensive document. Why? Because ten (or even 3) documents are not handy. In any discussion, people need to be able to refer to a single document, or they waste time looking for the files. Central document management systems help here, but in practice, people will grab something they have printed out when they're headed for the conference room. So, on to my suggestions for the actual design itself, rather than for the process surrounding it: 1. Use grammatically correct english. Someone else is going to have to read this; english grammar defines the tried-and-true rules for communicating effectively. 2. Use diagram(s) to explain the high-level architecture. Before people can absorb details, they need a contextual framework on which to hang that trivial knowledge. I prefer a data flow approach, where each object in the diagram represents an i/o or storage system; the arrows which connect systems should represent processes which move/transform data. 3. List key requirements, and explain how they are addressed by the architecture. It would be pointless to list everything, but some people work better from lists than they do from diagrams, and it helps to supplement the diagram with a list of key functionality. 4. Section the detailed design into chapters. Each design chapter should be a subsystem from the high-level design, and it should begin with the same sort of overview: a diagram of how the subsystem will function, with a list of key requirements and explanation of how you are meeting them. Many people suggest putting each of these sub-components in a separate design document; you've already had my thoughts on why they should stay together. 5. Peer reviews. Each section of the document should be reviewed by at least one other person, to make sure it is both clear and complete. One thing to keep in mind as you write the design is that most projects involve trial-and-error; if the designer knew exactly the best way to implement every feature, then the final product wouldn't be innovative in the slightest. You're better off buying off-the-shelf for something that's been done before. Your project is unique, and odds are that some of the design choices are going to be inefficient (or just plain not work!) when push comes to shove ... or maybe you will discover during the testing phase that you have a hole in the security layer (you designed security, right?) you could drive a truck through ... or maybe when debugging a test scenario, you find your logs (you designed application-level logging, right?) don't provide the right kinds of information. Extensive re-writes of some key components of the design might need to be done. Design is not documentation. Design is the blueprint, and blueprints make notoriously poor Owner's Manuals.

    --
    In theory, there's no difference between theory and practice. In practice, there's a big difference.
  221. Re:Yeah, that's pretty much the distinction I lear by Salus+Victus · · Score: 1

    What the heck happened? All my newline characters got thrown out ... oh, woe is me! Why didn't I preview?

    Testing ...

    Testing more ....

    I guess I should have switched from "HTML Formatted" to "Plain Old Text." Live and learn!

    --
    In theory, there's no difference between theory and practice. In practice, there's a big difference.
  222. sadly, design never ends by davidwr · · Score: 1

    In a perfect world, design would freeze before implimentation begins.

    The sad truth is that during implimentation, the market, and therefore customer requirements, change. A business has to make the decision "do we ship a higher-quality product whose design froze months before it shipped, or an up to date product that's less stable." Some customers want stability, others want the "latest possible" code. If you are selling to the 2nd group, design doesn't freeze until you ship. Even then, it doesn't freeze because you are probably constantly shipping updates.

    The other reason design doesn't freeze is that during implimentation, you may discover that a given design doesn't work for some reason or another, or it's much more expensive to impliment than predicted.

    A good project manager will keep on top of both possibilities and make decisions that are best for the customers, the employees (who don't like being worked to death), and the business as a whole.

    --
    Knowledge is how to play a game, intelligence is how to win, wisdom is knowing what game to play.
  223. right doc for the task by wrschneider · · Score: 1

    Some important criteria for a good design document:
    - it should be the right amount of documentation for the job, not overkill
    - it should accurately reflect the real implemented system
    - it should supplement, not be a replacement for, real, working code
    - when feasible, real working prototypes are better than documents

    There's a world of difference between writing software for nuclear reactors and writing a typical "web page to display results of db queries". It's folly to apply the same standards to both.

    In the latter case, when you're dealing with "pure" information systems (i.e., a bug in the system won't cause a reactor meltdown or a plane crash) requirements are often nebulous. Clients often don't fully understand their requirements until they see the finished product. So you're best off producing a working prototype or demo rather than a document.

    if you have a requirement that you produce a polished "design document" before moving on to writing code, you're going to waste a lot of cycles on something that's going to become irrelevant and useless anyway. You can easily spend weeks perfecting a document that will just be thrown out once too many things change as a result of bug fixes, new features, etc.

    that said, if your software is controlling heart monitors, airplanes, or the Mars Rover, you need to have a much more rigorous design and requirements process up front. My point is that you have to pick the right process for the job, though, and avoid one-size-fits-all "thou shalt write a long design document" dictates.

  224. Most important guideline by Alinraz · · Score: 1

    It is important that the design doc be started at the very start of the project, and that it continues to be maintained throughout the projects life-cycle.

    A design doc must grow and change with the project. Without that it's totally useless two years down the line. I would include it with the project in your code revision system with regular check ins and tags.

    I recomend that it includes information about any design decisions and why they were made that way. It is always painful several years in the project when you look at something and go: "Hey that's a weird way to do that. I know there was a reason, but I can't remember why..."