Since design ideas, and even the concept of Physical Design (exactly where you put your files), are such a broad topic, may I give a definite example and ask for feedback on the example?
Suppose you are tasked with making a C++ application that does a whole bunch of complex mathematics. And, beforehand, you are given the types, structure etc. of all the inputs you will be responsible for, and the same for all outputs. And, of course, instructions on what the brain/engine/black-box inside your application should do to transform those inputs to the outputs.
Now let's say you just finished a fully functional but quickly put together first draft where you put everything in a library called math-engine
. To emphasize the issue I'll come to shortly, let's assume you added Doxygen documentation to all of the public interfaces within your library... and that 10% of the public interfaces from said Doxygen documentation cover all of the input and output cases you were given. 90% of the public interfaces in that Doxygen documentation are for "low level" worker classes that users of your library will never know about (but you happily documented as you knew you would be using those classes to make the library).
Forgetting that you jumped right in with an implementation without considering design, you write an installation script that will install the binary from your release build and the header files your users will need... even as you polish the public API documenting those to-be installed headers (i.e. polish the 10% of your Doxygen docs mentioned above).
If you were to pause there and ask yourself, is the physical design of putting everything in one library the most effective thing I could have done? What would your answer to yourself be? What design would have been better?
If the context is too "tidy" to fire up an impulse to put on your design hat, imagine the same situation as above... except this time you were not given any information on the inputs and outputs of your application. Instead, you were just told what type(s) of problems your brain/engine/black-box should solve and asked to come up with a useful "public API" for the world to use [that corresponds to the headers you would have installed on users' machines]. And, to motivate the need for design a bit more: Assume you were told that, in the future, your application would be asked to solve more types of problems, even as you might eventually be given definite requests surrounding new input/output arrangements to code-up and include in the user's "public API". How might you refactor something like this given that you just created a fully functioning first draft in a single math-engine
library with those same Doxygen docs mentioned above to boot (with the same 10%/90% split).