Obviouslythe size of the project you're working on will be a huge factor in how long you spend writing the design document/specification. But do you go through everything, picking out every tiny detail? Or do you take a more agile approach and start writing the software quite early on and solve the problems as they come to you?
I've always found that there's only so far you can go with designing. There will inevitably be some things that are missed, and at that point how well you can adapt to the situation means more than the specification itself.
It depends a bit on your target audience, but my experience ( more in small/medium scale development than very large scale work ) is that detailed design documents are arduous and boring to write, rarely read and tend to end up out of date by the time a project is delivered.
This does not mean that they are worthless - if you are delivering something for someone, there needs to be an authoritative and agreed statement of what will be delivered sufficiently detailed that everyone can point to it in case anyone is dissatisfied with the deal and say "this is what we promised" and evaluate it against what was delivered.
If I were setting up a company to build a product, however, I wouldn't worry so much about a detailed specification. I would want to document what we were going to do, but I wouldn't want to go into too much depth regarding how - that is the part that is most likely to change and leave the documents out of date and useless or even inaccurate enough to be actually obstructive. I would prefer to document the "how" stuff in code using whatever documentation format the language or IDE supports best, so that as the code changes it is easier to update the documentation at the same time. It won't stop it going out of date, but it will reduce it somewhat.
For client projects, detailed specifications are a must. I like to heavily involve the client during the design specification. This helps flush out extra considerations and It gives the client a better understanding of what to expect. There is usually a positive shift in attitude (towards time and pricing) after the discovery and specifications are complete. This also allows us to set milestones - and hit them - which is favorable for the client, and our development team.
For internal projects and fun side projects, I generally create a flow chart and feature list, then start hacking it together. In these instances, what I find more important than a feature spec sheet, is the actual UI. I'll wireframe the site on paper and do a simple UI build (html/css). This helps me think through the user experience, which I value more than specific features on my own projects. I can always go back and piece together features later.
I don't have a main signed and sealed document that I'm working from. I have in the past, and I never got any work done, because I was always waiting for some one to sign something off. That was more a problem with the bureaucracy of the company I was with than the concept of design everything up front, but I still prefer the more fluid/agile approach I have now.
Software design documents break down nearly every aspect of a software development project: What problem will the software solve? What will the final product look like? How does the internal architecture function? When you create your SDD, you'll plan all these factors in advance.
While every document will be unique to its project, the overall structure of SDDs is fairly consistent across projects. As you create your own software design document, be sure to include these elements.
Instead of approaching your project as a single drawn-out process, you might find it helpful to break it down into more manageable pieces. At the most macro level, you have an overarching goal: What problem is your software addressing? Who will use it?
Based on the quadrant each feature falls into, decide whether to include it in your minimum viable product (MVP). Features in the upper-right quadrant (high urgency, high impact) should be included in your MVP. With features in the bottom-right (high urgency, low impact) and upper-left (low urgency, high impact) quadrants, use your discretion to decide if they are a part of your MVP. Features in the bottom-left quadrant (low urgency, low impact) should not be included in your minimum viable product.
I've never been able to find a proper documentation on that. I'm able to find a list of the available methods, but not how to write them in the design document.For example, the couchdb documentation in this page explains how to use a map function, but it doesn't explain that this function is implemented in the design document the following way:
A game design document (often abbreviated GDD) is a highly descriptive living software design document of the design for a video game.[1][2][3][4] A GDD is created and edited by the development team and it is primarily used in the video game industry to organize efforts within a development team. The document is created by the development team as result of collaboration between their designers, artists and programmers as a guiding vision which is used throughout the game development process. When a game is commissioned by a game publisher to the development team, the document must be created by the development team and it is often attached to the agreement between publisher and developer; the developer has to adhere to the GDD during game development process.
A game design document may be made of text, images, diagrams, concept art, or any applicable media to better illustrate design decisions. Some design documents may include functional prototypes or a chosen game engine for some sections of the game.
Although considered a requirement by many companies, a GDD has no set industry standard form. For example, developers may choose to keep the document as a word processor document, or as an online collaboration tool.
The purpose of a game design document is to unambiguously describe the game's selling points, target audience, gameplay, art, level design, story, characters, UI, assets, etc.[10][11] In short, every game part requiring development should be included by the developer in enough detail for the respective developers to implement the said part.[12] The document is purposely sectioned and divided in a way that game developers can refer to and maintain the relevant parts.
The game concept describes the main idea of the game. This section of the document is a simple explanation of the ideas for the game. The concept includes what the game exactly is, and what is being made of it. This portion of the document will also inform such people like the art team, publishers, developers, etc., on the expectations of the game when it is being developed.[15] So while in the production phase of the game, the document is being used as a guide to create the game. The concepts are introduced to a product development director, or even an executive producer, before it is allowed outside of the product development department. It will then be the director's decision to whether the idea has merit or not, leading to the idea being disregarded or supported to develop the game proposal.[16]
Even with the concept being in favor of the director, there is still the possibility of changes being requested. The director might pass the concept to others as part of the design staff, producers, or shown to the entire department or company, giving the concept a higher chance at being more captivating with the addition of a buoyant and imaginative group of people.[16]
The main goal of a design doc is to make you more effective by forcing you to think through the design and gather feedback from others. People often think the point of a design doc is to to teach others about some system or serve as documentation later on. While those can be beneficial side effects, they are not the goal in and of themselves.
Provide a big picture first, then fill in lots of details. Aim for a world where you can write this, then take a vacation on some deserted island, and another engineer on the team can just read it and implement the solution as you described.
I like including this section, because people often treat this as an afterthought or skip it all together, and it almost always comes back to bite them later when things break and they have no idea how or why.
How will this increase on call and dev-ops burden?
How much money will it cost?
Does it cause any latency regression to the system?
Does it expose any security vulnerabilities?
What are some negative consequences and side effects?
How might the support team communicate this to the customers?
Doing all of this before you even start writing your design doc lets you get feedback as soon as possible, before you invest more time and get attached to any specific solution. Often, even if the implementation stays the same, your reviewer is able to point out corner cases you need to cover, indicate any potential areas of confusion, and anticipate difficulties you might encounter later on.
Once you and the reviewer(s) sign off, feel free to send the design doc to your team for additional feedback and knowledge sharing. I suggest time-bounding this feedback gathering process to about 1 week to avoid extended delays. Commit to addressing all questions and comments people leave within that week. Leaving comments hanging = bad karma.
My coworker Kent Rakip has a good answer to this: A design doc is successful if the right ROI of work is done. That means a successful design doc might actually lead to an outcome like this:
Giving credit where credit is due, I learned a lot of the above by working alongside some incredible engineers at Plaid (we are hiring! Come design and build some sweet technical systems with us) and Quora.
After writing this design doc, when I went to write the code I was like, oh, I made a lot of these decisions already. This is easy to write! Cool! And there were still unexpected difficulties (surprise: unexpected difficulties never actually go away), but I felt like it helped.
3a8082e126