Communication. In designing systems for others you need to make your intentions for usage known. This is sometimes called documenting the system.
You should write documentation with one target audience in mind. Then review the documentation with an eye toward rewriting it for a less savvy audience.
It is useful to write something like a theory of operation section, which gives the user some notion of what the system does and why he/she would want it to do that. Then, technical details of how can follow.
One also should consider that no one reads the documentation. Thus, appropriate blurbs should be used. (Don’t put remaining hand in grinder.) Further, the design should consider making the documentation simpler.
Constraints. They can be a good thing. In designing a system, limiting ones choices can focus the development of the design, and allow it to go more quickly. Indeed, given enough carefully chosen constraints, very few design possibilities result, and the system comes together like putting a jigsaw puzzle together.
It is good to know where constraints come from, and why. Many result from user requirements, some from the capabilities of the components, some from economic consideration. Whatever the source, it helps to know if a constraint can be removed, or relaxed. This is especially important when there are too many constraints, i.e. the limitations make it unlikely to produce a result satisfying all of the limits. It is not expected to build an ice cube maker, that, under normal conditions, produces ice cubes that are cube-shaped and warm to the touch, i.e. should be both below and above 50 degrees F at the same time.
Maintenance. How long does your system last?
For systems with physical components, it is easy to think of such systems needing occasional repair and maintenance. If well designed, such repair can be done quickly and easily. However, complex nonphysical systems
also need maintenance. A common type of example is a data storage system. In order to use less space, data may be reorganized and rearranged and rerepresented. In software, garbage collection is a type of routine used in
memory management. Systems also need updates and improving to keep up with changing demand. Thus, flexible systems can accommodate redesign and adaptations. Certain government codicils allow for such amendments.