By design, a program is usually based on a layered architecture to allow reusability and facilitate teamwork and testing. We may employ the following layered models: