I try to explain why game developers and many other agile developers dislike huge design documents in general...
The most important thing is: Documentation and comments always end up being lies eventually. Modern coding standards should always prefer readable code over comments and/or low level documentation. If you choose good names for classes/structures, functions, data members and variables AND split the code to small enough (well named) functions/classes, you don't need many comments. The code is human readable and the names chosen describe the code clearly.
Comments do not maintain themselves, and there are no unit tests to prove that comments stay correct. Less comments = less lies.
The same is true for documentation. Low level documentation duplicating the information found in the code provides no extra information and is a pain to maintain. It adds inertia to code modification (and that leads to harder maintenance = less maintenance = code rot = decreased productivity = more bugs). High level documentation is important because that helps programmers to understand the architecture at a broader scale and the documentation helps programmers to find what they need (instead of creating their own code for already existing functionality). High level documentation is much easier to maintain, so it doesn't add much inertia.
Unit tests itself provide the programmers good low level documentation. Unit tests should be well named and should cover all the library use cases. Unit tests get compiled for every build, ensuring that the code works the way intended. Unit tests never become lies.
Sometimes of course you need additional documentation. For example you need a best practices guide for your vector math library. A good way to maintain documentation for an API like this is to tie the documentation and the unit tests together. In the document, you refer to the unit tests (all code examples in the documentation MUST have unit test cases to prove that the examples are correct) and in the unit test C++ files you have a link to the document (we use a wiki-style online documentation that every programmer can edit). This ensures that whenever the API functionality is changed in a way that requires a documentation change, an unit test will fail, and the programmer must fix the unit test first and then update the online documentation accordingly.
The most important thing is: Documentation and comments always end up being lies eventually. Modern coding standards should always prefer readable code over comments and/or low level documentation. If you choose good names for classes/structures, functions, data members and variables AND split the code to small enough (well named) functions/classes, you don't need many comments. The code is human readable and the names chosen describe the code clearly.
Comments do not maintain themselves, and there are no unit tests to prove that comments stay correct. Less comments = less lies.
The same is true for documentation. Low level documentation duplicating the information found in the code provides no extra information and is a pain to maintain. It adds inertia to code modification (and that leads to harder maintenance = less maintenance = code rot = decreased productivity = more bugs). High level documentation is important because that helps programmers to understand the architecture at a broader scale and the documentation helps programmers to find what they need (instead of creating their own code for already existing functionality). High level documentation is much easier to maintain, so it doesn't add much inertia.
Unit tests itself provide the programmers good low level documentation. Unit tests should be well named and should cover all the library use cases. Unit tests get compiled for every build, ensuring that the code works the way intended. Unit tests never become lies.
Sometimes of course you need additional documentation. For example you need a best practices guide for your vector math library. A good way to maintain documentation for an API like this is to tie the documentation and the unit tests together. In the document, you refer to the unit tests (all code examples in the documentation MUST have unit test cases to prove that the examples are correct) and in the unit test C++ files you have a link to the document (we use a wiki-style online documentation that every programmer can edit). This ensures that whenever the API functionality is changed in a way that requires a documentation change, an unit test will fail, and the programmer must fix the unit test first and then update the online documentation accordingly.