A thing is well designed if it adapts to the people who use it. For code, that means it must adapt by changing
We implement this by creating things like constants and class hierarchies. We're going to see some new ways to do that in functional programming. It's hard to constitute what good design means. One way to think about this is if your code can be easily replaced by something else. If it can't then it's probably not a great implementation.
Every piece of knowledge must have a single, unambiguous authoritative representation within a system
In the context of software, don't represent the same piece of knowledge redundantly within the system. This leads to bad design in that it becomes hard to change. One day, you'll miss an update in some place. Let data be computed when it can.
If it's easy to reuse, people will. Create an environment that supports reuse.
This is heavily related to documentation! Make it easy for other people to understand to use your code, and make the interface friendly and approachable.